KM INVEO Sensor Temperatures - Круглосуточный мониторинг темп. и датчика затопления

Для круглосуточного контроля температур от датчиков INVEO организована система мониторинга - Inveo Logger.

  1. Разработан и создан веб-интерфейс и анимация графиков истории всех температурных датчиков и журнала событий датчика затопления в HTML формате.
  2. Реализован многопоточный опрос и двухуровневое хранение данных.
  3. Спроектирована сетевая архитектура для удаленного подключения и мониторинга.
  4. Создан удаленный бесперебойный мониторинг через Телеграм-бота.
  5. Автоматизация и ввод в эксплуатацию.
  6. Предположительные планы развития и прогнозируемый расход трафика

Когда начинал разрабатывать данный проект, то делал акцент в первую очередь на сбор данных со всех сенсоров в единую визуальную веб-страницу c функцией сигнализации заданных критических температур и круглосуточного вахтенного мониторинга, чтобы было своевременное реагирование на проблему с перегревом или затоплением. Но если рассматривать именно данный проект в масштабе флота, то этого конечно не достаточно, но основа уже есть и на этой базе можно усовершенствовать и развивать. Система протестирована и запущена в эксплуатацию на судне.

Исходный код с файлами загружен в FLEET CLOUD / Корпоративный файлообменник флота в папку “Incoming”

Теперь подробнее:

Раздел 1. Разработан веб-интерфейса и анимации (dashboard.html, sensor_detail.html, sensor_flood.html) и сетевая архитектура

  1. Главный визуальный веб-интерфейс - Основной экран (Dashboard), где показаны сразу все подключенные датчики:
  • Создана визуальная сетка карточек для ПК или мобильных устройств.

  • Разработаны векторные стрелочные приборы с динамическими цветовыми секторами (зеленый/желтый/красный).

  • Реализована мигающая светодиодная индикация (LED Status) и кнопка «СБРОС ТРЕВОГИ» с визуальной пульсацией.

  1. Аудио-сигнализация (Web Audio API):
  • Интегрирован звук сигнализации из 8ми встроенных в ОС звуков, без использования сторонних аудиофайлов.

  1. Детальные карточки температур (sensor_detail) и датчика затопления (sensor_flood):
  • Разработан карточный модуль контроля температур (sensor_detail.html) и интегрированы в них:

    • векторные стрелочные приборы с цветовыми секторами;
    • мигающая индикацией состояния температуры (зеленый/желтый/красный);
    • график с поддержкой прокрутки истории за последние 7 дней и кнопками видимой части графика за 12часов/1день/3дня/7дней.
  • Разработан карточный модуль контроля датчика затопления (sensor_flood.html) и интегрировано в него:

    • визуальная капля события и название состояния DRY/WATER, которые меняются при размыкании/замыкании датчика;
    • мигающая индикацией состояния датчика затопления (зеленый/красный);
    • журнал событий за последние 7дней с кнопками DRY/WATER/ALL, которые показывает отдельные события.
  • Внедрен модуль редактирования заметок/комментариев с выбором цвета текста. (**Редактирование данных комментариев возможно только с локального ПК)

  1. Анализ и настройка сетевого подключения к контроллерам Inveo.
  • В веб-интерфейс интегрировано 4 физических контроллера Inveo (Nano Temp / HERO Web), настроена адресация в локальной подсети VLAN10 (192.168.10.10, 192.168.10.20, 192.168.10.30, 192.168.10.40)
  • Проанализированы/проверены протоколы опроса и запущены парсеры (перехваты) для одновременной работы с одноканальными текстовыми ответами (/temp1.txt) и многоканальными JSON-структурами (/sensorState.json).

Раздел 2. Реализация многопоточных опросов и двухуровневое хранение данных.

  1. Разработка и реализация модуля сбора данных

Для создания модуля сбора данных и телеметрии был выбран язык программирования Python, на котором написан управляющий скрипт-модуль в отдельном файле inveo_logger.py.

