HomeAssistant로 Xiaomi(샤오미) MiAir2(공기청정기) 자동화

Posted by JiYiNo
2018. 12. 11. 12:30 지이노/ReView & Using






Mi Air2(이하 미에어)를 HomeAssistant(이하 HA)에 페어링 해야 하는 이유는 무엇일까?


그냥 단순히 원격으로 켜고 끄는 것 이라면 MiHome앱을 사용해도 할 수 있다.


물론 더불어 미세먼지에 따라 자동으로 켜고 끄는 것 까지도 할 수 있다.


그렇다면 무엇하러?


플랫폼의 통합이다.


조명을 조작할 때는 A어플, 공기청정기를 조작할 때에는 B어플, 커튼을 조작 할 때에는 C어플...


이러면 안 하게 된다.


아무리 편하다고 해도 이 어플 저 어플 돌아다녀가며 해야 한다면 가족들은 싫어 할 수 있다.


머리는 항상 하나여야 한다.


중앙에서 플랫폼을 하나로 묶고 하나로 묶은 플랫폼이 자동제어까지 한다면 복잡할 일이 없다.


플랫폼이 하나가 되면 집 안의 모든 장비가 연동되어 자동화 할 수 있게 되는 것이다.


매력적.






1. 준비


자동화를 준비 하기 위해 나는 몇 가지가 필요하다고 본다.


첫째, 자동/수동 모드


이거 은근히 중요하다.


항상 자동 모드이면 내가 수동으로 끄고 싶을 때, 조건은 안 되었지만 켜고 싶을 때


조작을 할 수 가 없다.


조작하면 자동으로 동작해야 하는 상태를 실행하겠지...


현장에서 이런 식으로 자동 제어를 구축해주면 다들 싫다고 한다.


그러므로 자동/수동 선택을 할 수 있는 기능이 필요하다.


둘째, 가동/정지 설정 값


만약 공기청정기가 미세 먼지 15에서 돌고 10에서 정지하도록 자동화 해두었다고 치자


상황에 따라 25에서 돌고 11에서 멈춰야 하는 경우도 있고


때에 따라 더 적은 미세 먼지에서도 가동해야 하는 경우가 있을 수 있다.


자동화에서 설정 값은 사용자가 설정 할 수 있게 하는 것이 중요하다고 생각한다.


설정을 바꿀 때 마다 프로그래머 당사자가 수정해 줄 수는 없는 일이니 말이다.


이번 포스트에서는 이 두 가지를 가지고 미에어를 자동제어 할 계획이다.






2. 자동/수동 모드 생성


모드 선택을 하기 위해 버튼이 필요하다.


일반적인 Boolean 버튼으로 off 일 때는 수동, on 일 때는 자동 으로 인식해도 되지만


HA에는 콤보 박스와 같은 input select 라는 기능이 존재한다.


https://www.home-assistant.io/components/input_select/


이 기능은 HA에 가상의 콤보박스를 생성해 주고 그 값을 자동화 등에 사용 할 수 있게 해준다.


이번 포스팅에서는 Manual과 Auto를 선택 할 수 있는 select 센서를 생성 할 것이다.


A configuration.yaml 파일을 연다.


파일의 빈 공간에 아래 구문을 추가한다. (위치는 상관없음)


input_select: !include input_select.yaml


configuration.yaml 파일에 생성해도 되지만 include 를 통해 별도 파일로 생성하는 것이


나중에 늘어날 entity를 위해 정리하기 편리하다.


B \config 경로에 input_select.yaml 파일을 생성하고 해당 파일을 연다.


생성된 파일에 아래의 구문을 추가한다.


  miair2_am:

    name: '미에어2 자동여부 설정'

    options:

      - Manual

      - Auto

    icon: mdi:brightness-auto



miair2_am은 entity 이름이고 


name은 데시보드에 표시될 이름, 일종의 별칭이다.


options에는 콤보박스에 표현하고 싶은 값을 적어 넣을 수 잇다.


                 이번에는 Manual 과 Auto 만 추가한다.


icon은 있어도 그만 없어도 그만이다. 그냥 아이콘을 이쁘게 하고 싶었다.


C 모든 설정이 끝났으므로 HA 를 재 시작한다.


HA가 재 시작 되면 아래와 같은 entity가 생성된다.



콤보박스를 클릭 혹은 터치하면 앞에서 설정한 대로 Manual 과 Auto를 선택 할 수 있다.


사용자의 선택에 따라 이 entity의 status 값은 Manual 혹은 Auto로 변경된다.






3. 설정 값 생성


내가 필요한 설정 값은 두 가지 이다.


가동 설정 값 과 정지 설정 값.


미세 먼지 값이 가동 설정 값 초과일 때 미에어가 가동하고 정지 설정 값 미만 일 때 미에어가 정지하도록 할 계획이다.


그렇다면 이 설정 값을 입력 할 수 있는 entity가 필요하다.


HA에는 input number 라는 기능이 존재하고 이 컴포넌트로 생성된 엔티티는 숫자 값을 입력하는 것이 가능하다.


