안녕하세요~ 레이군 입니다.
요 며칠 카페 회원이신 무와딸기 님의 글을 보면서, 아...자동화의 문제처리는 아직 어려운거구나 싶었습니다.
댓글로 적당히 해보려고 했는데, 너무 복잡해질것 같아 아예 따로 글을 쓰면서...
이참에 자동화의 동작에 대해 좀 세세하게 뜯어보는 시간을 가져보려고 합니다.
아래 게시글에 있는 질문글을 내용을 바탕으로 하겠습니다.
자동화 동작이 지 멋대로인 이유를 알 수 있을까요?
대한민국 모임의 시작, 네이버 카페
cafe.naver.com
alias: 에어컨 켜기
description: ''
trigger:
- platform: numeric_state
entity_id: sensor.thi_anbang
above: '79.5'
for: '00:30:00'
condition:
- condition: or
conditions:
- condition: state
entity_id: device_tracker.lm_q927l
state: home
- condition: state
entity_id: device_tracker.iphone
state: home
- condition: state
entity_id: climate.eeokeon
state: 'off'
attribute: hvac_modes
action:
- service: climate.turn_on
target:
device_id: *****
- service: climate.set_temperature
target:
device_id: *****
data:
hvac_mode: cool
temperature: 27
- service: climate.set_fan_mode
data:
fan_mode: MID
target:
device_id: *****
- service: climate.set_swing_mode
target:
device_id: ******
data:
swing_mode: VerticalTop
- service: tts.google_cloud_say
data:
entity_id: media_player.urijib
message: 에어컨이 켜졌어요. 창문을 닫아주세요. 아니면 에어컨을 꺼주세요.
- device_id: ******
domain: mobile_app
type: notify
title: ''
message: 에어컨이 켜졌어요.
mode: single
자 전체 내용은 이만큼 이고, 불쾌지수 센서가 79.5 이상으로 30분 유지되면 트리거 되는데
에어컨이 꺼져있고 + 구성원 2명중 1명이라도 재실상태라면 진행되는 오토메이션을 목적으로 합니다.
오토메이션의 기본에 대해 알고싶으시다면,
제가 전에 작성했던 기본적인 내용에 대한 글을 한번 참조해 주세요.
(정말 기본이기 때문에, 트리거랑 컨디션, 엑션이 뭔지 아시면 안보셔도 됩니다)
[IoT/HomeAssistant] - HA 자동화 구성에 대한 개념 / 예제.
자동화는 크게 다음 순서로 진행됩니다.
트리거 발생 -> 컨디션 체크 -> 액션 실행
이중에 우리에게(무와딸기 님에게) 중요한건, 트리거와 컨디션 입니다. 일단 액션단계 가면 된다고 하셨으니까요..
트리거
자동화의 시작은 트리거 입니다. 말 그대로 방아쇠 라는 의미로, 어느 '순간' 을 지정합니다.
문이 열리는 '순간' / 불이 켜지는 '순간' / 수치가 특정 숫자 위로 올라가는 '순간' / 해가 뜨는 '순간' 등이 있겠죠.
컨디션을 기본적으로 찰나의 순간이기 때문에, 개별로 동작합니다.
or 값이라고 생각하시면 되고, 트리거가 5개다 = 5개중 1개가 만족하는 '순간' 자동화가 시작됨 인거죠.
trigger:
- platform: numeric_state
entity_id: sensor.thi_anbang
above: '79.5'
for: '00:30:00'
우선 트리거 내용부터 보겠습니다.
상당히 간단하죠? numeric_state 라는 숫자의 높낮음을 감지하는 플랫폼을 사용하고,
엔티티 ID를 정한 후 above: 79.5 가 들어갔습니다.
above는 보통 이상 이라는 의미 이지만, 실제로 HA에서는 초과 로 동작합니다.
그러니까 지정된 엔티티의 수치가 79.5에서 79.6 으로 넘어가는 순간 트리거가 되겠죠.
물론 더 작은 수에서 더 큰수로 넘어가도 됩니다. 75에서 80으로 바뀐다던가 할때도 적용되죠
for: 00:30:00 이 붙어있는데, 해당 값이 지정한 시간동안 유지되는 경우 입니다.
시간:분:초 순서로, 위 설정이라면 30분 동안 유지되는 경우 트리거가 되겠죠.
자 이제 트리거의 조건을 알았으니, 몇몇 시나리오를 떠올리며 테스트를 해봐야겠죠.
1. 79 -> 80으로 변경됨, 29분후 79로 변경 -> 다시 80으로 변경 -> 29분후 79로 변경
ㄴ 79.5 초과 상태로 30분 유지되어야 하는데 29분만 유지되므로 트리거 되지 않음
2. 79 -> 80으로 변경됨, 20분 후 HA재부팅(or 자동화 수정등을 통한 자동화 리로드) -> 수치는 80이상으로 유지상태
ㄴ for: 30분의 유지가 되기 전에 HA가 재부팅 되고, 80이상인 상태로 부팅되면 자동화는 트리거 되지 않음
3. 79 -> 80으로 변경, 30분 이상 유지됨
ㄴ 정상적으로 트리거 됨
1번의 경우, 짜증은 나겠지만 의도한대로 30분 이상 유지되지 않았으므로 트리거 되지 않는게 정상입니다.
2번의 경우, 자동화가 동작되고 있는 상태 에서 트리거 조건을 만족해야 하는데 그게 불가능해졌죠
왜냐면 재부팅등을 하면 자동화는 리셋이 되는데, above 는 이하->이상 으로 변경될때만 트리거가 되기 때문에
애초의 값이 above로 지정한 값보다 큰 상태라면, 거기서 얼마가 변하던(80 -> 85라던가) 트리거 되지 않습니다.
3번의 경우, 의도한대로 잘 트리거 되겠죠.
여러 변수가 있겠지만, 일단 트리거가 잘 되는지를 먼저 알아야겠죠?
그러면 테스트를 해봅시다.
첫번째로, for 부분을 주석처리 합니다. 30분짜리 for 구문이 들어가면 테스트 한번 할때마다 30분 대기해야 하니까요.
주석처리 하셨나요? 해당 값이 트리거 되게 해봅시다.
이게 버튼이라던지 스위치 같은거면 직접 켜고 끄면서 테스트 할텐데, 저런 센서상의 수치일 경우는 조건 맞추기가 쉽지 않죠?
그럴때 쓸 수 있는걸 알려드릴께요.
![](https://blog.kakaocdn.net/dn/E1pEw/btrqLT3Clze/COPtNpBvcztjp3kKW1wkJK/img.png)
HA에는 개발자도구 라는 항목이 존재합니다.
이 페이지에 접속하면, 기본적으로 상태 라는 항목이 보일텐데요
거기 아래쪽에 구성요소를 선택하는 화면에서 원하는 구성요소를 선택하면,
해당 구성요소(엔티티) 에서 지원되는 값들이 나옵니다.
구성요소 이름 바로 아래의 상태 항목은, 해당 엔티티의 state를 나타냅니다.
전등이나 스위치라면 on/off 같은 값이 나올꺼고, 온습도 센서라면 해당 장치의 메인으로 표시되는 값이 나오죠.
아래쪽에 있는 상태 속성 부분은 attribute로, 자동화 등에서 설정할 수 있는 값일수도 있고
그냥 상태를 나타내는 값일수도 있습니다.
배열이 좀 다르지만, 어디서 많이 보던거죠?
바로 개발자도구-상태 항목 아래쪽에 쭉~ 나열되어 있는 엔티티ID들에 표시되는 내용이거든요.
아래쪽은 가로로 엔티티ID/상태/속성 형태로 가로로 표시되고,
위에서 선택하면
엔티티ID
상태
속성
순으로 세로로 표시된다는 차이가 있을뿐이죠.
아래쪽에서 엔티티ID의 파란부분을 클릭하면, 자동으로 구성요소로 선택됩니다.
전 아래까지 내려갔다 다시 올라오는게 귀찮아서(상단표시 고정이 안 됨...) 그냥 위에서 구성요소를 선택하는 편입니다.
자 이게 왜 중요한가?
바로 맨 위에 있는 문구를 보시면 알 수 있습니다.
Home Assistant 구성요소의 상태를 설정합니다.
Home Assistant 내에서만 설정되며, 실제로 기기와 통신하는것은 아닙니다.
즉, 여기에서 상태값을 바꾸면(전등의 on/off 상태를 바꾼다던가, 센서의 수치를 바꾼다던가)
HA는 해당 값이 변경되었다고 인식합니다.
습도계의 습도를 올려보겠다고 입김 불어넣고, 온도 내려보겠다고 냉장고에 넣어보고...
안 그래도 된다는거죠!
여기서 지정한 값은, 해당 구성요소의 값이 업데이트되기 전까지 유지됩니다.
주기적으로 업데이트 되거나 자주 사용하는 장치들은 변경한 다음에 그냥 둬도 큰 상관이 없는데,
변경되는 텀이 좀 길거나 잘 사용하지 않는 장치는 테스트를 하고 나면 반드시 원래 값으로 돌려두는걸 추천드립니다.
자 무와 딸기님이 지정하신 센서가 저한테는 없지만, 일단 어떻게 할지 고민을 해봅니다.
trigger:
- platform: numeric_state
entity_id: sensor.thi_anbang
above: '79.5'
# for: '00:30:00'
아까 빠른 테스트를 위해 for: 부분은 주석처리를 했어요.
그러면 지정된 entity_id인 sensor.thi_anbang의 상태값이 79.5이하에서 79.5 초과로 변경되면, 바로 트리거가 되겠죠?
개발자도구 - 상태 항목에 맨 위에 구성요소 선택 항목을 sensor.thi_anbang 로 지정하고
상태값이 80이상이면, 79로 변경하고 하단의 상태 설정 버튼을 눌러줍니다.
상태값이 79이하가 되었다면, 이제 80이상의 값을 입력하고 하단의 상태 설정 버튼을 눌러주세요
자 이제 트리거가 되었겠죠? 별도의 컨디션이 없다면 자동화 액션이 실행되었을꺼구요.
트리거가 되었는지 확인하는 방법은 구성하기 - 자동화 로 가셔서
해당 자동화가 있는곳으로 스크롤 하시면, 자동화 이름 옆에 최근 트리거 시간이 나옵니다.
![](https://blog.kakaocdn.net/dn/2ZUPe/btrqNfSayVJ/EgisXsXfNXCoYneCKjeiR0/img.png)
단 이것은 컨디션을 만족해서 액션이 시작된 자동화에 대해서만 표시하기 때문에
만약 컨디션이 만족되지 않고 트리거만 된건지 확인하려면 오토메이션 디버깅(추적 표시하기) 를 봐야 합니다.
원하는 자동화 우측에 있는 시계모양 아이콘을 클릭해 주세요.
![](https://blog.kakaocdn.net/dn/b38rQU/btrqNMWv1qk/LAQaxZAxH79oR1kxMP5WA1/img.png)
상단에 보시면 시간이 나오죠?
이게 순수하게 '트리거가 만족된 순간' 을 나타냅니다.
컨디션 체크나 액션의 잘못됨 등등등 다 떠나서, 딱 트리거로 지정된 값이 만족되어 자동화가 시작된 시간 인거죠.
즉 여기에 시간이 표시된다는건, 트리거는 정상적으로 동작했다 라고 볼 수 있습니다.
자 내가 구성요소의 설정을 변경했을때 정상적으로 트리거가 되었습니까?
그렇다면 일단 트리거의 구성 자체는 문제가 없네요.
만약 여기서 트리거가 안 된다면, 트리거 구성을 다시 살펴볼 필요가 있습니다.
보통 이런경우는 잘 없지만, 템플릿 등을 쓰게되면 숫자로 인식해야 할 부분에 문자(string) 으로 넣는다던가 하면
트리거 자체가 안될 수 있어요.
여튼, 이번 예제에서는 별로 가능성이 없으니 다음으로 넘어갑니다.
아까 주석처리했던 for을 되살려 보겠습니다.
그런데 인간적으로 30분은 너무 길잖아요...?
trigger:
- platform: numeric_state
entity_id: sensor.thi_anbang
above: '79.5'
for: '00:01:00'
for 부분을 1분 정도로 넣어보겠습니다.
그런다음, 위에서 진행했던 구성요소의 상태를 바꾸는 작업을 다시 해줍니다.
상태값을 79로 바꾸고 설정, 80으로 바꾸고 설정..
1분 후에 트리거가 되었는지 확인해 보세요.
정상인가요? 그렇다면 for의 시간이 더 늘어나도 정상 동작할겁니다.
컨디션이 없다면 여기서 for 부분을 원하는 시간으로 늘리고 마무리 하면 되지만, 우리는 다음 단계가 있죠.
그러므로, 아직은 for을 1분(기다리는게 싫다면, 10초 정도...?) 으로 설정하고 다음으로 가봅시다.
컨디션
다음 순서는 컨디션의 체크 입니다.
컨디션이란, 트리거가 되고 난 다음에 이 상태값을 만족하는지 확인하는 것으로 '조건' 이라고 합니다.
불이 '켜져있는 상태' / 온도가 'xx도 이상인 상태' / 문이 '닫혀있는 상태' / 해가 '떠있을때' 같이 말이죠.
컨디션은 기본적으로 and값으로, 컨디션을 여러개 넣었다면, 지정된 모든 상태를 만족해야 넘어갑니다.
'해가 떠있고' / '온도가 25도 이상' / '집에 사람이 없다' 라고 하면, 셋중 하나라도 만족하지 못하면 안 넘어가는거죠.
- condition: or
conditions:
- condition: state
entity_id: device_tracker.lm_q927l
state: home
- condition: state
entity_id: device_tracker.iphone
state: home
- condition: state
entity_id: climate.eeokeon
state: 'off'
attribute: hvac_modes
그런데 둘중 하나만 만족해도 하고싶을때가 있죠?
그럴때 쓰는게 or 이라는 컨디션 입니다.
위 조건을 풀어보면 다음과 같습니다.
디바이스 트래커 2개(im_q927l, iphone) 중에 하나라도 home 상태
+
climate.eeokeon의 hvac_modes라는 attribue의 값이 off 일때
넘어가는 상태인거죠.
디바이스 트래커의 상태가 둘 다 not_home이라던가, 사용불가 상태라면 넘어가지 못하고,
home값을 만족하더라도 climate.eeokeon의 hvac_modes의 값이 cool 이라던가 하면 마찬가지로 넘어가지 못합니다.
이것도 위에 트리거에서 했던것과 마찬가지로 개발자도구-상태 에서 설정해주시면 됩니다.
![](https://blog.kakaocdn.net/dn/b457OU/btrqMuChAo6/7o5d8XphoraTTDyKvpHs8K/img.png)
home 상태로 둬보고, not_home 상태로 둬보고 하면서 말이죠.
다 설정 되셨다면, 다시한번 트리거를 해봐야죠?
트리거가 될 구성요소의 값을 변경해서(불쾌지수 79 -> 80) for 시간만큼 유지해 주세요.
완료 되었다면, 오토메이션 디버깅(추적 표시하기) 로 가서 상태를 살펴봅시다.
![](https://blog.kakaocdn.net/dn/c8v689/btrqQd69UmX/9dk5ZL6lJP0x3RT4vgKyrk/img.png)
내용은 다르지만, 기본적인 절차는 같으니 한번 같이 살펴봅시다.
추적 표시하기 항목에 들어가면, 좌측과 같은 트리구조를 볼 수 있는데요
맨 위에 있는 별 표시가 트리거 입니다. 이 자동화는 트리거 개수가 2개네요.
그 아래 있는 A/B 라는 표시가, 바로 컨디션 체크 항목 입니다.
노란선이 해당 자동화가 트리거되어 진행된 경로를 나타내는데요,
이 자동화는 2번째 트리거 조건을 만족해서 시작되었고, 첫번째 컨디션 체크 항목을 만족하지 못해 X로 빠지면서 끝났네요.
해당 컨디션을 선택해 보면, 우측에 Result 항목이 나오는데 false로 나옵니다.
wanted_state, 즉 컨디션을 통과하기 위한 목적 값이 on 인데, 해당 entity_id의 state 값은 off이기 때문에
false를 반환하면서 컨디션을 만족하지 못한 상황입니다.
만약 여기서 switch.jageunbang_top 이라는 엔티티의 state 값이 on 이라면, 컨디션을 만족해서 다음으로 넘어가겠죠.
그런데 트리를 보시면 A/B가 또 있죠?
맞습니다. 이 자동화는 컨디션이 3개가 들어가 있어요.
그래서, 위에서 부터 차례차례 3개의 컨디션을 모두 만족해야, 비로소 그 아래쪽에 있는 > 표시, 액션 단계로 넘어갑니다.
이런 동작구조를 가지기 때문에, 컨디션은 and 값이 기본입니다.
만약 컨디션 체크 부분에 or을 넣은 경우는 어떻게 나오나요?
![](https://blog.kakaocdn.net/dn/boWep3/btrqNfYVHqY/JFh5yIZBYWBVX1JFV9Ok7k/img.png)
컨디션이 or이라면, 해당 컨디션 아래쪽이 걸 conditions/0 , conditions/1 이런식으로 구분해서
이중 하나라도 true 값으로 반환되면 컨디션 체크가 완료되어 다음단계로 넘어갑니다.
위 자동화도 트리구조만 보면 눈에 딱 들어오죠?
트리거가 4개이고, 컨디션이 2개 들어가 있고, 액션은 1개인 자동화네요.
첫번째 트리거를 만족해서 첫번째 컨디션은 통화했는데, 두번째 컨디션 체크에서 실패해서 자동화 동작을 멈췄습니다.
이렇게 컨디션까지 체크해서 액션까지 넘어가는게 확인되었다면, 위에서 짧게 설정했던 for 부분을
다시 원래 원하는 값으로 설정해 주고 끝내시면 됩니다.
마지막에 액션도 마찬가지의 과정을 거치는데, 오토메이션 디버깅 툴을 이용하면 어디에서 걸렸는지 잘 보이기 때문에 찾기 쉬우실거예요.
디버깅 관련은 동일한 내용의 반복이고, 액션의 진행과정에 대한건
자동화 보다는 스크립트쪽에 가까운거라 다음에 다시 다루도록 하겠습니다!
그런데...이게 과연 끝일까요...?
트리거가 불쾌지수 79.5 초과 30분 유지 인데, 이때 컨디션을 하나라도 만족하지 못한 상태로 계속 불쾌지수가 상승한다면..?
가령 불쾌지수가 79 -> 80 으로 변경된지 29분 지났는데, 편의점에 가려고 폰을들고 잠깐 나갔어요.
그러면 컨디션 체크에서 false가 뜨고, 자동화는 동작되지 않겠죠? 그런데 불쾌지수는 80을 넘은상태이고..
이러면 다시 컨디션 조건을 만족할때 까지 자동화는 동작되지 않습니다.
자동화를 구성하려면, 생각보다 고려해야할 사항이 많습니다.
하지만 그걸 커버해서 생활패턴에 맞는 자동화를 구성하기위해 노력하는걸 추천드립니다.
자동화에 몸을 맞출수도 있지만, 그래도 몸에 자동화를 맞추는게 더 있어보이지 않나요...?
자 오늘 내용은 여기까지!
쓰다보니 스압주의네요......제목에 달아놔야지 ㅠ.ㅜ
잘 해결되시길 바래봅니다~
'SmartHome. IoT > SmartHome 응용' 카테고리의 다른 글
[HA] 3D Floor Plan 적용하기 #4_영역 토글 (0) | 2022.03.10 |
---|---|
[HA] 3D Floor Plan 적용하기 #3_HA 적용 (0) | 2022.03.10 |
[HA] 3D Floor Plan 적용하기 #2_조명, 렌더링 (0) | 2022.01.26 |
[HA] 3D Floor Plan 적용하기 #1_집 그리기 (0) | 2022.01.26 |
HomeAssistant를 구글홈에 연결하기 (0) | 2022.01.15 |