Viseron NVR per MQTT an Fhem anbinden *gelöst*

Begonnen von lynckmeister, 12 Juli 2021, 21:41:35

Vorheriges Thema - Nächstes Thema

lynckmeister

Servus zusammen, ich experimentiere mit den Network Video Recorder Viseron rum, den man per MQTT an zb Fhem (eigentlich Home Assistent) anbinden kann. Viseron bietet mit Deepstack oder Tensorflow eine gute Objekterkennung für die Cams ...
Ich habe also einen MQTT Server in Fhem eingerichtet, und darauf hin hat sich das Device MQTT2_viseron selbst eingerichtet.
in den Readings sehe ich jetzt auch ein "latest" Image von meiner konfigurierten CAM, das per MQTT an Fhem übermittelt wurde.

das sieht so  aus

Internals:
   CFGFN     
   CID        viseron
   DEF        viseron
   DEVICETOPIC MQTT2_viseron
   FUUID      60eac5f0-f33f-c4df-98e7-264d950918b5c506
   IODev      myBroker
   LASTInputDev myBroker
   MSGCNT     719
   NAME       MQTT2_viseron
   NR         702
   STATE      scanning_for_objects
   TYPE       MQTT2_DEVICE
   myBroker_MSGCNT 719
   myBroker_TIME 2021-07-12 21:28:28
   READINGS:
     2021-07-11 12:20:32   IODev           myBroker
     2021-07-12 11:19:41   attributes_count 1
     2021-07-12 11:20:07   attributes_last_recording_end 2021-07-12T11:20:07.704659
     2021-07-12 11:20:07   attributes_last_recording_start 2021-07-12T11:19:41.736507
     2021-07-12 11:19:41   attributes_objects_1_confidence 0.945
     2021-07-12 11:19:41   attributes_objects_1_label person
     2021-07-12 11:19:41   attributes_objects_1_rel_height 0.365
     2021-07-12 11:19:41   attributes_objects_1_rel_width 0.105
     2021-07-12 11:19:41   attributes_objects_1_rel_x1 0.4000000059604645
     2021-07-12 11:19:41   attributes_objects_1_rel_x2 0.5049999952316284
     2021-07-12 11:19:41   attributes_objects_1_rel_y1 0.08799999952316284
     2021-07-12 11:19:41   attributes_objects_1_rel_y2 0.453000009059906
     2021-07-12 21:19:08   availability_topic viseron/lwt
     2021-07-12 21:19:08   command_topic   viseron/garage/switch/set
     2021-07-12 21:19:08   device_identifiers_1 viseron garage
     2021-07-12 21:19:08   device_manufacturer Viseron
     2021-07-12 21:19:08   device_name     viseron garage
     2021-07-12 21:28:28   image           ����JFIF��C 

 $.' ",#(7),01444'9=82<.342��C 

darunter kommt erstmal ne Menge mehr Binzeug ( das Image halt) und dann weitere Readings...
Meine Frage ist jetzt eigentlich wie ich an das Imgage als variable ran komme, um es zb an Telegram zu schicken ...
Ich hab mal ein Notify auf das Viserondevice gesetzt mit einem ReadingsVal auf Image, aber da passiert nicht viel:

define Bewerung_test_ntfy notify MQTT2_viseron:.* set teleBot sendMedia @#haus2021 ReadingsVal("MQTT2_viseron","image",0))



Beta-User

Bei den roborock's sollte Code zu finden sein, um Bild-Daten auf die Platte zu speichern...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

lynckmeister

klingt vielversprechend, ich habe die Funktion mal in die 99_myUtils.pm aufgenommen und die
readinglist ergänzt, die sieht jetzt bei mir so aus :


viseron:viseron/lwt:.* lwt
viseron:homeassistant/binary_sensor/garage/motion_detected/config:.* { json2nameValue($EVENT) }
viseron:viseron/garage/binary_sensor/motion_detected/state:.* { json2nameValue($EVENT) }
viseron:homeassistant/binary_sensor/garage/object_detected/config:.* { json2nameValue($EVENT) }
viseron:viseron/garage/binary_sensor/object_detected/state:.* { json2nameValue($EVENT) }
viseron:homeassistant/binary_sensor/garage/object_detected_person/config:.* { json2nameValue($EVENT) }
viseron:viseron/garage/binary_sensor/object_detected_person/state:.* { json2nameValue($EVENT) }
viseron:homeassistant/binary_sensor/garage/object_detected_pottedplant/config:.* { json2nameValue($EVENT) }
viseron:viseron/garage/binary_sensor/object_detected_pottedplant/state:.* { json2nameValue($EVENT) }
viseron:homeassistant/switch/garage/config:.* { json2nameValue($EVENT) }
viseron:homeassistant/camera/garage/config:.* { json2nameValue($EVENT) }
viseron:homeassistant/sensor/garage/status/config:.* { json2nameValue($EVENT) }
viseron:viseron/garage/sensor/status/state:.* { json2nameValue($EVENT) }
viseron:homeassistant/camera/garage/latest_thumbnail/config:.* { json2nameValue($EVENT) }
viseron:viseron/garage/camera/image:.* image
viseron:viseron/garage/camera/image:.* {valetudo2svg("image",$EVENT,"www/images/viseron_garage.svg")}


Den Weblink entsprechend angepasst aufgenommen :

htmlCode <img src="fhem/images/viseron_garage.svg">


es erscheint aber nur das Platzhalterimage... ich kann nicht sehen was schiefläuft - im log steht nichts , fällt euch was auf ? Wie kann ich das debuggen ?

Beta-User

würde mal auf das Format tippen. Kommt da wirklich ein svg oder was anderes? (evtl. ist der Inhalt der Datei aufschlussreich, in dem kopierten Auszug ist das ggf. falsch encodiert...)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Otto123