https://www.home-assistant.io/components/input_number/


이번에는 그 중에서 slider 기능을 사용 할 것이다.


앞서 했던 것 과 거의 비슷하게 진행한다.


A configuration.yaml 파일을 열고 아래 구문을 추가한다.


input_number: !include input_number.yaml


B 동일한 방식으로 \config 경로에 input_number.yaml 파일을 생성한다.


C 생성한 input_number.yaml 파일을 열고 아래 구문을 추가한다.


  miair2_start:

    name: '미에어2 자동가동 설정'

    initial: 25

    min: 5

    max: 40

    step: 1.0

    icon: mdi:play-circle-outline

    unit_of_measurement: '㎍/㎥'


  miair2_stop:

    name: '미에어2 자동정지 설정'

    initial: 11

    min: 5

    max: 40

    step: 1.0

    icon: mdi:pause-circle-outline

    unit_of_measurement: '㎍/㎥'



설명은 앞선 모드 생성과 비슷하다.


miair2_start(stop)은 entity의 명칭이고 name은 별칭이다.


initail은 초기 값을 설정 하는 것이고 min/max는 최소/최대값을 말한다.


step은 슬라이더가 움직일 때 한번에 최소 몇 의 값을 움직일지 설정하며


icon은 앞서 말했 듯이 아이콘을 설정한다.


마지막으로 unit_of measurement는 표시할 단위를 설정한다.


D 모든 설정을 마쳤다면 다시 한번 HA를 재 시작 해준다.(한 번에 다 작성하고 재 시작해도 무방하다)


정상적으로 HA가 재 시작되었다면 아래 처럼 entity가 추가된다.







4. 자동화


준비가 끝났다.


이제 자동화를 진행하도록 한다.


작동 방식은 앞서 설명했으므로 생략, 바로 automations.yaml 파일을 열도록 하자.


- id: miair2_auto_start

  alias: 'Mi Air2 Auto Start'

  trigger:

    platform: template

    value_template: "{{ states.fan.xiaomi_air_purifier.attributes.aqi | float >

states.input_number.miair2_start.state | float -2 }}"

  condition:

    condition: state

    entity_id: input_select.miair2_am

    state: 'Auto'

  action:

    service: fan.turn_on

    entity_id: fan.xiaomi_air_purifier

미에어가 자동으로 시작하도록 하는 구문이다.


위 구문은 [ 미에어의 aqi 값이 가동 설정 값 보다 클 때 모드가 Auto 상태라면 미에어를 켜라. ]라는 구문이 된다.


automation의 구문 설명은 다음에 추가 포스트로 진행하기로 하고 생략한다.


여기서 주의 해야 할 점은 자동으로 가동하는 것에 대한 방식이다.


분명히 앞서서 Auto 모드일 때에만 자동으로 동작을 해야 한다고 설명 했듯이


아무리 설정 값 보다 미세먼지 값이 높더라도 자동상태가 아니면 가동 할 수 없도록 2중으로 조건을 걸어 두었다.


아래는 정지 설정 값에 의한 미에어 자동 정지를 위한 구문이다.

- id: miair2_auto_stop

  alias: 'Mi Air2 Auto Stop'

  trigger:

    platform: template

    value_template: "{{ states.fan.xiaomi_air_purifier.attributes.aqi | float <

states.input_number.miair2_stop.state | float -2 }}"

  condition:

    condition: state

    entity_id: input_select.miair2_am

    state: 'Auto'

  action:

    service: fan.turn_off

    entity_id: fan.xiaomi_air_purifier

가동 구문과 거의 동일하지만 부등호가 반대이고 정지 설정 값을 비교한다.


entity 이름만 변경한다면 다른 곳에도 활용 가능.


테스트 해보니 정상적으로 가동/정지 한다.






5. 그룹화


이렇게 만들었는데 미에어는 여기에 운전모드는 저기에 설정 값은 쩌~쪽에 있으면 불편하다.


이 3개의 entity를 그룹화 하여 가독성을 높여주자.


\config 경로 상에 groups.yaml 이라는 파일이 있다.  이 파일을 오픈한다.


Purifier:

  name: Purifier

  entities:

  - fan.xiaomi_air_purifier

  - input_select.miair2_am

  - input_number.miair2_start

  - input_number.miair2_stop


그룹을 만들어 주는 방식은 이름을 정하고 하나의 그룹으로 만들고 싶은 entity들을 나열하면 된다.


여기에서 나열한 순서가 HA 데시보드의 카드에 표기되는 순서가 되니 원하는 순서대로 정렬한다.


그룹화를 끝내고 다시 HA를 재 시작....해야 하지만


Automation과 Script, Group은 개별 재시작이 가능하다.


HomeAssistant로 로지텍 하모니 허브 (Harmony Hub) 제어하기


관련 내용은 위 링크에 적혀있으므로 참고.



이제 미에어 자동화를 마쳤다.


그룹화로 인해 가독성이 좋아졌다.


