반응형

※ 우리 부부가 열심히 일하고 야근해서 받은 머니로 구입한 후기입니다

 

붱이 Story

 

Weather Station


Weather Flow


https://www.indiegogo.com/projects/weatherflow-smart-weather-stations#/


작년에8월인가? 9월에 펀딩했는데

1년이 지나서 이제야 왔다..


이제품을 소개해주셨던 admusic님 후기도 참고하자

https://cafe.naver.com/stsmarthome/4202 


난 간단 후기 및 SmartThings DTH 개발을 위주로






Sky는 사방이 트여있는 야외에 설치하고


Air는 천정이 덮여있는 야외에 설치해야하는데...


아파트지만 우린 개방형 발코니가 있으니...


사방이 트여있진 않지만... 설치해보기로했다



SKY는 재활용장에서 굴러다니는 행거 파이프를 하나 주서와서

설치햇는데 지름이 딱맞아 설치가 간단했다.


케이블 타이로 고정하고 단차나는 부분은 

은쟈 화장솜을 겹쳤다.

그리고 케이블타이로 딱 고정하니 아주 굿



풀 Shade가 없기때문에 우선 발코니 가장 끝에 두고

화분받침대 뒤집어서 바닥의 열을 덜받게 하고

위엔 좀더 큰 화분 받침대를 덮어서 full shade??를 구성하였다 ㅋㅋㅋ



위사진 이후 3D Printer를 구입하여

마운트 제작


[붱이 Story/3D Printer] - Weather flow mount 제작




이젠 앱 연동 아주 깔끔하다





각요소들을 Graph로도 볼수있어서 좋다 아래는 풍속 풍향에 대한 그래프이다.



몇일 써보니 레인센서의 감지도는 아주 우수하다


가장 큰활용도가 될것같다.


허나 이것들을 산 이유는 단지 SmartThings에 연동된다 하여 구매하였는데


1년이 지난 지금도 지원하고 있지않다.


그저 Ifttt로 비오면 가상 스위치 만들어서 연동해서 써야한다


헌데 가상스위치를 반대로 언제 꺼놔야하는지가 참 애매했다.


근데 API가 오픈되어있더라 그래서 DTH를 만들었다


https://weatherflow.github.io/SmartWeather/api/



아래는 개발의 결과물이다.


이제는 IFTTT없이 SmartThings에서 내가원하는데로 자동화를 할수있게 되었다 !!!

아주 기쁘다


Korean Version


English Version




Detect 에 대한 옵션도 변경하여 원하는데로 설정을 가능하게 하였다.





사용법은 간단하다 SmartThings IDE에서 내 깃을 등록하고 weather flow를 선택해서 publish하고 


New device를 하여 device type을 weather flow를 선택해서 만들면 끝



그리고 자신의 Station id를 기입하면 끝~~~



git 연동을 안하였다면...


git hub 에서 소스를 가져와서 dth를 publish 하면된다.


https://github.com/WooBooung/BooungThings/blob/master/devicetypes/woobooung/weather-flow.src/weather-flow.groovy



※ 공감 및 댓글 한마디는 포스팅하는데 큰 힘이 됩니다.


반응형
반응형

※ 우리 부부가 열심히 일하고 야근해서 받은 머니로 구입한 후기입니다

 

붱이 Story

 

안드로이드 다시 시작한지 2년차...

약 7~8년전 깔짝 배운걸로만 하려니

발전이 없어 신문물을 공부하기로 하고 

Kotlin을 공부 하였다.


우선 가장 추천이 많은 

Kotlin in Action을 샀다...


커니의 코틀린은 빌렸는데 이 두책이 가장 볼만한듯 하다



책에서 소개하는 아래 링크를 가보자


http://try.kotl.in


아래와 같이 빠르게 웹에서 테스트가 가능하다.

처음 문법익히고 요것저것 간단히 테스트해볼때 유용할듯하다.



기초적인 문법들은 블로깅 된게 많으니 Pass


내 기준 오! 이거 좋네?

이런게 되?

신기하다~

이건 알아두면 나중에 쓰겠지?


하는 항목을 나열해보았다.


Smart Cast

Null safety call “?.”

 Elvis operator “?:”

let operator

Triple quote “”” 

Default arguments and named arguments

Extension functions | infix

Singleton “object”

Local functions

“apply”

“with”

“run”


Smart Cast


