Движок правил: примеры кода

Cпасибо,поправил,но так же тормознуто срабатывает все

Попробовать:

  1. Сменить событие whenChanged с Counter на вход события.
  2. Поднять скорость шины и всех модулей на ней.

Cпасибо.поднял скорость шины - да, действительно - намного быстрее стало работать,но небольшая задержка осталась.

Касаемо события. Поменял Input Counter на Input state (других вариантов обработки событий по входу я так понимаю нет?!) тоже работает ,но не корректно считывается нажатие клавиши ,а конкретно - работает только по длительному нажатию, но ,надеюсь,что этот вопрос получится решить скриптом обработки нажатий,о котором я спрашивал выше @almo

Пример моей реализации кнопок через модули, надеюсь поможет разобраться.
Module and Action.rar (2.6 КБ)

Здравствуйте!
@KAMAN Файлы с расширением .js блокируются движком портала поддержки, присылайте их, пожалуйста, в архиве.

Сообщение было перенесено в новую тему: Не работает правило на контроллере

6 сообщений были перенесены в новую тему: Срабатывание правила по времени

Доброго времени суток!

Подскажите пожалуйста, как прописывать правило: при изменении значения датчика температуры и при условии, что виртуальная кнопка выключена, тогда изменить температуру в котле.
Сейчас скрипт почему-то сам принудительно включает виртуальную кнопку “vacation”, поэтому условие “else” не отрабатывается:

defineRule(“Heater2”, {
whenChanged: “wb-w1/28-00000d21f6bc”,
then: function (newValue, devName, cellName) {
if (dev[“virtual3”][“vacation”] = true) {
dev[“wbe2-i-ebus_12”][“Heating Setpoint”] = 30;
dev[“wb-mwac_84”][“K2”] = false; //normally closed
log(date + ‘Protherm High ON’);
} else {
log(date + ‘Protherm high OFF’);
}

У вас не верная операция сравнение, в строке if (dev[“virtual3”][“vacation”] = true) вы не проверяете развен ли mqtt топик значению true, а задаете данному топику значение true.

= операция приравнивания
== операция сравнения
=== операция сторого сравнения

defineRule(“Heater2”, {
whenChanged: “wb-w1/28-00000d21f6bc”,
then: function (newValue, devName, cellName) {
if (dev[“virtual3”][“vacation”] == true) {
dev[“wbe2-i-ebus_12”][“Heating Setpoint”] = 30;
dev[“wb-mwac_84”][“K2”] = false; //normally closed
log(date + ‘Protherm High ON’);
} else {
log(date + ‘Protherm high OFF’);
}

Либо

defineRule(“Heater2”, {
whenChanged: “wb-w1/28-00000d21f6bc”,
then: function (newValue, devName, cellName) {
if (dev[“virtual3”][“vacation”]) {
dev[“wbe2-i-ebus_12”][“Heating Setpoint”] = 30;
dev[“wb-mwac_84”][“K2”] = false; //normally closed
log(date + ‘Protherm High ON’);
} else {
log(date + ‘Protherm high OFF’);
}

2 лайка

Коллеги доброго времени суток, подскажите плиз на 6.6.0 версии контроллера не работает ваш готовый универсальный модуль из вики

Не могу никак докопаться что ему не нравится… версия wb-rules 2.11.4 версия релиза wb-2207
Буду благодарен за любую подсказку.

Боюсь ошибиться, но, по-моему, запятая в конце восьмой строки - лишняя.

1 лайк

Пока серфил этот форум, несколько раз натыкался на вопрос, как написать правило, которое отключало бы блок питания светодиодной ленты, когда та не используется, и включало бы, когда лента включается. Привожу код, который скомпилировал из различных примеров и источников под свои нужды. Достаточно только подменить мои устройства своими. Комментарии оставляю, как у себя, чтобы самому не забыть для чего это все, поверьте, таким новичкам, как я это важно. )))

// Правило сработает, когда любой из каналов диммера wb-led_21/Channel 1, 2, 3 или 4 будет включен
// и включит блок питания соответствующей ленты через контакт реле wb-mr6cu_105/K1
// а затем выключит данное реле, если все каналы диммера wb-led_21 будут отключены.
var i = 0 // Объявляем переменную (счетчик) - "i" и присваиваем ей значение - "0".

defineRule("rampPowerSupply1", {
    whenChanged: ["wb-led_21/Channel 1", "wb-led_21/Channel 2", "wb-led_21/Channel 3", "wb-led_21/Channel 4"], // Получаем значение контрола и
    then: function(newValue, devName, cellName) { // передаем его в then функцию. Затем
        if (newValue == 1) { // если это включение контрола, то
            i = i + 1; // прибавляем к нашему счетчику "1"
            dev["wb-mr6cu_105/K1"] = newValue; // и включаем блок питания с помощью реле
        } else // если же это было выключение контрола, тогда
            i = i - 1; // уменьшаем наш счетчик на "1" и сразу же
        if (i == 0) { // проверяем не стало ли "0"? Если да, то
            dev["wb-mr6cu_105/K1"] = newValue; // выключаем блок питания с помощью реле.
        }
    }
});
defineRule("rampPowerSupply2", { // Если нужно выключить все каналы диммера не по одному, а сразу, просто выключаем блок питания с помощью контрола реле
    whenChanged: "wb-mr6cu_105/K1", // Принимаем значение
    then: function(newValue, devName, cellName) { // Передаем его в функцию
        if (newValue == 0) { // проверяем и если "ВЫКЛ", то выключаем все каналы ниже, присваивая им то же значение.
            dev["wb-led_21/Channel 1"] = newValue;
            dev["wb-led_21/Channel 2"] = newValue;
            dev["wb-led_21/Channel 3"] = newValue;
            dev["wb-led_21/Channel 4"] = newValue;
        }
    }
});

Критика и советы приветствуются.

2 лайка

Похожее тут обсуждалось: Запуск выхода модуля WB-MR6 через вход диммера

Ну, можно туда перенести. Просто когда я искал что-то типа готового примера, чтобы сразу утащить к себе - не нашел.

1 лайк

Не, переносить не надо, пусть тут и лежит, пример годный.

2 сообщения были перенесены в новую тему: Kitchen switch

Сообщение было перемещено в эту тему: Kitchen switch

Всем доброго времени суток! Помогите пожалуйста с правилом:
Есть текстовая переменная, в которую, в ручную, вносится время (hh:mm):
Screenshot_1
Нужно сделать ещё 2 переменные (1 для часов 1 для минут) и правило, которые бы вносили изменение в первую переменную.
Буду очень благодарен за помощь!

var time;
var hours = 15;
var minutes = 00;

minutes = minutes.toString();
if(minutes.length < 2){
minutes = “0” + minutes
}
time = hours + “:” + minutes;

log.info(typeof time)
log.info(time)

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.