WB-RULES и обработка обрыва на линии


#1

боДрый день!

Есть ли возможность определить для конкретного устройства в wb-rules наличие ошибок, например в виде dev[“msw2_10”][“CO2”][“error”] ?


#2

Нет, движок правил не отслеживает такие топики. Только внешний скрипт, который будет в топик виртуального устройства что-то записывать, при появлении meta/error


#3

А можно из движка правил почитать топик?


#4

Zeta, смотрите, могу порекомендовать относительно “костыльный” вариант. Кажется, он решает ваши проблемы.

Из движка правил вы можете вызывать внешние программы через runShellCommand, в том числе mosquitto_sub, а затем парсить вывод (см. https://github.com/contactless/wb-rules)
С этой утилитой (mosquitto_sub) есть проблема – у нее нет таймаутов. Если сообщения в топик не публикуются, она будет висеть и ничего не возвращать. Поэтому таймаут надо задавать извне, например, так:

timeout 1s mosquitto_sub -C 1 -v -t "/devices/wb-adc/controls/Vin"

Ключ “-С x” – получить x сообщений и завершить работу.

Еще у нас есть пакет wb-mqtt-timestamper (https://github.com/contactless/wb-mqtt-timestamper)
Он публикует таймстемпы для всех топиков, на которые он подписан, в виде мета-тегов:

/devices/wb-adc/controls/5Vout/meta/ts 1550661751

То есть как только публикуется сообщение в топик, удовлетворяющий шаблону, wb-mqtt-timestamper дополнительно публикует временную метку.

Устанавливается командой apt-get install wb-mqtt-timestamper
Шаблон настраивается в файле /etc/defaults/wb-mqtt-timestamper

Будьте осторожны с метасимволом ‘#’, чтобы не подписаться на сообщения самого wb-mqtt-timestamper!


#5

Да, довольно костыльно. Но спасибо за идею, может пригодится.
Думаю, напишем свой модуль для обработки ошибок.