저는 st 앱 내에서의 자동화는 잘 쓰지 않고 있고 거의 웹 코어에서 자동화를 만들어서 사용합니다.
자동화 목록이 많아지면 확인도 쉽지 않고 단순히 on / off 처리가 아닌 약간이라도 복잡한 동작을 처리하려고 하다보니 웹 코어로만 자동화를 작성중인데, 이게 하다보니 같은 내용을 단순화 하여 테스트를 해보면 잘 작동을 함에도 불구하고 실 사용에 들어가다 보면 작동이 제대로 되지 않는다던지 하는 경우가 많았습니다.
차라리 아예 작동을 하지 않으면 포기라도 할텐데 됐다 안됐다 하니 조금 짜증도 나고.. ㅜㅜ
그렇게 스트레스를 받는 나날을 보내다 계속 만져보면서 이것도 변경해보고 저것도 변경해가며 테스트 해보고, 해외 웹코어 커뮤니티 질문 답변도 보다보니 아직 개인적으로 만족스러울 정도까진 아니지만 사용할 만큼은 된것 같습니다.
1. 피스톤의 기본 옵션
피스톤을 작성하다보면 디폴트 설정으로 감춰져 있는 부분이라 설정하는 방법을 따로 알고 있지 않았을 땐 이런게 있는지도 몰랐던 부분입니다.

피스톤 가장 상단에 보면 피스톤의 이름이 적혀져 있는 부분이 있습니다. 그 부분을 클릭하면 피스톤의 기본 설정을 건드릴 수 있는 항목들이 나오는데

톱니 바퀴 버튼을 눌러 세부 항목들이 보여지게 해줘야 합니다.
각 항목이 어떤 옵션이냐 하면
[Automatic piston state]
- Enabled 로 되어있으면 피스톤의 상태를 자동으로 변경한다는 설정입니다.
피스톤이 실행되어 if 블록을 만났을 때 이것이 참이면 true 로 설정이 되고 거짓이면 false 로 설정이 되게됩니다.

위 이미지를 보면 3개의 피스톤은 false 로 표기가 되어있지만 한개의 피스톤은 "공기청정기 꺼짐" 이라는 텍스트가 적혀 있습니다. 이 옵션을 disable 시키고 set piston state 명령으로 피스톤의 상태값을 변경한 예제입니다.
이 내용은 공식 wiki에 구체적인 설명이 되어있습니다. 웹코어 대쉬보드를 꾸밀때 종종 사용하게 될 옵션입니다.
[Piston execution parallelism]
- 피스톤 실행을 병렬화 하는 옵션입니다.
A라는 피스톤이 있다고 했을때, A 라는 피스톤이 실행중인 상태에서 A가 또 실행되는 상황이 발생하였을때 먼저 실행된 A가 종료할때까지 대기하였다가 실행을 하느냐, 기다리지 않고 바로 실행하느냐입니다.
피스톤에서 if문 구문에서 동기(Syncronous)/비동기(Asyncronous) 옵션이 있는데 이와 비슷하게 피스톤 자체에 대해서 비동기 실행을 지원해주는 옵션입니다.
옵션을 건드리지 않으면 기본 설정이 Default 로 되어있어서 이전에 실행된게 끝날때까지 기다리고 다시 실행하게 됩니다.
이해하기 쉽게 예제로 예를 들어보겠습니다.

스위치A 가 켜지면 스위치B를 켠 후 0부터 200까지 로그를 출력하도록 피스톤을 작성했습니다. parallelism 을 Disable로 두고 실행하면 아래와 같은 결과가 출력됩니다.

200까지 로그를 다 출력한 후 스위치B의 changes to on 의 트리거가 작동해서 실행되어야 하는데 10017ms(대략 10초) 동안 지연 되었다는 경고가 나오고 여기서 끝이 납니다.
( 10초 내에 피스톤이 실행되지 못하면 취소가 되고, 실행중인 피스톤도 20초 이내로 완료되지 못하면 중단된다고 합니다. )
parallelism 을 enabled 시켜놓고 스위치A 를 켜보면 아래와 같은 결과를 볼 수가 있습니다.
스위치B의 트리거가 먼저 실행되고 스위치A 트리거의 나머지 부분을 처리를 했습니다.

즉, 피스톤을 대기 없이 실행할 수 있지만 순서 제어는 할 수가 없습니다. 그림으로 보면 다음과 같은 차이입니다.

그림은 위처럼 그려놨는데, 스위치A 에 의해서 실행된게 먼저 종료될지 스위치B에 의해서 실행된게 먼저 종료될지 알수가 없습니다.
그리고 위의 예제에서 A와 B의 트리거를 다른 피스톤으로 분리하게 되면 parallelism을 enabled 시킨것과 같습니다.
저는 처음 피스톤 작성하면서, 빈번한 호출로 인해서 대기상황에 빠지게 되고 실행이 중단되어 제대로 작동하지 않는걸 겪고 나서는 피스톤 1개에 무조건 트리거 1개만 걸고 사용 했었습니다. ㅠㅠ