위 링크에 Examples 중에 책의 예제코드들이 있는곳으로 가서

코드를 돌려보자


"is"

 java에서 instanceof와 같다.

해당 오브젝트의 타입을 확인할때 쓰곤했었다.

뭐 여기는 문법의 차이라고 보면되지만

그다음이 중요하다 

as를 통해 Num Class를 casting을 명시적으로 해주었지만

아래 message창을 보면 warning이 뜬것을 볼수있다

"No cast needed"


kotlin에서는 is로 이미 체크하고 다음 블록에선

따로 casting 없이 바로 쓰면된다.

 Num으로 캐스팅이 된 상태라고 보면된다.

(사실 컴파일타임에 알아서 캐스팅해준거다)


두번째 Sum 체크에서 보듯이 블록안에서는 casting 없이 사용한 것을 볼수있다.


요 기능이 "Smart Cast"라고 부른다




Null Safety Call "?."

Null Safety call "?."

아래 자바 스타일 함수에서 보듯이

자주 쓰는 null 체크가 


위에 ?. 하나로 간결하게 줄어든것을 볼수있다.

아주 심플하다. 

말그대로 ?. 왼쪽이 null이 아니면 오른쪽을 수행하고 아니면 null을 돌려준다.

아주 코드가 심플하다



아래는 chain으로 사용하는것을 보여준다.




Elvis Operator "?:"


아래 코드보면 이해가리라 생각이 든다.

null일경우 기본 값을 지정해주는 용도?



기본값이 아닌 원하는 Exception을 발생시킬수도있다.

아래 코드를 보고 이해하자~




"let" operator

let은 "?."와 같이 자주 쓰인다.

객체가 null이 아니라면 뭔가 수행한다로 보면 된다

아래코드보면 이해가 쉬울것이다~

앞서 두개의 sendEmailTo만 수행되고

마지막은 email이 null이여서 수행이 안된것을 확인할수 있다.




