Код покажите…
И тип значеия, откуда оно, вывдедите в лог 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
Но надо понимать что выполненеие функция - потребяет ресурсы. Чаще оптимальней привязываться к изменению топика и и прверять дополнительные условия внутри.
Спасибо, с правилом разобрался. На очереди модуль уведомлений. Что нужно вводить в качестве имени устройства ?
на вики в описании настройки уведомлений про это ничего нет. Пробовал произвольное имя 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.