이렇게, 공기청정기를 자동으로 제어한다고 피스톤을 6개나 만들어서 사용을 했는데 이럴경우 피스톤간에 변수를 공유해야 할 경우 무조건 전역 변수를 사용해야 한다는 부분이 매우 불편했습니다.
트리거간의 실행 순서가 중요하지 않은 피스톤에서 노란색 semaphore 경고가 자주 뜨는게 보기가 싫다면 그냥 이 옵션을 활성화 시키는걸 추천합니다!!
[Command optimizations]
최적화 관련 옵션인데, 예를 들어 스위치A가 off 일때 스위치A turn off 명령을 만나면 실행하지 않고 넘어갑니다.
가장 최근에 이 옵션을 사용했던 사례로는 브릿지 허브를 현재 사용중이고, 최근에 st와 공식 연동이 되면서 st에 연동을 시켜 놓은 상태입니다. 그런데 아직은 물리 버튼으로 조작시 상태 반영이 되지 않고 있죠.
현관에 거실등 일괄 소등 버튼을 달았는데, 전등 스위치를 음성으로 켤때도 있고, 물리버튼을 눌러 켜고 끌때도 있고 해서 상태가 뒤죽박죽입니다.
전등A 가 실제로는 켜져 있지만 st 에서는 꺼져 있는 상태일 경우 turn off 명령을 내려도 꺼지지가 않습니다.
이때 이 옵션을 Disabled 시켜놓으면 기기의 상태가 어떻든 무조건 명령을 내리게 됩니다.
[Condition traversal optimizations]
조건 최적화와 관련된 부분인데 if문 검사시에 and 나 or로 여러조건을 검사할 경우 첫번째 조건이 fasle 이고 and 일 경우 그 뒤의 조건문은 패스한다 입니다. 더이상 체크를 할 필요가 없기 때문이죠
반대로 첫번째 조건이 true 이고 or 로 묶여있을 경우도 패스를 한다 입니다.
이 옵션은 disabled 시켜 사용할 일이 있을까 싶네요
[Event subscriptions]
피스톤에서 번개 표시가 되어있는 트리거 지점들을 켜고 끌 수 있는 옵션입니다. 피스톤 내에서 각각의 Action 구문에서도 설정할 수 있는 옵션이 있는데, 요건 피스톤 전체에 적용이 됩니다.
[Allow pre-scheduled tasks to execute during restrictions]
피스톤 실행이 지연되었다 실행이 될때, 조건문 판별을 어떻게 할 것이냐에 대한 옵션으로 파악됩니다. (테스트 해보는것도 쉽지 않고 웹 서칭으로 파악한 내용이라서 정확하지 않을수가 있습니다.)
온도가 30도 이상으로 올라가면 선풍기를 켜라 라는 피스톤이 있는데 이게 실행이 지연이 되었고, 대기 후에 실행을 하려고 하는 시점에서 온도가 30도 이하일 경우 어떻게 할 것인가? 입니다.
기본값인 Disabled 면 실행되는 현재 시점의 조건을 검사, Enabled 면 피스톤이 발동 된 시점의 조건으로 검사 입니다.
[Command execution delay]
옵션 명칭만 보면 바로 실행하지 않고 지정 시간 동안 대기 후에 실행한다 입니다
일반적인 상황에선 쓸 일이 없어 보이긴 합니다만 제대로 작동이 되면 사용할 부분은 있을것 같은데, 제대로 작동하지 않는것 같네요, 설정을 해도 바로바로 실행을 하고, 최대 5000ms (5초) 이상은 설정이 되지도 않습니다.
이건 검색해봐도 정보가 별로 없네요..
2. IF와 ACTION 구문 옵션

IF 구문의 옵션을 열어보면 위와 같은 4개의 옵션이 보여지게 됩니다. 그리고 ACTION 구문의 옵션을 열어보면

위의 옵션이 하나 더 존재합니다.
이쪽은 그래도 피스톤 기본 옵션과는 다르게 설명이 친절히 설명이 되어 있습니다.
[Task Execution Policy]
if 구문이 언제 실행 될 것인지 조절한다고 되어있습니다. 친절히 예시도 들어놨네요,
기본값이 아닌 Execute tasks on condition state change only 를 선택하면
온도계에 30도 이상일때 실행하는걸 트리거로 걸었을 경우 30도 이하에서 30도 이상이 될 때만 실행을 시킬수가 있다고 되어있습니다. ( 기본설정으로는 온도가 변할 때 마다 피스톤이 실행이 됩니다. 스위치같은 경우도 changes to on 트리거만 작성되어있다고 해도 on / off 모두 피스톤이 실행이 됩니다. )
온도계로 테스트를 해보진 않았는데 이와 같은 설명이면 스위치의 경우도 changes to on 트리거가 있을때 이 옵션을 바꿔놓으면 off 때는 피스톤이 실행되지 않고 on 될때만 실행이 되어야 하는데
막상 해보면 on / off 때 모두 피스톤은 실행이 되고 트리거가 걸려있는 if문 자체를 실행하지 않고 있습니다.
모션센서로 해봐도 마찬가지구요, 제가 잘못 이해하고 사용한건지, 버그인지는 모르겠지만 지금으로썬 사용을 할수가 없네요 ㅠㅠ
제대로 작동만 할 수 있다면 피스톤의 실행 횟수를 줄이는데 도움이 될것으로 보입니다.
[Task Cancellation Policy]
해외 커뮤니티에선 TCP 라고 줄여서 명칭하더군요, 작업을 언제 어떻게 취소할 것인가에 대한 옵션입니다. 이 옵션은 if 구문이 아닌 action 구문에도 있는데 기본값으로는 Cancel tasks on conditions state change 로 되어있는데, 예를 한번 들어보겠습니다.

