Перейти к содержанию

Xiot-plc-system-log-events: различия между версиями

Материал из XIOT Wiki
Добавлен полный план доработки единой системы сообщений и аналитики PLC
Оставлены только таблицы сообщений; уточнена отправка в мессенджеры
Строка 2: Строка 2:
__TOC__
__TOC__


=Цель=
=Разделы=


Журнал должен показывать не только работу устройств и сценариев, но и изменения самой системы: какая конфигурация действует, когда подключались панели и оборудование, почему перезапускался контроллер, какие драйверы теряли связь и восстановились ли они.
{| class="wikitable"
! Таблица !! Содержание
|-
| [[Система сообщений XIOT-PLC — полная карта|Полная карта]] || Количество сообщений по всем устройствам и сценариям
|-
| [[Система сообщений XIOT-PLC — каталог шаблонов|Каталог шаблонов]] || Тексты существующих сообщений устройств и сценариев
|-
| [[План доработки системы сообщений XIOT-PLC|Таблица доработок]] || Приоритет добавления недостающих сообщений
|}


Это позволит по одной временной линии ответить на вопросы:
=Контроллер=


* после какого изменения началась проблема;
{| class="wikitable sortable" style="width:100%"
* работало ли оборудование в момент выполнения сценария;
! Событие !! Тип сообщения !! Текст сообщения !! Когда записывать !! В мессенджеры
* была ли панель на связи;
* применена ли новая конфигурация;
* происходил ли перезапуск контроллера или драйвера;
* восстановилась ли система самостоятельно;
* сколько времени продолжался разрыв связи.
 
=Основной принцип=
 
Системное событие создаётся при устойчивом переходе состояния, а не при каждом heartbeat, опросе или попытке переподключения.
 
Для каждого наблюдаемого объекта запоминаются:
 
* последнее устойчивое состояние;
* время начала текущего состояния;
* время последнего сообщения;
* причина перехода;
* число неудачных попыток;
* признак первого запуска, чтобы начальное состояние не выглядело как аварийное отключение.
 
Подключение записывается после короткой проверки устойчивости. Отключение записывается после таймаута. Восстановление содержит длительность перерыва.
 
=Предлагаемые события=
 
==Контроллер и служба XIOT==
 
{| class="wikitable sortable"
! Событие !! Уровень !! Текст !! Когда записывать !! Место добавления
|-
|-
| Контроллер запущен || Информация || <code>Контроллер XIOT запущен. Версия {версия}, конфигурация от {дата}.</code> || После загрузки конфигурации и запуска основных модулей || Конец основной последовательности запуска в <code>xiot.py</code>
| Контроллер запущен || Информация || <code>Контроллер XIOT запущен. Версия {версия}.</code> || После успешного запуска || Да
|-
|-
| Плановый перезапуск || События || <code>Контроллер XIOT перезапускается: {причина}.</code> || Перед штатным завершением процесса || Единая функция завершения вместо прямого завершения процесса
| Контроллер запущен частично || Предупреждения || <code>Контроллер XIOT запущен с ограничениями: {краткая причина}.</code> || Если часть настроенных компонентов не запущена || Да
|-
|-
| Аварийное завершение предыдущего запуска || Предупреждения || <code>Предыдущая работа контроллера завершилась аварийно.</code> || При старте, если предыдущая сессия не оставила отметку штатного завершения || Начало запуска до инициализации устройств
| Запрошен перезапуск || События || <code>Контроллер XIOT перезапускается: {причина}.</code> || Перед плановым перезапуском || Нет
|-
|-
| Контроллер остановлен || События || <code>Контроллер XIOT остановлен.</code> || При штатной остановке службы || Обработчики сигналов завершения
| Контроллер остановлен || События || <code>Контроллер XIOT остановлен: {причина}.</code> || При плановой остановке || Нет
|-
|-
| Локальный брокер восстановлен || Информация || <code>Локальная служба обмена сообщениями восстановлена после {длительность}.</code> || После успешного подключения вслед за перезапуском брокера || Контроль локального брокера и обработчики подключения
| Предыдущая работа завершилась аварийно || Предупреждения || <code>Предыдущая работа контроллера XIOT завершилась аварийно.</code> || При следующем запуске после незапланированного завершения || Да
|-
|-
| Локальный брокер недоступен || Ошибки в работе || <code>Локальная служба обмена сообщениями недоступна {длительность}. Выполняется восстановление.</code> || После нескольких неудачных проверок || Контроль соединения с локальным брокером
| Контроллер восстановлен || Информация || <code>Контроллер XIOT восстановил работу после перезапуска.</code> || После успешного запуска вслед за аварийным завершением || Да
|}
|}


Для определения аварийного завершения нужна небольшая постоянная отметка текущей сессии. При старте она создаётся, при штатной остановке закрывается. Само отсутствие отметки не должно считаться аварией при первом запуске после установки.
=Конфигурация проекта=


