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

План доработки системы сообщений XIOT-PLC

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

Цель

Создать единую базу событий XIOT-PLC, по которой пользователь, интегратор и аналитический бот смогут восстановить полную картину работы объекта:

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

Что уже работает

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

Критические пробелы

Проблема Последствие
В облако передаются не все уровни сообщений Бот не получает обычные события, ошибки в работе и критические ошибки
При ошибке облачной отправки пакет удаляется События безвозвратно теряются при отсутствии интернета или недоступности сервера
Очередь облачной отправки хранится только в памяти Перезапуск контроллера удаляет ещё не отправленные события
В журнале остаётся в основном русский текст Бот вынужден угадывать объект, причину, старое и новое состояние по формулировке
Причинный контекст не сохраняется в базе После закрытия онлайн-диагностики теряется цепочка «источник → команда → устройство → подтверждение»
Не сохраняется версия конфигурации и сессия запуска Нельзя уверенно связать проблему с конкретной загрузкой или перезапуском
Имя, тип и комната объекта не фиксируются вместе с событием После переименования или удаления устройства старая история становится неоднозначной
Переходы драйверов остаются в служебном логе и тегах Пользовательский журнал и бот не видят состояние инфраструктуры
Нет единого правила задержки и восстановления Прямое добавление сообщений во все драйверы создаст поток ложных отключений и переподключений
Завершение процесса не гарантирует запись очереди Сообщения перед перезапуском или остановкой могут потеряться
Горячее создание объекта определяется неверно Новый объект может ошибочно отмечаться как обновлённый, а событие создания не появляется
Настройка видимости уровней сохраняется неполно После перезапуска фильтры журнала могут не соответствовать выбору пользователя

Целевая модель события

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

Данные Назначение
Уникальный идентификатор события Защита от дублей при повторной облачной доставке
Машинный код события Стабильное понимание смысла независимо от русского текста
Уровень сообщения Отображение и уведомления
Вид события Команда, состояние, подключение, конфигурация, инцидент, сводка
Состояние Открыто, активно, восстановлено, завершено, отклонено
Время возникновения и время получения Правильный порядок при задержанной доставке
Контроллер и сессия запуска Связь событий с конкретным запуском PLC
Версия PLC и версия конфигурации Поиск проблем после обновления
Тип, постоянный адрес и сохранённое имя объекта Надёжная история после переименования или удаления
Этаж и комната Привязка события к месту
Предыдущее и новое состояние Анализ перехода без разбора текста
Инициатор и причина Кто вызвал изменение и почему
Действие и результат Что система пыталась выполнить и чем это закончилось
Связь с исходным событием Построение цепочки команды или сценария
Номер инцидента Объединение отключения, повторов и восстановления
Длительность и число повторов Оценка устойчивости системы
Статус облачной доставки Контроль полноты данных бота

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

Единый каталог событий

Для каждого машинного кода необходимо один раз определить:

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

Первый набор категорий:

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

Архитектурные доработки

Основа — обязательный этап

№ Доработка Результат Приоритет
1 Утвердить единый каталог машинных кодов событий Один смысл не создаётся под разными текстами в разных модулях Критический
2 Разделить уровень, вид и состояние события Тревожность не смешивается с назначением сообщения Критический
3 Добавить новую таблицу аналитических событий с безопасной миграцией Старый журнал продолжает работать, новые события получают полную структуру Критический
4 Оставить один компонент, управляющий схемой базы Исключаются конфликтующие создания и миграции таблиц Критический
5 Сохранять нормализованную цепочку причины и действия Бот видит инициатора, причину, маршрут и результат после факта Критический
6 Сохранять снимок названия, типа и комнаты объекта История не ломается после изменения конфигурации Высокий
7 Добавить идентификатор запуска и версию конфигурации Все события можно привязать к перезапуску и загрузке Критический
8 Ввести последовательный номер события внутри запуска События с одинаковым временем имеют однозначный порядок Высокий
9 Сохранить старый формат ответа для совместимости Действующие панели и редактор продолжают работать во время перехода Критический
10 Исправить сохранение пользовательских фильтров уровней Настройки журнала переживают перезапуск Средний

