Добрый день
Есть датчик движения Xiaomi RTCGQ01LM, подключенный через модуль расширения ZigBee как устройство “ms1”, в веб-интерфейсе и через подписку mosquitto_sub отслеживается изменение топика occupancy (наличие движения), но через движок wb-rules этот топик не читается и правила на его основе не срабатывают (“whenChanged” просто не работает, “when” в отладку выдаёт “…incomplete cell encountered: occupancy”), есть способы отладить работу с этим топиком в wb-rules?
Здравствуйте!
Напишите, пожалуйста, больше информации. Какая у вас аппаратная версия контроллера, какую версию пакета wb-rules используете? Как создается окно устройства, с помощью правил?
Опишите как осуществляется отслеживание изменений топика, пришлите правило, чтобы попробовать воспроизвести.
Какая у вас аппаратная версия контроллера, какую версию пакета wb-rules используете?
Аппаратная версия 6.6.0, версия wb-rules 2.6.3
Как создается окно устройства, с помощью правил?
Нет, устройство создаётся не через правила, а автоматически, вероятно мостом zigbee2mqtt при появлении данных от устройства
Опишите как осуществляется отслеживание изменений топика, пришлите правило, чтобы попробовать воспроизвести.
Вот такими правилами пытаюсь отладить взаимодействие с устройством через wb-rules:
defineRule("BathroomMove",{
whenChanged: "ms1/occupancy",
then: function (newValue, devName, cellName) {
log.info("BathroomMove = " + dev["ms1"]["occupancy"]);
}
});
defineRule("BathroomMove2",{
when: function() {
return (dev["ms1"]["occupancy"]=="true");
},
then: function (newValue, devName, cellName) {
log.info("BathroomMove = " + dev["ms1"]["occupancy"]);
}
});
getDevice("ms1").controlsList().forEach(function (ctrl) {
log("ctrlID: {}, value: {}".format(ctrl.getId(), dev["ms1"][ctrl.getId()]))
})
Вот что выводится в отладку:
2022-01-02 14:27:55defineRule: BathroomMove
2022-01-02 14:27:55defineRule: BathroomMove2
2022-01-02 14:27:55ctrlID: occupancy, value: null
2022-01-02 14:27:55ctrlID: voltage, value: 3015
2022-01-02 14:27:55ctrlID: battery, value: 100
2022-01-02 14:27:55ctrlID: last_seen, value: 2022-01-02T14:13:36+03:00
2022-01-02 14:27:55ctrlID: linkquality, value: 52
2022-01-02 14:27:55skipping rule due to incomplete cell BathroomMove2: IncompleteCellCaught: incomplete cell encountered: occupancy
Вот что при этом выводит mosquitto_sub -t ‘/devices/ms1/controls/#’ -v:
/devices/ms1/controls/battery 100
/devices/ms1/controls/battery/meta/readonly 1
/devices/ms1/controls/battery/meta/type value
/devices/ms1/controls/battery/meta/order 1
/devices/ms1/controls/last_seen 2022-01-02T14:13:36+03:00
/devices/ms1/controls/last_seen/meta/readonly 1
/devices/ms1/controls/last_seen/meta/type text
/devices/ms1/controls/last_seen/meta/order 2
/devices/ms1/controls/linkquality 52
/devices/ms1/controls/linkquality/meta/readonly 1
/devices/ms1/controls/linkquality/meta/type value
/devices/ms1/controls/linkquality/meta/order 3
/devices/ms1/controls/occupancy false
/devices/ms1/controls/occupancy/meta/order 4
/devices/ms1/controls/occupancy/meta/readonly 1
/devices/ms1/controls/occupancy/meta/type text
/devices/ms1/controls/voltage 3015
/devices/ms1/controls/voltage/meta/type value
/devices/ms1/controls/voltage/meta/order 5
/devices/ms1/controls/voltage/meta/readonly 1
/devices/ms1/controls/battery 100
/devices/ms1/controls/last_seen 2022-01-02T14:30:17+03:00
/devices/ms1/controls/linkquality 49
/devices/ms1/controls/occupancy true
/devices/ms1/controls/voltage 3015
/devices/ms1/controls/battery 100
/devices/ms1/controls/last_seen 2022-01-02T14:30:17+03:00
/devices/ms1/controls/linkquality 49
/devices/ms1/controls/occupancy false
/devices/ms1/controls/voltage 3015
Пока не получается воспроизвести проблему. Попробуйте закомментировать определение правила BathroomMove2, останется ли ошибка? Делайте также и с остальными, чтобы понять, какое правило вызывает ошибку.
Если закомментировать правило BathroomMove2 (и вообще всё остальное, кроме BathroomMove), то указанной в теме ошибки нет, но и не работает ничего, т.е. правило BathroomMove не реагирует на изменение топика “ms1/occupancy”, а код
getDevice("ms1").controlsList().forEach(function (ctrl) {
log("ctrlID: {}, value: {}".format(ctrl.getId(), dev["ms1"][ctrl.getId()]))
})
для контрола “occupancy” всегда выводит “null”, т.е., как я понимаю, wb-rules просто не видит значения этого топика. А есть ещё какие-то способы в wb-rules зачитать значение топика, помимо обращений через dev?
Да, можно использовать команду trackMqtt:
trackMqtt(topic, callback()) подписывается на MQTT с указанным topic'ом, допустимы символы # и + значения передаются в функцию объектом message состоящим из: .topic — путь к топику, значение которого изменилось и .value — новое значение топика:
trackMqtt("/devices/wb-adc/controls/Vin", function(message){
log.info("name: {}, value: {}".format(message.topic, message.value))
});
Через trackMqtt отслеживание топика occupancy работает нормально, хотя проблемы с зачитывания через dev это не решает, но теперь есть варианты работы, спасибо!
Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.