==Конфигурация проекта==
{| class="wikitable sortable" style="width:100%"
 
! Событие !! Тип сообщения !! Текст сообщения !! Когда записывать !! В мессенджеры
{| class="wikitable sortable"
|-
! Событие !! Уровень !! Текст !! Когда записывать !! Место добавления
| Начата загрузка конфигурации || События || <code>Начата загрузка новой конфигурации проекта.</code> || Один раз в начале загрузки || Нет
|-
| Конфигурация принята || Информация || <code>Новая конфигурация проекта загружена и принята.</code> || После успешной проверки загруженных данных || Да
|-
| Конфигурация применена || Информация || <code>Новая конфигурация проекта применена: {устройств} устройств, {сценариев} сценариев.</code> || После успешного запуска новой конфигурации || Да
|-
| Конфигурация не изменилась || События || <code>Загруженная конфигурация совпадает с действующей.</code> || При повторной загрузке действующей конфигурации || Нет
|-
| Загрузка прервана || Предупреждения || <code>Загрузка конфигурации проекта прервана: {причина}.</code> || Если начатая загрузка не завершилась || Да
|-
|-
| Начата загрузка || Отладка || <code>Начата загрузка конфигурации проекта.</code> || После принятия начала новой сессии загрузки || Приём конфигурации в <code>xiot.py</code>
| Конфигурация отклонена || Ошибки в работе || <code>Конфигурация проекта не загружена: {понятная причина}.</code> || После окончательного отказа || Нет
|-
|-
| Конфигурация принята || Информация || <code>Новая конфигурация проекта принята. После перезапуска будут загружены: {устройств} устройств, {сценариев} сценариев.</code> || После проверки целостности и атомарной записи файла || Завершение приёма конфигурации
| Конфигурация не применена || Критические ошибки || <code>Новая конфигурация проекта не применена: {понятная причина}.</code> || Если контроллер не смог запустить принятую конфигурацию || Нет
|-
|-
| Конфигурация применена || Информация || <code>Новая конфигурация проекта применена: {устройств} устройств, {сценариев} сценариев.</code> || При первом успешном запуске с новой версией конфигурации || После создания устройств и сценариев
| Добавлено устройство || Информация || <code>В конфигурацию добавлено устройство «{название}» в комнате «{комната}».</code> || После успешного добавления || Да
|-
|-
| Конфигурация не изменилась || Отладка || <code>Полученная конфигурация совпадает с действующей.</code> || Если загружен уже действующий вариант || Завершение приёма конфигурации
| Изменено устройство || События || <code>Конфигурация устройства «{название}» обновлена.</code> || После успешного изменения || Нет
|-
|-
| Загрузка отклонена || Ошибки в работе || <code>Конфигурация проекта не загружена: {понятная причина}.</code> || При неполных данных, ошибке формата, конфликте загрузок или ошибке записи || Все отрицательные результаты приёма конфигурации
| Удалено устройство || Информация || <code>Из конфигурации удалено устройство «{название}».</code> || После успешного удаления || Да
|-
|-
| Изменено отдельное устройство || События || <code>Конфигурация устройства «{название}» обновлена.</code> || После успешной горячей перезагрузки устройства || Модуль горячего обновления объектов
| Добавлен сценарий || Информация || <code>В конфигурацию добавлен сценарий «{название}».</code> || После успешного добавления || Да
|-
|-
| Добавлено устройство || Информация || <code>В конфигурацию добавлено устройство «{название}» в комнате «{комната}».</code> || После успешного создания нового объекта || Модуль горячего обновления объектов
| Изменён сценарий || События || <code>Конфигурация сценария «{название}» обновлена.</code> || После успешного изменения || Нет
|-
|-
| Удалено устройство || Информация || <code>Из конфигурации удалено устройство «{название}».</code> || После удаления и очистки подписок || Модуль горячего обновления объектов
| Удалён сценарий || Информация || <code>Из конфигурации удалён сценарий «{название}».</code> || После успешного удаления || Да
|-
|-
| Добавлен, изменён или удалён сценарий || Информация или События || <code>Сценарий «{название}» {добавлен/обновлён/удалён}.</code> || После успешного изменения || Модуль горячего обновления объектов
| Изменение объекта не выполнено || Ошибки в работе || <code>Не удалось изменить «{название}»: {понятная причина}.</code> || После окончательной ошибки добавления, изменения или удаления || Нет
|}
|}


Сообщение «конфигурация принята» нельзя считать окончательным результатом. Главным для аналитики является сообщение «конфигурация применена» после нового запуска и успешного создания объектов.
=Подключение контроллера к облаку=


Чтобы сообщение не потерялось во время перезапуска, результат загрузки нужно сохранить как ожидающее системное событие и записать в журнал после старта с новой конфигурацией.
{| class="wikitable sortable" style="width:100%"
! Событие !! Тип сообщения !! Текст сообщения !! Когда записывать !! В мессенджеры
|-
| Контроллер подключён к облаку || События || <code>Контроллер подключён к облаку XIOT.</code> || После подтверждённого подключения || Нет
|-
| Связь с облаком потеряна || Предупреждения || <code>Связь контроллера с облаком XIOT отсутствует {длительность}.</code> || После устойчивого отключения || Да
|-
| Связь с облаком восстановлена || Информация || <code>Связь контроллера с облаком XIOT восстановлена после {длительность}.</code> || После восстановления зафиксированного отключения || Да
|-
| Облачная связь выключена || События || <code>Подключение контроллера к облаку XIOT выключено.</code> || После изменения настройки || Нет
|-
| Авторизация утрачена || Предупреждения || <code>Авторизация контроллера в облаке XIOT утрачена.</code> || Если ранее действовавшая авторизация перестала работать || Да
|-
| Авторизация восстановлена || Информация || <code>Авторизация контроллера в облаке XIOT восстановлена.</code> || После восстановления авторизации || Да
|-
| Подключение отклонено || Ошибки в работе || <code>Облако XIOT отклонило подключение контроллера: {понятная причина}.</code> || После окончательного отказа подключения || Нет
|}


==Панели управления==
=Панели управления=


