Отработка правила

Товарищи подскажите)

title:"Andreys",
cells: {
"temperature": {
type:"range",
value: 18,
max: 32,
min: 18
},
}
});


function Termostat(name, temp, setpoint, TS) {
defineRule(name, {
whenChanged: [temp, setpoint],
then: function (newValue, devName, cellName) {
  if (dev[temp] > dev[setpoint]) {
dev[TS] = false; log; 
} {
  if (dev[temp] < dev[setpoint]) {
dev[TS] = true; log; 
}}}
});
}
  Termostat("AndreysTEMP", "0x00158d0008ce4986/temperature", "Andreys/temperature", "wb-gpio/EXT2_K11")

При изменении уставки реле переходит только в true, при понижении назад в false не возвращается, что может быть не так?
mosquitto_sub -v -t /devices/wb-gpio/# выдает только переключение в 1 при понижении и повышении уставки

Должно быть так: ‘wb-w1/0x00158d0008ce4986’. Или вы используете не наш драйвер для получения значений с датчиков 1-Wire?
В любом случае, первым делом смотрите, какие значения возвращает dev c теми топиками, которые вы используете в правилах.

это не 1-wire датчики) это zigbee
суть в том что те же самые правила на других контроллерах отрабатывают корректно

В теле правила, при помощи log(…), проверьте все значения, которые приходят в функцию. И типы значений при помощи typeof(…). Вполне возможно (я не знаток Zigbee), что от датчика приходит текст.

вот я тоже так думаю, есть адекватный способ привести значения внутри правила к одному виду, и тут же их отработать?

Есть:

Пардон, прошу помочь) с синтаксисом беда…

Статья как специально для вас написана :grinning::

Там есть пример термостата, на котором все понятно.

Допустим там может быть что то понятно) переиначим вопрос)
почему правило

defineVirtualDevice("Tp4", {
title:"KabZheni",
cells: {
"temperature": {
type:"range",
value: 18,
max: 32
},
}
});
defineRule("Tpf4", {
whenChanged: ["0x00158d00044a1134/temperature", "Tp4/temperature" ],
then: function (newValue, devName, cellName) {
if (dev["0x00158d00044a1134/temperature"] > dev["Tp4/temperature"]) {
dev["RAD"]["K5"] = true;log;
} {
if (dev["0x00158d00044a1134/temperature"] < dev["Tp4/temperature"]) {
dev["RAD"]["K5"] = false;log;
}}}
});

работает корректно, т.е. переключает реле как надо) а точно такое же правило на другом контроллере

defineVirtualDevice("Andreys", {
title:"Andreys",
cells: {
"temperature": {
type:"range",
value: 18,
max: 32,
min: 18
},
}
});


defineRule("Andreis", {
whenChanged: ["0x00158d0008ce4986/temperature", "Andreys/temperature"],
then: function (newValue, devName, cellName) {
  if (dev["Andreys/temperature"] < dev["0x00158d0008ce4986/temperature"]) {
dev["wb-gpio"]["EXT2_K11"] = false; log; 
} {
  if (dev["Andreys/temperature"] > dev["0x00158d0008ce4986/temperature"]) {
dev["wb-gpio"]["EXT2_K11"] = true; log; 
}}}
});
``` не переключает) точнее при любом изменении уставки или температуры на датчике реле включается и все, назад в выключенное не возвращается при снижении уставки

А точно ли сравниваете одинаковые типы данных?

Да вроде бы да, подскажите как точно проверить?

Вот так:

log('value=' + dev["Andreys/temperature"] + '    type=' + typeof dev["Andreys/temperature"]);

можно проверить все переменные и их типы, которые вы используете.
Вставьте перед проверкой условия проверку на значение и тип каждой переменной, которую используете. И сразу станет понятно, что происходит.
.

крутяк)) оказывается значение датчика object…

|22-08-2023 13:09:25.585|INFO: [rule info] value=null type=object|
|22-08-2023 13:09:21.224|INFO: reloading file: /etc/wb-rules/Andrey.js|
|22-08-2023 13:08:22.826|INFO: [rule info] value=22 type=number|

и значение датчика почему NaN?)

/devices/0x00158d0008ce4986/controls/temperature	25.23