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

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


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


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


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


==== Play ====
* '''PUB''' — плеер ''публикует'' в этот топик данные (состояние, списки, события, ошибки). Чтобы получать их, клиент подписывается на топик. Многие PUB-топики публикуются с флагом retained — последнее значение приходит сразу при подписке.
Payload command format
* '''SUB''' — плеер ''подписан'' на этот топик и ждёт в нём команды. Чтобы дать команду, клиент публикует в топик сообщение в формате, указанном в «Payload format» (пример — в «Example»).
{
    "cmd": 'play',
    "what_playing": Union['playlist', 'cue'],
    "entity": Union[int, str],
    "count": Optional[int],
    "priority": int,
}
Example
  {
    "cmd": "play",
    "what_playing": "playlist",
    "entity": 19,
    "count": Null,
    "priority": 4,
  }
* '''cmd''' - Название команды.
* '''what_playing''' - Тип сущности для воспроизведения. Принимает два значения “playlist” и “cue”.
* '''entity''' - ID или наименование проигрываемой сущности.
* '''count''' - Опциональный параметр. Количество повторений проигрывания. Если не задан или значение равно Null то проигрывание продолжится до получения следующей команды с равным или боле высоким приоритетом.
* '''priority''' - Приоритет команды. Значение от 1 до 100. Чем больше значение - тем выше приоритет. Команда с более низким приоритетом не может отменять команду с более высоким приоритетом. Текущие сопоставления приоритетов: Расписание - 60, Триггер - 50, Ручной запуск - 40.
 
==== Stop ====
Payload stop command format
{
    "cmd": 'stop',
    "priority": int,
}
Example
  {
    "cmd": "stop",
    "priority": 4,
  }
* '''cmd''' - Название команды.
* '''priority''' - Приоритет команды. Значение от 1 до 100. Чем больше значение - тем выше приоритет. Команда с более низким приоритетом не может отменять команду с более высоким приоритетом. Текущие сопоставления приоритетов: Расписание - 60, Триггер - 50, Ручной запуск - 40.


Если вы впервые знакомитесь с API — рекомендуется читать по порядку, начиная с блока I. Если ищете конкретный топик — можно сразу перейти к нужному разделу через оглавление.


=== PUB <code>lm/statistic/playing_progress_info</code> ===
К статье прилагается демонстрационный flow для Node-RED («MQTT API v1.3.4 - Node-Red demo flow.json»): в нём для каждого раздела собраны готовые примеры запросов (узлы inject) и подписки на ответы (узлы debug), номера блоков во flow совпадают с номерами разделов этой статьи. Самый быстрый способ разобраться в API — импортировать flow, нажимать кнопки inject и смотреть ответы плеера в панели Debug.
Публикует статистику проигрывания.


Зная текущее значение fps можно перевести значения во время.
= I. Логика воспроизведения =
Что и когда играть: прямое управление плеером, настройки проигрывания и расписание. Начните отсюда, если хотите понять базовую работу плеера.


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