{| class="wikitable sortable"
{| class="wikitable sortable" style="width:100%"
! Событие !! Уровень !! Текст !! Правило подавления !! Место добавления
! Событие !! Тип сообщения !! Текст сообщения !! Когда записывать !! В мессенджеры
|-
|-
| Новая панель || Информация || <code>Подключена новая панель «{панель}», комната «{комната}», версия {версия}.</code> || Один раз при первой регистрации панели || Модуль панелей при первом heartbeat
| Обнаружена новая панель || Информация || <code>Подключена новая панель «{панель}», комната «{комната}», версия {версия}.</code> || Один раз при первой регистрации || Да
|-
|-
| Панель подключилась || События || <code>Панель «{панель}» подключена, комната «{комната}».</code> || После 10 секунд устойчивой связи; не создавать отдельно сразу после регистрации || Переход панели в состояние «на связи»
| Панель подключена || События || <code>Панель «{панель}» подключена, комната «{комната}».</code> || После устойчивого подключения известной панели || Нет
|-
|-
| Панель отключилась || Предупреждения || <code>Панель «{панель}» не выходит на связь {длительность}, комната «{комната}».</code> || После действующего таймаута heartbeat; одно сообщение на период отключения || Watchdog панелей
| Панель отключена || Предупреждения || <code>Панель «{панель}» не выходит на связь {длительность}, комната «{комната}».</code> || После истечения времени ожидания || Да
|-
|-
| Связь восстановлена || Информация || <code>Связь с панелью «{панель}» восстановлена после {длительность}.</code> || Первый heartbeat после зафиксированного отключения || Переход панели в состояние «на связи»
| Связь с панелью восстановлена || Информация || <code>Связь с панелью «{панель}» восстановлена после {длительность}.</code> || После восстановления зафиксированного отключения || Да
|-
|-
| Панель перенесена || События || <code>Панель «{панель}» перенесена из комнаты «{старая комната}» в комнату «{новая комната}».</code> || Только при реальном изменении комнаты || Изменение привязки панели
| Панель перенесена || События || <code>Панель «{панель}» перенесена из комнаты «{старая комната}» в комнату «{новая комната}».</code> || При фактическом изменении комнаты || Нет
|-
|-
| Панель удалена || Информация || <code>Панель «{панель}» удалена из контроллера.</code> || После команды удаления || Удаление панели
| Панель удалена || Информация || <code>Панель «{панель}» удалена из контроллера.</code> || После подтверждённого удаления || Да
|-
|-
| Изменилась версия приложения || Информация || <code>Приложение панели «{панель}» обновлено: {старая версия} → {новая версия}.</code> || Только при смене ранее известной версии || Обработка состояния панели
| Приложение панели обновлено || Информация || <code>Приложение панели «{панель}» обновлено: {старая версия} → {новая версия}.</code> || При изменении ранее известной версии || Да
|-
| Канал связи панели потерян || Предупреждения || <code>Панель «{панель}» потеряла {название канала} связь.</code> || После устойчивой потери канала || Да
|-
| Канал связи панели восстановлен || Информация || <code>Панель «{панель}» восстановила {название канала} связь после {длительность}.</code> || После восстановления канала || Да
|}
|}


Обычные heartbeat, время последней активности, изменение страницы, яркости, громкости и показ информационного экрана в журнал не записываются.
=Драйверы и интеграции=


==Драйверы и интеграции==
{| class="wikitable sortable" style="width:100%"
 
! Событие !! Тип сообщения !! Текст сообщения !! Когда записывать !! В мессенджеры
Единый наблюдатель должен принимать состояния всех драйверов и формировать одинаковые сообщения.
|-
 
| Драйвер запущен || События || <code>{драйвер} запущен.</code> || После успешного запуска настроенного драйвера || Нет
{| class="wikitable sortable"
|-
! Событие !! Уровень !! Текст !! Правило
| Драйвер выключен || События || <code>{драйвер} выключен в настройках.</code> || После изменения настройки || Нет
|-
| Драйвер подключён || События || <code>{драйвер} подключён.</code> || После первого устойчивого подключения || Нет
|-
|-
| Драйвер подключён || События || <code>{драйвер} подключён.</code> || После первого устойчивого подключения; при обычном старте можно включать в общую стартовую сводку
| Драйвер недоступен || Предупреждения || <code>{драйвер} не выходит на связь {длительность}: {понятная причина}.</code> || После устойчивого отключения || Да
|-
|-
| Драйвер отключён || Предупреждения || <code>{драйвер} не выходит на связь {длительность}: {причина}.</code> || После таймаута, одно сообщение на период недоступности
| Драйвер восстановлен || Информация || <code>{драйвер} восстановил связь после {длительность}.</code> || После восстановления зафиксированного отключения || Да
|-
|-
| Драйвер восстановлен || Информация || <code>{драйвер} восстановил связь после {длительность}.</code> || При первом устойчивом подключении после предупреждения
| Ошибка настройки драйвера || Ошибки в работе || <code>{драйвер} не запущен: ошибка настройки — {понятная причина}.</code> || Один раз после окончательной ошибки || Нет
|-
|-
| Ошибка настройки || Ошибки в работе || <code>{драйвер} не запущен: ошибка настройки — {причина}.</code> || Один раз после загрузки конфигурации и при изменении ошибки
| Команда драйвера не доставлена || Ошибки в работе || <code>{драйвер} не доставил команду «{действие}»: {понятная причина}.</code> || После исчерпания попыток || Нет
|-
|-
| Драйвер выключен настройкой || События || <code>{драйвер} выключен в настройках.</code> || Только после изменения настройки, не при каждом старте
| Доставка команд восстановлена || Информация || <code>{драйвер} восстановил доставку команд после {длительность}.</code> || После успешной команды вслед за зафиксированной ошибкой || Да
|}
|}


