본문 바로가기
IoT

다원 플러그 API 키 사태 대응하기

by ㅋㅋ잠자 2020. 6. 13.
반응형



안녕하세요? 도정진입니다.


아무래도 일단, 다원 API 구조 부터 알고 가보겠습니다.


다원 WIFI 제품들의 연결 구조는 아래와 같습니다.


1. 특정 인증 키 (모든 제품이 동일 키로 로그인)

2. 계정 

3. 플러그 고유 넘버 (이 넘버는 네트워크를 서칭하면 나오는 부분입니다.)


이렇기 때문에 보안에 매우 취약한 형태였습니다. 개인마다 키가 따로 주어지는게 아니였죠.

(물론 보안에 대응한게 잘한 일이지만, 비공식으로 쓰고 있던 것도 국내 업체고 소통이 잘 되었다면 길을 열어줄 수 있었을 꺼 같은데요.. ^^)


이를 최근에 다원이 알고 고쳐버려서 랜이님의 다원 컨넥터, 아기나무집 님의 다원 컨넥터를 사용할 수 없게 되었습니다.


이에 따라 다원에서는 저희가 비공식으로 사용했기 때문에 우리가 지원해 줄 필요는 없다. 라고 나오고 있습니다. 기타 중국 저가 tuya 라던지 이러한 제품에서도 API 가 있는데 다원은 제공이 불가능한 것 같습니다.


근래, 서버도 많이 불안하고.. 다원 서버가 망하면 플러그는 말짱 도루묵이 되는데.. 그냥 API 를 공개하고 어차피 ESP32 를 쓰는 것 같은 느낌으로 그냥 tasmota 커펌 등으로 넘어갈 수 있는 방법이 있으면 좋을 것 같습니다.


이 플러그 너무 많이 사서 처분도 힘드네요. 정말.. 쉽지 않습니다. 잘못사서 이렇게 피해를 보다니..


그럼 시작합니다.





1. API 값 얻기


네이버를 이용하면 API 키를 얻을 수 있다고 합니다.


하기 글을 참고해서 키 값을 얻어보았는데요. 그런데 조만간 또 막힐 께 뻔하기 때문에 그냥 ST 에 연동해서 쓰기로 했습니다.


ST 연동은 계정 연동이라 허브가 없어도 될것 같습니다.. 만 잘 모릅니다.


1. 네이버 계정 생성

2. 본 계정에서 네이버 계정으로 기기 공유

3. https://dwapi.dawonai.com:18443/iot/login/login.opi 주소에서 네이버 로그인


이때 순간 키가 나오는데요. 이걸 캐치하기 힘드시면 크롬 애드온을 이용하시길 바랍니다.


https://chrome.google.com/webstore/detail/link-redirect-trace/nnpljppamoaalgkieeciijbcccohlpoh


일단 이렇게 안쓰기로 했기 때문에 다음으로 넘어갑니다.





2. HA 에 ST 연동을 추가




중간에 ST graph 에서 API 를 발급받는 과정이 있습니다. 발급을 받으시고 연동해주시면 됩니다.


참고로 HA Connector 로는 다원 스위치가 넘어오지 않네요. 


직비로 연결된 센서 및 스위치는 넘어오는데 클라우드로 연동되는 서비스들은 넘어오지 않는 것 같습니다.



그래서


1. HA --> ST : 아기나무집님 컨넥터

2. ST --> HA : HA 구성요소 이용


이렇게 투트랙을 타게 되었습니다.





3. 파워 값 센서 생성


현재 전력이 안나오는 부분이 아쉽습니다만, 일단 비공식으로 쓰다가 중간에 막히는 것을 너무 싫어서


그냥 ST 에 올라와 있는 하기 값을 사용하기로 했습니다.



상기 값을 이용해서 템플레이트 센서를 만듭니다. 저는 일단 제 집에서는 3개니까 3개를 생성했습니다.


111 - platform: template

112   sensors:

113     computer_watt:

114       friendly_name: 컴퓨터 전력