Сервис осуществляет проигрывание анимаций по группам воспроизведения (group_id). Каждая группа независимо проигрывает свой контент (cue, плейлист, статическую заливку или blackout) и имеет собственный текущий приоритет. Список и состав групп определяется конфигурацией фикстур ([[#pub-lmsettingsfixture|lm/settings/fixture]]).


Payload format
'''Что изменилось в 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 - минимальный приоритет).
Представляет из себя строку в формате <code>&quot;{frame_count}, {frame_number}&quot;</code>
Example
“1000, 35”
* '''frame_count''' - Общее количество фреймов.
* '''frame_number''' - Сколько фреймов проиграно на текущий момент.
 


=== PUB <code>lm/statistic/playing_ent_info</code> ===
<span id="sub-lmplayercommands"></span>
Публикует Наименования того, что сейчас проигрывается.
=== SUB <code>lm/player/commands</code> ===
Принимает команды управления проигрыванием. Поддерживаются команды <code>apply</code>, <code>apply_each</code> и <code>update_state</code>.


==== Apply ====
Применяет одно действие ко всем указанным группам.


Payload format
Payload format
  {
  {
     "playlist": Optional[str],
     "cmd": "apply",
     'scene': Optional[int],
     "priority": Union[int, 'buttons', 'scheduler', 'trigger'],
     'cue': Optional[str],
     "groups": list[str],
    "action": GroupAction,
  }
  }
Example
Example
{
  {
     "playlist": "NewYearPlaylist",
     "cmd": "apply",
     "scene": 1,
     "priority": "buttons",
     "cue": "BLUE.cue",
     "groups": ["roof", "back"],
}
    "action": {
* '''playlist''' - Наименование проигрываемого плейлиста. Может быть None.
      "type": "play",
* '''scene''' - Порядковый номер в плейлисте. Может быть None.
      "entity_type": "cue",
* '''cue''' - Наименование проигрываемой анимации. Может быть None.
      "entity_id": 42,
 
      "count": null
 
    }
=== PUB <code>lm/statistic/current_playing_priority</code> ===
  }
Публикует текущий приоритет проигрывания.
* '''cmd''' - Литерал "apply".
* '''priority''' - Приоритет команды. Целое число (0 - минимальный приоритет, чем больше значение - тем выше приоритет) либо именованная маска "buttons" / "scheduler" / "trigger".
* '''groups''' - Список ID групп, к которым применяется действие. Если хотя бы одна из указанных групп не существует - вся команда отклоняется.
* '''action''' - Объект GroupAction, общий для всех групп из groups.


==== Apply each ====
Применяет разные действия к разным группам в одном сообщении.


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


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


Payload format
{
    "cmd": "update_state"
}


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


'''Play''' - запускает playlist или cue на группе.
{
    "type": "play",
    "entity_type": Union['playlist', 'cue'],
    "entity_id": Union[int, str],
    "count": Optional[int],
}
* '''entity_type''' - Тип сущности: playlist или cue.
* '''entity_id''' - ID сущности.
* '''count''' - Количество повторов. null означает бесконечное проигрывание.


== 2. Управление настройками проигрывания и сущностей ==
'''Blackout''' - включает на группе zero-cue, который держит каналы группы в нуле.
{
    "type": "blackout"
}


=== PUB <code>lm/settings/location/coordinates</code> ===
'''Stop''' - останавливает проигрывание на группе и проверяет, есть ли актуальное событие расписания. Если в runtime ничего не проигрывается на группе, stop игнорируется.
Публикует координаты плеера.
{
    "type": "stop"
}


Payload command format
'''Static color''' - включает на группе статическое DMX-состояние. Значения задаются по семантическому типу канала; runtime разворачивает их в реальные DMX-каналы по текущим patch settings.
  {
  {
     "latitude": float,
     "type": "static_color",
     "longitude": float,
     "channels": { "<channel_type>": int }
  }
  }
* '''channels''' - Объект channel_type → DMX-значение (целые 0-255). Каналы группы, для которых тип не задан, выставляются в 0. Неизвестный или отсутствующий в группе channel_type игнорируется. Пустой channels → все каналы группы 0.
Example
Example
   {
   {
     "latitude": "56.821019190097616",
     "cmd": "apply",
     "longitude": "60.59559633825789"
     "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, затем сбрасывает приоритет группы к минимальному и инициирует перепроверку расписания для этой группы.


=== PUB <code>lm/settings/location/address</code> ===
Публикует адрес устройства.


=== SUB <code>lm/player</code> (legacy, deprecated) ===
Принимает команды play и stop и применяет действие '''ко всем группам сразу'''. Поддерживается для совместимости со старыми клиентами; для нового кода используйте [[#sub-lmplayercommands|lm/player/commands]].


Payload format
==== Play (legacy) ====
Payload command format
  {
  {
  "address": str
    "cmd": "play",
    "what_playing": Union['playlist', 'cue'],
    "entity": Union[int, str],
    "count": Optional[int],
    "priority": Union[int, 'buttons', 'scheduler', 'trigger'],
  }
  }
Example
Example
  {
    "cmd": "play",
    "what_playing": "cue",
    "entity": 5,
    "count": null,
    "priority": "buttons"
  }
* '''cmd''' - Название команды.
* '''what_playing''' - Тип сущности для воспроизведения. Принимает значения "playlist" и "cue".
* '''entity''' - ID или наименование проигрываемой сущности.
* '''count''' - Опциональный параметр. Количество повторений проигрывания. Если не задан или равен null, проигрывание продолжится до получения следующей команды с равным или более высоким приоритетом.
* '''priority''' - Приоритет команды: число или именованная маска buttons / scheduler / trigger.
==== Stop (legacy) ====
Payload stop command format
  {
  {
"address": "Yekaterinburg"
    "cmd": "stop",
    "priority": Union[int, 'buttons', 'scheduler', 'trigger'],
  }
  }
Example
  {
    "cmd": "stop",
    "priority": "buttons"
  }


<span id="pub-lmplayerstate"></span>
=== PUB <code>lm/player/state</code> ===
Публикует полный снимок текущего состояния воспроизведения всех групп. Сообщение публикуется с флагом '''retain=true''', поэтому новый подписчик сразу получает последнее актуальное состояние от брокера.


=== PUB <code>lm/settings/datetime/timezone</code> ===
Публикация выполняется: при изменении контента на любой группе; при переходе на другую сцену внутри плейлиста; при появлении или исчезновении затухающих (stale) слоёв; при изменении frame_rate; при остановке сервиса (публикуется пустое состояние).
Публикует часовой пояс плеера.


frame_rate, current_frame, total_frames и timestamp позволяют подписчику самостоятельно посчитать прогресс и оставшееся время воспроизведения.


Payload format
Payload format
  {
  {
  "timezone": str
    "groups": {
        str: {
            "now": Layer | null,
            "stale": [Layer, ...],
        },
        ...
    },
    "frame_rate": float,
    "timestamp": int,
  }
  }
Example
 
'''Layer'''
  {
  {
"timezone": "Asia/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],
  }
  }
* '''timezone''' - Часовой пояс плеера.


'''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/player/fps</code> ===
Example
Публикует настройки fps.
{
  "groups": {
    "group_1": {
      "now": {
        "group_id": "group_1",
        "playback_id": "7f3a9c2e-4b1d-4e0a-9c3f-2a1b6d8e0f11",
        "content": {"type": "recorded", "cue_id": "a1b2c3d4"},
        "is_playing": true,
        "weight": 1.0,
        "current_frame": 120,
        "total_frames": 900,
        "playlist_id": "pl_001",
        "playlist_name": "Evening Show",
        "scene_index": 2,
        "total_scenes": 5,
        "sequence_repeat": -1
      },
      "stale": [
        {
          "group_id": "group_1",
          "playback_id": "1d8b4f60-9a72-4c55-8e3b-0f4c7a2d9b30",
          "content": {"type": "recorded", "cue_id": "x9y8z7w6"},
          "is_playing": true,
          "weight": 0.35,
          "current_frame": 899,
          "total_frames": 900,
          "playlist_id": null,
          "playlist_name": null,
          "scene_index": null,
          "total_scenes": null,
          "sequence_repeat": null
        }
      ]
    },
    "group_2": { "now": null, "stale": [] }
  },
  "frame_rate": 30.0,
  "timestamp": 1743422400000
}
* '''groups''' - Словарь всех групп из текущего patch mapping. Группа присутствует в snapshot, даже если на ней ничего не играет.
* '''now''' - Текущее активное воспроизведение на группе. null, если на группе ничего не играет.
* '''stale''' - Список слоёв, которые ещё затухают после переключения. Может быть пустым.
* '''playback_id''' - Стабильный идентификатор экземпляра воспроизведения (uuid). Фиксируется при запуске слоя и не меняется всю его жизнь, переживая переход из now в stale. По нему подписчик коррелирует записи между снапшотами. Новый запуск (включая повтор или луп-рестарт той же сцены) - это новый playback_id.
* '''is_playing''' - Играет ли слой в текущий момент (weight > 0).
* '''weight''' - Текущий вес слоя в диапазоне 0.0-1.0. Используется для визуализации fade-in/fade-out.
* '''playlist_id''' / '''playlist_name''' - Заполнены, если cue воспроизводится как часть плейлиста. Иначе null.
* '''scene_index''' / '''total_scenes''' - Индекс текущей сцены (0-based) и общее число сцен в плейлисте. Для одиночного cue - null.
* '''sequence_repeat''' - Оставшееся количество повторов последовательности. -1 - бесконечный loop, 0 - последний прогон, N - осталось ещё N повторов. Для одиночного cue - null.
* '''frame_rate''' - Текущий FPS рендера.
* '''timestamp''' - Момент формирования snapshot, unix time в миллисекундах.
 
'''Замена статистики v1.2.4:''' топики <code>lm/statistic/playing_progress_info</code> и <code>lm/statistic/playing_ent_info</code> удалены, их функциональность полностью покрывается данным топиком.
 
 
=== PUB <code>lm/player/current_playing_priority</code> ===
Публикует полный снимок текущих приоритетов всех групп. Сообщение публикуется с флагом '''retain=true'''.
 
Публикация выполняется: при изменении текущего приоритета любой группы; при изменении состава групп после обновления patch/group mapping; после инициализации сервиса; при изменении настроек сопоставления именованных приоритетов (если в этот момент что-то проигрывается, сервис останавливает текущее проигрывание и сбрасывает приоритеты всех групп к наименьшему значению); при завершении сервиса (публикуется пустой snapshot {}).


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


Payload format
Payload format
  {
  {
  "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
Payload format
  [
  {
   {
   "artsync": bool,
    "number": int,
}
    "device": {
Example
      "name": str,
{"artsync": false}
      "description": str,
 
      "network_mode": str,
 
      "ip": str,
=== PUB <code>lm/settings/player/locked</code> === <span id="pub-lmsettingsplayerlocked"></span>'''(новое в v1.3.4)'''
      "port": int,
Публикует статус блокировки отправки ArtDMX плеера. Retained.
    } | None
Payload format
  }
{
]
  "locked": bool,
}
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",
      "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).


'''Изменение относительно v1.2.4:''' заменяет топик <code>lm/settings/player/blackout_between_playing_command</code> (bool). Вместо булева флага "включен/выключен blackout" используется перечисление типа эффекта.


=== PUB <code>lm/cues</code> ===
Payload format
Публикует список cue файлов загруженных на плеер
{
  "effect_between_playing_command": Union['transition', 'blackout', 'fade', 'no_effect'],
}
Example
{"effect_between_playing_command": "blackout"}




<span id="pub-lmsettingsplayerduration"></span>
=== PUB <code>lm/settings/player/duration_effect_between_playing_command</code> === '''(новое в v1.3.4)'''
Публикует настройку длительности эффекта между событиями проигрывания. Retained.
Payload format
Payload format
  [
  {
   {
   "duration": float,
    "id": int,
}
    "filename": str,
Example
    "uni_count": int,
  {"duration": 1.0}
    "frame_count": int,
 
    "created": str,
  }
]
Example
  [
  {
    "id": 47,
    "filename": "00-5.cue",
    "uni_count": 1,
    "frame_count": 220,
    "created": "2024-03-07T08:30:16.926447Z"
  }
]
* '''id''' - Уникальный идентификатор анимации.
* '''filename''' - Имя файла.
* '''uni_count''' - Количество вселенных в файле.
* '''frame_count''' - Количество фреймов в файле.
* '''created''' - Время загрузки анимации в ISO формате.


 
=== PUB/SUB <code>lm/settings/player/dimmer_value</code> === '''(новое в v1.3.4)'''
=== PUB <code>lm/playlists</code> ===
Публикует значения диммера по группам воспроизведения. Retained. Backend также подписан на этот топик: входящее сообщение задаёт новые значения диммера (набор групп во входящем сообщении должен совпадать с текущим).
Публикует список cue файлов загруженных на плеер
Payload format
{
  str: float,
}
* '''key''' - Идентификатор группы.
* '''value''' - Значение диммера, 0.0 - 1.0.
Examples
{"all": 0.5}
{"all": 1.0, "stage_left": 0.25, "stage_right": 0.8}
{}




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




 
<span id="pub-lmsettingsfixture"></span>
== 3. Управление расписанием ==
=== PUB <code>lm/settings/fixture</code> === '''(новое в v1.3.4)'''
<span id="pub-lmschedulererror"></span>
Публикует конфигурацию фикстур. Retained.
 
Payload format
=== PUB <code>lm/scheduler/error</code> ===
{
Публикует ошибки.
  "backgroundImageBase64": str,
 
  "mapWidth": float,
Выставляет заголовок '''Correlation data''' если он был установлен в запросе.
  "mapHeight": float,
 
  "fixtureTypes": [ {...} ],
 
  "fixtures": [ {...} ],
Payload format<pre>{
  "groups": [ { "id": str, ... } ],
    msg: str
  }
    data: Any  
* '''backgroundImageBase64''' - Фоновое изображение карты в base64 (может быть пустым).
}</pre>
* '''mapWidth''' / '''mapHeight''' - Размеры карты.
* '''msg''' - contain error message
* '''fixtureTypes''' - Типы фикстур.
* '''data''' - contain related error data
* '''fixtures''' - Фикстуры.
 
* '''groups''' - Группы воспроизведения - те самые group_id, которые используются в [[#sub-lmplayercommands|lm/player/commands]], [[#pub-lmplayerstate|lm/player/state]] и топиках расписания.
 
<span id="pub-lmschedulerevents"></span>
 
<span id="pub-lmschedulerevents"></span>
 
=== PUB <code>lm/scheduler/events</code> ===
Публикует список всех событий календаря.




<span id="pub-lmcues"></span>
=== PUB <code>lm/cues</code> ===
Публикует список cue файлов загруженных на плеер. Retained.
Payload format
Payload format
  [
  [
   {
   {
     "id": str,
     "id": int,
     "title": str,
     "filename": str,
     "priority": int,
     "uni_count": int,
     "actions": {
     "universes": [int],
      "player": Optional[{
     "frame_count": int,
        "cmd": Literal['play'],
    "created": str,
        "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],
    }
   }
   }
  ]
  ]
<span id="example-1"></span>Example
Example
  [
  [
   {
   {
     "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
     "id": 47,
     "title": "holiday",
     "filename": "00-5.cue",
     "priority": 1,
     "uni_count": 1,
     "actions": {
     "universes": [1],
      "player": {
    "frame_count": 220,
        "cmd": "play",
     "created": "2024-03-07T08:30:16.926447Z"
        "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''' - Уникальный идентификатор анимации.
* '''title''' - Название события.
* '''filename''' - Имя файла.
* '''priority''' - Приоритет события. Чем выше значение тем выше приоритет.
* '''uni_count''' - Количество вселенных в файле.
* '''actions''' - Действия которые должны быть выполнены при наступлении события.
* '''universes''' - Список номеров вселенных в файле. '''(новое поле в v1.3.4)'''
* '''player''' - Действие для плеера. Содержит команду воспроизведения.
* '''frame_count''' - Количество фреймов в файле.
* '''cmd''' - Команда для плеера. Всегда равна ‘play’.
* '''created''' - Время загрузки анимации в ISO формате.
* '''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’.<span id="sub-lmschedulereventsadd"></span>
 


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


=== PUB <code>lm/cues/deleted</code> === '''(новое в v1.3.4)'''
Публикует событие об удалении cue.
Payload format
Payload format
  {
  { "cue_id": int }
    "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],
    }
}
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> ===
=== PUB <code>lm/playlists</code> ===
Удаляет событие.
Публикует список плейлистов загруженных на плеер. Retained.
 
Payload format
Payload format
  {
  [
     id: str
  {
  }
     "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
Example
[
   {
   {
     "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
     "id": 19,
   }
    "name": "Test",
* '''id''' - Уникальный идентификатор события. ___
    "scenes": [
 
      {
 
        "id": 71,
 
        "order": 0,
=== SUB <code>lm/scheduler/events/update</code> ===
        "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. [[#pub-lmcues|Подробнее]]
** '''fade_in''' - Время fade_in.
** '''fade_out''' - Время fade_out.
** '''transition_time''' - Время перехода.
** '''repeat_value''' - Количество повторений.
 


=== PUB <code>lm/playlists/deleted</code> === '''(новое в v1.3.4)'''
Публикует событие об удалении плейлиста.
Payload format
Payload format
  {
  { "playlist_id": int }
  "id": str,
 
    "title": str,
 
    "priority": int,
=== SUB <code>lm/player/commands</code> ===
    "actions": {
См. раздел [[#1._Управление_проигрыванием|«1. Управление проигрыванием»]] - основной топик управления воспроизведением по группам (apply/apply_each/update_state).
      "player": Optional[{
 
        "cmd": Literal['play'],
 
        "entity_type": Union['playlist', 'cue'],
=== SUB <code>lm/control/config</code> === '''(новое в v1.3.4)'''
        "entity_id": int,
Команда сервисам перечитать конфигурацию. Payload - строка (не JSON).
      }],
Payload format
      "do1": Optional[{
"refresh"                      # перечитать общую конфигурацию
        "state": Literal[0, 1],
"refresh_universes_settings"   # перечитать настройки вселенных
      }],
      "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],
    }
}
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).
* '''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’.<span id="pub-lmschedulereventschanges"></span>


=== PUB <code>lm/scheduler/events/changes</code> ===
Публикует вновь созданные/измененные/удаленные события.<span id="payload-format-5"></span>




Payload format
== 3. Управление расписанием ==
{
<span id="pub-lmschedulererror"></span>
    status: Literal['created', 'updated', 'deleted'],
    event: {
        "id": str,
        "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],
        }
    }
}
Example
{
  "status": "created",
  "event": {
    "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
    }
  }
}
* '''status''' - Тип изменения. Может принимать значения ‘created’, ‘updated’, ‘deleted’.
* '''event''' - Событие со всеми параметрами в формате SchedulerEvent. ___


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


=== SUB <code>lm/scheduler/events/periods</code> ===
Payload format<pre>{
Принимает запрос на публикацию всех одиночных событий за указанный период.
    "status": "error",
    "msg": str,
    "data": Any
}</pre>
* '''status''' - всегда "error" для этого топика. '''(новое поле в v1.3.4)'''
* '''msg''' - contain error message
* '''data''' - contain related error data


Запрос должен содержать cor data для последующей идентификации ответа. Запрос может содержать resp_topic. В противном случае ответ будет опубликован в топик <code>lm/scheduler/events/periods/response</code>.
Example (ошибка валидации payload, data содержит список ошибок валидации полей):
<pre>
{
  "status": "error",
  "msg": "Validation error",
  "data": [
    {
      "type": "missing",
      "loc": ["priority"],
      "msg": "Field required",
      "input": {"title": "holiday", "rrule": {"freq": "DAILY", "interval": 1, "start_date": "2024-01-20", "start_time_type": "time", "start_time": "00:00"}}
    }
  ]
}
</pre>
Example (внутренняя ошибка обработки, data равен null):
<pre>
{
  "status": "error",
  "msg": "Internal Error Occurred",
  "data": null
}
</pre>




Payload format
<span id="pub-lmschedulerevents"></span>
{
=== PUB <code>lm/scheduler/events</code> ===
    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''' - Дата и время начала диапазона в iso формате.
* '''to_datetime''' - Дата и время окончания диапазона в iso формате.
* '''filters''' - Опциональные фильтры для типов действий. Если не указаны, возвращаются события со всеми типами действий.
* '''player''' - Включать события с действиями плеера.
* '''do1''' - Включать события с действиями для цифрового выхода DO1.
* '''do2''' - Включать события с действиями для цифрового выхода DO2.
* '''do3''' - Включать события с действиями для цифрового выхода DO3.
 
 
=== PUB <code>lm/scheduler/events/periods/response</code> ===
Публикует список одиночных событий календаря за указанный период. Период задается в запросе. Запрос принимается на топик <code>lm/scheduler/events/periods</code>
 


Payload format
Payload format
  [
  [
   {
   {
     id: str
     "id": str,
     title: str
     "title": str,
     start: str
     "priority": int,
     end: str
     "actions": {
    priority: int
      "player": {
     duration: float
        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
Example
  [
  [
Строка 957: Строка 710:
     "title": "holiday",
     "title": "holiday",
     "priority": 1,
     "priority": 1,
     "start": "2024-02-29T12:00:00+03:00",
     "actions": {
     "end": "2024-03-02T12:00:00+03:00",
      "player": {
    "duration": 259200.0
        "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''' - Уникальный идентификатор события.
* '''id''' - Уникальный идентификатор события (UUID).
* '''title''' - Название события.
* '''title''' - Название события.
* '''priority''' - Приоритет события. Чем выше значение тем выше приоритет.
* '''priority''' - Приоритет события. Чем выше значение тем выше приоритет.
* '''start''' - Дата и время начала события в ISO формате.
* '''actions''' - Действия, которые должны быть выполнены при наступлении события.
* '''end''' - Дата и время окончания события в ISO формате.
* '''player''' - '''(изменено в v1.3.4)''' Действия для групп плееров. Ключ словаря - название группы (было единственное действие на весь плеер, стало по одному действию на группу).
* '''duration''' - Продолжительность события в секундах.
** '''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.




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


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


Payload format<span id="событие-есть"></span>Событие есть:
Payload format
  {
  {
  status: Literal['running'],
     "title": str,
  event: {
     "priority": int,
     id: str,
     "rrule": RRule
     title: str,
     action: {
      cmd: Literal['play']
      entity_type: Literal['playlist', 'cue']
      entity_id: int 
    }
  }
  }
  }
(формат RRule - см. [[#pub-lmschedulerevents|lm/scheduler/events]] выше)
Example
Example
  {
  {
   "status": "running",
   "title": "holiday",
   "event": {
   "priority": 1,
     "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
  "rrule": {
     "title": "holiday",
     "freq": "DAILY", "interval": 1, "start_date": "2024-01-20",
     "action": {
     "start_time_type": "time", "start_time": "00:00", "start_time_offset": null,
      "cmd": "play",
     "count": 1, "until_date": null, "until_time_type": null, "until_time": null, "until_time_offset": null,
      "entity_type": "playlist",
    "from_time_type": "sunset", "from_time": null, "from_time_offset": 0,
      "entity_id": 19
    "to_time_type": "sunset", "to_time": null, "to_time_offset": 0,
     }
     "bymonth": null, "bymonthday": null, "byweekday": null, "from_min": null, "to_min": null
   }
   }
  }
  }


'''Response''' '''(новое в v1.3.4)''' - ответ публикуется в топик <code>lm/scheduler/events/add/response</code> (или в Response Topic из запроса), конверт {status, msg, data}; Correlation Data копируется в ответ.
* При успехе: status = 'success', msg = "Request was accepted", data - созданное событие (id, title, priority, rrule и actions с пустыми player/do).
* При ошибке: status = 'error', data - детали ошибки; ответ также публикуется в [[#pub-lmschedulererror|lm/scheduler/error]].




События нет:
=== SUB <code>lm/scheduler/events/delete</code> ===
  {
Удаляет событие.
  status: Literal['no_event'],
Payload format
}
  { "id": str }
Example
Example
  {
  { "id": "abe4c633-8e3f-4938-94e2-efd135d993fc" }
  "status": "no_event"
}
* '''status''' - Текущий статус расписания. Может принимать значения ‘running’, ‘no_event’.
* '''event''' - Активное событие со всеми параметрами. Присутствует только когда status равен ‘running’.
* '''id''' - Уникальный идентификатор события.
* '''id''' - Уникальный идентификатор события.
* '''title''' - Название события.
* '''action''' - Действие которое должно быть выполнено для данного события.
* '''cmd''' - Команда для выполнения. Всегда равна ‘play’.
* '''entity_type''' - Тип сущности для воспроизведения. Может принимать значения ‘playlist’, ‘cue’.
* '''entity_id''' - Уникальный идентификатор сущности для воспроизведения.


'''Response''' '''(новое в v1.3.4)''' - ответ публикуется в топик <code>lm/scheduler/events/delete/response</code> (или в Response Topic), конверт {status, msg, data}.
* При успехе: status = 'success', msg = "Deleted", data = null.
* При ошибке: status = 'error', data - детали ошибки; ответ также публикуется в lm/scheduler/error.




=== PUB <code>lm/scheduler/do/*/status</code> ===
=== SUB <code>lm/scheduler/events/update</code> ===
Публикует текущее активное событие управления цифровым выходом DO1 если оно есть.
Обновляет свойства события: title, priority, rrule. '''Существующие действия события не меняются.'''


'''Изменение относительно v1.2.4:''' payload с полем <code>actions</code> отклоняется с ошибкой валидации. Для изменения действий используйте топик [[#sub-lmscheduler-actions-update|lm/scheduler/events/actions/update]].


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
 
 
Payload format<span id="событие-есть-1"></span>Событие есть:
  {
  {
  status: Literal['running'],
     "id": str,
  event: {
     "title": str,
     id: str,
     "priority": int,
     title: str,
     "rrule": RRule
     action: {
      state: Literal[0, 1]
     }
  }
  }
  }
Example
Example
  {
  {
   "status": "running",
   "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
   "event": {
  "title": "holiday",
     "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
  "priority": 1,
     "title": "holiday",
   "rrule": {
     "action": {
     "freq": "DAILY", "interval": 1, "start_date": "2024-01-20",
      "state": 1
    "start_time_type": "time", "start_time": "00:00", "start_time_offset": null,
     }
     "count": 1, "until_date": null, "until_time_type": null, "until_time": null, "until_time_offset": null,
     "from_time_type": "sunset", "from_time": null, "from_time_offset": 0,
    "to_time_type": "sunset", "to_time": null, "to_time_offset": 0,
     "bymonth": null, "bymonthday": null, "byweekday": null, "from_min": null, "to_min": null
   }
   }
  }
  }
'''Response''' '''(новое в v1.3.4)''' - топик <code>lm/scheduler/events/update/response</code>, конверт {status, msg, data} - аналогично events/add/response, data - обновлённое событие.




<span id="sub-lmscheduler-actions-update"></span>
=== SUB <code>lm/scheduler/events/actions/update</code> === '''(новое в v1.3.4)'''
Полностью заменяет блок действий события. '''Семантика обновления - полная замена, не merge.''' Все действия, отсутствующие в новом actions, удаляются из события. Чтобы очистить действия события, отправьте пустые словари player и do.


События нет:
Payload format
  {
  {
  status: Literal['no_event'],
    "id": str,
  }
    "actions": {
Example
      "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
  {
  {
   "status": "no_event"
   "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}}
  }
  }
  }
* '''status''' - Текущий статус расписания для DO1. Может принимать значения ‘running’, ‘no_event’.
Clear actions example
* '''event''' - Активное событие со всеми параметрами. Присутствует только когда status равен ‘running’.
{
* '''id''' - Уникальный идентификатор события.
  "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
* '''title''' - Название события.
  "actions": {"player": {}, "do": {}}
* '''action''' - Действие которое должно быть выполнено для данного события.
}
* '''state''' - Состояние цифрового выхода. Может принимать значения 0 (выключен) или 1 (включен).
* '''id''' - Уникальный идентификатор события (UUID).
* '''actions.player''' - Действия для групп плееров, ключ словаря - название группы. type: play/blackout/static_color; entity_type/entity_id заполнены при play; count - зарезервировано, для play должно быть null; channels заполнено при static_color.
* '''actions.do''' - Действия для цифровых выходов, ключ словаря - номер порта строкой ('1','2','3'); port должен совпадать с ключом; state - 0 или 1.


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


=== SUB <code>lm/settings/datetime/timezone</code> ===
Получает текущую таймзону.


=== PUB <code>lm/scheduler/events/changes</code> ===
Публикует вновь созданные/изменённые/удалённые события.
Payload format
Payload format
  {
  {
     timezone: str
     "status": Literal['created', 'updated', 'deleted'],
    "event": Event  # формат события - см. lm/scheduler/events выше
  }
  }
Example
Example
   {
{
     "timezone": "Europe/Moscow",
   "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 <code>lm/settings/location/coordinates</code> ===
=== SUB <code>lm/scheduler/events/periods</code> ===
Получает координаты устройства для расчета солнечного времени.
Принимает запрос на публикацию всех одиночных событий за указанный период. Запрос должен содержать Correlation Data для последующей идентификации ответа. Запрос может содержать Response Topic; в противном случае ответ публикуется в топик lm/scheduler/events/periods/response.
 


Payload format
Payload format
  {
  {
  latitude: float
    "from_datetime": str,
  longitude: float
    "to_datetime": str,
    "filters": Optional[{"player": bool, "do1": bool, "do2": bool, "do3": bool}]
  }
  }
Example
Example
  {
{
    latitude: 56.821019190097616
  "from_datetime": "2024-02-25T05:00:00",
    longitude: 60.59559633825789
  "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.




== 4 Управление устройствами Art-Net ==
=== PUB <code>lm/scheduler/events/periods/response</code> ===
Сервис осуществляет мониторинг и управления ArtNet и RDM устройствами.
Публикует список одиночных событий календаря за указанный период (период задаётся в запросе lm/scheduler/events/periods).


'''Изменение относительно v1.2.4:''' payload теперь объект-конверт {status, msg, data}, где список событий находится в поле data. Раньше payload был самим JSON-массивом событий.


<span id="pub-lmartnet_devices_management_serviceerror"></span>
Payload format
{
    "status": Literal['success'],
    "msg": str,
    "data": [
      { "id": str, "title": str, "start": str, "end": str, "priority": int, "duration": float }
    ]
}
Example
{
  "status": "success",
  "msg": "Request was accepted",
  "data": [
    {
      "id": "abe4c633-8e3f-4938-94e2-efd135d993fc",
      "title": "holiday",
      "priority": 1,
      "start": "2024-02-29T12:00:00+03:00",
      "end": "2024-03-02T12:00:00+03:00",
      "duration": 259200.0
    }
  ]
}
* '''status''' / '''msg''' - Статус и сообщение ответа.
* '''data''' - Массив одиночных событий за период: id, title, priority, start/end (ISO), duration (сек).


=== PUB <code>lm/artnet_devices_management_service/error</code> ===
Публикует ошибки.


Выставляет заголовок '''Correlation data''' если он был установлен в запросе.
=== 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 (событие есть)
{
  "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.


Payload format<pre>{ 
    msg: str
    data: Any 
}</pre>
* '''msg''' - contain error message
* '''data''' - contain related error data


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


=== PUB <code>lm/artnet_devices_management_service/artnet/devices/changes</code> ===
Payload format (событие есть)
Публикует вновь созданные/измененные/удаленные ArtNet устройства.
{ "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 <code>lm/settings/datetime/timezone</code> ===
Получает текущую таймзону (используется сервисом расписания для расчёта солнечного времени).
Payload format
Payload format
  {
  { "timezone": str }
    status: Literal['created', 'updated', 'deleted']
Example
    device: {
{ "timezone": "Europe/Moscow" }
        mac_address: str
 
        ip_address: str
        subnet_mask: str
        default_gateway: str
        dhcp_status: bool
        name: str
        style: str
        firmware_version: str
        ports: dict[
            int,
            {
                bind_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]
                out_signal: Optional[Literal['DMX', 'SPI']]
                is_data_transmitting: 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
            }
        ]
        rdm_devices_count: int
    }
}


=== SUB <code>lm/settings/location/coordinates</code> ===
Получает координаты устройства для расчёта солнечного времени.
Payload format
{ "latitude": float, "longitude": float }
Example
{ "latitude": 56.821019190097616, "longitude": 60.59559633825789 }




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


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


Payload format
== 4. Управление устройствами Art-Net ==
{
Сервис осуществляет мониторинг и управление ArtNet и RDM устройствами.
    status: Literal['created', 'updated', 'deleted']
    device: {
        uid: str
        art_net_device_mac: str
        art_net_device_ip: str
        port: int
        supported_params: dict[str, Any]
    }
}
* '''uid''' - Уникальный идентификатор устройства.
* '''art_net_device_mac''' - Mac адрес ArtNet устройства к которому подключено данное rdm устройство.
* '''art_net_device_ip''' - IP адрес ArtNet устройства к которому подключено данное rdm устройство.
* '''port''' - Номер порта ArtNet устройства к которому подключено данное rdm устройство.
* '''supported_params''' - Словарь параметров и их значений.


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


=== PUB <code>lm/artnet_devices_management_service/cmd_response</code> ===
Payload format<pre>{
Публикует результаты выполнения асинхронных команд.
    msg: str
    data: Any
}</pre>
* '''msg''' - contain error message
* '''data''' - contain related error data


Используется для уведомления о завершении длительных операций, которые выполняются в фоновом режиме. Клиент получает <code>transaction_uid</code> при инициации команды и может отслеживать её статус через данный топик.


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


Payload format
Payload format
  {
  {
     "transaction_uid": "string",
     "status": Literal['created', 'updated', 'deleted'],
    "status": "string"
    "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,
        }],
    }
  }
  }
* '''transaction_uid''' - Уникальный идентификатор транзакции, возвращаемый при инициации асинхронной команды
* '''status''' - Статус выполнения команды. Возможные значения: “done”, “error”


'''Изменения относительно 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
Example
  {
  {
     "transaction_uid": "550e8400-e29b-41d4-a716-446655440000",
     "status": "updated",
    "status": "done"
    "device": {
        "mac_address": "aa:bb:cc:dd:ee:ff",
        "ip_address": "192.168.1.10",
        "subnet_mask": "255.255.255.0",
        "default_gateway": "192.168.1.1",
        "dhcp_status": false,
        "name": "LS-Converter",
        "esta_man_code": 6155,
        "oem_code": 2,
        "style": "StNode",
        "firmware_version": "1.2.3",
        "ports": {
            "10": {
                "bind_index": 1, "port_index": 0, "is_input": false, "is_output": true,
                "port_type": "DMX512", "name": "p1", "universe": 10, "is_rdm_on": true,
                "physical_port": 1, "mode": "DMX OUT", "is_data_transmitting": false,
                "tod_uids": ["0001:00000001"], "lost": false
            }
        },
        "status": "RcPowerOk",
        "dev_mode": null,
        "spi_settings": null,
        "dmx_settings": {"break_time": 90, "mab_time": 8, "chan_time": 50, "pause_time": 40, "chan_num": 512}
    }
  }
  }




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


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


Payload format
{
    "status": Literal['created', 'updated', 'deleted'],
    "device": {
        "uid": str,
        "status": Literal['online', 'offline'],
        "supported_params": dict[str, Any],
        "ip": str,
        "physical_port": int,
    }
}
* '''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
    }
}


== 5 Управление триггерами ==
<span id="pub-lmtrigger_servicetriggertrigger_list"></span>
=== PUB <code>'lm/trigger_service/trigger/trigger_list'</code> ===
Публикует список всех триггеров. Топик всегда содержит актуальный список.


=== PUB <code>lm/artnet_devices_management_service/cmd_response</code> ===
Публикует результаты выполнения асинхронных REST команд. Используется для уведомления о завершении длительных операций, выполняемых в фоновом режиме. Клиент получает transaction_uid при инициации команды и может отслеживать её статус через данный топик.


Payload format
Payload format
  [
  {
     {
     "transaction_uid": "string",
        name: str
     "status": "string"
        tr_type: str
  }
        params: dict[str, Any]
* '''transaction_uid''' - Уникальный идентификатор транзакции, возвращаемый при инициации асинхронной команды.
     }
* '''status''' - Статус выполнения команды. '''В текущей реализации публикуется только "done"''' (в v1.2.4 также предполагалось значение "error").
  ]
* '''name''' - Имя триггера.
* '''tr_type''' - Тип триггера.
* '''params''' - Словарь с параметрами триггера.
 


Example
Example
  [
  {
     {
     "transaction_uid": "550e8400-e29b-41d4-a716-446655440000",
        "name": "TriggerFromMqtt",
    "status": "done"
        "tr_type": "RawUDP",
}
        "params": {
 
            "network_type": "udp",
 
            "listen_ip": "0.0.0.0",
 
            "listen_port": "5555",
== 5. Управление Di Do интерфейсами плеера ==
            "data": "any"
 
        }
=== PUB <code>lm/di/port/*</code> ===
    }
<span id="pub-lmdiport0-player-v1-only"></span>PUB <code>lm/di/port/0</code> (player V1 only)<span id="pub-lmdiport1"></span>PUB <code>lm/di/port/1</code><span id="pub-lmdiport2-player-v2-only"></span>PUB <code>lm/di/port/2</code> (player V2 only)<span id="pub-lmdiport3-player-v2-only"></span>PUB <code>lm/di/port/3</code> (player V2 only)
]


Публикует состояние di порта


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




Payload format
Payload format
  [
  int
    {
Example
        name: str
  1
        action_type: str
* '''int''' - Статус Di порта. 1 - активен, 0 - неактивен.
        params: dict[str, Any]
 
    }
<span id="pub-lmdoport0-player-v1-only"></span>
  ]
* '''name''' - Имя action.
* '''action_type''' - Тип action.
* '''params''' - Словарь с параметрами action.


=== PUB <code>lm/do/port/*</code> ===
PUB <code>lm/do/port/0</code> (player V1 only)


Example
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)
[
    {
        "name": "default",
        "action_type": "send_trigger_to_mqtt",
        "params": {
            "topic": "lm/trigger_service/trigger/",
            "payload": "",
            "retain": false
        }
    }
]


Публикует состояние do порта


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




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




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




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


На данный момент доступны три типа триггера: <code>RawUDP</code> и <code>ArtNet</code> и <code>Mqtt</code>.


* RawUDP - Срабатывает при получении UDP пакета удовлетворяющего заданным параметрам.
* ArtNet - Срабатывает при получении ArtNet пакета удовлетворяющего заданным параметрам.
* Mqtt - Срабатывает при получении Mqtt сообщения удовлетворяющего заданным параметрам.


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


Payload format
=== PUB <code>lm/sensors/{sensor_id}/data</code> ===
{
Публикует данные датчика.
    name: str
    tr_type: str
    params: dict[str, Any]
}
* '''name''' - Имя триггера.
* '''tr_type''' - Тип триггера.
* '''params''' - Словарь с параметрами триггера. Параметры отличаются в зависимости от типа триггера.


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


Example
Example<pre>{  
  {
     "34"
     "name": "TriggerFromMqtt",
}</pre>
    "tr_type": "RawUDP",
== 7. Управление RS485 интерфейсами плеера ==
    "params": {
<span id="pub-lmserialport_controllererror"></span>
        "network_type": "udp",
        "listen_ip": "0.0.0.0",
        "listen_port": "5555",
        "data": "any"
    }
}


=== PUB <code>lm/serialport_controller/error</code> ===
Публикует ошибки.


Выставляет заголовок '''Correlation data''' если он был установлен в запросе.
Payload format<pre>{ 
    msg: str
    data: Any 
}</pre>
* '''msg''' - contain error message
* '''data''' - contain related error data


'''Ожидаемые Параметры'''<span id="параметры-для-триггера-с-типом-rawudp"></span>Параметры для <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"
}


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




Параметры для <u>триггера с типом ArtNet</u>
Payload format
[
     {
     {
         network_type: Literal['tcp', 'udp']
         name: str
        listen_ip: str
        mode: Literal['rs485', 'dmxOut']
        listen_port: int
        universe: int
        channel: int
        min_level: int
        max_level: int
     }
     }
* '''network_type''' - Тип сети. Принимает значения ‘tcp’ или ‘udp’.
]
* '''listen_ip''' - Прослушиваемый ip.
* '''name''' - Имя порта.
* '''listen_port''' - Прослушиваемый порт.
* '''mode''' - Предназначение порта.
* '''universe''' - Отражает значение параметра subuni из ArtNet пакета.
* '''channel''' - Номер канала в ArtNet пакете.
* '''min_level''' - Минимальное значение в канале для срабатывания триггера.
* '''max_level''' - Максимальное значение в канале для срабатывания триггера.<span id="example-artnet-params"></span>Example ArtNet params
{
    "network_type": "udp",
    "listen_ip": "0.0.0.0",
    "listen_port": "6454",
    "universe": 3,
    "channel": 5,
    "min_level": 1,
    "max_level": 124
}




 
Example
Параметры для <u>триггера с типом Mqtt</u>
[
    {
        "name": "port1",
        "mode": "rs485",
    },
    {
        "name": "port2",
        "mode": "rs485",
    },
    {
        "name": "port3",
        "mode": "dmxOut",
    },
     {
     {
         topic: str
         "name": "port4",
         payload: str
         "mode": "dmxOut",
     }
     }
* '''topic''' - Mqtt топик для отслеживания.
  ]
* '''payload''' - Полезная нагрузка mqtt сообщения в виде байт. Должна точно совпадать.<span id="example-mqtt-params"></span>Example Mqtt params
 
  {
    "topic": "lm/di/port/1",
    "payload": "\x01"
}


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


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


<span id="payload-format-4"></span>
Payload format
=== Payload format ===
  {
  {
     name: str
     name: str
    mode: Literal['rs485', 'dmxOut']
  }
  }
* '''name''' - Имя триггера.<span id="example-4"></span>Example
* '''name''' - Имя порта.
* '''mode''' - Предназначение порта.
 
 
Example
  {
  {
     "name": "TriggerFromMqtt",
     "name": "port1",
    "mode": "rs485",
  }
  }




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


На данный момент доступны два типа action: <code>send_mqtt_msg_raw</code> и <code>send_trigger_to_mqtt</code>.


* '''send_mqtt_msg_raw''' - Отправляет по mqtt сообщение записанное в параметрах не внося в него никаких изменений.
 
* '''send_trigger_to_mqtt''' - Отправляет по mqtt сообщение в теле которого находится сработавший триггер.
== 8. Управление светодиодами плеера ==
<span id="pub-lmledsstate"></span>
 
=== PUB <code>'lm/leds/state'</code> ===
Публикует состояние диодов rs485 портов




Payload format
Payload format
  {
  {
     name: str
     Port1: {
    action_type: str
      green: bool,
    params: dict[str, Any]
      red: bool,
}
    },
* '''name''' - Имя action.
    Port2: {
* '''action_type''' - Тип action.
      green: bool,
* '''params''' - Словарь с параметрами action. Различается в зависимости от типа action.<span id="example-5"></span>Example
      red: bool,
{
    },
    "name": "default",
    Port3: {
     "action_type": "send_trigger_to_mqtt",
      green: bool,
     "params": {
      red: bool,
        "topic": "lm/trigger_service/trigger/",
     },
        "payload": "",
     Port4: {
        "retain": false
      green: bool,
     }
      red: bool,
     },
  }
  }




 
Example
'''Ожидаемые Параметры'''
 
Параметры для actions с типом <code>send_trigger_to_mqtt</code> и <code>send_trigger_to_mqtt</code> совпадают.
  {
  {
     topic: str
     "Port1": {
     payload: str
      "green": true,
     retain: bool
      "red": true,
     },
    "Port2": {
      "green": true,
      "red": true,
     },
    "Port3": {
      "green": true,
      "red": true,
    },
    "Port4": {
      "green": true,
      "red": true,
    },
  }
  }
* '''topic''' - Mqtt topic в который будет отправлено сообщение.
* '''green''' - Статус зеленого светодиода.
* '''payload''' - Mqtt payload. Полезная нагрузка сообщения.
* '''red''' - Статус красного светодиода.
* '''retain''' - Mqtt retain param.


Типа <code>send_trigger_to_mqtt</code> игнорирует поля '''payload''' и '''retain''' но в сообщении они должны присутствовать.
=== SUB <code>lm/leds/change_state</code> ===
Принимает команды для изменения состояния диодов у rs485 порта.




Example params
Payload command format
  {
  {
        "topic": "lm/trigger_service/trigger/",
    pub port: Literal['Port1', 'Port2', 'Port3', 'Port4'],
        "payload": "",
    green: bool,
        "retain": false
    red: bool,
  }
  }




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




Payload format
Payload format
  {
  {
     name: str
     times: int,
    interval: int,
  }
  }
* '''name''' - Имя action.
Example
Example
  {
  {
     "name": "default",
     "times": 5,
    "interval": 1000
  }
  }
* '''times''' - Количество миганий (от 1 до 255).
* '''interval''' - Интервал между миганиями в миллисекундах.




=== SUB <code>lm/trigger_service/set_trigger_to_action_relation</code> ===
= III. Триггеры и actions =
Создает связь между триггером и action.
Автоматизация: как настроить реакцию плеера на внешние события (сигналы RawUDP/ArtNet/Mqtt, показания DI/DO и внешних датчиков из раздела II) и что при этом публикуется в MQTT. Раздел имеет смысл читать после разделов I и II — action'ы триггеров ссылаются на то, что там описано.
 
== 9. Управление триггерами ==
<span id="pub-lmtrigger_servicetriggertrigger_list"></span>
 
=== PUB <code>'lm/trigger_service/trigger/trigger_list'</code> ===
Публикует список всех триггеров. Топик всегда содержит актуальный список.




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




Example
Example
  {
  [
     "trigger": {
     {
         "name": "TriggerFromMqtt",
         "name": "TriggerFromMqtt",
         "tr_type": "RawUDP",
         "tr_type": "RawUDP",
Строка 1562: Строка 1442:
             "data": "any"
             "data": "any"
         }
         }
     },
     }
     "action": {
]
         "name": "default",
 
 
=== PUB <code>lm/trigger_service/action/action_list</code> ===
Публикует список всех action. <br />Топик всегда содержит актуальный список.
 
 
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",
         "action_type": "send_trigger_to_mqtt",
         "params": {
         "params": {
Строка 1572: Строка 1474:
         }
         }
     }
     }
  }
  ]




=== SUB <code>lm/trigger_service/delete_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.
Строка 1595: Строка 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
            }
         }
         }
     }
     }
  }
  ]




=== PUB <code>lm/trigger_service/error</code> ===
=== SUB <code>lm/trigger_service/trigger/add</code> ===
Публикует ошибки.
Добавляет новый триггер.


Выставляет заголовок '''Correlation data''' если он был установлен в запросе.
На данный момент доступны три типа триггера: <code>RawUDP</code> и <code>ArtNet</code> и <code>Mqtt</code>.


 
* RawUDP - Срабатывает при получении UDP пакета удовлетворяющего заданным параметрам.
Payload format<pre>{ 
* ArtNet - Срабатывает при получении ArtNet пакета удовлетворяющего заданным параметрам.
    msg: str
* Mqtt - Срабатывает при получении Mqtt сообщения удовлетворяющего заданным параметрам.
    data: Any 
}</pre>
* '''msg''' - contain error message
* '''data''' - contain related error data
 
=== SUB <code>lm/trigger_service/delete_trigger_with_related_actions</code> ===
Удаляет триггер и все связанные с ним действия.




Строка 1638: Строка 1539:
  {
  {
     name: str
     name: str
    tr_type: str
    params: dict[str, Any]
  }
  }
* '''name''' - Имя триггера.<span id="example-10"></span>Example
* '''name''' - Имя триггера.
* '''tr_type''' - Тип триггера.
* '''params''' - Словарь с параметрами триггера. Параметры отличаются в зависимости от типа триггера.
 
 
Example
  {
  {
     "name": "TriggerFromMqtt",
     "name": "TriggerFromMqtt",
  }
    "tr_type": "RawUDP",
 
    "params": {
        "network_type": "udp",
        "listen_ip": "0.0.0.0",
        "listen_port": "5555",
        "data": "any"
    }
  }




== 6. Настройки системы ==
Сервис осуществляет конфигурирование системных настроек ОС.


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


=== PUB <code>lm/system_configurator/error</code> ===
Параметры для <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"
}


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




Payload format<pre>
Параметры для <u>триггера с типом ArtNet</u>
    msg: str
    data: Any 
}</pre>
* '''msg''' - contain error message
* '''data''' - contain related error data
 
 
=== PUB <code>lm/system_settings/external_access/certificates</code> ===
Публикует список всех x509 сертификатов.<br />Топик всегда содержит актуальный список.
 
 
Payload format
[
     {
     {
         name: str
         network_type: Literal['tcp', 'udp']
         cert_type: str
        listen_ip: str
         public_bytes: str
         listen_port: int
         params: dict[str, Any]
        universe: int
        channel: int
         min_level: int
         max_level: int
     }
     }
]
* '''network_type''' - Тип сети. Принимает значения ‘tcp’ или ‘udp’.
* '''name''' - Имя сертификата.
* '''listen_ip''' - Прослушиваемый ip.
* '''cert_type''' - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’
* '''listen_port''' - Прослушиваемый порт.
* '''params''' - Словарь с параметрами сертификата. Набор параметров отличается в зависимости от [[#certificate-params-format|типа]] сертификата.
* '''universe''' - Отражает значение параметра subuni из ArtNet пакета.
* '''channel''' - Номер канала в ArtNet пакете.
* '''min_level''' - Минимальное значение в канале для срабатывания триггера.
* '''max_level''' - Максимальное значение в канале для срабатывания триггера.<span id="example-artnet-params"></span>Example ArtNet params
{
    "network_type": "udp",
    "listen_ip": "0.0.0.0",
    "listen_port": "6454",
    "universe": 3,
    "channel": 5,
    "min_level": 1,
    "max_level": 124
}
 




Example
Параметры для <u>триггера с типом Mqtt</u>
[
     {
     {
         "cert_type": "certificate",
         topic: str
         "name": "cert_name",
         payload: str
        "params": {
    }
            "issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
* '''topic''' - Mqtt топик для отслеживания.
            "san": "IP=192.168.0.3",
* '''payload''' - Полезная нагрузка mqtt сообщения в виде байт. Должна точно совпадать.<span id="example-mqtt-params"></span>Example Mqtt params
            "subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
{
            "valid_from": "1664440221.0",
    "topic": "lm/di/port/1",
            "valid_to": "1759048221.0"
    "payload": "\x01"
        },
}
        "public_bytes": "-----BEGIN CERTIFICATE-----\n"
                        "-----END CERTIFICATE-----\n"}]
    }
]




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


 
<span id="payload-format-4"></span>
Payload format
=== Payload format ===
  {
  {
     http_port: int
     name: str
    https_port: int
}
    is_https_enabled: bool
* '''name''' - Имя триггера.<span id="example-4"></span>Example
    is_http_redirected: bool
{
     cert_name: str
     "name": "TriggerFromMqtt",
  }
  }
* '''http_port''' - Http порт. По умолчанию 80.
* '''https_port''' - Https порт. По умолчанию 443.
* '''is_https_enabled''' - Индикатор включен ли https.
* '''is_http_redirected''' - Индикатор включена ли переадресация http to https.
* '''cert_name''' - Имя сертификата сервера.




Example
=== SUB <code>lm/trigger_service/action/add</code> ===
{
Добавляет новый action.
    "http_port": 80,
    "https_port": 443,
    "is_https_enabled": false,
    "is_http_redirected": true,
    "cert_name": ""
}


На данный момент доступны два типа action: <code>send_mqtt_msg_raw</code> и <code>send_trigger_to_mqtt</code>.


=== SUB <code>lm/system_settings/external_access/change_web_access_settings</code> ===
* '''send_mqtt_msg_raw''' - Отправляет по mqtt сообщение записанное в параметрах не внося в него никаких изменений.
Меняет настройки web доступа.
* '''send_trigger_to_mqtt''' - Отправляет по mqtt сообщение в теле которого находится сработавший триггер.




Payload format
Payload format
  {
  {
     http_port: int
     name: str
     https_port: int
     action_type: str
    is_https_enabled: bool
     params: dict[str, Any]
    is_http_redirected: bool
     cert_name: str
  }
  }
* '''http_port''' - Http порт. По умолчанию 80.
* '''name''' - Имя action.
* '''https_port''' - Https порт. По умолчанию 443.
* '''action_type''' - Тип action.
* '''is_https_enabled''' - Индикатор включен ли https.
* '''params''' - Словарь с параметрами action. Различается в зависимости от типа action.<span id="example-5"></span>Example
* '''is_http_redirected''' - Индикатор включена ли переадресация http to https.
* '''cert_name''' - Имя сертификата сервера.
 
 
Example
  {
  {
     "http_port": 80,
     "name": "default",
     "https_port": 443,
     "action_type": "send_trigger_to_mqtt",
     "is_https_enabled": false,
     "params": {
    "is_http_redirected": true,
        "topic": "lm/trigger_service/trigger/",
    "cert_name": ""
        "payload": "",
        "retain": false
    }
  }
  }




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


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


Payload format
Параметры для actions с типом <code>send_trigger_to_mqtt</code> и <code>send_trigger_to_mqtt</code> совпадают.
  {
  {
     cert_name: str
     topic: str
     certificate: bytes
     payload: str
    key: bytes
     retain: bool
     intermediate: bytes
  }
  }
* '''cert_name''' - Читаемое имя сертификата.
* '''topic''' - Mqtt topic в который будет отправлено сообщение.
* '''certificate''' - x.509 сертификат в pem формате.
* '''payload''' - Mqtt payload. Полезная нагрузка сообщения.
* '''key''' - Приватный ключ в pem формате.
* '''retain''' - Mqtt retain param.
* '''intermediate''' - (Опционально) промежуточный сертификат.


=== SUB <code>lm/system_settings/certificates/upload_certificate_corresponding_csr</code> ===
Типа <code>send_trigger_to_mqtt</code> игнорирует поля '''payload''' и '''retain''' но в сообщении они должны присутствовать.
Загружает сертификат относящийся к сформированному ранее csr.




Payload format
Example params
  {
  {
    cert_name: str
        "topic": "lm/trigger_service/trigger/",
    certificate: bytes
        "payload": "",
        "retain": false
  }
  }
* '''cert_name''' - Имя csr сертификата.
* '''certificate''' - x.509 сертификат в pem формате.




 
=== SUB <code>lm/trigger_service/action/delete</code> ===
=== SUB <code>lm/system_settings/certificates/delete_certificate</code> ===
Удаляет action.
Удаляет сертификат и все связанные с ним файлы.




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




Example
Example
  {
  {
    "cert_type": "certificate",
     "name": "default",
     "name": "cert_name",
}
    "params": {
        "issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
        "san": "IP=192.168.0.3",
        "subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
        "valid_from": "1664440221.0",
        "valid_to": "1759048221.0"
    },
    "public_bytes": "-----BEGIN CERTIFICATE-----\n"
                    "-----END CERTIFICATE-----\n"}]




=== SUB <code>lm/system_settings/certificates/generate_csr</code> ===
=== SUB <code>lm/trigger_service/set_trigger_to_action_relation</code> ===
Генерирует Certificate Signing Request.
Создает связь между триггером и action.




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




Example
Example
  {
  {
     "cert_name": "ss_cert23",
     "trigger": {
    "cert_type": "certificate",
        "name": "TriggerFromMqtt",
    "key_size": 2048,
        "tr_type": "RawUDP",
    "subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
        "params": {
    "san": "IP=192.168.0.3,DNS=domain.com"
            "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/generate_self_sign_certificate</code> ===
=== SUB <code>lm/trigger_service/delete_trigger_to_action_relation</code> ===
Генерирует самоподписанный сертификат.
Удаляет связь между триггером и action.




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




Example
Example
  {
  {
     "cert_name": "ss_cert23",
     "trigger": {
    "cert_type": "certificate",
        "name": "TriggerFromMqtt",
    "key_size": 2048,
        "tr_type": "RawUDP",
    "subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
        "params": {
    "san": "IP=192.168.0.3,DNS=domain.com"
            "network_type": "udp",
  }
            "listen_ip": "0.0.0.0",
 
            "listen_port": "5555",
 
            "data": "any"
=== PUB <code>lm/system_settings/network/interfaces/wired/eth*/statistics</code> ===
        }
<code>PUB lm/system_settings/network/interfaces/wired/eth0/statistics</code>
    },
    "action": {
        "name": "default",
        "action_type": "send_trigger_to_mqtt",
        "params": {
            "topic": "lm/trigger_service/trigger/",
            "payload": "",
            "retain": false
        }
    }
  }
 
 
=== PUB <code>lm/trigger_service/error</code> ===
Публикует ошибки.
 
Выставляет заголовок '''Correlation data''' если он был установлен в запросе.
 
 
Payload format<pre>
    msg: str
    data: Any 
}</pre>
* '''msg''' - contain error message
* '''data''' - contain related error data


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


Публикует информацию о проводном интерфейсе ethernet каждые 10 секунд.
=== SUB <code>lm/trigger_service/delete_trigger_with_related_actions</code> ===
Удаляет триггер и все связанные с ним действия.




Payload format
Payload format
  {
  {
     status: str
     name: str
    ip_assign_method: Literal['manual', 'dhcp']
}
    ip: str
* '''name''' - Имя триггера.<span id="example-10"></span>Example
    netmask: str
{
    gateway: str
     "name": "TriggerFromMqtt",
    dns_assign_method: Literal['manual', 'dhcp']
    dns_servers: list[str]
     mac_address: str
  }
  }
* '''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
 
 
 
'''Новое в v1.3.4:''' добавлен топик публикации факта срабатывания триггера (ранее в него ничего не публиковалось). Остальной функционал раздела (создание/удаление триггеров и action, связи триггер↔action, списки) не изменился.
 
=== PUB <code>lm/trigger_service/trigger/</code> === '''(новое в v1.3.4)'''
Публикует сработавший триггер. retain = false. Публикация выполняется с qos=2.
 
Payload format
  {
  {
     "status": "up",
     "id": int,
    "ip_assign_method": "manual",
     "name": str
    "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"
  }
  }
* '''id''' - Стабильный идентификатор триггера.
* '''name''' - Имя триггера.


=== SUB <code>lm/system_settings/network/interfaces/wired/eth*/set_ip_credential</code> ===
Example
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>
{
    "id": 1,
    "name": "Artnet"
}


Устанавливает ip адресацию и шлюз на интерфейс.


Поддерживает статическое назначение ip и назначение через dhcp.
= IV. Система и обслуживание =
Администрирование самого устройства: сетевые и системные настройки, обновление программного обеспечения. Не связано напрямую с воспроизведением контента.


<span id="payload-format-10"></span>
== 10. Настройки системы ==
=== Payload format ===
Сервис осуществляет конфигурирование системных настроек ОС.


Статическая адресация:
{
    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''' - Шлюз по умолчанию.


=== PUB <code>lm/system_configurator/error</code> ===
Публикует ошибки.


Example
Выставляет заголовок '''Correlation data''' если он был установлен в запросе.
{
    "ip_assign_method": "manual",
    "static_ip": "192.168.0.205",
    "static_netmask": "255.255.255.0",
    "static_gateway": "192.168.0.1"
}




Динамическая адресация
Payload format<pre>{  
  {
     msg: str
     ip_assign_method: Literal['dhcp']
    data: Any  
  }
}</pre>
* '''ip_assign_method''' - Способ назначения ip адреса. Должно быть <code>dhcp</code>.
* '''msg''' - contain error message
<span id="example-9"></span>Example
* '''data''' - contain related error data
{
    "ip_assign_method": "dhcp"
}




=== SUB <code>lm/system_settings/network/interfaces/wired/eth*/set_dns_credential</code> ===
=== PUB <code>lm/system_settings/external_access/certificates</code> ===
SUB <code>lm/system_settings/network/interfaces/wired/eth0/set_dns_credential</code>
Публикует список всех x509 сертификатов.<br />Топик всегда содержит актуальный список.


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


Назначение dns серверов на интерфейс.
Payload format
[
    {
        name: str
        cert_type: str
        public_bytes: str
        params: dict[str, Any]
    }
]
* '''name''' - Имя сертификата.
* '''cert_type''' - Тип сертификата. Может принимать значения ‘csr’ или ‘certificate’
* '''params''' - Словарь с параметрами сертификата. Набор параметров отличается в зависимости от [[#certificate-params-format|типа]] сертификата.


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


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"}]
    }
]


Payload format


Статическое назначение:
=== PUB <code>lm/system_settings/external_access/web_access_settings</code> ===
Публикует список настроек web доступа.<br />Топик всегда содержит актуальный список.
 
 
Payload format
  {
  {
     dns_assign_method: Literal['manual']
     http_port: int
     static_dns_servers: list[str]
     https_port: int
    is_https_enabled: bool
    is_http_redirected: bool
    cert_name: str
  }
  }
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>manual</code>.
* '''http_port''' - Http порт. По умолчанию 80.
* '''static_dns_servers''' - Список DNS серверов.<span id="example-10"></span>Example
* '''https_port''' - Https порт. По умолчанию 443.
{
* '''is_https_enabled''' - Индикатор включен ли https.
    "dns_assign_method": "manual",
* '''is_http_redirected''' - Индикатор включена ли переадресация http to https.
    "static_dns_servers": ["8.8.8.8", "8.8.4.4"]
* '''cert_name''' - Имя сертификата сервера.
}
Динамическое назначение:
{
    dns_assign_method: Literal['dhcp']
}
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>dhcp</code>.




Example
Example
  {
  {
     "dns_assign_method": "dhcp"
     "http_port": 80,
    "https_port": 443,
    "is_https_enabled": false,
    "is_http_redirected": true,
    "cert_name": ""
  }
  }




=== PUB <code>lm/system_settings/network/interfaces/modem/statistics</code> ===
=== SUB <code>lm/system_settings/external_access/change_web_access_settings</code> ===
Публикует информацию о модемном интерфейсе каждые 10 секунд.
Меняет настройки web доступа.




Payload format
Payload format
  {
  {
     ip_assign_method: Literal['manual', 'dhcp']
     http_port: int
     ip: str
     https_port: int
    netmask: str
     is_https_enabled: bool
    gateway: str
     is_http_redirected: bool
    dns_assign_method: Literal['manual', 'dhcp']
     cert_name: str
     dns_servers: list[str]
  }
     apn: {
* '''http_port''' - Http порт. По умолчанию 80.
        apn: str,
* '''https_port''' - Https порт. По умолчанию 443.
        username: str,
* '''is_https_enabled''' - Индикатор включен ли https.
        password: str,
* '''is_http_redirected''' - Индикатор включена ли переадресация http to https.
    }
* '''cert_name''' - Имя сертификата сервера.
     modem_status: {
        state: str,
        state_failed_reason: str,
        power_state: str,
        signal_quality: int,
        access_technologies: list[str]
    }
  }
* '''status''' - Статус интерфейса. Может быть <code>up</code> или <code>down</code>.
* '''ip_assign_method''' - Способ назначения ip адреса. Может быть <code>manual</code> или <code>dhcp</code>.
* '''netmask''' - IP адрес интерфейса.
* '''gateway''' - Шлюз по умолчанию.
* '''dns_assign_method''' - Способ назначения dns серверов. Может быть <code>manual</code> или <code>dhcp</code>.
* '''dns_servers''' - Список dns серверов.
* '''apn''':
** '''apn''': APN сервер.
** '''username''': Имя пользователя для apn сервера.
** '''password''': Пароль для apn сервера.
* '''modem_status''':
** '''state''': Состояние подключения.
** '''state_failed_reason''': Причина ошибки если таковая есть.
** '''power_state''': Состояние питания модема.
** '''signal_quality''': Качество сигнала в процентах.
** '''access_technologies''': Список текущих режимов (LTE, UMTS и т.д.).




Example
Example
  {
  {
     "status": "up",
     "http_port": 80,
    "ip_assign_method": "manual",
     "https_port": 443,
    "ip": "192.168.0.205",
     "is_https_enabled": false,
    "netmask": "255.255.255.0",
     "is_http_redirected": true,
     "gateway": "192.168.0.1",
     "cert_name": ""
     "dns_assign_method": "manual",
     "dns_servers": ["8.8.8.8", "8.8.4.4"],
     "apn": {
        "apn": "internet.mts.ru",
        "username": "mts",
        "password": "mts"
    },
    "modem_status": {
        "state": "connected",
        "state_failed_reason": "--",
        "power_state": "on",
        "signal_quality": 81,
        "access_technologies": ["LTE"]
    }
  }
  }




 
=== SUB <code>lm/system_settings/certificates/upload_certificate</code> ===
=== SUB <code>lm/system_settings/network/interfaces/modem/set_ip_credential</code> ===
Загружает сертификат и его ключ для дальнейшего использования в настройках доступа.
Устанавливает ip адресацию и шлюз на интерфейс.
 
Поддерживает статическое назначение ip и назначение через dhcp.




Payload format
Payload format
Статическая адресация
  {
  {
     ip_assign_method: Literal['manual']
     cert_name: str
     static_ip: str
     certificate: bytes
     static_netmask: str
     key: bytes
     static_gateway: str
     intermediate: bytes
  }
  }
* '''ip_assign_method''' - Способ назначения ip адреса. Должно быть <code>manual</code>.
* '''cert_name''' - Читаемое имя сертификата.
* '''static_ip''' - IPv4 адрес интерфейса
* '''certificate''' - x.509 сертификат в pem формате.
* '''static_netmask''' - Сетевая маска интерфейса.
* '''key''' - Приватный ключ в pem формате.
* '''static_gateway''' - Шлюз по умолчанию.<span id="example-13"></span>Example
* '''intermediate''' - (Опционально) промежуточный сертификат.
 
=== SUB <code>lm/system_settings/certificates/upload_certificate_corresponding_csr</code> ===
Загружает сертификат относящийся к сформированному ранее csr.
 
 
Payload format
  {
  {
     "ip_assign_method": "manual",
     cert_name: str
     "static_ip": "192.168.0.205",
     certificate: bytes
    "static_netmask": "255.255.255.0",
    "static_gateway": "192.168.0.1"
  }
  }
* '''cert_name''' - Имя csr сертификата.
* '''certificate''' - x.509 сертификат в pem формате.




Динамическая адресация
{
    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/certificates/delete_certificate</code> ===
=== SUB <code>lm/system_settings/network/interfaces/modem/set_dns_credential</code> ===
Удаляет сертификат и все связанные с ним файлы.
Назначение dns серверов на интерфейс.
 
Поддерживает статическое и динамическое (dhcp) назначение dns серверов.




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




Example
Example
  {
  {
     "dns_assign_method": "manual",
     "cert_type": "certificate",
     "static_dns_servers": ["8.8.8.8", "8.8.4.4"]
     "name": "cert_name",
}
    "params": {
        "issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
        "san": "IP=192.168.0.3",
        "subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
        "valid_from": "1664440221.0",
        "valid_to": "1759048221.0"
    },
    "public_bytes": "-----BEGIN CERTIFICATE-----\n"
                    "-----END CERTIFICATE-----\n"}]




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




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




=== SUB <code>lm/system_settings/network/interfaces/modem/set_apn_credential</code> ===
Example
Назначение настроек apn на интерфейс.
{
    "cert_name": "ss_cert23",
    "cert_type": "certificate",
    "key_size": 2048,
    "subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
    "san": "IP=192.168.0.3,DNS=domain.com"
}
 


Поддерживается только статическое назначение.
=== SUB <code>lm/system_settings/certificates/generate_self_sign_certificate</code> ===
Генерирует самоподписанный сертификат.




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




Example
Example
  {
  {
     "apn": "internet.mts.ru",
     "cert_name": "ss_cert23",
     "username": "mts",
    "cert_type": "certificate",
     "password": "mts"
    "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/datetime/rtc_status</code> ===
=== PUB <code>lm/system_settings/network/interfaces/wired/eth*/statistics</code> ===
Публикует статус rtc модуля
<code>PUB lm/system_settings/network/interfaces/wired/eth0/statistics</code>


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


Payload format
Публикует информацию о проводном интерфейсе ethernet каждые 10 секунд.
    {
        is_active: bool
    }
* '''is_active''' - Активен ли rtc модуль.




Example
Payload format
  {
  {
     "is_active": true,
     status: str
    ip_assign_method: Literal['manual', 'dhcp']
    ip: str
    netmask: str
    gateway: str
    dns_assign_method: Literal['manual', 'dhcp']
    dns_servers: list[str]
    mac_address: str
  }
  }
* '''status''' - Статус интерфейса. Может быть <code>up</code> или <code>down</code>.
* '''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 адрес интерфейса.




=== SUB <code>lm/system_settings/datetime</code> ===
Example
Принимает [[#base-format-for-command-payload|команды]] на изменение даты и времени конфигурации системы.
{
    "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 <code>lm/system_settings/network/interfaces/wired/eth*/set_ip_credential</code> ===
SUB <code>lm/system_settings/network/interfaces/wired/eth0/set_ip_credential</code><span id="sub-lmsystem_settingsnetworkinterfaceswiredeth1set_ip_credential"></span>SUB <code>lm/system_settings/network/interfaces/wired/eth1/set_ip_credential</code>


Список принимаемых команд
Устанавливает ip адресацию и шлюз на интерфейс.


Поддерживает статическое назначение ip и назначение через dhcp.


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


Description: &gt; Set system date.
Статическая адресация:
{
    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''' - Шлюз по умолчанию.


Values:


command: str &gt; set_date
Example
{
    "ip_assign_method": "manual",
    "static_ip": "192.168.0.205",
    "static_netmask": "255.255.255.0",
    "static_gateway": "192.168.0.1"
}


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


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




'''Set Time'''
=== 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 time.
SUB <code>lm/system_settings/network/interfaces/wired/eth1/set_dns_credential</code>


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


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


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


Статическое назначение:
{
    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 Datetime'''
Description: &gt; Set system date and time.
Values:
command: str &gt; set_datetime


data: dict &gt; datetime: str - time in format ‘Y:M:D HH:mm:ss’
Example
{
    "dns_assign_method": "dhcp"
}


Example:<br /><code>{'command': 'set_datetime', 'data': {'datetime': '1970:01:01 13:00:00'}}</code>


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


'''Change Ntp Status'''


Description: &gt; Enable or disable ntp synchronization.
Payload format
 
{
Values:
    ip_assign_method: Literal['manual', 'dhcp']
 
    ip: str
command: str &gt; change_ntp_status
    netmask: str
 
    gateway: str
data: dict &gt; ntp: bool - is ntp sync enable
    dns_assign_method: Literal['manual', 'dhcp']
 
    dns_servers: list[str]
Example:<br /><code>{'command': 'change_ntp_status', 'data': {'ntp': True}}</code>
    apn: {
 
        apn: str,
 
        username: str,
'''Set Ntp Servers'''
        password: str,
 
    }
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
    modem_status: {
 
        state: str,
Values:
        state_failed_reason: str,
 
        power_state: str,
command: str &gt; set_ntp_servers
        signal_quality: int,
 
        access_technologies: list[str]
data: dict &gt; ntp_servers: list[str] - list of servers ip addresses or dns names
    }
}
* '''status''' - Статус интерфейса. Может быть <code>up</code> или <code>down</code>.
* '''ip_assign_method''' - Способ назначения ip адреса. Может быть <code>manual</code> или <code>dhcp</code>.
* '''netmask''' - IP адрес интерфейса.
* '''gateway''' - Шлюз по умолчанию.
* '''dns_assign_method''' - Способ назначения dns серверов. Может быть <code>manual</code> или <code>dhcp</code>.
* '''dns_servers''' - Список dns серверов.
* '''apn''':
** '''apn''': APN сервер.
** '''username''': Имя пользователя для apn сервера.
** '''password''': Пароль для apn сервера.
* '''modem_status''':
** '''state''': Состояние подключения.
** '''state_failed_reason''': Причина ошибки если таковая есть.
** '''power_state''': Состояние питания модема.
** '''signal_quality''': Качество сигнала в процентах.
** '''access_technologies''': Список текущих режимов (LTE, UMTS и т.д.).
 
 
Example
{
    "status": "up",
    "ip_assign_method": "manual",
    "ip": "192.168.0.205",
    "netmask": "255.255.255.0",
    "gateway": "192.168.0.1",
    "dns_assign_method": "manual",
    "dns_servers": ["8.8.8.8", "8.8.4.4"],
    "apn": {
        "apn": "internet.mts.ru",
        "username": "mts",
        "password": "mts"
    },
    "modem_status": {
        "state": "connected",
        "state_failed_reason": "--",
        "power_state": "on",
        "signal_quality": 81,
        "access_technologies": ["LTE"]
    }
}


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




'''Set timezone'''
=== SUB <code>lm/system_settings/network/interfaces/modem/set_ip_credential</code> ===
 
Устанавливает ip адресацию и шлюз на интерфейс.
Description: &gt; Set system timezone.
 
Values:
 
command: str &gt; set_timezone


data: dict &gt; timezone: str - timezone name
Поддерживает статическое назначение ip и назначение через dhcp.


Example:<br /><code>{'command': 'set_timezone', 'data': {'timezone': 'Europe/London'}}</code>


Payload format


Base format for command payload
Статическая адресация
  {
  {
     'command': str  
     ip_assign_method: Literal['manual']
     'data': dict[str, Any]
    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"
  }
  }
* '''command''' - command name


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


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


<code>{'command': 'set_ip', 'data': {'ifname': 'eth0', 'ip': '192.168.0.1'}}</code>
 
 
=== SUB <code>lm/system_settings/network/interfaces/modem/set_dns_credential</code> ===
=== SUB <code>lm/system_settings/power_control</code> ===
Назначение dns серверов на интерфейс.
Управляет питанием устройства
 
Поддерживает статическое и динамическое (dhcp) назначение dns серверов.




Payload format
Payload format
Статическое назначение:
  {
  {
     command: str
     dns_assign_method: Literal['manual']
     delay: int
     static_dns_servers: list[str]
  }
  }
* '''command''' - Команда управления питанием. Может принимать значения “reboot” и “shutdown”.
* '''dns_assign_method''' - Способ назначения dns серверов. Должно быть <code>manual</code>.
* '''delay''' - Задержка срабатывания команды в минутах.
* '''static_dns_servers''' - Список DNS серверов.




Example
Example
  {
  {
     "command": "reboot",
     "dns_assign_method": "manual",
     "delay": "0",
     "static_dns_servers": ["8.8.8.8", "8.8.4.4"]
  }
  }




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


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


 
Example
x509 certificate params format
  {
  {
     subject: str
     "dns_assign_method": "dhcp"
    san: str
    issuer: str
    valid_from: float
    valid_to: float
  }
  }
* '''subject''' - Строка в формате rfc4514.
* '''san''' - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами <code>IP=</code> или <code>DNS=</code>.
* '''issuer''' - Строка в формате rfc4514.
* '''valid_from''' - Дата с которой сертификат действителен. Формат Posix timestamp.
* '''valid_to''' - Дата по которую сертификат действителен. Формат Posix timestamp.




Example
=== SUB <code>lm/system_settings/network/interfaces/modem/set_apn_credential</code> ===
{
Назначение настроек apn на интерфейс.
    "issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
    "san": "IP=192.168.0.3",
    "subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
    "valid_from": "1664440221.0",
    "valid_to": "1759048221.0"
}


Поддерживается только статическое назначение.


'''x509 csr params format'''
{
    subject: str
    san: str
}
* '''subject''' - Строка в формате rfc4514.
* '''san''' - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами <code>IP=</code> или <code>DNS=</code>.


Payload format


Example
Статическое назначение:
  { “subject”: “OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA”, “san”: “IP=192.168.0.3”, }
  {
    apn: str
    username: str
    password: str
}
* '''apn''' - APN сервер.
* '''username''' - Имя пользователя если есть либо пустая строка.
* '''password''' - Пароль если есть либо пустая строка.




== 7. Управление Di Do интерфейсами плеера ==
Example
{
    "apn": "internet.mts.ru",
    "username": "mts",
    "password": "mts"
}


=== PUB <code>lm/di/port/*</code> ===
<span id="pub-lmdiport0-player-v1-only"></span>PUB <code>lm/di/port/0</code> (player V1 only)<span id="pub-lmdiport1"></span>PUB <code>lm/di/port/1</code><span id="pub-lmdiport2-player-v2-only"></span>PUB <code>lm/di/port/2</code> (player V2 only)<span id="pub-lmdiport3-player-v2-only"></span>PUB <code>lm/di/port/3</code> (player V2 only)


Публикует состояние di порта
=== PUB <code>lm/system_settings/datetime/rtc_status</code> ===
 
Публикует статус rtc модуля
* '''di_port_number''' - Номер di порта.




Payload format
Payload format
int
    {
Example
        is_active: bool
1
    }
* '''int''' - Статус Di порта. 1 - активен, 0 - неактивен.
* '''is_active''' - Активен ли rtc модуль.
 


<span id="pub-lmdoport0-player-v1-only"></span>
Example
{
    "is_active": true,
}


=== PUB <code>lm/do/port/*</code> ===
PUB <code>lm/do/port/0</code> (player V1 only)


PUB <code>lm/do/port/1</code><span id="pub-lmdoport2-player-v2-only"></span>PUB <code>lm/do/port/2</code> (player V2 only)<span id="pub-lmdoport3-player-v2-only"></span>PUB <code>lm/do/port/3</code> (player V2 only)
=== SUB <code>lm/system_settings/datetime</code> ===
Принимает [[#base-format-for-command-payload|команды]] на изменение даты и времени конфигурации системы.


Публикует состояние do порта


* '''do_port_number''' - Номер do порта.
Список принимаемых команд




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


=== SUB <code>lm/do/change_state</code> ===
Description: &gt; Set system date.
Принимает команды для изменения состояния DO порта.


Values:


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


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


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




'''Set Time'''


== 8. Управление RS485 интерфейсами плеера ==
Description: &gt; Set system time.
<span id="pub-lmserialport_controllererror"></span>


=== PUB <code>lm/serialport_controller/error</code> ===
Values:
Публикует ошибки.


Выставляет заголовок '''Correlation data''' если он был установлен в запросе.
command: str &gt; set_time


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


Payload format<pre>
Example:<br /><code>{'command': 'set_time', 'data': {'time': '13:00:00'}}</code>
    msg: str
    data: Any 
}</pre>
* '''msg''' - contain error message
* '''data''' - contain related error data




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


Description: &gt; Set system date and time.
Values:
command: str &gt; set_datetime
data: dict &gt; datetime: str - time in format ‘Y:M:D HH:mm:ss’


Payload format
Example:<br /><code>{'command': 'set_datetime', 'data': {'datetime': '1970:01:01 13:00:00'}}</code>
[
 
    {
 
        name: str
'''Change Ntp Status'''
        mode: Literal['rs485', 'dmxOut']
    }
]
* '''name''' - Имя порта.
* '''mode''' - Предназначение порта.


Description: &gt; Enable or disable ntp synchronization.


Example
Values:
[
    {
        "name": "port1",
        "mode": "rs485",
    },
    {
        "name": "port2",
        "mode": "rs485",
    },
    {
        "name": "port3",
        "mode": "dmxOut",
    },
    {
        "name": "port4",
        "mode": "dmxOut",
    }
]


command: str &gt; change_ntp_status


=== SUB <code>lm/serialport_controller/ports/change_mode</code> ===
data: dict &gt; ntp: bool - is ntp sync enable
Меняет предназначение порта.


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


Payload format
{
    name: str
    mode: Literal['rs485', 'dmxOut']
}
* '''name''' - Имя порта.
* '''mode''' - Предназначение порта.


'''Set Ntp Servers'''


Example
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": "port1",
    "mode": "rs485",
}


Values:


command: str &gt; set_ntp_servers


data: dict &gt; ntp_servers: list[str] - list of servers ip addresses or dns names


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


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


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


Description: &gt; Set system timezone.


Payload format
Values:
{
    Port1: {
      green: bool,
      red: bool,
    },
    Port2: {
      green: bool,
      red: bool,
    },
    Port3: {
      green: bool,
      red: bool,
    },
    Port4: {
      green: bool,
      red: bool,
    },
}


command: str &gt; set_timezone


Example
data: dict &gt; timezone: str - timezone name
{
    "Port1": {
      "green": true,
      "red": true,
    },
    "Port2": {
      "green": true,
      "red": true,
    },
    "Port3": {
      "green": true,
      "red": true,
    },
    "Port4": {
      "green": true,
      "red": true,
    },
}
* '''green''' - Статус зеленого светодиода.
* '''red''' - Статус красного светодиода.


=== SUB <code>lm/leds/change_state</code> ===
Example:<br /><code>{'command': 'set_timezone', 'data': {'timezone': 'Europe/London'}}</code>
Принимает команды для изменения состояния диодов у rs485 порта.




Payload command format
Base format for command payload
  {
  {
     pub port: Literal['Port1', 'Port2', 'Port3', 'Port4'],
     'command': str
    green: bool,
     'data': dict[str, Any]
     red: bool,
  }
  }
* '''command''' - command name
* '''data''' - any data for command


Example:


Example
<code>{'command': 'set_ip', 'data': {'ifname': 'eth0', 'ip': '192.168.0.1'}}</code>
  {
    "port": "Port1",
    "green": true,
    "red": false,
  }
* '''port''' - Имя rs485 порта.
* '''green''' - Статус зеленого светодиода.
* '''red''' - Статус красного светодиода.


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




Payload format
Payload format
  {
  {
     times: int,
     command: str
     interval: int,
     delay: int
  }
  }
* '''command''' - Команда управления питанием. Может принимать значения “reboot” и “shutdown”.
* '''delay''' - Задержка срабатывания команды в минутах.
Example
Example
  {
  {
     "times": 5,
     "command": "reboot",
     "interval": 1000
     "delay": "0",
}
 
 
'''Certificate params format'''
 
Парамеры сертификата отличаются в зависимости от его типа. В данный момент поддерживается два типа сертификата x509: <code>certificate</code> и <code>csr</code>.
 
 
x509 certificate params format
{
    subject: str
    san: str
    issuer: str
    valid_from: float
    valid_to: float
}
* '''subject''' - Строка в формате rfc4514.
* '''san''' - Стока представляющее расширение SubjectAltName. Принимаются только ip адреса или dns имена идущие подряд через запятую без пробелов с префиксами <code>IP=</code> или <code>DNS=</code>.
* '''issuer''' - Строка в формате rfc4514.
* '''valid_from''' - Дата с которой сертификат действителен. Формат Posix timestamp.
* '''valid_to''' - Дата по которую сертификат действителен. Формат Posix timestamp.
 
 
Example
{
    "issuer": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
    "san": "IP=192.168.0.3",
    "subject": "OU=test ou,CN=domain.com,O=test o,L=123,ST=st,C=UA",
    "valid_from": "1664440221.0",
    "valid_to": "1759048221.0"
}
 
 
'''x509 csr params format'''
{
    subject: str
    san: str
  }
  }
* '''times''' - Количество миганий (от 1 до 255).
* '''subject''' - Строка в формате rfc4514.
* '''interval''' - Интервал между миганиями в миллисекундах.
* '''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”, }




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