Под наблюдение следует включить:
{| class="wikitable sortable" style="width:100%"
 
! Драйвер или интеграция !! Дополнительные сообщения
* Wiren Board;
|-
* Modbus;
| Wiren Board || Подключение линии; потеря связи; восстановление; ошибка устройства; ошибка канала; устранение ошибки
* Zigbee2MQTT;
|-
* внешние MQTT-подключения;
| Modbus || Порт подключён; порт недоступен; порт занят; нет доступа; устройство недоступно; устройство восстановлено; ошибка канала
* пользовательский MQTT-брокер;
|-
* DMX;
| Zigbee2MQTT || Мост подключён; мост недоступен; добавление разрешено; устройство обнаружено; устройство подключено; устройство удалено; устройство недоступно; устройство восстановлено
* REST API и TCP-подключения;
|-
* Global Caché;
| Внешние MQTT-подключения || Подключено; авторизация отклонена; связь потеряна; связь восстановлена; команда не доставлена
* Russound;
|-
* медиаплееры;
| Пользовательский MQTT-брокер || Запущен; недоступен; клиент подключён; клиент отключён; клиент восстановил связь
* HomeKit;
|-
* Яндекс Алису;
| REST и TCP || Подключено; связь потеряна; связь восстановлена; неверная настройка; команда не выполнена
* локальную и облачную связь панелей;
|-
* системное облачное подключение XIOT.
| DMX || Выход подключён; выход недоступен; передача восстановлена
 
|-
Большинство этих модулей уже публикуют признак подключения. Их не требуется переписывать: единый наблюдатель может подписаться на существующие изменения состояния. Локальные особенности остаются внутри драйвера только для формирования понятной причины.
| HomeKit || Мост запущен; мост остановлен; запуск не выполнен; сопряжение добавлено; сопряжение сброшено; конфигурация обновлена
 
==Физические устройства==
 
Подключение драйвера и доступность конкретного устройства — разные события. Например, Modbus-порт может работать, но один счётчик не отвечать.
 
{| class="wikitable sortable"
! Событие !! Уровень !! Текст !! Источник состояния
|-
|-
| Устройство обнаружено || Информация || <code>Обнаружено новое устройство «{название или адрес}» через {драйвер}.</code> || Обнаружение Zigbee, Modbus или другого драйвера
| Яндекс Алиса || Авторизация утрачена; авторизация восстановлена; доставка задержана; доставка восстановлена; событие отклонено
|-
|-
| Устройство добавлено || Информация || <code>Устройство «{название}» добавлено через {драйвер}.</code> || Завершённое подключение или включение устройства в конфигурацию драйвера
| Russound || Подключено; связь потеряна; связь восстановлена; ошибка обмена
|-
|-
| Устройство недоступно || Предупреждения || <code>Устройство «{название}» не отвечает {длительность}, подключение {драйвер}.</code> || Устойчивая недоступность после нескольких проверок
| 1-Wire || Датчик добавлен; датчик удалён; датчик недоступен; датчик восстановлен
|-
|-
| Связь восстановлена || Информация || <code>Устройство «{название}» снова на связи после {длительность}.</code> || Первый успешный обмен после предупреждения
| Global Caché || Подключено; связь потеряна; связь восстановлена; команда не доставлена
|-
|-
| Устройство удалено || Информация || <code>Устройство «{название}» удалено из {драйвер}.</code> || Подтверждённое удаление
| Погода и интернет-медиа || Данные устарели; источник недоступен; обновление восстановлено
|-
|-
| Ошибка канала || Ошибки в работе || <code>Канал «{канал}» устройства «{название}» не работает: {причина}.</code> || Только для длительной ошибки настройки или обмена, не для одиночного сбоя чтения
| Основной и резервный интернет || Основной канал потерян; включён резервный канал; основной канал восстановлен
|}
|}


Modbus уже ведёт состояния порта, устройства и канала, поэтому сообщения следует формировать в точках устойчивой смены доступности. Для Wiren Board сначала нужно разделить связь с брокером и доступность конкретных контролов. Для Zigbee полезны события присоединения, ухода и длительной недоступности устройства.
=Физические устройства=


==Облако, авторизация и пользовательское приложение==
{| class="wikitable sortable" style="width:100%"
 
! Событие !! Тип сообщения !! Текст сообщения !! Когда записывать !! В мессенджеры
{| class="wikitable sortable"
! Событие !! Уровень !! Текст !! Место добавления
|-
|-
| Облако подключено || События || <code>Контроллер подключён к облаку XIOT.</code> || Успешное облачное подключение
| Устройство обнаружено || Информация || <code>Обнаружено новое устройство «{название или адрес}» через {драйвер}.</code> || После подтверждённого обнаружения || Да
|-
|-
| Облако недоступно || Предупреждения || <code>Связь с облаком XIOT отсутствует {длительность}.</code> || Отключение после задержки
| Устройство подключено || Информация || <code>Устройство «{название}» подключено через {драйвер}.</code> || После завершённого подключения || Да
|-
|-
| Облако восстановлено || Информация || <code>Связь с облаком XIOT восстановлена после {длительность}.</code> || Успешное подключение после предупреждения
| Устройство недоступно || Предупреждения || <code>Устройство «{название}» не отвечает {длительность}, подключение {драйвер}.</code> || После устойчивой недоступности || Да
|-
|-
| Облачная связь выключена || События || <code>Облачная связь XIOT выключена в настройках.</code> || Изменение настройки блокировки облака
| Связь с устройством восстановлена || Информация || <code>Устройство «{название}» снова на связи после {длительность}.</code> || После восстановления зафиксированного отключения || Да
|-
|-
| Авторизация сброшена || Предупреждения || <code>Авторизация контроллера сброшена.</code> || Подтверждённая команда сброса
| Устройство удалено || Информация || <code>Устройство «{название}» удалено из {драйвер}.</code> || После подтверждённого удаления || Да
|-
|-
| Архив приложения обновлён || Информация || <code>Пользовательское приложение проекта обновлено до версии {версия}.</code> || После успешной загрузки и распаковки архива
| Канал устройства не работает || Ошибки в работе || <code>Канал «{канал}» устройства «{название}» не работает: {понятная причина}.</code> || При длительной ошибке настройки или обмена || Нет
|-
|-
| Архив приложения не обновлён || Ошибки в работе || <code>Не удалось обновить пользовательское приложение: {причина}.</code> || После окончательной ошибки, а не каждой повторной попытки
| Канал устройства восстановлен || Информация || <code>Канал «{канал}» устройства «{название}» восстановлен после {длительность}.</code> || После устранения зафиксированной ошибки || Да
|}
|}


В журнал нельзя записывать токены, секреты, полные сетевые адреса облачных запросов и содержимое конфигурации.
=Команды, сценарии и инциденты=


