Добрый день!
Вот что могу посоветовать вам.
- Алиасы. Поскольку отдельные скрипты движка правил имеют изолированные контексты, да, вам надо добавлять алиасы в каждый скрипт. Общий файл в
/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;
}
});
- Отключение правил. Скрипт не очень правильно рассматривать как сущность, которую можно штатно включить или выключить целиком. В
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;
}
});
Добрый день! Остались ли у вас какие-то еще вопросы о этой теме?