본문 바로가기
서버/리눅스 서버

HomeAssistant 초보자 설정

by 도정진 ㅋㅋ잠자 2020. 5. 27.

이전 글 모음

https://blog.djjproject.com/604 - ST 허브 개봉

https://blog.djjproject.com/607 - HA 설치

https://blog.djjproject.com/608 - mi connector 설치

https://blog.djjproject.com/609 - 홈브릿지 설치

https://blog.djjproject.com/614 - 구글 홈 컨넥터 설치

https://blog.djjproject.com/615 - dw connector 설치

https://blog.djjproject.com/617 - 중간 정리

https://blog.djjproject.com/618 - Beelink GT-Mini A armbian 설치

https://blog.djjproject.com/625 - 구글 홈 미니

https://blog.djjproject.com/626 - 도커 이미지 뽑기

https://blog.djjproject.com/643 - SSL 인증서 발급 (Let's Encrypt)

https://blog.djjproject.com/646 - HA 코콤 월패드 연동

https://github.com/djjproject/hass - HA 설정 저장소

https://blog.djjproject.com/648 - SMART IR HUB (하트모양) 연동

https://blog.djjproject.com/650 - 오피스텔 IOT 구축기

https://blog.djjproject.com/653 - Armbian 실전 옮기기!

https://blog.djjproject.com/654 - HA 디바이스 트래커 설정

https://blog.djjproject.com/655 - HA 초보자 설정 (현재글)


안녕하세요? 백업용으로 작성합니다.





1. 설정파일 구조


configuration.yaml 이 기본 파일입니다.


이 파일에서 include 같은 기능을 할 수 있는데요.


 23 group: !include groups.yaml

 24 automation: !include automations.yaml

 25 script: !include scripts.yaml

 26 switch: !include switchs.yaml

 27 sensor: !include sensors.yaml


이런식으로 가능합니다.


그렇다면, include 된 파일에 group: 이걸 적으면 안됩니다. 바로 아래 내용이 나와야합니다.





2. scene 으로 template 스위치 만들기


플랫폼으로 template 지정, 그리고 스위치에 airconditioner 이름 지정


상태값으로는 아카라 도어 센서의 값을 사용합니다.


상태값으로 is_state / is_state_attr 등이 사용가능하고 이걸 어떻게 사용가능한지 보려면, 개발자 도구에서 확인이 가능합니다.


181 # airconditioner tuya ir / xiaomi door seneor

182   - platform: template

183     switches:

184       airconditioner:

185         value_template: "{{ is_state('sensor.st_xiaomi_aqara_door_sensor_10e    e','open') }}"

186         turn_on:

187           service: scene.turn_on

188           data:

189             entity_id: scene.bpgyeqe # 27

190         turn_off:

191           service: scene.turn_on

192           data:

193             entity_id: scene.uqlkc

194         icon_template: >-

195           {% if is_state('st_xiaomi_aqara_door_sensor_10ee', 'open') %}

196             mdi:air-conditioner-on

197           {% else %}

198             mdi:air-conditioner

199           {% endif %}






3. 스크립트를 스위치 onoff 로 사용


다원 플러그의 경우, 한번에 켜지지 않는 경우가 많습니다.


그럼, template 스위치를 만들어서 스크립트를 거기에 등록합니다.


200 # computer

201   - platform: template

202     switches:

203       computer:

204         value_template: "{{ is_state('switch.dawondns_b540_w_','    on') }}"

205         turn_off:

206           service: shell_command.hibernate_desktop

207         turn_on:

208           service: script.computer_turn_on


물론 밸류값을 state 로 읽어오고 turn onoff 에는 shell_command / script 등을 사용합니다.


스위치를 바로 꺼버리면, 문제가 있기 때문에 hibernate 시그널을 보내고, 딜레이를 주거나, 다원 스위치의 대기전력차단 기능을 사용해서 구현합니다.