Надёжность локальной записи и облака

№ Доработка Результат Приоритет
11 Заменить память очереди записи на постоянную очередь События не теряются при перезапуске или временной ошибке базы Критический
12 Создать постоянную очередь облачной доставки Неотправленные события переживают отсутствие сети и рестарт Критический
13 Передавать в облако все сохраняемые уровни Бот получает события, ошибки в работе и критические ошибки Критический
14 Не удалять пакет при ошибке отправки Повторная доставка выполняется после восстановления связи Критический
15 Подтверждать облачную доставку по уникальному идентификатору Повтор не создаёт дубль на сервере Критический
16 Добавить нарастающие интервалы повторной отправки Недоступное облако не создаёт постоянную нагрузку Высокий
17 Ограничить очередь по классу и возрасту, а не простым обрезанием Критические и ещё не доставленные события не вытесняются обычными Высокий
18 Добавить состояние самой доставки Видны размер очереди, возраст старейшего события и задержка облака Высокий
19 Гарантированно завершать запись перед штатной остановкой Последнее событие и причина перезапуска не теряются Критический
20 Передавать события между отдельными процессами через постоянную очередь Обновлятор и вспомогательные службы попадают в общий журнал Высокий

Единый наблюдатель состояния

№ Доработка Результат Приоритет
21 Добавить единый наблюдатель системных переходов Драйверы используют одинаковые формулировки и правила Критический
22 Не создавать отключение до получения первого достоверного состояния Стартовые значения не выглядят как аварии Критический
23 Добавить задержку подтверждения отключения Короткий сетевой дребезг не засоряет журнал Критический
24 Подавлять повтор одного состояния На один период недоступности создаётся одно основное сообщение Критический
25 Создавать парное сообщение о восстановлении Каждый зафиксированный разрыв получает завершение и длительность Критический
26 Различать штатную остановку и неисправность Перезапуск драйвера при применении конфигурации не считается аварией Высокий
27 Агрегировать повторные ошибки Вместо сотен строк хранится число повторов и последняя причина Высокий
28 Не наблюдать собственные теги журнала Исключается цикл создания сообщений Критический
29 Сохранять открытые инциденты между перезапусками Восстановление после рестарта закрывает исходную неисправность Высокий

Системные источники сообщений

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

№ Доработка Сообщения
30 Жизненный цикл контроллера Запущен; планово останавливается; предыдущая работа завершилась аварийно; восстановлен после перезапуска
31 Причина перезапуска Применение конфигурации; обновление; команда интегратора; восстановление службы; неизвестная причина
32 Загрузка конфигурации Загрузка начата; конфигурация принята; конфигурация не изменилась; загрузка отклонена
33 Фактическое применение конфигурации Конфигурация применена; количество устройств и сценариев; версия конфигурации
34 Сравнение конфигураций Какие устройства и сценарии добавлены, изменены и удалены
35 Горячее обновление объектов Устройство или сценарий создан, обновлён, удалён; ошибка обновления
36 Исправить определение нового объекта Событие создания действительно отличается от события обновления

Сообщение «конфигурация применена» создаётся после успешного запуска с новым вариантом, а не только после записи файла. Ожидающий результат должен переживать перезапуск.

Облако контроллера и внутренняя шина

№ Доработка Сообщения и правила
37 Подключение контроллера к облаку Подключён; связь потеряна; восстановлена с длительностью
38 Авторизация облака Нет авторизации; срок истёк; авторизация отклонена; авторизация восстановлена
39 Подписка облачного соединения Подписка не подтверждена после исчерпания повторов; восстановлена
40 Сертификат облака Не удалось получить или проверить сертификат; проверка сертификата выключена
41 Состояние облачной доставки журнала Доставка задерживается; очередь переполнена; доставка восстановлена
42 Внутренняя шина сообщений PLC Недоступна; перезапускается; восстановлена с длительностью

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

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

