Правило из примера

Добрый день,

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

var motion_timer_1_timeout_ms = 30 * 1000;
var motion_timer_1_id = null;

defineRule("motion_detector_1", {
    whenChanged: "wb-gpio/D2_IN",
    then: function (newValue, devName, cellName) {
        if (newValue) {
            dev["wb-gpio/Relay_1"] = true;
            if (motion_timer_1_id) {
                clearTimeout(motion_timer_1_id);
            }
            motion_timer_1_id = setTimeout(function () {
                dev["wb-gpio/Relay_1"] = false;
                motion_timer_1_id = null;
            }, motion_timer_1_timeout_ms);
        }
    },
});

поменял только имя датчика и реле.
но как выяснилось правило не работает, точнее оно срабатывает как на движение так и на отсуствие движения

т.е. при появлении движения все ОК, и если таймер отключается раньше чем датчик переходит в false то при следующем переходе датчика в false опять реле включается на заданное время.

как только не пробовал - не работает
подскажите как поправить скрипт из примера чтоб он отрабатывал только когда датчик меняет статус false на true не срабатывал при переходе c true на false

заранее спасибо

PS: датчик меняет true на false через 90 сек после последнего зафиксированного движения, и если в скрипте стоит отключение через, например час, то вроде как все работает исправно. просто не замечается переход обратно на false, но нужно раньше чем через 90 секунд свет выключить
т.е. свет выключить до того как датчик движения сменит свое состояние на false.

Добрый день!
А какое значение приходит в newValuе у вашего датчика, когда срабатывает whenChanged:, можете вывести в лог его значение (перед if (newValue))?

как это сделать?
тоже задумался как посмотреть значения переменных…

if (!newValue) {

пробовал так, ожидал что при true срабатывать не будет а при false сработает, но нет, не срабатывало ни при true ни при false
видимо действительно что-то с переменной, но как ее посмотреть…

в MQTT, в настройках, значения высвечиваются true и false

Вывести можно с помощью log и смотреть в окно отладки, которое открывается по нажатию на значок с гаечным ключом в правой нижней части окна.
У меня есть подозрение, что от датчика приходят не булевые true и false, а строковые, а if('непустая строка') всегда true.

Вот такой командой вы сможете вывести и содержимое newValue, и ее тип:

log("Значение newValue: {}; тип: '{}'", newValue, typeof newValue);

так, и если это строковые значения как должно выглядеть условие?

Если строка, то, соотвтетственно, как сравнение со строкой: if (newValue == "true") { ... }

Добрый день,
все так как Вы сказали
тип строка

спасибо

Замечательно! Удачи вам!