Ich hatte nicht gesagt, dass das die Lösung ist. Nur zum Verständnis: bei valetudo ging es um png Daten - die wandeln in svg und anzeigen.

Eigentlich musst Du doch "nur" den Teil (es ist wahrscheinlich jpg als Bild ?) zum speichern nehmen?  Also Datei auf, Daten rein, Datei schließen, angucken. Hab da leider auch nichts auf die Schnelle parat...

Da war mein Link vielleicht unüberlegt?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

Zitat von: Otto123 am 13 Juli 2021, 10:53:48
Da war mein Link vielleicht unüberlegt?
M.E. passt das schon, es ist einfach eine Option, wie man es machen kann bzw. was man alles machen kann, und ich wollte nur mobil nicht suchen...

Zitat von: Otto123 am 13 Juli 2021, 10:53:48
Eigentlich musst Du doch "nur" den Teil (es ist wahrscheinlich jpg als Bild ?) zum speichern nehmen?  Also Datei auf, Daten rein, Datei schließen, angucken. Hab da leider auch nichts auf die Schnelle parat...
Kann man auch mit FHEM-Bordmitteln machen: FileWrite().
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Otto123

Zitat von: Beta-User am 13 Juli 2021, 10:58:14
Kann man auch mit FHEM-Bordmitteln machen: FileWrite().
Aber Achtung: nicht das die Bilder alle in der configDb landen :) https://wiki.fhem.de/wiki/DevelopmentModuleAPI#FileWrite
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

lynckmeister

Also ich komme nochmal darauf zurück ...
habe das JPG aus dem über MQTT angelegten Device nun mit Readingsval ausgelesen und in ein File geschrieben, Das JPG kann ich problemlos im Viewer ansehen, scheint also vom Format her zu passen. Wenn ich das JPG aber versuche an den Telebot zu sehen (was ja eigentlich mein Case ist ) dann bekomme ich eine Fehlermeldung im Log.
Hier mein Aufruf:

mytest:on  {
my $a = ReadingsVal("MQTT2_viseron","image",0);
fhem"set teleBot sendImage @#meineGruppe1 $a";

}


Im Log wird dann das ganze Bild ausgegeben ( Binärmüll) , mit einer Menge "Unknown command" vorangestellt - und zwischenzeitlich meldet sich auf der Telegrambot:
teleBot: resulted in Callback returned error :Bad Request: strings must be encoded in UTF-8: from SendIt

Muss ich das noch irgendwie im Format umschreiben?




Otto123

#9
poste mal die Ausgabe von:
{ReadingsVal("MQTT2_viseron","image",0)}

Weil
ZitatsendImage|image [ @<peer1> ... @<peerN>] <file> [<caption>]
Sends a photo to the given peer(s) or if ommitted to the default peer. File is specifying a filename and path to the image file to be send. Local paths should be given local to the root directory of fhem (the directory of fhem.pl e.g. /opt/fhem). Filenames with special characters (especially spaces) need to be given with url escaping (i.e. spaces need to be replaced by %20). Rules for specifying peers are the same as for messages. Multiple peers are to be separated by space. Captions can also contain multiple words and do not need to be quoted.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

lynckmeister

hmm naja, das ist ja binär... also wenn ich es mit LOG 1 ausgebe kommt entsprechend nur Müll im Terminal an ...

Beta-User

...würde tippen, dass es erforderlich ist, den "Binärmüll" erst auf einen Datenträger zu schreiben...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Otto123

Es mit LOG 1 auszugeben war nicht die Aufgabe, aber wenn in dem Reading Binärmüll steht, hast Du auch "Müll" erzählt und die Doku nicht verstanden!
Zitathabe das JPG aus dem über MQTT angelegten Device nun mit Readingsval ausgelesen und in ein File geschrieben,
Du musst es wirklich tun! Also eine Datei schreiben und den Dateinamen übergeben!
ZitatFile is specifying a filename and path to the image file to be send
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

lynckmeister

Gut ich machs auch so, so funktioniert es wunderbar:

MQTT2_viseron:image.*  {

my $a = ReadingsVal("MQTT2_viseron","image",0);
open (DATEI, ">mynotify.jpg") or die "Couldn't open file: $!";
print DATEI $a;
close (DATEI);

fhem"set teleBot sendImage @#gruppe /opt/fhem/mynotify.jpg";


}



Allerding hab ich noch ein MQTT Problem, durch Viseron wird mir das MQTT2_viseron device automatisch angelegt...
darin gibt es ja wie oben zu sehen auch das image reading. Jetzt verwende ich zwei CAMs und hätte erwartet, dass idealerweise ein Device pro CAM angelegt wird, wird aber nicht. Laut Viseron wird das Image immer im Messagepfad mit dem Cameranamen eindeutig angegeben : {client_id}/{mqtt_name from camera config}/camera/image
Jetzt fällt mir aber auf, dass ich zwar ein neues Bild bekomme (auf das ja mein Notify auch reagiert) aber da ist halt mal das Bild der einen Cam drin und dann das Bild der anderen. Die aneren Readings werden teilweise garnicht gesetzt. Während also das bild von der Terrasse reinkommt, bleibt das Reading "Device Name" unverändert auf "GarageCam"

Ich gehe nicht davon aus, dass es ein Viseronfehler ist -kann ich meine MQTT Devices irgendwie anders konfigurieren?

TomLee

#14
Ich hab auch noch nicht alles verstanden, wenn du die viseron: in den readingList-Einträgen rausnimmst und die DEF zu irgend etwas anderem änderst, ändert sich dann das Verhalten und es wird für die zweite Cam ein zweites Device automatisch erstellt ?

edit:

die Topics der zweiten Cam müssen natürlich aus dem ersten Device auch raus.