==Обновление программного обеспечения==
{| class="wikitable sortable" style="width:100%"
 
! Событие !! Тип сообщения !! Текст сообщения !! Когда записывать !! В мессенджеры
Служба обновления работает отдельным процессом и сейчас отправляет только состояние окна обновления. Для общей истории она должна передавать небольшое постоянное событие основному процессу или записывать его в очередь ожидающих системных событий.
|-
 
| Команда отправлена || События || <code>Команда «{действие}» отправлена устройству «{название}»: {причина}.</code> || При фактической отправке команды || Нет
{| class="wikitable sortable"
|-
! Событие !! Уровень !! Текст
| Команда подтверждена || События || <code>Устройство «{название}» подтвердило команду «{действие}» через {длительность}.</code> || При получении подтверждения || Нет
|-
| Команда не подтверждена || Ошибки в работе || <code>Устройство «{название}» не подтвердило команду «{действие}» за {длительность}.</code> || После истечения времени ожидания || Нет
|-
| Аварийная команда не подтверждена || Критические ошибки || <code>Критическое устройство «{название}» не подтвердило команду «{действие}».</code> || Для команды в цепочке безопасности после истечения времени ожидания || Нет
|-
| Сценарий запущен || События || <code>Сценарий «{название}» запущен: {причина}.</code> || В начале выполнения || Нет
|-
| Сценарий завершён || Информация || <code>Сценарий «{название}» завершён.</code> || После успешного выполнения || Да
|-
| Сценарий пропущен || События || <code>Сценарий «{название}» не запущен: {причина}.</code> || При выполнении условия пропуска || Нет
|-
|-
| Обновление начато || Информация || <code>Начато обновление XIOT: {старая версия} → {новая версия}.</code>
| Сценарий остановлен || Предупреждения || <code>Сценарий «{название}» остановлен: {причина}.</code> || При досрочной остановке || Да
|-
|-
| Пакет загружен || Отладка || <code>Пакет обновления {версия} загружен и проверен.</code>
| Сценарий завершён с ошибкой || Ошибки в работе || <code>Сценарий «{название}» завершён с ошибкой: {понятная причина}.</code> || После окончательной ошибки || Нет
|-
|-
| Установка завершена || Информация || <code>Обновление XIOT установлено. Ожидается перезапуск.</code>
| Инцидент открыт || Предупреждения || <code>Открыт инцидент «{название}»: {причина}.</code> || При подтверждённой устойчивой проблеме || Да
|-
|-
| Обновление применено || Информация || <code>XIOT обновлён: {старая версия} → {новая версия}.</code>
| Инцидент усилен до тревоги || Тревоги || <code>Инцидент «{название}» перешёл в тревожное состояние: {причина}.</code> || При достижении тревожного условия || Да
|-
|-
| Обновление не выполнено || Ошибки в работе || <code>Не удалось обновить XIOT до версии {версия}: {причина}.</code>
| Инцидент закрыт || Информация || <code>Инцидент «{название}» закрыт после {длительность}.</code> || После подтверждённого восстановления || Да
|}
|}


Окончательное сообщение об успешном обновлении создаётся новым процессом после проверки фактически запущенной версии.
=Программное обеспечение и приложение проекта=


==Состояние хранилищ и времени==
{| class="wikitable sortable" style="width:100%"
 
! Событие !! Тип сообщения !! Текст сообщения !! Когда записывать !! В мессенджеры
{| class="wikitable sortable"
|-
! Событие !! Уровень !! Текст
| Обновление начато || Информация || <code>Начато обновление XIOT: {старая версия} → {новая версия}.</code> || После принятия запроса на обновление || Да
|-
| Пакет обновления проверен || Отладка || <code>Пакет обновления {версия} загружен и проверен.</code> || После успешной проверки || Нет
|-
|-
| Журнал почти заполнен || Предупреждения || <code>Хранилище журнала заполнено на {процент}. Выполняется очистка старых записей.</code>
| Обновление установлено || Информация || <code>Обновление XIOT установлено. Ожидается перезапуск.</code> || После успешной установки || Да
|-
|-
| Очистка не помогла || Ошибки в работе || <code>Не удалось освободить место в хранилище журнала.</code>
| Обновление применено || Информация || <code>XIOT обновлён: {старая версия} → {новая версия}.</code> || После запуска установленной версии || Да
|-
|-
| История недоступна || Ошибки в работе || <code>Хранилище истории недоступно: {причина}.</code>
| Обновление не выполнено || Ошибки в работе || <code>Не удалось обновить XIOT до версии {версия}: {понятная причина}.</code> || После окончательной ошибки || Нет
|-
|-
| Время существенно изменилось || Предупреждения || <code>Системное время скорректировано на {разница}.</code>
| Приложение проекта обновлено || Информация || <code>Приложение проекта обновлено до версии {версия}.</code> || После успешного применения новой версии || Да
|-
|-
| Изменился основной сетевой адрес || События || <code>Сетевое подключение контроллера изменилось: {интерфейс}.</code>
| Приложение проекта не обновлено || Ошибки в работе || <code>Не удалось обновить приложение проекта: {понятная причина}.</code> || После окончательной ошибки || Нет
|}
|}


Незначительные синхронизации времени, обычная очистка старых сообщений и повторная публикация сетевых параметров в журнал не попадают.
=Сеть, время и хранилища=


=Что не нужно записывать=
{| class="wikitable sortable" style="width:100%"
 
! Событие !! Тип сообщения !! Текст сообщения !! Когда записывать !! В мессенджеры
* каждый heartbeat панели;
|-
* каждую попытку переподключения;
| Основной интернет недоступен || Предупреждения || <code>Основное подключение к интернету недоступно {длительность}.</code> || После устойчивого отключения || Да
* каждый успешный опрос Modbus;
|-
* повтор одного состояния без изменения;
| Включён резервный интернет || Информация || <code>Контроллер перешёл на резервное подключение к интернету.</code> || После подтверждённого переключения || Да
* промежуточные проценты загрузки обновления;
|-
* полный список тегов и подписок;
| Основной интернет восстановлен || Информация || <code>Основное подключение к интернету восстановлено после {длительность}.</code> || После устойчивого восстановления || Да
* секреты, токены и содержимое конфигурации;
* кратковременный разрыв, который восстановился до таймаута;
* начальное состояние «отключено» до первой попытки соединения.
 
=Предлагаемая архитектура=
 
==Единый журнал системных переходов==
 
Добавить один компонент, который получает изменения состояния от PLC и драйверов, сравнивает их с предыдущим устойчивым состоянием и создаёт сообщения.
 
Он должен обеспечивать:
 
* единые русские формулировки;
* задержку подтверждения подключения и отключения;
* одно сообщение на один период неисправности;
* сообщение о восстановлении с длительностью;
* подавление начальных ложных отключений;
* постоянную очередь событий, которые должны пережить перезапуск;
* стабильный код события для аналитики;
* связь события с объектом, комнатой, драйвером и причиной.
 
В первую очередь наблюдатель можно подключить к уже существующим признакам подключения драйверов и панелей. Это даст широкое покрытие без изменений каждого драйвера.
 
==Структура для аналитики==
 
Для системных событий одного русского текста недостаточно. Вместе с текстом следует сохранять:
 
{| class="wikitable"
! Поле !! Пример
|-
|-
| Код события || <code>panel.connection.lost</code>
| Сетевой адрес изменён || События || <code>Сетевое подключение контроллера изменилось: {подключение}.</code> || При фактическом изменении основного подключения || Нет
|-
|-
| Объект || панель в кухне
| Часовой пояс изменён || События || <code>Часовой пояс контроллера изменён: {старый} → {новый}.</code> || После успешного изменения || Нет
|-
|-
| Категория || панель, конфигурация, драйвер, устройство, контроллер
| Системное время изменено || Предупреждения || <code>Системное время скорректировано на {разница}.</code> || При существенном скачке времени || Да
|-
|-
| Предыдущее состояние || на связи
| Журнал почти заполнен || Предупреждения || <code>Хранилище журнала заполнено на {процент}.</code> || При достижении порога заполнения || Да
|-
|-
| Новое состояние || нет связи
| Место в журнале освобождено || Информация || <code>Свободное место в хранилище журнала восстановлено.</code> || После выхода из предупреждающего состояния || Да
|-
|-
| Причина || не получен heartbeat
| Запись журнала недоступна || Ошибки в работе || <code>Запись в журнал недоступна: {понятная причина}.</code> || После нескольких последовательных ошибок || Нет
|-
|-
| Длительность || 48 секунд
| Запись журнала восстановлена || Информация || <code>Запись в журнал восстановлена после {длительность}.</code> || После первого успешного сохранения || Да
|-
|-
| Версия конфигурации || короткий идентификатор действующей конфигурации
| История измерений недоступна || Ошибки в работе || <code>История измерений недоступна: {понятная причина}.</code> || После устойчивой ошибки || Нет
|-
|-
| Сессия запуска || идентификатор текущего запуска контроллера
| История измерений восстановлена || Информация || <code>История измерений восстановлена после {длительность}.</code> || После восстановления || Да
|}
|}