스크립트는 아래와 같습니다.


시퀀스 설정으로 되어 있습니다. 한번 켜기 서비스를 하고 2초 대기후 한번 더 켜줍니다.


  1   computer_turn_on:

  2     sequence:

  3       - service: switch.turn_on

  4         data:

  5           entity_id: switch.dawondns_b540_w_

  6       - delay: '00:00:02'

  7       - service: switch.turn_on

  8         data:

  9           entity_id: switch.dawondns_b540_w_


한편, 컴퓨터 절전의 경우에는 아래와 같이 구현합니다.



상기 프로그램을 통해서 웹서버를 열고 curl 로 요청을 보내는 방법으로 사용합니다.



하기 주소들을 shell command 로 등록합니다.




119 shell_command:

120   shutdown_desktop: 'curl -k http://192.168.0.8:8000/?action=System.Shutdown    '

121   restart_desktop: 'curl -k http://192.168.0.8:8000/?action=System.Restart'

122   hibernate_desktop: 'curl -k http://192.168.0.8:8000/?action=System.Hibernate'





4. 자동화 중 상태값을 기억해야할 때


인풋 불린을 사용합니다.


자동화 중, 재실 센서를 와이파이 블루투스로 할때,


자동화 트리거를 와이파이 / 블루투스 상태가 바뀔 때로 해 두면 분명 둘 중에 하나가 바뀔 때 재실 상태가 변해버립니다.


하기 자동화를 참고하면, 실제로 컨디션 체크는 필요없습니다. 아무리 해도 작동이 되지 않길래 어쩔 수 없이 ㅎㅎ 문법에 다 맞춘것 뿐입니다. 찾고 나니 결국에 문제는 


'on' 에서 작은 따옴표를 써주지 않아서 생기는 문제였습니다.


일단 인풋 불린은 아래와 같이 만듭니다.


141 input_boolean:

142   home_state:

143     icon: mdi:home

144     initial: on


그러면 HA 에 아래와 같이 올라올 것입니다.



직접적으로 상기 인풋 불린을 조정하고, 그 조정에 대해서 반응하는 자동화를 하면 됩니다.


처음에는 이걸 몰라서 쉘 스크립트로 어떤 파일에 값을 써두고 읽어가는 형식으로 구현하려다 좋은 방법을 찾게 되었습니다.


일단 그럼 상기 home_state 를 바꾸는 자동화를 구현해 봅니다. 재차 말씀드리지만, condition 은 필요없습니다.


그러나 2가지 기기를 확인하기 때문에 둘 중에 하나가 에러가 나서 상태가 바뀌는 경우, 외출 처리 방지를 위해서 사용해야합니다.


106 - alias: away_home_state    # 외출일때

107   initial_state: on    # 자동으로 자동화를 켜둠

108   trigger:    # 블루투스와 와이파이가 상태가 home --> not_home 으로 바뀔때  

109     - entity_id: device_tracker.pocophone_f1

110       for: 00:00:1

111       from: home

112       platform: state

113       to: not_home

114     - entity_id: device_tracker.8e_

115       for: 00:00:1

116       from: home

117       platform: state

118       to: not_home

119   condition:    # 둘다 재실이 아닐때

120     condition: and

121     conditions:

122       - condition: state

123         entity_id: device_tracker.pocophone_f1

124         state: not_home

125       - condition: state

126         entity_id: device_tracker.8e_

127         state: not_home

128   action:    # 불린 값을 off 로 바꿈

129     - service: input_boolean.turn_off

130       data:

131         entity_id:

132           - input_boolean.home_state



