Для связи с устройством используется встроенный модуль связи ESP8266 модель ESP-07. Для обмена данных используется порт 8888 и сетевой протокол передачи данных UDP. Для обменом информации между устройством и клиентом пользователя используется внутренний протокол устройства основанный на JSON:
Устройство связи принимает команды трех типов: GET, POST, INFO:
Команды типа GET позволяют делать запрос на получения данных от устройства.
Синтаксис команд: все команды отправляются только в строчном виде. В устройстве присутствует внутренний валидатор запросов, однако проверки на валидность параметров не предусмотрено, и вся валидация параметров должна происходить на стороне клиента, поэтому при разработке необходимо учитывать этот момент. Так как использование не валидных параметров может вызвать неоднозначную работу устройства.
Формат команд GET:
{"status":"get","message":"device"}
status - тип отправляемой команды: GET, POST, INFO
message - команда устройству:
- dev - информация об устройстве.
- c_s - информация об состоянии каналов устройства
- td_s - информация о ежедневных таймерах устройства
- th_s - информация о ежечасных таймерах устройства
- ts_s - информация о секундных таймерах устройства
- te_s - информация о температурных настройках устройства
- t_sen - информация о температурных датчиках устройства
data - дополнительный параметр для передачи параметров запроса, в запросе типа GET не используется.
На каждый запрос GET устройство шлет ответ в виде своего внутреннего JSON. Такие запросы и примеры таких ответов представлены ниже:
Информация об устройстве:
- Запрос:
{ "status": "get", "message": "dev" }
- Ответ:
{ "status": "success", "message": "dev", "data": { "ver": "AQ_CH08W", "m_t": 10, "m_t_se": 4, "min_t": 1600, "max_t": 3500 } }
- "ver": "AQ_CH08W" - версия устройства
- "m_t": 8 - максимальное количество таймеров (ежедневных, ежечасных, секундных)
- "m_t_se": 4 - максимально возможное количество подключенных температурных датчиков
- "min_t": 1600 - порог минимальной температуры
- "max_t": 3500 - порог максимальной температуры
Информация об состоянии каналов устройства:
- Запрос:
{ "status": "get", "message": "c_s" }
- Ответ:
{ "status": "success", "message": "c_s", "data": { "cl": [2, 1, 1, 1, 1, 1, 1, 1], "c_t": [2, 3, 3, 3, 3, 3, 3, 3] } }
- "cl": [2, 2, 1, 1, 1, 1, 1, 1] - состояние канала (1 - off, 2 - on, 3-daily, 4-hour, 5-sec, 6-temp)
- "c_t": [3, 2, 1, 1, 1, 1, 1, 1] - настройки канала (1 - off, 2 - on, 3 - auto)
Информация о ежедневных таймерах устройства:
- Запрос:
{ "status": "get", "message": "td_s" }
-
Ответ:
{ "status": "success", "message": "td_s", "data": { "dt_h_s": [0, 12, 12, 0, 0, 0, 0, 0, 0, 0], "dt_h_end": [0, 20, 21, 0, 0, 0, 0, 0, 0, 0], "dt_m_s": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "dt_m_e": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "dt_s": [0, 1, 1, 0, 0, 0, 0, 0, 0, 0], "dt_c": [0, 1, 2, 0, 0, 0, 0, 0, 0, 0] } }
- "dt_h_s": [0, 0, 0, 0, 0, 0, 0, 0] - час включения таймера (0...23)
- "dt_h_end": [0, 0, 0, 0, 0, 0, 0, 0] - час выключения таймера (0...23)
- "dt_m_s": [0, 0, 0, 0, 0, 0, 0, 0] - минута включения таймера (0...59)
- "dt_m_e": [0, 0, 0, 0, 0, 0, 0, 0] - минута выключения таймера (0...59)
- "dt_s": [0, 0, 0, 0, 0, 0, 0, 0] - состояние таймера (0 - off, 1 - on)
- "dt_c": [0, 0, 0, 0, 0, 0, 0, 0] - канал управляемый таймером (0...max_canal)
Информация о ежечасных таймерах устройства:
- Запрос:
{ "status": "get", "message": "th_s" }
-
Ответ:
{ "status": "success", "message": "th_s", "data": { "ht_m_st": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "ht_m_sp": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "ht_s": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "ht_c": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] } }
- "ht_m_st": [0, 0, 0, 0, 0, 0, 0, 0] - минута включения таймера (0...59)
- "ht_m_sp": [0, 0, 0, 0, 0, 0, 0, 0] - минута выключения таймера (0...59)
- "ht_s": [0, 0, 0, 0, 0, 0, 0, 0] - состояние таймера (0 - off, 1 - on)
- "ht_c": [0, 0, 0, 0, 0, 0, 0, 0] - канал управляемый таймером (0...max_canal)
Информация о секундных таймерах устройства:
- Запрос:
{ "status": "get", "message": "ts_s" }
-
Ответ:
{ "status": "success", "message": "ts_s", "data": { "st_h_s": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "st_m_s": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "st_d": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "st_s": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "st_c": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] } }
- "st_h_s: [0, 0, 0, 0, 0, 0, 0, 0] - час включения таймера (0...23)
- "st_m_s": [0, 0, 0, 0, 0, 0, 0, 0] - минута включения таймера (0...59)
- "st_d": [0, 0, 0, 0, 0, 0, 0, 0] - длительность работы таймера в секундах (0...255)
- "st_s": [0, 0, 0, 0, 0, 0, 0, 0] - состояние таймера (0 - off, 1 - on)
- "st_c": [0, 0, 0, 0, 0, 0, 0, 0] - канал управляемый таймером (0...max_canal)
Информация о температурных настройках устройства:
- Запрос:
-
{ "status": "get", "message": "te_s" }
-
Ответ:
-
{ "status": "success", "message": "te_s", "data": { "tt_s": [0, 0, 0, 0], "tt_m_s": [0, 0, 0, 0], "tt_m_e": [76, 76, 76, 76], "tt_c": [1, 0, 0, 0] } }
- "tt_s": [1, 0, 0, 0,] - состояние температурного таймера
- "tt_m_s": [0, 0, 0, 0] - температура включения канала (min_temp...max_temp, кратна 50)
- "tt_m_e": [76, 76, 0, 0] - температура выключения канала (min_temp...max_temp кратна 50)
- "tt_c": [1, 0, 0, 0] - канала управляемый таймером (0...max_canal)
Информация о температурных датчиках устройства:
- Запрос:
-
{ "status": "get", "message": "t_se" }
Ответ:
{ "status": "success", "message": "t_sen", "data": { "t_se": [4, 3, 0, 0] } }
- "t_se": [4, 3, 0, 0] - температура датчиков (min_temp...max_temp)
Формат команд POST
Команды POST отличаются от команд GET только тем что в запросе необходимо в поле data указывать параметры запроса и поле status содержит параметр post. Формат данных для поля data аналогичен данным приходящим от устройства при запросе командой GET.
Примеры возможных запросов:
Изменение состояния каналов устройства:
- Запрос:
{
"status": "post",
"message": "c_s",
"data": {
"c_t": [1, 0, 0, 0, 0, 0, 0, 0]
}
}
Обратите внимание для изменения настроек каналов, отправлять нужно только параметр c_t, параметр cl не предназначен для изменения, он отвечает только за текущее состояние канала в зависимости от настроек таймеров или ручных настроек.
Изменение ежедневных таймеров устройства:
- Запрос:
{
"status": "post",
"message": "td_s",
"data": {
"dt_h_s": [1, 0, 0, 0, 0, 0, 0, 0],
"dt_h_end": [2, 0, 0, 0, 0, 0, 0, 0],
"dt_m_s": [5, 0, 0, 0, 0, 0, 0, 0],
"dt_m_e": [55, 0, 0, 0, 0, 0, 0, 0],
"dt_s": [1, 0, 0, 0, 0, 0, 0, 0],
"dt_c": [3, 0, 0, 0, 0, 0, 0, 0]
}
}
Изменение ежечасных таймеров устройства:
- Запрос:
{
"status": "post",
"message": "th_s",
"data": {
"ht_m_st": [45, 0, 0, 0, 0, 0, 0, 0],
"ht_m_sp": [56, 0, 0, 0, 0, 0, 0, 0],
"ht_s": [1, 0, 0, 0, 0, 0, 0, 0],
"ht_c": [3, 0, 0, 0, 0, 0, 0, 0]
}
}
Изменение секундных таймеров устройства:
- Запрос:
{
"status": "post",
"message": "ts_s",
"data": {
"st_h_s": [5, 0, 0, 0, 0, 0, 0, 0],
"st_m_s": [26, 0, 0, 0, 0, 0, 0, 0],
"st_d": [125, 0, 0, 0, 0, 0, 0, 0],
"st_s": [1, 0, 0, 0, 0, 0, 0, 0],
"st_c": [2, 0, 0, 0, 0, 0, 0, 0]
}
}
Изменение температурных настроек устройства:
- Запрос:
{
"status": "post",
"message": "te_s",
"data": {
"tt_s": [0, 0, 0, 0, 0, 0, 0, 0],
"tt_m_s": [2200, 2250, 0, 0, 0, 0, 0, 0],
"tt_m_e": [2700, 2850, 0, 0, 0, 0, 0, 0],
"tt_c": [5, 0, 0, 0, 0, 0, 0, 0]
}
}
При POST запросе нет необходимости указывать все параметры в поле data. При передаче значений в устройство можно отправлять только те данные которые изменились на клиенте. На каждый выполненный POST запрос, ответом будет ответ аналогичный GET с тем же message параметром, но уже с измененными данными.
Пример:
- Запрос
-
{ "status": "post", "message": "c_s", "data": { "c_t": [1, 1, 1, 2, 3, 2, 2, 2] } }
-
Ответ
-
{ "status": "get", "message": "c_s", "data": { "cl": [1, 1, 1, 2, 1, 2, 2, 2], "c_t": [1, 1, 1, 2, 3, 2, 2, 2] } }
-
Обратите внимание что ответ на POST приходит всегда в полном виде независимо от тех параметров которые вы отправляете.
Формат команд INFO:
В данный момент запросы формата INFO используются только для внутренней передачи данных между Arduino и модулем связи ESP8266. В частности используется ESP8266 для передачи своего состояния и логирования процессов. Использование внешними клиентами в данной версии не предусмотрено.
Пример отправки логов WIFI соединения на устройство:
{
"status": "info",
"message": "wifi_log",
"log": ""
}