Поиск по базе знаний

Обработка JSON-данных от датчиков в Node-RED для Яндекса

Формат JSON (JavaScript Object Notation) является общепринятым стандартом обмена данными в мире Интернета вещей (IoT). Практически все современные датчики, работающие по протоколам Zigbee, Wi-Fi или BLE, передают информацию на локальный сервер автоматизации в виде текстовых JSON-пакетов. Такие пакеты могут содержать как простые пары ключ-значение, так и сложные многоуровневые вложенные структуры данных.

Для того чтобы использовать физические показатели датчиков (температуру, уровень влажности, концентрацию углекислого газа CO2 или освещенность) в сценариях голосового ассистента Алисы, эти данные необходимо правильно извлечь из текстовой строки, обработать и преобразовать в числовые форматы. В этом практическом руководстве мы подробно изучим инструменты парсинга и фильтрации JSON в Node-RED.


Шаг 1: Прием текстовых данных и их десериализация

Большинство беспроводных датчиков отправляют свои показания через брокер сообщений MQTT в виде обычной строки (string). Например, датчик климата может отправить следующее сообщение: {"battery":95,"linkquality":84,"climate":{"temperature":23.8,"humidity":58}}

Для Node-RED это сообщение изначально является просто набором символов. Прежде чем выполнять какие-либо математические или логические операции, строку нужно преобразовать в объект JavaScript.

Для этого в палитре Node-RED предусмотрена встроенная нода json. Перетащите ее на рабочий холст и соедините с выходом ноды mqtt in. Нода json работает в двустороннем режиме: если на ее вход поступает текстовая строка, она автоматически десериализует ее в полноценный объект msg.payload. Если на вход поступает готовый объект, нода преобразует его обратно в строку для отправки по сети.


Шаг 2: Извлечение данных с помощью точечной нотации

После преобразования строки в объект мы можем легко обращаться к любым свойствам датчика. Для этого используется стандартная точечная нотация JavaScript. Если нам нужно получить уровень заряда батареи, мы пишем путь: msg.payload.battery.

Однако в нашем примере температура и влажность находятся внутри вложенного объекта climate. Чтобы добраться до значения температуры, путь будет выглядеть следующим образом: msg.payload.climate.temperature

Для извлечения этих параметров добавьте на холст ноду change. В ее настройках выберите действие Set (Установить), укажите целевое свойство msg.payload и задайте его значение через тип данных msg как msg.payload.climate.temperature. Это позволит избавиться от лишних данных в сообщении, оставив на выходе только чистое числовое значение температуры.


Шаг 3: Безопасный парсинг данных

Один из самых частых сбоев в работе Node-RED — это ошибки выполнения JavaScript при попытке обратиться к несуществующему свойству объекта. Например, если датчик отправит пакет без объекта climate (допустим, только сервисный отчет о разряде батареи: {"battery":10}), то выполнение выражения msg.payload.climate.temperature мгновенно вызовет критическую ошибку TypeError: Cannot read properties of undefined. Это приведет к остановке всей цепочки автоматизации.

Чтобы избежать подобных ситуаций, в ноде function следует использовать защитное программирование и современный оператор опциональной цепочки (optional chaining) ?.:

// Безопасное извлечение с помощью оператора ?.
const temperature = msg.payload?.climate?.temperature;

if (temperature !== undefined) {
    msg.payload = temperature;
    return msg;
}
// Если данные отсутствуют, блокируем дальнейшую передачу сообщения
return null;

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


Шаг 4: Интеграция с экосистемой Яндекса

Для вывода извлеченных числовых значений в Алису используются виртуальные датчики. Вы можете настроить интеграцию через Home Assistant или напрямую отправлять данные в Яндекс Диалоги.

Для сохранения промежуточных расчетных значений датчиков и их последующей передачи между разными несвязанными цепочками автоматизации Node-RED рекомендует активно применять контекстные хранилища. Ознакомиться с правилами их использования вы можете в нашей статье про глобальные переменные в Node-RED. Это позволит вам агрегировать данные с нескольких датчиков в одну общую переменную и передавать ее в Яндекс.

После связывания виртуального температурного датчика с Алисой вы сможете создавать сценарии автоматизации отопления и кондиционирования внутри мобильного приложения Дом с Алисой, а также запрашивать данные голосом. Достаточно будет спросить у колонки: «Алиса, какая температура в детской?», и она назовет точное числовое значение, полученное и обработанное вашим сервером Node-RED.

IMPORTANT

При парсинге числовых параметров от дешевых китайских датчиков обращайте внимание на тип данных. Иногда температура передается в виде текстовой строки "23.8" вместо числа 23.8. Перед отправкой данных в Яндекс обязательно преобразуйте значение в числовой тип с помощью функции parseFloat(msg.payload), иначе Алиса не сможет корректно обработать и озвучить этот параметр.

WARNING

Если ваш датчик отправляет данные слишком часто (например, датчик освещенности генерирует новые пакеты при малейшем изменении люксов несколько раз в секунду), это может перегрузить облачный сервер Яндекса и привести к временной блокировке ваших запросов (rate limiting). Обязательно используйте ноду rbe (Report By Exception) или ноду filter, чтобы отправлять новые данные в Яндекс только при изменении значения на определенную величину (например, при изменении температуры более чем на 0.2°C).

TIP

Используйте отладочную ноду debug с выводом полной структуры сообщения (complete msg object) в правую боковую панель Node-RED. Это позволит вам визуально изучить все доступные ключи в полученном JSON-пакете и скопировать правильный путь к любому свойству кликом по иконке “Copy path” рядом со значением переменной.

Инструкция по настройке

1

Получение необработанного пакета

Настройте прием входящей строки данных от датчика через MQTT или HTTP-запрос.

2

Десериализация строки в JSON

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

3

Извлечение вложенных параметров

Напишите JS-код в ноде function для точечного доступа к нужным свойствам датчика.

4

Публикация в виртуальные датчики Яндекса

Передайте полученные числовые значения в переменные умного дома для озвучивания Алисой.

Совет эксперта: Управляйте домом с компьютера

Установите Яндекс Браузер, чтобы управлять умными розетками и светом прямо со стартовой страницы, не отвлекаясь от работы.