# Пример конфигурации потока

В этом примере показано, как настроить поток, который собирает данные с IoT-устройств, выполняет вычисления для получения бизнес-значимых метрик и пересылает обогащённые данные во внешнюю систему. В примере используется линейный шаблон потока, который можно адаптировать под различные отраслевые сценарии.

## Бизнес-сценарий

В этом сценарии организация установила IoT-трекеры на своих активах и должна обрабатывать данные с этих устройств для бизнес-аналитики. Организация получает следующие параметры непосредственно от своих трекеров:

* `speed`: Скорость транспортного средства в километрах в час
* `temperature`: Температура окружающей среды в градусах Цельсия
* `odometer`: Пройденное расстояние в километрах
* `ignition`: Статус зажигания двигателя (1 = включено, 0 = выключено)
* `fuel_level`: Текущее измерение уровня топлива
* `pressure_psi`: Показание давления в PSI
* `voltage`: Напряжение батареи в вольтах
* `throttle`: Положение педали акселератора с CAN-шины (0-255)
* `fuel_level_1`: Измерение уровня топлива в первом баке
* `fuel_level_2`: Измерение уровня топлива во втором баке

Организации необходимо:

1. Собирать необработанные телеметрические данные с устройств для ведения полного журнала работы активов
2. Преобразовывать единицы измерения, чтобы соответствовать их стандартному формату отчётности (имперские единицы) для согласованности с существующими бизнес-системами
3. Вычислять метрики, основанные на времени, которые указывают шаблоны использования для оптимизации использования активов и графиков обслуживания
4. Создавать производные метрики для получения эксплуатационных инсайтов, которые не предоставляются напрямую оборудованием
5. Пересылать обогащённые данные во внешнюю аналитическую систему для интеграции с платформами бизнес-аналитики
6. Отправлять неизменённые необработанные данные в Navixy для мониторинга

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

## Шаги настройки потока

Выполните следующие шаги, чтобы построить комплексный поток трансформации и пересылки данных:

{% stepper %}
{% step %}

### **Создать новый поток**

1. Нажмите **New flow** кнопку в верхней части интерфейса IoT Logic
2. Введите *Asset Telemetry Processing* в качестве имени потока
3. Добавьте описание: "*Собирает данные устройств, вычисляет производные метрики и пересылает их на аналитическую платформу.*"
4. Убедитесь, что переключатель **Flow enabled** включен
5. Нажмите **Сохранить** чтобы создать поток

<figure><img src="https://2707447327-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-d2a74f7968dab62f5634e7a048a9fda7bd93b8bb%2Fimage-20250407-200203.png?alt=media" alt="Create flow dialog with filled-in name and description, Flow enabled toggle on"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### **Настройка источника данных**

1. Перетащите **Источник данных** узел из левого меню на рабочее поле
2. Дважды щёлкните по узлу, чтобы открыть панель его конфигурации
3. В разделе **Имя узла** тип *Asset Trackers*
4. Выберите устройства, которые будут включены в этот поток, из отфильтрованного списка

* Для этого примера выберите как минимум два устройства с похожими возможностями

5. Нажмите **Применить** чтобы сохранить конфигурацию узла

<figure><img src="https://2707447327-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-5d3308c8c7e9a9bd01f1a090ba8c14cd33b6e2b1%2Fimage-20250407-200511.png?alt=media" alt="Data source node configuration with selected devices" width="375"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### **Настройте базовые преобразования данных**