№ Доработка Сообщения и правила
43 Первая регистрация панели Подключена новая панель, комната и версия приложения
44 Потеря heartbeat Панель не выходит на связь после действующего таймаута
45 Возврат панели Связь восстановлена с длительностью простоя
46 Привязка комнаты Панель назначена или перенесена в другую комнату
47 Удаление панели Панель удалена из контроллера
48 Обновление приложения панели Старая и новая версия
49 Каналы связи панели Локальная или облачная связь панели потеряна и восстановлена

Heartbeat, последняя активность, открытая страница, яркость и громкость в журнал не записываются.

Драйверы первой очереди

№ Драйвер Что добавить
50 Wiren Board Подключение линии; потеря; восстановление; ошибка устройства или канала; устранение ошибки
51 Modbus Состояние порта; порт занят; нет прав; устройство недоступно; устройство восстановлено; ошибка настройки канала
52 Zigbee2MQTT Мост подключён; мост недоступен; открыт режим добавления; устройство обнаружено; подключено; ошибка опроса; удалено; недоступно; восстановлено
53 Внешние MQTT-подключения Брокер подключён; авторизация или TLS отклонены; связь потеряна; восстановлена; команды не доставлены
54 Пользовательский MQTT-брокер Служба запущена; недоступна; клиент впервые подключён; клиент превысил таймаут; вернулся
55 REST и TCP Связь потеряна после нескольких опросов; восстановлена; неверный адрес или шаблон; повторные ошибки команд агрегированы
56 DMX Выходной порт недоступен; передача кадров восстановлена; нельзя заявлять доступность конечного светильника

Интеграции второй очереди

№ Интеграция Что добавить
57 HomeKit Мост запущен; неожиданно остановлен; запуск не выполнен; сопряжение добавлено или сброшено; конфигурация обновлена
58 Яндекс Алиса Нет авторизации; доставка событий задерживается; очередь восстановлена; событие отклонено; хранилище очереди повреждено
59 Russound Подключение, разрыв, восстановление и ошибки обмена
60 Удалённое управление Настоящий таймаут ответа вместо переключения состояния на каждом опросе
61 1-Wire Датчик добавлен; удалён; недоступен по окну ошибок; восстановлен
62 Elsner Нет корректных данных; связь восстановлена после нескольких правильных кадров
63 Global Caché Команда не доставлена; доставка восстановлена; отдельная проверка доступности при необходимости
64 Погода и интернет-медиа Данные устарели; источник недоступен после нескольких попыток; обновление восстановлено
65 Маршрутизация интернета Основной канал потерян; включён резервный; основной восстановлен; убраны дубли технических строк

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

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

№ Доработка Правило
66 Разделить доступность драйвера и устройства Работающий порт не означает, что каждое устройство отвечает
67 Добавить обнаружение и подключение нового оборудования Записывать только подтверждённое обнаружение или завершённое добавление
68 Добавить длительную недоступность устройства Использовать правила конкретного протокола, а не один общий таймаут
69 Добавить восстановление устройства Указывать длительность и число неудачных проверок
70 Агрегировать ошибки каналов Не создавать отдельный поток для каждого регистра или контрола
71 Сохранять последний успешный обмен Бот понимает свежесть данных устройства

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

№ Доработка Результат
72 Присваивать одной команде единый идентификатор Отправка, повтор, подтверждение и таймаут образуют одну цепочку
73 Связывать запуск сценария с исходным событием Видно, какой датчик или пользователь запустил сценарий
74 Добавить итог сценария Завершён, пропущен, остановлен или завершён с ошибкой
75 Не писать каждое промежуточное действие в историю Подробные шаги остаются в отладке
76 Открывать инцидент при устойчивой проблеме Все повторы и восстановление объединяются одной карточкой
77 Закрывать инцидент только парным восстановлением Отсутствие новых ошибок не считается восстановлением
78 Объединять зависимые отказы Потеря внутренней шины объясняет одновременное отключение нескольких драйверов
79 Формировать суточную сводку здоровья объекта Доступность облака, драйверов, панелей, устройств и число инцидентов

Хранение и обслуживание