Главной задачей inveo_logger.py является фоновый непрерывный сбор свежих показателей с датчиков и их занесение в базу данных (лог-файлы) для обеспечения бесперебойного мониторинга. В основу модуля заложен принцип параллельной обработки (асинхронность / многопоточность) и жесткого контроля времени отклика.

Выбор параллельного опроса вместо последовательной «очереди» обусловлен надежностью - при обрыве кабеля, отключении питания или поломке одного из модулей Inveo задержка на одном узле никак не влияет на работу остальных датчиков. Для системы выбран оптимальный интервал опроса в 3 сек.и жесткий таймаут ожидания — 1.2 сек.. Если модуль не успевает ответить за это время, то система не блокируется, а сбрасывает этот конкретный запрос и фиксирует временное отсутствие связи. Благодаря этому модуль inveo_logger.py стабильно функционирует в режиме 24/7, и сбой одного узла не приводит к зависанию или «падению» всей системы.

Примечание: В качестве протокола сбора данных был осознанно выбран HTTP (JSON / TXT) вместо промышленной шины Modbus TCP или MQTT.

Основные причины этого решения:

  • Прямой HTTP-опрос оборудования не требует разворачивания и администрирования промежуточной инфраструктуры (например, MQTT-брокера).
  • Получение данных по фиксированным REST/HTTP-адресам позволяет легко изолировать сбои каждого конкретного контроллера.
  • Не все модули имеют доступ к MQTT в настройках

Сбор телеметрии осуществляется путем обращения скрипта напрямую к встроенному веб-серверу контроллеров по адресам:

  • http://[IP_адрес_контроллера]/temp1.txt — для быстрого получения текущих показаний температуры в текстовом формате;

  • http://[IP_адрес_контроллера]/sensorState.json — для получения полного структурированного состояния всех подключенных датчиков и входов в формате JSON.

В итоге скрипт inveo_logger.py является «сердцем» сбора данных. Фоновый Python-скрипт выполняет следующую работу:

  • Каждые 3 секунды запрашивает по протоколу HTTP (JSON/TXT) все 4 физических контроллера Inveo;
  • Отвечает за запись свежих замеров в отдельные CSV-файлы (лог-файлы) по каждому датчику;
  • Генерирует оперативный 10-минутный файл fast_last_10m.csv для быстрого доступа актуальных графиков и интерфейса;
  • Автоматически очищает устаревшие архивные записи старше 7 дней для предотвращения переполнения накопителя.
  1. Двухуровневое изолированное хранение замеров:
  • Архивный слой: Ведение индивидуальных .csv файлов с глубиной хранения 7 дней и механизмом автоматической фоновой чистки при превышении объема.
    • server.csv, gap_1.csv, gap_2.csv, gap_3.csv … т.д. — 7-мидневные полные архивы температурных замеров
    • gap_flood.csv — 7-мидневны полный архив дискретных состояний датчика затопления в GAP (0 = DRY, 1 = WATER).
  • Оперативный слой (fast_last_10m.csv): Формирование легкого 10-минутного среза всех каналов для обеспечения мгновенной отрисовки/загрузки основного экрана (Dashboard) и кратковременного открытия отдельных карточек, при подключении с мобильных устройств, без необходимости чтения огромных отдельных файлов архива.

Иными простыми словами, при локальном или удаленном подключении к основной визуальной веб-странице (dashboard) и открытии отдельного какого-либо датчика происходит мгновенная загрузка данных за счет файла “fast_last_10m.csv”, которая показывает историю графика темп и журнала событий в этих отдельных карточках (тут данные показаны за последние 10мин) и тем временем сразу начинается в фоновом режиме загружать индивидуальный CSV файл. И если отдельная карточка открыта более 15сек, то за эти 15сек подгружается в историю графика темп и журнал событий уже индивидуального файла CSV (данные на индикаторах и визуальных циферблатах при этом остаются работать / выгружать данные с файла “fast_last_10m.csv”). То есть индивидуальные .csv файлы нужны только для 7ми дневных истории графиков темп и журнала событий датчика затопления, которые появятся через 15 сек открытой карточки. В итоге это не грузить систему опросами объемными файлами, тем самым открывает мгновенно визуальную веб-страницу с показаниями, как для локального подключения к веб-странице, так по удаленному подключению.

Раздел 3. Спроектирована сетевая архитектура для удаленного подключения и удаленного мониторинга

На втором разделе можно было и закончить, но только для локального мониторинга на судне, но решил пойти дальше и заглянуть в перспективу возможного развития этого проекта. Тема была интересная и решил проверить себя “на вшивость” - получится или нет :slight_smile: Там самым создать удаленное подключение к главной визуальной веб-странице и детальным карточкам, с возможностью посмотреть историю и журнал событий.

Для удаленного подключения внедрен безопасный внешний доступ туннелирования через cloudflared.exe.
Как работает cloudflared:

  1. Служба cloudflared.exe запускается на локальном ПК на судне, где находятся все рабочие файлы … .html, … .py, … .js и т.д. и сама выходит в интернет, открывая исходящее устойчивое соединение (зашифрованный туннель по протоколу QUIC/HTTP2) к ближайшему дата-центру Cloudflare.
  2. Безопасный доступ: Когда на удаленном девайсе вводится адрес/ссылка в браузере, запрос идет на Cloudflare, оттуда пробрасывается через запущенный в фоновом режиме активный туннель прямо на локальный ПК и локальный веб-интерфейс (например, http://localhost:8080)
  3. Трафик затрагивается минимально. Этот туннель выглядит как обычный исходящий HTTPS-трафик (порт 443 или 7844), такой же, как при просмотре обычного сайта в браузере. Никаких изменений в фаерволе делать не требуется.

Раздел 4. Telegram-бот и логика тревог (bot.py)

После создания туннеля и удаленного доступа к веб-интерфейсу Dashboard, через ссылку туннеля cloudflared, решил пойти дальше и создать еще чат-бот в ТГ. Для этого понадобилось создание дополнительного файла Bot.py в Python, где в управляющем скрипте были произведены следующие настроики:

  1. Создан алгоритм контроля порогов:
  • Сигнал тревоги отправляется мгновенно в чат-бот при пересечении критического порога: темп. датчиков (temp >= Critical) или датчика затопления (Status = WATER).
  • Настроено уведомлений / сообщение о восстановлении температуры или статуса DRY датчика затопления
  1. Административный функционал и Telegram Mini App
  • Внедрены команды опроса /start, /test и команды разграничения прав доступа: /users, /broadcast, /ban, /unban.
    Для прав доступа User:
    — /start - приветствие и доступность команд, в имеющихся правах доступа;
    — /test - создает опрос всех датчиков и выводит списком температуры и статус датчика затопления;
    Для прав доступа Admin:
    — /users - Статистика пользователей бота, где показано количество, подключенных пользователей к данному боту, их статус (admin/user) и их ID;
    — /broadcast - уведомление в чат-боте от админа;
    — /ban - бан ненужного юзера :slight_smile: ;
    — /unban - разбан случайно забаненного юзера :slight_smile:
  • Настроена автоматическая рассылка сводного отчета по расписанию (UTC).
  • Реализована рассылка обновленной ссылки cloudflared на главную страницу веб-интерфейса при перезапуске локального ПК.
  • Реализована полноценная поддержка Telegram Mini App с открытием главного веб-интерфейса прямо внутри мессенджера.

Раздел 5. Автоматизация и ввод в эксплуатацию

  1. Для оперативного запуска работы всех скриптов и веб-интерфейса на судовом локальном ПК, была создана система пакетных файлов (start_all.bat, Autostart_Temp_Inveo.bat).
  2. Настроена автоматическая дубликация актуальной (обновленной) ссылки Cloudflare на Рабочий стол и сетевое хранилище NAS (Z:\RADIO WORK\Equipment\Inveo).
  3. Локальный ПК Inveo-Logger установлен в серверной, подключен в RARITAN и выведен динамик на мостике
  4. Судовым локальным ПК для Inveo_Logger был установлен бывший ПК с мостика^
    IP: 192.168.20.92
    MAC: b4:2e:99:c6:7d:92

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

  1. Развитие.

Данный проект можно развивать дальше и больше. База готова и я уже интересовался, что на нее основе можно рассмотреть в масштабах флота обновленную версию этого проекта INVEO LOGGER v2. А именно, создание веб-страницы, где можно будет блоками добавлять группы сенсоров и настраивать через протоколы, IP, критические пороги и т.д. необходимые датчиков в этих группах. При этом исходный код (все файлы) “запечатать” в exe-файл, где оператору - ПКРЭ не нужно лезть в код скриптов Python или html-файлов, а просто распаковывает приложение и добавляет/удаляет группы в чистом интерфейснов окне.
В данный момент я предполагаю, что для обновленной такой версии 2 всё готово на 80% - основа уже есть.

  1. Расход трафика данного проекта INVEO LOGGER.

Долгое время смотрел, наблюдал, анализировал, интересовался у нейросетей (использовал несколько) и вот такая прогнозируемая таблица была составлена:

  • Режим фоновой работы системы мониторинга:
Режим работы Интенсивность / Частота Расход в месяц
Фоновый (Keep-Alive туннеля) Постоянно (24/7) ~50 – 80 МБ
Регулярные уведомления (Telegram) 5 раз в сутки < 1 МБ
Периодический контроль (1–2 раза в день) ~30 сессий по 5 мин ~50 – 90 МБ
ИТОГО (стандартная эксплуатация): Фоновый режим + отчеты + мониторинг ~100 – 170 МБ / мес.
  • Режим максимальной нагрузки:

При условии непрерывного использования системы - круглосуточно открытый графический/визуальный интерфейс с берега с обновлением данных каждые 2 секунды, ежедневная интенсивная диагностика, передача расширенных логов и частые уведомления:

Максимально возможный расход трафика не превысит 1,5 – 2,0 ГБ в месяц.



P.S. Понятное дело, что коды/скрипты писались с помощью нейросетей, но условия, алгоритмы и логику работы задавал я лично. Для меня было очень интересна эта тема, поэтому углублялся всё больше и больше. Было очень много нюансов, много тестов работы или не работы системы. Продумано много мелочей принципа работы. Поэтому принимаются комментарии для обсуждения - может что-то было упущено или не корректно сделано.

4 Likes

Проект внесен в репозиторий на Gitea

Эта ссылка работает только в пределах сети Tailscale
можно открыть на хосте с установленной системой на КМ

http://bear-core-lp:3000/bear/INVEO_LOGGER

данные для входа
kmuser/Inveo$2026
Репозиторий будет дополняться, по мере развития проекта.

1 Like

Изучен локальный веб-портал Gitea, создан и дополнен репозиторий. Устранены критические замечания безопасности - уровень задачи:
Р0 (SEC-001 - SEC-006) - критический.

Задачи были следующие:

Поэтапно устранить замечания рабочего проекта, согласно уровням критичности:

P0 — критично: существует прямой риск утечки или захвата системы. Делать первым.
P1 — высокий: система может потерять данные или незаметно остановиться.
P2 — средний: сильно влияет на сопровождение, производительность и качество.
P3 — развитие: полезные улучшения после стабилизации.

В данный момент устранен уровень P0 — критично:

  • SEC-001. Изолировать web-root,
  • SEC-002. Перевыпустить Telegram token,
  • SEC-003. Вынести секреты и installation-specific значения из кода,
  • SEC-004. Реализовать серверную авторизацию,
  • SEC-005. Убрать персональные данные из web-root и Git,
  • SEC-006. Ограничить сетевую экспозицию.

Организация процесса разработки, контроля и тестирования версии проекта Inveo_Logger v.1.1

Как проводились работы и проверка

  1. Рабочее место:
  • Все работы по исправлению ошибок безопасности выполнялись на рабочем компьютере (IP: 192.168.20.35).
  • Рабочая копия проекта была отдельно настроена, чтобы любые наши действия и настройки не мешали текущей работе системы до завершения всей проверки.
  1. Установка Git и фиксация изменений:
  • Перед тем как менять файлы, на рабочем компьютере установил программу контроля Git.
  • Была сохранена исходная копия проекта. После этого каждое успешное исправление (перенос папок, удаление паролей из кода, настройка защиты) сразу сохранялось по шагам. Это позволило вести четкий журнал всех изменений и ничего не потерять, а при необходимости можно сделать откат.
  1. Проверка и тестирование:
  • Проверка защиты файлов: После переноса файлов в папку web/ вручную производились попытки открыть через браузер служебные файлы (например, users.json, .env, bot.py). Сервер отказал в доступе и выдал стандартную ошибку «Страница не найдена» (404), как и требовалось.
  • Проверка прав доступа: Проверили отправку команд и сохранение комментариев без прав администратора — система успешно блокирует чужие запросы.
  • Проверка нового ключа Telegram: После отзыва старого пароля в BotFather убедился, что старый ключ больше не работает, а бот успешно запускается и принимает команды с использованием нового ключа.
  • Финальный запуск: Провел контрольный запуск всех файлов запуска (.bat), чтобы убедиться, что все настройки считываются правильно и программа работает без сбоев.
  1. Миграция и автоконтроль на локальном ПК 192.168.20.92):
  • При развёртывании обновлённой версии Inveo Logger v1.1 на рабочем ПК круглосуточного мониторинга (IP: 192.168.20.92) выявлено отсутствие некоторых внешних библиотек Python. Для исключения сбоев при запуске сформирован единый файл зависимостей requirements.txt, который проверяет наличие необходимых бибилиотек (python-dotenv, pyTelegramBotAPI, requests), а доработанный командный файл автозапуска (start_all.bat) дополнен блоком автоматической проверки. Теперь перед стартом система самостоятельно проверяет наличие необходимых библиотек, при необходимости доустанавливает их в фоновом режиме и только после этого запускает все модули в штатном режиме. Контрольный запуск на целевом ПК подтвердил полную работоспособность. В рамках решения этой задачи был досрочно закрыт пункт DEP-001 (P2)

