영상부터 보고 가세요~

부엌에 헤이홈x반디 스위치 3구 연결하였고 아래 부엌매트 밟으면 자동으로 켜지고

세탁실에 헤이홈x반디 스위치 1구 연결하고 SmartThings 모션 센서 감지되면 세탁실 조명 켜지게 해두었습니다.

 

기존 SK에 납품했었던 반디 스위치랑 헤이홈 고퀄이랑 콜라보해서 이번에 처음 출시된 

2선식 Zigbee 스위치 1구 2구 3구 세종류가 있습니다.

(DTH만들기 위해 샘플을 1구 3구 하나씩 받았습니다, 나머진 직접 구매함, 포스팅은 알아서 솔직하게 쓴거임 눈치안봄)

 

2년넘게 우리집 리피팅과 조명을 담당했던 eZex를 대신하게될 놈이다.

(고생했음 한번도 말썽안일으키고 기술력을 인정했던 eZex)

 

이번 반디의 특징을 타사와 비교해보자면

  헤이홈x반디 이젝스 다원
스위치 방식 전자식 회로 전자식 회로 릴레이 스위치
딜레이 X X 반박자 느린 딜레이
소리 X  beep음이 있음 릴레이 고유 소리 발생
리피터 유무 O O X
최소 부하 전력 5W 30W 8W
가격대 5만원대 6만원대 B2B만 판매가능 4만원대
디자인(주관적) 너무작은 버튼.... 그냥 별루임 ㅠㅠ classic한 가장 만족하는 design

나열하다보니 아직 완벽한게 하나도 없네요....

 

헤이홈x반디는 가격이 애매하고 디자인이 별로고

이젝스는 디자인.... 가격 그것보다 b2b만 판매하고...

다원은 디자인 가격은 최곤데, 가장 중요한 리피터가 안되고 릴레이 방식....으로인한 단점.. 특히 딜레이는 못참겠음 

 

다음 세대들을 기대해봐야할듯요

반디가 디자인 바꾸는게 가장 빠를듯... 가격좀 낮추고...

 

설치방법은 dth는 매번 제꺼 하는 방식으로 IDE에서 아래 방법으로 github 소스 복붙으로 하시면 됩니다.

 

아래 DTH Self publish 하신뒤에 스위치 paring 시도하시면 1구는 자동으로 로컬로 해주고 2구 3구는 cloud로 될겁니다 

 

Bandi 말고 꼭 "Integrated ZigBee Switch"  요거를 self pubilsh하세요

https://github.com/WooBooung/BooungThings/blob/master/devicetypes/woobooung/integrated-zigbee-switch.src/integrated-zigbee-switch.groovy

 

뉴앱에서 위에 DTH Self publish하신뒤에 pairing 시도하면 아래처럼 될겁니다

 


  1. 궁금합니다 2020.07.11 00:39

    반디스의치를 설치하고 dth까지 설치하면 별도의 허브 구입 필요없이 스마트폰과 갤럭시 홈 미니의 삼성싱스로 음성구동이 되는건가요?

    • Favicon of https://blog.weekendproject.net BlogIcon 붱이붱이 2020.07.11 00:40 신고

      아뇨 허브는 필수에요 ㅎ

    • 궁금합니다 2020.07.11 22:52

      dth가 장치드라이버라고 생각하면 된다고 하던데 그럼 이 장치는 원래 스마트싱스에서 지원하지 않는 기기라 dth 설치가 필요한건가요..? 그리구 zigbee는 주파수가 만국통일 이라고하던데 zigbee로 구동되는 부품들은 모두 스마트싱스에 등록이 가능한가요..? 자꾸 질문드려 너무 죄송합니다..

    • Favicon of https://blog.weekendproject.net BlogIcon 붱이붱이 2020.07.11 23:09 신고

      네 공식지원되는 dth가 없어서 만들어 쓰는거구요 직비는 국가타지않고 만국 공통 맞구요
      제조사서 직비스팩에 맞게 개발된거면 왠만하면 st에서 다됩니다... 다만 맞는 dth가 없다면 개발을해야겠죠?


※ 우리 부부가 직접 구매하고 사용한 후기입니다.

 

 

SmartThings SmartPlug는 10A제품 뿐이 없어서

 

