Здравствуйте! Вопрос аналогичен Настройка правильной реакции на MQTT в Rules , но есть отличие. Там это решилось чтением топика /on, но почему-то это не работает в zigbee2mqtt. У меня есть zigbee выключатели, которые шлют тип нажатия, например, single_left. double_right, и так далее.
Мне нужно, чтобы при нажатии срабатывало правило. Но вот такая конструкция не работает:
Рекомендую подписаться на топик данного устройства и проверить, какие данные приходят при нажатии клавиши. После этого можно настроить реакцию на изменения в топике.
Например, жмём один раз на левую клавишу, приходит single_left. Жмём ещё раз - в этот же самый топик приходит то же самое single_left. Между ними нет никакого промежуточного значения, в топике всегда лежит последнее действие. Соответственно, значение топика не меняется в этом случае, а мне нужно выполнять действие при каждом нажатии.
Что-то пока не получается. Вот такой тестовый скрипт у меня:
devTopick="0x54ef441000ee5ba5/action";
defineRule("Switch_action", {
whenChanged: devTopick, //при публикации
then: function (newValue, devName, cellName) { //выполняй следующие действия
log.info("cleaning", newValue)
if (newValue!=null){
dev[devTopick]="";
}
}
});
Но срабатывает как-то через раз, и я даже не могу понять какую-либо зависимость…
Код выглядит корректно, но, судя по логу, значение не изменяется, поэтому правило не срабатывает. Рекомендую подписаться на топик и проверить, как происходит запись. Возможно, пустое значение не успевает записаться, а так как новое значение совпадает с текущим в топике, правило не срабатывает.
@AIbot напиши правильный код чтобы при нажатии срабатывало правило.
Как сделать такое правило, которое будет срабатывать каждый раз при приходе статуса, и не будет срабатывать при перезагрузке rules/mqtt?
Мы в конце прошлого года изменили работу wb-rules - было много жалоб на то, что whenChanged срабатывает при рестарте wb-rules. Теперь, если удалить топик (опубликовать “”), то на первое значение, полученное от драйвера, триггер whenChanged не сработает, что у вас и происходит. В вашем правиле опубликуйте не “”, а другое значение - начнет срабатывать на каждое нажатие. И правилом же отфильтруйте это значение.
А еще лучше - ничего самому не публиковать, а использовать trackMqtt, как вы и делали изначально. Он триггерится на каждую публикацию. А уже в правиле отфильтровать переход из null в актуальное состояние, которое возникает при рестарте wb-rules.