스마트싱스 모드 커스터마이징 하기

스마트싱스를 처음 세팅하면 귀가모드, 외출모드, 취침모드라고 이름붙은 Routines가 있는데 이걸 이용해서 상황별로 자동실행을 시킬 수 있다.

그런데 각 Routine에는 자동실행조건이 있어서 이를 활용하면 State Machine(상태기계)처럼 세팅할 수 있다.

State Machine으로 설계하게 되면 모든 상태변화에 대해서 반응할 수 있게 된다.

기본설정

스마트싱스에 들어있는 Routines는 사실 유한상태기계에서의 전이(Transition)를 표현하는 것이다.

전이라는 것은 이벤트에 따라 상태(State)가 바뀌는 것을 의미한다.
스마트싱스에서는 이벤트는 센서나 타이머에 의한 자동실행을 의미하고,
상태의 전이는 자동실행시에 ‘상태변경’을 함께 설정한 경우에 해당한다.

상태기계 스마트싱스 상태다이어그램
상태(State) Modes 사각형
이벤트 Routine의 자동실행조건 화살표의 이름
전이 Routine의 상태설정항목 화살표의 방향

스마트싱스앱에서는 이런 용어를 구분없이 쓰다보니 쉽게 이해가 되지 않았다.

용어정리

  • 앱내에서의 Modes 는 State라고 하자.
  • ‘자동실행되는 Routine’은 Event라고 하자.
    • Sensor나 조건 감지시 모드를 자동으로 설정하는 부분이 상태의 전이에 해당한다.

State(Modes)의 도출

우선 자동실행조건에 사용할 조건(센서)를 골라야 한다.

나는 일출,일몰,귀가,외출 조건 4개를 사용할 것이다.
이때 두개의 조건이 on/off의 성격을 띄게(0과 1로 표현되게) 고른다.
그렇게 고를수 없는 것이 들어가면 자동으로는 빠져나오지 못하는 구멍이 생긴다.
일출에는 일몰, 귀가에는 외출, 움직임감지에는 움직임미감지, 특정인물의 귀가에는 특정인물의 외출..

그러면 State는 이 한쌍의 항목들이 겹치지 않게 골고루 넣으면 된다.

  • 일출-귀가
  • 일몰-귀가
  • 일출-외출
  • 일몰-외출

움직임 감지를 추가한다면 아래와 같이 모든 조합을 만든다.

  • 일출-귀가-움직임감지
  • 일몰-귀가-움직임감지
  • 일출-외출-움직임감지
  • 일몰-외출-움직임감지
  • 일출-귀가-움직임미감지
  • 일몰-귀가-움직임미감지
  • 일출-외출-움직임미감지
  • 일몰-외출-움직임미감지

훅 많아졌다. 2쌍이면 2의 제곱, 3쌍이면 2의 3제곱.

Modes의 추가

모드 이름
Home(Day)
Home(Night)
Away(Day)
Away(Night)

https://graph.api.smartthings.com/ 에서 내 Location을 고른후 Modes에 위와 같이 세팅하자.

Event(Routines)의 도출

State Diagram

Event의 on/off별로 조건이 State변화에 맞게 선으로 그으면 된다.

이 경우에는 의미있는 화살표는 총 8개이다. ‘자동으로 실행되는 Routine’을 8개 만들어야 한다는 의미이다.

Event(Routines)의 추가

Routine메뉴에서 아래와 같이 추가하자.

루틴이름 모드설정 자동실행조건 ~일때 자동실행하지 않음
Home(Day)일몰 감지 Home(Night) 일몰후 Home(Day)외 모두 체크
Home(Day)외출 감지 Away(Day) 외출시 Home(Day)외 모두 체크
Home(Night)일출 감지 Home(Day) 일출후 Home(Night)외 모두 체크
Home(Night)외출 감지 Away(Night) 외출시 Home(Night)외 모두 체크
Away(Day)일몰 감지 Away(Night) 일몰후 Away(Day) 외 모두 체크
Away(Day)귀가 감지 Home(Day) 귀가시 Away(Day) 외 모두 체크
Away(Night)일출 감지 Away(Day) 일출후 Away(Night) 외 모두 체크
Away(Night)귀가 감지 Home(Night) 귀가시 Away(Night) 외 모두 체크