에어컨, 세탁기, 건조기 등을 돌리면 플러그가 타버리는경우가 있었는데

 

이번에 Dawon에서 Zigbee 16A를 출시를 하게되서 두개 구입하였다

 

세탁기 하나 건조기 하나 붙일려고...

 

 

 

첫인상은 나쁘지않다.

Dawon 벽스위치도 첫인상은 좋았는데 방전이슈로 엄청난 실망감을 줘서 어떨까 걱정이 앞서기도 함.

여튼 높이는 SmartThings Plug보다 높지만 전체적으로 디자인은 Dawon것이 나은것같다.

 

바로 붙여보자

 

그냥 버튼 3초 누르고있으면 파란불로 바뀌는데 그리고 붙이면 된다.

 

SmartThings 앱을 열고 Device 추가를 하면 처음엔 Thing으로 잡히지만

내 DTH를 먼저 Self Publish를 하고 추가 시도를 하면 (추가법은 포스팅 끝에 언급하겠음)

 

아래와 같이 DAWON SmartPlug 16A로 잡힌다.

10A Plug는 DAWON SmartPlug 10A

매장된 Concent는 DAWON Embeded Plug 로 등록되게 해두었다.

 

붙이고 건조기랑 세탁기를 돌려봤는데 잘되고 있다.

 

다만 누적 사용량에 대해서 맞는값인지 의문이든다?

현재 / 1000을 해두었는데...

왜냐면 건조기가 보통 100 - 400W대를 1시간 30분 정도 돌아가니...

위에 값이 맞는것같아서 1000으로 하였는데 보고 아시는분 있으면 댓글주시면 수정하겠습니다.

근데 이값을 reset하는법을 모르겠다...? DTH다른거에서 reset하는 코드가있어서 해보앗는데 동작은 안하더라....

이것도 아시는분 있으면 알려주세요

 

DTH 설치법

 

이미 많은분들이 추가해서 사용하고 계시겠지만 한번더 말씀드리면

Graph 사이트에서 아래와 같이 추가하고

DawonDNS SmartPlug 추가해서 Self Publish 사용하시면됩니다.

 

 

로컬로 사용하고플땐?

위에 DTH로 한번 붙인다음에 기본으로 Local지원하는 아래 ZigBee Switch Power로 바꿔서 사용하시면됩니다

 

꼭 제 DTH로 먼저 붙인뒤에 해야 전력량값이 10분의1이 아닌값이 나옵니다.

 

총평

Zwave 벽스위치 방전이슈로 Dawon 에 대해서 안좋게 생각하고있었는데

이 SmartPlug는 잘 만들어진것 같아보인다.

 

다만 가끔 고주파 음이 들리긴하는데 다원측에서 어느정도 날수있으며 1M 정도 거리에서도 선명하게 들리면 A/S에 연락해달라고 한다. 그정돈 아닌거같지만 가까이서 살짝 거슬린다.

 

그리고 릴레이 음은 좀 크다 딱딱 .... 이건 근데 다른 스마트플러그들도 마찬가지로 큰상태라 ..

이게 첫 스마트 플러그 제품이면 뭐라했을텐데.. 샤오미 스마트띵 다.. 소리가 컷던 관계로 걍 적응된듯하다.

 

요건 잘산것 같다 디잔도 맘에들고... 16A 대체품은 없는듯하다

10A도 현재 SmartThings 220v제품이 한국에 출시 안했으니 현존 젤 나은 제품인것 같다.



※ 우리 부부가 직접 구매하고 사용한 후기입니다.

 

 

아기나무집님의 각종 메신저 Connector가 개발된 가운데

 

내용설명은 오날두님 Youtube로 대체

 

헌데 사용하려면 Webcore가 반드시 필요했다...

 

복잡하고 더 자세히 하려면 당연히 WebCoRE로하고

 

간단한문장을 쉽게 만들기위해 제작되었다

 

 

Owl Messenger bot을 설치하려면 또 오날두님 영상 참고

 

여기서 

위정보로 IDE사이트에서 My smart apps에서

"Owl Messenger Bot"을 추가하시면 준비완료

 

Classic앱으로 와서 나의 앱스에서 하나 만들어보겠음

 

 