Эти данные должны сохраняться в истории, а не существовать только во временном контексте обработки. Боту тогда не придётся угадывать смысл события по формулировке.
=События, которые не записываются в журнал=


=Очередность внедрения=
{| class="wikitable sortable" style="width:100%"
 
! Повторяющееся действие !! Что записывать вместо него
{| class="wikitable sortable"
|-
! Этап !! Что добавить !! Причина приоритета
| Каждый сигнал активности панели || Только подтверждённое отключение и восстановление
|-
|-
| 1 || Применение конфигурации, запуск, штатный и аварийный перезапуск || Позволяет связать проблему с изменением системы
| Каждая попытка переподключения || Один итог отключения и одно восстановление
|-
|-
| 2 || Подключение, отключение и восстановление панелей || Уже есть heartbeat и готовые переходы состояния
| Каждый успешный опрос устройства || Только изменение доступности или значимое изменение состояния
|-
|-
| 3 || Единый наблюдатель подключений драйверов и облака || Большое покрытие через существующие признаки связи
| Повтор уже известного состояния || Первое сообщение и итог восстановления
|-
|-
| 4 || Создание, обновление и удаление устройств и сценариев || Готовые точки есть в горячем обновлении объектов
| Промежуточный процент обновления || Начало, установка, применение или итоговая ошибка
|-
|-
| 5 || Доступность физических устройств Modbus, Zigbee и Wiren Board || Требуется аккуратная модель таймаутов каждого протокола
| Кратковременный разрыв до порога ожидания || Ничего
|-
|-
| 6 || Обновление ПО, пользовательского приложения, хранилища и времени || Требуется обмен событиями между отдельными процессами
| Начальное неизвестное состояние || Первое подтверждённое состояние
|-
|-
| 7 || Сохраняемые структурированные поля для аналитики || Потребуется изменение схемы хранения и API журнала
| Секретные данные и содержимое конфигурации || Только понятная безопасная причина результата
|}
|}


=Итог аудита=
[[Category:XIOT-PLC]][[Category:Сообщения]][[Category:Системные события]]
 
В PLC уже есть почти все необходимые сигналы состояния, но они распределены между логами, служебными тегами и внутренними признаками драйверов. Наиболее безопасный путь — сначала централизованно преобразовать существующие переходы в сообщения, а затем точечно добавить события, которых нет в состояниях.
 
Первые изменения следует внести в четыре места:
 
# завершение загрузки и применение конфигурации;
# жизненный цикл основного процесса XIOT;
# переходы связи панелей;
# единый наблюдатель состояний драйверов и облака.
 
Так журнал сразу начнёт объяснять большую часть системных проблем без потока повторов.
 
=План внедрения=
 
Полный приоритетный список архитектурных, системных, облачных и драйверных доработок: [[План доработки системы сообщений XIOT-PLC]].
 
[[Category:XIOT-PLC]][[Category:Сообщения]][[Category:Диагностика]][[Category:Документация интегратора]]

Версия от 18:04, 1 августа 2026

Разделы

Таблица Содержание
Полная карта Количество сообщений по всем устройствам и сценариям
Каталог шаблонов Тексты существующих сообщений устройств и сценариев
Таблица доработок Приоритет добавления недостающих сообщений

Контроллер

Событие Тип сообщения Текст сообщения Когда записывать В мессенджеры
Контроллер запущен Информация Контроллер XIOT запущен. Версия {версия}. После успешного запуска Да
Контроллер запущен частично Предупреждения Контроллер XIOT запущен с ограничениями: {краткая причина}. Если часть настроенных компонентов не запущена Да
Запрошен перезапуск События Контроллер XIOT перезапускается: {причина}. Перед плановым перезапуском Нет
Контроллер остановлен События Контроллер XIOT остановлен: {причина}. При плановой остановке Нет
Предыдущая работа завершилась аварийно Предупреждения Предыдущая работа контроллера XIOT завершилась аварийно. При следующем запуске после незапланированного завершения Да
Контроллер восстановлен Информация Контроллер XIOT восстановил работу после перезапуска. После успешного запуска вслед за аварийным завершением Да

Конфигурация проекта

