침실 습도 최적화

1. 들어가며

최근 홈 IOT에 관심이 생겨 여러가지 작업을 진행했고 시행 과정에서 예상하지 못한 오류와 해결하기 위한 삽질 과정이 있어 공유 및 기록 차원에서 글을 남긴다.

나의 홈 IOT 플랫폼은 Smartthings(이하 ST) 허브로 구축했고 webCoRE를 쓰지않고 ST 앱(Classic 아님, 일명 뉴앱)의 자동화(Automation) 기능만 활용하였다.

그 이유는 아래 3가지 정도이며 ST 앱의 자동화 기능도 클라우드긴 하지만 ST 서버 장애시 webCoRE도 장애가 날 것이므로 한단계라도 줄이는게 낫다고 판단했다.

  1. webCoRE 서버 장애시 기능정지 및 오동작 우려
  2. 클라우드 환경이다 보니 webCoRE를 한번 더 거치게 됨으로써 딜레이 발생 가능성
  3. webCoRE를 사용할 정도의 복잡하고 세밀한 자동화 불필요

그리고 네이버 카페 등 많은 커뮤니티에서 ST Classic 앱을 더 선호하던데, 새로운 앱이 나온 이상 향후 뉴앱을 중심으로 개발되고 발전될 것으로 예상되어 뉴앱으로만 자동화 코드를 작성하였다.

환경구성에 대한 설명은 이정도로 마치고 우선 첫번째로 IOT를 통해 수면환경을 개선하는 것을 목표로 취침시간중 습도를 45~55%로 유지하는 것으로 시작해봤다.

 
 

2. 준비 과정

가. 허브 : Smartthings HUB 3세대

국내용 제품은 아직 없어 아마존에서 직구를 해야 했다.
미국용 제품이나 보니 Zigbee 기기 연결은 상관없으나, Z-Wave 기기 연결시 미국향 제품만 연동이 된다.

나. 습도센서 : Awair 2세대

습도는 가습기 자체에서 체크도 가능하지만 기왕이면 향후 확장성(CO2 관리 등)을 고려해 온도, 습도, CO2, 화학물질, 초미세먼지 측정이 가능한 Awair 2세대 센서를 구매했다.

Awair는 기본적으로 ST와 연동을 지원한다.
또한 Awair 전용앱에선 그래프를 통한 과거 수치 변화 및 알림 등 다양한 기능을 제공한다.
 

다. 가습기 : 샤오미 2세대 가습기(자연기화식, 모델명 : CJXJSQ02ZM)

가습기는 개인적으로 무조건 자연기화식이나 가열식을 써야 한다고 생각한다.

