WB Rules definealias

Добрый день!

  1. Хотелось бы создать файл JS где все нужные устройства через Definealias привязать назвать понятно все устройства которые необходимы мне. После чего импортировать данный файл в каждое правило WB Rules. Но как это реализовать не очень понятно.
  2. Может ли один script в WB Rules выключать(выключать) другой script в WB Rules как это например реализовано в SH , что скрипт может выключить или включить выполнение сценария

Добрый день!
Вот что могу посоветовать вам.

  1. Алиасы. Поскольку отдельные скрипты движка правил имеют изолированные контексты, да, вам надо добавлять алиасы в каждый скрипт. Общий файл в /etc/wb-rules с defineAlias() не сработает. Чуть облегчить задачу помогут модули.
    Выглядеть это должно так.
    Вы создаете модуль (/etc/wb-rules-modules/my_devices.js) с общей “картой” устройств:
exports.ids = {
  kitchenMotion: "wb-msw-v4_12/Motion",
  hallLight: "wb-mr6c_34/K1",
  boilerPump: "wb-mr6c_34/K2"
};

затем в каждом отдельном правиле импортируете его:
var IDS = require("my_devices").ids;

И описываете нужные вам локальные алиасы:

defineAlias("kitchenMotion", IDS.kitchenMotion);
defineAlias("hallLight", IDS.hallLight);

или использовать более длинные идентификаторы типа IDS.hallLight
Получается примерно так:

var IDS = require("my_devices").ids;

defineAlias("kitchenMotion", IDS.kitchenMotion);
defineAlias("hallLight", IDS.hallLight);

defineRule("kitchen_light_auto", {
  whenChanged: kitchenMotion,
  then: function (newValue) {
    hallLight = !!newValue;
  }
});
  1. Отключение правил. Скрипт не очень правильно рассматривать как сущность, которую можно штатно включить или выключить целиком. В wb-rules 2.0 управляют не файлами, а отдельными правилами: defineRule() возвращает идентификатор правила, и дальше его можно отключить через disableRule(), включить через enableRule() или запустить через runRule()
    Но здесь есть важное ограничение: если правило объявлено в одном файле, а выключать его вы хотите из другого файла, то идентификатор этого правила ещё надо специально расшарить между скриптами через общий прототип global.__proto__, мы этого не рекомендуем.

Самый простой и надежный способ – это сделать флаг и проверять его в необходимых автоматизациях:

defineVirtualDevice("rule_settings", {
  title: "Настройки автоматизации",
  cells: {
    autoLightEnabled: { type: "switch", value: true }
  }
});

defineRule("auto_light", {
  whenChanged: "wb-msw-v4_12/Motion",
  then: function (newValue) {
    if (!dev["rule_settings/autoLightEnabled"]) return;
    dev["wb-mr6c_34/K1"] = !!newValue;
  }
});

Добрый день! Остались ли у вас какие-то еще вопросы о этой теме?