Глобальные переменные в Node-RED для сценариев Алисы
Стандартная модель передачи данных в Node-RED построена на концепции сообщений: объект msg перемещается по цепочке нод слева направо. Как только сообщение достигает конца цепочки, все содержащиеся в нем данные бесследно стираются из оперативной памяти сервера. Кроме того, одна изолированная цепочка (flow) не может напрямую прочитать данные из другой цепочки, находящейся на соседней вкладке редактора.
Для решения этой проблемы и создания сквозной логики умного дома в Node-RED применяется механизм контекстов (Contexts). Он позволяет сохранять информацию в специальные переменные, доступные на разных уровнях видимости. Это незаменимо для создания глобальных флагов (например, «Режим охраны», «Ночь», «Гости»), которые влияют на работу всех домашних сценариев Яндекса одновременно.
Шаг 1: Понимание уровней видимости контекста
В Node-RED существует три основных уровня хранения переменных:
- Node Context (Контекст ноды) — данные доступны только внутри конкретной ноды, которая их записала. Используется крайне редко для специфических внутренних расчетов.
- Flow Context (Контекст потока) — переменные доступны любым нодам, расположенным на одной и той же вкладке редактора Node-RED. Это удобно для объединения нескольких параллельных веток автоматизации одной комнаты.
- Global Context (Глобальный контекст) — данные доступны абсолютно всем нодам на сервере автоматизации, независимо от того, на каких вкладках они находятся.
Для отслеживания глобальных режимов работы дома (например, спит ли кто-то в спальне или уехали ли хозяева в отпуск) всегда используется именно глобальный контекст.
Шаг 2: Запись и чтение переменных
Работать с переменными можно двумя способами: визуально с помощью стандартной ноды change или программно внутри ноды function.
Чтобы записать значение визуально:
- Добавьте ноду
changeи выберите правило Set. - В поле назначения укажите область видимости, например
flow.isNightModeилиglobal.securityActive. - В поле значения введите нужную величину (логическое
true/false, число или текстовую строку).
Программный способ в ноде function дает больше гибкости. Для записи данных используются встроенные методы .set(), а для чтения — .get():
// Запись переменной в глобальный контекст
global.set("lastMotionTime", Date.now());
// Чтение переменной из глобального контекста
const isNight = global.get("isNightMode") || false;
if (isNight) {
msg.payload = { brightness: 10 }; // Ночной приглушенный режим
} else {
msg.payload = { brightness: 100 }; // Дневной режим
}
return msg;
NOTE
Вы можете просматривать все текущие значения сохраненных переменных в реальном времени. Для этого откройте правую боковую панель Node-RED, перейдите на вкладку Context Data и нажмите кнопку обновления (круговая стрелка) рядом с нужным разделом.
Шаг 3: Настройка энергонезависимого хранения данных
По умолчанию Node-RED хранит все контекстные переменные в оперативной памяти (RAM). Это означает, что при перезагрузке сервера автоматизации (например, при обновлении системы или внезапном отключении электричества) абсолютно все ваши глобальные переменные будут сброшены.
Чтобы переменные сохраняли свои значения после перезагрузки, необходимо настроить их запись на локальный диск сервера.
Для этого откройте конфигурационный файл settings.js вашего сервера Node-RED и найдите секцию contextStorage. Раскомментируйте ее и приведите к следующему виду:
contextStorage: {
default: {
module: "localfilesystem"
}
}
После перезапуска службы Node-RED все данные будут автоматически дублироваться в файлы на жестком диске.
Шаг 4: Интеграция с Алисой и автоматами состояний
Глобальные переменные позволяют создавать сложные адаптивные сценарии. Например, умный настенный выключатель в прихожей при однократном нажатии включает свет, а при долгом удержании — меняет значение глобальной переменной global.awayMode на true.
Все остальные цепочки автоматизации (отопление, вентиляция, безопасность) периодически проверяют статус этой переменной. Яндекс Станция, зафиксировав переход флага awayMode в активное состояние, произносит: «Режим отсутствия активирован. Счастливого пути!», после чего выключает все розетки и переводит отопительный котел в экономичный режим.
Для реализации еще более сложных алгоритмов управления, основанных на отслеживании множества взаимосвязанных состояний комнат и переходов между ними, рекомендуется использовать специализированный автомат состояний в Node-RED. Это позволит объединить глобальные переменные в единую жесткую логическую систему.
IMPORTANT
При использовании файлового хранилища localfilesystem избегайте слишком частой записи быстроменяющихся данных (например, показаний датчиков температуры, обновляющихся ежесекундно). Постоянная циклическая перезапись может быстро износить ресурс памяти вашей карты MicroSD, на которой работает Raspberry Pi или другой одноплатный компьютер. Часто меняющуюся телеметрию храните только в оперативной памяти (память по умолчанию memory).
WARNING
При чтении глобальных переменных всегда предусматривайте дефолтные значения на случай, если переменная еще не была инициализирована (например, при первом запуске новой логики). Конструкция вида const mode = global.get("mode") || "default" защитит ваш код от неопределенных состояний undefined.
TIP
Для отладки сложных схем с глобальными переменными создайте тестовую вкладку с нодами inject. С их помощью вы сможете вручную отправлять проверочные значения true и false в глобальный контекст, имитируя различные режимы работы дома без физического переключения датчиков.
Если вам необходимо не просто передавать текущие состояния между потоками в реальном времени, а сохранять глубокую историю измерений для анализа энергоэффективности или климата, настройте экспорт показаний датчиков Алисы в базу данных MySQL через Node-RED.
Инструкция по настройке
Инициализация контекста
Изучите структуру контекстных хранилищ Node-RED в боковой панели Context Data.
Запись переменных
Используйте ноду change или встроенные функции JavaScript для сохранения данных в flow или global.
Настройка постоянного хранения
Отредактируйте файл settings.js для сохранения переменных на жесткий диск при перезапуске сервера.
Использование переменных в логике
Настройте чтение глобальных флагов для адаптивного изменения яркости света через Алису.
Совет эксперта: Управляйте домом с компьютера
Установите Яндекс Браузер, чтобы управлять умными розетками и светом прямо со стартовой страницы, не отвлекаясь от работы.