115       value_template: '{{ state_attr(''switch.computer_dawon'', ''today_energy_kwh'')}}'

116       unit_of_measurement: KWh

117       icon_template: mdi:power

118     tv_watt:

119       friendly_name: TV 전력

120       value_template: '{{ state_attr(''switch.tv_dawon'', ''today_energy_kwh'')}}'

121       unit_of_measurement: KWh

122       icon_template: mdi:power

123     server_watt:

124       friendly_name: 서버 전력

125       value_template: '{{ state_attr(''switch.server_dawon'', ''today_energy_kwh'')}}'

126       unit_of_measurement: KWh

127       icon_template: mdi:power





4. 한번 하면 안되는 다원...


한번 하면 안되면 두번 하면 됩니다.


스크립트로 2초 간격으로 2번 turn on 시그널을 보내도록 스크립트를 아래와 같이 작성했습니다.


2번 정도 하니, 실패하는 경우는 없더라구요.


--> 서버에 여러가지로 문제가 있나 봅니다. 한번하면 씹히는 경우가 많거든요..


저가형 tuya ir 도 씹히는 경우가 없는데 ... 참.. 그렇습니다.


  1   computer_turn_on:

  2     sequence:

  3       - service: switch.turn_on # 컴퓨터 켜기

  4         data:

  5           entity_id: switch.computer_dawon

  6       - delay: '00:00:01' # 1초 쉬고

  7       - service: switch.turn_on # 한번 더!

  8         data:

  9           entity_id: switch.computer_dawon

 10

 11   tv_turn_on:

 12     sequence:

 13       - service: switch.turn_on # TV 켜기

 14         data:

 15           entity_id: switch.tv_dawon

 16       - delay: '00:00:01' # 1초 쉬고

 17       - service: switch.turn_on # 한번더

 18         data:

 19           entity_id: switch.tv_dawon

 20       - delay: '00:00:02' # 2초 쉬고

 21       - service: scene.turn_on # TUYA IR 로 티비 켜기

 22         data:

 23           entity_id: scene.jsxzkninghs71cl1

 24

 25   tv_turn_off:

 26     sequence:

 27       - service: scene.turn_on # TUYA IR 로 티비 먼저 끄고

 28         data:

 29           entity_id: scene.jsxzkninghs71cl1

 30       - delay: '00:00:02' # 2초 쉬고

 31       - service: switch.turn_off # 스위치 끄고

 32         data:

 33           entity_id: switch.tv_dawon

 34       - delay: '00:00:01' # 1초 쉬고

 35       - service: switch.turn_off # 한번 더 끄고

 36         data:

 37           entity_id: switch.tv_dawon


그럼 상기 스크립트 기반으로 하기 스위치를 만듭니다.


상태값은 스위치의 ON/OFF 상태를 기반으로

켜고 끄는 것은 상기 스크립트를 실행하도록 합니다.


184 - platform: template

185   switches:

186     computer:

187       value_template: '{{ is_state(''switch.computer_dawon'',''on'') }}' # 상태 체크는 ST에서 연동된 다원 스위치 값

188       turn_off:

189         service: shell_command.hibernate_desktop # 컴퓨터 끄기는 절전모드로

190       turn_on:

191         service: script.computer_turn_on # 켜는건 상기 스크립트로

192 - platform: template # 하기는 마찬가지 입니다

193   switches:

194     television:

195       value_template: '{{ is_state(''switch.tv_dawon'',''on'')

196         }}'

197       turn_off:

198         service: script.tv_turn_off

199       turn_on:

200         service: script.tv_turn_on





5. 러브레이스


저는 꾸미는게 귀찮아서 기본 러브레이스 기능만 씁니다.


현재 사용량 전력이 안나와서 좀 아쉽지만, 어차피 60초 마다 느릿 느릿 가져오는게 필요한가 싶어서 그냥 치워버렸습니다.







6. 화가 많이 났습니다.


이제 다원 제품은 안살것 같습니다.



감사합니다.


반응형

댓글