Телеметрия и хранение данных

Платформа Стрикс реализует трёхуровневую модель хранения телеметрии, обеспечивающую баланс между детализацией данных, скоростью доступа и стоимостью хранения.
Трёхуровневая модель хранения
| Уровень | Хранилище | Детализация | Retention | Назначение |
|---|---|---|---|---|
| Live | BaSyx OperationalData | ~1 Гц, последн ее значение | Текущее | Дашборды, SCADA, мониторинг |
| История | ClickHouse | raw / 1 мин / 1 час | 7 / 90 / 730 дней | Тренды, отчёты, аналитика |
| Сырой сигнал | S3/MinIO (Parquet) | 25+ кГц | По политике | Вибродиагностика, спектральный анализ |
Поток данных
Датчик/ПЛК --> MQTT-брокер --> telemetry-writer --> ClickHouse (история)
|
+--> data-bridge --> BaSyx OperationalData (live)
OPC UA / Modbus / REST --> data-bridge --> BaSyx OperationalData
| Компонент | Назначение | Интервал |
|---|---|---|
| data-bridge | Запись последнего значения в BaSyx OperationalData | По событию (~1 Гц) |
| telemetry-writer | Пакетная запись в ClickHouse с буферизацией | Flush каждые 5 сек |
| retention-cleanup | Удаление устаревших данных по StoragePolicy | 1 раз в час |
MQTT-транспорт
Структура топика
liman/{project}/{deviceId}/telemetry
Примеры:
liman/nzif/ball-mill-101/telemetryliman/irs/larus-inv459/telemetry
Формат сообщения
{
"timestamp": "2026-03-27T10:15:00.123Z",
"temperature_bearing_de": 42.3,
"vibration_rms_de": 2.1,
"motor_current": 245.5
}
Подключение
| Среда | Адрес | Протокол |
|---|---|---|
| Разработка | ws://localhost:9001 | MQTT over WebSocket |
| Продуктив | wss://{host}/ws/mqtt | MQTT over WebSocket (TLS) |
TelemetryConfig -- настройка на оборудование
Субмодель TelemetryConfig (семантический ID: https://liman-tech.ru/sm/TelemetryConfig/1/0) размещается на AAS-оболочке оборудования и определяет параметры сбора телеметрии.
| Свойство | Тип | Описание | Пример |
|---|---|---|---|
Enabled | boolean | Сбор телеметрии включён | true |
PeriodMs | int | Период опроса в миллисекундах | 5000 |
AggregationMethod | string | Метод агрегации (avg, min, max, last) | avg |
RetentionOverrideDays | int | Переопределение retention для raw-данных | 30 |
ThrottleMode | string | Режим throttling (none, deadband, rate-limit) | deadband |
Parameters | SMC[] | Список параметров с индивидуальными настройками | см. ниже |
Параметры телеметрии
Parameters/
+-- Temperature/
| +-- SourceKey: "temperature_bearing_de"
| +-- Unit: "degC"
| +-- Period: 5000
| +-- DeadbandValue: 0.5
| +-- DisplayName: [ru: "Температура ПШ", en: "DE Bearing Temp"]
+-- Vibration/
| +-- SourceKey: "vibration_rms_de"
| +-- Unit: "mm/s"
| +-- Period: 1000
| +-- DeadbandValue: 0.1
+-- Current/
+-- SourceKey: "motor_current"
+-- Unit: "A"
+-- Period: 5000
StoragePolicy -- политика хранения
Субмодель StoragePolicy (семантический ID: https://liman-tech.ru/sm/StoragePolicy/1/0) размещается на facility-оболочке и задаёт политику хранения для всего проекта.
| Свойство | Тип | Описание | По умолчанию |
|---|---|---|---|
RawRetentionDays | int | Хранение raw-данных | 7 |
AggRetentionDays | int | Хранение 1-мин агрегации | 90 |
ArchiveRetentionDays | int | Хранение 1-час агрегации | 730 |
ThrottlingEnabled | boolean | Глобальный throttling | true |
DefaultDeadband | float | Порог deadband по умолчанию | 0.5 |
Overrides | SMC[] | Переопределения по типам оборудования | -- |
Каскад конфигурации
Настройки хранения и сбора данных определяются каскадно -- от общего к частному:
StoragePolicy (предприятие) <-- политика по умолчанию
|
+-- Overrides[MatchEquipmentType] <-- переопределение по типу оборудования
| Пример: для pump -> RawRetentionDays: 14
|
+-- TelemetryConfig (оборудование) <-- переопределение на уровне единицы
|
+-- Parameters[].Period <-- переопределение на уровне параметра
Пример: Vibration.Period: 1000 мс (остальные 5000 мс)
Retention можно настраивать гранулярно: для критичного оборудования (мельницы, насосы) хранить raw-данные 30 дней, а для вспомогательного (конвейеры, задвижки) -- 3 дня. Это значительно экономит дисковое пространство.
Протоколы источников данных
Платформа принимает данные из различных источников через субмодель InterfaceMapping (IDTA 02027):
| Протокол | Описание | Типичное применение |
|---|---|---|
| MQTT | Публикация в топик, JSON payload | IoT-контроллеры (Larus), edge-устройства |
| OPC UA | Чтение NodeId с OPC-сервера | SCADA-системы, ПЛК (Siemens, ABB) |
| Modbus TCP | Чтение регистров по адресу | Частотные преобразователи, счётчики |
| REST API | HTTP GET + JSONPath | Внешние системы, API производителей |
Таблицы ClickHouse
Данные в ClickHouse хранятся в трёх таблицах с автоматической агрегацией через материализованные представления:
| Таблица | Детализация | Retention | Агрегация |
|---|---|---|---|
telemetry_raw | Каждое значение | 7 дней | -- |
telemetry_1min | 1 минута | 90 дней | avg, min, max, count |
telemetry_1hour | 1 час | 2 года | avg, min, max, count |
Агрегация выполняется материализованными представлениями ClickHouse автоматически при вставке данных в telemetry_raw. Удаление устаревших данных выполняет сервис retention-cleanup по расписанию (1 раз в час) согласно StoragePolicy.
Для высокочастотных сигналов (вибрация 25+ кГц) raw-данные записываются в S3/MinIO в формате Apache Parquet с привязкой через субмодель TimeSeries (IDTA 02008). Это позволяет хранить терабайты данных вибросигналов с минимальной стоимостью.
Визуализация телеметрии
Компонент TelemetryHistoryChart автоматически выбирает таблицу по масштабу просмотра:
| Масштаб | Источник | Точек на графике |
|---|---|---|
| Последний час | telemetry_raw | ~3600 |
| Последние сутки | telemetry_1min | ~1440 |
| Последний месяц | telemetry_1hour | ~720 |
| Последний год | telemetry_1hour | ~8760 |
Поддерживается наложение нескольких параметров, масштабирование по оси времени и экспорт данных в CSV.