Homeassistant 샤오미 난로 (za2) 연동하기 (feat. Homebridge)
안녕하세요? 도정진입니다.
으아.. mi IOT 프로토콜 때문에 연동을 못하고 있었던 하기 제품..
돌고 돌아 연동하는 방법을 찾았습니다.
아직 python miio 에는 작동하지 않습니다.
root@aml:~# miiocli heater --ip 192.168.0.40 --token 452 info
Model: zhimi.heater.za2
Hardware version: esp32
Firmware version: 2.0.5
그래서 뒤로 돌아서 생각한 것이 homebridge 에서는 연동이 정상적으로 되길래 이 부분을 HomeAssistant 의 Homekit Controller 로 연동해볼 생각을 하게 되었습니다.
물론 ST에서는 미컨넥터를 사용하면 연동이 가능하지만, 일반적인 유저 입장에서는 ST허브를 쓰지도 않는데 놓는게 애매한 부분이 있어서.. 최대한 1개의 디바이스에서 연동이 가능하도록 방법을 찾았습니다.
1. zhimi.heater.za2 토큰 추출
일단은 미홈 구버전을 통해서 토큰을 추출합니다.
https://www.apkmirror.com/apk/xiaomi-inc/mihome/mihome-5-4-45-release/
한번 로그인 후, 기기가 모두 보이는 것이 확인이 되면 /sdcard/SmartHome/logs/plug_DeviceManager 폴더의 로그 파일을 통해 토큰을 알아내실 수 있습니다.
2. 홈브릿지 설치
docker 커맨드로 홈브릿지를 설치합니다.
docker run \
--restart=always \
--net=host \
--name=homebridge \
-e PUID=0 -e PGID=0 \
-e HOMEBRIDGE_CONFIG_UI=1 \
-e HOMEBRIDGE_CONFIG_UI_PORT=8888 \
-v /opt/homebridge:/homebridge \
oznu/homebridge
설치 이후 ipaddr:8888 로 진입하여 admin / admin 암호를 입력하고 로그인 합니다.
3. 홈브릿지와 샤오미 히터 연동
그리고 플러그인에 가셔서 하기 패키지를 설치합니다.
https://www.npmjs.com/package/homebridge-xiaomi-purifier-3
그리고 구성에 들어가셔서 하기와 같이 설정을 추가합니다.
{
"accessory": "SmartmiHeater",
"name": "Smartmi Heater",
"ip": "192.168.0.40",
"did": "",
"token": "",
"minTemp": 16,
"maxTemp": 28,
"enableLED": true,
"enableLEDName": "LED",
"enableBuzzer": true,
"enableBuzzerName": "BUZZER",
"polling_interval": 60000
}
참 여기서 DID 값은 하기와 같이 구합니다.
아이피를 보시고 DID 값을 추출하시면 됩니다.
root@aml:~# npm install -g miio
npm WARN npm npm does not support Node.js v10.21.0
npm WARN npm You should probably upgrade to a newer version of node as we
npm WARN npm can't make any promises that npm will work with this version.
npm WARN npm Supported releases of Node.js are the latest release of 4, 6, 7, 8, 9.
npm WARN npm You can find the latest version at https://nodejs.org/
/usr/local/bin/miio -> /usr/local/lib/node_modules/miio/cli/index.js
+ miio@0.15.6
updated 1 package in 16.862s
root@aml:~# miio discover --sync
INFO Discovering devices. Press Ctrl+C to stop.
Device ID: 77398861
Model info: Unknown
Address: 192.168.0.5
Token: ???
Support: Unknown
연동을 하고 홈브릿지를 재시작하면 하기와 같이 장치가 뜹니다.
디바이스를 확인해 보겠습니다.
4. 홈브릿지와 홈어시스턴트 연동
홈어시스턴트에서는 홈킷 컨트롤러로 연동이 가능합니다.
이미 설정이 되었으면 디바이스 디스커버리가 작동하여 하기와 같이 설정 / 무시가 나올것입니다.
만약에 연동이 뜨지 안되거나, 아니면 혹시 연결을 초기화 하고 싶으시면 하기를 따라하세요.
그리고 홈브릿지를 재시작 하시면 정상적으로 올라올 것입니다.
5. 샤오미 히터 러브레이스 UI 추가 및 HEAT 모드 안됨 수정
러브레이스 추가하면 하기와 같이 추가가 됩니다.
그러나 실제로 OFF 는 가능하나 HEAT 모드로 설정이 안되는 문제가 있습니다.
이 부분은 약간 버그인것 같아서 /usr/src/homeassistant/homeassistant/components/homekit_controller 에서 climate.py 를 수정해서 해결을 보았습니다.
실제로 데이터에서 ACTIVE --> INACTIVE / ACTIVE 설정이 들어가야하는 것 같은데 실제로 그게 작동이 되지 않아서 하기 구문을 추가했습니다.
먼저 vim 패키지를 homeassistant core docker 에 설치합니다.
알파인 리눅스이기 때문에 apk add 로 설치가 가능합니다.
root@aml:~# docker exec -it hass /bin/bash
bash-5.0# apk add vim
(1/2) Installing xxd (8.2.0735-r0)
(2/2) Installing vim (8.2.0735-r0)
Executing busybox-1.31.1-r19.trigger
OK: 426 MiB in 208 packages
그리고 홈 어시스턴트 소스 위치로 이동합니다.
bash-5.0# cd /usr/src/homeassistant/homeassistant/components/homekit_controller/
bash-5.0# ls
__init__.py binary_sensor.py const.py light.py sensor.py translations
__pycache__ climate.py cover.py lock.py storage.py
air_quality.py config_flow.py device_trigger.py manifest.json strings.json
alarm_control_panel.py connection.py fan.py media_player.py switch.py
bash-5.0# vim climate.py
vim 에서 설정 커맨드로 하기 명령을 넣어주시는게 편하게 편집 가능합니다.
:set nu
:set ts=4
탭 크기를 공백 4개로 설정하고 줄 넘버를 표기합니다.
하기 버전 기준으로 편집을 하고 있습니다. (거의 최신버전)
정확하게 코드는 모르지만, 일단은 ACTIVE 하다는 설정을 넣어주고
기본 동작에는 문제 없도록 본래 있던 코드는 그대로 둡니다.
async def async_set_hvac_mode(self, hvac_mode):
"""Set new target operation mode."""
if hvac_mode == HVAC_MODE_OFF:
await self.async_put_characteristics(
{CharacteristicsTypes.ACTIVE: ActivationStateValues.INACTIVE}
)
return
if hvac_mode not in {HVAC_MODE_HEAT, HVAC_MODE_COOL}:
_LOGGER.warning(
"HomeKit device %s: Setting temperature in %s mode is not supported yet."
" Consider raising a ticket if you have this device and want to help us implement this feature.",
self.entity_id,
hvac_mode,
)
if hvac_mode == HVAC_MODE_HEAT:
await self.async_put_characteristics(
{CharacteristicsTypes.ACTIVE: ActivationStateValues.ACTIVE}
)
await self.async_put_characteristics(
{
CharacteristicsTypes.TARGET_HEATER_COOLER_STATE: TARGET_HEATER_COOLER_STATE_HASS_TO_HOMEKIT[
hvac_mode
],
}
)
상기가 변경되는 부분입니다.
상기를 변경하면 다른 홈킷 디바이스들과 연동에 문제가 생길 수 있는데, 일단은 저는 홈브릿지로 연동하는게 1개 밖에 없어서 문제가 없었습니다.
if hvac_mode in {HVAC_MODE_HEAT, HVAC_MODE_COOL} 로 에어컨 연동까지 문제 없도록 수정하는 것도 괜찮아 보입니다. 저는 히터만 연동하기 때문에 상기 설정으로 문제가 없었습니다.
(풀리퀘스트 올리는 그런 일은 제가 코드 전체를 이해하지 않고 고친것이라 올리기도 부끄럽네요.)
이후 재부팅하시면 정상적으로 연동이 됩니다.
탭이나 스페이스 둘중에 하나만 indent (들여쓰기) 용으로 사용하시고 꼭 ts=4 옵션을 적용하셔서 tab 으로 편하게 코드 수정하시길 바랍니다.
6. 연동 영상
감사합니다. 되는게 있으면 연동해서 쓰는게 짱땡!