Ошибка "...incomplete cell encountered: occupancy"

Добрый день
Есть датчик движения Xiaomi RTCGQ01LM, подключенный через модуль расширения ZigBee как устройство “ms1”, в веб-интерфейсе и через подписку mosquitto_sub отслеживается изменение топика occupancy (наличие движения), но через движок wb-rules этот топик не читается и правила на его основе не срабатывают (“whenChanged” просто не работает, “when” в отладку выдаёт “…incomplete cell encountered: occupancy”), есть способы отладить работу с этим топиком в wb-rules?

Устройство в веб-интерфейсе

image

mosquitto_sub

image

Правила wb-rules

Здравствуйте!
Напишите, пожалуйста, больше информации. Какая у вас аппаратная версия контроллера, какую версию пакета wb-rules используете? Как создается окно устройства, с помощью правил?

Опишите как осуществляется отслеживание изменений топика, пришлите правило, чтобы попробовать воспроизвести.

Какая у вас аппаратная версия контроллера, какую версию пакета wb-rules используете?

Аппаратная версия 6.6.0, версия wb-rules 2.6.3

image
image

Как создается окно устройства, с помощью правил?

Нет, устройство создаётся не через правила, а автоматически, вероятно мостом 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 дней после последнего ответа. В ней больше нельзя отвечать.