Создание правила

Код покажите…
И тип значеия, откуда оно, вывдедите в лог typeof()


с кодом экспериментировал по разному методом научного тыка и гуглинга.

defineRule("SwSezon", {
  whenChanged:  "wb-modbus-0-0/П1В1.Режим (0-зима,1-лето)",
  then: function (newValue, devName, cellName) {
    if (newValue == 1)
    	then: dev["wb-modbus-1-0"]["П2В2.Переключение зима-0, лето-1"] = true
    if (newValue == 0)
    	then: dev["wb-modbus-1-0"]["П2В2.Переключение зима-0, лето-1"] = false
//    dev["wb-modbus-1-0"]["П2В2.Переключение зима-0, лето-1"] = newValue;
    var seazon = dev["wb-modbus-1-0"]["П2В2.Переключение зима-0, лето-1"];
    log.info(newValue);
    log.info(typeof(newValue));
    log.info(seazon);
    log.info(typeof(seazon));
  }
});

Исправил так, теперь получилось. Благодарю за помощь.

Да, если именно в NewValue приходит число - то его нельзя напрямую присваивать.
И можно вот так написать:

    if (newValue == 1) {
    	dev["wb-modbus-1-0"]["П2В2.Переключение зима-0, лето-1"] = true
    }
    else{
    	dev["wb-modbus-1-0"]["П2В2.Переключение зима-0, лето-1"] = false
    }

Продолжаю работать с правилами. Подскажите, пожалуйста, в чем ошибка и как исправить ?
Мне нужно, что бы при изменении с 0 на 1 в переменную SpeedSup сохранялось текущее значение скорости и менялось на 100, и эта часть работает, а при изменении с 1 на 0 возвращалось обратно к SpeedSup - и в этот момент ошибка вылезает, под кодом размещу.

defineRule("CO_P1V1_Max", {
whenChanged:   "wb-modbus-1-0/П2В2.Режим (0-зима,1-лето)",
  then: function (newValue, devName, cellName) {
    if (newValue == 1) {
		var SpeedSup = dev["wb-modbus-0-0"]["П1В1.Текущая скорость приточного вентилятора"]
	    log.info(SpeedSup);
    	log.info(typeof(SpeedSup));
        dev["wb-modbus-0-0"]["П1В1.Уставка скорости приточного вентилятора"] = 100;
    }
    else {
    	dev["wb-modbus-0-0"]["П1В1.Уставка скорости приточного вентилятора"] = SpeedSup;
    var t1 = dev["wb-modbus-0-0"]["П1В1.Уставка скорости приточного вентилятора"];
    log.info(t1);
    log.info(typeof(t1));
    }
    log.info(newValue);
    log.info(typeof(newValue));
  }
});

2022-04-15 19:05:20ECMAScript error: TypeError: type error (rc -105)
anon native strict preventsyield
anon /usr/share/wb-rules-system/scripts/lib.js:113 preventsyield
anon /etc/wb-rules/CO_P1V1.js:13 preventsyield
call native strict preventsyield
anon /usr/share/wb-rules-system/scripts/lib.js:239 preventsyield

Вот в этом месте

Чему равна переменная SpeedSup, где она определяется в случае ветвления в else?

Да, тут недоработка, надо было ввести где-то ее начальное значение. Ну суть не в этом, первый раз правило выполнилось по переднему фронту, в переменную SpeedSup сохранилось нужное значение, в устройство modbus записалось “100”.
Далее, при переходе обратно из 1 в 0 мне соответственно нужно вернуть старое значение вместо “100”, а как оказывается переменная SpeedSup не определена . Каким образом можно сделать ее (по аналогии с другими средами разработки) глобальной ?
И еще вопрос - если мне нужно не по изменению какого-то топика выполнять действия, а по логическому условию, например ( …OR…)AND(…) - все так же, “if …then” вместо “whenChanged” ?

В случае правил все переменные инициализируемые внутри - локальные. Естественно значения не сохраняются за пределами видимости. По отношению к функции правил глобальной будет определенная в том же скрипте переменная. То есть инициализирует ее до создания правила просто как var SpeedSup = 0; например.

Спасибо, попробую. То есть до правила я объявляю эту переменную, с начальным значением, а при изменении внутри правила в ней будет сохраняться текущее значение ?
А по второму вопросу - если мне нужно не по изменению какого-то топика выполнять действия, а по логическому условию, например ( …OR…)AND(…) - все так же, “if …then” вместо “whenChanged” ?

Да, верно.

Тогда asSoonAs или when как описано тут: GitHub - wirenboard/wb-rules: Rule engine for Wiren Board
Но надо понимать что выполненеие функция - потребяет ресурсы. Чаще оптимальней привязываться к изменению топика и и прверять дополнительные условия внутри.

Спасибо, с правилом разобрался. На очереди модуль уведомлений. Что нужно вводить в качестве имени устройства ? image
на вики в описании настройки уведомлений про это ничего нет. Пробовал произвольное имя Alarms, не получается. Тестовые письма (как в описании echo…) уходят.

alarms
Вообще на работу не влияет.
Все описано тут: Модуль уведомлений — Wiren Board
Важно - что в cell ну и условие.

Хорошо. Тогда у меня что-то неправильно в значении. Я поставил условие “Значение не равно заданному”, поставил в заданное 1.
А по факту, топики true/false. Попробовал в заданное true записАть - ругается.

И еще такое в процессе : ECMAScript error: ReferenceError: identifier ‘Alarm1’ undefined
duk_js_var.c:1232
anon /etc/wb-rules/StP1V1.js:6 preventsyield
call native strict preventsyield
anon /usr/share/wb-rules-system/scripts/lib.js:239 preventsyield

Конфиг какой? В смысле - что в конфиге?

Пример настройки - тут:

{
  "name": "Статус П1В1",
  "cell": "wb-modbus-0-0/П1В1.Статус установки",
  "alarmMessage": "Установка П1В1 выключена !",
  "noAlarmMessage": "Установка П1В1 включена.",
  "alarmDelayMs": 2000,
  "expectedValue": 1
}```
Вот так вручную исправил через редактирование, не отправляет. Но и ошибки вроде нет теперь.

А что в топике?
И на что меняется?

Вместо 1 если true пишу “Тип значения должен быть number.”

Топик с true на false и обратно меняется.
upd. Версия rules 2.11.1 Менять не надо ? С кавычками экспериментировал - не дает сохранить с другими, не понятно, почему в примере по ссылке работает/не работает красный текст, думал из за кавычек не той системы…

Обновил версию до 2.11.1+wb1
Заработало.

Но между этими версиями (2.1.11 и 2.11.1+wb1) не менялось ничего в части alarms, у меня работает и на 2.1.11.