이유는 초음파식 가습기는 물속의 이물질이 방출되어 직접 폐까지 전달될 수 있으며 과거 발생한 가습기살균제 사고도 초음파식 가습기로 인해 발생한 사고다.
(http://nosearch.co.kr/221390119627, 카테고리 1-2 '가습 방식별 위생 안정성'을 꼭! 읽어보기 바람)

이에 나는 자연기화식 가습기를 구매해 오랜기간 사용해오고 있다.

각설하고 사오미 제품들은 미홈 앱을 통해 내가 원하는 다양한 자동화를 구성할 수 있다.
(특정시간이나 특정 습도시 켜고 끄는 등 다양한 자동화가 가능)

하지만 다양한 기기 및 센서 등을 활용하고자 샤오미 기기만 연동되는 미홈 앱은 사용하지 않는 것으로 결정했다.

그리고 샤오미 가습기의 습도센서는 우리집의 실제 습도와 약 5~10% 높게 측정되어 신뢰성이 부족하였고, 향후 확장성도 고려해 Awair를 통해 습도를 확인하는 것으로 설정했다.
 

라. 스마트플러그 : 다원DNS Zigbee 스마트플러그 16A

Awair 센서를 통해 특정 습도 이하/이상일 경우 가습기를 켜고/끄기 위해 스마트플러그가 필요하였다.
국내 제품인 다원DNS의 Zigbee 스마트플러그를 구매, ST HUB와 연동하였다.

연동 방법은 부엉이 님이 만드신 DTH를 활용하여 연동하였다.

https://blog.weekendproject.net/248?category=707578
https://github.com/WooBooung/BooungThings/blob/master/devicetypes/woobooung/dawondns-smartplug.src/dawondns-smartplug.groovy

 
 

3. 삽질의 시작..... -_-

가. 가습기의 정전보상 기능

위 모든 기기를 모두 연결하고 ST 앱에도 연동에 성공, 이제 스마트플러그를 켜고 끄고 해보았다.
잘 켜고 꺼진다. 그런데 스마트플러그에 연결한 가습기가 꺼진 이후 켜지지가 않는다.

그렇다. 샤오미 가습기는 정전보상 기능이 없었다.....

전자제품의 경우 전기가 차단된 이후 다시 전기 공급시 이전 설정값으로 동작하는 정전보상 기능이 있는 제품들이 있으나 샤오미 기기는 그게 없었다.

그래서 Raspberry Pi에 샤오미 기기들을 ST에 연결을 해주는 Mi-Connector를 설치하여 연동하는 방법으로 해야 하나 고민...(이거 하나 동작시키자고 이래야 하나?)

그러다 아래와 같이 미홈 앱의 자동화 기능을 활용하여 손쉽게(?) 정전보상 기능을 대체하였다.

이제 스마트플러그의 전원이 들어오면 가습기도 전원이 켜진다. (꺼지는건 당연히 꺼지고...)
 

나. Awair 센서의 이상

ST와 연동된 Awair 센서에서 습도를 지속적으로 모니터링하여 가습기를 켰다 껐다 해야하는데 불특정하게 Awair 측정값들이 갱신이 안되고 멈추는 현상이 발생.

이에 Awair 공식 서비스가 아닌 부엉이 님이 만들어 배포중인 스마트앱 및 DTH를 통해 연동하니 그러한 문제는 일어나지 않았다.

차이는 공식은 실시간으로 각종 센서값을 받아오지만, 부엉이 님이 만드신 스마트앱은 API 호출이 하루 300회로 제한이 있어 5분에 한번씩 측정값을 받아오게 되어 있었다.

https://blog.weekendproject.net/244?category=707578
https://github.com/WooBooung/BooungThings
https://youtu.be/KPhvK8RHhX4
 

다. 뉴앱 자동화 조건의 문제

다음 단계로 수면 환경 개선을 위해 Smartthings 앱의 자동화 기능을 아래와 같이 작성했다.

  1. 수면시간(20:20~07:20) 동안 습도 45% 이하일 경우 가습기를 켬

  2. 수면시간(20:20~07:20) 동안 습도 55% 이상일 경우 가습기를 끔

  3. 기상시간(07:35)이 되면 가습기를 끔

그런데 자동화 1번 항목에서 문제가 발생. 수면시간인 20:20이 되었고 Awair 센서가 측정한 습도가 45%이하인데도 가습기가 켜지지 않았다.
이게 가장 오류를 찾기가 어려웠는데 온갓 뻘짓을 해보다 겨우 원인을 찾았다.

처음에는 Awair 센서의 습도가 이전과 동일할 경우 Awair 센서의 History상에 습도가 업데이트 되지 않는 것을 확인하여 API를 참고해 코드를 수정, 이전 습도와 값이 동일하더라도 측정값이 반영되도록 하였지만 여전히 문제가 발생했다.

https://docs.smartthings.com/en/latest/ref-docs/smartapp-ref.html#sendevent

case "humid": childDevice?.sendEvent(name: "humidity", value: it.value as Integer, unit: "%"); break

case "humid": childDevice?.sendEvent(name: "humidity", value: it.value as Integer, isStateChange: true, unit: "%"); break

그래서 지속적으로 관찰한 결과 습도값이 1이라도 변경이 되어야만 자동화가 활성화 되는것을 확인!

예를들어 Awair 센서의 습도가 20:15경 43%인데 20:20 이후 계속 43%로 고정이 되어 값이 변하지 않는다면 습도 45% 이하라는 조건이 활성화 되지 않다가 42%와 같이 습도가 변경이 되어야만 활성화가 되었다.

그래서 습도를 소수점 단위로 받는다면 값이 자주 바뀔것이므로 이러한 문제를 해결할 수 있으리라 생각, 부엉이 님의 스마트앱 코드를 수정하였다.

case "humid": childDevice?.sendEvent(name: "humidity", value: it.value as Integer, unit: "%"); break

case "humid":
Double humidDouble = it.value
childDevice?.sendEvent(name: "humidity", value: humidDouble.round(1), unit: "%")
break

이후 Awair 센서를 통해 습도를 소수점 단위로 잘 받아오는 것을 확인했고 자동화도 동작함을 확인했다.
하지만 기쁨도 잠시 다음날 취침시간에 켜지지 않는 문제가 발생... 결국 뉴앱의 자동화는 버리고 webCoRE로 갈아탐 -_-
 
 

4. 결론

웹코어로 갈아타서 트리거 및 컨디션 등의 조건을 보다보니 뉴앱 오토메이션 'Equal to or below 45' 조건은 웹코어로 치면 컨디션이 아닌 트리거로 추측된다.

웹코어의 'drops below 45' 트리거는 시작 시점의 습도가 44%라면 참이되지 않는다. 참이 되려면 시작 시점의 습도가 47%였다가 45% 밑으로 떨어져야만 참이된다.
그래서 위 뉴앱의 자동화 기능도 오류가 있었던 것으로 추측된다.

나의 결론은 그냥 webCoRE 쓰세요. 두번 쓰세요...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다