133 - alias: at_home_state
134   initial_state: on
135   trigger:
136     - entity_id: device_tracker.pocophone_f1
137       for: 00:00:1
138       from: not_home
139       platform: state
140       to: home
141     - entity_id: device_tracker.8e_0b_14_77_b2_1d
142       for: 00:00:1
143       from: not_home
144       platform: state
145       to: home
146   condition:    # 둘중에 하나가 재실일때
147     condition: or
148     conditions:
149       - condition: state
150         entity_id: device_tracker.pocophone_f1
151         state: home
152       - condition: state
153         entity_id: device_tracker.8e_0b_14_77_b2_1d
154         state: home
155   action:
156     - service: input_boolean.turn_on
157       data:
158         entity_id:
159           - input_boolean.home_state


그러면 상기 불린 값을 트리거로 하여 실제적으로 켜고 끄는 자동화를 하나 더 생성합니다.


160 - alias: away home state turn off

161   trigger:

162     - entity_id: input_boolean.home_state

163       platform: state

164       to: 'off'

165   action:

166     - service: switch.turn_off

167       data:

168         entity_id:

169           - switch.airconditioner

170           - switch.boiler_bath_onoff

171           - switch.dawondns_b540_w_

172     - service: switch.turn_on

173       data:

174         entity_id:

175           - switch.ilgwalsodeung

176     - service: fan.turn_off

177       data:

178         entity_id:

179           - fan.seonpunggi

180           - fan.xiaomi_air_purifier_2s


181 - alias: at home turn on

182   trigger:

183     - entity_id: input_boolean.home_state

184       platform: state

185       to: 'on'

186   action:

187     - service: switch.turn_on

188       data:

189         entity_id:

190           - switch.airconditioner

191           - switch.boiler_bath_onoff

192     - service: switch.turn_off

193       data:

194         entity_id:

195           - switch.ilgwalsodeung

196     - service: fan.turn_on

197       data:

198         entity_id:

199           - fan.seonpunggi

200           - fan.xiaomi_air_purifier_2s





5. 샤오미 선풍기 등록


물론 토큰을 등록해야 합니다.


 57 fan:

 58   # Xiaomi Air Purifier 2S

 59   - platform: xiaomi_miio

 60     host: 192.168.0.5

 61     token: 4cdfbf4e042065

 62     name: "공기청정기"

 63

 64   # Xiaomi Fan

 65   - platform: xiaomi_miio_fan

 66     host: 192.168.0.65

 67     token: ba7bc411ba5b0

 68     name: "선풍기"


이후, 센서 스위치를 등록합니다.


센서로 가지고 올 수 있는 값들은 아래와 같습니다.



센서 등록


  1 - platform: template

  2   sensors:

 20     xiaomi_airpurifier_speed:

 21       friendly_name: 팬속도

 22       value_template: '{{ state_attr(''fan.xiaomi_air_purifier_2s'', ''motor_speed'')

 23         }}'

 24       unit_of_measurement: rpm

 25       icon_template: mdi:speedometer

 26     xiaomi_airpurifier_filter_remaining:

 27       friendly_name: 필터잔량

 28       value_template: '{{ state_attr(''fan.xiaomi_air_purifier_2s'', ''filter_life_remaining'')

 29         }}'

 30       unit_of_measurement: '%'

 31       icon_template: mdi:heart-outline

 32     xiaomi_fan_speed:

 33       friendly_name: 팬속도

 34       value_template: '{{ state_attr(''fan.seonpunggi'', ''raw_speed'') }}'

 35       unit_of_measurement: rpm

 36       icon_template: mdi:speedometer


파워 온오프 / 기능 스위치 등록


 94       xiaomi_fan_child_lock:

 95         friendly_name: "잠금"

 96         value_template: "{{ is_state_attr('fan.seonpunggi', 'child_lock', true) }}"

 97         turn_on:

 98           service: fan.xiaomi_miio_set_child_lock_on

 99           data:

100             entity_id: fan.seonpunggi

101         turn_off:

102           service: fan.xiaomi_miio_set_child_lock_off

103           data:

104             entity_id: fan.seonpunggi

105         icon_template: "mdi:lock-outline"

106       xiaomi_fan_buzzer:

107         friendly_name: "부저"

