MQTT топик от внешнего устройства

Добрый день!

На брокере Вайрена снаружи создаю топик. MQTT-эксплорером вижу его: /devices/Zoneminder/
Вижу и изменения, которые туда пихает Зонмайндер:

{"eventtype":"event_start",
"hookvalue":"0",
"name":"Kalitka:(2213) [s] detected:person:98% car:85% Pavel:100%  Motion All",
"state":"alarm",
"detection":{
          "frame_id":"snapshot",
          "confidences":[
                0.982242405414581,
                0.853657364845276,
                0.597786426544189,
                1],
           "image_dimensions":{
                 "resized":[450,800],
            "original":[720,1280]},
            "boxes":[[5,60,311,448],
                    [532,178,626,256],
                    [738,178,800,258],
                    [113,98,181,166]],
            "labels":
                   ["person","car","car","Pavel"]},
           "eventid":"2213","monitor":"2"}

Но не вижу его в гуях Вайрена. А скриптом увижу? Где вообще почитать (в смысле документацию)?
Вот это про мою тему, но мне не нужен KNX. Как быть?
Спасибо!

Конкретизируюсь:

Для создания полноценного топика надо прочитать конвенцию про это. Вопросы:

  1. Если создать топик “изнутри”, т.е. правилом WB, снаружи оно будет нормально воспринимать данные?
  2. Как правильно разобрать получаемое сообщение? Создать виртуальный объект с примитивами из json?
1 лайк

да. В общем для производного топика необходимым является “type”.

Но это не лучший путь, можно просто подписаться из правил на произвольный(или группу) по любому пути, не обязательно соответствующие конвенциии. Существует специальный способ trackMqtt
Возвращает как путь к изменившемуся топику так и новое значение.
Дополнения, отличающие wb-rules от JS описаны тут: GitHub - wirenboard/wb-rules: Rule engine for Wiren Board

Как я понимаю - получен уже объект. С ним не получается работать?

Какой кстати версии ZM?

1 лайк

Добрый день!

  1. Я замучился подправлять zmeventnotification.pl, чтобы получить нужный топик в нужном месте. Но это вопроса не решило, т.к. прилетает содержимое типа того, что в начале темы. Покурю в ссылку, может, получится что-нибудь.
  2. ZM 1.36.13. EventServerd в пятницу только с гита. Всё это на VM на Proxmox. При обучении память и ядра лопает знатно. GPU ещё не пробовал прокинуть в неё.

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

Да можно, но лень и хочется феншуя :slight_smile:

Нет счастья в жизни.
Если я начинаю проверять топик /zoneminder#, то время от времени:

ERROR: [wbgo_mqtt] MQTT token wait timeout: *mqtt.SubscribeToken (&{{{{0 0} 0 0 0 0} 0x9e1380 } [/zoneminder#] map[] 1325})

и постоянно:

WARNING: [wbgo_mqtt] MQTT connection lost: write tcp 127.0.0.1:38904->127.0.0.1:1883: write: broken pipe

Если /devices/3, например, то просто тишина в эфире. Что-то я делаю не так…

Со стороны брокер вот такой:

А чем проверяете? TrackMqtt?

Верно будет /devices/3/#

Привет!

  1. MQTTexplorer в данном скриншоте под Ubuntu
  2. Варнинги и другие ахтунги цитировал из messages в /var/log/
  3. За тройкой никакого ветвления нет с точки зрения публикующего устройства…

Надо в конфиге /etc/mosquitto/mosquitto.conf поменять persistence true на persistence false
Затем перезапустить контроллер.
Ну и для полного порядка после перезагрузки удалить /mnt/data/var/lib/mosquitto/mosquitto.db

А оно ж есть…

Да, в скриншоте есть, факт :slight_smile:
Завтра дотерзаю

Доброе утро!
Заклинание

Надо в конфиге /etc/mosquitto/mosquitto.conf поменять persistence true на persistence false
Затем перезапустить контроллер.
Ну и для полного порядка после перезагрузки удалить /mnt/data/var/lib/mosquitto/mosquitto.db

Ни на что не повлияло. Как только

trackMqtt("/devices/3/controls/#"

совпадает с тем, что прилетает от ZM, начинается Ошибка записи файла: MQTT RPC request timed out MqttTimeoutError в вэб-интерфейся и всякие спецэффекты, описанные ранее.

Значит, предположение неверно, восстанавливать настройки в конфиге брокера не надо.

Тут слегка непонятно… trackMqtt как хук, создается один раз.
пример можно посмотреть тут: Сообщение при отключении или неисправности в Telegram - #3 от пользователя BrainRoot

Спасибо, сработало. Парсить строку, или есть путь проще?

> 2022-04-07 18:42:40name: /devices/3/controls, value: {"eventtype":"event_start","hookvalue":"0","detection":{"boxes":[[340,128,628,448],[411,147,467,204]],"frame_id":"snapshot","labels":["person","Pavel"],"confidences":[0.936543047428131,1],"image_dimensions":{"original":[1080,1920],"resized":[450,800]}},"monitor":"3","state":"alarm","name":"TR-D8123ZIR3:(7944) [s] detected:person:94% Pavel:100% Motion All","eventid":"7944"} 
> 2022-04-07 18:42:45name: /devices/3/controls, value: {"eventid":"7944","detection":[],"hookvalue":0,"eventtype":"event_end","monitor":"3","name":"Ended:TR-D8123ZIR3:(7944) Motion: All","state":"alarm"}

Самому парсить - не надо:

//https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
var text = '{"eventtype": "event_start", "hookvalue": 0}'
log.info (JSON.parse(text))

Возвращается объект, к его элементам можно по именам обращаться.

ЗЫ движок форма кавычки испортил, поэтому для примера пару элементов взял.

1 лайк

В общем, работает это так:

> trackMqtt("Zoneminder/#", function(message){	//Эта фигня самостоятельна и работает без всяких возбудителей типа whenChanged и таймеров
> foo = JSON.parse(message.value)					//Распарсиваем содержимое в содержательной части и пихаем в некий 'foo'
>     dev["ZM/topic"] = message.topic;			//Часть содержимого, где про топик (помним, что путь к топику заканчивается #)
>     dev["ZM/monitor"] = foo["monitor"];			//Достаём из message.value значение 'monitor'
>     dev["ZM/eventtype"] = foo["eventtype"];		// -**- 'eventtype'
>     dev["ZM/eventid"] = foo["eventid"];
>     dev["ZM/detection"] = foo["name"];
>     dev["ZM/detected"] = foo["detection"]["labels"][((foo["detection"]["labels"].length)-1)]; //ZM отдаёт результаты опознания в виде массива, см. начало темы. Мы получаем кол-во элементов вещественным числом, а нумерация начинается с нуля. Поэтому вычитаем 1 и вынимаем последний элемент.
> });

Вот. Отчитался.
Но с точки зрения контроля доступа -лажа.
Потому, что выходя нельзя поворачиваться к вызывной панели лицом. Оно тут же откроет дверь…
Придётся добавлять голос.

1 лайк

Хм. Запретить правилом открывать дверь если она только что была открыта разве что?

Просто добавлю голос. Вызывная панель в режиме камеры отдаёт серверу звук тоже. Раз уж всё равно пришлось GPU в ZM втыкать - пусть анализирует. По результатам могу доложиться.

1 лайк

Так, голос - понятно, можно завести на ZM, хотя я давненько не обновлял его, не испоьзовал аудио. А как наличие голоса тут поможет, не пойму.

Планирую прикрутить что-то типа vosk для распознавания голоса. Ну и открывать, если совпала узнаваемая морда и голосовая команда.