Почему данные с датчиков не обновляются?

Добрый день!
Есть код термостата. Отрабатывает включение и выключение правильно.
Данные в mqtt меняются (считываются нормально), но в веб интерфейсе(не меняются как будто один раз считались и все), хотя сам цикл включения и выключения термостата при изменение температуры работает.
Посмотрите, что я не правильно сделал.

defineVirtualDevice("Termostat", {
    title: "Управление теплом",
    cells: {
      // =============== Прихожая теплый пол
      "Рубильник": {//режим 0-выключить 1-включить отопление
	    type: "switch",
	    value: false,
	    },
      "Терморегулятор": {//регулятор температуры
	    type: "range",
	    value: 20,
        max: 30,
        min: -10,
        readonly: false
	    },    
      "DHT21": {//данные с nodemcu DHT21 
	    type: "text",
	    value: dev["node-rele-dht/room_temperature"],
	    },
        "Zigbee": {//данные с zigbee temper
	    type: "temperature",
	    value: dev["temper/temperature"]
	    }        
    }  
 } 
);


var DHT = "node-rele-dht/room_temperature"; // данные температуры DHT21
var hysteresis = 1.5; // разница температуры для предотвращения щелканья реле из за изменения каждого градуса
var rubilnik = "Termostat/Рубильник"; // статус выключателя вкл иои выкл
var status_rele = "Button_left/Ночник"; // статус реле вкл иои выкл
defineRule( {    
  whenChanged: DHT,
  	then: function (newValue, devName, cellName) {
     //SendTelegramMsg(dev[DHT]); 
      // если рубильник включен и реле выключено то проверить температуру 
       if (dev[status_rele] == false && dev[rubilnik] == true ){  
         // Если температура датчика ниже чем на терморугуляторе то включить реле
        if (dev[DHT] < dev["Termostat/Терморегулятор"]-hysteresis ) {
       		publish("zigbee2mqtt/0x00158d0002a18ff7/set", JSON.stringify({ state_right: "ON" }), 2, false);
      			SendTelegramMsg("отопление включено" +"__" + dev[DHT] + " " + dev["actual_date/date"] ); 
        //  dev["Button_left/Спальня"] = true;
        log.info(newValue);
        } 
         // Если температура датчика выше чем на терморугуляторе то выключить реле
  		if (dev[DHT] > dev["Termostat/Терморегулятор"]+hysteresis ) {
  		     publish("zigbee2mqtt/0x00158d0002a18ff7/set", JSON.stringify({ state_right: "OFF" }), 2, false);
      			 SendTelegramMsg("отопление выключено" +" " + dev[DHT] + "__" + dev["actual_date/date"]); 
        //  dev["Button_left/Спальня"] = true;
  			 }
       }; 
      // если рубильник включен и реле включено то проверить температуру 
     if (dev[status_rele] == true && dev[rubilnik] == true ){ 
     // Если температура датчика выше чем на терморугуляторе то выключить реле
  	if (dev[DHT] > dev["Termostat/Терморегулятор"]+hysteresis ) {
       publish("zigbee2mqtt/0x00158d0002a18ff7/set", JSON.stringify({ state_right: "OFF" }), 2, false);
    	   SendTelegramMsg("отопление выключено" +"__" + dev[DHT] + "__" + dev["actual_date/date"]); 
        //  dev["Button_left/Спальня"] = true;       
      		  }
     	};
    }
} 
)};



`Данные выведенные на термостат

![image|586x301](upload://4H9azAOlUKLAT4JQkeQEuzgyNNP.png)



Данные с температурных датчиков

![image|690x263](upload://kKRrsKYMxZ1raMmmeyp4PUQqFIq.png)

Добрый день.
А чем (каким правилом) должны изменяться топики?

Один датчик это устройство nodemcu с подключенным датчиком DHT21
Второе это температурный датчик zigbee
Я прописал вот так, думал он напрямую считывает с mqtt

 "DHT21": {//данные с nodemcu DHT21 
	    type: "text",
	    value: dev["node-rele-dht/room_temperature"],
	    },
        "Zigbee": {//данные с zigbee temper
	    type: "temperature",
	    value: dev["temper/temperature"]
	    } 

Видимо это не так?

Не так.

читается, естественно, один раз при создании устройства. Такой подход можно использовать для задания начального значения.
То есть dev[“node-rele-dht/room_temperature”] просто разрешается в значение (текущее).
Для того чтобы оно изменялось - нужно правило (хук) которое будет реагировать на изменение топика и обновлять его.

Вот, кстати, хороший подход при написании чего угодно - не хардкодить в скрипте наименования, задавать их переменными. То есть то же самое можно записать где-то в начале:

var temperatureInValueDev = "node-rele-dht/room_temperature";

а потом использовать как

dev[temperatureInValueDev]

Спасибо. Я уже догадался, после вашего предыдущего комментария. Буду переписывать. ))

1 лайк