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

Системные события в журнале XIOT-PLC

Материал из XIOT Wiki
Версия от 17:28, 1 августа 2026; Admin (обсуждение | вклад) (Добавлен аудит системных событий PLC для журнала и аналитики)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

Цель

Журнал должен показывать не только работу устройств и сценариев, но и изменения самой системы: какая конфигурация действует, когда подключались панели и оборудование, почему перезапускался контроллер, какие драйверы теряли связь и восстановились ли они.

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

  • после какого изменения началась проблема;
  • работало ли оборудование в момент выполнения сценария;
  • была ли панель на связи;
  • применена ли новая конфигурация;
  • происходил ли перезапуск контроллера или драйвера;
  • восстановилась ли система самостоятельно;
  • сколько времени продолжался разрыв связи.

Основной принцип

Системное событие создаётся при устойчивом переходе состояния, а не при каждом heartbeat, опросе или попытке переподключения.

Для каждого наблюдаемого объекта запоминаются:

  • последнее устойчивое состояние;
  • время начала текущего состояния;
  • время последнего сообщения;
  • причина перехода;
  • число неудачных попыток;
  • признак первого запуска, чтобы начальное состояние не выглядело как аварийное отключение.

Подключение записывается после короткой проверки устойчивости. Отключение записывается после таймаута. Восстановление содержит длительность перерыва.

Предлагаемые события

Контроллер и служба XIOT

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

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

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

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

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

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

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

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

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

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

Единый наблюдатель должен принимать состояния всех драйверов и формировать одинаковые сообщения.

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

Под наблюдение следует включить:

  • Wiren Board;
  • Modbus;
  • Zigbee2MQTT;
  • внешние MQTT-подключения;
  • пользовательский MQTT-брокер;
  • DMX;
  • REST API и TCP-подключения;
  • Global Caché;
  • Russound;
  • медиаплееры;
  • HomeKit;
  • Яндекс Алису;
  • локальную и облачную связь панелей;
  • системное облачное подключение XIOT.

Большинство этих модулей уже публикуют признак подключения. Их не требуется переписывать: единый наблюдатель может подписаться на существующие изменения состояния. Локальные особенности остаются внутри драйвера только для формирования понятной причины.

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

Подключение драйвера и доступность конкретного устройства — разные события. Например, Modbus-порт может работать, но один счётчик не отвечать.

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

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

Облако, авторизация и пользовательское приложение

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

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

Обновление программного обеспечения

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

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

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

Состояние хранилищ и времени

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

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

Что не нужно записывать

  • каждый heartbeat панели;
  • каждую попытку переподключения;
  • каждый успешный опрос Modbus;
  • повтор одного состояния без изменения;
  • промежуточные проценты загрузки обновления;
  • полный список тегов и подписок;
  • секреты, токены и содержимое конфигурации;
  • кратковременный разрыв, который восстановился до таймаута;
  • начальное состояние «отключено» до первой попытки соединения.

Предлагаемая архитектура

Единый журнал системных переходов

Добавить один компонент, который получает изменения состояния от PLC и драйверов, сравнивает их с предыдущим устойчивым состоянием и создаёт сообщения.

Он должен обеспечивать:

  • единые русские формулировки;
  • задержку подтверждения подключения и отключения;
  • одно сообщение на один период неисправности;
  • сообщение о восстановлении с длительностью;
  • подавление начальных ложных отключений;
  • постоянную очередь событий, которые должны пережить перезапуск;
  • стабильный код события для аналитики;
  • связь события с объектом, комнатой, драйвером и причиной.

В первую очередь наблюдатель можно подключить к уже существующим признакам подключения драйверов и панелей. Это даст широкое покрытие без изменений каждого драйвера.

Структура для аналитики

Для системных событий одного русского текста недостаточно. Вместе с текстом следует сохранять:

Поле Пример
Код события panel.connection.lost
Объект панель в кухне
Категория панель, конфигурация, драйвер, устройство, контроллер
Предыдущее состояние на связи
Новое состояние нет связи
Причина не получен heartbeat
Длительность 48 секунд
Версия конфигурации короткий идентификатор действующей конфигурации
Сессия запуска идентификатор текущего запуска контроллера

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

Очередность внедрения

Этап Что добавить Причина приоритета
1 Применение конфигурации, запуск, штатный и аварийный перезапуск Позволяет связать проблему с изменением системы
2 Подключение, отключение и восстановление панелей Уже есть heartbeat и готовые переходы состояния
3 Единый наблюдатель подключений драйверов и облака Большое покрытие через существующие признаки связи
4 Создание, обновление и удаление устройств и сценариев Готовые точки есть в горячем обновлении объектов
5 Доступность физических устройств Modbus, Zigbee и Wiren Board Требуется аккуратная модель таймаутов каждого протокола
6 Обновление ПО, пользовательского приложения, хранилища и времени Требуется обмен событиями между отдельными процессами
7 Сохраняемые структурированные поля для аналитики Потребуется изменение схемы хранения и API журнала

Итог аудита

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

Первые изменения следует внести в четыре места:

  1. завершение загрузки и применение конфигурации;
  2. жизненный цикл основного процесса XIOT;
  3. переходы связи панелей;
  4. единый наблюдатель состояний драйверов и облака.

Так журнал сразу начнёт объяснять большую часть системных проблем без потока повторов.