노티 받고싶은 내용을 쓰고 받고 싶은 봇을 선택하시면 됩니다.

저는 카톡봇이랑 텔레그램 봇이 설치된 상황

라인쓰시는분은 라인 봇을 설치하고 하시면됩니다.

 

 

만들고나면 아래와 같이 SmartApp이 하나 추가된걸 볼수있습니다.

 

 

 

Test Switch를 On하면 노티가 두군데서 오게 했으니 위와 같이

노티가 두개 온걸 볼수있습니다~~

아주 간단하죠?

 

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



※ 우리 부부가 직접 구매하고 사용한 후기입니다.

 

예전부터 이뻐서 갖고싶었는데 SmartThings 연동이 안되서 구입 안하고 있던 제품

 

Awair

 

온도 습도 CO2 VOC 미세먼지 측정이 가능한 기기

 

처음 한대만 거실에 구입햇는데 

 

너무 이뻐서 한대더 구입해서 안방에 둠

 

 

 

그리고 산이유는 API를 OPEN하여서 ST에 연동을 할수 있게되서 구입하였다

하루만에 만들어버림 ㅋㅋ

 

1. Awair 1세대 모습

사용가능한 센서 항목은 [temp, humid, co2, voc, dust]

1세대는 dust값을 PM2.5인지 PM10인지 몰라서 우선 PM10에 표시하도록했음

 

 

2. Awair Mint

사용가능한 센서 항목은 [temp, humid, voc, pm25, lux]

특이점은 lux가 있다는것... 그리고 co2 측정이 불가

 

3. Awair 2세대

사용가능한 센서 항목 [temp, humid, co2, voc, pm25]

pm10이 없는게 아쉽긴하지만...

 

 

SPL항목은 소음 db 값인데 Awair Omni라고 비지니스 모델에만 있는듯 그래도 혹시 모르니 만들어둠

 

 

> 설정 방법

 

1. 우선 Awair Access Token을 받아야한다.

 

주소는 https://developer.getawair.com/console/access-token

불러오는 중입니다...

받는법 어렵지 않으니 받는다.

 

2. github 연동 한뒤 SmartApp과 dth 설치 - ide 사이트에서

 

해서 My SmartApp에가서 Update repo하면 Awair있는데 그거 publish

그리고 My device handler가서 Update repo에서 Awair publish

 

그전 제 블로그들 보면 자세히 방법있으니 보고 해보세요~~ 

 

3. Classic 앱을 통해 SmartApp 설치

 

 

아까 받아둔 Token 넣고 save 

아래 Tab belot to log in어쩌구 저기 클릭해서 복사 붙여도되고 미리 복사해두면 바로 넣어도되고...

 

Save하고 나서 다시 진입해보면 아래와같이 정보가 보이면 성공

Devices에 있는거데로 자동으로 추가 됨

이제 Awair도 자동화로 쓸수있어서 좋다~~

 

 

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


  1. hh 2019.05.13 19:23

    안녕하세요 예~전에 올리신 샤오미 스마트 커튼 질문드리고 싶은게 있는데

    요거 혹시 미홈 허브 말고 삼성 ST만으로도 연동이 되는건가요?

    도움 미리 감사드립니다 ^^

    • Favicon of https://blog.weekendproject.net BlogIcon 붱이붱이 2019.05.13 21:48 신고

      네 직비타입 샤오미커튼을 구입하시면 샤오미 게이트웨이 허브 없이 st 허브에 바로붙일수있어요

  2. 2019.05.18 22:39

    비밀댓글입니다

    • Favicon of https://blog.weekendproject.net BlogIcon 붱이붱이 2019.05.19 21:00 신고

      해당사이트 가입을 하시면 등록하신 메일로 approved 메일이 올거에요 그다음 다시 사이트가면 토큰을 복사할수있어요 그토큰을 스마트앱 설치시 넣으시면되요

    • 2019.05.21 19:09

      비밀댓글입니다

  3. 궁그미 2019.09.28 00:56

    어웨어 1세대/2세대 모두 skt스마트홈 가입이 가능 할까요? 1세대와 2세대의 차이가 클까요...? 고민되네요...

    • Favicon of https://blog.weekendproject.net BlogIcon 붱이붱이 2019.09.29 21:14 신고

      skt 스마트홈은 잘모르겟어요 1세대와 2세대차이는 미세먼지 센서가 바뀌었어요