스위치A 가 켜지면 1분간 대기를 시켜놓았지만 1분간 대기 하는 도중 스위치B로 인해서 피스톤이 재 실행되면 Wait 가 취소가 되고 피스톤이 종료가 됩니다.

Location 액션 구분에서 View 화면에선 N 아이콘이 보이지 않아 편집 화면을 붙여넣었습니다
never cancel task 로 하면 스위치A가 켜지고 스위치B가 켜져도 취소되지 않고 마저 실행을 합니다

그리고 다른 옵션들은
Cancel tasks on piston state change
-> 피스톤 상태가 변하면 작업을 취소
Cancel task on condition or piston state change
-> 조건 또는 피스톤 상태가 변하면 작업을 취소
입니다.
주로 Never cancel tasks 로 변경해서 사용할 경우가 많아보이고, 그 외에 옵션은 상황에 맞게 사용하면 될 것으로 보입니다.
※ 앞서 설명한 피스톤 옵션인 parallelism 을 enabled 시켜주면 피스톤이 병렬로 실행이 되니까 취소 옵션을 지정해주지 않아도 취소되지 않을거라고 생각을 했는데 막상 해보면 취소가 됩니다.
[Executioin Method]
이 옵션에 대한 설명은 예제로 첨부합니다.
Synchronous -> 동기 방식으로 실행

스위치A 트리거를 모두 실행한 후 마지막인 "피스톤 종료" 로그를 남겼습니다.
Asynchronous -> 비동기 방식으로 실행

스위치 A 트리거의 종료를 기다리지 않고 끝까지 진행되었습니다. 그 후 30초 대기가 모두 끝나고 이어서 남은 구문을 실행합니다.

[Disable statement]
아래 이미지처럼 작성한 부분을 완전 삭제하지 않고 작동되지 않게 비활성화 처리를 합니다.

[Task Scheduling Policy]
Wait 등으로 작업을 지연 시킬때의 정책 옵션입니다. 이건 웹 코어 자체의 설명에서 예제를 들어 설명해놔서 그 예제로 대체를 하겠습니다.

위와 같이 여러개의 장치에 대해서 지연 작업을 걸려 있는 피스톤에서 Post 1에 의해서 실행이 되고, 5초 이내로 Post 2에 의해서 실행이 되었을때
기본 옵션인 Override any existing scheduled tasks 로 되어있으면 먼저 대기가 걸렸던 Post 1 에 대한 대기는 취소가 되고 Post 2에 대한 대기로 덮어지게 됩니다.
Allow multiple scheduled tasks 로 선택을 하게 되면 Post 1 이 취소되지 않고 모두 작동하게 됩니다.

테스트 해보니 설명대로 작동을 잘 합니다.
3. 피스톤 최적화
- 로그 on/off 간단히 하기
이건 전에 게시물로 올렸던 내용이기도 해서 링크로 대체하겠습니다
https://cafe.naver.com/stsmarthome/35183
- 트리거가 아닌 조건식에 and 와 or 이 여러개 들어가게 될때 expression 사용
if 여러 조건으로 체크를 하게 될 경우가 생기는데 각각을 조건을 마우스 클릭을 통해서 작성하게 되면 피스톤의 길이가 하나하나 늘어날때마다 길어지게 되는데 이게 하다보면 계속 길어지는 경우가 생깁니다.
이럴때 expression 으로 대체를 하면 피스톤의 길이를 많이 줄일수 있습니다.

밑에서 설명할 전등 자동화의 한 부분인데요
변수값 체크에, 스위치는 켜져 있는지 꺼져 있는지, 그리고 도어센서는 열려 있는지 닫겨 있는지
이걸 일반적인 방법으로 작성하게 되면

이렇게 5줄이 생성되게 됩니다. expression 으로 작성을 해주면 피스톤의 길이를 많이 줄일수가 있게 됩니다.
단, expression 으로 작성을 할때 각 조건을 ( ) 로 묶어주어야 합니다. 공식 wiki에서 봐도 안묶여주고 써도 되어야 하는데 이건 웹코어 버그 같습니다.
'홈IoT' 카테고리의 다른 글
[HomeAssistant] 확장 온습도계 통합구성요소 (0) | 2022.06.21 |
---|---|
HomeAssistant 와 AI 스피커를 이용한 정리 노래 틀기 (0) | 2022.06.21 |
아카라 G2H 카메라허브, 2구 스위치, 2구 버튼 리뷰 (0) | 2022.06.21 |