1. Перетащите ещё один **Initiate Attribute** узел из левого меню на рабочее поле
2. Подключите **Источник данных** узел к этому **Initiate Attribute** узлу
3. Дважды щёлкните по узлу, чтобы открыть его конфигурацию
4. В разделе **Имя узла** тип *Преобразования единиц*
5. Создайте следующие атрибуты для преобразования единиц (все примеры используют короткий синтаксис, ссылаясь на последние значения атрибутов без проверки валидности):
   1. Добавьте новый атрибут для преобразования скорости (км/ч в миль/ч): 1. Имя атрибута: *speed\_mph* 2. Значение: `speed/1.609`
   2. Добавьте новый атрибут для преобразования температуры (Цельсий в Фаренгейт): 1. Имя атрибута: *temperature\_F* 2. Значение: `temperature*1.8 + 32`
   3. Добавьте новый атрибут для преобразования расстояния (километры в мили): 1. Имя атрибута: *distance\_miles* 2. Значение: `odometer/1.609`
   4. Добавьте новый атрибут для преобразования давления (PSI в бар): 1. Имя атрибута: *pressure\_bar* 2. Значение: `pressure_psi * 0.06895`
6. Нажмите **Применить** чтобы сохранить конфигурацию узла

<figure><img src="https://2707447327-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-e88dbb7ac084cc181b9a1344644c350ac263a398%2Fimage-20250407-201226.png?alt=media" alt="First Initiate attribute node showing the unit conversion attributes"><figcaption></figcaption></figure>