※ 우리 부부가 직접 구매하고 사용한 후기입니다. 

 

현재 SmartThings에서는 조건으로 특정요일만 지정할뿐 공휴일이나 연차때에 대한 조건을 쓸수 없었다

 

그래서 Google calendar를 연동해서 오늘이 휴일인지 아닌지 구분할수있는 센서를 만들었다.

 

 

정리하자면 3가지중에 하나라도 걸리면 휴일이라고 판단하고있다

 

1. 요일 - 사람마다 쉬는 요일이 다르기때문에 자기가 쉬는날을 체크하면된다

2. 공휴일 - Google Calendar에서는 빨간날을 모른다 그리고 사람또는 회사마다 조금씩 편차가있으니 자기가 쉬는 날 체크하면된다.

3. TAG - 본인 연차라던가? 근로자의날(구글에서 제공안함), 회사 창립기념일, 학교 개교기념일, 그리고 격주로 생성된 일정 생성시에 memo에 #dayoff만 넣어두면 알아서 휴일로 인지된다.

 

이제 이 센서를 조건으로 사용하면 좀더 스마트하게 자동화 룰을 생성할수있다.

 

하나 예를 들면 이런거?

예전 : 매일 일출시 커튼 열어를 했던것을 

이제 : 매일 일출시 && 휴일이 아닌날에 커튼을 열어로

 

New SmartThings 앱에서도 룰로 사용할수있습니다~

 

 

 

 

첫시작 Google Calendar API Client ID 받기

 

우선 일루 이동

https://console.developers.google.com

 

Google Cloud Platform

하나의 계정으로 모든 Google 서비스를 Google Cloud Platform을 사용하려면 로그인하세요.

accounts.google.com

 

이동하면 프로젝트가 없을것이다 프로젝트부터 만들자

 

 

프로젝트를 만든다음에 이제 Google Calendar API를 Enable하자 아래 따라~~

 

 

이제 Enable은 됬고 OAuth client ID를 발급받자

아래따라~~~

 

 

 

위에 보이는 client ID와 client secret 아이디를 복사해두자

이때 복사 못했어도 다시가서 볼수있다

 

복사는 끝났고 이제 github의 코드를 가져와야한다

방법은 오날두님 Youtube로 대체 

 

github 정보는 위와같으니

 

SmartApp 설치시에 필요작업은

위에 복사해둔 client ID, client secret 넣고 oauth enable만 하면 끝

 

그리고 DTH도 같이 꼭 publish하고

 

그리고 Classic SmartThings 앱으로 가서 아래와 같이 설치 ㄱㄱ

 

 

Save를 하게되면  이제 설정은 끝

아래처럼 Device가 생성이 될것이고 

구글 캘린더에가서 일정을 만들때

메모에 #dayoff 를 작성해두면 그날을 휴일로 인식하게끔 되어있다.

 

 

 

 