108         value_template: "{{ is_state_attr('fan.seonpunggi', 'buzzer', true) }}"

109         turn_on:

110           service: fan.xiaomi_miio_set_buzzer_on

111           data:

112             entity_id: fan.seonpunggi

113         turn_off:

114           service: fan.xiaomi_miio_set_buzzer_off

115           data:

116             entity_id: fan.seonpunggi

117         icon_template: "mdi:volume-high"


118       xiaomi_fan_oscillate:

119         friendly_name: "회전"

120         value_template: "{{ is_state_attr('fan.seonpunggi', 'oscillating', true) }}"

121         turn_on:

122           service: fan.oscillate

123           data:

124             entity_id: fan.seonpunggi

125             oscillating: true

126         turn_off:

127           service: fan.oscillate

128           data:

129             entity_id: fan.seonpunggi

130             oscillating: false

131         icon_template: "mdi:rotate-3d"

132       xiaomi_fan_natural:

133         friendly_name: "자연풍"

134         value_template: "{{ state_attr('fan.seonpunggi', 'natural_speed') != 0 }}"

135         turn_on:

136           service: fan.xiaomi_miio_set_natural_mode_on

137           data:

138             entity_id: fan.seonpunggi

139         turn_off:

140           service: fan.xiaomi_miio_set_natural_mode_off

141           data:

142             entity_id: fan.seonpunggi

143         icon_template: "mdi:sprout"


144       xiaomi_fan_oscillate_left:
145         friendly_name: "왼쪽"
146         value_template: "{{ true }}"
147         turn_on:
148           service: fan.set_direction
149           data:
150             entity_id: fan.seonpunggi
151             direction: left
152         turn_off:
153           service: fan.set_direction
154           data:
155             entity_id: fan.seonpunggi
156             direction: left
157         icon_template: "mdi:arrow-expand-left"
158       xiaomi_fan_oscillate_right:
159         friendly_name: "오른쪽"
160         value_template: "{{ true }}"
161         turn_on:
162           service: fan.set_direction
163           data:
164             entity_id: fan.seonpunggi
165             direction: right
166         turn_off:
167           service: fan.set_direction
168           data:
169             entity_id: fan.seonpunggi
170             direction: right
171         icon_template: "mdi:arrow-expand-right"


왼쪽으로 돌리는 등의 버튼들을 만듭니다.


그리고 속도 조절 슬라이더 빠 / 그리고 각도 선택 창을 만듭니다.


 71 input_select:

 81   xiaomi_fan_angle:

 82     name: angle

 83     options:

 84       - 30

 85       - 60

 86       - 90

 87       - 120

 88     icon: "mdi:animation-outline"


101 input_number:

111   xiaomi_fan_speed:

112     name: "속도조절"

113     initial: 1

114     min: 1

115     max: 100

116     step: 1

117     icon: "mdi:weather-windy"


그리고 이 값이 바뀔 때 트리거를 하기 위해서 자동화를 등록합니다.


 42 - alias: xiaomi fan speed changed

 43   trigger:

 44     platform: state

 45     entity_id: fan.seonpunggi

 46   action:

 47     service: input_number.set_value

 48     entity_id: input_number.xiaomi_fan_speed

 49     data_template:

 50       value: '{{ states.fan.seonpunggi.attributes.direct_speed }}'


 52 - alias: xiaomi fan speed change

 53   trigger:

 54     entity_id: input_number.xiaomi_fan_speed

 55     platform: state

 56   action:

 57     service: fan.set_speed

 58     data_template:

 59       entity_id: fan.seonpunggi

 60       speed: '{{ states.input_number.xiaomi_fan_speed.state | int }}'


 62 - alias: xiaomi fan angle changed

 63   trigger:

 64     platform: state

 65     entity_id: fan.seonpunggi

 66   action:

 67     service: input_select.select_option

 68     entity_id: input_select.xiaomi_fan_angle

 69     data_template:

 70       value: '{{ states.fan.seonpunggi.attributes.angle }}'