Triple Quote """


3중 따옴표 안에 글씨를 쓰면 개행까지도 표현가능하다

개행뿐만 아니라 back slash를 써서 특수 문자를 표시하던것들을

없이 바로 출력해준다.

booungEx 문장을 보면 이해가 갈 듯


trimMargin()으로 |(파이프) 까지는 잘라준다.(default)

17번 18번 line 수행결과는 같다



Default arguments and named arguments


C++에선 있지만...Java에 없어서 살짝 불편했었던 Default argument


Kotlin에선 좀더 진화된 Default arguments와

named arguments를 제공함으로써

Java에서 수많은 overloading이 필요했던것을 대폭 간소화 시켜준다.

아래 .. 내가 예제로 짠거지만 요걸 찬찬히보면

java때와 비교해서 볼수있을것이다.


Kotlin에서의 Default arg, Named arg는 다 이해했다고 봐도 될듯하다.(붱피셜)


main에서의 음영부분이 Named arg를 사용한것이다.

결과는 위아래 동일하지만 코드는 엄청 심플해진것을 알 수 있다.



Extension functions | infix


확장함수 요것도 물건이다..


예전 Java에서는 상속을통해 함수를 추가하곤했다


코틀린은 상속없이 마치 원래 멤버함수인것처럼 함수를 확장할수 있다.


String에 lastChar라는 함수를 확장했고

Int에 max 함수를 확장한 코드이다.


추가적으로 fun 앞에 중위함수표시인 infix를 적어넣으면

13 14 line 형태로 코드를 작성할수도 있다.

infix는 굳이 꼭 이래써야하나 싶긴하다...

그래도 신박한 기능이라 생각해서 언급해보았다.



Singleton "object"


Kotlin에서 싱글톤.... 너무 심플하다 그냥 class대신 object로 쓰면된다.





Local function

로컬함수가 된다... 우선 알고만 있으라는 뜻으로 언급해봤다

함수 안에 중복되는 코드가 있을경우...


아래와 같이 함수 안에 또 다른 함수로 중복 코드를 줄일수 있다.

모르면 있는지도 모르지만

알고나 있으면 ... 써먹을때가 올지도...





여기서 부터는 커니의 안드로이드를 참고하였음

자세한건 링크서 확인하고

https://www.androidhuman.com/lecture/kotlin/2016/07/06/kotlin_let_apply_run_with/



저는 이해한바만 ...


apply operator

apply는 어떠한 객체를 생성할때 property에 원하는값을 넣어서 생성할때...

아래 코드를 보면 위아 래 같은 코드이다.


사실 장점은? 모르겟지만 코드가 분산되지 않는다는거??

모르겠다 사실 뭐가 장점인지...





with operator

apply()와 유사하지만 내가 이해한건...

이미 생성된것에 대한 property를 변경시?

아래코드 처럼 이미 다른데서 생성된 messageView를

this로 접근하여 property값을 바꿀때 쓴다?

this생략도 가능


장점 이것도 잘모르겠다 


우선 존재를 알고 어느정도 알아야.. 

코드 해석을 할테니




run operator

run()은 두가지 형태가 있다.


먼저 객체없는 run()은 아래 코드와 같이

어떤 계산이라던지 작업을 한 결과를 리턴한다.

아래에서 블록의 마지막줄의 결과가 리턴이된다.



객체를 통한 run()은 생성된 객체의 연속된 동작이 필요할때

사용되는데 with()와 비슷하다


다른게 있다면 non-null상태여야한다.

 let과 with로 표현이 가능하다.

아래 코드를 보자~




더 재미난 기능들이 있지만

첫 코틀린은 여기까지...



제가 잘못 이해하고 있거나

잘못 기술 한점은 댓글로 알려주시면 감사하겠습니다.

단 !

비아냥은 노노



※ 공감 및 댓글 한마디는 포스팅하는데 큰 힘이 됩니다.




반응형
반응형

 

붱이 Story

안드로이드에서 json 파싱 노가다를

아주 간단히 한 두줄로 끝낼수 있는 강력한 방법

GSON

Gson?

Gson에 대해 알아보자

상세 설명은 링크로 대체 ㅎㅎ

너무 설명을 잘하셔서...

http://emflant.tistory.com/47

 

내가 처음 GSON 을 알고

사용법을 익히기위해

찾아본 blog에는

솔직히 너무 기본적인 내용밖에 없었다

이런느낌?

 

<PPT를 만들기법>

ppt를 띄운다

제목란에 제목을 쓴다

내용에 내용을 쓴다.

 

실전에 활용하기엔 역부족

 

요근래 GSON에 대해서 문의가 많이 들어와서

설명해주기 힘들었었다.

정리해두면 다른 사람들이 또 질문했을때 유용할듯

 

예제설명을 위한 가상 app을 예제로 설명을 해보려한다.

(추후 만들예정)
 

은쟈 요구사항(실제 몇달전 요청했었다)


"화장품 사면 유효기간이 언제까지인지 까먹다가 못쓰는 화장품이 많은데

앱에 유효기간을 저장해두고 시간이되면 알려주는 앱 만들어주면 안되?"

 

생각해보니 나도 쿠폰 같은거 받아두고

그전에 써야지 생각하고 보면 이미 유효기간 아웃..

해서 화장품뿐만 아니라 쿠폰, 가전제품 등의

유효기간 이나 A/S 기간이 있는 것들에 대해서 확장하여 구상을 했다.
   

앱에서 보여줄 필요한 정보들

예시

> Category
  전자제품
  가구
  화장품
  음식
  약제
  쿠폰
  + 사용자 얼마든지

> Item
  분류 : Category중에 하나꼭 선택
  제품명 : 다이슨 선풍기 AM-07
  생성일 : 만든날 또는 구입일
  만료일 : 유효기간 or A/S기간
  제품 img : list형태
  영수증img : list형태
  대표 img : 제품 img중에 하나 선택하게
  알람 : 만료기간 몇일전 알람

 

Json Sample에 대응되는 class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    // 여기서 final은 상속불가를 위해 선언
    public final class ExpireData {
        // @SerializedName의 값은 json에서 Object로 파싱 되어질 때 key의 name이다.
        // 변수명은 달라도 된다. 이왕이면 같게
        // Catetory 리스트 Type이 Category로 되어있다
        public @SerializedName("categories") ArrayList<Category> categories; 
        // Item 리스트 Type이 Item으로 되어있다
        public @SerializedName("items") ArrayList<Item> items;
 
        // inner class는static으로 
        // 위 categories에 들어갈 Category Class
        public static final class Category {
            public @SerializedName("name"String name;
            public @SerializedName("icon"String icon;
 
            public Category(String name, String icon) {
                this.name = name;
                this.icon = icon;
            }
        }
 
        // 위 items에 들어갈 Item Class
        public static final class Item {
            public @SerializedName("name"String name;
            public @SerializedName("category"String category;
            public @SerializedName("createDate"String createDate;
            public @SerializedName("expireDate"String expireDate;
            // 제품 이미지는 여러장이 될수 있기 때문에 ArrayList
            public @SerializedName("productImgs") ArrayList<String> productImgs; 
            public @SerializedName("receiptImg"String receiptImg;
            public @SerializedName("alarm"String alarm;
 
            public Item(String name, String category, String createDate, String expireDate,
                    ArrayList<String> productImgs, String receiptImg, String alarm) {
                this.name = name;
               this.category = category;
                this.createDate = createDate;
                this.expireDate = expireDate;
                this.productImgs = productImgs;
                this.receiptImg = receiptImg;
                this.alarm = alarm;
           }
        }
   }
cs

 

test용도이니 getter setter 및 생성자는

개발자 입맛에 맞게 변경~~

 

Json Sample

 

json 이쁘게 node로 볼수 있는 사이트
http://jsonviewer.stack.hu/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{
  "categories": [
    {
      "name""Electronic",
      "icon""electronicIcon.png"
    },
    {
      "name""Cosmetic",
      "icon""cosmeticIcon.png"
    },
    {
      "name""Food",
      "icon""foodIcon.png"
    }
  ],
  "items": [
    {
      "name""TV",
      "category""Electronic",
      "createDate""2017-06-01",
      "expireDate""2018-06-01",
      "productImgs": [
        "productimg01.png",
        "productimg02.png"
      ],
      "receiptImg""receipt.png",
      "alarm""2018-05-15 09:00"
    },
    {
      "name""Founder",
      "category""Cosmetic",
      "createDate""2017-06-01",
      "expireDate""2018-06-01",
      "productImgs": [
        "productimg01.png"
      ],
      "receiptImg""receipt.png",
      "alarm""2018-05-15 AM 9:00"
    },
    {
      "name""Water melon",
      "category""Food",
      "createDate""2017-06-01",
      "expireDate""2018-06-01",
      "productImgs": [
        "productimg01.png",
        "productimg02.png",
        "productimg03.png"
      ],
      "receiptImg""receipt.png",
      "alarm""2018-05-15AM9: 00"
    }
  ]
}
cs

 

 

 

ExpireData 생성

 

 

1
2
3
4
5
6
7
//사용자가 입력한 값들을expireData에 담는다
ExpireData expireData = new ExpireData();
expireData.categories.add(new ExpireData.Category("Electronic""electronicIcon.png"));
ArrayList<String> productsImgs = new ArrayList<>();
productsImgs.add("productimg01.png");
productsImgs.add("productimg02.png");
expireData.items.add(new ExpireData.Item("TV""Electronic""2017-06-01""2018-06-01", productsImgs
cs


 

Gson을 이용한 ExpireData to json

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Gson gson = new Gson();
String json = gson.toJson(expireData);
 
//결과 
{
  "categories": [
    {
      "icon""electronicIcon.png",
      "name""Electronic"
    }
  ],
  "items": [
    {
      "alarm""2018-05-15 09:00",
     "category""Electronic",
      "createDate""2017-06-01",
      "expireDate""2018-06-01",
      "name""TV",
     "productImgs": [
        "productimg01.png",
        "productimg02.png"
      ],
     "receiptImg""receipt.png"
    }
  ]
}
cs

 

이경우는 사용자가 입력한 data를

json파일로 저장할때 쓰인다.

저장한 json은 app이 로딩될때

아래와 같은 방법으로 파싱되어

app에서 보여질수 있다~

 

 

Gson을이용한 json to ExpireData

 

1
2
3
// 단 두줄로... json을 parsing 하여 Object에 바로 담아준다
Gson gson = new Gson();
ExpireData getExpireData = gson.fromJson(json, ExpireData.class);
cs

 

app에서 기존 저장된 json data를

불러올때 쓰거나

 server에서 받아온 json을

정해진 class타입에 맞게 파싱할때 쓰인다.

위에 설명해준 @SerializedName 의 값에 의해

 파싱이 되니 꼭 이름이 같아야한다!!

 

문의사항은 댓글남겨주세요

 

※ 공감 및 댓글 한마디는 포스팅하는데 큰 힘이 됩니다.

반응형

+ Recent posts