궁금한점은 댓글주세요

 

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


  1. Favicon of http://breadzini.kr BlogIcon Breadzini 2019.04.27 17:16

    와.. 이 부분 정말 제가 필요했던 기능..! 하지만 저는 홈브릿지 기반 홈킷 만 사용하고 있어서 찾아보니 이런게 있더라구요. > https://www.npmjs.com/package/homebridge-calendar 아직 테스트 해보진 않았지만 홈브릿지 사용자는 이 쪽을 활용해봐도 괜찮을 것 같네요.

  2. 겨울이다 2019.06.03 09:16

    제가 적용해보니 하루에 한번 리프레쉬가 안되는데.
    혹시 따로 설정해줘야 하는게 있나요?

    버튼을 눌러 리프레쉬를 하고 있긴한데.

    지금도 6/1일을 찍고 있습니다.

    • Favicon of https://blog.weekendproject.net BlogIcon 붱이붱이 2019.06.03 23:27 신고

      안녕하세요 아닙니다 기본적으로 3시간마자 리프레쉬를 하고있습니다 테스트로 생성된 디바이스의 컨피귤레이션에서 인터벌을 1시간마다로 변경하신 다음에도 안되는지 확인 부탁드려도될까요? 그리고 앱이랑 dth 최신인지 확인부탁드릴게요 0.0.4

  3. 럽2유3 2019.09.05 14:14

    안녕하세요. 이 좋은 기능을 최근에서야 알게 됐습니다.
    감사히 잘 사용하겠습니다.

    한가지 개인적인 바램이 있다면, #dayoff태그 반대기능(#workday)이 있었으면 좋겠습니다.
    공휴일 출근이라면 해당 휴일 체크를 해제하는 걸로 가능하지만.
    저처럼 분기 결산회의 참석을 가끔 주말에 하는 경우는 공휴일이 아닌 평소 쉬는 요일에 해당되기 때문에
    설정이 애매합니다.


    혹시 가능하시다면 검토 부탁드립니다.
    다시 한번 좋은 기능 만들어 주셔서 감사드립니다.

    • Favicon of https://blog.weekendproject.net BlogIcon 붱이붱이 2019.09.06 01:22 신고

      카페에도 답을 드렸지만 좋은 의견 감사해요^^ 요즘 회사일이 너무 바빠 한가해지면 꼭 말씀하신 내용 넣겠습니다 ㅎ 감사합니다

    • Favicon of https://blog.weekendproject.net BlogIcon 붱이붱이 2019.10.05 00:45 신고

      방금 업데이트했는데 한번 써보시겠어요 잘될지모르겠메요 안되면 말씀해주세요 0.0.6으로 smartapp이랑 dth둘다 업데이트 하시고 폰smartapp가셔서 save만 다시 눌러주신담에 해보세요 테그는 #workday로 추가하셔서 테스트하시면되구 workday가있으면 홀리데이나 dayoff tag 무시하게했어요


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

 

붱이 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 의 값에 의해

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

 

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

 

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


  1. Favicon of https://www.makelism.net BlogIcon Makelism 2017.06.09 22:48 신고

    저는 찾는 것이 없으면 나올 때까지 찾는데 만드는 능력이 참 부럽습니다.
    포스트 잘 읽고 갑니다.

    • Favicon of https://blog.weekendproject.net BlogIcon 붱이붱이 2017.06.09 22:56 신고

      말만하고 언제 실천할지 모르는게 함정입니다 ㅎ 데탑이 아직 없는데 구입후 본격적으로 만들 예정입니다 ㅎ 덕분에 iot 입문도 곧 하게되서 바쁠것 같네요 자주 질문드리러 놀러 가겠습니다 ㅎ


 

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

 

 

차를 자주 쓰지 않아 쓸때마다

지하주차장 몇층에 주차했는지를 몰라 헤메이던날

볼일을 보고 집에 돌아와서

 은쟈한테 icon부탁하고 후딱 만든 Gear앱

eureCar 유레카

비록 수동으로 기입해야하지만 지금 만든지 6개월이 지났는데 없으면 안될 앱이 되었다.

4월 어느날 팀 선배가 내앱이 필수앱에 올라왔다는 제보를 받고 젭싸게 캡쳐해둔 이미지

Gear 필수 앱 모음에 4번째에 노출... 약 1주일정도 올라가있다가 내려감... ㅠㅠ

누적 다운은 생각보단 많지않았다^^;; 600명?

위젯으로도 추가가 앱실행 없이 쓸수 있어서 유용하지만... 평은 그닥

사진찍는게 낫다느니..... 휠 돌리기 힘들다느니 등등... 하지만 업뎃할 의지는 없다는게 함정 ㅠㅠ

 

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


  1. Favicon of https://blog.weekendproject.net BlogIcon 은쟈은쟈 2017.05.30 12:35 신고

    짝짝짝 잘만들었어요!!

  2. 너무아쉬워요 2020.06.27 20:01

    기어S2에서 너무 잘쓰다가 Galaxy Watch Active로 바꿨는데 갤럭시스토어에 없네요. ㅠㅠ 올려주시긴 어렵겠죠? 그동안 잘 사용했습니다~

    • Favicon of https://blog.weekendproject.net BlogIcon 붱이붱이 2020.06.27 20:03 신고

      ㅠㅠ 네 소스도 분실하고 관리가 안되고있어서 현재 불가능해요 죄송합니다

+ Recent posts