Добрый день!
Не могу понять почему значение устройства инверсное относительно того что есть на самом деле (в интерфейсе).
Есть виртуальное устройство, которое должно управлять реле WBIO-DO-R10A-8,
определяю правило которое при нажатии и отпускании кнопки меняет значение реле:
dev[“wb-gpio”][“EXT2_R3A3”] = !dev[“wb-gpio”][“EXT2_R3A3”];
Ожидаю что если реле включено, то его значение ==true, а в логе получаю false
defineRule(“MasterSwitch1”, { //реагируем на виртуальную кнопку
whenChanged: “master_switches/LongTimeAway”,
then: function (newValue, devName, cellName) { if (!newValue){
log.info(“R3A3 before”, newValue, dev[“wb-gpio”][“EXT2_R3A3”]);
dev[“wb-gpio”][“EXT2_R3A3”] = !dev[“wb-gpio”][“EXT2_R3A3”]; log(“Master switch <> switched to {}”,dev[“wb-gpio”][“EXT2_R3A3”]);
log.info(“R3A3 after”, newValue, dev[“wb-gpio”][“EXT2_R3A3”]);
}}
});
вывод в лог:
2021-09-28 21:33:18R3A3 before false false
2021-09-28 21:33:18Master switch <> switched to false
2021-09-28 21:33:18R3A3 after false false
После переключения статуса реле, например, в true, движок правил wb-rules записывает новое значение в топик /on состояния выхода, затем драйвер wb-mqtt-gpio включает соответствующий канал реле и потом обновляет значение в топике состояния выхода в соответствии с его реальным состоянием. Только после этого можно проверять изменения статуса реле. Если проверять состояние выхода в правилах сразу после его изменения, то мы обычно получаем предыдущее значение, так как драйвер не успевает так быстро переключить реле чтобы уже в следующей строке его статус изменился.
Для корректного получения статуса его нужно запрашивать с небольшой паузой. Например, так: