Глобальные переменные

Как обеспечена работа с глобальными переменными?
Необходимо для работы в разных файлах 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‑слой, обычно делают одно из:

  1. Запись/чтение JSON‑файла из одного “служебного” файла правил (через runShellCommand и внешние скрипты).
  2. Использование стороннего сервиса (свой 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”?

Вот этого вопроса на понимаю.