> 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/nodes/initiate-attribute-node/calculation-examples.md).

# Примеры вычислений

Практические примеры написания вычислений атрибутов на языке выражений IoT Logic. Содержит рекомендации по именованию атрибутов и безопасной обработке значений null.

Узел Вычисление атрибута в IoT Logic поддерживает широкий спектр вычислений с помощью [язык выражений Navixy IoT Logic](/docs/iot-logic-api/technologies/navixy-iot-logic-expression-language.md). Это руководство содержит практические примеры распространённых вычислений, которые помогут вам извлечь максимальную пользу из данных IoT.

## Важные моменты

При создании вычислений учитывайте следующие моменты:

* **Корректность имён атрибутов**: Убедитесь, что в вычислениях вы используете правильные имена атрибутов. Просмотреть существующие имена атрибутов можно с помощью [Анализ данных](/docs/user/ru/guide/account/iot-logic/data-stream-analyzer.md), или вставить их с помощью [Управление атрибутами](/docs/user/ru/guide/account/iot-logic/nodes/initiate-attribute-node/managing-attributes.md#short-syntax) с помощью [автодополнения](/docs/user/ru/guide/account/iot-logic/nodes/initiate-attribute-node/managing-attributes.md#autofill-attribute-names).
* **Корректность данных**: Формула, которая считывает значение, которого нет в пакете, ничего не возвращает, и для этого пакета атрибут не будет иметь значения. Защитите вычисление с помощью `!= null`, или подставьте значение по умолчанию с помощью `??`. См. [Отсутствующие значения в выражениях](/docs/user/ru/guide/account/iot-logic/nodes/missing-values-in-expressions.md).
* **Влияние на производительность**: Сложные вычисления со множеством вложенных функций могут влиять на скорость обработки данных с высокой частотой
* **Математические ограничения**: Функции вроде логарифма и квадратного корня требуют положительных значений на входе
* **Исторические ссылки**: При использовании индексированных значений (например, `value('param', 1, 'valid')`), убедитесь, что у вас достаточно исторических данных, и используйте [полный синтаксис выражений](/docs/user/ru/guide/account/iot-logic/nodes/initiate-attribute-node/managing-attributes.md#full-syntax)

{% hint style="info" %}
Математические функции можно применять к любому числовому параметру или ранее вычисленному атрибуту. Всегда проверяйте вычисления на тестовых данных перед внедрением в рабочие потоки.
{% endhint %}

{% hint style="info" %}
Чтобы заполнить атрибут не результатом вычисления, а названием Зоны, в которой находится устройство, используйте `geofenceName()`. Это платная опция, по умолчанию она выключена. См. [Функции зон](/docs/user/ru/guide/account/iot-logic/nodes/geofence-functions.md).
{% endhint %}

## Базовые вычисления

### Преобразование единиц измерения

Преобразование измерений между различными единицами — одна из самых распространённых операций при обработке данных IoT.

#### **Преобразование скорости (км/ч в миль/ч)**

```jexl
can_speed/1.609
```

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

**Преобразование температуры (из Цельсия в Фаренгейт)**

```jexl
temperature * 1.8 + 32
```

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

### Расчет разницы

Сравнение текущих показаний с предыдущими значениями помогает выявлять изменения и тенденции в ваших данных.

#### **Обнаружение изменений температуры**

```jexl
temperature - value('temperature', 1, 'valid')
```

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

{% hint style="info" %}
**Пример:** Для автопарка рефрижераторных грузовиков этот расчет может сразу определить, когда температура груза начинает слишком быстро расти, позволяя диспетчерам связаться с водителями до того, как скоропортящиеся товары будут испорчены. Атрибут может вызывать контроль событий, когда изменение температуры превышает 3 градуса за короткий период, что может указывать на отказ системы охлаждения или на то, что дверь осталась открытой.
{% endhint %}

## Расчеты, основанные на времени

Расчеты времени помогают вам понимать поведение устройства с течением времени и оценивать эксплуатационные закономерности.

### **Определение времени, прошедшего между последними действительными показаниями**

```jexl
srvTime('avl_25', 0, 'valid') - srvTime('avl_25', 1, 'valid')
```

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

{% hint style="info" %}
**Пример:** Для автопарка такси этот расчет может помочь выявить проблемы со связью у GPS-трекеров. Если время между показаниями внезапно увеличивается со стандартных 30 секунд до нескольких минут, это может указывать на плохое покрытие сотовой сети или неисправности устройств, что позволяет командам техобслуживания устранять проблемы до того, как они повлияют на качество обслуживания.
{% endhint %}

### **Преобразование временной метки в человекочитаемый формат**

```jexl
dtFormat(genTime('can_fuel_1', 0, 'all'))
```

**Практическое применение:** Преобразование Unix-меток времени в формат ISO 8601 делает данные более читаемыми в журналах и отчетах. Этот формат широко поддерживается инструментами анализа и базами данных, что упрощает интеграцию с другими системами.

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

IoT Logic поддерживает сложные математические операции с помощью встроенных математических функций.

### Округление значений

**Округление температуры до ближайшего целого**

```jexl
math:round(value('temperature_2', 0, 'valid'))
```

**Практическое применение:** Округление полезно, когда не нужна точная точность или когда вы хотите уменьшить шум в показаниях датчиков. Например, округление данных датчиков окружающей среды может быть достаточно для общего мониторинга климата при одновременном снижении требований к хранению. Эта функция также полезна при создании категорий или диапазонов значений (например, при группировке температурных показаний с шагом 5 градусов).

{% hint style="info" %}
**Пример:** В управлении транспортом показания температуры двигателя часто содержат дробные значения, которые не имеют значения для контроль событий для водителя или планирования техобслуживания. Округление этих значений упрощает отображение на панели мониторинга и делает пороги температуры проще для задания. Например, контроль событий по техобслуживанию можно запускать, когда округленная температура двигателя превышает 90°C, вместо того чтобы работать с точными значениями вроде 89,7°C.
{% endhint %}

### Логарифмические вычисления

**Натуральный логарифм значения**

```jexl
math:log(value('temperature_2', 0, 'valid'))
```

**Практическое применение:** Логарифмические преобразования особенно полезны для:

* Сжатия данных, которые охватывают несколько порядков величины, до более управляемого диапазона
* Преобразования экспоненциальных зависимостей в линейные для более простого анализа
* Работы с определенными типами датчиков, которые имеют логарифмические характеристики отклика
* Расчетов уровня звука, где децибелы являются логарифмическими единицами
* Измерений pH в экологическом мониторинге

{% hint style="info" %}
**Пример:** При анализе поведения водителя с помощью акселерометра логарифмическая функция может помочь нормализовать данные об ускорении, которые варьируются от незначительных движений до резких торможений. Это упрощает создание значимого показателя безопасности водителя, на который не будут чрезмерно влиять редкие экстремальные события. Еще один практический пример — работа с датчиками уровня топлива, которые не выдают линейные показания. Некоторые датчики уровня топлива имеют нелинейные значения сопротивления, соответствующие фактическому уровню топлива. Использование логарифмических вычислений может помочь преобразовать эти показания в более точные проценты уровня топлива.
{% endhint %}

### Операции извлечения квадратного корня

**Вычисление квадратного корня из показания**

```jexl
math:sqrt(value('temperature_2', 0, 'valid'))
```

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

* Преобразования между мощностью и амплитудой в электрических измерениях
* Расчета стандартных отклонений при статистическом анализе данных датчиков
* Определения среднеквадратичных значений (RMS) для электрических параметров
* Вычисления расстояния в многомерном пространстве (например, трилатерации для позиционирования)
* Нормализации некоторых типов данных датчиков

{% hint style="info" %}
**Пример:** При вычислении фактического расстояния между двумя GPS-точками (широтой и долготой) необходимо использовать функцию квадратного корня как часть формулы расстояния. Например, если вы рассчитываете расстояние, которое транспорт прошел между двумя GPS-измерениями, используя формулу евклидова расстояния, функция квадратного корня необходима. Еще одно распространенное применение — вычисление величины вибрации или ударных воздействий по нескольким осям акселерометра (X, Y, Z). Квадратный корень из суммы квадратов значений по каждой оси дает общую величину вибрации, что полезно для обнаружения ударов транспортного средства или плохих дорожных условий.
{% endhint %}

## Комбинированные операции

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

### **Геометрическое среднее с округлением**

{% code overflow="wrap" %}

```jexl
math:round(math:sqrt(value('temperature_1', 0, 'valid') * value('temperature_2', 0, 'valid')))
```

{% endcode %}

**Практическое применение:** Этот расчет вычисляет геометрическое среднее показаний двух температурных датчиков и округляет результат, чтобы получить более удобное значение. Геометрическое среднее часто более уместно, чем арифметическое среднее, когда речь идет о скоростях, соотношениях или измерениях, где умножение является естественным способом объединения значений.

{% hint style="info" %}
**Пример:** В сценарии рефрижераторной перевозки у вас может быть несколько температурных датчиков, размещенных по всему грузовому отсеку. Этот расчет дает сбалансированное показание температуры, учитывающее оба значения и минимизирующее влияние экстремальных выбросов. Вместо того чтобы запускать контроль событий только по одному датчику (на который могут влиять открывания дверей), этот комбинированный расчет дает более репрезентативное общее температурное состояние для чувствительного груза.
{% endhint %}

### **Расчет стандартизированного значения**

{% code overflow="wrap" %}

```jexl
(value('sensor_reading', 0, 'valid') - value('sensor_min', 0, 'valid')) / (value('sensor_max', 0, 'valid') - value('sensor_min', 0, 'valid')) * 100
```

{% endcode %}

**Практическое применение:** Это нормализует показание датчика к процентной шкале от 0 до 100 %, что позволяет проводить стандартизированные сравнения между разными датчиками с различными диапазонами. Это особенно полезно для создания единообразных панелей мониторинга или запуска контроля событий на основе относительных значений, а не абсолютных измерений.

{% hint style="info" %}
**Пример:** Менеджер автопарка контролирует транспорт разных производителей, у каждого из которых свои показания датчиков уровня топлива (омы, вольты, сырые цифровые значения). Нормализуя эти разнородные показания к единой процентной шкале, менеджер может применять одинаковые контроль событий по низкому уровню топлива ко всему автопарку и формировать стандартизированные отчеты по норме расхода без учета специфики датчиков каждой модели транспортного средства.
{% endhint %}

## Операции со строками

Операции со строками позволяют объединять несколько значений атрибутов в один строковый результат.

### Объединение значений атрибутов

Объединение значений из нескольких атрибутов полезно, когда нужно свести данные из нескольких источников в одно поле для отображения или передачи.

```jexl
util:joinNonNull(', ', ble_name_1, ble_name_2, ble_name_3, ble_name_4, ble_name_5, ble_name_6, ble_name_7, ble_name_8)
```

**Практическое применение:** Устройства с возможностью сканирования BLE могут одновременно обнаруживать несколько периферийных датчиков, но не все слоты датчиков всегда заняты. Этот расчет формирует аккуратный список активных датчиков, разделенный запятыми, автоматически пропуская незаполненные слоты. Результат готов для отображения или передачи во внешние системы без дополнительной очистки.

{% hint style="info" %}
**Пример**: Рефрижераторный грузовик поддерживает до восьми BLE-датчиков температуры, размещенных по всему грузовому отсеку, но сейчас установлены только три. Вместо вывода «Датчик A, Датчик B, Датчик C, , , , , » с пустыми значениями для неиспользуемых слотов, `util:joinNonNull` выводит «Датчик A, Датчик B, Датчик C» — аккуратный список, который автоматически обновляется при добавлении или удалении датчиков. Если вам нужно сохранить пустые позиции в выводе, используйте `util:join` вместо этого: он рассматривает значения null как пустые строки, а не пропускает их.
{% endhint %}


---

# 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://navixy.com/docs/user/ru/guide/account/iot-logic/nodes/initiate-attribute-node/calculation-examples.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
