> For the complete documentation index, see [llms.txt](https://navixy.com/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://navixy.com/docs/user/ru/guide/account/iot-logic/flow-management/flow-configuration-example.md).

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

Пошаговый пример, показывающий, как построить поток IoT Logic, который собирает телеметрию устройства, рассчитывает производные метрики и передает обогащенные данные во внешние системы.

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

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

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

* `скорость`: Скорость автомобиля в километрах в час
* `temperature`: Температура окружающей среды в градусах Цельсия
* `одометр`: Пройденное расстояние в километрах
* `зажигание`: Состояние зажигания двигателя (1 = включено, 0 = выключено)
* `уровень топлива`: Текущее значение уровня топлива
* `давление, PSI`: Показание давления в PSI
* `напряжение`: Напряжение аккумулятора в вольтах
* `педаль акселератора`: Положение педали акселератора по CAN-шине (0–255)
* `уровень топлива 1`: Первое измерение уровня топлива в баке
* `уровень топлива 2`: Второе измерение уровня топлива в баке

Организация должна:

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

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

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

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

{% stepper %}
{% step %}

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

Откройте IoT Logic. На стартовой странице нажмите **кнопки «Создать поток»**. Введите *Обработка телеметрии активов* в качестве названия потока, добавьте описание (*"Собирает данные устройств, рассчитывает производные метрики и передает их на платформу аналитики."*), и убедитесь, что **Поток включен** переключатель активирован. Нажмите **Подтвердить** чтобы открыть холст.
{% endstep %}

{% step %}

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

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

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

5. Нажмите **Применить** для сохранения конфигурации узла
   {% endstep %}

{% step %}

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

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

{% hint style="info" %}
Подробные пояснения к расчетам, введенным на этом шаге, см. [Базовые преобразования единиц](#basic-unit-conversions)
{% endhint %}
{% endstep %}

{% step %}

### Создайте расширенные рассчитываемые метрики

1. Перетащите другой **Вычисление атрибута** узел из левого меню в рабочую область
2. Соедините первый **Вычисление атрибута** узел с этим новым
3. Дважды щелкните узел, чтобы открыть его настройки
4. В **Имя узла** тип *Расширенные вычисления*
5. Создайте следующие атрибуты для расширенных метрик:
   1. Добавьте атрибут для определения изменения температуры:
      1. Имя атрибута: *temperature\_change*
      2. Значение: `value('temperature', 0, 'valid') - value('temperature', 1, 'valid')`
      3. `genTime('temperature', 0, 'valid')`
   2. Добавьте атрибут для определения времени, прошедшего между двумя последними показаниями:
      1. Имя атрибута: *time\_between\_readings\_ms*
      2. Значение: `srvTime('speed', 0, 'valid') - srvTime('speed', 1, 'valid')`
      3. Время генерации: `genTime('speed', 0, 'valid')`
   3. Добавьте атрибут для округления температуры до ближайшего целого:
      1. Имя атрибута: *округленная температура*
      2. Значение: `math:round(value('temperature', 0, 'valid'))`
   4. Добавьте атрибут для расчета стандартизированного значения (нормализация уровня топлива до 0–100%):
      1. Имя атрибута: *Уровень топлива\_процент*
      2. Значение: `(value('fuel_level', 0, 'valid') - 0) / (100 - 0) * 100`
   5. Добавьте атрибут для расчета процента заряда аккумулятора:
      1. Имя атрибута: *процент заряда батареи*
      2. Значение: `(value('voltage', 0, 'valid') - 11) / (14 - 11) * 100`
   6. Добавьте атрибут для расчета положения дроссельной заслонки:
      1. Имя атрибута: *процент\_положения\_дроссельной\_заслонки*
      2. Значение: `value('throttle', 0, 'valid') / 255 * 100`
   7. Добавьте атрибут для среднего уровня топлива с нескольких датчиков:
      1. Имя атрибута: *средний уровень топлива*
      2. Значение: `(value('fuel_level_1', 0, 'valid') + value('fuel_level_2', 0, 'valid')) / 2`
6. Нажмите **Применить** для сохранения конфигурации узла

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

{% step %}

### Настройте Узел передачи данных

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

{% step %}

### Добавить Узел передачи данных по умолчанию

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

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

{% step %}

### Сохраните и проверьте поток

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

<figure><img src="https://2388694493-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F446mKak1zDrGv70ahuYZ%2Fuploads%2Fgit-blob-76943e439a5bab01e5e25fe9f9199d46c99ade30%2Fiot-logic-flow-configuration-example.png?alt=media" alt="Complete flow configuration with all nodes connected in IoT Logic workspace"><figcaption></figcaption></figure>

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

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

* Устройства отправляют данные в поток
* Расчёты работают так, как ожидается
* Данные передаются в место назначения. Например, давайте проверим, что преобразование скорости на грузовике выполняется правильно. Чтобы сделать это в DSA, выберите **Volvo** устройство и атрибуты **скорость** и **speed\_mph**:\ <img src="https://2388694493-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 %}

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

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

### Базовые преобразования единиц

Первый **узел вычисления атрибута** выполняет простые преобразования единиц измерения:

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

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

### Расширенные расчеты метрик

Второй **узел вычисления атрибута** выполняет более сложные вычисления:

* **Обнаружение изменения температуры**: Рассчитывает разницу между текущими и предыдущими показаниями температуры, чтобы выявить резкие изменения. Это помогает обнаруживать проблемы с оборудованием, например сбои в холодильных установках в транспортных средствах или проблемы с системами 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. **Определение статуса**: Создает категориальные значения на основе данных нескольких датчиков

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


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://navixy.com/docs/user/ru/guide/account/iot-logic/flow-management/flow-configuration-example.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