이걸 SmartThings 의 Routines에 모두 설정해주면 끝난다.
정말 노가다지만, 빈틈이 없고 각 상태변화에 반응할 수 있게 State와 Event를 구성할 수 있다.

여기에 해당하지 않는 다른 Routine은 모드설정을 꺼주자. 그래야 예상치 못한 흐름을 막을 수 있다.

이제 해진 후에 귀가시 불을 켜고 싶으면, ‘Away(Night)귀가 감지’ 에다가 조명을 켜도록 설정하면 된다.

SmartThings Mode Routine 추출기

말이 쉽지 실제로 해보면 헷갈리기 때문에 python으로 모드 및 루틴추출기를 제작해봤다.

SmartThings 모드 커스터마이징 툴 코드

sensors 부분에 케이스를 늘리거나 줄여주자.

# 비올때를 추가하는 경우
sensors = [('Day','Night'),('Home','Away'),('Rainy','Sunny')]
$ python st_mode_extractor.py
아래 모드를 추가해주세요.
Mode#1 Day_Home
Mode#2 Day_Away
Mode#3 Night_Home
Mode#4 Night_Away

아래 루틴을 추가해주세요.
Routine#1
- 이름 :  Day_Home > Night
- 상태변경 :    Night_Home
- 자동실행 :    Night
- 고급설정 :    자동실행예외에서 Day_Home빼고 전부 체크

Routine#2
- 이름 :  Day_Home > Away
- 상태변경 :    Day_Away
- 자동실행 :    Away
- 고급설정 :    자동실행예외에서 Day_Home빼고 전부 체크

Routine#3
- 이름 :  Day_Away > Night
- 상태변경 :    Night_Away
- 자동실행 :    Night
- 고급설정 :    자동실행예외에서 Day_Away빼고 전부 체크

Routine#4
- 이름 :  Day_Away > Home
- 상태변경 :    Day_Home
- 자동실행 :    Home
- 고급설정 :    자동실행예외에서 Day_Away빼고 전부 체크

Routine#5
- 이름 :  Night_Home > Day
- 상태변경 :    Day_Home
- 자동실행 :    Day
- 고급설정 :    자동실행예외에서 Night_Home빼고 전부 체크

Routine#6
- 이름 :  Night_Home > Away
- 상태변경 :    Night_Away
- 자동실행 :    Away
- 고급설정 :    자동실행예외에서 Night_Home빼고 전부 체크

Routine#7
- 이름 :  Night_Away > Day
- 상태변경 :    Day_Away
- 자동실행 :    Day
- 고급설정 :    자동실행예외에서 Night_Away빼고 전부 체크

Routine#8
- 이름 :  Night_Away > Home
- 상태변경 :    Night_Home
- 자동실행 :    Home
- 고급설정 :    자동실행예외에서 Night_Away빼고 전부 체크


### 아래 내용은 https://www.planttext.com/ 에 붙여넣으면 그림으로 보입니다.

@startuml

state Day_Home
Day_Home --> Night_Home : on Night
Day_Home --> Day_Away : on Away

state Day_Away
Day_Away --> Night_Away : on Night
Day_Away --> Day_Home : on Home

state Night_Home
Night_Home --> Day_Home : on Day
Night_Home --> Night_Away : on Away

state Night_Away
Night_Away --> Day_Away : on Day
Night_Away --> Night_Home : on Home

@enduml
$

그림으로 보고 싶으면 출력결과 하단의 @startuml에서 @enduml까지를 복사해서 https://www.planttext.com/에 붙여넣으면 바로 확인이 가능하다.

아래와 같이 좀 산만하지만 정확하게 그려준다.

2개 옵션

3개 옵션

스마트앱을 이런식으로 하나 만들어 보는 것도 재미있겠다.