Подробное описание внесенных изменений в сети Tailscale на хосте с установленной системой на КМ:

http://bear-core-lp:3000/bear/INVEO_LOGGER/src/branch/main/docs/P0_FIXES_REPORT.md

В данный момент проект запушен и работает стабильно на локальном хосте уже с устранёнными критическими замечания уровня Р0.

В данный момент схема работы проекта Inveo_Logger v1.1 такая:

Статус следующих замечаний (P1 - P3) в процессе выполнения.

1 Like

Проведена дополнительная read-only проверка фактической версии INVEO Logger v1.1 на хосте КМ.

Подтверждено, что P0-изменения действительно установлены и работают на production:

  • web-root изолирован;

  • служебные файлы .env, users.json и исходники не выдаются веб-сервером;

  • сервер слушает только 127.0.0.1:8080;

  • настройки Telegram вынесены в переменные окружения;

  • добавлены requirements.txt, check_p0.py и проверка зависимостей;

  • dashboard доступен, основные компоненты запущены.

При этом обнаружилось расхождение между production и Gitea: изменения были закоммичены в локальную ветку на рабочей машине, но цепочка коммитов не была отправлена в корпоративный репозиторий. Поэтому отчёт P0_FIXES_REPORT.md описывал изменения, которых не было в доступной ветке main.

