Как обеспечена работа с глобальными переменными?
Необходимо для работы в разных файлах JS.
Глобальная переменная должна быть видна из одного файла в другом.
PersistentStorage или подобное.
Понятно, что “Использовать устройства/каналы MQTT как “глобальное хранилище”” недопустимо.
И как ?
Здравствуйте! Сегодня выходной день, поэтому сотрудники техподдержки ответят вам в рабочий день.
Пока что я, автоматический помощник, проанализировал ваш вопрос и постарался найти решение:
Для контроллеров Wiren Board (правила на wb-rules) работа “по‑настоящему” глобальных переменных между разными JS‑файлами и перезапусками движка напрямую не предусмотрена, но есть несколько вариантов:
1. Глобальные переменные внутри одного процесса wb-rules
Если вы используете один файл правил (один процесс wb-rules), то можно пользоваться обычными глобальными переменными JS:
var sharedState = { counter: 0 };
defineRule("incCounter", {
whenChanged: "some/relay",
then: function (newValue, devName, cellName) {
sharedState.counter++;
log("counter =", sharedState.counter);
}
});
Но такая переменная:
- не разделяется между разными процессами
wb-rules; - теряется при перезапуске
wb-rulesили контроллера.
Если у вас несколько файлов правил, которые запускаются как отдельные процессы (разные systemd-сервисы), то они не видят глобальные переменные друг друга.
2. Использовать устройства/каналы MQTT как “глобальное хранилище”
Рекомендуемый подход — сделать “служебное устройство” в MQTT и хранить состояние в его каналах. Тогда “глобальная переменная” видна:
- из всех файлов JS (и даже разных процессов
wb-rules); - из внешних клиентов по MQTT;
- может быть сделана persistent (через retained‑сообщения MQTT и/или правила).
Пример: создаём виртуальное устройство и “глобальную переменную”:
// В одном из файлов правил, выполняется при старте
defineVirtualDevice("globals", {
title: "Global variables",
cells: {
myVar: {
type: "value",
value: 0
}
}
});
Теперь:
- чтение в любом файле правил:
var v = dev["globals"]["myVar"];
- запись в любом файле правил:
dev["globals"]["myVar"] = 123;
Это и будет аналогом глобальной переменной, видимой “из одного файла в другом”.
Если хотите, чтобы значение переживало перезагрузку контроллера:
- можно настроить логику, которая при старте загружает значение из файла/БД в этот канал;
- либо использовать внешнее хранилище (например, свой сервис, который пишет в MQTT retained‑сообщения).
3. PersistentStorage как отдельная библиотека
Специального API типа PersistentStorage в стандартном wb-rules сейчас нет. Чтобы сделать именно persistent‑слой, обычно делают одно из:
- Запись/чтение JSON‑файла из одного “служебного” файла правил (через
runShellCommandи внешние скрипты). - Использование стороннего сервиса (свой daemon), который:
- подписывается на MQTT;
- хранит значения в файле/БД;
- восстанавливает их при старте, публикуя обратно в MQTT.
Но в любом случае интерфейс между файлами JS в контексте wb-rules удобнее строить через MQTT‑устройства и их каналы, а не через общую память.
Если вы уточните:
- что именно нужно хранить (настройки, временное состояние, счётчики и т.п.);
- критично ли переживать перезагрузку контроллера;
- сколько файлов правил и как вы их запускаете,
я смогу предложить более конкретную структуру “глобального хранилища” на MQTT для вашей задачи.
Примечание: Я — искусственный интеллект, а не человек. В моих ответах могут быть неточности.
Глобальных переменных в Wirenboard пока нет и каждый файл JS работает с теми переменными, которые в файле находятся.
Это я уже испытал практически. Если не хочешь приключений, JS надо иметь один.
Это ограничивает применимость контроллера (теперь я понимаю, что это программированное реле) на уровне малой и домашней автоматизации.
Остальное опасно для применения. С учетом найденных других ошибок.
По крайней мере на текущий момент.
При этом глобальные переменные можно использовать, если создать defineVirtualDevice, помимо MQQT, файлов и т.д.
Вопросы:
1 defineVirtualDevice(“globals”, {
title: “Global variables”,
cells: {
myGlobalVar: {
type: “value”,
value: Array мне нужно передавать, как это сделать?
}
}
2 Эти переменные(ая) всегда и везде обновляются, а не только при запуске программы?
Добрый день.
Область видимости очень подробно рассмотрена тут.
Вот тут не очень понятно.
Зачем - один?
В типичном проекте интеграторов до полусотни скриптов.
value - это значение. Аналог float, пожалуй, если пытаться сопоставить с более типизированными языками.
Что такое “передавать Array”?
Вот этого вопроса на понимаю.