№ Доработка Результат
80 Разные сроки хранения по классу события Частая диагностика не вытесняет конфигурацию и аварии
81 Не удалять открытые, критические и неотправленные события Сохраняется расследуемая информация
82 Хранить долгие суточные итоги после удаления подробностей Аналитика доступности сохраняется при ограниченном месте
83 Выполнять очистку небольшими фоновыми пакетами Запись новых событий не блокируется
84 Выполнять полное уплотнение базы по расписанию Обслуживание не запускается после каждого удаления
85 Сообщать о заполнении и ошибках записи журнала Система наблюдает за собственной аналитикой
86 Связать журнал с историей измерений по времени и объекту Бот может запросить телеметрию вокруг инцидента без объединения двух баз

Рекомендуемые сроки:

  • подробная отладка — 7–30 дней, если будет включено её сохранение;
  • частые события — 90–180 дней;
  • команды, системные переходы и обычные инциденты — 12–24 месяца;
  • конфигурация, обновления, безопасность и аварии — 3–5 лет в облаке;
  • суточные итоги доступности — дольше подробных событий.

Доступ для аналитического бота

№ Доработка Возможности
87 Единый защищённый API событий Период, уровень, категория, код, объект, драйвер, инцидент, конфигурация
88 Надёжная постраничная навигация Однозначный курсор по времени и идентификатору события
89 API открытых и закрытых инцидентов Причина, длительность, связанные объекты, восстановление
90 API сводок Доступность, число отказов, среднее время восстановления, частота неподтверждённых команд
91 API здоровья журнала Размер базы, длина очереди, старейшее неотправленное событие, задержка облака
92 Поток новых событий Один формат для истории и событий реального времени
93 Версия формата ответа Бот и интерфейсы безопасно переживают развитие схемы

Интерфейс журнала

№ Доработка
94 Добавить категории «Система», «Подключения», «Устройства», «Сценарии», «Безопасность», «Обновления»
95 Показывать все уровни сообщений с русскими названиями редактора
96 Добавить отдельный фильтр сводок, событий, предупреждений и инцидентов
97 Показывать длительность отключения и признак восстановления
98 Открывать цепочку исходного события, команд и подтверждений
99 Показывать действующую версию конфигурации и запуск контроллера
100 Отображать задержку облачной доставки без смешивания её с событиями объекта

Обновления, сеть и состояние самого PLC

№ Доработка Результат
101 Передавать результат обновления XIOT через постоянную очередь Отдельный процесс обновления попадает в единый журнал
102 Проверять новую версию после перезапуска Успех обновления подтверждает уже запущенный контроллер, а не установщик
103 Создавать один итог на каждую операцию обновления Проценты загрузки остаются в окне обновления, журнал получает запрос, установку, успех или ошибку
104 Обновлять пользовательское приложение через промежуточный каталог Действующее приложение не удаляется до успешной загрузки и проверки нового архива
105 Ограничить повторы загрузки приложения После исчерпания попыток создаётся одна итоговая ошибка и открытый инцидент
106 Разделить сетевой интерфейс, основной маршрут, доступ в интернет и облако Одна неисправность не маскируется другим общим признаком «нет связи»
107 Убрать двойные сообщения при переключении основного и резервного интернета Один переход создаёт одно событие
108 Записывать успешную смену часового пояса и отказ операции Известно, почему изменилось отображаемое время
109 Обнаруживать существенный скачок системных часов Аналитика учитывает нарушение временного порядка
110 Контролировать свободное место, запись журнала, историю и постоянные настройки Проблема хранения видна до потери данных
111 Сообщать об ошибке базы через резервную постоянную очередь Неисправный журнал способен сообщить о собственной неисправности после восстановления
112 Формировать итог готовности запуска Указывается число запущенных и не запущенных драйверов, устройств и сценариев
113 Различать готовый и частично готовый запуск Общая строка «контроллер запущен» не скрывает ошибки отдельных компонентов
114 Записывать таймаут незавершённой загрузки конфигурации Бот видит брошенную загрузку, если были приняты части данных
115 Не считать отсутствие авторизации ошибкой непривязанного контроллера Ошибка появляется только при потере ранее действовавшей авторизации или при отклонении входа