Для дальнейшего сравнения создана отдельная безопасная snapshot-ветка:

production-km-v1.1-sanitized

http://bear-core-lp:3000/bear/INVEO_LOGGER/src/branch/production-km-v1.1-sanitized

Это обезличенный снимок текущей production-версии без старой Git-истории. Из него исключены .env, users.json, журналы, CSV, runtime-файлы, данные туннеля и исполняемый файл cloudflared. Встроенные Telegram chat ID удалены, .env.example содержит только placeholders.

Просьба учитывать следующие правила дальнейшей работы:

  1. Gitea должна стать единственным источником актуального исходного кода.

  2. Новые изменения выполнять в отдельных ветках и объединять с main через Pull Request.

  3. Не вносить изменения только на production без соответствующего коммита и push.

  4. Не объединять snapshot с main автоматически — сначала провести осмысленное сравнение файлов.

  5. Старую локальную Git-историю не публиковать до проверки и очистки от прежних токенов и персональных данных.

  6. Не помещать в Git .env, пароли, токены, Telegram chat ID, users.json, логи, CSV и runtime-данные.

  7. В .env.example использовать только очевидные placeholder-значения, а не строки, похожие на реальные токены.

  8. Не хранить персональные chat ID как значения по умолчанию в Python или HTML.

  9. Желательно зафиксировать версии зависимостей. Автоматическая установка последних версий библиотек при каждом production-запуске создаёт риск непредсказуемого обновления.

  10. Усилить check_p0.py: существующая проверка SEC-004 определяет наличие 127.0.0.1 и try:, но не проверяет реальную авторизацию endpoint. Нужны функциональные тесты разрешённых и запрещённых запросов.

  11. Для P1 предусмотреть контролируемый автозапуск, watchdog, журналирование, проверку устаревших данных и уведомление при остановке любого компонента.

  12. Обновлять документацию и схему после каждого изменения production-архитектуры.

