LS Player MQTT API: различия между версиями
мНет описания правки |
(статья про LS Player 1.3.4 MQTT API) |
||
| (не показаны 22 промежуточные версии этого же участника) | |||
| Строка 1: | Строка 1: | ||
{{DISPLAYTITLE:Light Stream Player MQTT API}} | |||
Документ описывает MQTT API плеера LS Player v1.3.4. Материал сгруппирован в четыре смысловых блока, чтобы было проще ориентироваться: | |||
* '''I. Логика воспроизведения''' (разделы 1–3) — что и когда играть: плеер, настройки проигрывания, расписание. | |||
* '''II. Оборудование и интерфейсы''' (разделы 4–8) — физические устройства и интерфейсы: ArtNet/RDM, DI/DO, внешние датчики, RS485, светодиоды. | |||
* '''III. Триггеры и actions''' (раздел 9) — автоматизация реакции на внешние события. | |||
* '''IV. Система и обслуживание''' (разделы 10–11) — администрирование устройства: системные настройки, обновление ПО. | |||
'''Как читать документ.''' Каждый раздел описывает MQTT-топики сервиса. Префикс в заголовке топика означает направление обмена ''с точки зрения плеера'': | |||
* '''PUB''' — плеер ''публикует'' в этот топик данные (состояние, списки, события, ошибки). Чтобы получать их, клиент подписывается на топик. Многие PUB-топики публикуются с флагом retained — последнее значение приходит сразу при подписке. | |||
* '''SUB''' — плеер ''подписан'' на этот топик и ждёт в нём команды. Чтобы дать команду, клиент публикует в топик сообщение в формате, указанном в «Payload format» (пример — в «Example»). | |||
Если вы впервые знакомитесь с API — рекомендуется читать по порядку, начиная с блока I. Если ищете конкретный топик — можно сразу перейти к нужному разделу через оглавление. | |||
К статье прилагается демонстрационный flow для Node-RED («MQTT API v1.3.4 - Node-Red demo flow.json»): в нём для каждого раздела собраны готовые примеры запросов (узлы inject) и подписки на ответы (узлы debug), номера блоков во flow совпадают с номерами разделов этой статьи. Самый быстрый способ разобраться в API — импортировать flow, нажимать кнопки inject и смотреть ответы плеера в панели Debug. | |||
= I. Логика воспроизведения = | |||
Что и когда играть: прямое управление плеером, настройки проигрывания и расписание. Начните отсюда, если хотите понять базовую работу плеера. | |||
== 1. Управление проигрыванием == | |||
Описывает MQTT API сервиса проигрывания. | |||
Сервис осуществляет проигрывание анимаций по группам воспроизведения (group_id). Каждая группа независимо проигрывает свой контент (cue, плейлист, статическую заливку или blackout) и имеет собственный текущий приоритет. Список и состав групп определяется конфигурацией фикстур ([[#pub-lmsettingsfixture|lm/settings/fixture]]). | |||
'''Что изменилось в v1.3.4 по сравнению с v1.2.4:''' раздел переведён на модель групп воспроизведения. Появился основной топик управления <code>lm/player/commands</code> (apply/apply_each/update_state, действия play/blackout/static_color/stop). Старый топик <code>lm/player</code> сохранён, но помечен как legacy/deprecated. Топики статистики <code>lm/statistic/playing_progress_info</code> и <code>lm/statistic/playing_ent_info</code> удалены и заменены единым снимком <code>lm/player/state</code>. Топик <code>lm/statistic/current_playing_priority</code> заменён на per-group снимок <code>lm/player/current_playing_priority</code>. '''Инвертирована семантика приоритета''': было «чем меньше число, тем выше приоритет» → стало «чем больше число, тем выше приоритет» (0 - минимальный приоритет). | |||
=== | <span id="sub-lmplayercommands"></span> | ||
=== SUB <code>lm/player/commands</code> === | |||
Принимает команды управления проигрыванием. Поддерживаются команды <code>apply</code>, <code>apply_each</code> и <code>update_state</code>. | |||
==== Apply ==== | |||
Применяет одно действие ко всем указанным группам. | |||
Payload format | Payload format | ||
{ | { | ||
" | "cmd": "apply", | ||
"priority": Union[int, 'buttons', 'scheduler', 'trigger'], | |||
"groups": list[str], | |||
"action": GroupAction, | |||
} | } | ||
Example | Example | ||
{ | |||
" | "cmd": "apply", | ||
" | "priority": "buttons", | ||
" | "groups": ["roof", "back"], | ||
"action": { | |||
* ''' | "type": "play", | ||
* ''' | "entity_type": "cue", | ||
* ''' | "entity_id": 42, | ||
"count": null | |||
} | |||
} | |||
* '''cmd''' - Литерал "apply". | |||
* '''priority''' - Приоритет команды. Целое число (0 - минимальный приоритет, чем больше значение - тем выше приоритет) либо именованная маска "buttons" / "scheduler" / "trigger". | |||
* '''groups''' - Список ID групп, к которым применяется действие. Если хотя бы одна из указанных групп не существует - вся команда отклоняется. | |||
* '''action''' - Объект GroupAction, общий для всех групп из groups. | |||
==== Apply each ==== | |||
Применяет разные действия к разным группам в одном сообщении. | |||
Payload format | Payload format | ||
int | { | ||
"cmd": "apply_each", | |||
"priority": Union[int, 'buttons', 'scheduler', 'trigger'], | |||
"actions": { | |||
str: GroupAction, | |||
... | |||
}, | |||
} | |||
Example | Example | ||
{ | |||
"cmd": "apply_each", | |||
"priority": "buttons", | |||
"actions": { | |||
"roof": {"type": "play", "entity_type": "playlist", "entity_id": 1, "count": null}, | |||
"back": {"type": "blackout"}, | |||
"front": {"type": "stop"} | |||
} | |||
} | |||
* '''cmd''' - Литерал "apply_each". | |||
* '''priority''' - Общий приоритет для всех действий в сообщении. | |||
* '''actions''' - Словарь group_id → GroupAction. Неизвестные группы пропускаются, остальные действия из сообщения продолжают обрабатываться. | |||
==== Update state ==== | |||
Служебная команда запроса актуального playback-state (провоцирует внеочередную публикацию [[#pub-lmplayerstate|lm/player/state]]). | |||
Payload format | |||
{ | |||
"cmd": "update_state" | |||
} | |||
<span id="groupaction"></span> | |||
==== GroupAction ==== | |||
Дискриминация выполняется по полю <code>type</code>. | |||
'''Play''' - запускает playlist или cue на группе. | |||
{ | |||
"type": "play", | |||
"entity_type": Union['playlist', 'cue'], | |||
"entity_id": Union[int, str], | |||
"count": Optional[int], | |||
} | |||
* '''entity_type''' - Тип сущности: playlist или cue. | |||
* '''entity_id''' - ID сущности. | |||
* '''count''' - Количество повторов. null означает бесконечное проигрывание. | |||
'''Blackout''' - включает на группе zero-cue, который держит каналы группы в нуле. | |||
{ | |||
"type": "blackout" | |||
} | |||
'''Stop''' - останавливает проигрывание на группе и проверяет, есть ли актуальное событие расписания. Если в runtime ничего не проигрывается на группе, stop игнорируется. | |||
{ | |||
"type": "stop" | |||
} | |||
'''Static color''' - включает на группе статическое DMX-состояние. Значения задаются по семантическому типу канала; runtime разворачивает их в реальные DMX-каналы по текущим patch settings. | |||
{ | { | ||
" | "type": "static_color", | ||
" | "channels": { "<channel_type>": int } | ||
} | } | ||
* '''channels''' - Объект channel_type → DMX-значение (целые 0-255). Каналы группы, для которых тип не задан, выставляются в 0. Неизвестный или отсутствующий в группе channel_type игнорируется. Пустой channels → все каналы группы 0. | |||
Example | Example | ||
{ | { | ||
" | "cmd": "apply", | ||
" | "priority": "buttons", | ||
"groups": ["front", "back"], | |||
"action": { | |||
"type": "static_color", | |||
"channels": {"red": 255, "green": 128, "blue": 0} | |||
} | |||
} | } | ||
==== Поведение ==== | |||
* Для apply наличие хотя бы одной неизвестной группы отклоняет всю команду. Для apply_each неизвестные группы пропускаются. | |||
* Для play в apply, если сущность не найдена, отклоняется вся команда. Для play в apply_each пропускается только соответствующая группа. | |||
* Приоритет задаётся на уровне всей команды. Если в runtime уже есть активное проигрывание и текущий приоритет группы выше приоритета команды - действие для этой группы игнорируется. | |||
* play, blackout и static_color используют текущие настройки перехода из [[#pub-lmsettingsplayereffect|lm/settings/player/effect_between_playing_command]] и [[#pub-lmsettingsplayerduration|lm/settings/player/duration_effect_between_playing_command]]. | |||
* stop вызывает fade-out с текущим значением duration_effect_between_playing_command, затем сбрасывает приоритет группы к минимальному и инициирует перепроверку расписания для этой группы. | |||
=== SUB <code>lm/player</code> (legacy, deprecated) === | |||
Принимает команды play и stop и применяет действие '''ко всем группам сразу'''. Поддерживается для совместимости со старыми клиентами; для нового кода используйте [[#sub-lmplayercommands|lm/player/commands]]. | |||
Payload format | ==== Play (legacy) ==== | ||
Payload command format | |||
{ | { | ||
"cmd": "play", | |||
"what_playing": Union['playlist', 'cue'], | |||
"entity": Union[int, str], | |||
"count": Optional[int], | |||
"priority": Union[int, 'buttons', 'scheduler', 'trigger'], | |||
} | } | ||
Example | Example | ||
{ | |||
"cmd": "play", | |||
"what_playing": "cue", | |||
"entity": 5, | |||
"count": null, | |||
"priority": "buttons" | |||
} | |||
* '''cmd''' - Название команды. | |||
* '''what_playing''' - Тип сущности для воспроизведения. Принимает значения "playlist" и "cue". | |||
* '''entity''' - ID или наименование проигрываемой сущности. | |||
* '''count''' - Опциональный параметр. Количество повторений проигрывания. Если не задан или равен null, проигрывание продолжится до получения следующей команды с равным или более высоким приоритетом. | |||
* '''priority''' - Приоритет команды: число или именованная маска buttons / scheduler / trigger. | |||
==== Stop (legacy) ==== | |||
Payload stop command format | |||
{ | { | ||
"cmd": "stop", | |||
"priority": Union[int, 'buttons', 'scheduler', 'trigger'], | |||
} | } | ||
Example | |||
{ | |||
"cmd": "stop", | |||
"priority": "buttons" | |||
} | |||
<span id="pub-lmplayerstate"></span> | |||
=== PUB <code>lm/player/state</code> === | |||
Публикует полный снимок текущего состояния воспроизведения всех групп. Сообщение публикуется с флагом '''retain=true''', поэтому новый подписчик сразу получает последнее актуальное состояние от брокера. | |||
Публикация выполняется: при изменении контента на любой группе; при переходе на другую сцену внутри плейлиста; при появлении или исчезновении затухающих (stale) слоёв; при изменении frame_rate; при остановке сервиса (публикуется пустое состояние). | |||
frame_rate, current_frame, total_frames и timestamp позволяют подписчику самостоятельно посчитать прогресс и оставшееся время воспроизведения. | |||
Payload format | Payload format | ||
{ | { | ||
"groups": { | |||
str: { | |||
"now": Layer | null, | |||
"stale": [Layer, ...], | |||
}, | |||
... | |||
}, | |||
"frame_rate": float, | |||
"timestamp": int, | |||
} | } | ||
'''Layer''' | |||
{ | { | ||
"group_id": str, | |||
"playback_id": str, | |||
"content": Content, | |||
"is_playing": bool, | |||
"weight": float, | |||
"current_frame": int, | |||
"total_frames": int, | |||
"playlist_id": Optional[str], | |||
"playlist_name": Optional[str], | |||
"scene_index": Optional[int], | |||
"total_scenes": Optional[int], | |||
"sequence_repeat": Optional[int], | |||
} | } | ||
'''Content''' - что именно играет на слое, объект с дискриминатором type: | |||
* Записанный cue: <code>{ "type": "recorded", "cue_id": str }</code> | |||
* Статическая заливка: <code>{ "type": "static_color", "channels": dict[str, int] }</code> (0-255) | |||
* Blackout: <code>{ "type": "blackout" }</code> - группа удерживается в нуле, дополнительных полей нет. | |||
Example | |||
{ | { | ||
" | "groups": { | ||
"group_1": { | |||
"now": { | |||
"group_id": "group_1", | |||
"playback_id": "7f3a9c2e-4b1d-4e0a-9c3f-2a1b6d8e0f11", | |||
"content": {"type": "recorded", "cue_id": "a1b2c3d4"}, | |||
"is_playing": true, | |||
"weight": 1.0, | |||
"current_frame": 120, | |||
"total_frames": 900, | |||
"playlist_id": "pl_001", | |||
"playlist_name": "Evening Show", | |||
"scene_index": 2, | |||
"total_scenes": 5, | |||
"sequence_repeat": -1 | |||
}, | |||
"stale": [ | |||
{ | |||
"group_id": "group_1", | |||
"playback_id": "1d8b4f60-9a72-4c55-8e3b-0f4c7a2d9b30", | |||
"content": {"type": "recorded", "cue_id": "x9y8z7w6"}, | |||
"is_playing": true, | |||
"weight": 0.35, | |||
"current_frame": 899, | |||
"total_frames": 900, | |||
"playlist_id": null, | |||
"playlist_name": null, | |||
"scene_index": null, | |||
"total_scenes": null, | |||
"sequence_repeat": null | |||
} | |||
] | |||
}, | |||
"group_2": { "now": null, "stale": [] } | |||
}, | |||
"frame_rate": 30.0, | |||
"timestamp": 1743422400000 | |||
} | } | ||
* '''groups''' - Словарь всех групп из текущего patch mapping. Группа присутствует в snapshot, даже если на ней ничего не играет. | |||
* '''now''' - Текущее активное воспроизведение на группе. null, если на группе ничего не играет. | |||
* '''stale''' - Список слоёв, которые ещё затухают после переключения. Может быть пустым. | |||
* '''playback_id''' - Стабильный идентификатор экземпляра воспроизведения (uuid). Фиксируется при запуске слоя и не меняется всю его жизнь, переживая переход из now в stale. По нему подписчик коррелирует записи между снапшотами. Новый запуск (включая повтор или луп-рестарт той же сцены) - это новый playback_id. | |||
* '''is_playing''' - Играет ли слой в текущий момент (weight > 0). | |||
* '''weight''' - Текущий вес слоя в диапазоне 0.0-1.0. Используется для визуализации fade-in/fade-out. | |||
* '''playlist_id''' / '''playlist_name''' - Заполнены, если cue воспроизводится как часть плейлиста. Иначе null. | |||
* '''scene_index''' / '''total_scenes''' - Индекс текущей сцены (0-based) и общее число сцен в плейлисте. Для одиночного cue - null. | |||
* '''sequence_repeat''' - Оставшееся количество повторов последовательности. -1 - бесконечный loop, 0 - последний прогон, N - осталось ещё N повторов. Для одиночного cue - null. | |||
* '''frame_rate''' - Текущий FPS рендера. | |||
* '''timestamp''' - Момент формирования snapshot, unix time в миллисекундах. | |||
'''Замена статистики v1.2.4:''' топики <code>lm/statistic/playing_progress_info</code> и <code>lm/statistic/playing_ent_info</code> удалены, их функциональность полностью покрывается данным топиком. | |||
=== PUB <code>lm/player/current_playing_priority</code> === | |||
Публикует полный снимок текущих приоритетов всех групп. Сообщение публикуется с флагом '''retain=true'''. | |||
Публикация выполняется: при изменении текущего приоритета любой группы; при изменении состава групп после обновления patch/group mapping; после инициализации сервиса; при изменении настроек сопоставления именованных приоритетов (если в этот момент что-то проигрывается, сервис останавливает текущее проигрывание и сбрасывает приоритеты всех групп к наименьшему значению); при завершении сервиса (публикуется пустой snapshot {}). | |||
В одном сообщении публикуется полное состояние всех групп, а не только изменившейся - каждое новое сообщение должно рассматриваться как полная замена предыдущего snapshot. Снимок отражает логику арбитража команд, а не фактическое состояние рендера. | |||
Payload format | Payload format | ||
{ | { | ||
str: Union[int, 'buttons', 'scheduler', 'trigger'], | |||
... | |||
} | } | ||
Example | Example | ||
{ | { | ||
"all": "scheduler", | |||
"front": "buttons", | |||
"back": 75 | |||
} | } | ||
* '''key''' - Идентификатор группы. | |||
* '''value''' - Текущий приоритет группы. 0 означает наименьший приоритет. Именованные значения buttons, scheduler, trigger публикуются как строки. | |||
'''Замена статистики v1.2.4:''' топик <code>lm/statistic/current_playing_priority</code> (единое целочисленное значение для всего плеера) удалён, заменён данным per-group снимком. | |||
== 2. Управление настройками проигрывания и сущностей == | |||
Payload | === PUB <code>lm/settings/location/coordinates</code> === | ||
Публикует координаты плеера. Retained. | |||
Payload format | |||
{ | { | ||
" | "latitude": str, | ||
" | "longitude": str, | ||
} | } | ||
Значения публикуются строками. | |||
Example | Example | ||
{ | { | ||
" | "latitude": "56.821019190097616", | ||
" | "longitude": "60.59559633825789" | ||
} | } | ||
=== PUB <code>lm/settings/ | === PUB <code>lm/settings/location/address</code> === | ||
Публикует | Публикует адрес устройства. Retained. | ||
Payload format | |||
{ | |||
"address": str | |||
} | |||
Example | |||
{ | |||
"address": "Yekaterinburg" | |||
} | |||
=== PUB <code>lm/settings/datetime/timezone</code> === | |||
Публикует часовой пояс плеера. Retained. | |||
Payload format | Payload format | ||
{ | |||
"timezone": str | |||
} | |||
Example | Example | ||
{ | |||
"timezone": "Asia/Yekaterinburg" | |||
} | |||
* '''timezone''' - Часовой пояс плеера. | |||
* ''' | |||
=== PUB <code>lm/ | === PUB <code>lm/settings/player/fps</code> === | ||
Публикует | Публикует настройки fps. Retained. | ||
Payload format | |||
{ | |||
"fps": int, | |||
} | |||
Example | |||
{ | |||
"fps": 40 | |||
} | |||
=== PUB <code>lm/settings/player/artsync</code> === | |||
Публикует статус отправки artsync. Retained. | |||
Payload format | Payload format | ||
{ | |||
"artsync": bool, | |||
} | |||
Example | |||
{"artsync": false} | |||
=== PUB <code>lm/settings/player/locked</code> === <span id="pub-lmsettingsplayerlocked"></span>'''(новое в v1.3.4)''' | |||
Публикует статус блокировки отправки ArtDMX плеера. Retained. | |||
Payload format | |||
{ | |||
"locked": bool, | |||
} | |||
Example | Example | ||
{"locked": true} | |||
=== PUB <code>lm/ | <span id="pub-lmsettingsplayereffect"></span> | ||
Публикует | === PUB <code>lm/settings/player/effect_between_playing_command</code> === | ||
Публикует настройку эффекта между событиями проигрывания. Retained. | |||
'''Изменение относительно v1.2.4:''' заменяет топик <code>lm/settings/player/blackout_between_playing_command</code> (bool). Вместо булева флага "включен/выключен blackout" используется перечисление типа эффекта. | |||
Payload format | Payload format | ||
{ | |||
"effect_between_playing_command": Union['transition', 'blackout', 'fade', 'no_effect'], | |||
} | |||
Example | |||
{"effect_between_playing_command": "blackout"} | |||
<span id="pub-lmsettingsplayerduration"></span> | |||
=== PUB <code>lm/settings/player/duration_effect_between_playing_command</code> === '''(новое в v1.3.4)''' | |||
Публикует настройку длительности эффекта между событиями проигрывания. Retained. | |||
Payload format | |||
{ | |||
"duration": float, | |||
} | |||
Example | Example | ||
{"duration": 1.0} | |||
=== PUB/SUB <code>lm/settings/player/dimmer_value</code> === '''(новое в v1.3.4)''' | |||
Публикует значения диммера по группам воспроизведения. Retained. Backend также подписан на этот топик: входящее сообщение задаёт новые значения диммера (набор групп во входящем сообщении должен совпадать с текущим). | |||
Payload format | |||
{ | |||
str: float, | |||
} | |||
* '''key''' - Идентификатор группы. | |||
* '''value''' - Значение диммера, 0.0 - 1.0. | |||
Examples | |||
{"all": 0.5} | |||
{"all": 1.0, "stage_left": 0.25, "stage_right": 0.8} | |||
{} | |||
=== PUB <code>lm/settings/player/playing_priority</code> === | |||
Публикует предустановленные приоритеты проигрывания плеера. Retained. | |||
Payload format | |||
{ | |||
"buttons": int, | |||
"triggers": int, | |||
"scheduler": int, | |||
} | |||
Example | |||
{ | |||
"buttons": 4, | |||
"triggers": 5, | |||
"scheduler": 6 | |||
} | |||
Приоритет представляет из себя целое число от 1 до 100. Чем выше число тем меньше приоритет. | |||
=== PUB <code>lm/settings/player/universes</code> === | |||
Публикует настройки вселенных плеера. Retained. | |||
Payload format | |||
[ | [ | ||
{ | { | ||
" | "number": int, | ||
" | "device": { | ||
"name": str, | |||
"description": str, | |||
"network_mode": str, | |||
"ip": str, | |||
"port": int, | |||
} | None | |||
} | } | ||
] | ] | ||
Example | |||
[ | |||
{ | |||
"number": 1, | |||
"device": { | |||
** ''' | "name": "artnet_device_1", | ||
** ''' | "description": "Main ArtNet converter", | ||
** ''' | "network_mode": "unicast", | ||
** ''' | "ip": "192.168.1.100", | ||
** ''' | "port": 6454 | ||
} | |||
}, | |||
{ | |||
"number": 2, | |||
"device": null | |||
} | |||
] | |||
* '''number''' - Номер вселенной (0-32768). | |||
* '''device''' - Настройки ArtNet устройства для данной вселенной. Может быть null если устройство не назначено. | |||
** '''name''' - Уникальное имя ArtNet устройства (до 32 символов). | |||
** '''description''' - Описание устройства (до 255 символов, может быть пустым). | |||
** '''network_mode''' - Режим работы сети ("unicast" или "broadcast"). | |||
** '''ip''' - IP адрес устройства. | |||
** '''port''' - Порт устройства (по умолчанию 6454, диапазон 1-65534). | |||
<span id="pub-lmsettingsfixture"></span> | |||
<span id="pub- | === PUB <code>lm/settings/fixture</code> === '''(новое в v1.3.4)''' | ||
Публикует конфигурацию фикстур. Retained. | |||
Payload format | |||
{ | |||
"backgroundImageBase64": str, | |||
"mapWidth": float, | |||
"mapHeight": float, | |||
"fixtureTypes": [ {...} ], | |||
"fixtures": [ {...} ], | |||
"groups": [ { "id": str, ... } ], | |||
} | |||
* '''backgroundImageBase64''' - Фоновое изображение карты в base64 (может быть пустым). | |||
* '''mapWidth''' / '''mapHeight''' - Размеры карты. | |||
* '''fixtureTypes''' - Типы фикстур. | |||
* '''fixtures''' - Фикстуры. | |||
* '''groups''' - Группы воспроизведения - те самые group_id, которые используются в [[#sub-lmplayercommands|lm/player/commands]], [[#pub-lmplayerstate|lm/player/state]] и топиках расписания. | |||
<span id="pub-lmcues"></span> | |||
=== PUB <code>lm/cues</code> === | |||
Публикует список cue файлов загруженных на плеер. Retained. | |||
Payload format | Payload format | ||
[ | |||
{ | |||
} | "id": int, | ||
* ''' | "filename": str, | ||
* ''' | "uni_count": int, | ||
"universes": [int], | |||
"frame_count": int, | |||
"created": str, | |||
} | |||
] | |||
Example | |||
[ | |||
{ | |||
"id": 47, | |||
"filename": "00-5.cue", | |||
"uni_count": 1, | |||
"universes": [1], | |||
"frame_count": 220, | |||
"created": "2024-03-07T08:30:16.926447Z" | |||
} | |||
] | |||
* '''id''' - Уникальный идентификатор анимации. | |||
* '''filename''' - Имя файла. | |||
* '''uni_count''' - Количество вселенных в файле. | |||
* '''universes''' - Список номеров вселенных в файле. '''(новое поле в v1.3.4)''' | |||
* '''frame_count''' - Количество фреймов в файле. | |||
* '''created''' - Время загрузки анимации в ISO формате. | |||
=== PUB <code>lm/ | === PUB <code>lm/cues/deleted</code> === '''(новое в v1.3.4)''' | ||
Публикует | Публикует событие об удалении cue. | ||
Payload format | |||
{ "cue_id": int } | |||
=== PUB <code>lm/playlists</code> === | |||
Публикует список плейлистов загруженных на плеер. Retained. | |||
Payload format | Payload format | ||
[ | [ | ||
{ | { | ||
"id": | "id": int, | ||
" | "name": str, | ||
" | "scenes": [ | ||
{ | |||
"id": int, | |||
" | "order": int, | ||
"cue": { | |||
" | "id": int, | ||
"filename": str, | |||
"uni_count": int, | |||
" | "universes": [int], | ||
"frame_count": int, | |||
"created": str | |||
}, | |||
"fade_in": float, | |||
"fade_out": float, | |||
"transition_time": float, | |||
"repeat_value": int, | |||
} | |||
] | |||
} | } | ||
] | ] | ||
Example | |||
[ | [ | ||
{ | { | ||
"id": | "id": 19, | ||
" | "name": "Test", | ||
" | "scenes": [ | ||
{ | |||
"id": 71, | |||
" | "order": 0, | ||
" | "cue": { | ||
" | "id": 51, | ||
"filename": "5-8.cue", | |||
"uni_count": 1, | |||
"universes": [1], | |||
"frame_count": 220, | |||
"created": "2024-03-07T08:27:23.567083Z" | |||
}, | |||
"fade_in": 1.0, | |||
"fade_out": 0.0, | |||
"transition_time": 2.0, | |||
"repeat_value": 3600 | |||
} | |||
] | |||
} | } | ||
] | ] | ||
* '''id''' - Уникальный идентификатор | * '''id''' - Уникальный идентификатор плейлиста. | ||
* ''' | * '''name''' - Название плейлиста. | ||
* ''' | * '''scenes''' - Сцены. В сценах содержится вся информация об эффектах, применённых к cue, и порядковый номер воспроизведения внутри плейлиста. | ||
** '''id''' - Уникальный идентификатор сцены. | |||
** '''order''' - Порядковый номер воспроизведения внутри плейлиста. | |||
* | ** '''cue''' - Параметры анимации, включая новое поле universes. [[#pub-lmcues|Подробнее]] | ||
** '''fade_in''' - Время fade_in. | |||
* ''' | ** '''fade_out''' - Время fade_out. | ||
* | ** '''transition_time''' - Время перехода. | ||
* ''' | ** '''repeat_value''' - Количество повторений. | ||
* | |||
* ''' | |||
* | |||
* ''' | |||
* | |||
* ''' | |||
* | |||
* ''' | |||
* | |||
* ''' | |||
=== | === PUB <code>lm/playlists/deleted</code> === '''(новое в v1.3.4)''' | ||
Публикует событие об удалении плейлиста. | |||
Payload format | |||
{ "playlist_id": int } | |||
=== SUB <code>lm/player/commands</code> === | |||
См. раздел [[#1._Управление_проигрыванием|«1. Управление проигрыванием»]] - основной топик управления воспроизведением по группам (apply/apply_each/update_state). | |||
=== SUB <code>lm/control/config</code> === '''(новое в v1.3.4)''' | |||
Команда сервисам перечитать конфигурацию. Payload - строка (не JSON). | |||
Payload format | Payload format | ||
"refresh" # перечитать общую конфигурацию | |||
"refresh_universes_settings" # перечитать настройки вселенных | |||
=== | == 3. Управление расписанием == | ||
<span id="pub-lmschedulererror"></span> | |||
=== PUB <code>lm/scheduler/error</code> === | |||
Публикует ошибки. Выставляет заголовок '''Correlation data''' если он был установлен в запросе. | |||
Payload format<pre>{ | |||
"status": "error", | |||
"msg": str, | |||
"data": Any | |||
}</pre> | |||
* '''status''' - всегда "error" для этого топика. '''(новое поле в v1.3.4)''' | |||
* '''msg''' - contain error message | |||
* '''data''' - contain related error data | |||
Example (ошибка валидации payload, data содержит список ошибок валидации полей): | |||
<pre> | |||
{ | |||
"status": "error", | |||
"msg": "Validation error", | |||
"data": [ | |||
{ | |||
"type": "missing", | |||
"loc": ["priority"], | |||
"msg": "Field required", | |||
"input": {"title": "holiday", "rrule": {"freq": "DAILY", "interval": 1, "start_date": "2024-01-20", "start_time_type": "time", "start_time": "00:00"}} | |||
} | |||
] | |||
} | |||
</pre> | |||
Example (внутренняя ошибка обработки, data равен null): | |||
<pre> | |||
{ | |||
"status": "error", | |||
"msg": "Internal Error Occurred", | |||
"data": null | |||
} | |||
</pre> | |||
<span id="pub-lmschedulerevents"></span> | |||
=== PUB <code>lm/scheduler/events</code> === | |||
Публикует список всех событий календаря. | |||
Payload format | Payload format | ||
{ | [ | ||
{ | |||
"id": str, | |||
"title": str, | "title": str, | ||
"priority": int, | "priority": int, | ||
"actions": { | "actions": { | ||
"player": | "player": { | ||
" | str: {"type": "play", "entity_type": Union['playlist','cue'], "entity_id": int} | ||
| {"type": "blackout"} | |||
| {"type": "static_color", "channels": dict[str, int]} | |||
} | }, | ||
"do1": Optional[{ | "do1": Optional[{"state": Literal[0, 1]}], | ||
"do2": Optional[{"state": Literal[0, 1]}], | |||
"do3": Optional[{"state": Literal[0, 1]}], | |||
"do2": Optional[{ | |||
"do3": Optional[{ | |||
}, | }, | ||
"rrule": { | "rrule": RRule | ||
} | |||
] | |||
'''RRule''' | |||
{ | |||
"freq": Union['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY'], | |||
"interval": int, | |||
"start_date": str, | |||
"start_time_type": Union['sunset', 'sunrise', 'time'], | |||
"start_time": Optional[str], | |||
"start_time_offset": Optional[int], | |||
"until_date": Optional[str], | |||
"until_time_type": Optional[Union['sunset', 'sunrise', 'time']], | |||
"until_time": Optional[str], | |||
"until_time_offset": Optional[int], | |||
"count": Optional[int], | |||
"from_time_type": Optional[Union['sunset', 'sunrise', 'time']], | |||
"from_time": Optional[str], | |||
"from_time_offset": Optional[int], | |||
"to_time_type": Optional[Union['sunset', 'sunrise', 'time']], | |||
"to_time": Optional[str], | |||
"to_time_offset": Optional[int], | |||
"bymonth": Optional[list[Union['January', ..., 'December']]], | |||
"bymonthday": Optional[list[int]], | |||
"byweekday": Optional[list[Union['MO','TU','WE','TH','FR','SA','SU']]], | |||
"from_min": Optional[int], | |||
"to_min": Optional[int], | |||
} | } | ||
Example | Example | ||
{ | [ | ||
{ | |||
"id": "abe4c633-8e3f-4938-94e2-efd135d993fc", | |||
"title": "holiday", | |||
"priority": 1, | |||
"actions": { | |||
"player": { | |||
" | "roof": {"type": "play", "entity_type": "playlist", "entity_id": 19}, | ||
" | "ungrouped": {"type": "blackout"} | ||
}, | |||
"do1": {"state": 1}, | |||
"do2": null, | |||
"do3": null | |||
}, | }, | ||
" | "rrule": { | ||
"freq": "DAILY", "interval": 1, "start_date": "2024-01-20", | |||
"start_time_type": "time", "start_time": "00:00", "start_time_offset": null, | |||
"count": 1, "until_date": null, "until_time_type": null, "until_time": null, "until_time_offset": null, | |||
"from_time_type": "sunset", "from_time": null, "from_time_offset": 0, | |||
"to_time_type": "sunset", "to_time": null, "to_time_offset": 0, | |||
"bymonth": null, "bymonthday": null, "byweekday": null, "from_min": null, "to_min": null | |||
} | |||
} | } | ||
] | |||
* '''id''' - Уникальный идентификатор события (UUID). | * '''id''' - Уникальный идентификатор события (UUID). | ||
* '''title''' - Название события. | * '''title''' - Название события. | ||
* '''priority''' - Приоритет события. Чем выше значение тем выше приоритет. | * '''priority''' - Приоритет события. Чем выше значение тем выше приоритет. | ||
* '''actions''' - Действия которые должны быть выполнены при наступлении события. | * '''actions''' - Действия, которые должны быть выполнены при наступлении события. | ||
* '''player''' - | * '''player''' - '''(изменено в v1.3.4)''' Действия для групп плееров. Ключ словаря - название группы (было единственное действие на весь плеер, стало по одному действию на группу). | ||
* ''' | ** '''type''' - Тип действия для группы плеера: 'play', 'blackout' или 'static_color'. '''(blackout и static_color - новые в v1.3.4)''' | ||
* '''entity_type''' | ** '''entity_type''' / '''entity_id''' - заполнены при type='play'. | ||
** '''channels''' - словарь канал → 0-255, заполнен при type='static_color'. | |||
* ''' | * '''do1''' / '''do2''' / '''do3''' - Действие для соответствующего цифрового выхода. state: 0 (выключен) или 1 (включен). | ||
* ''' | * '''rrule''' - Правила повторения события (recurrence rule): | ||
** '''freq''' - Частота повторений: YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY. | |||
** '''interval''' - Периодичность повторения события. | |||
* '''rrule''' - Правила повторения события (recurrence rule) | ** '''start_date''' - Дата старта события, формат YYYY-mm-dd. | ||
* '''freq''' - Частота повторений | ** '''start_time_type''' / '''start_time''' / '''start_time_offset''' - Тип, время (%H:%M, если start_time_type='time') и сдвиг (если start_time_type='sunset'/'sunrise') времени старта. | ||
* '''interval''' - Периодичность повторения события. | ** '''count''' / '''until_date''' - Количество повторений либо дата завершения; не могут быть заполнены одновременно; если оба пустые - событие никогда не завершается. | ||
* '''start_date''' - Дата старта события | ** '''until_time_type''' / '''until_time''' / '''until_time_offset''' - аналогично start_*, но для завершения (заполнены, если задан until_date). | ||
* '''start_time_type''' | ** '''from_time_type''' / '''from_time''' / '''from_time_offset''' и '''to_time_type''' / '''to_time''' / '''to_time_offset''' - Время начала/окончания события в течение дня; заполнены, если freq ≠ HOURLY. | ||
** '''bymonth''' - Месяцы активности события; заполнено при freq=YEARLY. | |||
** '''bymonthday''' - Дни месяца; заполнено при freq=MONTHLY. | |||
* '''count''' | ** '''byweekday''' - Дни недели; заполнено при freq=WEEKLY. | ||
** '''from_min''' / '''to_min''' - Минута начала/окончания события; заполнены при freq=HOURLY. | |||
* '''until_time_type''' | |||
* '''from_time_type''' | |||
* '''bymonth''' - Месяцы | |||
* '''bymonthday''' - Дни месяца | |||
* '''byweekday''' - Дни недели | |||
* '''from_min''' | |||
=== | === SUB <code>lm/scheduler/events/add</code> === | ||
Добавляет новое событие '''без действий'''. Действия для созданного события задаются отдельным запросом в топик [[#sub-lmscheduler-actions-update|lm/scheduler/events/actions/update]]. | |||
'''Изменение относительно v1.2.4:''' payload с полем <code>actions</code> отклоняется с ошибкой валидации - раньше событие и его действия создавались одним запросом. | |||
Payload format | Payload format | ||
{ | { | ||
"title": str, | |||
"priority": int, | |||
"rrule": RRule | |||
} | } | ||
(формат RRule - см. [[#pub-lmschedulerevents|lm/scheduler/events]] выше) | |||
Example | Example | ||
{ | { | ||
"title": "holiday", | |||
"priority": 1, | |||
"rrule": { | |||
"freq": "DAILY", "interval": 1, "start_date": "2024-01-20", | |||
"start_time_type": "time", "start_time": "00:00", "start_time_offset": null, | |||
"count": 1, "until_date": null, "until_time_type": null, "until_time": null, "until_time_offset": null, | |||
"from_time_type": "sunset", "from_time": null, "from_time_offset": 0, | |||
"to_time_type": "sunset", "to_time": null, "to_time_offset": 0, | |||
"bymonth": null, "bymonthday": null, "byweekday": null, "from_min": null, "to_min": null | |||
} | } | ||
} | } | ||
'''Response''' '''(новое в v1.3.4)''' - ответ публикуется в топик <code>lm/scheduler/events/add/response</code> (или в Response Topic из запроса), конверт {status, msg, data}; Correlation Data копируется в ответ. | |||
* При успехе: status = 'success', msg = "Request was accepted", data - созданное событие (id, title, priority, rrule и actions с пустыми player/do). | |||
* При ошибке: status = 'error', data - детали ошибки; ответ также публикуется в [[#pub-lmschedulererror|lm/scheduler/error]]. | |||
=== SUB <code>lm/scheduler/events/delete</code> === | |||
Удаляет событие. | |||
Payload format | |||
{ "id": str } | |||
Example | |||
{ "id": "abe4c633-8e3f-4938-94e2-efd135d993fc" } | |||
* '''id''' - Уникальный идентификатор события. | |||
'''Response''' '''(новое в v1.3.4)''' - ответ публикуется в топик <code>lm/scheduler/events/delete/response</code> (или в Response Topic), конверт {status, msg, data}. | |||
* При успехе: status = 'success', msg = "Deleted", data = null. | |||
* При ошибке: status = 'error', data - детали ошибки; ответ также публикуется в lm/scheduler/error. | |||
=== SUB <code>lm/scheduler/events/update</code> === | |||
Обновляет свойства события: title, priority, rrule. '''Существующие действия события не меняются.''' | |||
'''Изменение относительно v1.2.4:''' payload с полем <code>actions</code> отклоняется с ошибкой валидации. Для изменения действий используйте топик [[#sub-lmscheduler-actions-update|lm/scheduler/events/actions/update]]. | |||
Payload format | Payload format | ||
{ | { | ||
"id": str, | |||
"title": str, | |||
"priority": int, | |||
"rrule": RRule | |||
} | } | ||
Example | Example | ||
{ | { | ||
" | "id": "abe4c633-8e3f-4938-94e2-efd135d993fc", | ||
" | "title": "holiday", | ||
"priority": 1, | |||
" | "rrule": { | ||
" | "freq": "DAILY", "interval": 1, "start_date": "2024-01-20", | ||
" | "start_time_type": "time", "start_time": "00:00", "start_time_offset": null, | ||
" | "count": 1, "until_date": null, "until_time_type": null, "until_time": null, "until_time_offset": null, | ||
"from_time_type": "sunset", "from_time": null, "from_time_offset": 0, | |||
"to_time_type": "sunset", "to_time": null, "to_time_offset": 0, | |||
"bymonth": null, "bymonthday": null, "byweekday": null, "from_min": null, "to_min": null | |||
} | } | ||
} | } | ||
'''Response''' '''(новое в v1.3.4)''' - топик <code>lm/scheduler/events/update/response</code>, конверт {status, msg, data} - аналогично events/add/response, data - обновлённое событие. | |||
<span id="sub-lmscheduler-actions-update"></span> | |||
=== SUB <code>lm/scheduler/events/actions/update</code> === '''(новое в v1.3.4)''' | |||
Полностью заменяет блок действий события. '''Семантика обновления - полная замена, не merge.''' Все действия, отсутствующие в новом actions, удаляются из события. Чтобы очистить действия события, отправьте пустые словари player и do. | |||
Payload format | Payload format | ||
{ | { | ||
"id": str, | |||
"actions": { | |||
"player": { | |||
str: {"type": "play", "entity_type": Union['playlist','cue'], "entity_id": int, "count": None} | |||
| {"type": "blackout"} | |||
| {"type": "static_color", "channels": dict[str, int]} | |||
}, | |||
"do": { | |||
} | Literal['1','2','3']: {"port": Literal[1,2,3], "state": Literal[0,1]} | ||
}, | |||
}, | |||
} | } | ||
Example | Example | ||
{ | { | ||
"status": " | "id": "abe4c633-8e3f-4938-94e2-efd135d993fc", | ||
"actions": { | |||
"player": { | |||
"roof": {"type": "play", "entity_type": "playlist", "entity_id": 19, "count": null}, | |||
"ungrouped": {"type": "blackout"}, | |||
"stage": {"type": "static_color", "channels": {"red": 128, "green": 0, "blue": 0}} | |||
}, | |||
"do": {"1": {"port": 1, "state": 1}} | |||
} | |||
} | |||
Clear actions example | |||
{ | |||
"id": "abe4c633-8e3f-4938-94e2-efd135d993fc", | |||
"actions": {"player": {}, "do": {}} | |||
} | |||
* '''id''' - Уникальный идентификатор события (UUID). | |||
* '''actions.player''' - Действия для групп плееров, ключ словаря - название группы. type: play/blackout/static_color; entity_type/entity_id заполнены при play; count - зарезервировано, для play должно быть null; channels заполнено при static_color. | |||
* '''actions.do''' - Действия для цифровых выходов, ключ словаря - номер порта строкой ('1','2','3'); port должен совпадать с ключом; state - 0 или 1. | |||
'''Response''' - топик <code>lm/scheduler/events/actions/update/response</code>, конверт {status, msg, data} - аналогично events/add/response, data - обновлённое событие. | |||
=== PUB <code>lm/scheduler/events/changes</code> === | |||
Публикует вновь созданные/изменённые/удалённые события. | |||
Payload format | |||
{ | |||
"status": Literal['created', 'updated', 'deleted'], | |||
"event": Event # формат события - см. lm/scheduler/events выше | |||
} | |||
Example | |||
{ | |||
"status": "created", | |||
"event": { | "event": { | ||
"id": "abe4c633-8e3f-4938-94e2-efd135d993fc", | "id": "abe4c633-8e3f-4938-94e2-efd135d993fc", | ||
"title": "holiday", | "title": "holiday", | ||
" | "priority": 1, | ||
" | "actions": { | ||
"player": {"roof": {"type": "play", "entity_type": "playlist", "entity_id": 19}, "ungrouped": {"type": "blackout"}}, | |||
" | "do1": {"state": 1}, "do2": null, "do3": null | ||
} | }, | ||
"rrule": { "...": "..." } | |||
} | } | ||
} | } | ||
* '''status''' - Тип изменения: 'created', 'updated', 'deleted'. | |||
* '''event''' - Событие со всеми параметрами (формат как в lm/scheduler/events). | |||
=== SUB <code>lm/scheduler/events/periods</code> === | |||
Принимает запрос на публикацию всех одиночных событий за указанный период. Запрос должен содержать Correlation Data для последующей идентификации ответа. Запрос может содержать Response Topic; в противном случае ответ публикуется в топик lm/scheduler/events/periods/response. | |||
Payload format | |||
{ | { | ||
"from_datetime": str, | |||
"to_datetime": str, | |||
"filters": Optional[{"player": bool, "do1": bool, "do2": bool, "do3": bool}] | |||
} | } | ||
Example | Example | ||
{ | { | ||
" | "from_datetime": "2024-02-25T05:00:00", | ||
"to_datetime": "2024-04-08T05:00:00", | |||
"filters": {"player": true, "do1": false, "do2": false, "do3": false} | |||
} | } | ||
* ''' | * '''from_datetime''' / '''to_datetime''' - Начало/окончание диапазона в ISO формате. | ||
* '''filters''' - Опциональные фильтры типов действий; если не указаны, возвращаются события со всеми типами действий. | |||
* ''' | |||
'''Response''' - ответ публикуется в топик lm/scheduler/events/periods/response (или в Response Topic), конверт {status, msg, data} - data содержит список одиночных событий за период; Correlation Data копируется в ответ; при ошибке ответ также публикуется в lm/scheduler/error. | |||
=== PUB <code>lm/scheduler/ | === PUB <code>lm/scheduler/events/periods/response</code> === | ||
Публикует | Публикует список одиночных событий календаря за указанный период (период задаётся в запросе lm/scheduler/events/periods). | ||
'''Изменение относительно v1.2.4:''' payload теперь объект-конверт {status, msg, data}, где список событий находится в поле data. Раньше payload был самим JSON-массивом событий. | |||
Payload format | |||
{ | |||
"status": Literal['success'], | |||
"msg": str, | |||
"data": [ | |||
{ "id": str, "title": str, "start": str, "end": str, "priority": int, "duration": float } | |||
] | |||
} | |||
Example | |||
{ | |||
"status": "success", | |||
"msg": "Request was accepted", | |||
"data": [ | |||
{ | |||
"id": "abe4c633-8e3f-4938-94e2-efd135d993fc", | |||
"title": "holiday", | |||
"priority": 1, | |||
"start": "2024-02-29T12:00:00+03:00", | |||
"end": "2024-03-02T12:00:00+03:00", | |||
"duration": 259200.0 | |||
} | |||
] | |||
} | |||
* '''status''' / '''msg''' - Статус и сообщение ответа. | |||
* '''data''' - Массив одиночных событий за период: id, title, priority, start/end (ISO), duration (сек). | |||
PUB <code>lm/scheduler/ | === PUB <code>lm/scheduler/player/status/{group}</code> === | ||
Публикует текущее активное событие плеера '''для конкретной группы воспроизведения'''. На каждую группу - отдельный топик, где {group} - идентификатор группы (например lm/scheduler/player/status/__all__). Сообщения retained. | |||
'''Изменение относительно v1.2.4:''' раньше был единый топик <code>lm/scheduler/player/status</code> на весь плеер; теперь статус публикуется отдельным топиком на каждую группу воспроизведения. | |||
Payload format | Payload format (событие есть) | ||
{ | { | ||
status: | "status": "running", | ||
event: { | "event": { | ||
id: str, | "id": str, | ||
title: str, | "title": str, | ||
action: { | "action": {"type": "play", "entity_type": Union['playlist','cue'], "entity_id": int} | ||
| {"type": "blackout"} | |||
| {"type": "static_color", "channels": dict[str, int]} | |||
} | } | ||
} | } | ||
| Строка 1045: | Строка 969: | ||
"id": "abe4c633-8e3f-4938-94e2-efd135d993fc", | "id": "abe4c633-8e3f-4938-94e2-efd135d993fc", | ||
"title": "holiday", | "title": "holiday", | ||
"action": { | "action": {"type": "play", "entity_type": "playlist", "entity_id": 19} | ||
} | } | ||
} | } | ||
Payload format (события нет) | |||
{ "status": "no_event" } | |||
* '''status''' - 'running' или 'no_event'. | |||
* '''event''' - Активное событие; присутствует только когда status='running'. | |||
* '''action.type''' - 'play', 'blackout' или 'static_color'. entity_type/entity_id заполнены при play; channels - при static_color. | |||
=== PUB <code>lm/scheduler/do/1/status</code> === | |||
=== PUB <code>lm/scheduler/do/2/status</code> === | |||
=== PUB <code>lm/scheduler/do/3/status</code> === | |||
Публикует текущее активное событие управления соответствующим цифровым выходом, если оно есть. (Не изменилось в v1.3.4.) | |||
Payload format (событие есть) | |||
{ | { "status": "running", "event": {"id": str, "title": str, "action": {"state": Literal[0,1]}} } | ||
Example | Example | ||
{ | { "status": "running", "event": {"id": "abe4c633-8e3f-4938-94e2-efd135d993fc", "title": "holiday", "action": {"state": 1}} } | ||
Payload format (события нет) | |||
{ "status": "no_event" } | |||
=== SUB <code>lm/settings/datetime/timezone</code> === | === SUB <code>lm/settings/datetime/timezone</code> === | ||
Получает текущую таймзону. | Получает текущую таймзону (используется сервисом расписания для расчёта солнечного времени). | ||
Payload format | Payload format | ||
{ | { "timezone": str } | ||
Example | Example | ||
{ "timezone": "Europe/Moscow" } | |||
=== SUB <code>lm/settings/location/coordinates</code> === | === SUB <code>lm/settings/location/coordinates</code> === | ||
Получает координаты устройства для | Получает координаты устройства для расчёта солнечного времени. | ||
Payload format | |||
{ "latitude": float, "longitude": float } | |||
Payload format | |||
{ | |||
Example | Example | ||
{ "latitude": 56.821019190097616, "longitude": 60.59559633825789 } | |||
= II. Оборудование и интерфейсы = | |||
Физические устройства и интерфейсы, которыми управляет и которые опрашивает плеер: ArtNet/RDM-устройства, DI/DO, внешние датчики, RS485, светодиоды. Эти разделы можно использовать как справочник по конкретному интерфейсу, не читая по порядку. | |||
== 4. Управление устройствами Art-Net == | |||
= | Сервис осуществляет мониторинг и управление ArtNet и RDM устройствами. | ||
<span id="pub-lmartnet_devices_management_serviceerror"></span> | <span id="pub-lmartnet_devices_management_serviceerror"></span> | ||
== PUB <code>lm/artnet_devices_management_service/error</code> == | === PUB <code>lm/artnet_devices_management_service/error</code> === | ||
Публикует ошибки. Выставляет заголовок '''Correlation data''' если он был установлен в запросе. | |||
Публикует ошибки. | |||
Выставляет заголовок '''Correlation data''' если он был установлен в запросе. | |||
<pre>{ | Payload format<pre>{ | ||
msg: str | msg: str | ||
data: Any | data: Any | ||
}</pre> | }</pre> | ||
* '''msg''' - contain error message | * '''msg''' - contain error message | ||
* '''data''' - contain related error data | * '''data''' - contain related error data | ||
< | === PUB <code>lm/artnet_devices_management_service/artnet/devices/changes</code> === | ||
Публикует вновь созданные/изменённые/удалённые ArtNet устройства. | |||
Payload format | |||
{ | |||
"status": Literal['created', 'updated', 'deleted'], | |||
"device": { | |||
"mac_address": str, | |||
"ip_address": str, | |||
"subnet_mask": str, | |||
"default_gateway": str, | |||
"dhcp_status": bool, | |||
"name": str, | |||
"esta_man_code": int, | |||
"oem_code": int, | |||
"style": str, | |||
"firmware_version": str, | |||
"ports": dict[int, { | |||
"bind_index": int, | |||
"port_index": int, | |||
"is_input": bool, | |||
"is_output": bool, | |||
"port_type": Literal['DALI','ArtNet','ADB','Colortran_CMX','Avab','MIDI','DMX512'], | |||
"name": str, | |||
"universe": int, | |||
"is_rdm_on": bool, | |||
"physical_port": Optional[int], | |||
"mode": Optional[Literal['DMX IN', 'DMX OUT', 'SPI']], | |||
"is_data_transmitting": bool, | |||
"tod_uids": list[str], | |||
"lost": bool, | |||
}], | |||
"status": str, | |||
"dev_mode": Optional[str], | |||
"spi_settings": Optional[{ | |||
"chip": str, "mode": str, "period": int, "time_high_0": int, | |||
"time_high_1": int, "time_reset": int, "gamma": int, "bit_mode": str, | |||
}], | |||
"dmx_settings": Optional[{ | |||
"break_time": int, "mab_time": int, "chan_time": int, "pause_time": int, "chan_num": int, | |||
}], | |||
} | |||
} | |||
'''Изменения относительно v1.2.4:''' | |||
* Добавлены поля '''esta_man_code''' и '''oem_code''' на устройстве. | |||
* В элементах ports добавлены '''port_index''', '''tod_uids''' (список UID подключённых RDM-устройств) и '''lost''' (признак потери порта). | |||
* Поле '''out_signal''' (Optional[Literal['DMX','SPI']]) переименовано и расширено в '''mode''' (Optional[Literal['DMX IN', 'DMX OUT', 'SPI']]). | |||
* Поле '''rdm_devices_count''' на устройстве убрано (количество RDM-устройств теперь можно получить через tod_uids на портах либо из списка RDM-устройств). | |||
Example | |||
{ | |||
"status": "updated", | |||
"device": { | |||
"mac_address": "aa:bb:cc:dd:ee:ff", | |||
"ip_address": "192.168.1.10", | |||
"subnet_mask": "255.255.255.0", | |||
"default_gateway": "192.168.1.1", | |||
"dhcp_status": false, | |||
"name": "LS-Converter", | |||
"esta_man_code": 6155, | |||
"oem_code": 2, | |||
"style": "StNode", | |||
"firmware_version": "1.2.3", | |||
"ports": { | |||
"10": { | |||
"bind_index": 1, "port_index": 0, "is_input": false, "is_output": true, | |||
"port_type": "DMX512", "name": "p1", "universe": 10, "is_rdm_on": true, | |||
"physical_port": 1, "mode": "DMX OUT", "is_data_transmitting": false, | |||
"tod_uids": ["0001:00000001"], "lost": false | |||
} | |||
}, | |||
"status": "RcPowerOk", | |||
"dev_mode": null, | |||
"spi_settings": null, | |||
"dmx_settings": {"break_time": 90, "mab_time": 8, "chan_time": 50, "pause_time": 40, "chan_num": 512} | |||
} | |||
} | |||
=== PUB <code>lm/artnet_devices_management_service/rdm/devices/changes</code> === | |||
Публикует вновь созданные/изменённые/удалённые RDM устройства. | |||
< | |||
'''Изменения относительно v1.2.4:''' структура устройства пересмотрена - добавлено поле '''status''' (online/offline); поле art_net_device_ip переименовано в '''ip'''; поле port переименовано в '''physical_port'''; поле art_net_device_mac убрано. | |||
Payload format | |||
{ | |||
"status": Literal['created', 'updated', 'deleted'], | |||
"device": { | |||
"uid": str, | |||
"status": Literal['online', 'offline'], | |||
"supported_params": dict[str, Any], | |||
"ip": str, | |||
"physical_port": int, | |||
{ | |||
status: Literal['created', 'updated', 'deleted'] | |||
device: { | |||
uid: str | |||
} | } | ||
} | } | ||
* '''uid''' - Уникальный идентификатор устройства. | * '''uid''' - Уникальный идентификатор устройства. | ||
* ''' | * '''status''' - Состояние устройства: online или offline. '''(новое поле в v1.3.4)''' | ||
* '''supported_params''' - Словарь параметров и их значений. | * '''supported_params''' - Словарь параметров и их значений. | ||
* '''ip''' - IP адрес конвертера, к которому подключено данное RDM устройство. | |||
* '''physical_port''' - Физический порт конвертера, к которому подключено данное RDM устройство. | |||
Example | |||
{ | |||
"status": "updated", | |||
"device": { | |||
"uid": "0001:00000001", | |||
"status": "online", | |||
"supported_params": { | |||
"DEVICE_INFO": { | |||
"rdm_protocol_major_version": 1, "rdm_protocol_minor_version": 0, | |||
"device_model_id": 256, "product_category": "PRODUCT_CATEGORY_FIXTURE", | |||
"software_version_id": "1.0", "DMX512_footprint": 3, | |||
"DMX512_personality_cur": 1, "DMX512_personality_total": 2, | |||
"DMX512_start_address": 1, "sub_device_count": 0, "sensor_count": 0 | |||
}, | |||
"SOFTWARE_VERSION_LABEL": "v1.0.3", | |||
"IDENTIFY_DEVICE": false, | |||
"SUPPORTED_PARAMETERS": ["DEVICE_LABEL", "DMX_PERSONALITY"], | |||
"DEVICE_LABEL": "front-stage" | |||
}, | |||
"ip": "10.0.0.1", | |||
"physical_port": 1 | |||
} | |||
} | |||
=== PUB <code>lm/artnet_devices_management_service/cmd_response</code> === | |||
Публикует результаты выполнения асинхронных REST команд. Используется для уведомления о завершении длительных операций, выполняемых в фоновом режиме. Клиент получает transaction_uid при инициации команды и может отслеживать её статус через данный топик. | |||
Payload format | |||
{ | |||
"transaction_uid": "string", | |||
"status": "string" | |||
} | |||
* '''transaction_uid''' - Уникальный идентификатор транзакции, возвращаемый при инициации асинхронной команды. | |||
* '''status''' - Статус выполнения команды. '''В текущей реализации публикуется только "done"''' (в v1.2.4 также предполагалось значение "error"). | |||
Example | |||
{ | |||
"transaction_uid": "550e8400-e29b-41d4-a716-446655440000", | |||
"status": "done" | |||
} | |||
== 5. Управление Di Do интерфейсами плеера == | |||
=== PUB <code>lm/di/port/*</code> === | |||
<span id="pub-lmdiport0-player-v1-only"></span>PUB <code>lm/di/port/0</code> (player V1 only)<span id="pub-lmdiport1"></span>PUB <code>lm/di/port/1</code><span id="pub-lmdiport2-player-v2-only"></span>PUB <code>lm/di/port/2</code> (player V2 only)<span id="pub-lmdiport3-player-v2-only"></span>PUB <code>lm/di/port/3</code> (player V2 only) | |||
Публикует состояние di порта | |||
* '''di_port_number''' - Номер di порта. | |||
Payload format | |||
int | |||
Example | |||
1 | |||
* '''int''' - Статус Di порта. 1 - активен, 0 - неактивен. | |||
= | <span id="pub-lmdoport0-player-v1-only"></span> | ||
=== PUB <code>lm/do/port/*</code> === | |||
PUB <code>lm/do/port/0</code> (player V1 only) | |||
PUB <code>lm/do/port/1</code><span id="pub-lmdoport2-player-v2-only"></span>PUB <code>lm/do/port/2</code> (player V2 only)<span id="pub-lmdoport3-player-v2-only"></span>PUB <code>lm/do/port/3</code> (player V2 only) | |||
Публикует состояние do порта | |||
* '''do_port_number''' - Номер do порта. | |||
Payload format | |||
int | |||
Example | |||
1 | |||
* '''int''' - Статус DO порта. 1 - активен, 0 - неактивен. | |||
=== SUB <code>lm/do/change_state</code> === | |||
== | Принимает команды для изменения состояния DO порта. | ||
Payload command format | |||
{ | |||
"port": int, | |||
"state": int, | |||
} | |||
Example | |||
{ | |||
"port": 1, | |||
"state": 1, | |||
} | |||
* ''' | * '''port''' - Номер do порта. | ||
* ''' | * '''state''' - Статус порта. 1 - активен, 0 - неактивен. | ||
== 6. Управление внешними датчиками == | |||
Описывает MQTT API сервиса управления внешними датчиками. | |||
< | === PUB <code>lm/sensors/{sensor_id}/data</code> === | ||
Публикует данные датчика. | |||
Payload format<pre>{ | |||
str | |||
}</pre> | |||
* str - данные датчика | |||
} | Example<pre>{ | ||
"34" | |||
}</pre> | |||
== 7. Управление RS485 интерфейсами плеера == | |||
<span id="pub-lmserialport_controllererror"></span> | |||
=== PUB <code>lm/serialport_controller/error</code> === | |||
Публикует ошибки. | |||
Выставляет заголовок '''Correlation data''' если он был установлен в запросе. | |||
-- | Payload format<pre>{ | ||
msg: str | |||
data: Any | |||
}</pre> | |||
* '''msg''' - contain error message | |||
* '''data''' - contain related error data | |||
Публикует список | === PUB <code>lm/serialport_controller/ports</code> === | ||
Публикует список rs485 портов. | |||
[ | Payload format | ||
[ | |||
{ | { | ||
name: str | |||
mode: Literal['rs485', 'dmxOut'] | |||
} | } | ||
] | ] | ||
* ''' | * '''name''' - Имя порта. | ||
* ''' | * '''mode''' - Предназначение порта. | ||
[ | Example | ||
[ | |||
{ | |||
"name": "port1", | |||
"mode": "rs485", | |||
}, | |||
{ | { | ||
"name": "port2", | |||
"mode": "rs485", | |||
}, | |||
{ | |||
"name": "port3", | |||
"mode": "dmxOut", | |||
}, | |||
{ | |||
"name": "port4", | |||
"mode": "dmxOut", | |||
} | } | ||
] | ] | ||
=== SUB <code>lm/serialport_controller/ports/change_mode</code> === | |||
Меняет предназначение порта. | |||
Payload format | |||
{ | |||
name: str | |||
mode: Literal['rs485', 'dmxOut'] | |||
} | |||
* '''name''' - Имя порта. | |||
* '''mode''' - Предназначение порта. | |||
Example | |||
{ | |||
"name": "port1", | |||
"mode": "rs485", | |||
} | |||
== 8. Управление светодиодами плеера == | |||
<span id="pub-lmledsstate"></span> | |||
<span id=" | |||
< | === PUB <code>'lm/leds/state'</code> === | ||
Публикует состояние диодов rs485 портов | |||
Payload format | |||
{ | |||
Port1: { | |||
green: bool, | |||
red: bool, | |||
}, | |||
Port2: { | |||
green: bool, | |||
red: bool, | |||
}, | |||
Port3: { | |||
green: bool, | |||
red: bool, | |||
}, | |||
Port4: { | |||
green: bool, | |||
red: bool, | |||
}, | |||
} | |||
Example | |||
{ | |||
"Port1": { | |||
"green": true, | |||
"red": true, | |||
}, | |||
"Port2": { | |||
"green": true, | |||
"red": true, | |||
}, | |||
"Port3": { | |||
"green": true, | |||
"red": true, | |||
}, | |||
"Port4": { | |||
"green": true, | |||
"red": true, | |||
}, | |||
} | |||
* '''green''' - Статус зеленого светодиода. | |||
* '''red''' - Статус красного светодиода. | |||
=== SUB <code>lm/leds/change_state</code> === | |||
Принимает команды для изменения состояния диодов у rs485 порта. | |||
Payload command format | |||
{ | |||
pub port: Literal['Port1', 'Port2', 'Port3', 'Port4'], | |||
green: bool, | |||
red: bool, | |||
} | |||
{ | Example | ||
" | { | ||
" | "port": "Port1", | ||
" | "green": true, | ||
"red": false, | |||
} | |||
* '''port''' - Имя rs485 порта. | |||
* '''green''' - Статус зеленого светодиода. | |||
} | * '''red''' - Статус красного светодиода. | ||
=== SUB <code>lm/leds/blink</code> === | |||
Принимает команды для мигания всех светодиодов на всех rs485 портах. | |||
{ | Payload format | ||
" | { | ||
" | times: int, | ||
} | interval: int, | ||
} | |||
Example | |||
{ | |||
"times": 5, | |||
"interval": 1000 | |||
} | |||
* '''times''' - Количество миганий (от 1 до 255). | |||
* '''interval''' - Интервал между миганиями в миллисекундах. | |||
= III. Триггеры и actions = | |||
Автоматизация: как настроить реакцию плеера на внешние события (сигналы RawUDP/ArtNet/Mqtt, показания DI/DO и внешних датчиков из раздела II) и что при этом публикуется в MQTT. Раздел имеет смысл читать после разделов I и II — action'ы триггеров ссылаются на то, что там описано. | |||
== 9. Управление триггерами == | |||
<span id="pub-lmtrigger_servicetriggertrigger_list"></span> | |||
< | === PUB <code>'lm/trigger_service/trigger/trigger_list'</code> === | ||
Публикует список всех триггеров. Топик всегда содержит актуальный список. | |||
Payload format | |||
[ | |||
{ | |||
name: str | |||
tr_type: str | |||
params: dict[str, Any] | |||
} | |||
] | |||
* '''name''' - Имя триггера. | |||
* '''tr_type''' - Тип триггера. | |||
* '''params''' - Словарь с параметрами триггера. | |||
Example | |||
[ | |||
{ | |||
"name": "TriggerFromMqtt", | |||
"tr_type": "RawUDP", | |||
"params": { | |||
"network_type": "udp", | |||
"listen_ip": "0.0.0.0", | |||
"listen_port": "5555", | |||
"data": "any" | |||
} | |||
} | |||
] | |||
=== PUB <code>lm/trigger_service/action/action_list</code> === | |||
Публикует список всех action. <br />Топик всегда содержит актуальный список. | |||
Payload format | |||
[ | |||
{ | |||
name: str | |||
action_type: str | |||
params: dict[str, Any] | |||
{ | } | ||
] | |||
} | |||
* '''name''' - Имя action. | * '''name''' - Имя action. | ||
* '''action_type''' - Тип action. | * '''action_type''' - Тип action. | ||
* '''params''' - Словарь с параметрами | * '''params''' - Словарь с параметрами action. | ||
{ | Example | ||
[ | |||
{ | |||
"name": "default", | |||
"action_type": "send_trigger_to_mqtt", | |||
"params": { | |||
"topic": "lm/trigger_service/trigger/", | |||
"payload": "", | |||
"retain": false | |||
} | |||
} | } | ||
] | |||
=== PUB <code>lm/trigger_service/relation_list</code> === | |||
Публикует список всех связей между триггером и action. | |||
Payload format | |||
[ | |||
{ | |||
trigger: { | |||
name: str | |||
tr_type: str | |||
params: dict[str, Any] | |||
} | |||
action: { | |||
name: str | |||
action_type: str | |||
params: dict[str, Any] | |||
} | |||
} | |||
] | |||
* '''trigger''' - Словарь с триггером. | |||
* '''action''' - Словарь с action. | |||
{ | Example | ||
"topic": "lm/trigger_service/trigger/", | [ | ||
{ | |||
"trigger": { | |||
} | "name": "TriggerFromMqtt", | ||
"tr_type": "RawUDP", | |||
"params": { | |||
"network_type": "udp", | |||
"listen_ip": "0.0.0.0", | |||
"listen_port": "5555", | |||
"data": "any" | |||
} | |||
}, | |||
"action": { | |||
"name": "default", | |||
"action_type": "send_trigger_to_mqtt", | |||
"params": { | |||
"topic": "lm/trigger_service/trigger/", | |||
"payload": "", | |||
"retain": false | |||
} | |||
} | |||
} | |||
] | |||
=== SUB <code>lm/trigger_service/trigger/add</code> === | |||
== SUB <code>lm/trigger_service/ | Добавляет новый триггер. | ||
На данный момент доступны три типа триггера: <code>RawUDP</code> и <code>ArtNet</code> и <code>Mqtt</code>. | |||
* RawUDP - Срабатывает при получении UDP пакета удовлетворяющего заданным параметрам. | |||
* ArtNet - Срабатывает при получении ArtNet пакета удовлетворяющего заданным параметрам. | |||
* Mqtt - Срабатывает при получении Mqtt сообщения удовлетворяющего заданным параметрам. | |||
{ | Payload format | ||
{ | |||
name: str | name: str | ||
} | tr_type: str | ||
* '''name''' - Имя | params: dict[str, Any] | ||
} | |||
* '''name''' - Имя триггера. | |||
* '''tr_type''' - Тип триггера. | |||
* '''params''' - Словарь с параметрами триггера. Параметры отличаются в зависимости от типа триггера. | |||
{ | Example | ||
"name": " | { | ||
} | "name": "TriggerFromMqtt", | ||
"tr_type": "RawUDP", | |||
"params": { | |||
"network_type": "udp", | |||
"listen_ip": "0.0.0.0", | |||
"listen_port": "5555", | |||
"data": "any" | |||
} | |||
} | |||
'''Ожидаемые Параметры''' | |||
< | Параметры для <u>триггера с типом RawUDP</u> | ||
{ | |||
network_type: Literal['udp'] | |||
listen_ip: str | |||
listen_port: int | |||
data: str | |||
} | |||
* '''network_type''' - Тип сети. Должен быть ‘udp’. | |||
* '''listen_ip''' - Прослушиваемый ip. | |||
* '''listen_port''' - Прослушиваемый порт. | |||
* '''data''' - Полезная нагрузка. Принимает строку полностью отражающую полезную нагрузку UDP пакета. | |||
Example RawUDP params | |||
{ | |||
"network_type": "udp", | |||
"listen_ip": "0.0.0.0", | |||
"listen_port": "5555", | |||
"data": "any" | |||
} | |||
Параметры для <u>триггера с типом ArtNet</u> | |||
{ | |||
network_type: Literal['tcp', 'udp'] | |||
listen_ip: str | |||
listen_port: int | |||
universe: int | |||
channel: int | |||
min_level: int | |||
max_level: int | |||
} | } | ||
* '''network_type''' - Тип сети. Принимает значения ‘tcp’ или ‘udp’. | |||
* '''listen_ip''' - Прослушиваемый ip. | |||
----- | * '''listen_port''' - Прослушиваемый порт. | ||
* '''universe''' - Отражает значение параметра subuni из ArtNet пакета. | |||
<span id=" | * '''channel''' - Номер канала в ArtNet пакете. | ||
* '''min_level''' - Минимальное значение в канале для срабатывания триггера. | |||
* '''max_level''' - Максимальное значение в канале для срабатывания триггера.<span id="example-artnet-params"></span>Example ArtNet params | |||
{ | |||
"network_type": "udp", | |||
"listen_ip": "0.0.0.0", | |||
"listen_port": "6454", | |||
"universe": 3, | |||
"channel": 5, | |||
"min_level": 1, | |||
"max_level": 124 | |||
} | |||
Параметры для <u>триггера с типом Mqtt</u> | |||
{ | |||
topic: str | |||
payload: str | |||
} | } | ||
* '''topic''' - Mqtt топик для отслеживания. | |||
* '''payload''' - Полезная нагрузка mqtt сообщения в виде байт. Должна точно совпадать.<span id="example-mqtt-params"></span>Example Mqtt params | |||
{ | |||
"topic": "lm/di/port/1", | |||
"payload": "\x01" | |||
* ''' | } | ||
* ''' | |||
=== SUB <code>lm/trigger_service/trigger/delete</code> === | |||
Удаляет триггер. | |||
---- | <span id="payload-format-4"></span> | ||
=== Payload format === | |||
{ | |||
name: str | |||
} | |||
* '''name''' - Имя триггера.<span id="example-4"></span>Example | |||
{ | |||
"name": "TriggerFromMqtt", | |||
} | |||
=== SUB <code>lm/trigger_service/action/add</code> === | |||
Добавляет новый action. | |||
На данный момент доступны два типа action: <code>send_mqtt_msg_raw</code> и <code>send_trigger_to_mqtt</code>. | |||
* '''send_mqtt_msg_raw''' - Отправляет по mqtt сообщение записанное в параметрах не внося в него никаких изменений. | |||
* '''send_trigger_to_mqtt''' - Отправляет по mqtt сообщение в теле которого находится сработавший триггер. | |||
<span id="example- | Payload format | ||
{ | |||
name: str | |||
action_type: str | |||
params: dict[str, Any] | |||
} | |||
* '''name''' - Имя action. | |||
* '''action_type''' - Тип action. | |||
* '''params''' - Словарь с параметрами action. Различается в зависимости от типа action.<span id="example-5"></span>Example | |||
{ | |||
"name": "default", | |||
"action_type": "send_trigger_to_mqtt", | |||
"params": { | |||
"topic": "lm/trigger_service/trigger/", | |||
"payload": "", | |||
"retain": false | |||
} | |||
} | |||
'''Ожидаемые Параметры''' | |||
Параметры для actions с типом <code>send_trigger_to_mqtt</code> и <code>send_trigger_to_mqtt</code> совпадают. | |||
{ | |||
topic: str | |||
payload: str | |||
retain: bool | |||
} | |||
* '''topic''' - Mqtt topic в который будет отправлено сообщение. | |||
* '''payload''' - Mqtt payload. Полезная нагрузка сообщения. | |||
* '''retain''' - Mqtt retain param. | |||
Типа <code>send_trigger_to_mqtt</code> игнорирует поля '''payload''' и '''retain''' но в сообщении они должны присутствовать. | |||
{ | Example params | ||
{ | |||
} | "topic": "lm/trigger_service/trigger/", | ||
"payload": "", | |||
"retain": false | |||
} | |||
=== SUB <code>lm/trigger_service/action/delete</code> === | |||
Удаляет action. | |||
Payload format | |||
{ | |||
name: str | |||
} | |||
* '''name''' - Имя action. | |||
Example | |||
{ | |||
"name": "default", | |||
} | |||
< | === SUB <code>lm/trigger_service/set_trigger_to_action_relation</code> === | ||
Создает связь между триггером и action. | |||
Payload format | |||
trigger: { | |||
name: str | name: str | ||
tr_type: str | |||
params: dict[str, Any] | params: dict[str, Any] | ||
} | } | ||
] | action: { | ||
name: str | |||
* ''' | action_type: str | ||
* ''' | params: dict[str, Any] | ||
} | |||
* '''trigger''' - Словарь с триггером. | |||
* '''action''' - Словарь с action. | |||
Example | |||
{ | { | ||
" | "trigger": { | ||
" | "name": "TriggerFromMqtt", | ||
"tr_type": "RawUDP", | |||
"params": { | "params": { | ||
" | "network_type": "udp", | ||
" | "listen_ip": "0.0.0.0", | ||
" | "listen_port": "5555", | ||
" | "data": "any" | ||
} | |||
}, | |||
" | "action": { | ||
"name": "default", | |||
"action_type": "send_trigger_to_mqtt", | |||
"params": { | |||
"topic": "lm/trigger_service/trigger/", | |||
"payload": "", | |||
"retain": false | |||
} | |||
} | |||
} | |||
=== SUB <code>lm/trigger_service/delete_trigger_to_action_relation</code> === | |||
Удаляет связь между триггером и action. | |||
{ | Payload format | ||
trigger: { | |||
name: str | |||
tr_type: str | |||
params: dict[str, Any] | |||
} | |||
action: { | |||
name: str | |||
action_type: str | |||
params: dict[str, Any] | |||
} | |||
* '''trigger''' - Словарь с триггером. | |||
* '''action''' - Словарь с action. | |||
Example | |||
{ | |||
"trigger": { | |||
"name": "TriggerFromMqtt", | |||
"tr_type": "RawUDP", | |||
"params": { | |||
"network_type": "udp", | |||
"listen_ip": "0.0.0.0", | |||
"listen_port": "5555", | |||
"data": "any" | |||
} | |||
}, | |||
"action": { | |||
"name": "default", | |||
"action_type": "send_trigger_to_mqtt", | |||
"params": { | |||
"topic": "lm/trigger_service/trigger/", | |||
"payload": "", | |||
"retain": false | |||
} | |||
} | |||
} | |||
=== PUB <code>lm/trigger_service/error</code> === | |||
Публикует ошибки. | |||
Выставляет заголовок '''Correlation data''' если он был установлен в запросе. | |||
Payload format<pre>{ | |||
msg: str | |||
data: Any | |||
}</pre> | |||
* '''msg''' - contain error message | |||
* '''data''' - contain related error data | |||
=== SUB <code>lm/trigger_service/delete_trigger_with_related_actions</code> === | |||
Удаляет триггер и все связанные с ним действия. | |||
<span id=" | Payload format | ||
{ | |||
name: str | |||
} | |||
* '''name''' - Имя триггера.<span id="example-10"></span>Example | |||
{ | |||
"name": "TriggerFromMqtt", | |||
} | |||
'''Новое в v1.3.4:''' добавлен топик публикации факта срабатывания триггера (ранее в него ничего не публиковалось). Остальной функционал раздела (создание/удаление триггеров и action, связи триггер↔action, списки) не изменился. | |||
=== PUB <code>lm/trigger_service/trigger/</code> === '''(новое в v1.3.4)''' | |||
== | Публикует сработавший триггер. retain = false. Публикация выполняется с qos=2. | ||
Payload format | |||
{ | |||
"id": int, | |||
"name": str | |||
} | |||
* '''id''' - Стабильный идентификатор триггера. | |||
* '''name''' - Имя триггера. | |||
Example | |||
{ | |||
"id": 1, | |||
"name": "Artnet" | |||
} | |||
= IV. Система и обслуживание = | |||
Администрирование самого устройства: сетевые и системные настройки, обновление программного обеспечения. Не связано напрямую с воспроизведением контента. | |||
== 10. Настройки системы == | |||
Сервис осуществляет конфигурирование системных настроек ОС. | |||
< | === PUB <code>lm/system_configurator/error</code> === | ||
Публикует ошибки. | |||
Выставляет заголовок '''Correlation data''' если он был установлен в запросе. | |||
< | Payload format<pre>{ | ||
msg: str | |||
data: Any | |||
}</pre> | |||
* '''msg''' - contain error message | |||
* '''data''' - contain related error data | |||
=== PUB <code>lm/system_settings/external_access/certificates</code> === | |||
Публикует список всех x509 сертификатов.<br />Топик всегда содержит актуальный список. | |||
{ | Payload format | ||
[ | |||
{ | |||
name: str | |||
cert_type: str | |||
public_bytes: str | |||
params: dict[str, Any] | |||
} | |||
] | |||
* '''name''' - Имя сертификата. | |||
* '''cert_type''' - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’ | |||
* '''params''' - Словарь с параметрами сертификата. Набор параметров отличается в зависимости от [[#certificate-params-format|типа]] сертификата. | |||
Example | |||
[ | |||
{ | |||
"cert_type": "certificate", | |||
"name": "cert_name", | |||
"params": { | |||
"issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA", | |||
"san": "IP=192.168.0.3", | |||
"subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA", | |||
"valid_from": "1664440221.0", | |||
"valid_to": "1759048221.0" | |||
}, | |||
"public_bytes": "-----BEGIN CERTIFICATE-----\n" | |||
"-----END CERTIFICATE-----\n"}] | |||
} | |||
] | |||
{ | |||
} | |||
=== PUB <code>lm/system_settings/external_access/web_access_settings</code> === | |||
== PUB <code>lm/system_settings/ | Публикует список настроек web доступа.<br />Топик всегда содержит актуальный список. | ||
Payload format | |||
{ | |||
http_port: int | |||
{ | https_port: int | ||
is_https_enabled: bool | |||
is_http_redirected: bool | |||
cert_name: str | |||
} | |||
* '''http_port''' - Http порт. По умолчанию 80. | |||
* '''https_port''' - Https порт. По умолчанию 443. | |||
* '''is_https_enabled''' - Индикатор включен ли https. | |||
* '''is_http_redirected''' - Индикатор включена ли переадресация http to https. | |||
} | * '''cert_name''' - Имя сертификата сервера. | ||
* ''' | |||
* ''' | |||
* ''' | |||
* ''' | |||
* ''' | |||
{ | Example | ||
" | { | ||
"http_port": 80, | |||
"https_port": 443, | |||
" | "is_https_enabled": false, | ||
" | "is_http_redirected": true, | ||
" | "cert_name": "" | ||
" | } | ||
=== SUB <code>lm/system_settings/external_access/change_web_access_settings</code> === | |||
== SUB <code>lm/system_settings/ | Меняет настройки web доступа. | ||
Payload format | |||
{ | |||
http_port: int | |||
https_port: int | |||
is_https_enabled: bool | |||
is_http_redirected: bool | |||
cert_name: str | |||
} | |||
* '''http_port''' - Http порт. По умолчанию 80. | |||
* '''https_port''' - Https порт. По умолчанию 443. | |||
* '''is_https_enabled''' - Индикатор включен ли https. | |||
* '''is_http_redirected''' - Индикатор включена ли переадресация http to https. | |||
* '''cert_name''' - Имя сертификата сервера. | |||
Example | |||
{ | |||
"http_port": 80, | |||
"https_port": 443, | |||
"is_https_enabled": false, | |||
"is_http_redirected": true, | |||
"cert_name": "" | |||
} | |||
=== SUB <code>lm/system_settings/certificates/upload_certificate</code> === | |||
Загружает сертификат и его ключ для дальнейшего использования в настройках доступа. | |||
{ | Payload format | ||
{ | |||
cert_name: str | |||
certificate: bytes | |||
key: bytes | |||
intermediate: bytes | |||
} | |||
* '''cert_name''' - Читаемое имя сертификата. | |||
* '''certificate''' - x.509 сертификат в pem формате. | |||
* '''key''' - Приватный ключ в pem формате. | |||
* '''intermediate''' - (Опционально) промежуточный сертификат. | |||
=== SUB <code>lm/system_settings/certificates/upload_certificate_corresponding_csr</code> === | |||
Загружает сертификат относящийся к сформированному ранее csr. | |||
{ | Payload format | ||
{ | |||
} | cert_name: str | ||
certificate: bytes | |||
} | |||
* '''cert_name''' - Имя csr сертификата. | |||
* '''certificate''' - x.509 сертификат в pem формате. | |||
=== SUB <code>lm/system_settings/certificates/delete_certificate</code> === | |||
== SUB <code>lm/system_settings/ | Удаляет сертификат и все связанные с ним файлы. | ||
Payload format | |||
{ | |||
<span id=" | id: int | ||
name: str | |||
cert_type: str | |||
public_bytes: str | |||
params: dict[str, Any] | |||
} | |||
* '''id''' - (Опционально) Идентификатор сертификата. | |||
* '''name''' - Имя сертификата. | |||
* '''cert_type''' - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’ | |||
* '''public_bytes''' - Открытый ключ сертификата. | |||
* '''params''' - Словарь с параметрами сертификата. Набор параметров отличается в зависимости от [[#certificate-params-format|типа]] сертификата.<span id="example-4"></span> | |||
Example | |||
=== | { | ||
"cert_type": "certificate", | |||
"name": "cert_name", | |||
"params": { | |||
"issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA", | |||
"san": "IP=192.168.0.3", | |||
"subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA", | |||
"valid_from": "1664440221.0", | |||
"valid_to": "1759048221.0" | |||
}, | |||
"public_bytes": "-----BEGIN CERTIFICATE-----\n" | |||
"-----END CERTIFICATE-----\n"}] | |||
=== SUB <code>lm/system_settings/certificates/generate_csr</code> === | |||
Генерирует Certificate Signing Request. | |||
<span id="example- | Payload format | ||
{ | |||
cert_name: str | |||
cert_type: str | |||
key_size: int | |||
subject: str | |||
san: str | |||
} | |||
* '''cert_name''' - Имя сертификата. | |||
* '''cert_type''' - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’ | |||
* '''key_size''' - Размер ключа в байтах. Принимает значения 2048 иои 4096. | |||
* '''subject''' - Строка в формате rfc4514. | |||
* '''san''' - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами <code>IP=</code> или <code>DNS=</code>.<span id="example-5"></span> | |||
Example | |||
{ | |||
"cert_name": "ss_cert23", | |||
"cert_type": "certificate", | |||
"key_size": 2048, | |||
"subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA", | |||
"san": "IP=192.168.0.3,DNS=domain.com" | |||
} | |||
=== SUB <code>lm/system_settings/certificates/generate_self_sign_certificate</code> === | |||
Генерирует самоподписанный сертификат. | |||
{ | Payload format | ||
{ | |||
cert_name: str | |||
cert_type: str | |||
key_size: int | |||
subject: str | |||
san: str | |||
} | |||
* '''cert_name''' - Имя сертификата. | |||
* '''cert_type''' - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’. | |||
* '''key_size''' - Размер ключа в байтах. Принимает значения 2048 иои 2096. | |||
* '''subject''' - Строка в формате rfc4514. | |||
* '''san''' - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами <code>IP=</code> или <code>DNS=</code>. | |||
Example | |||
{ | |||
"cert_name": "ss_cert23", | |||
"cert_type": "certificate", | |||
} | "key_size": 2048, | ||
"subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA", | |||
"san": "IP=192.168.0.3,DNS=domain.com" | |||
} | |||
=== PUB <code>lm/system_settings/network/interfaces/wired/eth*/statistics</code> === | |||
<code>PUB lm/system_settings/network/interfaces/wired/eth0/statistics</code> | |||
<code>PUB lm/system_settings/network/interfaces/wired/eth1/statistics</code> | |||
Публикует информацию о проводном интерфейсе ethernet каждые 10 секунд. | |||
Payload format | |||
{ | |||
status: str | |||
ip_assign_method: Literal['manual', 'dhcp'] | |||
ip: str | |||
netmask: str | |||
gateway: str | |||
dns_assign_method: Literal['manual', 'dhcp'] | |||
dns_servers: list[str] | |||
mac_address: str | |||
} | |||
* '''status''' - Статус интерфейса. Может быть <code>up</code> или <code>down</code>. | * '''status''' - Статус интерфейса. Может быть <code>up</code> или <code>down</code>. | ||
* '''ip_assign_method''' - Способ назначения ip адреса. Может быть <code>manual</code> или <code>dhcp</code>. | * '''ip_assign_method''' - Способ назначения ip адреса. Может быть <code>manual</code> или <code>dhcp</code>. | ||
* ''' | * '''ip''' - IP адрес интерфейса. | ||
* '''netmask''' - Маска интерфейса. | |||
* '''gateway''' - Шлюз по умолчанию. | * '''gateway''' - Шлюз по умолчанию. | ||
* '''dns_assign_method''' - Способ назначения dns серверов. Может быть <code>manual</code> или <code>dhcp</code>. | * '''dns_assign_method''' - Способ назначения dns серверов. Может быть <code>manual</code> или <code>dhcp</code>. | ||
* '''dns_servers''' - Список dns серверов. | * '''dns_servers''' - Список dns серверов. | ||
* ''' | * '''mac_address''' - MAC адрес интерфейса. | ||
{ | Example | ||
{ | |||
"status": "up", | "status": "up", | ||
"ip_assign_method": "manual", | "ip_assign_method": "manual", | ||
| Строка 2271: | Строка 2122: | ||
"dns_assign_method": "manual", | "dns_assign_method": "manual", | ||
"dns_servers": ["8.8.8.8", "8.8.4.4"], | "dns_servers": ["8.8.8.8", "8.8.4.4"], | ||
" | "mac_address": "e4:5f:01:a8:e0:6c" | ||
} | |||
} | |||
<span id="sub- | === SUB <code>lm/system_settings/network/interfaces/wired/eth*/set_ip_credential</code> === | ||
SUB <code>lm/system_settings/network/interfaces/wired/eth0/set_ip_credential</code><span id="sub-lmsystem_settingsnetworkinterfaceswiredeth1set_ip_credential"></span>SUB <code>lm/system_settings/network/interfaces/wired/eth1/set_ip_credential</code> | |||
Устанавливает ip адресацию и шлюз на интерфейс. | Устанавливает ip адресацию и шлюз на интерфейс. | ||
| Строка 2294: | Строка 2132: | ||
Поддерживает статическое назначение ip и назначение через dhcp. | Поддерживает статическое назначение ip и назначение через dhcp. | ||
<span id="payload-format- | <span id="payload-format-10"></span> | ||
=== Payload format === | === Payload format === | ||
Статическая адресация: | Статическая адресация: | ||
{ | |||
{ | |||
ip_assign_method: Literal['manual'] | ip_assign_method: Literal['manual'] | ||
static_ip: str | static_ip: str | ||
static_netmask: str | static_netmask: str | ||
static_gateway: str | static_gateway: str | ||
} | } | ||
* '''ip_assign_method''' - Способ назначения ip адреса. Должно быть <code>manual</code>. | * '''ip_assign_method''' - Способ назначения ip адреса. Должно быть <code>manual</code>. | ||
* '''static_ip''' - IPv4 адрес интерфейса | * '''static_ip''' - IPv4 адрес интерфейса | ||
| Строка 2310: | Строка 2147: | ||
* '''static_gateway''' - Шлюз по умолчанию. | * '''static_gateway''' - Шлюз по умолчанию. | ||
{ | Example | ||
{ | |||
"ip_assign_method": "manual", | "ip_assign_method": "manual", | ||
"static_ip": "192.168.0.205", | "static_ip": "192.168.0.205", | ||
"static_netmask": "255.255.255.0", | "static_netmask": "255.255.255.0", | ||
"static_gateway": "192.168.0.1" | "static_gateway": "192.168.0.1" | ||
} | } | ||
{ | Динамическая адресация | ||
{ | |||
ip_assign_method: Literal['dhcp'] | ip_assign_method: Literal['dhcp'] | ||
} | } | ||
* '''ip_assign_method''' - Способ назначения ip адреса. Должно быть <code>dhcp</code>. | * '''ip_assign_method''' - Способ назначения ip адреса. Должно быть <code>dhcp</code>. | ||
<span id="example-9"></span>Example | |||
{ | |||
"ip_assign_method": "dhcp" | |||
} | |||
=== SUB <code>lm/system_settings/network/interfaces/wired/eth*/set_dns_credential</code> === | |||
SUB <code>lm/system_settings/network/interfaces/wired/eth0/set_dns_credential</code> | |||
SUB <code>lm/system_settings/network/interfaces/wired/eth1/set_dns_credential</code> | |||
Назначение dns серверов на интерфейс. | Назначение dns серверов на интерфейс. | ||
| Строка 2342: | Строка 2177: | ||
Поддерживает статическое и динамическое (dhcp) назначение dns серверов. | Поддерживает статическое и динамическое (dhcp) назначение dns серверов. | ||
Payload format | |||
Статическое назначение: | Статическое назначение: | ||
{ | |||
{ | |||
dns_assign_method: Literal['manual'] | dns_assign_method: Literal['manual'] | ||
static_dns_servers: list[str] | static_dns_servers: list[str] | ||
} | } | ||
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>manual</code>. | * '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>manual</code>. | ||
* '''static_dns_servers''' - Список DNS серверов. | * '''static_dns_servers''' - Список DNS серверов.<span id="example-10"></span>Example | ||
{ | |||
<span id="example- | "dns_assign_method": "manual", | ||
{ | |||
"dns_assign_method": "manual", | |||
"static_dns_servers": ["8.8.8.8", "8.8.4.4"] | "static_dns_servers": ["8.8.8.8", "8.8.4.4"] | ||
} | } | ||
Динамическое назначение: | Динамическое назначение: | ||
{ | |||
{ | |||
dns_assign_method: Literal['dhcp'] | dns_assign_method: Literal['dhcp'] | ||
} | } | ||
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>dhcp</code>. | * '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>dhcp</code>. | ||
{ | Example | ||
{ | |||
"dns_assign_method": "dhcp" | "dns_assign_method": "dhcp" | ||
} | } | ||
=== PUB <code>lm/system_settings/network/interfaces/modem/statistics</code> === | |||
== | Публикует информацию о модемном интерфейсе каждые 10 секунд. | ||
Payload format | |||
{ | |||
ip_assign_method: Literal['manual', 'dhcp'] | |||
ip: str | |||
netmask: str | |||
gateway: str | |||
dns_assign_method: Literal['manual', 'dhcp'] | |||
dns_servers: list[str] | |||
apn: { | |||
apn: str, | |||
username: str, | |||
password: str, | |||
{ | |||
} | } | ||
* ''' | modem_status: { | ||
state: str, | |||
< | state_failed_reason: str, | ||
power_state: str, | |||
signal_quality: int, | |||
access_technologies: list[str] | |||
} | |||
} | |||
* '''status''' - Статус интерфейса. Может быть <code>up</code> или <code>down</code>. | |||
* '''ip_assign_method''' - Способ назначения ip адреса. Может быть <code>manual</code> или <code>dhcp</code>. | |||
* '''netmask''' - IP адрес интерфейса. | |||
* '''gateway''' - Шлюз по умолчанию. | |||
* '''dns_assign_method''' - Способ назначения dns серверов. Может быть <code>manual</code> или <code>dhcp</code>. | |||
* '''dns_servers''' - Список dns серверов. | |||
* '''apn''': | |||
** '''apn''': APN сервер. | |||
** '''username''': Имя пользователя для apn сервера. | |||
** '''password''': Пароль для apn сервера. | |||
* '''modem_status''': | |||
** '''state''': Состояние подключения. | |||
** '''state_failed_reason''': Причина ошибки если таковая есть. | |||
** '''power_state''': Состояние питания модема. | |||
** '''signal_quality''': Качество сигнала в процентах. | |||
** '''access_technologies''': Список текущих режимов (LTE, UMTS и т.д.). | |||
Example | |||
{ | |||
"status": "up", | |||
"ip_assign_method": "manual", | |||
"ip": "192.168.0.205", | |||
"netmask": "255.255.255.0", | |||
"gateway": "192.168.0.1", | |||
"dns_assign_method": "manual", | |||
"dns_servers": ["8.8.8.8", "8.8.4.4"], | |||
"apn": { | |||
"apn": "internet.mts.ru", | |||
"username": "mts", | |||
"password": "mts" | |||
}, | |||
"modem_status": { | |||
"state": "connected", | |||
"state_failed_reason": "--", | |||
"power_state": "on", | |||
"signal_quality": 81, | |||
"access_technologies": ["LTE"] | |||
} | |||
} | |||
=== SUB <code>lm/system_settings/network/interfaces/modem/set_ip_credential</code> === | |||
Устанавливает ip адресацию и шлюз на интерфейс. | |||
Поддерживает статическое назначение ip и назначение через dhcp. | |||
Payload format | |||
Статическая адресация | |||
{ | |||
ip_assign_method: Literal['manual'] | |||
static_ip: str | |||
static_netmask: str | |||
<code> | static_gateway: str | ||
} | |||
* '''ip_assign_method''' - Способ назначения ip адреса. Должно быть <code>manual</code>. | |||
* '''static_ip''' - IPv4 адрес интерфейса | |||
* '''static_netmask''' - Сетевая маска интерфейса. | |||
* '''static_gateway''' - Шлюз по умолчанию.<span id="example-13"></span>Example | |||
{ | |||
"ip_assign_method": "manual", | |||
"static_ip": "192.168.0.205", | |||
"static_netmask": "255.255.255.0", | |||
"static_gateway": "192.168.0.1" | |||
} | |||
Динамическая адресация | |||
{ | |||
ip_assign_method: Literal['dhcp'] | |||
} | |||
* '''ip_assign_method''' - Способ назначения ip адреса. Должно быть <code>dhcp</code>. | |||
<span id="example-14"></span>Example | |||
{ | |||
"ip_assign_method": "dhcp" | |||
} | |||
=== SUB <code>lm/system_settings/network/interfaces/modem/set_dns_credential</code> === | |||
Назначение dns серверов на интерфейс. | |||
Поддерживает статическое и динамическое (dhcp) назначение dns серверов. | |||
Payload format | |||
Статическое назначение: | |||
{ | |||
dns_assign_method: Literal['manual'] | |||
static_dns_servers: list[str] | |||
} | |||
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>manual</code>. | |||
* '''static_dns_servers''' - Список DNS серверов. | |||
Example | |||
{ | |||
"dns_assign_method": "manual", | |||
"static_dns_servers": ["8.8.8.8", "8.8.4.4"] | |||
} | |||
Динамическое назначение | |||
{ | |||
dns_assign_method: Literal['dhcp'] | |||
} | |||
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>dhcp</code>.<span id="example-16"></span> | |||
Example | |||
{ | |||
"dns_assign_method": "dhcp" | |||
} | |||
=== SUB <code>lm/system_settings/network/interfaces/modem/set_apn_credential</code> === | |||
<code> | Назначение настроек apn на интерфейс. | ||
Поддерживается только статическое назначение. | |||
Payload format | |||
Статическое назначение: | |||
{ | |||
apn: str | |||
username: str | |||
password: str | |||
} | |||
* '''apn''' - APN сервер. | |||
* '''username''' - Имя пользователя если есть либо пустая строка. | |||
* '''password''' - Пароль если есть либо пустая строка. | |||
Example | |||
{ | |||
"apn": "internet.mts.ru", | |||
"username": "mts", | |||
"password": "mts" | |||
} | |||
=== PUB <code>lm/system_settings/datetime/rtc_status</code> === | |||
<code> | Публикует статус rtc модуля | ||
Payload format | |||
{ | |||
is_active: bool | |||
} | |||
* '''is_active''' - Активен ли rtc модуль. | |||
Example | |||
{ | |||
"is_active": true, | |||
} | |||
=== SUB <code>lm/system_settings/datetime</code> === | |||
Принимает [[#base-format-for-command-payload|команды]] на изменение даты и времени конфигурации системы. | |||
Список принимаемых команд | |||
'''Set Date''' | |||
Description: > Set system | Description: > Set system date. | ||
Values: | Values: | ||
command: str > | command: str > set_date | ||
data: dict > | data: dict > date: str - date in format ‘Y:M:D’ | ||
Example:<br /> | Example:<br /><code>{'command': 'set_date', 'data': {'date': '1970:01:01'}}</code> | ||
<code>{'command': ' | |||
'''Set Time''' | |||
Description: > Set system time. | |||
Values: | |||
command: str > set_time | |||
data: dict > time: str - time in format ‘HH:mm:ss’ | |||
Example:<br /><code>{'command': 'set_time', 'data': {'time': '13:00:00'}}</code> | |||
'''Set Datetime''' | |||
Description: > Set system date and time. | |||
Values: | |||
command: str > set_datetime | |||
data: dict > datetime: str - time in format ‘Y:M:D HH:mm:ss’ | |||
Example:<br /><code>{'command': 'set_datetime', 'data': {'datetime': '1970:01:01 13:00:00'}}</code> | |||
'''Change Ntp Status''' | |||
Description: > Enable or disable ntp synchronization. | |||
Values: | |||
command: str > change_ntp_status | |||
data: dict > ntp: bool - is ntp sync enable | |||
{ | Example:<br /><code>{'command': 'change_ntp_status', 'data': {'ntp': True}}</code> | ||
} | |||
'''Set Ntp Servers''' | |||
Description: > Set ntp servers. > Generate ntp config, replace it then restart systemd-timesyncd.service > Accepts list of ip addresses or domain names | |||
Values: | |||
command: str > set_ntp_servers | |||
data: dict > ntp_servers: list[str] - list of servers ip addresses or dns names | |||
Example:<br /><code>{'command': 'set_ntp_servers', 'data': {'ntp_servers': ['192.168.0.2', 'ntp1.stratum2.com']}}</code> | |||
'''Set timezone''' | |||
Description: > Set system timezone. | |||
Values: | |||
command: str > set_timezone | |||
data: dict > timezone: str - timezone name | |||
< | Example:<br /><code>{'command': 'set_timezone', 'data': {'timezone': 'Europe/London'}}</code> | ||
Base format for command payload | |||
{ | |||
'command': str | |||
'data': dict[str, Any] | |||
} | |||
* '''command''' - command name | |||
* '''data''' - any data for command | |||
Example: | |||
<code>{'command': 'set_ip', 'data': {'ifname': 'eth0', 'ip': '192.168.0.1'}}</code> | |||
< | === SUB <code>lm/system_settings/power_control</code> === | ||
Управляет питанием устройства | |||
Payload format | |||
* ''' | { | ||
command: str | |||
delay: int | |||
} | |||
* '''command''' - Команда управления питанием. Может принимать значения “reboot” и “shutdown”. | |||
* '''delay''' - Задержка срабатывания команды в минутах. | |||
Example | |||
{ | |||
"command": "reboot", | |||
"delay": "0", | |||
} | |||
'''Certificate params format''' | |||
< | Парамеры сертификата отличаются в зависимости от его типа. В данный момент поддерживается два типа сертификата x509: <code>certificate</code> и <code>csr</code>. | ||
x509 certificate params format | |||
{ | |||
* ''' | subject: str | ||
san: str | |||
< | issuer: str | ||
valid_from: float | |||
valid_to: float | |||
} | |||
* '''subject''' - Строка в формате rfc4514. | |||
* '''san''' - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами <code>IP=</code> или <code>DNS=</code>. | |||
* '''issuer''' - Строка в формате rfc4514. | |||
* '''valid_from''' - Дата с которой сертификат действителен. Формат Posix timestamp. | |||
* '''valid_to''' - Дата по которую сертификат действителен. Формат Posix timestamp. | |||
Example | |||
{ | |||
=== | "issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA", | ||
"san": "IP=192.168.0.3", | |||
"subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA", | |||
"valid_from": "1664440221.0", | |||
"valid_to": "1759048221.0" | |||
} | |||
'''x509 csr params format''' | |||
{ | |||
subject: str | |||
san: str | |||
} | |||
* '''subject''' - Строка в формате rfc4514. | |||
* '''san''' - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами <code>IP=</code> или <code>DNS=</code>. | |||
Example | |||
== | { “subject”: “OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA”, “san”: “IP=192.168.0.3”, } | ||
<span id=" | == 11. Обновление программного обеспечения плеера == | ||
<span id="pub-lmupdate_serviceversionversion_list"></span> | |||
=== PUB <code>lm/update_service/version/version_list</code> === | |||
Публикует список версий всех модулей. Топик всегда содержит актуальный список. | |||
< | |||
Payload format<pre>[ | |||
{ | |||
id: int | |||
version: str | |||
subversion: Optional[str] | |||
module: str | |||
description: Optional[str] | |||
} | |||
]</pre> | |||
* '''id''' - version id | |||
* '''version''' - version number | |||
* '''subversion''' - (Optional) subversion. | |||
* '''module''' - module name | |||
* '''description''' - (Optional) description | |||
Example | |||
[ | |||
{ | |||
"id": 1, | |||
"version": "20", | |||
"subversion": null, | |||
"module": "frontend", | |||
"description": null | |||
} | |||
] | |||
=== PUB <code>lm/update_service/update/update_list'</code> === | |||
Публикует список обновлений. Топик всегда содержит актуальный список. | |||
Payload format<pre>[ | |||
{ | |||
id: int | |||
version: str | |||
status: str | |||
filename: Optional[str] | |||
update_path: str | |||
extracted_path: Optional[str] | |||
backup_path: Optional[str] | |||
description: Optional[str] | |||
} | |||
]</pre> | |||
* '''id''' - update id. | |||
* '''version''' - update version. | |||
* '''status''' - update status. | |||
* '''filename''' - (Optional) update filename. | |||
* '''update_path''' - path to update file. | |||
* '''extracted_path''' - path to extracted files. | |||
* '''backup_path''' - (Optional) update version. | |||
* '''description''' - (Optional) description. | |||
Example | |||
[ | |||
{ | |||
"id": 1, | |||
"version": "2022", | |||
"status": "installed", | |||
"filename": "lmp_2022.update", | |||
"update_path": "/home/lightmaster/lightmaster/updater/lmp_2022.update", | |||
"extracted_path": "/home/lightmaster/lightmaster/updates_store/lmp_2022", | |||
"backup_path": "/home/lightmaster/lightmaster/backups_store/20220519181452_lmp_v0_full_backup", | |||
"description": "A error occurred during installation update. Installation filed. None" | |||
} | |||
] | |||
=== SUB <code>lm/update_service/update/add_update</code> === | |||
== | Добавляет обновление в базу. | ||
Payload format<pre>{ | |||
file: str | |||
}</pre> | |||
* '''file: str''' - путь до файла обновления | |||
<span id="example-2"></span>Example | |||
{"file": "/home/lightmaster/projects/wess-group/lightmaster/updater/lmp_2022.update"} | |||
=== SUB <code>lm/update_service/update/check_update</code> === | |||
Проверяет совместимость обновления. | |||
<pre>{ | Payload format<pre>{ | ||
id: int | |||
}</pre> | }</pre> | ||
* ''' | * '''id''' - id обновления | ||
<span id=" | Example | ||
{'id': 5} | |||
<span id="sub-lmupdate_serviceupdateinitial_update"></span> | |||
< | === SUB <code>lm/update_service/update/initial_update</code> === | ||
Совмещает добавление обновления в базу и его проверку. | |||
< | Payload format<pre>{ | ||
file: str | |||
}</pre> | |||
* '''file: str''' - путь до файла обновления | |||
Example | |||
{"file": "/home/lightmaster/projects/wess-group/lightmaster/updater/lmp_2022.update"} | |||
< | === SUB <code>lm/update_service/update/install_update</code> === | ||
Устанавливает обновление | |||
- | Payload format<pre>{ | ||
id: int | |||
}</pre> | |||
* '''id''' - id обновления | |||
Example | |||
{'id': 5} | |||
=== SUB <code>lm/update_service/update/restore_update</code> === | |||
Откатывает обновление на предыдущую версию. | |||
{ | Payload format<pre>{ | ||
id: int | |||
}</pre> | |||
* '''id''' - id обновления | |||
Example | |||
{'id': 5} | |||
=== SUB <code>lm/update_service/update/delete_update</code> === | |||
Удаляет обновление и все связанные с ним файлы. | |||
Payload format<pre>{ | |||
id: int | |||
}</pre> | |||
* '''id''' - id обновления | |||
Example | |||
{'id': 5} | |||
=== SUB <code>lm/update_service/version/get_versions_list</code> === | |||
Запрос на публикацию списка версий всех модулей.<br /> | |||
Публикация происходит в топик <code>lm/update_service/version/get_versions_list/response</code> | |||
В заголовок запроса могут быть включены необязательные поля: | |||
* Correlation data | |||
* Response topic | |||
'''Corelation data''' любой уникальный идентификатор запроса. Зеркально устанавливается в публикуемый ответ и служит для идентификации ответа со стороны клиента. | |||
'''Response topic''' если установлен то ответ публикуется в указанный топик вместо стандартного. | |||
< | === PUB <code>lm/update_service/version/get_versions_list/response</code> === | ||
Публикует ответ на запрос из топика <code>lm/update_service/version/get_versions_list</code>. | |||
Выставляет заголовок '''Correlation data''' если он был установлен в запросе. | |||
----- | Payload format<pre>[ | ||
{ | |||
id: int | |||
version: str | |||
subversion: Optional[str] | |||
module: str | |||
description: Optional[str] | |||
} | |||
]</pre> | |||
* '''id''' - version id | |||
* '''version''' - version number | |||
* '''subversion''' - (Optional) subversion. | |||
* '''module''' - module name | |||
* '''description''' - (Optional) description | |||
Example | |||
[ | |||
{ | |||
"id": 1, | |||
"version": "20", | |||
"subversion": null, | |||
"module": "frontend", | |||
"description": null | |||
} | |||
] | |||
< | === SUB <code>lm/update_service/version/get_module_version</code> === | ||
Публикует версию конкретного модуля. | |||
Публикация происходит в топик <code>lm/update_service/version/get_module_version/response</code> | |||
< | |||
В заголовок запроса могут быть включены необязательные поля: | |||
* Correlation data | |||
* Response topic | |||
'''Corelation data''' любой уникальный идентификатор запроса. Зеркально устанавливается в публикуемый ответ и служит для идентификации ответа со стороны клиента. | |||
'''Response topic''' если установлен то ответ публикуется в указанный топик вместо стандартного. | |||
< | Payload format<pre>{ | ||
module: str | |||
}</pre> | |||
* '''module''' - название модуля | |||
{ | Example | ||
{'module': 'update_service'} | |||
=== PUB <code>lm/update_service/version/get_module_version/response</code> === | |||
Публикует ответ на запрос из топика <code>lm/update_service/version/get_module_version</code>. | |||
Выставляет заголовок '''Correlation data''' если он был установлен в запросе. | |||
Payload format<pre>{ | |||
id: int | |||
version: str | |||
subversion: Optional[str] | |||
module: str | |||
description: Optional[str] | |||
}</pre> | |||
* '''id''' - version id | |||
* '''version''' - version number | |||
* '''subversion''' - (Optional) subversion. | |||
* '''module''' - module name | |||
* '''description''' - (Optional) description | |||
Example | |||
{ | |||
"id": 1, | |||
"version": "20", | |||
"subversion": null, | |||
"module": "frontend", | |||
"description": null | |||
} | |||
=== SUB <code>lm/update_service/update/get_updates_list</code> === | |||
Запрос на публикацию списка всех обновлений добавленных в базу. | |||
< | Публикация происходит в ветку <code>lm/update_service/update/get_updates_list/response</code> | ||
В заголовок запроса могут быть включены необязательные поля: | |||
* Correlation data | |||
* Response topic | |||
'''Corelation data''' любой уникальный идентификатор запроса. Зеркально устанавливается в публикуемый ответ и служит для идентификации ответа со стороны клиента. | |||
'''Response topic''' если установлен то ответ публикуется в указанный топик вместо стандартного. | |||
=== PUB <code>lm/update_service/update/get_updates_list/response</code> === | |||
Публикует ответ на запрос из топика <code>lm/update_service/update/get_updates_list</code>. | |||
Выставляет заголовок '''Correlation data''' если он был установлен в запросе. | |||
<pre>[ | Payload format<pre>[ | ||
{ | { | ||
id: int | id: int | ||
| Строка 3036: | Строка 2856: | ||
* '''description''' - (Optional) description. | * '''description''' - (Optional) description. | ||
[ | Example | ||
[ | |||
{ | { | ||
"id": 1, | "id": 1, | ||
| Строка 3050: | Строка 2869: | ||
"description": "A error occurred during installation update. Installation filed. None" | "description": "A error occurred during installation update. Installation filed. None" | ||
} | } | ||
] | ] | ||
=== PUB <code>lm/update_service/error</code> === | |||
== | Публикует ошибки. | ||
Выставляет заголовок '''Correlation data''' если он был установлен в запросе. | |||
Payload format<pre>{ | |||
<pre>{ | |||
msg: str | msg: str | ||
data: Any | data: Any | ||
| Строка 3400: | Строка 2884: | ||
* '''msg''' - contain error message | * '''msg''' - contain error message | ||
* '''data''' - contain related error data | * '''data''' - contain related error data | ||
Текущая версия от 03:42, 2 июля 2026
Документ описывает MQTT API плеера LS Player v1.3.4. Материал сгруппирован в четыре смысловых блока, чтобы было проще ориентироваться:
- I. Логика воспроизведения (разделы 1–3) — что и когда играть: плеер, настройки проигрывания, расписание.
- II. Оборудование и интерфейсы (разделы 4–8) — физические устройства и интерфейсы: ArtNet/RDM, DI/DO, внешние датчики, RS485, светодиоды.
- III. Триггеры и actions (раздел 9) — автоматизация реакции на внешние события.
- IV. Система и обслуживание (разделы 10–11) — администрирование устройства: системные настройки, обновление ПО.
Как читать документ. Каждый раздел описывает MQTT-топики сервиса. Префикс в заголовке топика означает направление обмена с точки зрения плеера:
- PUB — плеер публикует в этот топик данные (состояние, списки, события, ошибки). Чтобы получать их, клиент подписывается на топик. Многие PUB-топики публикуются с флагом retained — последнее значение приходит сразу при подписке.
- SUB — плеер подписан на этот топик и ждёт в нём команды. Чтобы дать команду, клиент публикует в топик сообщение в формате, указанном в «Payload format» (пример — в «Example»).
Если вы впервые знакомитесь с API — рекомендуется читать по порядку, начиная с блока I. Если ищете конкретный топик — можно сразу перейти к нужному разделу через оглавление.
К статье прилагается демонстрационный flow для Node-RED («MQTT API v1.3.4 - Node-Red demo flow.json»): в нём для каждого раздела собраны готовые примеры запросов (узлы inject) и подписки на ответы (узлы debug), номера блоков во flow совпадают с номерами разделов этой статьи. Самый быстрый способ разобраться в API — импортировать flow, нажимать кнопки inject и смотреть ответы плеера в панели Debug.
I. Логика воспроизведения
Что и когда играть: прямое управление плеером, настройки проигрывания и расписание. Начните отсюда, если хотите понять базовую работу плеера.
1. Управление проигрыванием
Описывает MQTT API сервиса проигрывания.
Сервис осуществляет проигрывание анимаций по группам воспроизведения (group_id). Каждая группа независимо проигрывает свой контент (cue, плейлист, статическую заливку или blackout) и имеет собственный текущий приоритет. Список и состав групп определяется конфигурацией фикстур (lm/settings/fixture).
Что изменилось в v1.3.4 по сравнению с v1.2.4: раздел переведён на модель групп воспроизведения. Появился основной топик управления lm/player/commands (apply/apply_each/update_state, действия play/blackout/static_color/stop). Старый топик lm/player сохранён, но помечен как legacy/deprecated. Топики статистики lm/statistic/playing_progress_info и lm/statistic/playing_ent_info удалены и заменены единым снимком lm/player/state. Топик lm/statistic/current_playing_priority заменён на per-group снимок lm/player/current_playing_priority. Инвертирована семантика приоритета: было «чем меньше число, тем выше приоритет» → стало «чем больше число, тем выше приоритет» (0 - минимальный приоритет).
SUB lm/player/commands
Принимает команды управления проигрыванием. Поддерживаются команды apply, apply_each и update_state.
Apply
Применяет одно действие ко всем указанным группам.
Payload format
{
"cmd": "apply",
"priority": Union[int, 'buttons', 'scheduler', 'trigger'],
"groups": list[str],
"action": GroupAction,
}
Example
{
"cmd": "apply",
"priority": "buttons",
"groups": ["roof", "back"],
"action": {
"type": "play",
"entity_type": "cue",
"entity_id": 42,
"count": null
}
}
- cmd - Литерал "apply".
- priority - Приоритет команды. Целое число (0 - минимальный приоритет, чем больше значение - тем выше приоритет) либо именованная маска "buttons" / "scheduler" / "trigger".
- groups - Список ID групп, к которым применяется действие. Если хотя бы одна из указанных групп не существует - вся команда отклоняется.
- action - Объект GroupAction, общий для всех групп из groups.
Apply each
Применяет разные действия к разным группам в одном сообщении.
Payload format
{
"cmd": "apply_each",
"priority": Union[int, 'buttons', 'scheduler', 'trigger'],
"actions": {
str: GroupAction,
...
},
}
Example
{
"cmd": "apply_each",
"priority": "buttons",
"actions": {
"roof": {"type": "play", "entity_type": "playlist", "entity_id": 1, "count": null},
"back": {"type": "blackout"},
"front": {"type": "stop"}
}
}
- cmd - Литерал "apply_each".
- priority - Общий приоритет для всех действий в сообщении.
- actions - Словарь group_id → GroupAction. Неизвестные группы пропускаются, остальные действия из сообщения продолжают обрабатываться.
Update state
Служебная команда запроса актуального playback-state (провоцирует внеочередную публикацию lm/player/state).
Payload format
{
"cmd": "update_state"
}
GroupAction
Дискриминация выполняется по полю type.
Play - запускает playlist или cue на группе.
{
"type": "play",
"entity_type": Union['playlist', 'cue'],
"entity_id": Union[int, str],
"count": Optional[int],
}
- entity_type - Тип сущности: playlist или cue.
- entity_id - ID сущности.
- count - Количество повторов. null означает бесконечное проигрывание.
Blackout - включает на группе zero-cue, который держит каналы группы в нуле.
{
"type": "blackout"
}
Stop - останавливает проигрывание на группе и проверяет, есть ли актуальное событие расписания. Если в runtime ничего не проигрывается на группе, stop игнорируется.
{
"type": "stop"
}
Static color - включает на группе статическое DMX-состояние. Значения задаются по семантическому типу канала; runtime разворачивает их в реальные DMX-каналы по текущим patch settings.
{
"type": "static_color",
"channels": { "<channel_type>": int }
}
- channels - Объект channel_type → DMX-значение (целые 0-255). Каналы группы, для которых тип не задан, выставляются в 0. Неизвестный или отсутствующий в группе channel_type игнорируется. Пустой channels → все каналы группы 0.
Example
{
"cmd": "apply",
"priority": "buttons",
"groups": ["front", "back"],
"action": {
"type": "static_color",
"channels": {"red": 255, "green": 128, "blue": 0}
}
}
Поведение
- Для apply наличие хотя бы одной неизвестной группы отклоняет всю команду. Для apply_each неизвестные группы пропускаются.
- Для play в apply, если сущность не найдена, отклоняется вся команда. Для play в apply_each пропускается только соответствующая группа.
- Приоритет задаётся на уровне всей команды. Если в runtime уже есть активное проигрывание и текущий приоритет группы выше приоритета команды - действие для этой группы игнорируется.
- play, blackout и static_color используют текущие настройки перехода из lm/settings/player/effect_between_playing_command и lm/settings/player/duration_effect_between_playing_command.
- stop вызывает fade-out с текущим значением duration_effect_between_playing_command, затем сбрасывает приоритет группы к минимальному и инициирует перепроверку расписания для этой группы.
SUB lm/player (legacy, deprecated)
Принимает команды play и stop и применяет действие ко всем группам сразу. Поддерживается для совместимости со старыми клиентами; для нового кода используйте lm/player/commands.
Play (legacy)
Payload command format
{
"cmd": "play",
"what_playing": Union['playlist', 'cue'],
"entity": Union[int, str],
"count": Optional[int],
"priority": Union[int, 'buttons', 'scheduler', 'trigger'],
}
Example
{
"cmd": "play",
"what_playing": "cue",
"entity": 5,
"count": null,
"priority": "buttons"
}
- cmd - Название команды.
- what_playing - Тип сущности для воспроизведения. Принимает значения "playlist" и "cue".
- entity - ID или наименование проигрываемой сущности.
- count - Опциональный параметр. Количество повторений проигрывания. Если не задан или равен null, проигрывание продолжится до получения следующей команды с равным или более высоким приоритетом.
- priority - Приоритет команды: число или именованная маска buttons / scheduler / trigger.
Stop (legacy)
Payload stop command format
{
"cmd": "stop",
"priority": Union[int, 'buttons', 'scheduler', 'trigger'],
}
Example
{
"cmd": "stop",
"priority": "buttons"
}
PUB lm/player/state
Публикует полный снимок текущего состояния воспроизведения всех групп. Сообщение публикуется с флагом retain=true, поэтому новый подписчик сразу получает последнее актуальное состояние от брокера.
Публикация выполняется: при изменении контента на любой группе; при переходе на другую сцену внутри плейлиста; при появлении или исчезновении затухающих (stale) слоёв; при изменении frame_rate; при остановке сервиса (публикуется пустое состояние).
frame_rate, current_frame, total_frames и timestamp позволяют подписчику самостоятельно посчитать прогресс и оставшееся время воспроизведения.
Payload format
{
"groups": {
str: {
"now": Layer | null,
"stale": [Layer, ...],
},
...
},
"frame_rate": float,
"timestamp": int,
}
Layer
{
"group_id": str,
"playback_id": str,
"content": Content,
"is_playing": bool,
"weight": float,
"current_frame": int,
"total_frames": int,
"playlist_id": Optional[str],
"playlist_name": Optional[str],
"scene_index": Optional[int],
"total_scenes": Optional[int],
"sequence_repeat": Optional[int],
}
Content - что именно играет на слое, объект с дискриминатором type:
- Записанный cue:
{ "type": "recorded", "cue_id": str } - Статическая заливка:
{ "type": "static_color", "channels": dict[str, int] }(0-255) - Blackout:
{ "type": "blackout" }- группа удерживается в нуле, дополнительных полей нет.
Example
{
"groups": {
"group_1": {
"now": {
"group_id": "group_1",
"playback_id": "7f3a9c2e-4b1d-4e0a-9c3f-2a1b6d8e0f11",
"content": {"type": "recorded", "cue_id": "a1b2c3d4"},
"is_playing": true,
"weight": 1.0,
"current_frame": 120,
"total_frames": 900,
"playlist_id": "pl_001",
"playlist_name": "Evening Show",
"scene_index": 2,
"total_scenes": 5,
"sequence_repeat": -1
},
"stale": [
{
"group_id": "group_1",
"playback_id": "1d8b4f60-9a72-4c55-8e3b-0f4c7a2d9b30",
"content": {"type": "recorded", "cue_id": "x9y8z7w6"},
"is_playing": true,
"weight": 0.35,
"current_frame": 899,
"total_frames": 900,
"playlist_id": null,
"playlist_name": null,
"scene_index": null,
"total_scenes": null,
"sequence_repeat": null
}
]
},
"group_2": { "now": null, "stale": [] }
},
"frame_rate": 30.0,
"timestamp": 1743422400000
}
- groups - Словарь всех групп из текущего patch mapping. Группа присутствует в snapshot, даже если на ней ничего не играет.
- now - Текущее активное воспроизведение на группе. null, если на группе ничего не играет.
- stale - Список слоёв, которые ещё затухают после переключения. Может быть пустым.
- playback_id - Стабильный идентификатор экземпляра воспроизведения (uuid). Фиксируется при запуске слоя и не меняется всю его жизнь, переживая переход из now в stale. По нему подписчик коррелирует записи между снапшотами. Новый запуск (включая повтор или луп-рестарт той же сцены) - это новый playback_id.
- is_playing - Играет ли слой в текущий момент (weight > 0).
- weight - Текущий вес слоя в диапазоне 0.0-1.0. Используется для визуализации fade-in/fade-out.
- playlist_id / playlist_name - Заполнены, если cue воспроизводится как часть плейлиста. Иначе null.
- scene_index / total_scenes - Индекс текущей сцены (0-based) и общее число сцен в плейлисте. Для одиночного cue - null.
- sequence_repeat - Оставшееся количество повторов последовательности. -1 - бесконечный loop, 0 - последний прогон, N - осталось ещё N повторов. Для одиночного cue - null.
- frame_rate - Текущий FPS рендера.
- timestamp - Момент формирования snapshot, unix time в миллисекундах.
Замена статистики v1.2.4: топики lm/statistic/playing_progress_info и lm/statistic/playing_ent_info удалены, их функциональность полностью покрывается данным топиком.
PUB lm/player/current_playing_priority
Публикует полный снимок текущих приоритетов всех групп. Сообщение публикуется с флагом retain=true.
Публикация выполняется: при изменении текущего приоритета любой группы; при изменении состава групп после обновления patch/group mapping; после инициализации сервиса; при изменении настроек сопоставления именованных приоритетов (если в этот момент что-то проигрывается, сервис останавливает текущее проигрывание и сбрасывает приоритеты всех групп к наименьшему значению); при завершении сервиса (публикуется пустой snapshot {}).
В одном сообщении публикуется полное состояние всех групп, а не только изменившейся - каждое новое сообщение должно рассматриваться как полная замена предыдущего snapshot. Снимок отражает логику арбитража команд, а не фактическое состояние рендера.
Payload format
{
str: Union[int, 'buttons', 'scheduler', 'trigger'],
...
}
Example
{
"all": "scheduler",
"front": "buttons",
"back": 75
}
- key - Идентификатор группы.
- value - Текущий приоритет группы. 0 означает наименьший приоритет. Именованные значения buttons, scheduler, trigger публикуются как строки.
Замена статистики v1.2.4: топик lm/statistic/current_playing_priority (единое целочисленное значение для всего плеера) удалён, заменён данным per-group снимком.
2. Управление настройками проигрывания и сущностей
PUB lm/settings/location/coordinates
Публикует координаты плеера. Retained. Payload format
{
"latitude": str,
"longitude": str,
}
Значения публикуются строками. Example
{
"latitude": "56.821019190097616",
"longitude": "60.59559633825789"
}
PUB lm/settings/location/address
Публикует адрес устройства. Retained. Payload format
{
"address": str
}
Example
{
"address": "Yekaterinburg"
}
PUB lm/settings/datetime/timezone
Публикует часовой пояс плеера. Retained. Payload format
{
"timezone": str
}
Example
{
"timezone": "Asia/Yekaterinburg"
}
- timezone - Часовой пояс плеера.
PUB lm/settings/player/fps
Публикует настройки fps. Retained. Payload format
{
"fps": int,
}
Example
{
"fps": 40
}
PUB lm/settings/player/artsync
Публикует статус отправки artsync. Retained. Payload format
{
"artsync": bool,
}
Example
{"artsync": false}
=== PUB lm/settings/player/locked === (новое в v1.3.4)
Публикует статус блокировки отправки ArtDMX плеера. Retained.
Payload format
{
"locked": bool,
}
Example
{"locked": true}
PUB lm/settings/player/effect_between_playing_command
Публикует настройку эффекта между событиями проигрывания. Retained.
Изменение относительно v1.2.4: заменяет топик lm/settings/player/blackout_between_playing_command (bool). Вместо булева флага "включен/выключен blackout" используется перечисление типа эффекта.
Payload format
{
"effect_between_playing_command": Union['transition', 'blackout', 'fade', 'no_effect'],
}
Example
{"effect_between_playing_command": "blackout"}
=== PUB lm/settings/player/duration_effect_between_playing_command === (новое в v1.3.4)
Публикует настройку длительности эффекта между событиями проигрывания. Retained.
Payload format
{
"duration": float,
}
Example
{"duration": 1.0}
=== PUB/SUB lm/settings/player/dimmer_value === (новое в v1.3.4)
Публикует значения диммера по группам воспроизведения. Retained. Backend также подписан на этот топик: входящее сообщение задаёт новые значения диммера (набор групп во входящем сообщении должен совпадать с текущим).
Payload format
{
str: float,
}
- key - Идентификатор группы.
- value - Значение диммера, 0.0 - 1.0.
Examples
{"all": 0.5}
{"all": 1.0, "stage_left": 0.25, "stage_right": 0.8}
{}
PUB lm/settings/player/playing_priority
Публикует предустановленные приоритеты проигрывания плеера. Retained. Payload format
{
"buttons": int,
"triggers": int,
"scheduler": int,
}
Example
{
"buttons": 4,
"triggers": 5,
"scheduler": 6
}
Приоритет представляет из себя целое число от 1 до 100. Чем выше число тем меньше приоритет.
PUB lm/settings/player/universes
Публикует настройки вселенных плеера. Retained. Payload format
[
{
"number": int,
"device": {
"name": str,
"description": str,
"network_mode": str,
"ip": str,
"port": int,
} | None
}
]
Example
[
{
"number": 1,
"device": {
"name": "artnet_device_1",
"description": "Main ArtNet converter",
"network_mode": "unicast",
"ip": "192.168.1.100",
"port": 6454
}
},
{
"number": 2,
"device": null
}
]
- number - Номер вселенной (0-32768).
- device - Настройки ArtNet устройства для данной вселенной. Может быть null если устройство не назначено.
- name - Уникальное имя ArtNet устройства (до 32 символов).
- description - Описание устройства (до 255 символов, может быть пустым).
- network_mode - Режим работы сети ("unicast" или "broadcast").
- ip - IP адрес устройства.
- port - Порт устройства (по умолчанию 6454, диапазон 1-65534).
=== PUB lm/settings/fixture === (новое в v1.3.4)
Публикует конфигурацию фикстур. Retained.
Payload format
{
"backgroundImageBase64": str,
"mapWidth": float,
"mapHeight": float,
"fixtureTypes": [ {...} ],
"fixtures": [ {...} ],
"groups": [ { "id": str, ... } ],
}
- backgroundImageBase64 - Фоновое изображение карты в base64 (может быть пустым).
- mapWidth / mapHeight - Размеры карты.
- fixtureTypes - Типы фикстур.
- fixtures - Фикстуры.
- groups - Группы воспроизведения - те самые group_id, которые используются в lm/player/commands, lm/player/state и топиках расписания.
PUB lm/cues
Публикует список cue файлов загруженных на плеер. Retained. Payload format
[
{
"id": int,
"filename": str,
"uni_count": int,
"universes": [int],
"frame_count": int,
"created": str,
}
]
Example
[
{
"id": 47,
"filename": "00-5.cue",
"uni_count": 1,
"universes": [1],
"frame_count": 220,
"created": "2024-03-07T08:30:16.926447Z"
}
]
- id - Уникальный идентификатор анимации.
- filename - Имя файла.
- uni_count - Количество вселенных в файле.
- universes - Список номеров вселенных в файле. (новое поле в v1.3.4)
- frame_count - Количество фреймов в файле.
- created - Время загрузки анимации в ISO формате.
=== PUB lm/cues/deleted === (новое в v1.3.4)
Публикует событие об удалении cue.
Payload format
{ "cue_id": int }
PUB lm/playlists
Публикует список плейлистов загруженных на плеер. Retained. Payload format
[
{
"id": int,
"name": str,
"scenes": [
{
"id": int,
"order": int,
"cue": {
"id": int,
"filename": str,
"uni_count": int,
"universes": [int],
"frame_count": int,
"created": str
},
"fade_in": float,
"fade_out": float,
"transition_time": float,
"repeat_value": int,
}
]
}
]
Example
[
{
"id": 19,
"name": "Test",
"scenes": [
{
"id": 71,
"order": 0,
"cue": {
"id": 51,
"filename": "5-8.cue",
"uni_count": 1,
"universes": [1],
"frame_count": 220,
"created": "2024-03-07T08:27:23.567083Z"
},
"fade_in": 1.0,
"fade_out": 0.0,
"transition_time": 2.0,
"repeat_value": 3600
}
]
}
]
- id - Уникальный идентификатор плейлиста.
- name - Название плейлиста.
- scenes - Сцены. В сценах содержится вся информация об эффектах, применённых к cue, и порядковый номер воспроизведения внутри плейлиста.
- id - Уникальный идентификатор сцены.
- order - Порядковый номер воспроизведения внутри плейлиста.
- cue - Параметры анимации, включая новое поле universes. Подробнее
- fade_in - Время fade_in.
- fade_out - Время fade_out.
- transition_time - Время перехода.
- repeat_value - Количество повторений.
=== PUB lm/playlists/deleted === (новое в v1.3.4)
Публикует событие об удалении плейлиста.
Payload format
{ "playlist_id": int }
SUB lm/player/commands
См. раздел «1. Управление проигрыванием» - основной топик управления воспроизведением по группам (apply/apply_each/update_state).
=== SUB lm/control/config === (новое в v1.3.4)
Команда сервисам перечитать конфигурацию. Payload - строка (не JSON).
Payload format
"refresh" # перечитать общую конфигурацию "refresh_universes_settings" # перечитать настройки вселенных
3. Управление расписанием
PUB lm/scheduler/error
Публикует ошибки. Выставляет заголовок Correlation data если он был установлен в запросе.
Payload format
{
"status": "error",
"msg": str,
"data": Any
}
- status - всегда "error" для этого топика. (новое поле в v1.3.4)
- msg - contain error message
- data - contain related error data
Example (ошибка валидации payload, data содержит список ошибок валидации полей):
{
"status": "error",
"msg": "Validation error",
"data": [
{
"type": "missing",
"loc": ["priority"],
"msg": "Field required",
"input": {"title": "holiday", "rrule": {"freq": "DAILY", "interval": 1, "start_date": "2024-01-20", "start_time_type": "time", "start_time": "00:00"}}
}
]
}
Example (внутренняя ошибка обработки, data равен null):
{
"status": "error",
"msg": "Internal Error Occurred",
"data": null
}
PUB lm/scheduler/events
Публикует список всех событий календаря.
Payload format
[
{
"id": str,
"title": str,
"priority": int,
"actions": {
"player": {
str: {"type": "play", "entity_type": Union['playlist','cue'], "entity_id": int}
| {"type": "blackout"}
| {"type": "static_color", "channels": dict[str, int]}
},
"do1": Optional[{"state": Literal[0, 1]}],
"do2": Optional[{"state": Literal[0, 1]}],
"do3": Optional[{"state": Literal[0, 1]}],
},
"rrule": RRule
}
]
RRule
{
"freq": Union['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY'],
"interval": int,
"start_date": str,
"start_time_type": Union['sunset', 'sunrise', 'time'],
"start_time": Optional[str],
"start_time_offset": Optional[int],
"until_date": Optional[str],
"until_time_type": Optional[Union['sunset', 'sunrise', 'time']],
"until_time": Optional[str],
"until_time_offset": Optional[int],
"count": Optional[int],
"from_time_type": Optional[Union['sunset', 'sunrise', 'time']],
"from_time": Optional[str],
"from_time_offset": Optional[int],
"to_time_type": Optional[Union['sunset', 'sunrise', 'time']],
"to_time": Optional[str],
"to_time_offset": Optional[int],
"bymonth": Optional[list[Union['January', ..., 'December']]],
"bymonthday": Optional[list[int]],
"byweekday": Optional[list[Union['MO','TU','WE','TH','FR','SA','SU']]],
"from_min": Optional[int],
"to_min": Optional[int],
}
Example
[
{
"id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
"title": "holiday",
"priority": 1,
"actions": {
"player": {
"roof": {"type": "play", "entity_type": "playlist", "entity_id": 19},
"ungrouped": {"type": "blackout"}
},
"do1": {"state": 1},
"do2": null,
"do3": null
},
"rrule": {
"freq": "DAILY", "interval": 1, "start_date": "2024-01-20",
"start_time_type": "time", "start_time": "00:00", "start_time_offset": null,
"count": 1, "until_date": null, "until_time_type": null, "until_time": null, "until_time_offset": null,
"from_time_type": "sunset", "from_time": null, "from_time_offset": 0,
"to_time_type": "sunset", "to_time": null, "to_time_offset": 0,
"bymonth": null, "bymonthday": null, "byweekday": null, "from_min": null, "to_min": null
}
}
]
- id - Уникальный идентификатор события (UUID).
- title - Название события.
- priority - Приоритет события. Чем выше значение тем выше приоритет.
- actions - Действия, которые должны быть выполнены при наступлении события.
- player - (изменено в v1.3.4) Действия для групп плееров. Ключ словаря - название группы (было единственное действие на весь плеер, стало по одному действию на группу).
- type - Тип действия для группы плеера: 'play', 'blackout' или 'static_color'. (blackout и static_color - новые в v1.3.4)
- entity_type / entity_id - заполнены при type='play'.
- channels - словарь канал → 0-255, заполнен при type='static_color'.
- do1 / do2 / do3 - Действие для соответствующего цифрового выхода. state: 0 (выключен) или 1 (включен).
- rrule - Правила повторения события (recurrence rule):
- freq - Частота повторений: YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY.
- interval - Периодичность повторения события.
- start_date - Дата старта события, формат YYYY-mm-dd.
- start_time_type / start_time / start_time_offset - Тип, время (%H:%M, если start_time_type='time') и сдвиг (если start_time_type='sunset'/'sunrise') времени старта.
- count / until_date - Количество повторений либо дата завершения; не могут быть заполнены одновременно; если оба пустые - событие никогда не завершается.
- until_time_type / until_time / until_time_offset - аналогично start_*, но для завершения (заполнены, если задан until_date).
- from_time_type / from_time / from_time_offset и to_time_type / to_time / to_time_offset - Время начала/окончания события в течение дня; заполнены, если freq ≠ HOURLY.
- bymonth - Месяцы активности события; заполнено при freq=YEARLY.
- bymonthday - Дни месяца; заполнено при freq=MONTHLY.
- byweekday - Дни недели; заполнено при freq=WEEKLY.
- from_min / to_min - Минута начала/окончания события; заполнены при freq=HOURLY.
SUB lm/scheduler/events/add
Добавляет новое событие без действий. Действия для созданного события задаются отдельным запросом в топик lm/scheduler/events/actions/update.
Изменение относительно v1.2.4: payload с полем actions отклоняется с ошибкой валидации - раньше событие и его действия создавались одним запросом.
Payload format
{
"title": str,
"priority": int,
"rrule": RRule
}
(формат RRule - см. lm/scheduler/events выше)
Example
{
"title": "holiday",
"priority": 1,
"rrule": {
"freq": "DAILY", "interval": 1, "start_date": "2024-01-20",
"start_time_type": "time", "start_time": "00:00", "start_time_offset": null,
"count": 1, "until_date": null, "until_time_type": null, "until_time": null, "until_time_offset": null,
"from_time_type": "sunset", "from_time": null, "from_time_offset": 0,
"to_time_type": "sunset", "to_time": null, "to_time_offset": 0,
"bymonth": null, "bymonthday": null, "byweekday": null, "from_min": null, "to_min": null
}
}
Response (новое в v1.3.4) - ответ публикуется в топик lm/scheduler/events/add/response (или в Response Topic из запроса), конверт {status, msg, data}; Correlation Data копируется в ответ.
- При успехе: status = 'success', msg = "Request was accepted", data - созданное событие (id, title, priority, rrule и actions с пустыми player/do).
- При ошибке: status = 'error', data - детали ошибки; ответ также публикуется в lm/scheduler/error.
SUB lm/scheduler/events/delete
Удаляет событие. Payload format
{ "id": str }
Example
{ "id": "abe4c633-8e3f-4938-94e2-efd135d993fc" }
- id - Уникальный идентификатор события.
Response (новое в v1.3.4) - ответ публикуется в топик lm/scheduler/events/delete/response (или в Response Topic), конверт {status, msg, data}.
- При успехе: status = 'success', msg = "Deleted", data = null.
- При ошибке: status = 'error', data - детали ошибки; ответ также публикуется в lm/scheduler/error.
SUB lm/scheduler/events/update
Обновляет свойства события: title, priority, rrule. Существующие действия события не меняются.
Изменение относительно v1.2.4: payload с полем actions отклоняется с ошибкой валидации. Для изменения действий используйте топик lm/scheduler/events/actions/update.
Payload format
{
"id": str,
"title": str,
"priority": int,
"rrule": RRule
}
Example
{
"id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
"title": "holiday",
"priority": 1,
"rrule": {
"freq": "DAILY", "interval": 1, "start_date": "2024-01-20",
"start_time_type": "time", "start_time": "00:00", "start_time_offset": null,
"count": 1, "until_date": null, "until_time_type": null, "until_time": null, "until_time_offset": null,
"from_time_type": "sunset", "from_time": null, "from_time_offset": 0,
"to_time_type": "sunset", "to_time": null, "to_time_offset": 0,
"bymonth": null, "bymonthday": null, "byweekday": null, "from_min": null, "to_min": null
}
}
Response (новое в v1.3.4) - топик lm/scheduler/events/update/response, конверт {status, msg, data} - аналогично events/add/response, data - обновлённое событие.
=== SUB lm/scheduler/events/actions/update === (новое в v1.3.4)
Полностью заменяет блок действий события. Семантика обновления - полная замена, не merge. Все действия, отсутствующие в новом actions, удаляются из события. Чтобы очистить действия события, отправьте пустые словари player и do.
Payload format
{
"id": str,
"actions": {
"player": {
str: {"type": "play", "entity_type": Union['playlist','cue'], "entity_id": int, "count": None}
| {"type": "blackout"}
| {"type": "static_color", "channels": dict[str, int]}
},
"do": {
Literal['1','2','3']: {"port": Literal[1,2,3], "state": Literal[0,1]}
},
},
}
Example
{
"id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
"actions": {
"player": {
"roof": {"type": "play", "entity_type": "playlist", "entity_id": 19, "count": null},
"ungrouped": {"type": "blackout"},
"stage": {"type": "static_color", "channels": {"red": 128, "green": 0, "blue": 0}}
},
"do": {"1": {"port": 1, "state": 1}}
}
}
Clear actions example
{
"id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
"actions": {"player": {}, "do": {}}
}
- id - Уникальный идентификатор события (UUID).
- actions.player - Действия для групп плееров, ключ словаря - название группы. type: play/blackout/static_color; entity_type/entity_id заполнены при play; count - зарезервировано, для play должно быть null; channels заполнено при static_color.
- actions.do - Действия для цифровых выходов, ключ словаря - номер порта строкой ('1','2','3'); port должен совпадать с ключом; state - 0 или 1.
Response - топик lm/scheduler/events/actions/update/response, конверт {status, msg, data} - аналогично events/add/response, data - обновлённое событие.
PUB lm/scheduler/events/changes
Публикует вновь созданные/изменённые/удалённые события. Payload format
{
"status": Literal['created', 'updated', 'deleted'],
"event": Event # формат события - см. lm/scheduler/events выше
}
Example
{
"status": "created",
"event": {
"id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
"title": "holiday",
"priority": 1,
"actions": {
"player": {"roof": {"type": "play", "entity_type": "playlist", "entity_id": 19}, "ungrouped": {"type": "blackout"}},
"do1": {"state": 1}, "do2": null, "do3": null
},
"rrule": { "...": "..." }
}
}
- status - Тип изменения: 'created', 'updated', 'deleted'.
- event - Событие со всеми параметрами (формат как в lm/scheduler/events).
SUB lm/scheduler/events/periods
Принимает запрос на публикацию всех одиночных событий за указанный период. Запрос должен содержать Correlation Data для последующей идентификации ответа. Запрос может содержать Response Topic; в противном случае ответ публикуется в топик lm/scheduler/events/periods/response.
Payload format
{
"from_datetime": str,
"to_datetime": str,
"filters": Optional[{"player": bool, "do1": bool, "do2": bool, "do3": bool}]
}
Example
{
"from_datetime": "2024-02-25T05:00:00",
"to_datetime": "2024-04-08T05:00:00",
"filters": {"player": true, "do1": false, "do2": false, "do3": false}
}
- from_datetime / to_datetime - Начало/окончание диапазона в ISO формате.
- filters - Опциональные фильтры типов действий; если не указаны, возвращаются события со всеми типами действий.
Response - ответ публикуется в топик lm/scheduler/events/periods/response (или в Response Topic), конверт {status, msg, data} - data содержит список одиночных событий за период; Correlation Data копируется в ответ; при ошибке ответ также публикуется в lm/scheduler/error.
PUB lm/scheduler/events/periods/response
Публикует список одиночных событий календаря за указанный период (период задаётся в запросе lm/scheduler/events/periods).
Изменение относительно v1.2.4: payload теперь объект-конверт {status, msg, data}, где список событий находится в поле data. Раньше payload был самим JSON-массивом событий.
Payload format
{
"status": Literal['success'],
"msg": str,
"data": [
{ "id": str, "title": str, "start": str, "end": str, "priority": int, "duration": float }
]
}
Example
{
"status": "success",
"msg": "Request was accepted",
"data": [
{
"id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
"title": "holiday",
"priority": 1,
"start": "2024-02-29T12:00:00+03:00",
"end": "2024-03-02T12:00:00+03:00",
"duration": 259200.0
}
]
}
- status / msg - Статус и сообщение ответа.
- data - Массив одиночных событий за период: id, title, priority, start/end (ISO), duration (сек).
PUB lm/scheduler/player/status/{group}
Публикует текущее активное событие плеера для конкретной группы воспроизведения. На каждую группу - отдельный топик, где {group} - идентификатор группы (например lm/scheduler/player/status/__all__). Сообщения retained.
Изменение относительно v1.2.4: раньше был единый топик lm/scheduler/player/status на весь плеер; теперь статус публикуется отдельным топиком на каждую группу воспроизведения.
Payload format (событие есть)
{
"status": "running",
"event": {
"id": str,
"title": str,
"action": {"type": "play", "entity_type": Union['playlist','cue'], "entity_id": int}
| {"type": "blackout"}
| {"type": "static_color", "channels": dict[str, int]}
}
}
Example
{
"status": "running",
"event": {
"id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
"title": "holiday",
"action": {"type": "play", "entity_type": "playlist", "entity_id": 19}
}
}
Payload format (события нет)
{ "status": "no_event" }
- status - 'running' или 'no_event'.
- event - Активное событие; присутствует только когда status='running'.
- action.type - 'play', 'blackout' или 'static_color'. entity_type/entity_id заполнены при play; channels - при static_color.
PUB lm/scheduler/do/1/status
PUB lm/scheduler/do/2/status
PUB lm/scheduler/do/3/status
Публикует текущее активное событие управления соответствующим цифровым выходом, если оно есть. (Не изменилось в v1.3.4.)
Payload format (событие есть)
{ "status": "running", "event": {"id": str, "title": str, "action": {"state": Literal[0,1]}} }
Example
{ "status": "running", "event": {"id": "abe4c633-8e3f-4938-94e2-efd135d993fc", "title": "holiday", "action": {"state": 1}} }
Payload format (события нет)
{ "status": "no_event" }
SUB lm/settings/datetime/timezone
Получает текущую таймзону (используется сервисом расписания для расчёта солнечного времени). Payload format
{ "timezone": str }
Example
{ "timezone": "Europe/Moscow" }
SUB lm/settings/location/coordinates
Получает координаты устройства для расчёта солнечного времени. Payload format
{ "latitude": float, "longitude": float }
Example
{ "latitude": 56.821019190097616, "longitude": 60.59559633825789 }
II. Оборудование и интерфейсы
Физические устройства и интерфейсы, которыми управляет и которые опрашивает плеер: ArtNet/RDM-устройства, DI/DO, внешние датчики, RS485, светодиоды. Эти разделы можно использовать как справочник по конкретному интерфейсу, не читая по порядку.
4. Управление устройствами Art-Net
Сервис осуществляет мониторинг и управление ArtNet и RDM устройствами.
PUB lm/artnet_devices_management_service/error
Публикует ошибки. Выставляет заголовок Correlation data если он был установлен в запросе.
Payload format
{
msg: str
data: Any
}
- msg - contain error message
- data - contain related error data
PUB lm/artnet_devices_management_service/artnet/devices/changes
Публикует вновь созданные/изменённые/удалённые ArtNet устройства.
Payload format
{
"status": Literal['created', 'updated', 'deleted'],
"device": {
"mac_address": str,
"ip_address": str,
"subnet_mask": str,
"default_gateway": str,
"dhcp_status": bool,
"name": str,
"esta_man_code": int,
"oem_code": int,
"style": str,
"firmware_version": str,
"ports": dict[int, {
"bind_index": int,
"port_index": int,
"is_input": bool,
"is_output": bool,
"port_type": Literal['DALI','ArtNet','ADB','Colortran_CMX','Avab','MIDI','DMX512'],
"name": str,
"universe": int,
"is_rdm_on": bool,
"physical_port": Optional[int],
"mode": Optional[Literal['DMX IN', 'DMX OUT', 'SPI']],
"is_data_transmitting": bool,
"tod_uids": list[str],
"lost": bool,
}],
"status": str,
"dev_mode": Optional[str],
"spi_settings": Optional[{
"chip": str, "mode": str, "period": int, "time_high_0": int,
"time_high_1": int, "time_reset": int, "gamma": int, "bit_mode": str,
}],
"dmx_settings": Optional[{
"break_time": int, "mab_time": int, "chan_time": int, "pause_time": int, "chan_num": int,
}],
}
}
Изменения относительно v1.2.4:
- Добавлены поля esta_man_code и oem_code на устройстве.
- В элементах ports добавлены port_index, tod_uids (список UID подключённых RDM-устройств) и lost (признак потери порта).
- Поле out_signal (Optional[Literal['DMX','SPI']]) переименовано и расширено в mode (Optional[Literal['DMX IN', 'DMX OUT', 'SPI']]).
- Поле rdm_devices_count на устройстве убрано (количество RDM-устройств теперь можно получить через tod_uids на портах либо из списка RDM-устройств).
Example
{
"status": "updated",
"device": {
"mac_address": "aa:bb:cc:dd:ee:ff",
"ip_address": "192.168.1.10",
"subnet_mask": "255.255.255.0",
"default_gateway": "192.168.1.1",
"dhcp_status": false,
"name": "LS-Converter",
"esta_man_code": 6155,
"oem_code": 2,
"style": "StNode",
"firmware_version": "1.2.3",
"ports": {
"10": {
"bind_index": 1, "port_index": 0, "is_input": false, "is_output": true,
"port_type": "DMX512", "name": "p1", "universe": 10, "is_rdm_on": true,
"physical_port": 1, "mode": "DMX OUT", "is_data_transmitting": false,
"tod_uids": ["0001:00000001"], "lost": false
}
},
"status": "RcPowerOk",
"dev_mode": null,
"spi_settings": null,
"dmx_settings": {"break_time": 90, "mab_time": 8, "chan_time": 50, "pause_time": 40, "chan_num": 512}
}
}
PUB lm/artnet_devices_management_service/rdm/devices/changes
Публикует вновь созданные/изменённые/удалённые RDM устройства.
Изменения относительно v1.2.4: структура устройства пересмотрена - добавлено поле status (online/offline); поле art_net_device_ip переименовано в ip; поле port переименовано в physical_port; поле art_net_device_mac убрано.
Payload format
{
"status": Literal['created', 'updated', 'deleted'],
"device": {
"uid": str,
"status": Literal['online', 'offline'],
"supported_params": dict[str, Any],
"ip": str,
"physical_port": int,
}
}
- uid - Уникальный идентификатор устройства.
- status - Состояние устройства: online или offline. (новое поле в v1.3.4)
- supported_params - Словарь параметров и их значений.
- ip - IP адрес конвертера, к которому подключено данное RDM устройство.
- physical_port - Физический порт конвертера, к которому подключено данное RDM устройство.
Example
{
"status": "updated",
"device": {
"uid": "0001:00000001",
"status": "online",
"supported_params": {
"DEVICE_INFO": {
"rdm_protocol_major_version": 1, "rdm_protocol_minor_version": 0,
"device_model_id": 256, "product_category": "PRODUCT_CATEGORY_FIXTURE",
"software_version_id": "1.0", "DMX512_footprint": 3,
"DMX512_personality_cur": 1, "DMX512_personality_total": 2,
"DMX512_start_address": 1, "sub_device_count": 0, "sensor_count": 0
},
"SOFTWARE_VERSION_LABEL": "v1.0.3",
"IDENTIFY_DEVICE": false,
"SUPPORTED_PARAMETERS": ["DEVICE_LABEL", "DMX_PERSONALITY"],
"DEVICE_LABEL": "front-stage"
},
"ip": "10.0.0.1",
"physical_port": 1
}
}
PUB lm/artnet_devices_management_service/cmd_response
Публикует результаты выполнения асинхронных REST команд. Используется для уведомления о завершении длительных операций, выполняемых в фоновом режиме. Клиент получает transaction_uid при инициации команды и может отслеживать её статус через данный топик.
Payload format
{
"transaction_uid": "string",
"status": "string"
}
- transaction_uid - Уникальный идентификатор транзакции, возвращаемый при инициации асинхронной команды.
- status - Статус выполнения команды. В текущей реализации публикуется только "done" (в v1.2.4 также предполагалось значение "error").
Example
{
"transaction_uid": "550e8400-e29b-41d4-a716-446655440000",
"status": "done"
}
5. Управление Di Do интерфейсами плеера
PUB lm/di/port/*
PUB lm/di/port/0 (player V1 only)PUB lm/di/port/1PUB lm/di/port/2 (player V2 only)PUB lm/di/port/3 (player V2 only)
Публикует состояние di порта
- di_port_number - Номер di порта.
Payload format
int
Example
1
- int - Статус Di порта. 1 - активен, 0 - неактивен.
PUB lm/do/port/*
PUB lm/do/port/0 (player V1 only)
PUB lm/do/port/1PUB lm/do/port/2 (player V2 only)PUB lm/do/port/3 (player V2 only)
Публикует состояние do порта
- do_port_number - Номер do порта.
Payload format
int
Example
1
- int - Статус DO порта. 1 - активен, 0 - неактивен.
SUB lm/do/change_state
Принимает команды для изменения состояния DO порта.
Payload command format
{
"port": int,
"state": int,
}
Example
{
"port": 1,
"state": 1,
}
- port - Номер do порта.
- state - Статус порта. 1 - активен, 0 - неактивен.
6. Управление внешними датчиками
Описывает MQTT API сервиса управления внешними датчиками.
PUB lm/sensors/{sensor_id}/data
Публикует данные датчика.
Payload format
{
str
}
- str - данные датчика
Example
{
"34"
}
7. Управление RS485 интерфейсами плеера
PUB lm/serialport_controller/error
Публикует ошибки.
Выставляет заголовок Correlation data если он был установлен в запросе.
Payload format
{
msg: str
data: Any
}
- msg - contain error message
- data - contain related error data
PUB lm/serialport_controller/ports
Публикует список rs485 портов.
Payload format
[
{
name: str
mode: Literal['rs485', 'dmxOut']
}
]
- name - Имя порта.
- mode - Предназначение порта.
Example
[
{
"name": "port1",
"mode": "rs485",
},
{
"name": "port2",
"mode": "rs485",
},
{
"name": "port3",
"mode": "dmxOut",
},
{
"name": "port4",
"mode": "dmxOut",
}
]
SUB lm/serialport_controller/ports/change_mode
Меняет предназначение порта.
Payload format
{
name: str
mode: Literal['rs485', 'dmxOut']
}
- name - Имя порта.
- mode - Предназначение порта.
Example
{
"name": "port1",
"mode": "rs485",
}
8. Управление светодиодами плеера
PUB 'lm/leds/state'
Публикует состояние диодов rs485 портов
Payload format
{
Port1: {
green: bool,
red: bool,
},
Port2: {
green: bool,
red: bool,
},
Port3: {
green: bool,
red: bool,
},
Port4: {
green: bool,
red: bool,
},
}
Example
{
"Port1": {
"green": true,
"red": true,
},
"Port2": {
"green": true,
"red": true,
},
"Port3": {
"green": true,
"red": true,
},
"Port4": {
"green": true,
"red": true,
},
}
- green - Статус зеленого светодиода.
- red - Статус красного светодиода.
SUB lm/leds/change_state
Принимает команды для изменения состояния диодов у rs485 порта.
Payload command format
{
pub port: Literal['Port1', 'Port2', 'Port3', 'Port4'],
green: bool,
red: bool,
}
Example
{
"port": "Port1",
"green": true,
"red": false,
}
- port - Имя rs485 порта.
- green - Статус зеленого светодиода.
- red - Статус красного светодиода.
SUB lm/leds/blink
Принимает команды для мигания всех светодиодов на всех rs485 портах.
Payload format
{
times: int,
interval: int,
}
Example
{
"times": 5,
"interval": 1000
}
- times - Количество миганий (от 1 до 255).
- interval - Интервал между миганиями в миллисекундах.
III. Триггеры и actions
Автоматизация: как настроить реакцию плеера на внешние события (сигналы RawUDP/ArtNet/Mqtt, показания DI/DO и внешних датчиков из раздела II) и что при этом публикуется в MQTT. Раздел имеет смысл читать после разделов I и II — action'ы триггеров ссылаются на то, что там описано.
9. Управление триггерами
PUB 'lm/trigger_service/trigger/trigger_list'
Публикует список всех триггеров. Топик всегда содержит актуальный список.
Payload format
[
{
name: str
tr_type: str
params: dict[str, Any]
}
]
- name - Имя триггера.
- tr_type - Тип триггера.
- params - Словарь с параметрами триггера.
Example
[
{
"name": "TriggerFromMqtt",
"tr_type": "RawUDP",
"params": {
"network_type": "udp",
"listen_ip": "0.0.0.0",
"listen_port": "5555",
"data": "any"
}
}
]
PUB lm/trigger_service/action/action_list
Публикует список всех action.
Топик всегда содержит актуальный список.
Payload format
[
{
name: str
action_type: str
params: dict[str, Any]
}
]
- name - Имя action.
- action_type - Тип action.
- params - Словарь с параметрами action.
Example
[
{
"name": "default",
"action_type": "send_trigger_to_mqtt",
"params": {
"topic": "lm/trigger_service/trigger/",
"payload": "",
"retain": false
}
}
]
PUB lm/trigger_service/relation_list
Публикует список всех связей между триггером и action.
Payload format
[
{
trigger: {
name: str
tr_type: str
params: dict[str, Any]
}
action: {
name: str
action_type: str
params: dict[str, Any]
}
}
]
- trigger - Словарь с триггером.
- action - Словарь с action.
Example
[
{
"trigger": {
"name": "TriggerFromMqtt",
"tr_type": "RawUDP",
"params": {
"network_type": "udp",
"listen_ip": "0.0.0.0",
"listen_port": "5555",
"data": "any"
}
},
"action": {
"name": "default",
"action_type": "send_trigger_to_mqtt",
"params": {
"topic": "lm/trigger_service/trigger/",
"payload": "",
"retain": false
}
}
}
]
SUB lm/trigger_service/trigger/add
Добавляет новый триггер.
На данный момент доступны три типа триггера: RawUDP и ArtNet и Mqtt.
- RawUDP - Срабатывает при получении UDP пакета удовлетворяющего заданным параметрам.
- ArtNet - Срабатывает при получении ArtNet пакета удовлетворяющего заданным параметрам.
- Mqtt - Срабатывает при получении Mqtt сообщения удовлетворяющего заданным параметрам.
Payload format
{
name: str
tr_type: str
params: dict[str, Any]
}
- name - Имя триггера.
- tr_type - Тип триггера.
- params - Словарь с параметрами триггера. Параметры отличаются в зависимости от типа триггера.
Example
{
"name": "TriggerFromMqtt",
"tr_type": "RawUDP",
"params": {
"network_type": "udp",
"listen_ip": "0.0.0.0",
"listen_port": "5555",
"data": "any"
}
}
Ожидаемые Параметры
Параметры для триггера с типом RawUDP
{
network_type: Literal['udp']
listen_ip: str
listen_port: int
data: str
}
- network_type - Тип сети. Должен быть ‘udp’.
- listen_ip - Прослушиваемый ip.
- listen_port - Прослушиваемый порт.
- data - Полезная нагрузка. Принимает строку полностью отражающую полезную нагрузку UDP пакета.
Example RawUDP params
{
"network_type": "udp",
"listen_ip": "0.0.0.0",
"listen_port": "5555",
"data": "any"
}
Параметры для триггера с типом ArtNet
{
network_type: Literal['tcp', 'udp']
listen_ip: str
listen_port: int
universe: int
channel: int
min_level: int
max_level: int
}
- network_type - Тип сети. Принимает значения ‘tcp’ или ‘udp’.
- listen_ip - Прослушиваемый ip.
- listen_port - Прослушиваемый порт.
- universe - Отражает значение параметра subuni из ArtNet пакета.
- channel - Номер канала в ArtNet пакете.
- min_level - Минимальное значение в канале для срабатывания триггера.
- max_level - Максимальное значение в канале для срабатывания триггера.Example ArtNet params
{
"network_type": "udp",
"listen_ip": "0.0.0.0",
"listen_port": "6454",
"universe": 3,
"channel": 5,
"min_level": 1,
"max_level": 124
}
Параметры для триггера с типом Mqtt
{
topic: str
payload: str
}
- topic - Mqtt топик для отслеживания.
- payload - Полезная нагрузка mqtt сообщения в виде байт. Должна точно совпадать.Example Mqtt params
{
"topic": "lm/di/port/1",
"payload": "\x01"
}
SUB lm/trigger_service/trigger/delete
Удаляет триггер.
Payload format
{
name: str
}
- name - Имя триггера.Example
{
"name": "TriggerFromMqtt",
}
SUB lm/trigger_service/action/add
Добавляет новый action.
На данный момент доступны два типа action: send_mqtt_msg_raw и send_trigger_to_mqtt.
- send_mqtt_msg_raw - Отправляет по mqtt сообщение записанное в параметрах не внося в него никаких изменений.
- send_trigger_to_mqtt - Отправляет по mqtt сообщение в теле которого находится сработавший триггер.
Payload format
{
name: str
action_type: str
params: dict[str, Any]
}
- name - Имя action.
- action_type - Тип action.
- params - Словарь с параметрами action. Различается в зависимости от типа action.Example
{
"name": "default",
"action_type": "send_trigger_to_mqtt",
"params": {
"topic": "lm/trigger_service/trigger/",
"payload": "",
"retain": false
}
}
Ожидаемые Параметры
Параметры для actions с типом send_trigger_to_mqtt и send_trigger_to_mqtt совпадают.
{
topic: str
payload: str
retain: bool
}
- topic - Mqtt topic в который будет отправлено сообщение.
- payload - Mqtt payload. Полезная нагрузка сообщения.
- retain - Mqtt retain param.
Типа send_trigger_to_mqtt игнорирует поля payload и retain но в сообщении они должны присутствовать.
Example params
{
"topic": "lm/trigger_service/trigger/",
"payload": "",
"retain": false
}
SUB lm/trigger_service/action/delete
Удаляет action.
Payload format
{
name: str
}
- name - Имя action.
Example
{
"name": "default",
}
SUB lm/trigger_service/set_trigger_to_action_relation
Создает связь между триггером и action.
Payload format
trigger: {
name: str
tr_type: str
params: dict[str, Any]
}
action: {
name: str
action_type: str
params: dict[str, Any]
}
- trigger - Словарь с триггером.
- action - Словарь с action.
Example
{
"trigger": {
"name": "TriggerFromMqtt",
"tr_type": "RawUDP",
"params": {
"network_type": "udp",
"listen_ip": "0.0.0.0",
"listen_port": "5555",
"data": "any"
}
},
"action": {
"name": "default",
"action_type": "send_trigger_to_mqtt",
"params": {
"topic": "lm/trigger_service/trigger/",
"payload": "",
"retain": false
}
}
}
SUB lm/trigger_service/delete_trigger_to_action_relation
Удаляет связь между триггером и action.
Payload format
trigger: {
name: str
tr_type: str
params: dict[str, Any]
}
action: {
name: str
action_type: str
params: dict[str, Any]
}
- trigger - Словарь с триггером.
- action - Словарь с action.
Example
{
"trigger": {
"name": "TriggerFromMqtt",
"tr_type": "RawUDP",
"params": {
"network_type": "udp",
"listen_ip": "0.0.0.0",
"listen_port": "5555",
"data": "any"
}
},
"action": {
"name": "default",
"action_type": "send_trigger_to_mqtt",
"params": {
"topic": "lm/trigger_service/trigger/",
"payload": "",
"retain": false
}
}
}
PUB lm/trigger_service/error
Публикует ошибки.
Выставляет заголовок Correlation data если он был установлен в запросе.
Payload format
{
msg: str
data: Any
}
- msg - contain error message
- data - contain related error data
Удаляет триггер и все связанные с ним действия.
Payload format
{
name: str
}
- name - Имя триггера.Example
{
"name": "TriggerFromMqtt",
}
Новое в v1.3.4: добавлен топик публикации факта срабатывания триггера (ранее в него ничего не публиковалось). Остальной функционал раздела (создание/удаление триггеров и action, связи триггер↔action, списки) не изменился.
=== PUB lm/trigger_service/trigger/ === (новое в v1.3.4)
Публикует сработавший триггер. retain = false. Публикация выполняется с qos=2.
Payload format
{
"id": int,
"name": str
}
- id - Стабильный идентификатор триггера.
- name - Имя триггера.
Example
{
"id": 1,
"name": "Artnet"
}
IV. Система и обслуживание
Администрирование самого устройства: сетевые и системные настройки, обновление программного обеспечения. Не связано напрямую с воспроизведением контента.
10. Настройки системы
Сервис осуществляет конфигурирование системных настроек ОС.
PUB lm/system_configurator/error
Публикует ошибки.
Выставляет заголовок Correlation data если он был установлен в запросе.
Payload format
{
msg: str
data: Any
}
- msg - contain error message
- data - contain related error data
PUB lm/system_settings/external_access/certificates
Публикует список всех x509 сертификатов.
Топик всегда содержит актуальный список.
Payload format
[
{
name: str
cert_type: str
public_bytes: str
params: dict[str, Any]
}
]
- name - Имя сертификата.
- cert_type - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’
- params - Словарь с параметрами сертификата. Набор параметров отличается в зависимости от типа сертификата.
Example
[
{
"cert_type": "certificate",
"name": "cert_name",
"params": {
"issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
"san": "IP=192.168.0.3",
"subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
"valid_from": "1664440221.0",
"valid_to": "1759048221.0"
},
"public_bytes": "-----BEGIN CERTIFICATE-----\n"
"-----END CERTIFICATE-----\n"}]
}
]
PUB lm/system_settings/external_access/web_access_settings
Публикует список настроек web доступа.
Топик всегда содержит актуальный список.
Payload format
{
http_port: int
https_port: int
is_https_enabled: bool
is_http_redirected: bool
cert_name: str
}
- http_port - Http порт. По умолчанию 80.
- https_port - Https порт. По умолчанию 443.
- is_https_enabled - Индикатор включен ли https.
- is_http_redirected - Индикатор включена ли переадресация http to https.
- cert_name - Имя сертификата сервера.
Example
{
"http_port": 80,
"https_port": 443,
"is_https_enabled": false,
"is_http_redirected": true,
"cert_name": ""
}
SUB lm/system_settings/external_access/change_web_access_settings
Меняет настройки web доступа.
Payload format
{
http_port: int
https_port: int
is_https_enabled: bool
is_http_redirected: bool
cert_name: str
}
- http_port - Http порт. По умолчанию 80.
- https_port - Https порт. По умолчанию 443.
- is_https_enabled - Индикатор включен ли https.
- is_http_redirected - Индикатор включена ли переадресация http to https.
- cert_name - Имя сертификата сервера.
Example
{
"http_port": 80,
"https_port": 443,
"is_https_enabled": false,
"is_http_redirected": true,
"cert_name": ""
}
SUB lm/system_settings/certificates/upload_certificate
Загружает сертификат и его ключ для дальнейшего использования в настройках доступа.
Payload format
{
cert_name: str
certificate: bytes
key: bytes
intermediate: bytes
}
- cert_name - Читаемое имя сертификата.
- certificate - x.509 сертификат в pem формате.
- key - Приватный ключ в pem формате.
- intermediate - (Опционально) промежуточный сертификат.
SUB lm/system_settings/certificates/upload_certificate_corresponding_csr
Загружает сертификат относящийся к сформированному ранее csr.
Payload format
{
cert_name: str
certificate: bytes
}
- cert_name - Имя csr сертификата.
- certificate - x.509 сертификат в pem формате.
SUB lm/system_settings/certificates/delete_certificate
Удаляет сертификат и все связанные с ним файлы.
Payload format
{
id: int
name: str
cert_type: str
public_bytes: str
params: dict[str, Any]
}
- id - (Опционально) Идентификатор сертификата.
- name - Имя сертификата.
- cert_type - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’
- public_bytes - Открытый ключ сертификата.
- params - Словарь с параметрами сертификата. Набор параметров отличается в зависимости от типа сертификата.
Example
{
"cert_type": "certificate",
"name": "cert_name",
"params": {
"issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
"san": "IP=192.168.0.3",
"subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
"valid_from": "1664440221.0",
"valid_to": "1759048221.0"
},
"public_bytes": "-----BEGIN CERTIFICATE-----\n"
"-----END CERTIFICATE-----\n"}]
SUB lm/system_settings/certificates/generate_csr
Генерирует Certificate Signing Request.
Payload format
{
cert_name: str
cert_type: str
key_size: int
subject: str
san: str
}
- cert_name - Имя сертификата.
- cert_type - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’
- key_size - Размер ключа в байтах. Принимает значения 2048 иои 4096.
- subject - Строка в формате rfc4514.
- san - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами
IP=илиDNS=.
Example
{
"cert_name": "ss_cert23",
"cert_type": "certificate",
"key_size": 2048,
"subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
"san": "IP=192.168.0.3,DNS=domain.com"
}
SUB lm/system_settings/certificates/generate_self_sign_certificate
Генерирует самоподписанный сертификат.
Payload format
{
cert_name: str
cert_type: str
key_size: int
subject: str
san: str
}
- cert_name - Имя сертификата.
- cert_type - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’.
- key_size - Размер ключа в байтах. Принимает значения 2048 иои 2096.
- subject - Строка в формате rfc4514.
- san - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами
IP=илиDNS=.
Example
{
"cert_name": "ss_cert23",
"cert_type": "certificate",
"key_size": 2048,
"subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
"san": "IP=192.168.0.3,DNS=domain.com"
}
PUB lm/system_settings/network/interfaces/wired/eth*/statistics
PUB lm/system_settings/network/interfaces/wired/eth0/statistics
PUB lm/system_settings/network/interfaces/wired/eth1/statistics
Публикует информацию о проводном интерфейсе ethernet каждые 10 секунд.
Payload format
{
status: str
ip_assign_method: Literal['manual', 'dhcp']
ip: str
netmask: str
gateway: str
dns_assign_method: Literal['manual', 'dhcp']
dns_servers: list[str]
mac_address: str
}
- status - Статус интерфейса. Может быть
upилиdown. - ip_assign_method - Способ назначения ip адреса. Может быть
manualилиdhcp. - ip - IP адрес интерфейса.
- netmask - Маска интерфейса.
- gateway - Шлюз по умолчанию.
- dns_assign_method - Способ назначения dns серверов. Может быть
manualилиdhcp. - dns_servers - Список dns серверов.
- mac_address - MAC адрес интерфейса.
Example
{
"status": "up",
"ip_assign_method": "manual",
"ip": "192.168.0.205",
"netmask": "255.255.255.0",
"gateway": "192.168.0.1",
"dns_assign_method": "manual",
"dns_servers": ["8.8.8.8", "8.8.4.4"],
"mac_address": "e4:5f:01:a8:e0:6c"
}
SUB lm/system_settings/network/interfaces/wired/eth*/set_ip_credential
SUB lm/system_settings/network/interfaces/wired/eth0/set_ip_credentialSUB lm/system_settings/network/interfaces/wired/eth1/set_ip_credential
Устанавливает ip адресацию и шлюз на интерфейс.
Поддерживает статическое назначение ip и назначение через dhcp.
Payload format
Статическая адресация:
{
ip_assign_method: Literal['manual']
static_ip: str
static_netmask: str
static_gateway: str
}
- ip_assign_method - Способ назначения ip адреса. Должно быть
manual. - static_ip - IPv4 адрес интерфейса
- static_netmask - Сетевая маска интерфейса.
- static_gateway - Шлюз по умолчанию.
Example
{
"ip_assign_method": "manual",
"static_ip": "192.168.0.205",
"static_netmask": "255.255.255.0",
"static_gateway": "192.168.0.1"
}
Динамическая адресация
{
ip_assign_method: Literal['dhcp']
}
- ip_assign_method - Способ назначения ip адреса. Должно быть
dhcp.
Example
{
"ip_assign_method": "dhcp"
}
SUB lm/system_settings/network/interfaces/wired/eth*/set_dns_credential
SUB lm/system_settings/network/interfaces/wired/eth0/set_dns_credential
SUB lm/system_settings/network/interfaces/wired/eth1/set_dns_credential
Назначение dns серверов на интерфейс.
Поддерживает статическое и динамическое (dhcp) назначение dns серверов.
Payload format
Статическое назначение:
{
dns_assign_method: Literal['manual']
static_dns_servers: list[str]
}
- dns_assign_method - Способ назначения dns серверов. Должно быть
manual. - static_dns_servers - Список DNS серверов.Example
{
"dns_assign_method": "manual",
"static_dns_servers": ["8.8.8.8", "8.8.4.4"]
}
Динамическое назначение:
{
dns_assign_method: Literal['dhcp']
}
- dns_assign_method - Способ назначения dns серверов. Должно быть
dhcp.
Example
{
"dns_assign_method": "dhcp"
}
PUB lm/system_settings/network/interfaces/modem/statistics
Публикует информацию о модемном интерфейсе каждые 10 секунд.
Payload format
{
ip_assign_method: Literal['manual', 'dhcp']
ip: str
netmask: str
gateway: str
dns_assign_method: Literal['manual', 'dhcp']
dns_servers: list[str]
apn: {
apn: str,
username: str,
password: str,
}
modem_status: {
state: str,
state_failed_reason: str,
power_state: str,
signal_quality: int,
access_technologies: list[str]
}
}
- status - Статус интерфейса. Может быть
upилиdown. - ip_assign_method - Способ назначения ip адреса. Может быть
manualилиdhcp. - netmask - IP адрес интерфейса.
- gateway - Шлюз по умолчанию.
- dns_assign_method - Способ назначения dns серверов. Может быть
manualилиdhcp. - dns_servers - Список dns серверов.
- apn:
- apn: APN сервер.
- username: Имя пользователя для apn сервера.
- password: Пароль для apn сервера.
- modem_status:
- state: Состояние подключения.
- state_failed_reason: Причина ошибки если таковая есть.
- power_state: Состояние питания модема.
- signal_quality: Качество сигнала в процентах.
- access_technologies: Список текущих режимов (LTE, UMTS и т.д.).
Example
{
"status": "up",
"ip_assign_method": "manual",
"ip": "192.168.0.205",
"netmask": "255.255.255.0",
"gateway": "192.168.0.1",
"dns_assign_method": "manual",
"dns_servers": ["8.8.8.8", "8.8.4.4"],
"apn": {
"apn": "internet.mts.ru",
"username": "mts",
"password": "mts"
},
"modem_status": {
"state": "connected",
"state_failed_reason": "--",
"power_state": "on",
"signal_quality": 81,
"access_technologies": ["LTE"]
}
}
SUB lm/system_settings/network/interfaces/modem/set_ip_credential
Устанавливает ip адресацию и шлюз на интерфейс.
Поддерживает статическое назначение ip и назначение через dhcp.
Payload format
Статическая адресация
{
ip_assign_method: Literal['manual']
static_ip: str
static_netmask: str
static_gateway: str
}
- ip_assign_method - Способ назначения ip адреса. Должно быть
manual. - static_ip - IPv4 адрес интерфейса
- static_netmask - Сетевая маска интерфейса.
- static_gateway - Шлюз по умолчанию.Example
{
"ip_assign_method": "manual",
"static_ip": "192.168.0.205",
"static_netmask": "255.255.255.0",
"static_gateway": "192.168.0.1"
}
Динамическая адресация
{
ip_assign_method: Literal['dhcp']
}
- ip_assign_method - Способ назначения ip адреса. Должно быть
dhcp.
Example
{
"ip_assign_method": "dhcp"
}
SUB lm/system_settings/network/interfaces/modem/set_dns_credential
Назначение dns серверов на интерфейс.
Поддерживает статическое и динамическое (dhcp) назначение dns серверов.
Payload format
Статическое назначение:
{
dns_assign_method: Literal['manual']
static_dns_servers: list[str]
}
- dns_assign_method - Способ назначения dns серверов. Должно быть
manual. - static_dns_servers - Список DNS серверов.
Example
{
"dns_assign_method": "manual",
"static_dns_servers": ["8.8.8.8", "8.8.4.4"]
}
Динамическое назначение
{
dns_assign_method: Literal['dhcp']
}
- dns_assign_method - Способ назначения dns серверов. Должно быть
dhcp.
Example
{
"dns_assign_method": "dhcp"
}
SUB lm/system_settings/network/interfaces/modem/set_apn_credential
Назначение настроек apn на интерфейс.
Поддерживается только статическое назначение.
Payload format
Статическое назначение:
{
apn: str
username: str
password: str
}
- apn - APN сервер.
- username - Имя пользователя если есть либо пустая строка.
- password - Пароль если есть либо пустая строка.
Example
{
"apn": "internet.mts.ru",
"username": "mts",
"password": "mts"
}
PUB lm/system_settings/datetime/rtc_status
Публикует статус rtc модуля
Payload format
{
is_active: bool
}
- is_active - Активен ли rtc модуль.
Example
{
"is_active": true,
}
SUB lm/system_settings/datetime
Принимает команды на изменение даты и времени конфигурации системы.
Список принимаемых команд
Set Date
Description: > Set system date.
Values:
command: str > set_date
data: dict > date: str - date in format ‘Y:M:D’
Example:{'command': 'set_date', 'data': {'date': '1970:01:01'}}
Set Time
Description: > Set system time.
Values:
command: str > set_time
data: dict > time: str - time in format ‘HH:mm:ss’
Example:{'command': 'set_time', 'data': {'time': '13:00:00'}}
Set Datetime
Description: > Set system date and time.
Values:
command: str > set_datetime
data: dict > datetime: str - time in format ‘Y:M:D HH:mm:ss’
Example:{'command': 'set_datetime', 'data': {'datetime': '1970:01:01 13:00:00'}}
Change Ntp Status
Description: > Enable or disable ntp synchronization.
Values:
command: str > change_ntp_status
data: dict > ntp: bool - is ntp sync enable
Example:{'command': 'change_ntp_status', 'data': {'ntp': True}}
Set Ntp Servers
Description: > Set ntp servers. > Generate ntp config, replace it then restart systemd-timesyncd.service > Accepts list of ip addresses or domain names
Values:
command: str > set_ntp_servers
data: dict > ntp_servers: list[str] - list of servers ip addresses or dns names
Example:{'command': 'set_ntp_servers', 'data': {'ntp_servers': ['192.168.0.2', 'ntp1.stratum2.com']}}
Set timezone
Description: > Set system timezone.
Values:
command: str > set_timezone
data: dict > timezone: str - timezone name
Example:{'command': 'set_timezone', 'data': {'timezone': 'Europe/London'}}
Base format for command payload
{
'command': str
'data': dict[str, Any]
}
- command - command name
- data - any data for command
Example:
{'command': 'set_ip', 'data': {'ifname': 'eth0', 'ip': '192.168.0.1'}}
SUB lm/system_settings/power_control
Управляет питанием устройства
Payload format
{
command: str
delay: int
}
- command - Команда управления питанием. Может принимать значения “reboot” и “shutdown”.
- delay - Задержка срабатывания команды в минутах.
Example
{
"command": "reboot",
"delay": "0",
}
Certificate params format
Парамеры сертификата отличаются в зависимости от его типа. В данный момент поддерживается два типа сертификата x509: certificate и csr.
x509 certificate params format
{
subject: str
san: str
issuer: str
valid_from: float
valid_to: float
}
- subject - Строка в формате rfc4514.
- san - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами
IP=илиDNS=. - issuer - Строка в формате rfc4514.
- valid_from - Дата с которой сертификат действителен. Формат Posix timestamp.
- valid_to - Дата по которую сертификат действителен. Формат Posix timestamp.
Example
{
"issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
"san": "IP=192.168.0.3",
"subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
"valid_from": "1664440221.0",
"valid_to": "1759048221.0"
}
x509 csr params format
{
subject: str
san: str
}
- subject - Строка в формате rfc4514.
- san - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами
IP=илиDNS=.
Example
{ “subject”: “OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA”, “san”: “IP=192.168.0.3”, }
11. Обновление программного обеспечения плеера
PUB lm/update_service/version/version_list
Публикует список версий всех модулей. Топик всегда содержит актуальный список.
Payload format
[
{
id: int
version: str
subversion: Optional[str]
module: str
description: Optional[str]
}
]
- id - version id
- version - version number
- subversion - (Optional) subversion.
- module - module name
- description - (Optional) description
Example
[
{
"id": 1,
"version": "20",
"subversion": null,
"module": "frontend",
"description": null
}
]
PUB lm/update_service/update/update_list'
Публикует список обновлений. Топик всегда содержит актуальный список.
Payload format
[
{
id: int
version: str
status: str
filename: Optional[str]
update_path: str
extracted_path: Optional[str]
backup_path: Optional[str]
description: Optional[str]
}
]
- id - update id.
- version - update version.
- status - update status.
- filename - (Optional) update filename.
- update_path - path to update file.
- extracted_path - path to extracted files.
- backup_path - (Optional) update version.
- description - (Optional) description.
Example
[
{
"id": 1,
"version": "2022",
"status": "installed",
"filename": "lmp_2022.update",
"update_path": "/home/lightmaster/lightmaster/updater/lmp_2022.update",
"extracted_path": "/home/lightmaster/lightmaster/updates_store/lmp_2022",
"backup_path": "/home/lightmaster/lightmaster/backups_store/20220519181452_lmp_v0_full_backup",
"description": "A error occurred during installation update. Installation filed. None"
}
]
SUB lm/update_service/update/add_update
Добавляет обновление в базу.
Payload format
{
file: str
}
- file: str - путь до файла обновления
Example
{"file": "/home/lightmaster/projects/wess-group/lightmaster/updater/lmp_2022.update"}
SUB lm/update_service/update/check_update
Проверяет совместимость обновления.
Payload format
{
id: int
}
- id - id обновления
Example
{'id': 5}
SUB lm/update_service/update/initial_update
Совмещает добавление обновления в базу и его проверку.
Payload format
{
file: str
}
- file: str - путь до файла обновления
Example
{"file": "/home/lightmaster/projects/wess-group/lightmaster/updater/lmp_2022.update"}
SUB lm/update_service/update/install_update
Устанавливает обновление
Payload format
{
id: int
}
- id - id обновления
Example
{'id': 5}
SUB lm/update_service/update/restore_update
Откатывает обновление на предыдущую версию.
Payload format
{
id: int
}
- id - id обновления
Example
{'id': 5}
SUB lm/update_service/update/delete_update
Удаляет обновление и все связанные с ним файлы.
Payload format
{
id: int
}
- id - id обновления
Example
{'id': 5}
SUB lm/update_service/version/get_versions_list
Запрос на публикацию списка версий всех модулей.
Публикация происходит в топик lm/update_service/version/get_versions_list/response
В заголовок запроса могут быть включены необязательные поля:
- Correlation data
- Response topic
Corelation data любой уникальный идентификатор запроса. Зеркально устанавливается в публикуемый ответ и служит для идентификации ответа со стороны клиента.
Response topic если установлен то ответ публикуется в указанный топик вместо стандартного.
PUB lm/update_service/version/get_versions_list/response
Публикует ответ на запрос из топика lm/update_service/version/get_versions_list.
Выставляет заголовок Correlation data если он был установлен в запросе.
Payload format
[
{
id: int
version: str
subversion: Optional[str]
module: str
description: Optional[str]
}
]
- id - version id
- version - version number
- subversion - (Optional) subversion.
- module - module name
- description - (Optional) description
Example
[
{
"id": 1,
"version": "20",
"subversion": null,
"module": "frontend",
"description": null
}
]
SUB lm/update_service/version/get_module_version
Публикует версию конкретного модуля.
Публикация происходит в топик lm/update_service/version/get_module_version/response
В заголовок запроса могут быть включены необязательные поля:
- Correlation data
- Response topic
Corelation data любой уникальный идентификатор запроса. Зеркально устанавливается в публикуемый ответ и служит для идентификации ответа со стороны клиента.
Response topic если установлен то ответ публикуется в указанный топик вместо стандартного.
Payload format
{
module: str
}
- module - название модуля
Example
{'module': 'update_service'}
PUB lm/update_service/version/get_module_version/response
Публикует ответ на запрос из топика lm/update_service/version/get_module_version.
Выставляет заголовок Correlation data если он был установлен в запросе.
Payload format
{
id: int
version: str
subversion: Optional[str]
module: str
description: Optional[str]
}
- id - version id
- version - version number
- subversion - (Optional) subversion.
- module - module name
- description - (Optional) description
Example
{
"id": 1,
"version": "20",
"subversion": null,
"module": "frontend",
"description": null
}
SUB lm/update_service/update/get_updates_list
Запрос на публикацию списка всех обновлений добавленных в базу.
Публикация происходит в ветку lm/update_service/update/get_updates_list/response
В заголовок запроса могут быть включены необязательные поля:
- Correlation data
- Response topic
Corelation data любой уникальный идентификатор запроса. Зеркально устанавливается в публикуемый ответ и служит для идентификации ответа со стороны клиента.
Response topic если установлен то ответ публикуется в указанный топик вместо стандартного.
PUB lm/update_service/update/get_updates_list/response
Публикует ответ на запрос из топика lm/update_service/update/get_updates_list.
Выставляет заголовок Correlation data если он был установлен в запросе.
Payload format
[
{
id: int
version: str
status: str
filename: Optional[str]
update_path: str
extracted_path: Optional[str]
backup_path: Optional[str]
description: Optional[str]
}
]
- id - update id.
- version - update version.
- status - update status.
- filename - (Optional) update filename.
- update_path - path to update file.
- extracted_path - path to extracted files.
- backup_path - (Optional) update version.
- description - (Optional) description.
Example
[
{
"id": 1,
"version": "2022",
"status": "installed",
"filename": "lmp_2022.update",
"update_path": "/home/lightmaster/lightmaster/updater/lmp_2022.update",
"extracted_path": "/home/lightmaster/lightmaster/updates_store/lmp_2022",
"backup_path": "/home/lightmaster/lightmaster/backups_store/20220519181452_lmp_v0_full_backup",
"description": "A error occurred during installation update. Installation filed. None"
}
]
PUB lm/update_service/error
Публикует ошибки.
Выставляет заголовок Correlation data если он был установлен в запросе.
Payload format
{
msg: str
data: Any
}
- msg - contain error message
- data - contain related error data