Правила защиты от потока сообщений

  • Начальное неизвестное состояние не считается отключением.
  • Отключение подтверждается таймаутом или несколькими одинаковыми ошибками.
  • Повтор одного состояния увеличивает счётчик, но не создаёт новую строку.
  • Восстановление создаётся только после ранее записанной неисправности.
  • В сообщении о восстановлении указывается длительность.
  • Штатное выключение при обновлении конфигурации не считается аварией.
  • Ошибки нескольких каналов одного устройства агрегируются.
  • Каждая попытка сетевого повтора остаётся в отладке, а не в истории.
  • Heartbeat и успешные опросы не сохраняются как отдельные события.
  • Для батарейных Zigbee-устройств используются признаки доступности протокола, а не короткий общий таймаут.
  • DMX сообщает о доступности выходного порта, но не утверждает доступность светильника без обратной связи.

Тесты

Группа Обязательные проверки
Миграция Старая база обновляется без потери истории; повторная миграция безопасна
Порядок событий Несколько событий в одну миллисекунду читаются без пропусков и дублей
Перезапуск Ожидающая конфигурация, причина рестарта, открытые инциденты и облачная очередь сохраняются
Аварийное завершение Новый запуск определяет незакрытую предыдущую сессию
Облако недоступно События остаются локально и отправляются после восстановления
Повторная доставка Сервер не создаёт дубль одного события
Поток ошибок Тысячи одинаковых переходов превращаются в один инцидент со счётчиком
Дребезг связи Короткий разрыв до таймаута не попадает в историю
Восстановление У каждого записанного разрыва есть парное закрытие и длительность
Конфигурация Различаются принятая и фактически применённая конфигурация
Драйверы Для каждого драйвера проверяются подключение, отключение, восстановление и штатная остановка
Хранение Низкоприоритетные записи удаляются раньше критических, открытых и неотправленных
Безопасность Токены, пароли и полный конфиг не попадают в базу и облако
Совместимость Старый редактор и панели продолжают читать журнал

Этапы внедрения

Этап Состав Критерий готовности
1. Надёжная основа Новая запись события, миграция, постоянная локальная и облачная очереди, все уровни, защита от дублей Событие не теряется при отключении сети и перезапуске
2. Контроллер и конфигурация Запуск, остановка, аварийное завершение, загрузка и применение конфигурации, версия запуска Бот точно знает, какая конфигурация и версия работали в любой момент
3. Облако и панели Облачное подключение контроллера, доставка журнала, полный жизненный цикл панелей Все разрывы имеют восстановление и длительность
4. Основные драйверы Wiren Board, Modbus, Zigbee2MQTT, MQTT, REST/TCP, DMX Единая сводка доступности основных интеграций
5. Устройства и инциденты Доступность физических устройств, корреляция команд и сценариев, открытие и закрытие инцидентов Можно восстановить причинную цепочку отказа
6. Остальные интеграции HomeKit, Алиса, Russound, 1-Wire, Elsner, маршрутизация и другие активные модули Все используемые драйверы покрыты едиными правилами
7. API и аналитика API событий, инцидентов, сводок, здоровья; связь с телеметрией Бот получает полную структурированную картину без разбора служебного лога
8. Интерфейс и эксплуатация Новые фильтры, цепочки, длительности, настройки хранения и контроль очередей Журнал одинаково понятен пользователю и интегратору

Первый рабочий релиз

Первый релиз не должен пытаться сразу покрыть все драйверы. В него входят:

  1. новая совместимая запись аналитического события;
  2. постоянная очередь облачной доставки без удаления при ошибке;
  3. передача всех сохраняемых уровней;
  4. идентификатор запуска и версия конфигурации;
  5. запуск, остановка и аварийное завершение контроллера;
  6. принятие и фактическое применение конфигурации;
  7. подключение, потеря и восстановление облака контроллера;
  8. жизненный цикл панелей;
  9. единый наблюдатель переходов;
  10. защищённый API чтения для бота;
  11. тесты сети, рестарта, миграции и защиты секретов.

После этого новые драйверы можно подключать к единой базе небольшими адаптерами, не меняя правила хранения и аналитики.

Связанные страницы