72 - alias: xiaomi fan angle change

 73   trigger:

 74     entity_id: input_select.xiaomi_fan_angle

 75     platform: state

 76   action:

 77     service: fan.xiaomi_miio_set_oscillation_angle

 78     data_template:

 79       entity_id: fan.seonpunggi

 80       angle: '{{ states.input_select.xiaomi_fan_angle.state | int }}'


스피드를 예로 들면, 스피드 값이 바뀌었을 경우 input_select 의 슬라이더 빠를 초기화 해주는 부분과

실제로 input_select 의 슬라이더가 바뀌면 값을 불러주는 구조입니다.


service:

entitiy_id:

data:


의 구조로 서비스를 호출하게 됩니다.


그러면 하기와 같은 구성이 가능하게 됩니다.


러브레이스는 꾸미기 나름이기 때문에 기본적으로 존재하는 템플릿으로만 하기와 같이 가능합니다.






6. 블루투스 재실 설정


실제로 docker 를 디바이스 패쓰쓰루 하거나 그런 필요가 없습니다.


bluetoothctl 을 통해 power on 만 해주시면 잘 작동합니다.


스캔을 통해 자동으로 known_devices.xml 에 등록되며, 등록되면 추적이 일어납니다.


물론 트래커를 등록해주셔야 동작합니다.


124 device_tracker:

125   - platform: nmap_tracker

126     hosts:

127       - 192.168.0.62

128     home_interval: 1

129     consider_home: 180

130   - platform: bluetooth_tracker

131     device_id: 1

132     consider_home: 180


  2 poco_wifi:

  3   icon:

  4   mac: MA:CA:DD:RE:SS

  5   name: POCO_F1_WIFI

  6   picture:

  7   track: true

  8

  9 pocophone_f1:

 10   icon:

 11   mac: BT_A4:50:46:0C:37:F0

 12   name: POCO_F1_BLE

 13   picture:

 14   track: true







7. 특정 값으로 template 센서 생성


등록한 엔티티의 값으로 각각 쪼개서 센서 생성이 가능합니다.


 97 - platform: template

 98   sensors:

 99     xiaomi_aquara_temp:

100       friendly_name: 온도

101       value_template: '{{ state_attr(''sensor.st_xiaomi_aqara_temp_sensor_de6f'', ''temperature'') }}'

102       unit_of_measurement: °C

103       device_class: temperature

104     xiaomi_aquara_humidity:

105       friendly_name: 습도

106       value_template: '{{ state_attr(''sensor.st_xiaomi_aqara_temp_sensor_de6f'', ''humidity'') }}'

107       unit_of_measurement: '%'

108       device_class: humidity



기기 내부의 커맨드로도 센서 만들기가 가능합니다.


37 - platform: systemmonitor

 38   resources:

 39   - type: last_boot

 40   - type: processor_use

 41   - type: memory_free

 42   - type: throughput_network_in

 43     arg: eth0

 44   - type: throughput_network_out

 45     arg: eth0

 46   - type: disk_use_percent

 47     arg: /

 48   - type: disk_use_percent

 49     arg: /media

 50 - platform: command_line

 51   name: CPU Temp

 52   command: cat /sys/class/thermal/thermal_zone0/temp

 53   unit_of_measurement: °C

 54   value_template: '{{ (value | multiply(0.001)) | round(1) }}'

 55 - platform: command_line

 56   name: CPU Speed

 57   command: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

 58   unit_of_measurement: GHz

 59   value_template: '{{ (value | multiply(0.000001)) | round(1) }}'






7. 이후에 해볼것


자동화 짜기가 너무 귀찮아서 node red 로 한번 해볼 예정입니다.


조도 센서를 통해서 자동화를 조금 더 탄력감 있게 짜볼 예정입니다.


감사합니다.





댓글0