{% hint style="info" %}
Для объяснений вычислений, введённых на этом шаге, см. [Basic unit conversions](#basic-unit-conversions)
{% endhint %}
{% endstep %}

{% step %}

### **Создание продвинутых вычисляемых метрик**

1. Перетащите ещё один **Initiate Attribute** узел из левого меню на рабочее поле
2. Подключите первый **Initiate Attribute** узел к этому новому
3. Дважды щёлкните по узлу, чтобы открыть его конфигурацию
4. В разделе **Имя узла** тип *Advanced calculations*
5. Создайте следующие атрибуты для продвинутых метрик:
   1. Добавьте атрибут для обнаружения изменения температуры:
      1. Имя атрибута: *temperature\_change*
      2. Значение: `value('temperature', 0, 'valid') - value('temperature', 1, 'valid')`&#x20;
      3. `genTime('temperature', 0, 'valid')`
   2. Добавьте атрибут для определения времени, прошедшего между двумя последними считываниями:&#x20;
      1. &#x20;Имя атрибута: *time\_between\_readings\_ms*&#x20;
      2. Значение: `srvTime('speed', 0, 'valid') - srvTime('speed', 1, 'valid')`&#x20;
      3. Время генерации: `genTime('speed', 0, 'valid')`
   3. Добавьте атрибут для округления температуры до ближайшего целого:
      1. Имя атрибута: *temperature\_rounded*&#x20;
      2. Значение: `math:round(value('temperature', 0, 'valid'))`
   4. Добавьте атрибут для расчёта стандартизированного значения (нормализация уровня топлива в 0-100%):&#x20;
      1. Имя атрибута: *fuel\_level\_percent*&#x20;
      2. Значение: `(value('fuel_level', 0, 'valid') - 0) / (100 - 0) * 100`
   5. Добавьте атрибут для расчёта процента заряда батареи:&#x20;
      1. Имя атрибута: *battery\_percentage*&#x20;
      2. Значение: `(value('voltage', 0, 'valid') - 11) / (14 - 11) * 100`
   6. Добавьте атрибут для расчёта положения дроссельной заслонки:&#x20;
      1. Имя атрибута: *throttle\_percentage*&#x20;
      2. Значение: `value('throttle', 0, 'valid') / 255 * 100`
   7. Добавьте атрибут для среднего уровня топлива с нескольких датчиков:&#x20;
      1. Имя атрибута: *avg\_fuel\_level*&#x20;
      2. Значение: `(value('fuel_level_1', 0, 'valid') + value('fuel_level_2', 0, 'valid')) / 2`
6. Нажмите **Применить** чтобы сохранить конфигурацию узла

<figure><img src="https://2707447327-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-bec2e2d25385ec3b81e31fd2f78da9fab2e3f1b8%2Fimage-20250407-202303.png?alt=media" alt="Second Initiate attribute node showing the advanced calculated metrics"><figcaption></figcaption></figure>

{% hint style="info" %}
Для объяснений вычислений, введённых на этом шаге, см. [Вычисления продвинутых метрик](#advanced-metrics-calculations).
{% endhint %}
{% endstep %}

{% step %}

### **Настройте конечную точку вывода**

1. Перетащите ещё один **Выходной конечной точке** узел из левого меню на рабочее поле
2. Подключите второй **Initiate Attribute** узел к этому **Выходной конечной точке** узлу
3. Щёлкните по узлу, чтобы открыть его конфигурацию
4. Настройте следующие параметры:
   1. **Тип конечной точки**: *MQTT endpoint*
   2. **Имя конечной точки**: *Analytics Platform*
   3. **Протокол**: по умолчанию *Navixy Generic Protocol (JSON)*
   4. **IP/Домен**: Введите адрес целевой системы (например, "*analytics.example.com*")
   5. **Порт**: *8883* (по умолчанию для MQTT, можно оставить пустым)
   6. **Включить SSL**: *включите переключатель*
   7. **Версия MQTT**: *5.0*
   8. **MQTT Client ID**: *asset-telemetry-client*
   9. **Топик**: *telemetry/assets/raw*
   10. **QoS**: *1*
   11. **Аутентификация MQTT**: *Да* (если требуется целевой системой)
   12. **Логин и пароль MQTT**: Введите учётные данные, если применимо
5. Нажмите **Создавать** чтобы сохранить конфигурацию узла

<figure><img src="https://2707447327-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-5bba126378b9c39ca8546d7caf4630e800855eb1%2Fimage-20250407-202704.png?alt=media" alt="Output endpoint node configuration with filled-in connection settings" width="375"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### **Добавить Default Output endpoint**

1. Перетащите ещё один **Выходной конечной точке** узел из левого меню на рабочее поле
2. В разделе **Тип конечной точки** выберите **Default Endpoint**
3. Нажмите **Сохранить** чтобы применить конфигурацию узла
4. Подключите *Asset Trackers* (**Источник данных**) узел к нему

Это гарантирует, что необработанные данные отправляются в Navixy непосредственно с устройств без каких-либо преобразований и обогащений.
{% endstep %}

{% step %}

### **Сохраните и протестируйте поток**

Ваша конечная конфигурация будет выглядеть так:

<figure><img src="https://2707447327-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-1602478802bdfdba0a251ec29eaf677ef6562456%2Fimage-20250407-203757.png?alt=media" alt="Complete flow configuration with all nodes connected in IoT Logic workspace"><figcaption></figcaption></figure>

Нажмите **Сохранить поток** кнопка на **Панели узлов** чтобы сохранить конфигурацию потока.
{% endstep %}
{% endstepper %}

{% hint style="success" %}
Используйте [Data Stream Analyzer (DSA)](https://www.navixy.com/docs/user/ru/guide/account/iot-logic/data-stream-analyzer) чтобы контролировать входящие данные и проверить:

* Устройства отправляют данные в поток
* Вычисления работают как ожидалось
* Данные пересылаются в целевую систему Например, давайте проверим, что преобразования скорости рассчитываются правильно для грузовика. Для этого в DSA выберите **Volvo** устройство и атрибуты **speed** и **speed\_mph**:\ <img src="https://2707447327-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-dd91833c4e91cbf04798d44c3604cd4ef38c0937%2Fimage-20250407-204530.png?alt=media" alt="Speed attributes for one device in Data Stream Analyzer" data-size="original">

Всё в порядке! Данные получены и успешно преобразованы.
{% endhint %}

## Объяснение преобразований данных

Рассмотрим ключевые вычисления, используемые в этом потоке.

### Basic unit conversions

Первый **Initiate attribute node** выполняет простые преобразования единиц:

* **Скорость**: Преобразует км/ч в миль/ч делением на 1.609
* **Температура**: Преобразует Цельсий в Фаренгейт по формуле °F = °C × 1.8 + 32
* **Расстояние**: Преобразует километры в мили делением на 1.609
* **Давление**: Преобразует PSI в бар умножением на 0.06895, делая его совместимым с международными стандартами измерения давления

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

### Вычисления продвинутых метрик

Второй **Initiate attribute node** выполняет более сложные вычисления:

* **Обнаружение изменения температуры**: Вычисляет разницу между текущим и предыдущим значениями температуры для выявления резких изменений. Это помогает обнаруживать неисправности оборудования, такие как сбои в системе охлаждения транспортных средств или проблемы с HVAC в зданиях. Например, резкий рост температуры на 5°C в рефрижераторном контейнере может указывать на отказ системы охлаждения, требующий немедленного вмешательства.
  * **Время генерации**: Использование `genTime('temperature', 0, 'valid')` здесь критично, потому что сохраняет точную метку времени, когда показание температуры было сгенерировано устройством, обеспечивая точный временной анализ изменений температуры.
  * **Время сервера**: Значение по умолчанию `now()` автоматически фиксирует момент, когда сервер получил данные. Поскольку нам не требуется изменять эту метку времени, мы можем оставить это поле пустым при конфигурации.
* **Время между считываниями**: Измеряет интервал между последовательными передачами данных, сравнивая серверные метки времени. Это вычисление помогает выявлять проблемы с коммуникацией или подтверждать, что устройства отчитываются с ожидаемой частотой. Нерегулярные интервалы могут указывать на проблемы с подключением, тогда как стабильные задержки могут свидетельствовать о перегрузке сети или проблемах конфигурации устройства.
* **Округление значений**: Применяет математическое округление к показаниям температуры, сокращая десятичную точность до целых чисел. Это упрощает визуализацию данных и составление отчётов, одновременно снижая требования к хранению исторических данных. Округлённые значения особенно полезны для отображения на панелях и пороговых оповещений, где десятичная точность не требуется.
  * **Время генерации**: Указание `genTime('speed', 0, 'valid')` привязывает эти метаданные непосредственно к метке времени исходного показания, что делает возможным анализ как временного интервала, так и момента его возникновения.
  * **Время сервера**: Значение по умолчанию `now()` автоматически фиксирует момент, когда сервер получил данные. Поскольку нам не требуется изменять эту метку времени, мы можем оставить это поле пустым при конфигурации.
* **Расчёт стандартизированного значения**: Нормализует необработанные показания датчиков до процентной шкалы (0-100%). Эта стандартизация облегчает сравнение показаний между различными типами датчиков и моделями транспортных средств. Для управления парком это позволяет единообразно отчётывать уровень топлива независимо от конкретной реализации датчика в каждой модели, обеспечивая единые оповещения о низком уровне топлива и анализ расхода.
* **Расчёт процента заряда батареи**: Нормализует показания напряжения батареи (диапазон 11В–14В) до шкалы 0–100% для упрощения мониторинга. Например, показание 12.5В будет нормализовано до 50%, предоставляя интуитивно понятный индикатор состояния батареи для разных типов транспортных средств.
* **Расчёт положения дроссельной заслонки**: Преобразует необработанные данные положения дроссельной заслонки (диапазон 0–255) с CAN-шины транспортного средства в процентную шкалу. Эта стандартизация помогает операторам быстро оценивать поведение водителя и производительность транспортного средства без необходимости интерпретировать необработанные значения датчика.
* **Средний уровень топлива с нескольких датчиков**: Объединяет показания двух отдельных датчиков топлива для получения более точной общей оценки уровня топлива. Это особенно ценно для транспортных средств со сложной формой баков или с несколькими баками, где один датчик может давать ненадёжные показания из‑за перелива топлива при движении.

## Краткое описание примера потока

Эта конфигурация потока демонстрирует несколько ключевых возможностей IoT Logic:

1. **Стандартизация**: Преобразует специфичные для устройств показания в стандартизированные бизнес-метрики
2. **Обогащение**: Создаёт новые, значимые метрики, которые недоступны напрямую от датчиков устройства
3. **Трансформация**: Меняет единицы измерения в соответствии с требованиями бизнес-отчётности
4. **Исторический контекст**: Использует предыдущие показания для расчёта метрик на основе трендов
5. **Определение статуса**: Создаёт категориальные значения на основе нескольких входных данных датчиков

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