홈파이: 텔레그램으로 제어하는 홈 오토메이션 (프로토콜)
텔레그램으로 제어하는 홈 오토메이션 프로젝트 – 홈파이
- 홈파이: 텔레그램 메신저로 제어하는 홈 오토메이션 프로젝트
- 홈파이 : 라즈베리 파이에 설치하는 방법
- 홈파이 : 예제 센서 장치 만드는 방법
- 홈파이 : 동작 시나리오와 프로토콜
- 홈파이 : 명령어 리스트
- 홈파이 : 일회용 컵을 재활용한 스마트 화분 연동하기
.
라즈베리파이에 홈파이(HomePy)를 설치하고 동작시키면 이후부터 주변의 센서 장치들과 무선통신을 통해 상호작용을 합니다. 센서 장치가 보내주는 데이터를 받아 기록해두기도하고, 특정 장치로 제어 신호를 보낼 수도 있습니다. 이렇게 동작하기 위해서는 센서 장치가 홈파이에서 정의한대로 동작하도록 제작되어야 합니다. 이렇게 홈파이가 정의한 세부 스펙들을 담고 있는 것이 홈파이 프로토콜입니다.
.
홈파이 서버 – 센서 장치 연동 시나리오
홈파이는 아래 시나리오를 기본으로 동작하도록 설계되어 있습니다.
- 센서 장치가 자신의 존재를 알리는 등록(Registration) 커맨드 보냅니다. 이 커맨드는 센서의 종류와 ID를 표시하는 category1, category2, ID 값을 포함하고 있으며, 센서 장치가 처리할 수 있는 제어 신호가 어떤게 있는지도 함께 기재합니다. (Registration 단계)
- 홈파이 서버가 등록 커맨드를 받으면 기기 정보를 저장합니다. 등록 커맨드에 기재된 category1, category2, ID 값은 유일해야하며 이를 통해 센서 장치들을 구분합니다.
- 홈파이 서버는 등록이 끝나면 이에 대한 응답 신호를 보내줍니다.
- 이후 센서 장치는 임의의 주기로 센서 측정값을 보내줍니다. 센서 측정값은 2byte 정수형 값이어야하며 최대 4개까지 보낼 수 있습니다. (Update 단계)
- 홈파이 서버는 업데이트 커맨드를 받으면 센서 데이터를 뽑아 DB에 저장해 둡니다. 만약 사용자가 미리 알림 설정을 해뒀다면 센서 데이터가 조건에 맞는지 검사하고, 조건에 맞을 경우 메시지로 사용자에게 알려줍니다. 그 외에는 DB에 저장만 해둡니다.
- 홈파이 서버는 업데이트 커맨드에 대해서는 별도의 응답 신호를 보내지 않습니다.
- 사용자가 특정한 제어 신호를 보낼 경우 홈파이 서버는 제어(Control) 커맨드를 무선으로 전송합니다. 제어 커맨드는 Registration 단계에서 센서 장치가 미리 알려줬던 제어 신호의 종류를 참고해서 만들어야 합니다. 하지만 실제 전송되는 제어 신호의 값이 정확한지는 체크하지 않습니다. 최대 4개의 2byte 정수형 값을 보낼 수 있습니다. (Control 단계)
- 센서 장치는 제어 신호를 받아 그에 맞는 동작을 수행합니다. 제어 신호의 값이 센서 장치가 처리할 수 있는 값이 아닌 경우, 이 제어 신호는 무시됩니다.
- 센서 장치는 제어 신호를 처리한 뒤 그 결과를 응답해줍니다. 응답할 때 처리 결과값을 4개의 2byte 정수형 값으로 보내줄 수 있습니다. 받았던 제어 신호의 값을 그대로 보내줌으로써 제대로 처리되었음을 알려줄 수 있습니다.
- 홈파이 서버는 센서 장치의 동작 유무를 확인하기 위해 핑(Ping) 커맨드를 전송합니다. 데이터 값을 추가로 실어 보내지는 않습니다. (Ping 단계)
- 센서 장치는 핑 커맨드가 감지되면 즉시 응답 커맨드를 보내야 합니다.
홈파이 서버는 주변에 존재하는 N개의 센서 장치와 위와 같은 시나리오대로 데이터를 주고 받습니다. 이 시나리오를 구현하기 위해 필요한 무선 전송 패킷의 형태와 각 필드의 정의는 아래와 같습니다.
.
데이터 패킷 정의
홈파이 프로토콜의 기본은 홈파이 서버(라즈베리파이)와 센서 장치가 무선으로 주고받는 패킷 데이터입니다. 패킷 데이터는 홈파이 서버에서 센서 장치로 전송되는 outgoing packet 과 센서 장치에서 홈파이 서버로 보내주는 incoming packet으로 나뉩니다. 두 종류의 패킷 모두 15byte 의 고정된 길이를 가집니다.
Outgoing packet
홈파이 서버에서 센서 장치로 보내는 패킷은 15byte 길이이며 아래와 같이 구성됩니다.
Outgoing packet | ||||
1 | 0x78 | start byte 1 | fixed | |
2 | 0xfe | start byte 2 | fixed | |
3 | 0x00 | category 1 | ||
4 | 0x00 | category 2 | ||
5 | 0x00 | ID | ||
6 | 0x00 | command | ||
7 | 0x00 | Data1 (integer) |
Data1 (float) |
Control 1 |
8 | 0x00 | |||
9 | 0x00 | Data2 (integer) |
Control 2 | |
10 | 0x00 | |||
11 | 0x00 | Data3 (integer) |
Data2 (float) |
Control 3 |
12 | 0x00 | |||
13 | 0x00 | Data4 (integer) |
Control 4 | |
14 | 0x00 | |||
15 | 0xff | end byte | fixed |
- 1, 2번 패킷은 패킷의 시작을 알리는 값(0x78, 0xfe)으로 채워집니다.
- 3번 패킷은 대상이 되는 장치의 category1 값을 담습니다.
- 4번 패킷은 category2 값입니다.
- 5번 패킷은 대상이 되는 장치의 ID 값입니다. 3-4-5번 패킷으로 대상이 되는 장치를 유일하게 구분합니다. 패킷 데이터는 주변의 모든 센서 장치가 수신할 수 있으므로 자신의 category1, category2, ID 값과 일치하는 경우만 명령을 수행해야 합니다. category1, category2, ID 값은 센서 장치가 정의해서 등록(Registration) 단계에 홈파이 서버에 알려줍니다.
- 6번 패킷은 현재 패킷을 보내는 목적(커맨드)입니다. 핑 체크, 등록, 업데이트 요청, 제어 신호 전송 등의 커맨드가 지정될 수 있으며 센서 장치는 여기에 맞게 동작해야 합니다. 각 커맨드는 값이 이미 정의되어 있습니다. 아래 표를 참고하세요.
- 7-8, 9-10, 11-12, 13-14 번 패킷은 데이터를 전달해야 할 경우 사용되는 2byte 정수형 데이터를 담습니다. 제어 신호를 보낼 때 4개의 제어 신호의 값이 여기에 저장되어 전송됩니다. (현재 4byte 실수형은 지원되지 않으므로 무시하세요.)
- 15번 패킷은 패킷의 종료를 알리는 값으로 채워집니다.
Outgoing command 의 종류와 코드
Outgoing command | |||
0x01 | Ping request | ||
0x11 | Registration request | ||
0x51 | Request sensor value | ||
0x81 | control signal |
Incoming packet
센서 장치에서 홈파이 서버로 보내는 패킷은 아래와 같이 구성됩니다.
Incoming packet | |||||
1 | 0x55 | start byte 1 | fixed | ||
2 | 0xfe | start byte 2 | fixed | ||
3 | 0x00 | category 1 | |||
4 | 0x00 | category 2 | |||
5 | 0x00 | ID | |||
6 | 0x00 | command | |||
7 | 0x00 | Data1 (integer) |
Data1 (float) |
control signal type | |
8 | 0x00 | data type | |||
9 | 0x00 | Data2 (integer) |
control signal type | ||
10 | 0x00 | data type | |||
11 | 0x00 | Data3 (integer) |
Data2 (float) |
control signal type | |
12 | 0x00 | data type | |||
13 | 0x00 | Data4 (integer) |
control signal type | ||
14 | 0x00 | data type | |||
15 | 0xff | end byte | fixed |
- 1, 2번 패킷은 시작을 알리는 패킷입니다.
- 3-4-5번 패킷은 category1, category2, ID 값을 나타내며 센서 장치를 다른 장치와 구분하는 역할을 합니다. 등록(Registration) 단계에서 이 패킷에 적힌 값은 반드시 유일해야 합니다. 그렇지 않을 경우 다른 장치의 설정의 덮어씁니다. 센서 장치가 패킷을 수실할 때도 반드시 이 값이 일치하는 경우만 처리해야 합니다.
- 6번 패킷은 현재 패킷을 보내는 목적(커맨드)입니다. 핑 응답, 등록, 센서 데이터 업데이트, 제어 신호 처리 결과 등의 커맨드가 지정될 수 있으며 센서 장치는 여기에 맞게 동작해야 합니다. 각 커맨드는 값이 이미 정의되어 있습니다. 아래 표를 참고하세요.
- 7-8, 9-10, 11-12, 13-14 번 패킷은 데이터를 전달해야 할 경우 사용되는 2byte 정수형 데이터를 담습니다. 센서 측정값을 서버에 전송할 때 4개의 2byte 정수형 값이 사용됩니다.
- 등록(Registration) 단계에서는 7~14번 패킷까지 1byte씩 8개의 값으로 나뉘어 사용됩니다. 센서 장치가 처리할 수 있는 제어 신호의 종류(control signal type)와 값의 범위(data type)를 표시하는데 사용됩니다. (현재 4byte 실수형은 지원되지 않으므로 무시하세요.)
- 15번 패킷은 패킷의 종료를 알리는 값으로 채워집니다.
Incoming packet의 종류와 코드
Incoming command | |||
0x01 | Ping response | ||
0x11 | Register device | ||
0x51 | Update sensor value | ||
0x81 | control signal result |
.
Device ID 와 Category
홈파이 프로토콜에서는 센서 장치들이 다른 장치들과 구분될 수 있도록 category1, category2, ID 값을 사용합니다.
category1, category2 값은 센서의 종류를 표현하는 값으로 미리 센서 장치의 종류에 따라 가질 수 있는 코드들을 정의해 뒀습니다. 자신이 만든 형태와 가장 유사한 값을 선택하면 홈파이 서버에서 지정된 이름으로 표시가 됩니다. 지정되지 않은 값을 사용할 경우 홈파이 서버에서는 “사용자정의” 장치로 표시됩니다. 센서 장치 제작자가 0x01 ~ 0xf0 의 값 중 임의로 선택할 수 있습니다. 선택 가능한 코드는 아래 링크에서 배포되는 HomePy_protocol_v0.5.xlsx 프로토콜 스펙 파일을 참고하세요.
https://github.com/godstale/HomePy
ID 값은 같은 분류(category)를 가진 장치들끼리 서로 구분될 수 있도록 지정하는 구분자입니다. 이 값은 0x01 ~ 0xf0 의 값 중 임의로 선택할 수 있습니다. 하지만 센서 장치가 위치하고 있는 장소를 표현하고 싶은 경우 미리 정의된 값의 범위에 맞게 사용하세요.
Device ID – Location matching | |||
0 | 0x00 | Not defined | |
~ | user defined | ||
99 | 0x7f | user defined | |
100 | 0x64 | hall | 거실 |
~ | |||
110 | 0x6e | bedroom | 침실 |
~ | |||
120 | 0x78 | room1 | 방1 |
~ | |||
130 | 0x82 | room2 | 방2 |
~ | |||
140 | 0x8c | room3 | 방3 |
~ | |||
150 | 0x96 | room4 | 방4 |
~ | |||
160 | 0xa0 | bathroom | 욕실 |
~ | |||
170 | 0xaa | kitchen | 주방 |
~ | |||
180 | 0xb4 | study room | 서재 |
~ | |||
190 | 0xbe | door | 현관 |
~ | |||
200 | 0xc8 | balcony | 베란다 |
~ | |||
210 | 0xd2 | store room | 창고 |
~ | |||
220 | 0xdc | outdoor | 야외 |
~ |
홈파이 프로토콜이 정의한 값의 범위에 해당되는 ID인 경우 홈파이 서버가 해당되는 장소의 이름을 함께 표시해줍니다. 그렇지 않은 경우는 “미지정” 위치로 표시됩니다.
.
Control signal
사용자가 센서 장치를 제어하기 위해 제어 신호(Control signal)를 사용합니다. 모든 장치는 등록(Registration) 단계에서 자신이 처리할 수 있는 제어 신호를 7~14번 패킷에 기록해서 보내야 합니다.
7 | 0x00 | control signal type 1 |
8 | 0x00 | data type 1 |
9 | 0x00 | control signal type 2 |
10 | 0x00 | data type 2 |
11 | 0x00 | control signal type 3 |
12 | 0x00 | data type 3 |
13 | 0x00 | control signal type 4 |
14 | 0x00 | data type 4 |
이 값들이 정확히 인식되면 홈파이에서는 사용자에게 사용가능한 제어 신호의 종류(control signal type)와 값의 범위(data type)를 보여줍니다. 사용자는 이 정보를 참고해서 제어 신호를 센서 장치에 보낼 수 있습니다.
제어 신호의 종류(control signal type)와 값의 범위(data type)는 홈파이 프로토콜에서 미리 정의하고 있으므로 장치의 특성에 맞게 선택해서 사용하면 됩니다. 해당되는 장치가 없는 경우 사용자정의(user defined) 장치에 해당되는 값을 넣어주면 됩니다. 상세한 코드는 아래 링크에서 배포되는 HomePy_protocol_v0.5.xlsx 프로토콜 스펙 파일을 참고하세요.
https://github.com/godstale/HomePy
홈파이에서 제어 신호를 보낼 때는 7~14번 패킷을 2byte 씩 사용해서 data1~data4 까지 총 4개의 정수형 값을 보내줍니다. 센서 장치는 제어 신호에 맞게 동작한 뒤 결과를 홈파이 서버로 보내줘야 합니다.
.
예제코드
실제 센서 장치를 만들 때 참고할 수 있도록 예제 코드를 배포하고 있습니다. 아래 링크에서 [온습도 예제 장치]를 만드는 방법을 설명합니다. 여기서 제공하는 예제코드에 등록, 업데이트, 제어 신호 처리, 핑 등 전 과정을 처리할 수 있도록 코드가 들어가 있습니다. 제작하고자 하는 장치에 맞게 수정해서 사용하시면 됩니다.
https://www.hardcopyworld.com/?p=2241
.
.