LS Player MQTT API: различия между версиями

Материал из Light Stream (RU)
Нет описания правки
(статья про LS Player 1.3.4 MQTT API)
 
(не показана 1 промежуточная версия этого же участника)
Строка 1: Строка 1:
{{DISPLAYTITLE:Light Stream Player MQTT API}}
{{DISPLAYTITLE:Light Stream Player MQTT API}}


== 1. Управление проигрыванием и получение статистики ==
Документ описывает MQTT API плеера LS Player v1.3.4. Материал сгруппирован в четыре смысловых блока, чтобы было проще ориентироваться:
Описывает MQTT API сервиса.


Сервис осуществляет проигрывание анимаций.
* '''I. Логика воспроизведения''' (разделы 1–3) — что и когда играть: плеер, настройки проигрывания, расписание.
* '''II. Оборудование и интерфейсы''' (разделы 4–8) — физические устройства и интерфейсы: ArtNet/RDM, DI/DO, внешние датчики, RS485, светодиоды.
* '''III. Триггеры и actions''' (раздел 9) — автоматизация реакции на внешние события.
* '''IV. Система и обслуживание''' (разделы 10–11) — администрирование устройства: системные настройки, обновление ПО.


'''Как читать документ.''' Каждый раздел описывает MQTT-топики сервиса. Префикс в заголовке топика означает направление обмена ''с точки зрения плеера'':


=== SUB <code>lm/player</code> ===
* '''PUB''' — плеер ''публикует'' в этот топик данные (состояние, списки, события, ошибки). Чтобы получать их, клиент подписывается на топик. Многие PUB-топики публикуются с флагом retained — последнее значение приходит сразу при подписке.
Принимает команды управления проигрыванием.
* '''SUB''' — плеер ''подписан'' на этот топик и ждёт в нём команды. Чтобы дать команду, клиент публикует в топик сообщение в формате, указанном в «Payload format» (пример — в «Example»).


==== Play ====
Если вы впервые знакомитесь с API — рекомендуется читать по порядку, начиная с блока I. Если ищете конкретный топик — можно сразу перейти к нужному разделу через оглавление.
Payload command format
 
К статье прилагается демонстрационный 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
  {
  {
     "cmd": 'play',
     "cmd": "apply",
     "what_playing": Union['playlist', 'cue'],
     "priority": Union[int, 'buttons', 'scheduler', 'trigger'],
     "entity": Union[int, str],
     "groups": list[str],
     "count": Optional[int],
     "action": GroupAction,
    "priority": int,
  }
  }
Example
Example
   {
   {
     "cmd": "play",
     "cmd": "apply",
     "what_playing": "playlist",
     "priority": "buttons",
     "entity": 19,
     "groups": ["roof", "back"],
     "count": Null,
     "action": {
    "priority": 4,
      "type": "play",
      "entity_type": "cue",
      "entity_id": 42,
      "count": null
    }
   }
   }
* '''cmd''' - Название команды.
* '''cmd''' - Литерал "apply".
* '''what_playing''' - Тип сущности для воспроизведения. Принимает два значения “playlist” и “cue”.
* '''priority''' - Приоритет команды. Целое число (0 - минимальный приоритет, чем больше значение - тем выше приоритет) либо именованная маска "buttons" / "scheduler" / "trigger".
* '''entity''' - ID или наименование проигрываемой сущности.
* '''groups''' - Список ID групп, к которым применяется действие. Если хотя бы одна из указанных групп не существует - вся команда отклоняется.
* '''count''' - Опциональный параметр. Количество повторений проигрывания. Если не задан или значение равно Null то проигрывание продолжится до получения следующей команды с равным или боле высоким приоритетом.
* '''action''' - Объект GroupAction, общий для всех групп из groups.
* '''priority''' - Приоритет команды. Значение от 1 до 100. Чем больше значение - тем выше приоритет. Команда с более низким приоритетом не может отменять команду с более высоким приоритетом. Текущие сопоставления приоритетов: Расписание - 60, Триггер - 50, Ручной запуск - 40.
 
==== Apply each ====
Применяет разные действия к разным группам в одном сообщении.


==== Stop ====
Payload format
Payload stop command format
  {
  {
     "cmd": 'stop',
     "cmd": "apply_each",
     "priority": int,
    "priority": Union[int, 'buttons', 'scheduler', 'trigger'],
     "actions": {
      str: GroupAction,
      ...
    },
  }
  }
Example
Example
   {
   {
     "cmd": "stop",
     "cmd": "apply_each",
     "priority": 4,
     "priority": "buttons",
    "actions": {
      "roof": {"type": "play", "entity_type": "playlist", "entity_id": 1, "count": null},
      "back": {"type": "blackout"},
      "front": {"type": "stop"}
    }
   }
   }
* '''cmd''' - Название команды.
* '''cmd''' - Литерал "apply_each".
* '''priority''' - Приоритет команды. Значение от 1 до 100. Чем больше значение - тем выше приоритет. Команда с более низким приоритетом не может отменять команду с более высоким приоритетом. Текущие сопоставления приоритетов: Расписание - 60, Триггер - 50, Ручной запуск - 40.
* '''priority''' - Общий приоритет для всех действий в сообщении.
* '''actions''' - Словарь group_id → GroupAction. Неизвестные группы пропускаются, остальные действия из сообщения продолжают обрабатываться.