Событие Тип сообщения Текст сообщения Когда записывать В мессенджеры
Начата загрузка конфигурации События Начата загрузка новой конфигурации проекта. Один раз в начале загрузки Нет
Конфигурация принята Информация Новая конфигурация проекта загружена и принята. После успешной проверки загруженных данных Да
Конфигурация применена Информация Новая конфигурация проекта применена: {устройств} устройств, {сценариев} сценариев. После успешного запуска новой конфигурации Да
Конфигурация не изменилась События Загруженная конфигурация совпадает с действующей. При повторной загрузке действующей конфигурации Нет
Загрузка прервана Предупреждения Загрузка конфигурации проекта прервана: {причина}. Если начатая загрузка не завершилась Да
Конфигурация отклонена Ошибки в работе Конфигурация проекта не загружена: {понятная причина}. После окончательного отказа Нет
Конфигурация не применена Критические ошибки Новая конфигурация проекта не применена: {понятная причина}. Если контроллер не смог запустить принятую конфигурацию Нет
Добавлено устройство Информация В конфигурацию добавлено устройство «{название}» в комнате «{комната}». После успешного добавления Да
Изменено устройство События Конфигурация устройства «{название}» обновлена. После успешного изменения Нет
Удалено устройство Информация Из конфигурации удалено устройство «{название}». После успешного удаления Да
Добавлен сценарий Информация В конфигурацию добавлен сценарий «{название}». После успешного добавления Да
Изменён сценарий События Конфигурация сценария «{название}» обновлена. После успешного изменения Нет
Удалён сценарий Информация Из конфигурации удалён сценарий «{название}». После успешного удаления Да
Изменение объекта не выполнено Ошибки в работе Не удалось изменить «{название}»: {понятная причина}. После окончательной ошибки добавления, изменения или удаления Нет

Подключение контроллера к облаку

Событие Тип сообщения Текст сообщения Когда записывать В мессенджеры
Контроллер подключён к облаку События Контроллер подключён к облаку XIOT. После подтверждённого подключения Нет
Связь с облаком потеряна Предупреждения Связь контроллера с облаком XIOT отсутствует {длительность}. После устойчивого отключения Да
Связь с облаком восстановлена Информация Связь контроллера с облаком XIOT восстановлена после {длительность}. После восстановления зафиксированного отключения Да
Облачная связь выключена События Подключение контроллера к облаку XIOT выключено. После изменения настройки Нет
Авторизация утрачена Предупреждения Авторизация контроллера в облаке XIOT утрачена. Если ранее действовавшая авторизация перестала работать Да
Авторизация восстановлена Информация Авторизация контроллера в облаке XIOT восстановлена. После восстановления авторизации Да
Подключение отклонено Ошибки в работе Облако XIOT отклонило подключение контроллера: {понятная причина}. После окончательного отказа подключения Нет

Панели управления

Событие Тип сообщения Текст сообщения Когда записывать В мессенджеры
Обнаружена новая панель Информация Подключена новая панель «{панель}», комната «{комната}», версия {версия}. Один раз при первой регистрации Да
Панель подключена События Панель «{панель}» подключена, комната «{комната}». После устойчивого подключения известной панели Нет
Панель отключена Предупреждения Панель «{панель}» не выходит на связь {длительность}, комната «{комната}». После истечения времени ожидания Да
Связь с панелью восстановлена Информация Связь с панелью «{панель}» восстановлена после {длительность}. После восстановления зафиксированного отключения Да
Панель перенесена События Панель «{панель}» перенесена из комнаты «{старая комната}» в комнату «{новая комната}». При фактическом изменении комнаты Нет
Панель удалена Информация Панель «{панель}» удалена из контроллера. После подтверждённого удаления Да
Приложение панели обновлено Информация Приложение панели «{панель}» обновлено: {старая версия} → {новая версия}. При изменении ранее известной версии Да
Канал связи панели потерян Предупреждения Панель «{панель}» потеряла {название канала} связь. После устойчивой потери канала Да
Канал связи панели восстановлен Информация Панель «{панель}» восстановила {название канала} связь после {длительность}. После восстановления канала Да

Драйверы и интеграции

Событие Тип сообщения Текст сообщения Когда записывать В мессенджеры
Драйвер запущен События {драйвер} запущен. После успешного запуска настроенного драйвера Нет
Драйвер выключен События {драйвер} выключен в настройках. После изменения настройки Нет
Драйвер подключён События {драйвер} подключён. После первого устойчивого подключения Нет
Драйвер недоступен Предупреждения {драйвер} не выходит на связь {длительность}: {понятная причина}. После устойчивого отключения Да
Драйвер восстановлен Информация {драйвер} восстановил связь после {длительность}. После восстановления зафиксированного отключения Да
Ошибка настройки драйвера Ошибки в работе {драйвер} не запущен: ошибка настройки — {понятная причина}. Один раз после окончательной ошибки Нет
Команда драйвера не доставлена Ошибки в работе {драйвер} не доставил команду «{действие}»: {понятная причина}. После исчерпания попыток Нет
Доставка команд восстановлена Информация {драйвер} восстановил доставку команд после {длительность}. После успешной команды вслед за зафиксированной ошибкой Да
Драйвер или интеграция Дополнительные сообщения
Wiren Board Подключение линии; потеря связи; восстановление; ошибка устройства; ошибка канала; устранение ошибки
Modbus Порт подключён; порт недоступен; порт занят; нет доступа; устройство недоступно; устройство восстановлено; ошибка канала
Zigbee2MQTT Мост подключён; мост недоступен; добавление разрешено; устройство обнаружено; устройство подключено; устройство удалено; устройство недоступно; устройство восстановлено
Внешние MQTT-подключения Подключено; авторизация отклонена; связь потеряна; связь восстановлена; команда не доставлена
Пользовательский MQTT-брокер Запущен; недоступен; клиент подключён; клиент отключён; клиент восстановил связь
REST и TCP Подключено; связь потеряна; связь восстановлена; неверная настройка; команда не выполнена
DMX Выход подключён; выход недоступен; передача восстановлена
HomeKit Мост запущен; мост остановлен; запуск не выполнен; сопряжение добавлено; сопряжение сброшено; конфигурация обновлена
Яндекс Алиса Авторизация утрачена; авторизация восстановлена; доставка задержана; доставка восстановлена; событие отклонено
Russound Подключено; связь потеряна; связь восстановлена; ошибка обмена
1-Wire Датчик добавлен; датчик удалён; датчик недоступен; датчик восстановлен
Global Caché Подключено; связь потеряна; связь восстановлена; команда не доставлена
Погода и интернет-медиа Данные устарели; источник недоступен; обновление восстановлено
Основной и резервный интернет Основной канал потерян; включён резервный канал; основной канал восстановлен

