-
Notifications
You must be signed in to change notification settings - Fork 3
Device API
Проект имеет унифицированный API для построения WebUI и для управления/получения информации от котнроллера использующий json в качестве интерфейса данных. Контроллер обменивается данными в пакетном режиме, данные структурируются в секции и могут отправляться частями для минимизации использования памяти. Например страница веб-интерфейса может строится из нескольких пакетов данных, описывающих структуру станицы, подгрузку внешних ресурсов и блока с голыми данными, не содержащим структуры интерфейса.
Активность - это команда на запрос или изменение состояния лампы. Активности является объектом сожержащим объект-идентификатор и объект опциональный данных. Идентификатор определяется парой {"action":"action_id"}
- где action
идентификатор объекта "активность", action_id
- символьный идентификатор, состоящий буквенно цифровых символов и разделителя _
. Разделитель носит логический характер и служит для упрощения струкрурирования схожих имен активностей. Для интерфейсов WebSocket
, HTTP
разделитель используется как есть, для MQTT
разделитель заменяется на /
и используется как разделитель топиков. Объект данных может содержать произвольную структуру в виде вложенного значение ключа "data" {"data":{}}
.
WebSocket используется браузером для построения страничного UI и асинхронного обмена данными с контроллером для динамического обновления статуса элементов управления.
URI для подключения к WebSocket http://your-device/ws
. Структура и формат данных определяется функционалом фреймворка EmbUI.
В целом основной фунционал в проекте создается с учетом доступности из WebUI, т.к. структура объектов используется однинаковая для всех используемых протоколов API, то поведеним любого элемента доступного через WebUI можно управлять через другие протоколы API (MQTT/HTTP) воспользовавшись построением запросов по аналогии с приведенными ниже задокументированными элементами. Для незадокументированных элементов управления имена активностей, структуру и имена параметров и объектов можно извлечь из браузера включив режим разработчика и получив соответствующие сообщения в JS-консоль.
Обмен данными через MQTT осуществляется также как и через WebSocket - пакетами с json объектами. Для всех топиков используется общий префикс, настраиваемый в опциях подключения к MQTT серверу. По умолчанию это префикс вида EmbUI/1234567890AB/
, где 1234567890AB это MAC адрес контроллера. Префикс может быть переопределен в настройках. Далее по тексту префикс будет обозначаться символом ~
.
Отправлять запросы в топики можно двумя способами - либо посылать запрос полной структуры в топик ~/post
, запрос должен включать ключ/значение с активностью и (опционально пустой) объект данных. Либо оправлять только блок данных в топики ~/get/#
и ~/set/#
, тогда идентификатор активности будет сформирован из суффикса топика заменой разделителей топиков /
на _
. Например запрос на включение лампы можно отправить следующими способами:
- topic:
~/set/dev/pwrswitch
, body:{"data":{"dev_pwrswitch":true}}
- topic:
~/post
, body:{ "action":"dev_pwrswitch", "data":{"dev_pwrswitch":true}}
MQTT Topic | тип топика | назначение |
---|---|---|
~/pub/interface |
публикация | публикация объектов описывающих элементы WebUI. Публикуется при запросе страниц и блоков через API, либо при изменении состояния контроллера. |
~/pub/value |
публикация | публикация объектов со значениями состояния элементов интерфейса и внутренних переменных. Публикуется при изменении состояния соответсвующего объекта или как отражение запроса изменение значения через API. Т.е. сюда публикуются все значения одиночно изменяющихся элементов типа переключатели, слайдеры, поля, и пр. |
~/pub/post |
публикация | топик рефлектор - публикуются все запросы на исполнение активностей поступившие в обработчик событий контроллера как извне так и изнутри контроллера. Т.е. запросы поступившие через другой API (WS, API), запросы поступившие от различных программных компонентов для внутрисистемного общения |
~/pub/etc |
публикация | публикация прочих объектов пользовательского типа |
~/eff/ctrls (retained) |
публикация | публикуется массив контролов текущего эффекта, обновляется при переключении эффекта |
~/get/# |
подписка | топик служит для получения запросов о состоянии, значении переменных и элементов интерфейса |
~/set/# |
подписка | топик служит для установки значений переменных, выполнении активностей требующих входных данных |
~/post |
подписка | топик - общая точка входа API, принимает на вход все типы объектов взаимодействия. По сути топики ~/get/# и ~/set/# являются подмножеством топика ~/post
|
HTTP API представляет собой подмножество WS/MQTT, используются json объекты той же структуры. Точка входа для HTTP API http://your-device/api
. Точка принимает запросы типа HTTP POST
с телом запроса в виде json-объекта. Ответом является json-объект, объект может быть пустым.
Ввиду ограничений как самого протокола HTTP 1.1 так и библиотеки AsyncWebServer
через HTTP невозможна передача нескольких пакетов с данными на один запрос. Напр. запрос на некий блок интефейса через WS может сгеренировать разные пакеты - один со структурой webui элементов, и другой со значениями этих элементов. В рамках одной транзакции "запрос-ответ" HTTP это невозможно, поэтому HTTP API ограничен ответом одного объекта, обычно это данные и объекты типа value
.
Пример отправки HTTP-запросов с помощью утилит curl или PostMan :
Включить лампу: curl -X POST http://mylamp/api -H 'Content-Type: application/json' -d '{"action":"dev_pwrswitch", "data":{"dev_pwrswitch":true}}'
Ответ: [{"dev_pwrswitch":true}]
Получить текущую яркость лампы: curl -X POST http://mylamp/api -H 'Content-Type: application/json' -d '{"action":"dev_brightness"}'
Ответ: [{"dev_brightness":7},{"dev_brtscale":20},{"dev_lcurve":2}]
Note
Ответ означает что текущая яркость лампы 7 из 20, действует кривая коррекции 2 ("cie1931")
-
/config.json
- скачать системный конфиг лампы с файловой системы -
/display.json
- скачать конфиг настройки лед ленты/панели с файловой системы (подробнее) -
/update
- форма/URI HTTP OTA для обновления прошивки
Активность |
dev_pwrswitch (тип: get /set ) |
---|---|
Назначение | включение/выключение устройства |
Запрос / MQTT Topic | WS/HTTP: {"action":"dev_pwrswitch", "data":{}} MQTT: ~/get/dev/pwrswitch , ~/set/dev/pwrswitch
|
Параметры запроса | get: "data":{} set: "data":{"dev_pwrswitch":true} or false
|
Ответ | [{"dev_pwrswitch":true}] |
Примечание | для mqtt ответ публикуется в топик ~/pub/value
|
Активность |
dev_brightness тип: get /set
|
---|---|
Назначение | Управление яркостью устройства |
Запрос / MQTT Topic | WS/HTTP: {"action":"dev_brightness", "data":{}} MQTT: ~/get/dev/brightness , ~/set/dev/brightness
|
Параметры запроса | get: "data":{} set: "data":{"dev_brightness":<value>, "nofade":true} где <value> целое в диапазоне 0 - максимум установленной шкалы яркости (по-молчанию: 20) "nofade" опциональный параметр отключающий плавное изменение яркости |
Ответ |
[{"dev_brightness":0},{"dev_brtscale":20},{"dev_lcurve":2}] ответ содержит 3 значения: dev_brightness - яркостьdev_brtscale - шкала яркостиdev_lcurve - кривая коррекции яркости |
Примечание | для mqtt ответ публикуется в топик ~/pub/value
|
Активность |
dev_lcurve тип: get /set
|
---|---|
Назначение | Установки кривой люма коррекци яркости |
Запрос / MQTT Topic | WS/HTTP: {"action":"dev_luma", "data":{}} MQTT: ~/get/dev/lcurve , ~/set/dev/lcurve
|
Параметры запроса | get: "data":{} set: "data":{"dev_lcurve":<value>} где <value> целое0 - "binary" 1 - "linear" 2 - "cie1931" 3 - "exponent" 4 - "sine" 5 - "square" |
Ответ | совпадает с ответом на активность dev_brightness
|
Примечание | для mqtt ответ публикуется в топик ~/pub/value
|
Активность |
eff_dynCtrl* тип: get /set
|
---|---|
Назначение | Изменение элементов управления эффектами - скорость, шкала, палитры и пр. |
Запрос / MQTT Topic | WS/HTTP: {"action":"eff_dynCtrl<N>", "data":{"eff_dynCtrl<N>":<value>}"} MQTT: ~/get/eff/dynCtrl<N> ~/set/eff/dynCtrl<N>
|
Параметры запроса | get: {} set: {"eff_dynCtrl<N>":<value>} , где <N> - номер контрола эффекта, <value> - значение контрола (число/булеан и пр.) |
Ответ | кадр типа value , публикуется в топик ~/pub/value (напр. [{"eff_dynCtrl2":"30"}] ) |
Примечание |
Активность |
eff_ctrls тип: get
|
---|---|
Назначение | Формирует UI блок со списком всех контролов текущего эффекта |
Запрос / MQTT Topic | WS/HTTP: {"action":"eff_ctrls"} MQTT: ~/get/eff/ctrls
|
Параметры запроса | {} |
Ответ | WS/MQTT: объект UI элементов контролов эффектов HTTP: {}
|
Примечание | дополнительно публикуется в mqtt топик ~/eff/ctrls с флагом retained
|
Активность |
eff_sw_idx тип: set
|
---|---|
Назначение | Переключиться на эффект по индексу |
Запрос / MQTT Topic | WS/HTTP: {"action":"eff_sw_idx", "data":{"eff_sw_idx":<value>}} MQTT: ~/set/eff/sw/idx
|
Параметры запроса |
set: {"eff_sw_idx":<value>} , где <value> целое в диапазоне 0 - 255 |
Ответ | ответом может быть несколько различных сообщений генерируемых при смене эффекта - обновление яркости, списки контролов и т.п. |
Примечание |
Активность |
eff_sw_next тип: set
|
---|---|
Назначение | Переключиться на следующий эффект |
Запрос / MQTT Topic | WS/HTTP: {"action":"eff_sw_next", "data":{"eff_sw_next":null}} MQTT: ~/set/eff/sw/next
|
Параметры запроса |
set: {"eff_sw_next":null}
|
Ответ | совпадает с ответом на активность eff_sw_idx
|
Примечание |
Активность |
eff_sw_prev тип: set
|
---|---|
Назначение | Переключиться на предыдущий эффект |
Запрос / MQTT Topic | WS/HTTP: {"action":"eff_sw_next", "data":{"eff_sw_next":null}} MQTT: ~/set/eff/sw/prev
|
Параметры запроса |
set: {"eff_sw_prev":null}
|
Ответ | совпадает с ответом на активность eff_sw_idx
|
Примечание |
Активность |
eff_sw_rnd тип: set
|
---|---|
Назначение | Переключиться на случайный эффект |
Запрос / MQTT Topic | WS/HTTP: {"action":"eff_sw_rnd", "data":{"eff_sw_rnd":null}} MQTT: ~/set/eff/sw/rnd
|
Параметры запроса |
set: {"eff_sw_rnd":null}
|
Ответ | совпадает с ответом на активность eff_sw_idx
|
Примечание |
Активность |
display_ws2812 тип: get /set
|
---|---|
Назначение | Конфигурация параметров LED ленты/матрицы на основе адресных светодиодов |
Запрос / MQTT Topic | WS/HTTP: {"action":"display_ws2812"} MQTT: ~/get/display/ws2812 , ~/set/display/ws2812
|
Параметры запроса | get: null set: "data": { <параметры настроки матрицы> }
|
Ответ | set: пустой ответ, либо кадр для WebUI get: сериализованный объект текущей конфигурации матрицы |
Примечание | подробнее о параметрах на странице Настройка LED |
Активность |
display_hub75 тип: get /set
|
---|---|
Назначение | Конфигурация параметров HUB75 матрицы |
Запрос / MQTT Topic | WS/HTTP: {"action":"display_hub75", "data":{}} MQTT: ~/get/display/hub75 , ~/set/display/hub75
|
Параметры запроса | get: null set: "data": { <параметры настроки матрицы> }
|
Ответ | set: WS/MQTT/HTTP: пустой ответ, либо кадр для WebUI get: []
|
Примечание | подробнее о параметрах на странице Настройка LED |
Активность |
ui_page_effects тип: get
|
---|---|
Назначение | Сформировать страницу управления эффектами |
Запрос / MQTT Topic | WS/HTTP: {"action":"ui_page_effects"} MQTT: ~/get/ui/page/effects ~/post
|
Параметры запроса | null |
Ответ | WS/MQTT: объект элементов страницы HTTP: {}
|
Примечание |
Активность |
ui_page_drawing тип: get
|
---|---|
Назначение | Сформировать страницу "Рисование" |
Запрос / MQTT Topic | WS/HTTP: {"action":"ui_page_drawing"} MQTT: ~/get/ui/page/drawing ~/post
|
Параметры запроса | null |
Ответ | WS/MQTT: объект элементов страницы HTTP: {}
|
Примечание |
Активность |
ui_block_switches тип: get
|
---|---|
Назначение | Сформировать блок переключателей на странице эффектов |
Запрос / MQTT Topic | WS/HTTP: {"action":"ui_block_switches"} MQTT: ~/get/ui/block/switches ~/post
|
Параметры запроса | null |
Ответ | WS/MQTT: объект элементов страницы HTTP: {}
|
Примечание |
Активность | |
---|---|
Назначение | |
Запрос / MQTT Topic | |
Параметры запроса | |
Ответ | |
Примечание |