==== Update state ====
Служебная команда запроса актуального playback-state (провоцирует внеочередную публикацию [[#pub-lmplayerstate|lm/player/state]]).


=== PUB <code>lm/statistic/playing_progress_info</code> ===
Payload format
Публикует статистику проигрывания.
{
    "cmd": "update_state"
}


Зная текущее значение fps можно перевести значения во время.
<span id="groupaction"></span>
==== GroupAction ====
Дискриминация выполняется по полю <code>type</code>.


Например при fps равном 40 frame_count равном 1000 и frame_number равном 120 мы получим:<br />1 / 40 * 1000 = 25 - Общая продолжительность анимации в секундах. 1 / 40 * 120 = 3 - На текущий момент анимация проиграла 3 секунды.
'''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"
}


Payload format
'''Stop''' - останавливает проигрывание на группе и проверяет, есть ли актуальное событие расписания. Если в runtime ничего не проигрывается на группе, stop игнорируется.
Представляет из себя строку в формате <code>&quot;{frame_count}, {frame_number}&quot;</code>
Example
“1000, 35”
* '''frame_count''' - Общее количество фреймов.
* '''frame_number''' - Сколько фреймов проиграно на текущий момент.
 
 
=== PUB <code>lm/statistic/playing_ent_info</code> ===
Публикует Наименования того, что сейчас проигрывается.
 
 
Payload format
  {
  {
     "playlist": Optional[str],
     "type": "stop"
    'scene': Optional[int],
    'cue': Optional[str],
  }
  }
Example
 
'''Static color''' - включает на группе статическое DMX-состояние. Значения задаются по семантическому типу канала; runtime разворачивает их в реальные DMX-каналы по текущим patch settings.
  {
  {
     "playlist": "NewYearPlaylist",
     "type": "static_color",
     "scene": 1,
     "channels": { "<channel_type>": int }
    "cue": "BLUE.cue",
  }
  }
* '''playlist''' - Наименование проигрываемого плейлиста. Может быть None.
* '''channels''' - Объект channel_type → DMX-значение (целые 0-255). Каналы группы, для которых тип не задан, выставляются в 0. Неизвестный или отсутствующий в группе channel_type игнорируется. Пустой channels → все каналы группы 0.
* '''scene''' - Порядковый номер в плейлисте. Может быть None.
* '''cue''' - Наименование проигрываемой анимации. Может быть None.
 
 
=== PUB <code>lm/statistic/current_playing_priority</code> ===
Публикует текущий приоритет проигрывания.
 
 
Payload format
int
Example
Example
60
  {
    "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]].


==== 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.


== 2. Управление настройками проигрывания и сущностей ==
==== Stop (legacy) ====
 
Payload stop command format
=== PUB <code>lm/settings/location/coordinates</code> ===
Публикует координаты плеера.
 
Payload command format
  {
  {
     "latitude": float,
     "cmd": "stop",
     "longitude": float,
     "priority": Union[int, 'buttons', 'scheduler', 'trigger'],
  }
  }
Example
Example
   {
   {
     "latitude": "56.821019190097616",
     "cmd": "stop",
     "longitude": "60.59559633825789"
     "priority": "buttons"
   }
   }




=== PUB <code>lm/settings/location/address</code> ===
<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
  {
  {
  "address": str
    "groups": {
        str: {
            "now": Layer | null,
            "stale": [Layer, ...],
        },
        ...
    },
    "frame_rate": float,
    "timestamp": int,
  }
  }
Example
 
'''Layer'''
  {
  {
"address": "Yekaterinburg"
    "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> - группа удерживается в нуле, дополнительных полей нет.


=== PUB <code>lm/settings/datetime/timezone</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> удалены, их функциональность полностью покрывается данным топиком.


Payload format
{
  "timezone": str
}
Example
{
"timezone": "Asia/Yekaterinburg"
}
* '''timezone''' - Часовой пояс плеера.


=== PUB <code>lm/player/current_playing_priority</code> ===
Публикует полный снимок текущих приоритетов всех групп. Сообщение публикуется с флагом '''retain=true'''.


=== PUB <code>lm/settings/player/fps</code> ===
Публикация выполняется: при изменении текущего приоритета любой группы; при изменении состава групп после обновления patch/group mapping; после инициализации сервиса; при изменении настроек сопоставления именованных приоритетов (если в этот момент что-то проигрывается, сервис останавливает текущее проигрывание и сбрасывает приоритеты всех групп к наименьшему значению); при завершении сервиса (публикуется пустой snapshot {}).
Публикует настройки fps.


В одном сообщении публикуется полное состояние всех групп, а не только изменившейся - каждое новое сообщение должно рассматриваться как полная замена предыдущего snapshot. Снимок отражает логику арбитража команд, а не фактическое состояние рендера.


Payload format
Payload format
  {
  {
  "fps": int,
    str: Union[int, 'buttons', 'scheduler', 'trigger'],
    ...
  }
  }
Example
Example
  {
  {
"fps": 40
  "all": "scheduler",
  "front": "buttons",
  "back": 75
  }
  }
* '''key''' - Идентификатор группы.
* '''value''' - Текущий приоритет группы. 0 означает наименьший приоритет. Именованные значения buttons, scheduler, trigger публикуются как строки.
'''Замена статистики v1.2.4:''' топик <code>lm/statistic/current_playing_priority</code> (единое целочисленное значение для всего плеера) удалён, заменён данным per-group снимком.




=== PUB <code>lm/settings/player/artsync</code> ===
Публикует статус отправки artsync.


== 2. Управление настройками проигрывания и сущностей ==


=== PUB <code>lm/settings/location/coordinates</code> ===
Публикует координаты плеера. Retained.
Payload format
Payload format
  {
  {
  "artsync": bool,
    "latitude": str,
    "longitude": str,
  }
  }
Значения публикуются строками.
Example
Example
{"artsync": false}
  {
 
    "latitude": "56.821019190097616",
 
    "longitude": "60.59559633825789"
=== PUB <code>lm/settings/player/blackout_between_playing_command</code> ===
  }
Публикует настройку необходимости blackout между событиями проигрывания.




=== PUB <code>lm/settings/location/address</code> ===
Публикует адрес устройства. Retained.
Payload format
Payload format
  {
  {
   "blackout_between_playing_command": bool,
   "address": str
  }
  }
Example
Example
  {
  {
  "blackout_between_playing_command": false
  "address": "Yekaterinburg"
  }
  }




=== PUB <code>lm/settings/player/playing_priority</code> ===
=== PUB <code>lm/settings/datetime/timezone</code> ===
Публикует приоритеты проигрывания плеера.
Публикует часовой пояс плеера. Retained.
Payload format
{
  "timezone": str
}
Example
{
"timezone": "Asia/Yekaterinburg"
}
* '''timezone''' - Часовой пояс плеера.




Payload command format
=== PUB <code>lm/settings/player/fps</code> ===
Публикует настройки fps. Retained.
Payload format
  {
  {
    "buttons": int,
  "fps": int,
    "triggers": int,
    "scheduler": int,
  }
  }
Example
Example
  {
{
    "buttons": 4,
"fps": 40
    "triggers": 5,
}
    "scheduler": 6,
  }
Приоритет представляет из себя целое число от 1 до 100. Чем выше число тем меньше приоритет.




=== PUB <code>lm/settings/player/universes</code> ===
=== PUB <code>lm/settings/player/artsync</code> ===
Публикует настройки вселенных плеера.
Публикует статус отправки artsync. Retained.
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
Payload format
  [
  {
   {
   "locked": bool,
    "number": int,
}
    "device": {
      "name": str,
      "description": str,
      "network_mode": str,
      "ip": str,
      "port": int,
    } | None
  }
]
Example
Example
  [
  {"locked": true}
  {
 
    "number": 1,
 
    "device": {
<span id="pub-lmsettingsplayereffect"></span>
      "name": "artnet_device_1",
=== PUB <code>lm/settings/player/effect_between_playing_command</code> ===
      "description": "Main ArtNet converter",
Публикует настройку эффекта между событиями проигрывания. Retained.
      "network_mode": "unicast",
 
      "ip": "192.168.1.100",
'''Изменение относительно v1.2.4:''' заменяет топик <code>lm/settings/player/blackout_between_playing_command</code> (bool). Вместо булева флага "включен/выключен blackout" используется перечисление типа эффекта.
      "port": 6454
 
    }
Payload format
  },
{
  {
  "effect_between_playing_command": Union['transition', 'blackout', 'fade', 'no_effect'],
    "number": 2,
}
    "device": null
Example
  }
{"effect_between_playing_command": "blackout"}
]
* '''number''' - Номер вселенной (0-32768).
* '''device''' - Настройки ArtNet устройства для данной вселенной. Может быть null если устройство не назначено.
** '''name''' - Уникальное имя ArtNet устройства (до 32 символов).
** '''description''' - Описание устройства (до 255 символов, может быть пустым).
** '''network_mode''' - Режим работы сети (“unicast” или “broadcast”).
** '''ip''' - IP адрес устройства.
** '''port''' - Порт устройства (по умолчанию 6454, диапазон 1-65534).




=== PUB <code>lm/cues</code> ===
<span id="pub-lmsettingsplayerduration"></span>
Публикует список cue файлов загруженных на плеер
=== PUB <code>lm/settings/player/duration_effect_between_playing_command</code> === '''(новое в v1.3.4)'''
Публикует настройку длительности эффекта между событиями проигрывания. Retained.
Payload format
{
  "duration": float,
}
Example
{"duration": 1.0}




=== PUB/SUB <code>lm/settings/player/dimmer_value</code> === '''(новое в v1.3.4)'''
Публикует значения диммера по группам воспроизведения. Retained. Backend также подписан на этот топик: входящее сообщение задаёт новые значения диммера (набор групп во входящем сообщении должен совпадать с текущим).
Payload format
Payload format
  [
  {
   {
   str: float,
    "id": int,
}
    "filename": str,
* '''key''' - Идентификатор группы.
     "uni_count": int,
* '''value''' - Значение диммера, 0.0 - 1.0.
     "frame_count": int,
Examples
     "created": str,
{"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
Example
[
   {
   {
     "id": 47,
     "buttons": 4,
     "filename": "00-5.cue",
     "triggers": 5,
    "uni_count": 1,
     "scheduler": 6
    "frame_count": 220,
     "created": "2024-03-07T08:30:16.926447Z"
   }
   }
]
Приоритет представляет из себя целое число от 1 до 100. Чем выше число тем меньше приоритет.
* '''id''' - Уникальный идентификатор анимации.
* '''filename''' - Имя файла.
* '''uni_count''' - Количество вселенных в файле.
* '''frame_count''' - Количество фреймов в файле.
* '''created''' - Время загрузки анимации в ISO формате.
 
 
=== PUB <code>lm/playlists</code> ===
Публикует список cue файлов загруженных на плеер




=== PUB <code>lm/settings/player/universes</code> ===
Публикует настройки вселенных плеера. Retained.
Payload format
Payload format
  [
  [
   {
   {
     "id": int,
     "number": int,
     "name": str,
     "device": {
    "scenes": [
       "name": str,
       {
      "description": str,
        "id": int,
      "network_mode": str,
        "order": int,
      "ip": str,
        "cue": {
      "port": int,
          "created": str,
    } | None
          "filename": str,
          "frame_count": int,
          "id": int,
          "uni_count": int
        },
        "fade_in": float,
        "fade_out": float,
        "transition_time": float,
        "repeat_value": int,
      }
    ]
   }
   }
  ]
  ]
Строка 308: Строка 451:
  [
  [
   {
   {
     "id": 19,
     "number": 1,
     "name": "Test",
     "device": {
    "scenes": [
       "name": "artnet_device_1",
       {
      "description": "Main ArtNet converter",
        "id": 71,
      "network_mode": "unicast",
        "order": 0,
      "ip": "192.168.1.100",
        "cue": {
      "port": 6454
          "created": "2024-03-07T08:27:23.567083Z",
    }
          "filename": "5-8.cue",
  },
          "frame_count": 220,
  {
          "id": 51,
    "number": 2,
          "uni_count": 1
    "device": null
        },
        "fade_in": 1.0,
        "fade_out": 0.0,
        "transition_time": 2.0,
        "repeat_value": 3600
      }
    ]
   }
   }
  ]
  ]
* '''id''' - Уникальный идентификатор плейлиста.
* '''number''' - Номер вселенной (0-32768).
* '''name''' - Название плейлиста.
* '''device''' - Настройки ArtNet устройства для данной вселенной. Может быть null если устройство не назначено.
* '''scenes''' - Сцены.В сценах содержится вся информация об эффектах примененных к cue и порядковый номер воспроизведения внутри плейлиста.
** '''name''' - Уникальное имя ArtNet устройства (до 32 символов).
** '''id''' - Уникальный идентификатор сцены.
** '''description''' - Описание устройства (до 255 символов, может быть пустым).
** '''order''' - Порядковый номер воспроизведения внутри плейлиста.
** '''network_mode''' - Режим работы сети ("unicast" или "broadcast").
** '''cue''' - Параметры анимации. [[#pub-lmcues|Подробнее]]
** '''ip''' - IP адрес устройства.
** '''fade_in''' - Время fade_in.
** '''port''' - Порт устройства (по умолчанию 6454, диапазон 1-65534).
** '''fade_out''' - Время fade_out.
** '''transition_time''' - Время перехода.
** '''repeat_value''' - Количество повторений.




<span id="pub-lmsettingsfixture"></span>
=== 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]] и топиках расписания.


== 3. Управление расписанием ==
<span id="pub-lmschedulererror"></span>


=== PUB <code>lm/scheduler/error</code> ===
<span id="pub-lmcues"></span>
Публикует ошибки.
=== PUB <code>lm/cues</code> ===
 
Публикует список cue файлов загруженных на плеер. Retained.
Выставляет заголовок '''Correlation data''' если он был установлен в запросе.
Payload format
 
[
 
  {
Payload format<pre>{
     "id": int,
     msg: str
    "filename": str,
     data: Any  
    "uni_count": int,
}</pre>
    "universes": [int],
* '''msg''' - contain error message
     "frame_count": int,
* '''data''' - contain related error data
    "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 формате.




<span id="pub-lmschedulerevents"></span>
=== PUB <code>lm/cues/deleted</code> === '''(новое в v1.3.4)'''
 
Публикует событие об удалении cue.
<span id="pub-lmschedulerevents"></span>
Payload format
 
{ "cue_id": int }
=== PUB <code>lm/scheduler/events</code> ===
Публикует список всех событий календаря.




=== PUB <code>lm/playlists</code> ===
Публикует список плейлистов загруженных на плеер. Retained.
Payload format
Payload format
  [
  [
   {
   {
     "id": str,
     "id": int,
     "title": str,
     "name": str,
     "priority": int,
     "scenes": [
    "actions": {
       {
       "player": Optional[{
         "id": int,
         "cmd": Literal['play'],
         "order": int,
        "entity_type": Union['playlist', 'cue'],
         "cue": {
         "entity_id": int,
          "id": int,
      }],
          "filename": str,
      "do1": Optional[{
          "uni_count": int,
         "state": Literal[0, 1],
          "universes": [int],
      }],
          "frame_count": int,
      "do2": Optional[{
          "created": str
        "state": Literal[0, 1],
        },
      }],
        "fade_in": float,
      "do3": Optional[{
        "fade_out": float,
        "state": Literal[0, 1],
        "transition_time": float,
      }],
        "repeat_value": int,
    },
       }
    "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', 'February', 'March', 'April', 'May', 'June', 'July',
                  'August', 'September', 'October', 'November', 'December',
              ],
          ],
      ],
      "bymonthday": Optional[list[int]],
       "byweekday": Optional[list[Union['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']]],
     
      "from_min": Optional[int],
      "to_min": Optional[int],
    }
   }
   }
  ]
  ]
<span id="example-1"></span>Example
Example
  [
  [
   {
   {
     "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
     "id": 19,
     "title": "holiday",
     "name": "Test",
     "priority": 1,
     "scenes": [
    "actions": {
       {
       "player": {
         "id": 71,
         "cmd": "play",
         "order": 0,
         "entity_type": "playlist",
         "cue": {
         "entity_id": 19
          "id": 51,
      },
          "filename": "5-8.cue",
      "do1": {
          "uni_count": 1,
        "state": 1
          "universes": [1],
      },
          "frame_count": 220,
      "do2": null,
          "created": "2024-03-07T08:27:23.567083Z"
      "do3": null
        },
    },
        "fade_in": 1.0,
    "rrule": {
        "fade_out": 0.0,
      "freq": "DAILY",
        "transition_time": 2.0,
      "interval": 1,
        "repeat_value": 3600
      "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''' - Уникальный идентификатор плейлиста.
* '''title''' - Название события.
* '''name''' - Название плейлиста.
* '''priority''' - Приоритет события. Чем выше значение тем выше приоритет.
* '''scenes''' - Сцены. В сценах содержится вся информация об эффектах, применённых к cue, и порядковый номер воспроизведения внутри плейлиста.
* '''actions''' - Действия которые должны быть выполнены при наступлении события.
** '''id''' - Уникальный идентификатор сцены.
* '''player''' - Действие для плеера. Содержит команду воспроизведения.
** '''order''' - Порядковый номер воспроизведения внутри плейлиста.
* '''cmd''' - Команда для плеера. Всегда равна ‘play’.
** '''cue''' - Параметры анимации, включая новое поле universes. [[#pub-lmcues|Подробнее]]
* '''entity_type''' - Тип сущности для воспроизведения. Может принимать значения ‘playlist’, ‘cue’.
** '''fade_in''' - Время fade_in.
* '''entity_id''' - Уникальный идентификатор сущности для воспроизведения.
** '''fade_out''' - Время fade_out.
* '''do1''' - Действие для цифрового выхода DO1.
** '''transition_time''' - Время перехода.
* '''do2''' - Действие для цифрового выхода DO2.
** '''repeat_value''' - Количество повторений.
* '''do3''' - Действие для цифрового выхода DO3.
 
* '''state''' - Состояние цифрового выхода. Может принимать значения 0 (выключен) или 1 (включен).
 
* '''rrule''' - Правила повторения события (recurrence rule).
=== PUB <code>lm/playlists/deleted</code> === '''(новое в v1.3.4)'''
* '''freq''' - Частота повторений события. Может принимать значения: ‘YEARLY’, ‘MONTHLY’, ‘WEEKLY’, ‘DAILY’, ‘HOURLY’.
Публикует событие об удалении плейлиста.
* '''interval''' - Периодичность повторения события.
Payload format
* '''start_date''' - Дата старта события. Формат YYYY-mm-dd.
{ "playlist_id": int }
* '''start_time_type''' - Тип времени старта события. Может принимать значения: ‘sunset’, ‘sunrise’, ‘time’.
 
* '''start_time''' - Время старта события. Формат: %H:%M. Заполнено если start_time_type равен ‘time’.
* '''start_time_offset''' - Сдвиг времени старта события. Может принимать отрицательные значения. Заполнено если start_time_type равен ‘sunset’ или ‘sunrise’.
* '''count''' - Количество повторений события. Не может быть заполнен одновременно с полем until_date. Если оба поля не заполнены то событие не никогда не завершается.
* '''until_date''' - Дата завершения события. Формат YYYY-mm-dd. Не может быть заполнен одновременно с полем count. Если оба поля не заполнены то событие не никогда не завершается.
* '''until_time_type''' - Тип времени завершения события. Может принимать значения: ‘sunset’, ‘sunrise’, ‘time’. Заполнено если заполнено поле until_date.
* '''until_time''' - Время завершения события. Формат: %H:%M. Заполнено если заполнено поле until_date и until_time_type равен ‘time’.
* '''until_time_offset''' - Сдвиг времени завершения события. Заполнено если заполнено поле until_date и until_time_type равен ‘sunset’ или ‘sunrise’.
* '''from_time_type''' - Тип времени начала события. Может принимать значения: ‘sunset’, ‘sunrise’, ‘time’. Заполнено если поле freq не равно ‘HOURLY’.
* '''from_time''' - Время начала события. Формат: %H:%M. Заполнено если поле freq не равно ‘HOURLY’ и from_time_type равен ‘time’.
* '''from_time_offset''' - Сдвиг времени начала события. Может принимать отрицательные значения. Заполнено если поле freq не равно ‘HOURLY’ и from_time_type равен ‘sunset’ или ‘sunrise’.
* '''to_time_type''' - Тип времени окончания события. Может принимать значения: ‘sunset’, ‘sunrise’, ‘time’. Заполнено если поле freq не равно ‘HOURLY’.
* '''to_time''' - Время окончания события. Формат: %H:%M. Заполнено если заполнено поле freq не равно ‘HOURLY’ и to_time_type равен ‘time’.
* '''to_time_offset''' - Сдвиг времени завершения события. Заполнено если заполнено поле freq не равно ‘HOURLY’ и to_time_type равен ‘sunset’ или ‘sunrise’.
* '''bymonth''' - Месяцы в которые событие активно. Заполнено если поле freq равно ‘YEARLY’.
* '''bymonthday''' - Дни месяца в которые событие активно. Заполнено если поле freq равно ‘MONTHLY’.
* '''byweekday''' - Дни недели в которые событие активно. Заполнено если поле freq равно ‘WEEKLY’.
* '''from_min''' - Минута с которой начинается событие. Заполнено если поле freq равно ‘HOURLY’.
* '''to_min''' - Минута окончания события. Заполнено если поле freq равно ‘HOURLY’.<span id="sub-lmschedulereventsadd"></span>


=== SUB <code>lm/player/commands</code> ===
См. раздел [[#1._Управление_проигрыванием|«1. Управление проигрыванием»]] - основной топик управления воспроизведением по группам (apply/apply_each/update_state).


=== SUB <code>lm/scheduler/events/add</code> ===
Добавляет новое событие.


=== SUB <code>lm/control/config</code> === '''(новое в v1.3.4)'''
Команда сервисам перечитать конфигурацию. Payload - строка (не JSON).
Payload format
Payload format
  {
  "refresh"                     # перечитать общую конфигурацию
    "title": str,
"refresh_universes_settings"   # перечитать настройки вселенных
    "priority": int,
 
    "actions": {
 
      "player": Optional[{
 
        "cmd": Literal['play'],
== 3. Управление расписанием ==
        "entity_type": Union['playlist', 'cue'],
<span id="pub-lmschedulererror"></span>
        "entity_id": int,
 
      }],
=== PUB <code>lm/scheduler/error</code> ===
      "do1": Optional[{
Публикует ошибки. Выставляет заголовок '''Correlation data''' если он был установлен в запросе.
        "state": Literal[0, 1],
 
      }],
Payload format<pre>{
      "do2": Optional[{
    "status": "error",
        "state": Literal[0, 1],
    "msg": str,
      }],
    "data": Any
      "do3": Optional[{
}</pre>
        "state": Literal[0, 1],
* '''status''' - всегда "error" для этого топика. '''(новое поле в v1.3.4)'''
      }],
* '''msg''' - contain error message
    },
* '''data''' - contain related error data
    "rrule": {
 
      "freq": Union['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY'],
Example (ошибка валидации payload, data содержит список ошибок валидации полей):
      "interval": int,
<pre>
      "start_date": str,
{
      "start_time_type": Union['sunset', 'sunrise', 'time'],
  "status": "error",
      "start_time": Optional[str],
   "msg": "Validation error",
      "start_time_offset": Optional[int],
   "data": [
     
     {
      "until_date": Optional[str],
       "type": "missing",
      "until_time_type": Optional[Union['sunset', 'sunrise', 'time']],
       "loc": ["priority"],
      "until_time": Optional[str],
       "msg": "Field required",
      "until_time_offset": Optional[int],
       "input": {"title": "holiday", "rrule": {"freq": "DAILY", "interval": 1, "start_date": "2024-01-20", "start_time_type": "time", "start_time": "00:00"}}
      "count": Optional[int],
     }
      "from_time_type": Optional[Union['sunset', 'sunrise', 'time']],
  ]
      "from_time": Optional[str],
}
      "from_time_offset": Optional[int],
</pre>
      "to_time_type": Optional[Union['sunset', 'sunrise', 'time']],
Example (внутренняя ошибка обработки, data равен null):
      "to_time": Optional[str],
<pre>
      "to_time_offset": Optional[int],
{
      "bymonth": Optional[
  "status": "error",
          list[
  "msg": "Internal Error Occurred",
              Union[
  "data": null
                  'January', 'February', 'March', 'April', 'May', 'June', 'July',
}
                  'August', 'September', 'October', 'November', 'December',
</pre>
              ],
          ],
      ],
      "bymonthday": Optional[list[int]],
      "byweekday": Optional[list[Union['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']]],
     
      "from_min": Optional[int],
      "to_min": Optional[int],
    }
}
Example
{
   "title": "holiday",
   "priority": 1,
  "actions": {
     "player": {
       "cmd": "play",
       "entity_type": "playlist",
       "entity_id": 19
    },
    "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
  }
}
* '''title''' - Название события.
* '''priority''' - Приоритет события. Чем выше значение тем выше приоритет.
* '''actions''' - Действия которые должны быть выполнены при наступлении события.
* '''player''' - Действие для плеера. Содержит команду воспроизведения.
* '''cmd''' - Команда для плеера. Всегда равна ‘play’.
* '''entity_type''' - Тип сущности для воспроизведения. Может принимать значения ‘playlist’, ‘cue’.
* '''entity_id''' - Уникальный идентификатор сущности для воспроизведения.
* '''do1''' - Действие для цифрового выхода DO1.
* '''do2''' - Действие для цифрового выхода DO2.
* '''do3''' - Действие для цифрового выхода DO3.
* '''state''' - Состояние цифрового выхода. Может принимать значения 0 (выключен) или 1 (включен).
* '''rrule''' - Правила повторения события (recurrence rule).
* '''freq''' - Частота повторений события. Может принимать значения: ‘YEARLY’, ‘MONTHLY’, ‘WEEKLY’, ‘DAILY’, ‘HOURLY’.
* '''interval''' - Периодичность повторения события.
* '''start_date''' - Дата старта события. Формат YYYY-mm-dd.
* '''start_time_type''' - Тип времени старта события. Может принимать значения: ‘sunset’, ‘sunrise’, ‘time’.
* '''start_time''' - Время старта события. Формат: %H:%M. Заполнено если start_time_type равен ‘time’.
* '''start_time_offset''' - Сдвиг времени старта события. Может принимать отрицательные значения. Заполнено если start_time_type равен ‘sunset’ или ‘sunrise’.
* '''count''' - Количество повторений события. Не может быть заполнен одновременно с полем until_date. Если оба поля не заполнены то событие не никогда не завершается.
* '''until_date''' - Дата завершения события. Формат YYYY-mm-dd. Не может быть заполнен одновременно с полем count. Если оба поля не заполнены то событие не никогда не завершается.
* '''until_time_type''' - Тип времени завершения события. Может принимать значения: ‘sunset’, ‘sunrise’, ‘time’. Заполнено если заполнено поле until_date.
* '''until_time''' - Время завершения события. Формат: %H:%M. Заполнено если заполнено поле until_date и until_time_type равен ‘time’.
* '''until_time_offset''' - Сдвиг времени завершения события. Заполнено если заполнено поле until_date и until_time_type равен ‘sunset’ или ‘sunrise’.
* '''from_time_type''' - Тип времени начала события. Может принимать значения: ‘sunset’, ‘sunrise’, ‘time’. Заполнено если поле freq не равно ‘HOURLY’.
* '''from_time''' - Время начала события. Формат: %H:%M. Заполнено если поле freq не равно ‘HOURLY’ и from_time_type равен ‘time’.
* '''from_time_offset''' - Сдвиг времени начала события. Может принимать отрицательные значения. Заполнено если поле freq не равно ‘HOURLY’ и from_time_type равен ‘sunset’ или ‘sunrise’.
* '''to_time_type''' - Тип времени окончания события. Может принимать значения: ‘sunset’, ‘sunrise’, ‘time’. Заполнено если поле freq не равно ‘HOURLY’.
* '''to_time''' - Время окончания события. Формат: %H:%M. Заполнено если заполнено поле freq не равно ‘HOURLY’ и to_time_type равен ‘time’.
* '''to_time_offset''' - Сдвиг времени завершения события. Заполнено если заполнено поле freq не равно ‘HOURLY’ и to_time_type равен ‘sunset’ или ‘sunrise’.
* '''bymonth''' - Месяцы в которые событие активно. Заполнено если поле freq равно ‘YEARLY’.
* '''bymonthday''' - Дни месяца в которые событие активно. Заполнено если поле freq равно ‘MONTHLY’.
* '''byweekday''' - Дни недели в которые событие активно. Заполнено если поле freq равно ‘WEEKLY’.
* '''from_min''' - Минута с которой начинается событие. Заполнено если поле freq равно ‘HOURLY’.
* '''to_min''' - Минута окончания события. Заполнено если поле freq равно ‘HOURLY’.




=== SUB <code>lm/scheduler/events/delete</code> ===
<span id="pub-lmschedulerevents"></span>
Удаляет событие.
=== PUB <code>lm/scheduler/events</code> ===
Публикует список всех событий календаря.


Payload format
Payload format
  {
  [
    id: str
}
Example
   {
   {
     "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
     "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
   }
   }
* '''id''' - Уникальный идентификатор события. ___
]


'''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
=== SUB <code>lm/scheduler/events/update</code> ===
[
Обновляет параметры события.
  {
 
    "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
Payload format
     "title": "holiday",
{
     "priority": 1,
  "id": str,
     "title": str,
     "priority": int,
     "actions": {
     "actions": {
       "player": Optional[{
       "player": {
         "cmd": Literal['play'],
         "roof": {"type": "play", "entity_type": "playlist", "entity_id": 19},
        "entity_type": Union['playlist', 'cue'],
        "ungrouped": {"type": "blackout"}
        "entity_id": int,
       },
      }],
       "do1": {"state": 1},
      "do1": Optional[{
       "do2": null,
        "state": Literal[0, 1],
      "do3": null
       }],
       "do2": Optional[{
        "state": Literal[0, 1],
      }],
       "do3": Optional[{
        "state": Literal[0, 1],
      }],
     },
     },
     "rrule": {
     "rrule": {
       "freq": Union['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY'],
       "freq": "DAILY", "interval": 1, "start_date": "2024-01-20",
      "interval": int,
       "start_time_type": "time", "start_time": "00:00", "start_time_offset": null,
      "start_date": str,
       "count": 1, "until_date": null, "until_time_type": null, "until_time": null, "until_time_offset": null,
       "start_time_type": Union['sunset', 'sunrise', 'time'],
       "from_time_type": "sunset", "from_time": null, "from_time_offset": 0,
      "start_time": Optional[str],
       "to_time_type": "sunset", "to_time": null, "to_time_offset": 0,
      "start_time_offset": Optional[int],
       "bymonth": null, "bymonthday": null, "byweekday": null, "from_min": null, "to_min": null
        
      "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', 'February', 'March', 'April', 'May', 'June', 'July',
                  'August', 'September', 'October', 'November', '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": {
      "cmd": "play",
      "entity_type": "playlist",
      "entity_id": 19
    },
    "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)''' Действия для групп плееров. Ключ словаря - название группы (было единственное действие на весь плеер, стало по одному действию на группу).
* '''cmd''' - Команда для плеера. Всегда равна ‘play’.
** '''type''' - Тип действия для группы плеера: 'play', 'blackout' или 'static_color'. '''(blackout и static_color - новые в v1.3.4)'''
* '''entity_type''' - Тип сущности для воспроизведения. Может принимать значения ‘playlist’, ‘cue’.
** '''entity_type''' / '''entity_id''' - заполнены при type='play'.
* '''entity_id''' - Уникальный идентификатор сущности для воспроизведения.
** '''channels''' - словарь канал → 0-255, заполнен при type='static_color'.
* '''do1''' - Действие для цифрового выхода DO1.
* '''do1''' / '''do2''' / '''do3''' - Действие для соответствующего цифрового выхода. state: 0 (выключен) или 1 (включен).
* '''do2''' - Действие для цифрового выхода DO2.
* '''rrule''' - Правила повторения события (recurrence rule):
* '''do3''' - Действие для цифрового выхода DO3.
** '''freq''' - Частота повторений: YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY.
* '''state''' - Состояние цифрового выхода. Может принимать значения 0 (выключен) или 1 (включен).
** '''interval''' - Периодичность повторения события.
* '''rrule''' - Правила повторения события (recurrence rule).
** '''start_date''' - Дата старта события, формат YYYY-mm-dd.
* '''freq''' - Частота повторений события. Может принимать значения: ‘YEARLY’, ‘MONTHLY’, ‘WEEKLY’, ‘DAILY’, ‘HOURLY’.
** '''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''' - Дата старта события. Формат YYYY-mm-dd.
** '''until_time_type''' / '''until_time''' / '''until_time_offset''' - аналогично start_*, но для завершения (заполнены, если задан until_date).
* '''start_time_type''' - Тип времени старта события. Может принимать значения: ‘sunset’, ‘sunrise’, ‘time’.
** '''from_time_type''' / '''from_time''' / '''from_time_offset''' и '''to_time_type''' / '''to_time''' / '''to_time_offset''' - Время начала/окончания события в течение дня; заполнены, если freq ≠ HOURLY.
* '''start_time''' - Время старта события. Формат: %H:%M. Заполнено если start_time_type равен ‘time’.
** '''bymonth''' - Месяцы активности события; заполнено при freq=YEARLY.
* '''start_time_offset''' - Сдвиг времени старта события. Может принимать отрицательные значения. Заполнено если start_time_type равен ‘sunset’ или ‘sunrise’.
** '''bymonthday''' - Дни месяца; заполнено при freq=MONTHLY.
* '''count''' - Количество повторений события. Не может быть заполнен одновременно с полем until_date. Если оба поля не заполнены то событие не никогда не завершается.
** '''byweekday''' - Дни недели; заполнено при freq=WEEKLY.
* '''until_date''' - Дата завершения события. Формат YYYY-mm-dd. Не может быть заполнен одновременно с полем count. Если оба поля не заполнены то событие не никогда не завершается.
** '''from_min''' / '''to_min''' - Минута начала/окончания события; заполнены при freq=HOURLY.
* '''until_time_type''' - Тип времени завершения события. Может принимать значения: ‘sunset’, ‘sunrise’, ‘time’. Заполнено если заполнено поле until_date.
* '''until_time''' - Время завершения события. Формат: %H:%M. Заполнено если заполнено поле until_date и until_time_type равен ‘time’.
* '''until_time_offset''' - Сдвиг времени завершения события. Заполнено если заполнено поле until_date и until_time_type равен ‘sunset’ или ‘sunrise’.
* '''from_time_type''' - Тип времени начала события. Может принимать значения: ‘sunset’, ‘sunrise’, ‘time’. Заполнено если поле freq не равно ‘HOURLY’.
* '''from_time''' - Время начала события. Формат: %H:%M. Заполнено если поле freq не равно ‘HOURLY’ и from_time_type равен ‘time’.
* '''from_time_offset''' - Сдвиг времени начала события. Может принимать отрицательные значения. Заполнено если поле freq не равно ‘HOURLY’ и from_time_type равен ‘sunset’ или ‘sunrise’.
* '''to_time_type''' - Тип времени окончания события. Может принимать значения: ‘sunset’, ‘sunrise’, ‘time’. Заполнено если поле freq не равно ‘HOURLY’.
* '''to_time''' - Время окончания события. Формат: %H:%M. Заполнено если заполнено поле freq не равно ‘HOURLY’ и to_time_type равен ‘time’.
* '''to_time_offset''' - Сдвиг времени завершения события. Заполнено если заполнено поле freq не равно ‘HOURLY’ и to_time_type равен ‘sunset’ или ‘sunrise’.
* '''bymonth''' - Месяцы в которые событие активно. Заполнено если поле freq равно ‘YEARLY’.
* '''bymonthday''' - Дни месяца в которые событие активно. Заполнено если поле freq равно ‘MONTHLY’.
* '''byweekday''' - Дни недели в которые событие активно. Заполнено если поле freq равно ‘WEEKLY’.
* '''from_min''' - Минута с которой начинается событие. Заполнено если поле freq равно ‘HOURLY’.
* '''to_min''' - Минута окончания события. Заполнено если поле freq равно ‘HOURLY’.<span id="pub-lmschedulereventschanges"></span>




=== PUB <code>lm/scheduler/events/changes</code> ===
=== SUB <code>lm/scheduler/events/add</code> ===
Публикует вновь созданные/измененные/удаленные события.<span id="payload-format-5"></span>
Добавляет новое событие '''без действий'''. Действия для созданного события задаются отдельным запросом в топик [[#sub-lmscheduler-actions-update|lm/scheduler/events/actions/update]].


'''Изменение относительно v1.2.4:''' payload с полем <code>actions</code> отклоняется с ошибкой валидации - раньше событие и его действия создавались одним запросом.


Payload format
Payload format
  {
  {
     status: Literal['created', 'updated', 'deleted'],
     "title": str,
    event: {
    "priority": int,
        "id": str,
    "rrule": RRule
        "title": str,
        "priority": int,
        "actions": {
          "player": Optional[{
            "cmd": Literal['play'],
            "entity_type": Union['playlist', 'cue'],
            "entity_id": int,
          }],
          "do1": Optional[{
            "state": Literal[0, 1],
          }],
          "do2": Optional[{
            "state": Literal[0, 1],
          }],
          "do3": Optional[{
            "state": Literal[0, 1],
          }],
        },
        "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', 'February', 'March', 'April', 'May', 'June', 'July',
                      'August', 'September', 'October', 'November', 'December',
                  ],
              ],
          ],
          "bymonthday": Optional[list[int]],
          "byweekday": Optional[list[Union['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']]],
         
          "from_min": Optional[int],
          "to_min": Optional[int],
        }
    }
  }
  }
(формат RRule - см. [[#pub-lmschedulerevents|lm/scheduler/events]] выше)
Example
Example
  {
  {
   "status": "created",
   "title": "holiday",
  "event": {
  "priority": 1,
    "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
  "rrule": {
    "title": "holiday",
     "freq": "DAILY", "interval": 1, "start_date": "2024-01-20",
    "priority": 1,
    "start_time_type": "time", "start_time": "00:00", "start_time_offset": null,
    "actions": {
    "count": 1, "until_date": null, "until_time_type": null, "until_time": null, "until_time_offset": null,
      "player": {
    "from_time_type": "sunset", "from_time": null, "from_time_offset": 0,
        "cmd": "play",
    "to_time_type": "sunset", "to_time": null, "to_time_offset": 0,
        "entity_type": "playlist",
    "bymonth": null, "bymonthday": null, "byweekday": null, "from_min": null, "to_min": null
        "entity_id": 19
   }
      },
  }
      "do1": {
 
        "state": 1
'''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).
      "do2": null,
* При ошибке: status = 'error', data - детали ошибки; ответ также публикуется в [[#pub-lmschedulererror|lm/scheduler/error]].
      "do3": null
 
    },
 
     "rrule": {
=== SUB <code>lm/scheduler/events/delete</code> ===
      "freq": "DAILY",
Удаляет событие.
      "interval": 1,
Payload format
      "start_date": "2024-01-20",
{ "id": str }
      "start_time_type": "time",
Example
      "start_time": "00:00",
{ "id": "abe4c633-8e3f-4938-94e2-efd135d993fc" }
      "start_time_offset": null,
* '''id''' - Уникальный идентификатор события.
      "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
    }
   }
  }
* '''status''' - Тип изменения. Может принимать значения ‘created’, ‘updated’, ‘deleted’.
* '''event''' - Событие со всеми параметрами в формате SchedulerEvent. ___


'''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/periods</code> ===
Принимает запрос на публикацию всех одиночных событий за указанный период.


Запрос должен содержать cor data для последующей идентификации ответа. Запрос может содержать resp_topic. В противном случае ответ будет опубликован в топик <code>lm/scheduler/events/periods/response</code>.
=== 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
  {
  {
     from_datetime: str,
     "id": str,
     to_datetime: str,
     "title": str,
     filters: Optional[{
     "priority": int,
        player: bool,
    "rrule": RRule
        do1: bool,
        do2: bool,
        do3: bool,
    }]
  }
  }
Example
Example
  {
  {
   "from_datetime": "2024-02-25T05:00:00",
   "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
   "to_datetime": "2024-04-08T05:00:00",
  "title": "holiday",
  "filters": {
  "priority": 1,
     "player": true,
   "rrule": {
     "do1": false,
    "freq": "DAILY", "interval": 1, "start_date": "2024-01-20",
     "do2": false,
    "start_time_type": "time", "start_time": "00:00", "start_time_offset": null,
     "do3": false
     "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
   }
   }
  }
  }
* '''from_datetime''' - Дата и время начала диапазона в iso формате.
* '''to_datetime''' - Дата и время окончания диапазона в iso формате.
* '''filters''' - Опциональные фильтры для типов действий. Если не указаны, возвращаются события со всеми типами действий.
* '''player''' - Включать события с действиями плеера.
* '''do1''' - Включать события с действиями для цифрового выхода DO1.
* '''do2''' - Включать события с действиями для цифрового выхода DO2.
* '''do3''' - Включать события с действиями для цифрового выхода DO3.


'''Response''' '''(новое в v1.3.4)''' - топик <code>lm/scheduler/events/update/response</code>, конверт {status, msg, data} - аналогично events/add/response, data - обновлённое событие.


=== PUB <code>lm/scheduler/events/periods/response</code> ===
Публикует список одиночных событий календаря за указанный период. Период задается в запросе. Запрос принимается на топик <code>lm/scheduler/events/periods</code>


<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
    title: str
    start: str
    end: str
    priority: int
    duration: float
  }
]
Example
[
  {
    "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
  }
]
* '''id''' - Уникальный идентификатор события.
* '''title''' - Название события.
* '''priority''' - Приоритет события. Чем выше значение тем выше приоритет.
* '''start''' - Дата и время начала события в ISO формате.
* '''end''' - Дата и время окончания события в ISO формате.
* '''duration''' - Продолжительность события в секундах.
=== PUB <code>lm/scheduler/player/status</code> ===
Публикует текущее активное событие плеера если оно есть.
Payload format<span id="событие-есть"></span>Событие есть:
  {
  {
  status: Literal['running'],
    "id": str,
  event: {
    "actions": {
    id: str,
      "player": {
    title: str,
        str: {"type": "play", "entity_type": Union['playlist','cue'], "entity_id": int, "count": None}
    action: {
            | {"type": "blackout"}
      cmd: Literal['play']
            | {"type": "static_color", "channels": dict[str, int]}
      entity_type: Literal['playlist', 'cue']
      },
       entity_id: int 
      "do": {
     }
        Literal['1','2','3']: {"port": Literal[1,2,3], "state": Literal[0,1]}
  }
       },
     },
  }
  }
Example
Example
  {
  {
   "status": "running",
   "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
   "event": {
   "actions": {
     "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
     "player": {
    "title": "holiday",
      "roof": {"type": "play", "entity_type": "playlist", "entity_id": 19, "count": null},
    "action": {
      "ungrouped": {"type": "blackout"},
       "cmd": "play",
       "stage": {"type": "static_color", "channels": {"red": 128, "green": 0, "blue": 0}}
      "entity_type": "playlist",
    },
      "entity_id": 19
     "do": {"1": {"port": 1, "state": 1}}
     }
   }
   }
  }
  }
 
Clear actions example
 
 
События нет:
  {
  {
   status: Literal['no_event'],
   "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
  "actions": {"player": {}, "do": {}}
  }
  }
Example
* '''id''' - Уникальный идентификатор события (UUID).
{
* '''actions.player''' - Действия для групп плееров, ключ словаря - название группы. type: play/blackout/static_color; entity_type/entity_id заполнены при play; count - зарезервировано, для play должно быть null; channels заполнено при static_color.
  "status": "no_event"
* '''actions.do''' - Действия для цифровых выходов, ключ словаря - номер порта строкой ('1','2','3'); port должен совпадать с ключом; state - 0 или 1.
}
* '''status''' - Текущий статус расписания. Может принимать значения ‘running’, ‘no_event’.
* '''event''' - Активное событие со всеми параметрами. Присутствует только когда status равен ‘running’.
* '''id''' - Уникальный идентификатор события.
* '''title''' - Название события.
* '''action''' - Действие которое должно быть выполнено для данного события.
* '''cmd''' - Команда для выполнения. Всегда равна ‘play’.
* '''entity_type''' - Тип сущности для воспроизведения. Может принимать значения ‘playlist’, ‘cue’.
* '''entity_id''' - Уникальный идентификатор сущности для воспроизведения.


'''Response''' - топик <code>lm/scheduler/events/actions/update/response</code>, конверт {status, msg, data} - аналогично events/add/response, data - обновлённое событие.




=== PUB <code>lm/scheduler/do/*/status</code> ===
=== PUB <code>lm/scheduler/events/changes</code> ===
Публикует текущее активное событие управления цифровым выходом DO1 если оно есть.
Публикует вновь созданные/изменённые/удалённые события.
 
Payload format
 
PUB <code>lm/scheduler/do/1/status</code><span id="pub-lmschedulerdo2status"></span>PUB <code>lm/scheduler/do/2/status</code><span id="pub-lmschedulerdo3status"></span>PUB <code>lm/scheduler/do/3/status</code>
 
 
Payload format<span id="событие-есть-1"></span>Событие есть:
  {
  {
  status: Literal['running'],
    "status": Literal['created', 'updated', 'deleted'],
  event: {
     "event": Event   # формат события - см. lm/scheduler/events выше
    id: str,
    title: str,
     action: {
      state: Literal[0, 1]
    }
   }
  }
  }
Example
Example
  {
  {
   "status": "running",
   "status": "created",
   "event": {
   "event": {
     "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
     "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
     "title": "holiday",
     "title": "holiday",
     "action": {
     "priority": 1,
       "state": 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
  {
  {
  status: Literal['no_event'],
    "from_datetime": str,
    "to_datetime": str,
    "filters": Optional[{"player": bool, "do1": bool, "do2": bool, "do3": bool}]
  }
  }
Example
Example
  {
  {
   "status": "no_event"
   "from_datetime": "2024-02-25T05:00:00",
  "to_datetime": "2024-04-08T05:00:00",
  "filters": {"player": true, "do1": false, "do2": false, "do3": false}
  }
  }
* '''status''' - Текущий статус расписания для DO1. Может принимать значения ‘running’, ‘no_event’.
* '''from_datetime''' / '''to_datetime''' - Начало/окончание диапазона в ISO формате.
* '''event''' - Активное событие со всеми параметрами. Присутствует только когда status равен ‘running’.
* '''filters''' - Опциональные фильтры типов действий; если не указаны, возвращаются события со всеми типами действий.
* '''id''' - Уникальный идентификатор события.
 
* '''title''' - Название события.
'''Response''' - ответ публикуется в топик lm/scheduler/events/periods/response (или в Response Topic), конверт {status, msg, data} - data содержит список одиночных событий за период; Correlation Data копируется в ответ; при ошибке ответ также публикуется в lm/scheduler/error.
* '''action''' - Действие которое должно быть выполнено для данного события.
 
* '''state''' - Состояние цифрового выхода. Может принимать значения 0 (выключен) или 1 (включен).


=== PUB <code>lm/scheduler/events/periods/response</code> ===
Публикует список одиночных событий календаря за указанный период (период задаётся в запросе lm/scheduler/events/periods).


=== SUB <code>lm/settings/datetime/timezone</code> ===
'''Изменение относительно v1.2.4:''' payload теперь объект-конверт {status, msg, data}, где список событий находится в поле data. Раньше payload был самим JSON-массивом событий.
Получает текущую таймзону.


Payload format
Payload format
  {
  {
     timezone: str
     "status": Literal['success'],
    "msg": str,
    "data": [
      { "id": str, "title": str, "start": str, "end": str, "priority": int, "duration": float }
    ]
  }
  }
Example
Example
   {
{
    "timezone": "Europe/Moscow",
  "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 (сек).




=== SUB <code>lm/settings/location/coordinates</code> ===
=== 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 (событие есть)
  {
  {
   latitude: float
   "status": "running",
   longitude: float
   "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
Example
   {
{
     latitude: 56.821019190097616
   "status": "running",
     longitude: 60.59559633825789
  "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 <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
{ "status": "running", "event": {"id": "abe4c633-8e3f-4938-94e2-efd135d993fc", "title": "holiday", "action": {"state": 1}} }
Payload format (события нет)
{ "status": "no_event" }


== 4 Управление устройствами Art-Net ==
 
Сервис осуществляет мониторинг и управления ArtNet и RDM устройствами.
=== SUB <code>lm/settings/datetime/timezone</code> ===
Получает текущую таймзону (используется сервисом расписания для расчёта солнечного времени).
Payload format
{ "timezone": str }
Example
{ "timezone": "Europe/Moscow" }
 
 
=== SUB <code>lm/settings/location/coordinates</code> ===
Получает координаты устройства для расчёта солнечного времени.
Payload format
{ "latitude": float, "longitude": float }
Example
{ "latitude": 56.821019190097616, "longitude": 60.59559633825789 }




<span id="pub-lmartnet_devices_management_serviceerror"></span>


=== PUB <code>lm/artnet_devices_management_service/error</code> ===
= II. Оборудование и интерфейсы =
Публикует ошибки.
Физические устройства и интерфейсы, которыми управляет и которые опрашивает плеер: ArtNet/RDM-устройства, DI/DO, внешние датчики, RS485, светодиоды. Эти разделы можно использовать как справочник по конкретному интерфейсу, не читая по порядку.


Выставляет заголовок '''Correlation data''' если он был установлен в запросе.
== 4. Управление устройствами Art-Net ==
Сервис осуществляет мониторинг и управление ArtNet и RDM устройствами.


<span id="pub-lmartnet_devices_management_serviceerror"></span>
=== PUB <code>lm/artnet_devices_management_service/error</code> ===
Публикует ошибки. Выставляет заголовок '''Correlation data''' если он был установлен в запросе.


Payload format<pre>{
Payload format<pre>{
     msg: str
     msg: str
     data: Any
     data: Any
}</pre>
}</pre>
* '''msg''' - contain error message
* '''msg''' - contain error message
Строка 1124: Строка 1028:


=== PUB <code>lm/artnet_devices_management_service/artnet/devices/changes</code> ===
=== PUB <code>lm/artnet_devices_management_service/artnet/devices/changes</code> ===
Публикует вновь созданные/измененные/удаленные ArtNet устройства.
Публикует вновь созданные/изменённые/удалённые ArtNet устройства.
 


Payload format
Payload format
  {
  {
     status: Literal['created', 'updated', 'deleted']
     "status": Literal['created', 'updated', 'deleted'],
     device: {
     "device": {
         mac_address: str
         "mac_address": str,
         ip_address: str
         "ip_address": str,
         subnet_mask: str
         "subnet_mask": str,
         default_gateway: str
         "default_gateway": str,
         dhcp_status: bool
         "dhcp_status": bool,
         name: str
         "name": str,
         style: str
        "esta_man_code": int,
         firmware_version: str
        "oem_code": int,
         ports: dict[
         "style": str,
             int,
         "firmware_version": str,
             {
         "ports": dict[int, {
                bind_index: int
             "bind_index": int,
                is_input: bool
             "port_index": int,
                is_output: bool
            "is_input": bool,
                port_type: Literal[
            "is_output": bool,
                    'DALI',
            "port_type": Literal['DALI','ArtNet','ADB','Colortran_CMX','Avab','MIDI','DMX512'],
                    'ArtNet',
            "name": str,
                    'ADB',
            "universe": int,
                    'Colortran_CMX',
            "is_rdm_on": bool,
                    'Avab',
            "physical_port": Optional[int],
                    'MIDI',
            "mode": Optional[Literal['DMX IN', 'DMX OUT', 'SPI']],
                    'DMX512',
            "is_data_transmitting": bool,
                ]
            "tod_uids": list[str],
                name: str
             "lost": bool,
                universe: int
         }],
                is_rdm_on: bool
         "status": str,
                physical_port: Optional[int]
         "dev_mode": Optional[str],
                out_signal: Optional[Literal['DMX', 'SPI']]
         "spi_settings": Optional[{
                is_data_transmitting: bool
             "chip": str, "mode": str, "period": int, "time_high_0": int,
             }
            "time_high_1": int, "time_reset": int, "gamma": int, "bit_mode": str,
         ]
        }],
         status: str
        "dmx_settings": Optional[{
         dev_mode: Optional[str]
            "break_time": int, "mab_time": int, "chan_time": int, "pause_time": int, "chan_num": int,
         spi_settings: Optional[
        }],
             {
    }
                chip: str
}
                mode: str
 
                period: int
'''Изменения относительно v1.2.4:'''
                time_high_0: int
* Добавлены поля '''esta_man_code''' и '''oem_code''' на устройстве.
                time_high_1: int
* В элементах ports добавлены '''port_index''', '''tod_uids''' (список UID подключённых RDM-устройств) и '''lost''' (признак потери порта).
                 time_reset: int
* Поле '''out_signal''' (Optional[Literal['DMX','SPI']]) переименовано и расширено в '''mode''' (Optional[Literal['DMX IN', 'DMX OUT', 'SPI']]).
                 gamma: int
* Поле '''rdm_devices_count''' на устройстве убрано (количество RDM-устройств теперь можно получить через tod_uids на портах либо из списка RDM-устройств).
                 bit_mode: str
 
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
             }
             }
         ]
         },
         dmx_settings: Optional[
        "status": "RcPowerOk",
            {
         "dev_mode": null,
                break_time: int
        "spi_settings": null,
                mab_time: int
        "dmx_settings": {"break_time": 90, "mab_time": 8, "chan_time": 50, "pause_time": 40, "chan_num": 512}
                chan_time: int
                pause_time: int
                chan_num: int
            }
        ]
        rdm_devices_count: int
     }
     }
  }
  }




=== PUB <code>lm/artnet_devices_management_service/rdm/devices/changes</code> ===
=== PUB <code>lm/artnet_devices_management_service/rdm/devices/changes</code> ===
Публикует вновь созданные/измененные/удаленные RDM устройства.
Публикует вновь созданные/изменённые/удалённые RDM устройства.


'''Изменения относительно v1.2.4:''' структура устройства пересмотрена - добавлено поле '''status''' (online/offline); поле art_net_device_ip переименовано в '''ip'''; поле port переименовано в '''physical_port'''; поле art_net_device_mac убрано.


Payload format
Payload format
  {
  {
     status: Literal['created', 'updated', 'deleted']
     "status": Literal['created', 'updated', 'deleted'],
     device: {
     "device": {
         uid: str
         "uid": str,
         art_net_device_mac: str
         "status": Literal['online', 'offline'],
         art_net_device_ip: str
         "supported_params": dict[str, Any],
         port: int
         "ip": str,
         supported_params: dict[str, Any]
         "physical_port": int,
     }
     }
  }
  }
* '''uid''' - Уникальный идентификатор устройства.
* '''uid''' - Уникальный идентификатор устройства.
* '''art_net_device_mac''' - Mac адрес ArtNet устройства к которому подключено данное rdm устройство.
* '''status''' - Состояние устройства: online или offline. '''(новое поле в v1.3.4)'''
* '''art_net_device_ip''' - IP адрес ArtNet устройства к которому подключено данное rdm устройство.
* '''port''' - Номер порта ArtNet устройства к которому подключено данное rdm устройство.
* '''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> ===
=== PUB <code>lm/artnet_devices_management_service/cmd_response</code> ===
Публикует результаты выполнения асинхронных команд.
Публикует результаты выполнения асинхронных REST команд. Используется для уведомления о завершении длительных операций, выполняемых в фоновом режиме. Клиент получает transaction_uid при инициации команды и может отслеживать её статус через данный топик.
 
Используется для уведомления о завершении длительных операций, которые выполняются в фоновом режиме. Клиент получает <code>transaction_uid</code> при инициации команды и может отслеживать её статус через данный топик.
 


Payload format
Payload format
Строка 1224: Строка 1162:
     "status": "string"
     "status": "string"
  }
  }
* '''transaction_uid''' - Уникальный идентификатор транзакции, возвращаемый при инициации асинхронной команды
* '''transaction_uid''' - Уникальный идентификатор транзакции, возвращаемый при инициации асинхронной команды.
* '''status''' - Статус выполнения команды. Возможные значения: “done”, “error”
* '''status''' - Статус выполнения команды. '''В текущей реализации публикуется только "done"''' (в v1.2.4 также предполагалось значение "error").
 


Example
Example
Строка 1236: Строка 1173:




== 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)


== 5 Управление триггерами ==
Публикует состояние di порта
<span id="pub-lmtrigger_servicetriggertrigger_list"></span>


=== PUB <code>'lm/trigger_service/trigger/trigger_list'</code> ===
* '''di_port_number''' - Номер di порта.
Публикует список всех триггеров. Топик всегда содержит актуальный список.




Payload format
Payload format
  [
  int
    {
Example
        name: str
  1
        tr_type: str
* '''int''' - Статус Di порта. 1 - активен, 0 - неактивен.
        params: dict[str, Any]
    }
  ]
* '''name''' - Имя триггера.
* '''tr_type''' - Тип триггера.
* '''params''' - Словарь с параметрами триггера.


<span id="pub-lmdoport0-player-v1-only"></span>


Example
=== PUB <code>lm/do/port/*</code> ===
[
PUB <code>lm/do/port/0</code> (player V1 only)
    {
        "name": "TriggerFromMqtt",
        "tr_type": "RawUDP",
        "params": {
            "network_type": "udp",
            "listen_ip": "0.0.0.0",
            "listen_port": "5555",
            "data": "any"
        }
    }
]


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)


=== PUB <code>lm/trigger_service/action/action_list</code> ===
Публикует состояние do порта
Публикует список всех action. <br />Топик всегда содержит актуальный список.
 
* '''do_port_number''' - Номер do порта.




Payload format
Payload format
  [
  int
    {
Example
        name: str
  1
        action_type: str
* '''int''' - Статус DO порта. 1 - активен, 0 - неактивен.
        params: dict[str, Any]
 
    }
=== SUB <code>lm/do/change_state</code> ===
  ]
Принимает команды для изменения состояния DO порта.
* '''name''' - Имя action.
* '''action_type''' - Тип action.
* '''params''' - Словарь с параметрами action.




Payload command format
{
    "port": int,
    "state": int,
}
Example
Example
[
  {
     {
     "port": 1,
        "name": "default",
    "state": 1,
        "action_type": "send_trigger_to_mqtt",
  }
        "params": {
* '''port''' - Номер do порта.
            "topic": "lm/trigger_service/trigger/",
* '''state''' - Статус порта. 1 - активен, 0 - неактивен.
            "payload": "",
 
            "retain": false
 
        }
 
    }
 
]


== 6. Управление внешними датчиками ==
Описывает MQTT API сервиса управления внешними датчиками.


=== PUB <code>lm/trigger_service/relation_list</code> ===
=== PUB <code>lm/sensors/{sensor_id}/data</code> ===
Публикует список всех связей между триггером и action.
Публикует данные датчика.


Payload format<pre>{ 
    str
}</pre>
* str - данные датчика


Payload format
Example<pre>{  
  [
     "34"
     {
}</pre>
        trigger: {
== 7. Управление RS485 интерфейсами плеера ==
            name: str
<span id="pub-lmserialport_controllererror"></span>
            tr_type: str
 
            params: dict[str, Any]
=== PUB <code>lm/serialport_controller/error</code> ===
        }
Публикует ошибки.
        action: {
 
            name: str
Выставляет заголовок '''Correlation data''' если он был установлен в запросе.
            action_type: str
 
            params: dict[str, Any]
 
        }
Payload format<pre>{
    }
    msg: str
]
    data: Any
* '''trigger''' - Словарь с триггером.
}</pre>
* '''action''' - Словарь с action.
* '''msg''' - contain error message
* '''data''' - contain related error data
 
 
=== PUB <code>lm/serialport_controller/ports</code> ===
Публикует список rs485 портов.




Example
Payload format
  [
  [
     {
     {
         "trigger": {
         name: str
            "name": "TriggerFromMqtt",
         mode: Literal['rs485', 'dmxOut']
            "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
            }
        }
     }
     }
  ]
  ]
* '''name''' - Имя порта.
* '''mode''' - Предназначение порта.




=== SUB <code>lm/trigger_service/trigger/add</code> ===
Example
Добавляет новый триггер.
[
 
    {
На данный момент доступны три типа триггера: <code>RawUDP</code> и <code>ArtNet</code> и <code>Mqtt</code>.
        "name": "port1",
        "mode": "rs485",
    },
    {
        "name": "port2",
        "mode": "rs485",
    },
    {
        "name": "port3",
        "mode": "dmxOut",
    },
    {
        "name": "port4",
        "mode": "dmxOut",
    }
]
 


* RawUDP - Срабатывает при получении UDP пакета удовлетворяющего заданным параметрам.
=== SUB <code>lm/serialport_controller/ports/change_mode</code> ===
* ArtNet - Срабатывает при получении ArtNet пакета удовлетворяющего заданным параметрам.
Меняет предназначение порта.
* Mqtt - Срабатывает при получении Mqtt сообщения удовлетворяющего заданным параметрам.




Строка 1366: Строка 1302:
  {
  {
     name: str
     name: str
     tr_type: str
     mode: Literal['rs485', 'dmxOut']
    params: dict[str, Any]
  }
  }
* '''name''' - Имя триггера.
* '''name''' - Имя порта.
* '''tr_type''' - Тип триггера.
* '''mode''' - Предназначение порта.
* '''params''' - Словарь с параметрами триггера. Параметры отличаются в зависимости от типа триггера.




Example
Example
  {
  {
     "name": "TriggerFromMqtt",
     "name": "port1",
     "tr_type": "RawUDP",
     "mode": "rs485",
    "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"
}


== 8. Управление светодиодами плеера ==
<span id="pub-lmledsstate"></span>


=== PUB <code>'lm/leds/state'</code> ===
Публикует состояние диодов rs485 портов


Параметры для <u>триггера с типом ArtNet</u>
 
    {
Payload format
        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''' - Максимальное значение в канале для срабатывания триггера.<span id="example-artnet-params"></span>Example ArtNet params
  {
  {
     "network_type": "udp",
     Port1: {
     "listen_ip": "0.0.0.0",
      green: bool,
     "listen_port": "6454",
      red: bool,
     "universe": 3,
    },
     "channel": 5,
     Port2: {
    "min_level": 1,
      green: bool,
     "max_level": 124
      red: bool,
     },
    Port3: {
      green: bool,
      red: bool,
     },
     Port4: {
      green: bool,
      red: bool,
     },
  }
  }




 
Example
Параметры для <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",
     "Port1": {
     "payload": "\x01"
      "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 порта.


=== SUB <code>lm/trigger_service/trigger/delete</code> ===
Удаляет триггер.


<span id="payload-format-4"></span>
Payload command format
=== Payload format ===
  {
  {
     name: str
     pub port: Literal['Port1', 'Port2', 'Port3', 'Port4'],
}
    green: bool,
* '''name''' - Имя триггера.<span id="example-4"></span>Example
     red: bool,
{
     "name": "TriggerFromMqtt",
  }
  }




=== SUB <code>lm/trigger_service/action/add</code> ===
Example
Добавляет новый action.
  {
    "port": "Port1",
    "green": true,
    "red": false,
  }
* '''port''' - Имя rs485 порта.
* '''green''' - Статус зеленого светодиода.
* '''red''' - Статус красного светодиода.


На данный момент доступны два типа action: <code>send_mqtt_msg_raw</code> и <code>send_trigger_to_mqtt</code>.
=== SUB <code>lm/leds/blink</code> ===
 
Принимает команды для мигания всех светодиодов на всех rs485 портах.
* '''send_mqtt_msg_raw''' - Отправляет по mqtt сообщение записанное в параметрах не внося в него никаких изменений.
* '''send_trigger_to_mqtt''' - Отправляет по mqtt сообщение в теле которого находится сработавший триггер.




Payload format
Payload format
  {
  {
     name: str
     times: int,
    action_type: str
     interval: int,
     params: dict[str, Any]
  }
  }
* '''name''' - Имя action.
Example
* '''action_type''' - Тип action.
* '''params''' - Словарь с параметрами action. Различается в зависимости от типа action.<span id="example-5"></span>Example
  {
  {
     "name": "default",
     "times": 5,
     "action_type": "send_trigger_to_mqtt",
     "interval": 1000
    "params": {
        "topic": "lm/trigger_service/trigger/",
        "payload": "",
        "retain": false
    }
  }
  }
* '''times''' - Количество миганий (от 1 до 255).
* '''interval''' - Интервал между миганиями в миллисекундах.




= III. Триггеры и actions =
Автоматизация: как настроить реакцию плеера на внешние события (сигналы RawUDP/ArtNet/Mqtt, показания DI/DO и внешних датчиков из раздела II) и что при этом публикуется в MQTT. Раздел имеет смысл читать после разделов I и II — action'ы триггеров ссылаются на то, что там описано.


'''Ожидаемые Параметры'''
== 9. Управление триггерами ==
<span id="pub-lmtrigger_servicetriggertrigger_list"></span>


Параметры для actions с типом <code>send_trigger_to_mqtt</code> и <code>send_trigger_to_mqtt</code> совпадают.
=== PUB <code>'lm/trigger_service/trigger/trigger_list'</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''' но в сообщении они должны присутствовать.


 
Payload format
Example params
[
  {
    {
         "topic": "lm/trigger_service/trigger/",
        name: str
         "payload": "",
        tr_type: str
         "retain": false
        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"
        }
    }
  ]




=== SUB <code>lm/trigger_service/action/delete</code> ===
=== PUB <code>lm/trigger_service/action/action_list</code> ===
Удаляет action.
Публикует список всех action. <br />Топик всегда содержит актуальный список.




Payload format
Payload format
  {
  [
    name: str
    {
  }
        name: str
        action_type: str
        params: dict[str, Any]
    }
  ]
* '''name''' - Имя action.
* '''name''' - Имя action.
* '''action_type''' - Тип action.
* '''params''' - Словарь с параметрами action.




Example
Example
  {
  [
    "name": "default",
    {
  }
        "name": "default",
        "action_type": "send_trigger_to_mqtt",
        "params": {
            "topic": "lm/trigger_service/trigger/",
            "payload": "",
            "retain": false
        }
    }
  ]




=== SUB <code>lm/trigger_service/set_trigger_to_action_relation</code> ===
=== PUB <code>lm/trigger_service/relation_list</code> ===
Создает связь между триггером и action.
Публикует список всех связей между триггером и action.




Payload format
Payload format
     trigger: {
[
        name: str
     {
        tr_type: str
        trigger: {
        params: dict[str, Any]
            name: str
    }
            tr_type: str
    action: {
            params: dict[str, Any]
        name: str
        }
        action_type: str
        action: {
        params: dict[str, Any]
            name: str
            action_type: str
            params: dict[str, Any]
        }
     }
     }
]
* '''trigger''' - Словарь с триггером.
* '''trigger''' - Словарь с триггером.
* '''action''' - Словарь с action.
* '''action''' - Словарь с action.
Строка 1557: Строка 1501:


Example
Example
  {
  [
    "trigger": {
    {
        "name": "TriggerFromMqtt",
        "trigger": {
        "tr_type": "RawUDP",
            "name": "TriggerFromMqtt",
        "params": {
            "tr_type": "RawUDP",
            "network_type": "udp",
            "params": {
            "listen_ip": "0.0.0.0",
                "network_type": "udp",
            "listen_port": "5555",
                "listen_ip": "0.0.0.0",
            "data": "any"
                "listen_port": "5555",
        }
                "data": "any"
    },
            }
    "action": {
        },
        "name": "default",
        "action": {
        "action_type": "send_trigger_to_mqtt",
            "name": "default",
        "params": {
            "action_type": "send_trigger_to_mqtt",
            "topic": "lm/trigger_service/trigger/",
            "params": {
            "payload": "",
                "topic": "lm/trigger_service/trigger/",
            "retain": false
                "payload": "",
                "retain": false
            }
         }
         }
     }
     }
  }
  ]




=== SUB <code>lm/trigger_service/delete_trigger_to_action_relation</code> ===
=== SUB <code>lm/trigger_service/trigger/add</code> ===
Удаляет связь между триггером и action.
Добавляет новый триггер.
 
На данный момент доступны три типа триггера: <code>RawUDP</code> и <code>ArtNet</code> и <code>Mqtt</code>.
 
* RawUDP - Срабатывает при получении UDP пакета удовлетворяющего заданным параметрам.
* ArtNet - Срабатывает при получении ArtNet пакета удовлетворяющего заданным параметрам.
* Mqtt - Срабатывает при получении Mqtt сообщения удовлетворяющего заданным параметрам.




Payload format
Payload format
    trigger: {
{
        name: str
    name: str
        tr_type: str
    tr_type: str
        params: dict[str, Any]
    params: dict[str, Any]
    }
}
    action: {
* '''name''' - Имя триггера.
        name: str
* '''tr_type''' - Тип триггера.
        action_type: str
* '''params''' - Словарь с параметрами триггера. Параметры отличаются в зависимости от типа триггера.
        params: dict[str, Any]
    }
* '''trigger''' - Словарь с триггером.
* '''action''' - Словарь с action.




Example
Example
  {
  {
     "trigger": {
     "name": "TriggerFromMqtt",
        "name": "TriggerFromMqtt",
    "tr_type": "RawUDP",
        "tr_type": "RawUDP",
    "params": {
        "params": {
        "network_type": "udp",
            "network_type": "udp",
        "listen_ip": "0.0.0.0",
            "listen_ip": "0.0.0.0",
        "listen_port": "5555",
            "listen_port": "5555",
        "data": "any"
            "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''' если он был установлен в запросе.
'''Ожидаемые Параметры'''


Параметры для <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"
}


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> ===
Параметры для <u>триггера с типом ArtNet</u>
Удаляет триггер и все связанные с ним действия.
    {
 
        network_type: Literal['tcp', 'udp']
 
        listen_ip: str
Payload format
        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''' - Максимальное значение в канале для срабатывания триггера.<span id="example-artnet-params"></span>Example ArtNet params
  {
  {
     name: str
     "network_type": "udp",
}
    "listen_ip": "0.0.0.0",
* '''name''' - Имя триггера.<span id="example-10"></span>Example
    "listen_port": "6454",
{
    "universe": 3,
     "name": "TriggerFromMqtt",
     "channel": 5,
    "min_level": 1,
    "max_level": 124
  }
  }






== 6. Настройки системы ==
Параметры для <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> ===
Удаляет триггер.


=== PUB <code>lm/system_configurator/error</code> ===
<span id="payload-format-4"></span>
Публикует ошибки.
=== Payload format ===
{
    name: str
}
* '''name''' - Имя триггера.<span id="example-4"></span>Example
{
    "name": "TriggerFromMqtt",
}


Выставляет заголовок '''Correlation data''' если он был установлен в запросе.


=== SUB <code>lm/trigger_service/action/add</code> ===
Добавляет новый action.


Payload format<pre>
На данный момент доступны два типа action: <code>send_mqtt_msg_raw</code> и <code>send_trigger_to_mqtt</code>.
    msg: str
    data: Any 
}</pre>
* '''msg''' - contain error message
* '''data''' - contain related error data


 
* '''send_mqtt_msg_raw''' - Отправляет по mqtt сообщение записанное в параметрах не внося в него никаких изменений.
=== PUB <code>lm/system_settings/external_access/certificates</code> ===
* '''send_trigger_to_mqtt''' - Отправляет по mqtt сообщение в теле которого находится сработавший триггер.
Публикует список всех x509 сертификатов.<br />Топик всегда содержит актуальный список.




Payload format
Payload format
  [
  {
     {
     name: str
        name: str
    action_type: str
        cert_type: str
    params: dict[str, Any]
        public_bytes: 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
     }
     }
  ]
  }
* '''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> ===
Публикует список настроек web доступа.<br />Топик всегда содержит актуальный список.


'''Ожидаемые Параметры'''


Payload format
Параметры для actions с типом <code>send_trigger_to_mqtt</code> и <code>send_trigger_to_mqtt</code> совпадают.
  {
  {
     http_port: int
     topic: str
     https_port: int
     payload: str
    is_https_enabled: bool
     retain: bool
     is_http_redirected: bool
    cert_name: str
  }
  }
* '''http_port''' - Http порт. По умолчанию 80.
* '''topic''' - Mqtt topic в который будет отправлено сообщение.
* '''https_port''' - Https порт. По умолчанию 443.
* '''payload''' - Mqtt payload. Полезная нагрузка сообщения.
* '''is_https_enabled''' - Индикатор включен ли https.
* '''retain''' - Mqtt retain param.
* '''is_http_redirected''' - Индикатор включена ли переадресация http to https.
 
* '''cert_name''' - Имя сертификата сервера.
Типа <code>send_trigger_to_mqtt</code> игнорирует поля '''payload''' и '''retain''' но в сообщении они должны присутствовать.




Example
Example params
  {
  {
    "http_port": 80,
        "topic": "lm/trigger_service/trigger/",
    "https_port": 443,
        "payload": "",
    "is_https_enabled": false,
        "retain": false
    "is_http_redirected": true,
    "cert_name": ""
  }
  }




=== SUB <code>lm/system_settings/external_access/change_web_access_settings</code> ===
=== SUB <code>lm/trigger_service/action/delete</code> ===
Меняет настройки web доступа.
Удаляет action.




Payload format
Payload format
  {
  {
     http_port: int
     name: str
    https_port: int
    is_https_enabled: bool
    is_http_redirected: bool
    cert_name: str
  }
  }
* '''http_port''' - Http порт. По умолчанию 80.
* '''name''' - Имя action.
* '''https_port''' - Https порт. По умолчанию 443.
* '''is_https_enabled''' - Индикатор включен ли https.
* '''is_http_redirected''' - Индикатор включена ли переадресация http to https.
* '''cert_name''' - Имя сертификата сервера.




Example
Example
  {
  {
     "http_port": 80,
     "name": "default",
    "https_port": 443,
    "is_https_enabled": false,
    "is_http_redirected": true,
    "cert_name": ""
  }
  }




=== SUB <code>lm/system_settings/certificates/upload_certificate</code> ===
=== SUB <code>lm/trigger_service/set_trigger_to_action_relation</code> ===
Загружает сертификат и его ключ для дальнейшего использования в настройках доступа.
Создает связь между триггером и action.




Payload format
Payload format
{
    trigger: {
    cert_name: str
        name: str
     certificate: bytes
        tr_type: str
     key: bytes
        params: dict[str, Any]
    intermediate: bytes
     }
}
     action: {
* '''cert_name''' - Читаемое имя сертификата.
        name: str
* '''certificate''' - x.509 сертификат в pem формате.
        action_type: str
* '''key''' - Приватный ключ в pem формате.
        params: dict[str, Any]
* '''intermediate''' - (Опционально) промежуточный сертификат.
    }
 
* '''trigger''' - Словарь с триггером.
=== SUB <code>lm/system_settings/certificates/upload_certificate_corresponding_csr</code> ===
* '''action''' - Словарь с action.
Загружает сертификат относящийся к сформированному ранее csr.




Payload format
Example
  {
  {
     cert_name: str
     "trigger": {
    certificate: bytes
        "name": "TriggerFromMqtt",
}
        "tr_type": "RawUDP",
* '''cert_name''' - Имя csr сертификата.
        "params": {
* '''certificate''' - x.509 сертификат в pem формате.
            "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/system_settings/certificates/delete_certificate</code> ===
=== SUB <code>lm/trigger_service/delete_trigger_to_action_relation</code> ===
Удаляет сертификат и все связанные с ним файлы.
Удаляет связь между триггером и action.




Payload format
Payload format
{
    trigger: {
    id: int
        name: str
    name: str
        tr_type: str
     cert_type: str
        params: dict[str, Any]
    public_bytes: str
     }
    params: dict[str, Any]
    action: {
}
        name: str
* '''id''' - (Опционально) Идентификатор сертификата.
        action_type: str
* '''name''' - Имя сертификата.
        params: dict[str, Any]
* '''cert_type''' - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’
    }
* '''public_bytes''' - Открытый ключ сертификата.
* '''trigger''' - Словарь с триггером.
* '''params''' - Словарь с параметрами сертификата. Набор параметров отличается в зависимости от [[#certificate-params-format|типа]] сертификата.<span id="example-4"></span>
* '''action''' - Словарь с action.




Example
Example
  {
  {
     "cert_type": "certificate",
     "trigger": {
    "name": "cert_name",
        "name": "TriggerFromMqtt",
    "params": {
        "tr_type": "RawUDP",
        "issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
        "params": {
        "san": "IP=192.168.0.3",
            "network_type": "udp",
        "subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
            "listen_ip": "0.0.0.0",
        "valid_from": "1664440221.0",
            "listen_port": "5555",
         "valid_to": "1759048221.0"
            "data": "any"
         }
     },
     },
     "public_bytes": "-----BEGIN CERTIFICATE-----\n"
     "action": {
                    "-----END CERTIFICATE-----\n"}]
        "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/system_settings/certificates/generate_csr</code> ===
=== SUB <code>lm/trigger_service/delete_trigger_with_related_actions</code> ===
Генерирует Certificate Signing Request.
Удаляет триггер и все связанные с ним действия.




Payload format
Payload format
  {
  {
     cert_name: str
     name: str
    cert_type: str
}
    key_size: int
* '''name''' - Имя триггера.<span id="example-10"></span>Example
    subject: str
{
     san: str
     "name": "TriggerFromMqtt",
  }
  }
* '''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> ===
Генерирует самоподписанный сертификат.


'''Новое в v1.3.4:''' добавлен топик публикации факта срабатывания триггера (ранее в него ничего не публиковалось). Остальной функционал раздела (создание/удаление триггеров и action, связи триггер↔action, списки) не изменился.
=== PUB <code>lm/trigger_service/trigger/</code> === '''(новое в v1.3.4)'''
Публикует сработавший триггер. retain = false. Публикация выполняется с qos=2.


Payload format
Payload format
  {
  {
     cert_name: str
     "id": int,
    cert_type: str
     "name": str
    key_size: int
  }
     subject: str
* '''id''' - Стабильный идентификатор триггера.
    san: str
* '''name''' - Имя триггера.
  }
* '''cert_name''' - Имя сертификата.
* '''cert_type''' - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’.
* '''key_size''' - Размер ключа в байтах. Принимает значения 2048 иои 2096.
* '''subject''' - Строка в формате rfc4514.
* '''san''' - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами <code>IP=</code> или <code>DNS=</code>.
 


Example
Example
  {
  {
     "cert_name": "ss_cert23",
     "id": 1,
    "cert_type": "certificate",
     "name": "Artnet"
    "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> ===
= IV. Система и обслуживание =
<code>PUB lm/system_settings/network/interfaces/wired/eth0/statistics</code>
Администрирование самого устройства: сетевые и системные настройки, обновление программного обеспечения. Не связано напрямую с воспроизведением контента.
 
== 10. Настройки системы ==
Сервис осуществляет конфигурирование системных настроек ОС.
 


<code>PUB lm/system_settings/network/interfaces/wired/eth1/statistics</code>
=== PUB <code>lm/system_configurator/error</code> ===
Публикует ошибки.


Публикует информацию о проводном интерфейсе ethernet каждые 10 секунд.
Выставляет заголовок '''Correlation data''' если он был установлен в запросе.




Payload format
Payload format<pre>{  
  {
     msg: str
     status: str
     data: Any 
     ip_assign_method: Literal['manual', 'dhcp']
}</pre>
    ip: str
* '''msg''' - contain error message
    netmask: str
* '''data''' - contain related error data
    gateway: str
 
    dns_assign_method: Literal['manual', 'dhcp']
 
    dns_servers: list[str]
=== PUB <code>lm/system_settings/external_access/certificates</code> ===
    mac_address: str
Публикует список всех x509 сертификатов.<br />Топик всегда содержит актуальный список.
}
* '''status''' - Статус интерфейса. Может быть <code>up</code> или <code>down</code>.
* '''ip_assign_method''' - Способ назначения ip адреса. Может быть <code>manual</code> или <code>dhcp</code>.
* '''ip''' - IP адрес интерфейса.
* '''netmask''' - Маска интерфейса.
* '''gateway''' - Шлюз по умолчанию.
* '''dns_assign_method''' - Способ назначения dns серверов. Может быть <code>manual</code> или <code>dhcp</code>.
* '''dns_servers''' - Список dns серверов.
* '''mac_address''' - MAC адрес интерфейса.




Example
Payload format
  {
  [
    "status": "up",
    {
    "ip_assign_method": "manual",
        name: str
    "ip": "192.168.0.205",
        cert_type: str
    "netmask": "255.255.255.0",
        public_bytes: str
     "gateway": "192.168.0.1",
        params: dict[str, Any]
    "dns_assign_method": "manual",
     }
    "dns_servers": ["8.8.8.8", "8.8.4.4"],
]
    "mac_address": "e4:5f:01:a8:e0:6c"
* '''name''' - Имя сертификата.
}
* '''cert_type''' - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’
* '''params''' - Словарь с параметрами сертификата. Набор параметров отличается в зависимости от [[#certificate-params-format|типа]] сертификата.


=== 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 адресацию и шлюз на интерфейс.
Example
 
[
Поддерживает статическое назначение ip и назначение через dhcp.
    {
 
        "cert_type": "certificate",
<span id="payload-format-10"></span>
        "name": "cert_name",
=== Payload format ===
        "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> ===
{
Публикует список настроек web доступа.<br />Топик всегда содержит актуальный список.
    ip_assign_method: Literal['manual']
    static_ip: str
    static_netmask: str
    static_gateway: str
}
* '''ip_assign_method''' - Способ назначения ip адреса. Должно быть <code>manual</code>.
* '''static_ip''' - IPv4 адрес интерфейса
* '''static_netmask''' - Сетевая маска интерфейса.
* '''static_gateway''' - Шлюз по умолчанию.




Example
Payload format
  {
  {
     "ip_assign_method": "manual",
     http_port: int
     "static_ip": "192.168.0.205",
     https_port: int
     "static_netmask": "255.255.255.0",
     is_https_enabled: bool
     "static_gateway": "192.168.0.1"
     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
  {
  {
     ip_assign_method: Literal['dhcp']
     "http_port": 80,
}
    "https_port": 443,
* '''ip_assign_method''' - Способ назначения ip адреса. Должно быть <code>dhcp</code>.
    "is_https_enabled": false,
<span id="example-9"></span>Example
    "is_http_redirected": true,
{
     "cert_name": ""
     "ip_assign_method": "dhcp"
  }
  }




=== SUB <code>lm/system_settings/network/interfaces/wired/eth*/set_dns_credential</code> ===
=== SUB <code>lm/system_settings/external_access/change_web_access_settings</code> ===
SUB <code>lm/system_settings/network/interfaces/wired/eth0/set_dns_credential</code>
Меняет настройки web доступа.


SUB <code>lm/system_settings/network/interfaces/wired/eth1/set_dns_credential</code>


Назначение dns серверов на интерфейс.
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": ""
}
 


Поддерживает статическое и динамическое (dhcp) назначение dns серверов.
=== SUB <code>lm/system_settings/certificates/upload_certificate</code> ===
Загружает сертификат и его ключ для дальнейшего использования в настройках доступа.




Payload format
Payload format
Статическое назначение:
  {
  {
     dns_assign_method: Literal['manual']
     cert_name: str
     static_dns_servers: list[str]
    certificate: bytes
    key: bytes
     intermediate: bytes
  }
  }
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>manual</code>.
* '''cert_name''' - Читаемое имя сертификата.
* '''static_dns_servers''' - Список DNS серверов.<span id="example-10"></span>Example
* '''certificate''' - x.509 сертификат в pem формате.
{
* '''key''' - Приватный ключ в pem формате.
    "dns_assign_method": "manual",
* '''intermediate''' - (Опционально) промежуточный сертификат.
    "static_dns_servers": ["8.8.8.8", "8.8.4.4"]
 
}
=== SUB <code>lm/system_settings/certificates/upload_certificate_corresponding_csr</code> ===
Динамическое назначение:
Загружает сертификат относящийся к сформированному ранее csr.
{
    dns_assign_method: Literal['dhcp']
}
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>dhcp</code>.




Example
Payload format
  {
  {
     "dns_assign_method": "dhcp"
     cert_name: str
    certificate: bytes
  }
  }
* '''cert_name''' - Имя csr сертификата.
* '''certificate''' - x.509 сертификат в pem формате.




=== PUB <code>lm/system_settings/network/interfaces/modem/statistics</code> ===
 
Публикует информацию о модемном интерфейсе каждые 10 секунд.
=== SUB <code>lm/system_settings/certificates/delete_certificate</code> ===
Удаляет сертификат и все связанные с ним файлы.




Payload format
Payload format
  {
  {
     ip_assign_method: Literal['manual', 'dhcp']
     id: int
     ip: str
     name: str
     netmask: str
     cert_type: str
     gateway: str
     public_bytes: str
     dns_assign_method: Literal['manual', 'dhcp']
     params: dict[str, Any]
    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>.
* '''id''' - (Опционально) Идентификатор сертификата.
* '''ip_assign_method''' - Способ назначения ip адреса. Может быть <code>manual</code> или <code>dhcp</code>.
* '''name''' - Имя сертификата.
* '''netmask''' - IP адрес интерфейса.
* '''cert_type''' - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’
* '''gateway''' - Шлюз по умолчанию.
* '''public_bytes''' - Открытый ключ сертификата.
* '''dns_assign_method''' - Способ назначения dns серверов. Может быть <code>manual</code> или <code>dhcp</code>.
* '''params''' - Словарь с параметрами сертификата. Набор параметров отличается в зависимости от [[#certificate-params-format|типа]] сертификата.<span id="example-4"></span>
* '''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
Example
  {
  {
     "status": "up",
     "cert_type": "certificate",
     "ip_assign_method": "manual",
     "name": "cert_name",
     "ip": "192.168.0.205",
     "params": {
    "netmask": "255.255.255.0",
        "issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
    "gateway": "192.168.0.1",
        "san": "IP=192.168.0.3",
    "dns_assign_method": "manual",
        "subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
    "dns_servers": ["8.8.8.8", "8.8.4.4"],
         "valid_from": "1664440221.0",
    "apn": {
         "valid_to": "1759048221.0"
         "apn": "internet.mts.ru",
         "username": "mts",
        "password": "mts"
     },
     },
     "modem_status": {
     "public_bytes": "-----BEGIN CERTIFICATE-----\n"
        "state": "connected",
                    "-----END CERTIFICATE-----\n"}]
        "state_failed_reason": "--",
        "power_state": "on",
        "signal_quality": 81,
        "access_technologies": ["LTE"]
    }
}




 
=== SUB <code>lm/system_settings/certificates/generate_csr</code> ===
=== SUB <code>lm/system_settings/network/interfaces/modem/set_ip_credential</code> ===
Генерирует Certificate Signing Request.
Устанавливает ip адресацию и шлюз на интерфейс.
 
Поддерживает статическое назначение ip и назначение через dhcp.




Payload format
Payload format
Статическая адресация
  {
  {
     ip_assign_method: Literal['manual']
     cert_name: str
     static_ip: str
     cert_type: str
     static_netmask: str
     key_size: int
     static_gateway: str
    subject: str
     san: str
  }
  }
* '''ip_assign_method''' - Способ назначения ip адреса. Должно быть <code>manual</code>.
* '''cert_name''' - Имя сертификата.
* '''static_ip''' - IPv4 адрес интерфейса
* '''cert_type''' - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’
* '''static_netmask''' - Сетевая маска интерфейса.
* '''key_size''' - Размер ключа в байтах. Принимает значения 2048 иои 4096.
* '''static_gateway''' - Шлюз по умолчанию.<span id="example-13"></span>Example
* '''subject''' - Строка в формате rfc4514.
* '''san''' - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами <code>IP=</code> или <code>DNS=</code>.<span id="example-5"></span>
 
 
Example
  {
  {
     "ip_assign_method": "manual",
     "cert_name": "ss_cert23",
     "static_ip": "192.168.0.205",
     "cert_type": "certificate",
     "static_netmask": "255.255.255.0",
    "key_size": 2048,
     "static_gateway": "192.168.0.1"
     "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> ===
{
Генерирует самоподписанный сертификат.
    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
Payload format
Статическое назначение:
  {
  {
     dns_assign_method: Literal['manual']
     cert_name: str
     static_dns_servers: list[str]
    cert_type: str
    key_size: int
    subject: str
     san: str
  }
  }
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>manual</code>.
* '''cert_name''' - Имя сертификата.
* '''static_dns_servers''' - Список DNS серверов.
* '''cert_type''' - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’.
* '''key_size''' - Размер ключа в байтах. Принимает значения 2048 иои 2096.
* '''subject''' - Строка в формате rfc4514.
* '''san''' - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами <code>IP=</code> или <code>DNS=</code>.




Example
Example
  {
  {
     "dns_assign_method": "manual",
     "cert_name": "ss_cert23",
     "static_dns_servers": ["8.8.8.8", "8.8.4.4"]
     "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>
    dns_assign_method: Literal['dhcp']
}
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>dhcp</code>.<span id="example-16"></span>


<code>PUB lm/system_settings/network/interfaces/wired/eth1/statistics</code>


Example
Публикует информацию о проводном интерфейсе ethernet каждые 10 секунд.
{
    "dns_assign_method": "dhcp"
}
 
 
=== SUB <code>lm/system_settings/network/interfaces/modem/set_apn_credential</code> ===
Назначение настроек apn на интерфейс.
 
Поддерживается только статическое назначение.




Payload format
Payload format
Статическое назначение:
  {
  {
     apn: str
     status: str
     username: str
     ip_assign_method: Literal['manual', 'dhcp']
     password: str
    ip: str
    netmask: str
    gateway: str
    dns_assign_method: Literal['manual', 'dhcp']
    dns_servers: list[str]
     mac_address: str
  }
  }
* '''apn''' - APN сервер.
* '''status''' - Статус интерфейса. Может быть <code>up</code> или <code>down</code>.
* '''username''' - Имя пользователя если есть либо пустая строка.
* '''ip_assign_method''' - Способ назначения ip адреса. Может быть <code>manual</code> или <code>dhcp</code>.
* '''password''' - Пароль если есть либо пустая строка.
* '''ip''' - IP адрес интерфейса.
* '''netmask''' - Маска интерфейса.
* '''gateway''' - Шлюз по умолчанию.
* '''dns_assign_method''' - Способ назначения dns серверов. Может быть <code>manual</code> или <code>dhcp</code>.
* '''dns_servers''' - Список dns серверов.
* '''mac_address''' - MAC адрес интерфейса.




Example
Example
  {
  {
     "apn": "internet.mts.ru",
     "status": "up",
     "username": "mts",
    "ip_assign_method": "manual",
     "password": "mts"
    "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"
  }


=== PUB <code>lm/system_settings/datetime/rtc_status</code> ===
=== SUB <code>lm/system_settings/network/interfaces/wired/eth*/set_ip_credential</code> ===
Публикует статус rtc модуля
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 адресацию и шлюз на интерфейс.


Payload format
Поддерживает статическое назначение ip и назначение через dhcp.
    {
        is_active: bool
    }
* '''is_active''' - Активен ли rtc модуль.


<span id="payload-format-10"></span>
=== Payload format ===


Example
Статическая адресация:
  {
  {
     "is_active": true,
     ip_assign_method: Literal['manual']
    static_ip: str
    static_netmask: str
    static_gateway: str
  }
  }
* '''ip_assign_method''' - Способ назначения ip адреса. Должно быть <code>manual</code>.
* '''static_ip''' - IPv4 адрес интерфейса
* '''static_netmask''' - Сетевая маска интерфейса.
* '''static_gateway''' - Шлюз по умолчанию.




=== SUB <code>lm/system_settings/datetime</code> ===
Example
Принимает [[#base-format-for-command-payload|команды]] на изменение даты и времени конфигурации системы.
{
    "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-9"></span>Example
{
    "ip_assign_method": "dhcp"
}




'''Set Date'''
=== 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>


Description: &gt; Set system date.
SUB <code>lm/system_settings/network/interfaces/wired/eth1/set_dns_credential</code>


Values:
Назначение dns серверов на интерфейс.


command: str &gt; set_date
Поддерживает статическое и динамическое (dhcp) назначение dns серверов.


data: dict &gt; date: str - date in format ‘Y:M:D’


Example:<br /><code>{'command': 'set_date', 'data': {'date': '1970:01:01'}}</code>
Payload format


Статическое назначение:
{
    dns_assign_method: Literal['manual']
    static_dns_servers: list[str]
}
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>manual</code>.
* '''static_dns_servers''' - Список DNS серверов.<span id="example-10"></span>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>.


'''Set Time'''


Description: &gt; Set system time.
Example
{
    "dns_assign_method": "dhcp"
}


Values:


command: str &gt; set_time
=== PUB <code>lm/system_settings/network/interfaces/modem/statistics</code> ===
Публикует информацию о модемном интерфейсе каждые 10 секунд.


data: dict &gt; time: str - time in format ‘HH:mm:ss’


Example:<br /><code>{'command': 'set_time', 'data': {'time': '13:00:00'}}</code>
Payload format
 
{
 
    ip_assign_method: Literal['manual', 'dhcp']
'''Set Datetime'''
    ip: str
 
    netmask: str
Description: &gt; Set system date and time.
    gateway: str
 
    dns_assign_method: Literal['manual', 'dhcp']
Values:
    dns_servers: list[str]
 
    apn: {
command: str &gt; set_datetime
        apn: str,
 
        username: str,
data: dict &gt; datetime: str - time in format ‘Y:M:D HH:mm:ss’
        password: str,
 
    }
Example:<br /><code>{'command': 'set_datetime', 'data': {'datetime': '1970:01:01 13:00:00'}}</code>
    modem_status: {
 
        state: str,
 
        state_failed_reason: str,
'''Change Ntp Status'''
        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 и т.д.).


Description: &gt; Enable or disable ntp synchronization.


Values:
Example
 
{
command: str &gt; change_ntp_status
    "status": "up",
 
    "ip_assign_method": "manual",
data: dict &gt; ntp: bool - is ntp sync enable
    "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"]
    }
}


Example:<br /><code>{'command': 'change_ntp_status', 'data': {'ntp': True}}</code>




'''Set Ntp Servers'''
=== SUB <code>lm/system_settings/network/interfaces/modem/set_ip_credential</code> ===
Устанавливает ip адресацию и шлюз на интерфейс.


Description: &gt; Set ntp servers. &gt; Generate ntp config, replace it then restart systemd-timesyncd.service &gt; Accepts list of ip addresses or domain names
Поддерживает статическое назначение ip и назначение через dhcp.


Values:


command: str &gt; set_ntp_servers
Payload format


data: dict &gt; ntp_servers: list[str] - list of servers ip addresses or dns names
Статическая адресация
{
    ip_assign_method: Literal['manual']
    static_ip: str
    static_netmask: str
    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"
}


Example:<br /><code>{'command': 'set_ntp_servers', 'data': {'ntp_servers': ['192.168.0.2', 'ntp1.stratum2.com']}}</code>


Динамическая адресация
{
    ip_assign_method: Literal['dhcp']
}
* '''ip_assign_method''' - Способ назначения ip адреса. Должно быть <code>dhcp</code>.
<span id="example-14"></span>Example
{
    "ip_assign_method": "dhcp"
}


'''Set timezone'''


Description: &gt; Set system timezone.
=== SUB <code>lm/system_settings/network/interfaces/modem/set_dns_credential</code> ===
Назначение dns серверов на интерфейс.


Values:
Поддерживает статическое и динамическое (dhcp) назначение dns серверов.


command: str &gt; set_timezone


data: dict &gt; timezone: str - timezone name
Payload format


Example:<br /><code>{'command': 'set_timezone', 'data': {'timezone': 'Europe/London'}}</code>
Статическое назначение:
{
    dns_assign_method: Literal['manual']
    static_dns_servers: list[str]
}
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>manual</code>.
* '''static_dns_servers''' - Список DNS серверов.




Base format for command payload
Example
  {
  {
     'command': str
     "dns_assign_method": "manual",
     'data': dict[str, Any]
     "static_dns_servers": ["8.8.8.8", "8.8.4.4"]
  }
  }
* '''command''' - command name


* '''data''' - any data for command


Example:
Динамическое назначение
{
    dns_assign_method: Literal['dhcp']
}
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>dhcp</code>.<span id="example-16"></span>


<code>{'command': 'set_ip', 'data': {'ifname': 'eth0', 'ip': '192.168.0.1'}}</code>


=== SUB <code>lm/system_settings/power_control</code> ===
Example
Управляет питанием устройства
{
    "dns_assign_method": "dhcp"
}
 
 
=== SUB <code>lm/system_settings/network/interfaces/modem/set_apn_credential</code> ===
Назначение настроек apn на интерфейс.
 
Поддерживается только статическое назначение.




Payload format
Payload format
Статическое назначение:
  {
  {
     command: str
     apn: str
     delay: int
     username: str
    password: str
  }
  }
* '''command''' - Команда управления питанием. Может принимать значения “reboot” и “shutdown”.
* '''apn''' - APN сервер.
* '''delay''' - Задержка срабатывания команды в минутах.
* '''username''' - Имя пользователя если есть либо пустая строка.
* '''password''' - Пароль если есть либо пустая строка.




Example
Example
  {
  {
     "command": "reboot",
     "apn": "internet.mts.ru",
     "delay": "0",
     "username": "mts",
    "password": "mts"
  }
  }




'''Certificate params format'''
=== PUB <code>lm/system_settings/datetime/rtc_status</code> ===
Публикует статус rtc модуля


Парамеры сертификата отличаются в зависимости от его типа. В данный момент поддерживается два типа сертификата x509: <code>certificate</code> и <code>csr</code>.


 
Payload format
x509 certificate params format
    {
{
        is_active: bool
    subject: str
     }
     san: str
* '''is_active''' - Активен ли rtc модуль.
    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
Example
  {
  {
     "issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
     "is_active": true,
    "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'''
=== SUB <code>lm/system_settings/datetime</code> ===
{
Принимает [[#base-format-for-command-payload|команды]] на изменение даты и времени конфигурации системы.
    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”, }


'''Set Date'''


== 7. Управление Di Do интерфейсами плеера ==
Description: &gt; Set system date.


=== PUB <code>lm/di/port/*</code> ===
Values:
<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 порта
command: str &gt; set_date


* '''di_port_number''' - Номер di порта.
data: dict &gt; date: str - date in format ‘Y:M:D’


Example:<br /><code>{'command': 'set_date', 'data': {'date': '1970:01:01'}}</code>


Payload format
int
Example
1
* '''int''' - Статус Di порта. 1 - активен, 0 - неактивен.


<span id="pub-lmdoport0-player-v1-only"></span>
'''Set Time'''


=== PUB <code>lm/do/port/*</code> ===
Description: &gt; Set system time.
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)
Values:


Публикует состояние do порта
command: str &gt; set_time


* '''do_port_number''' - Номер do порта.
data: dict &gt; time: str - time in format ‘HH:mm:ss’


Example:<br /><code>{'command': 'set_time', 'data': {'time': '13:00:00'}}</code>


Payload format
int
Example
1
* '''int''' - Статус DO порта. 1 - активен, 0 - неактивен.


=== SUB <code>lm/do/change_state</code> ===
'''Set Datetime'''
Принимает команды для изменения состояния DO порта.


Description: &gt; Set system date and time.


Payload command format
Values:
{
    "port": int,
    "state": int,
}
Example
  {
    "port": 1,
    "state": 1,
  }
* '''port''' - Номер do порта.
* '''state''' - Статус порта. 1 - активен, 0 - неактивен.


command: str &gt; set_datetime


data: dict &gt; 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>




== 8. Управление RS485 интерфейсами плеера ==
'''Change Ntp Status'''
<span id="pub-lmserialport_controllererror"></span>


=== PUB <code>lm/serialport_controller/error</code> ===
Description: &gt; Enable or disable ntp synchronization.
Публикует ошибки.


Выставляет заголовок '''Correlation data''' если он был установлен в запросе.
Values:


command: str &gt; change_ntp_status


Payload format<pre>{ 
data: dict &gt; ntp: bool - is ntp sync enable
    msg: str
    data: Any 
}</pre>
* '''msg''' - contain error message
* '''data''' - contain related error data


Example:<br /><code>{'command': 'change_ntp_status', 'data': {'ntp': True}}</code>


=== PUB <code>lm/serialport_controller/ports</code> ===
Публикует список rs485 портов.


'''Set Ntp Servers'''


Payload format
Description: &gt; Set ntp servers. &gt; Generate ntp config, replace it then restart systemd-timesyncd.service &gt; Accepts list of ip addresses or domain names
[
    {
        name: str
        mode: Literal['rs485', 'dmxOut']
    }
]
* '''name''' - Имя порта.
* '''mode''' - Предназначение порта.


Values:
command: str &gt; set_ntp_servers


Example
data: dict &gt; ntp_servers: list[str] - list of servers ip addresses or dns names
[
    {
        "name": "port1",
        "mode": "rs485",
    },
    {
        "name": "port2",
        "mode": "rs485",
    },
    {
        "name": "port3",
        "mode": "dmxOut",
    },
    {
        "name": "port4",
        "mode": "dmxOut",
    }
]


Example:<br /><code>{'command': 'set_ntp_servers', 'data': {'ntp_servers': ['192.168.0.2', 'ntp1.stratum2.com']}}</code>


=== SUB <code>lm/serialport_controller/ports/change_mode</code> ===
Меняет предназначение порта.


'''Set timezone'''


Payload format
Description: &gt; Set system timezone.
{
 
    name: str
Values:
    mode: Literal['rs485', 'dmxOut']
 
}
command: str &gt; set_timezone
* '''name''' - Имя порта.
 
* '''mode''' - Предназначение порта.
data: dict &gt; timezone: str - timezone name
 
Example:<br /><code>{'command': 'set_timezone', 'data': {'timezone': 'Europe/London'}}</code>




Example
Base format for command payload
  {
  {
     "name": "port1",
     'command': str
     "mode": "rs485",
     '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> ===
== 9. Управление светодиодами плеера ==
Управляет питанием устройства
<span id="pub-lmledsstate"></span>
 
=== PUB <code>'lm/leds/state'</code> ===
Публикует состояние диодов rs485 портов




Payload format
Payload format
  {
  {
     Port1: {
     command: str
      green: bool,
     delay: int
      red: bool,
    },
    Port2: {
      green: bool,
      red: bool,
    },
     Port3: {
      green: bool,
      red: bool,
    },
    Port4: {
      green: bool,
      red: bool,
    },
  }
  }
* '''command''' - Команда управления питанием. Может принимать значения “reboot” и “shutdown”.
* '''delay''' - Задержка срабатывания команды в минутах.




Example
Example
  {
  {
     "Port1": {
     "command": "reboot",
      "green": true,
     "delay": "0",
      "red": true,
}
    },
 
     "Port2": {
 
      "green": true,
'''Certificate params format'''
      "red": true,
    },
    "Port3": {
      "green": true,
      "red": true,
    },
    "Port4": {
      "green": true,
      "red": true,
    },
}
* '''green''' - Статус зеленого светодиода.
* '''red''' - Статус красного светодиода.


=== SUB <code>lm/leds/change_state</code> ===
Парамеры сертификата отличаются в зависимости от его типа. В данный момент поддерживается два типа сертификата x509: <code>certificate</code> и <code>csr</code>.
Принимает команды для изменения состояния диодов у rs485 порта.




Payload command format
x509 certificate params format
  {
  {
     pub port: Literal['Port1', 'Port2', 'Port3', 'Port4'],
     subject: str
     green: bool,
     san: str
     red: bool,
     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
Example
  {
{
     "port": "Port1",
     "issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
     "green": true,
     "san": "IP=192.168.0.3",
     "red": false,
     "subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
  }
    "valid_from": "1664440221.0",
* '''port''' - Имя rs485 порта.
    "valid_to": "1759048221.0"
* '''green''' - Статус зеленого светодиода.
}
* '''red''' - Статус красного светодиода.


=== SUB <code>lm/leds/blink</code> ===
Принимает команды для мигания всех светодиодов на всех rs485 портах.


 
'''x509 csr params format'''
Payload format
  {
  {
     times: int,
     subject: str
     interval: int,
     san: str
  }
  }
* '''subject''' - Строка в формате rfc4514.
* '''san''' - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами <code>IP=</code> или <code>DNS=</code>.
Example
Example
  {
  { “subject”: “OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA”, “san”: “IP=192.168.0.3”, }
    "times": 5,
    "interval": 1000
}
* '''times''' - Количество миганий (от 1 до 255).
* '''interval''' - Интервал между миганиями в миллисекундах.




== 10. Обновление программного обеспечения плеера ==
== 11. Обновление программного обеспечения плеера ==
<span id="pub-lmupdate_serviceversionversion_list"></span>
<span id="pub-lmupdate_serviceversionversion_list"></span>



Текущая версия от 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


SUB lm/trigger_service/delete_trigger_with_related_actions

Удаляет триггер и все связанные с ним действия.


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