Физические устройства

Событие Тип сообщения Текст сообщения Когда записывать В мессенджеры
Устройство обнаружено Информация Обнаружено новое устройство «{название или адрес}» через {драйвер}. После подтверждённого обнаружения Да
Устройство подключено Информация Устройство «{название}» подключено через {драйвер}. После завершённого подключения Да
Устройство недоступно Предупреждения Устройство «{название}» не отвечает {длительность}, подключение {драйвер}. После устойчивой недоступности Да
Связь с устройством восстановлена Информация Устройство «{название}» снова на связи после {длительность}. После восстановления зафиксированного отключения Да
Устройство удалено Информация Устройство «{название}» удалено из {драйвер}. После подтверждённого удаления Да
Канал устройства не работает Ошибки в работе Канал «{канал}» устройства «{название}» не работает: {понятная причина}. При длительной ошибке настройки или обмена Нет
Канал устройства восстановлен Информация Канал «{канал}» устройства «{название}» восстановлен после {длительность}. После устранения зафиксированной ошибки Да

Команды, сценарии и инциденты

Событие Тип сообщения Текст сообщения Когда записывать В мессенджеры
Команда отправлена События Команда «{действие}» отправлена устройству «{название}»: {причина}. При фактической отправке команды Нет
Команда подтверждена События Устройство «{название}» подтвердило команду «{действие}» через {длительность}. При получении подтверждения Нет
Команда не подтверждена Ошибки в работе Устройство «{название}» не подтвердило команду «{действие}» за {длительность}. После истечения времени ожидания Нет
Аварийная команда не подтверждена Критические ошибки Критическое устройство «{название}» не подтвердило команду «{действие}». Для команды в цепочке безопасности после истечения времени ожидания Нет
Сценарий запущен События Сценарий «{название}» запущен: {причина}. В начале выполнения Нет
Сценарий завершён Информация Сценарий «{название}» завершён. После успешного выполнения Да
Сценарий пропущен События Сценарий «{название}» не запущен: {причина}. При выполнении условия пропуска Нет
Сценарий остановлен Предупреждения Сценарий «{название}» остановлен: {причина}. При досрочной остановке Да
Сценарий завершён с ошибкой Ошибки в работе Сценарий «{название}» завершён с ошибкой: {понятная причина}. После окончательной ошибки Нет
Инцидент открыт Предупреждения Открыт инцидент «{название}»: {причина}. При подтверждённой устойчивой проблеме Да
Инцидент усилен до тревоги Тревоги Инцидент «{название}» перешёл в тревожное состояние: {причина}. При достижении тревожного условия Да
Инцидент закрыт Информация Инцидент «{название}» закрыт после {длительность}. После подтверждённого восстановления Да

Программное обеспечение и приложение проекта

Событие Тип сообщения Текст сообщения Когда записывать В мессенджеры
Обновление начато Информация Начато обновление XIOT: {старая версия} → {новая версия}. После принятия запроса на обновление Да
Пакет обновления проверен Отладка Пакет обновления {версия} загружен и проверен. После успешной проверки Нет
Обновление установлено Информация Обновление XIOT установлено. Ожидается перезапуск. После успешной установки Да
Обновление применено Информация XIOT обновлён: {старая версия} → {новая версия}. После запуска установленной версии Да
Обновление не выполнено Ошибки в работе Не удалось обновить XIOT до версии {версия}: {понятная причина}. После окончательной ошибки Нет
Приложение проекта обновлено Информация Приложение проекта обновлено до версии {версия}. После успешного применения новой версии Да
Приложение проекта не обновлено Ошибки в работе Не удалось обновить приложение проекта: {понятная причина}. После окончательной ошибки Нет

Сеть, время и хранилища

Событие Тип сообщения Текст сообщения Когда записывать В мессенджеры
Основной интернет недоступен Предупреждения Основное подключение к интернету недоступно {длительность}. После устойчивого отключения Да
Включён резервный интернет Информация Контроллер перешёл на резервное подключение к интернету. После подтверждённого переключения Да
Основной интернет восстановлен Информация Основное подключение к интернету восстановлено после {длительность}. После устойчивого восстановления Да
Сетевой адрес изменён События Сетевое подключение контроллера изменилось: {подключение}. При фактическом изменении основного подключения Нет
Часовой пояс изменён События Часовой пояс контроллера изменён: {старый} → {новый}. После успешного изменения Нет
Системное время изменено Предупреждения Системное время скорректировано на {разница}. При существенном скачке времени Да
Журнал почти заполнен Предупреждения Хранилище журнала заполнено на {процент}. При достижении порога заполнения Да
Место в журнале освобождено Информация Свободное место в хранилище журнала восстановлено. После выхода из предупреждающего состояния Да
Запись журнала недоступна Ошибки в работе Запись в журнал недоступна: {понятная причина}. После нескольких последовательных ошибок Нет
Запись журнала восстановлена Информация Запись в журнал восстановлена после {длительность}. После первого успешного сохранения Да
История измерений недоступна Ошибки в работе История измерений недоступна: {понятная причина}. После устойчивой ошибки Нет
История измерений восстановлена Информация История измерений восстановлена после {длительность}. После восстановления Да

События, которые не записываются в журнал

Повторяющееся действие Что записывать вместо него
Каждый сигнал активности панели Только подтверждённое отключение и восстановление
Каждая попытка переподключения Один итог отключения и одно восстановление
Каждый успешный опрос устройства Только изменение доступности или значимое изменение состояния
Повтор уже известного состояния Первое сообщение и итог восстановления
Промежуточный процент обновления Начало, установка, применение или итоговая ошибка
Кратковременный разрыв до порога ожидания Ничего
Начальное неизвестное состояние Первое подтверждённое состояние
Секретные данные и содержимое конфигурации Только понятная безопасная причина результата