Предлагаемый порядок дальнейшей работы:

  • сравнить main и production-km-v1.1-sanitized;

  • определить, какие production-изменения должны стать основной версией;

  • подготовить новую рабочую ветку на основе согласованного результата;

  • провести code review и тестирование;

  • после этого объединить её с main;

  • дальнейшие P1–P3 выполнять уже через общий репозиторий.

Выполненные P0-исправления подтверждены фактической проверкой. Основная текущая задача — привести production, Git и документацию к одной контролируемой версии.

1 Like

Проведено полное слияние очищенного production-снапшота из ветки production-km-v1.1-sanitized в основную ветку main. Все файлы документации (docs/, access/, README.md, P0_FIXES_REPORT.md) и история разработок полностью сохранены.

Во время слияния конфликты служебных файлов (.env.example, .gitignore, requirements.txt) разрешены в пользу обезличенной (sanitized) production-версии без старой Git-истории..

Слияние выполнено на уровне локального Git-клиента (PowerShell) с фиксацией коммита слияния (Merge commit a6f0ad7) для обхода ограничений веб-интерфейса Gitea на количество одновременно загружаемых файлов (одновременно возможно загрузить 5 файлов).
Было:

Стало:

Соответственно, пологаю, что выполнен критерий безопасности уровня Р0 в полном объеме:

  • Web-root строго изолирован; служебные файлы (.env, users.json), исходные скрипты и журналы не выдаются веб-сервером.
  • Веб-сервер ограничен локальным интерфейсом (127.0.0.1:8080).
  • Настройки Telegram вынесены в переменные окружения, встроенные Chat ID и токены удалены из исходников.
  • В репозиторий main не попадают чувствительные данные, CSV-логи, runtime-файлы и секреты.

Регламент дальнейших работ (P1–P3)

Дальнейшая разработка будт вестись исключительно через Gitea. Изменения на production-хосте без коммита и отправки (push) запрещены. Все новые функции и исправления будут оформляться в отдельных ветках (feature branch) и объединяться с main через Pull Request

01.09.2026

Произведен тест датчика затопления в шахте ГАП - закорочены контакты датчика.

Тест прошел успешно:

  • На мостике звуковая сигнализация сработала, визуальная картинка и индикация тоже отработало в штатном режиме;
  • Сообщение в чат-бот пришло;
  • Журнал истории запись о сработке поступает.

Датчик работает в штатном режиме как нужно, совместно с приложением INVEO_LOGGER и чат-ботов в ТГ.

2 Likes