각각의 설정을 해두면 이제 미에어는 자동으로 가동/정지를 반복하게 된다.






6. 마치며


사실은 이 포스팅을 작성한 시점에서는 이미 저 자동화로 몇 달을 사용하고 있었다.


이게 밀린 포스팅을 쓰다 보니 새로 한 것 처럼 쓰거나


기존에 있던 것을 삭제하고 작성하려니 더 어려운 듯 하다.


앞으로도 한동안은 이런 밀린 포스트를 작성 할 텐데...


눈 앞이 깜깜하다.

이 댓글을 비밀 댓글로
    • 궁금합니다
    • 2019.02.15 00:35
    아무리 찾아봐도 모르는게 있어서 댓글 남깁니다.
    miair2_am:

    name: '미에어2 자동여부 설정'

    options:

    - Manual

    - Auto

    icon: mdi:brightness-auto

    위 부분에서 miair2_am <- 왜 이렇게 적었는지 궁금합니다.
    제 샤오미 청정기는 미 에어 프로 인데, 똑같이 miair2_am 이렇게 가야하는건가요?
    entity 라는게 도대체 뭔지 이해가 안되네요.. 답변 부탁드릴게요.ㅠ
    • 쉽게 말하자면 entity는 이름 또는 주소와 같은거에요
      자동/수동을 선택할 수 있는 input_select를 생성하는데
      프로그램 내부적으로 이녀석을 지칭할 명칭이 필요하기 때문에 지어주는 것이죠
      제 경우 miair2_am 이락고 지었지만 abc라고 지어도 전혀 문제가 없습니다.
      entity를 뭐라고 적느냐에 따라 이름이 정해지는데 방식은
      component.entity 식으로 지어져요
      개발자도구의 state 페이지를 보면 input_select.miair2_am이라는 entity가 생성 된 것을 확인 할 수 있죠
      만약 abc로 했다면 input_select.abc가 될겁니다.

      우리가 그룹을 하던 automation이나 script를 작성할 때에도 이 entity를 통해 값을 읽어서 조건으로 쓰거나 값을 써서 동작을 시키게 됩니다.

      폰으로 적어서 두서없이 적었지만 miair2_am은 사용자가 원하는 암 이름이나 사용하셔도 됩니다.
      제가 알아보기 편하려고 지은 이름이니 개의치 않으셔도 되요
      즉, miairpro_select등 아무 이름이나 적으셔도 되는거죠.
      물론 영어로요.

      이해가 되셨으면 좋겠는데 혹시 설명이 부족하다면 덧글로 다시 문의 해주시면 도움을 드리겠습니다.
    • 궁금합니다
    • 2019.02.16 21:22
    친절하고 자세한 설명 감사합니다.

    이해가 됐습니다. 정말 감사드립니다.
    • 도움이 되셨다니 다행입니다 ㅎ
    • 궁금합니다
    • 2019.02.17 11:32
    - id: miair2_auto_start

    alias: 'Mi Air2 Auto Start'

    trigger:

    platform: template

    value_template: "{{ states.fan.xiaomi_air_purifier.attributes.aqi | float >

    states.input_number.miair2_start.state | float -2 }}"

    condition:

    condition: state

    entity_id: input_select.miair2_am

    state: 'Auto'

    action:

    service: fan.turn_on

    entity_id: fan.xiaomi_air_purifier


    덕분에 자동 온오프 제어 잘되네요 감사합니다
    추가로 궁금한게 있어서 댓글 답니다.

    위 조건에서 추가로 미에어 모드를 미세먼지 몇이상이면 선호모드 (favorite) 몇단계로 돌리고

    그 이하면 자동(auto)모드 혹은 야간 모드로 돌리려고 하는데 어떤식으로 해야하는지 명령어나 조언좀 부탁드립니다.

    • 말씀하신 선호모드 몇 단계라는 것이 무엇인지 이해를 못하였습니다.

      그 외의 모드 변경을 만들 경우에 대해서 설명 드릴 순 있을 것 같습니다.

      모드 변경에 대한 service는 fan.set_speed 입니다.

      따라서 앞의 조건을 생략하고 action 부분 만을 설명하자면

      action:
      service: fan.set_speed
      data_template:
      entity_id: fan.xiaomi_air_purifier
      speed: 'favorite'

      의 action을 사용하게 되면 선호모드로 변경됩니다.

      'favorite' 부분을 'auto' 또는 'silent'로 사용하시면 마찬가지로 변경 가능합니다.
    • 궁금합니다
    • 2019.02.17 22:18
    어떤식으로 풀어나가야 할지 궁금증이 풀렸네요.
    정말 감사드립니다.
    • 원하시는 결과물 얻으시길 바랍니다 ㅎ
    • hass
    • 2019.05.13 22:03
    value_template: "{{ states.fan.xiaomi_air_purifier.attributes.aqi | float <

    states.input_number.miair2_stop.state | float -2 }}"

    여기서 끝부분에 -2를 붙이는건 무슨 의미인가요??