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))
Bei den roborock's sollte Code zu finden sein, um Bild-Daten auf die Platte zu speichern...
Hier: https://forum.fhem.de/index.php/topic,104687.msg986304.html#msg986304
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 ?
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...)
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?
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().
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
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?
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.
hmm naja, das ist ja binär... also wenn ich es mit LOG 1 ausgebe kommt entsprechend nur Müll im Terminal an ...
...würde tippen, dass es erforderlich ist, den "Binärmüll" erst auf einen Datenträger zu schreiben...
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
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?
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.
ok das scheint ja über die Readinglist zu funktionieren, es heisst ja man könne bestimmte MQTT-topics abonnieren , also automatische Benachrichtigungen empfangen ...
ich habe hier eine Readinglist in der alles was ich brauch auftaucht :
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/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:viseron/garage/camera/image:.* image
viseron:homeassistant/camera/garage/latest_thumbnail/config:.* { json2nameValue($EVENT) }
viseron:viseron/garage/camera/latest_thumbnail/image:.* image
viseron:homeassistant/binary_sensor/terrasse_hinten/motion_detected/config:.* { json2nameValue($EVENT) }
viseron:viseron/terrasse_hinten/binary_sensor/motion_detected/state:.* { json2nameValue($EVENT) }
viseron:homeassistant/binary_sensor/terrasse_hinten/object_detected/config:.* { json2nameValue($EVENT) }
viseron:viseron/terrasse_hinten/binary_sensor/object_detected/state:.* { json2nameValue($EVENT) }
viseron:homeassistant/binary_sensor/terrasse_hinten/object_detected_person/config:.* { json2nameValue($EVENT) }
viseron:viseron/terrasse_hinten/binary_sensor/object_detected_person/state:.* { json2nameValue($EVENT) }
viseron:homeassistant/switch/terrasse_hinten/config:.* { json2nameValue($EVENT) }
viseron:homeassistant/camera/terrasse_hinten/config:.* { json2nameValue($EVENT) }
viseron:homeassistant/sensor/terrasse_hinten/status/config:.* { json2nameValue($EVENT) }
viseron:homeassistant/camera/terrasse_hinten/latest_thumbnail/config:.* { json2nameValue($EVENT) }
viseron:viseron/terrasse_hinten/sensor/status/state:.* { json2nameValue($EVENT) }
viseron:viseron/terrasse_hinten/camera/image:.* image
viseron:viseron/terrasse_hinten/camera/latest_thumbnail/image:.* image
Wie man sieht gibt es eben die beiden Cams... wo ich das Bild herkriege weiß ich ja , also muss ich eigentlich nur auf die Events
viseron:viseron/garage/binary_sensor/object_detected/state
oder eben
viseron:viseron/terrasse_hinten/binary_sensor/object_detected/state:.*
reagieren.... dazu muss man sie Abonieren?
Haben da mehrere Clients dieselbe Client-ID? Dann bitte so ändern, dass jedes Geräte eine eigene hat.
hmm naja das ist ja ein NVR , der verbindet sich mit dem FHEM MQTT Server , der NVR hat 2 CAMs konfiguriert... aber die Client-ID ist für den NVR , also hat er auch nur eine
die unterschiede müssten die Pfade , in denen ja die Namen der CAMs codiert sind kommen :
{client_id}/{mqtt_name from camera config}/sensor/status/state
Ich sehe ja auch in der Readinglist, dass die da sind, ich verstehe nur nicht wie das mit dem Abonieren funktionieren soll, sodass man drauf reagieren kann ...
Ah, ok. Dann wäre mein Vorschlag, pro cam je eine MQTT2_device-Instanz einzurichten.
ja kling gut, mir ist nur nicht klar, wie ich zwei Instanzen so anlege, dass die Daten jeweils dann in die Richtige laufen... aktuell schreibt fhem ja alles in eine Instanz...
hier mal das Listing des Devices...
Internals:
CFGFN
CID viseron
DEF viseron
DEVICETOPIC MQTT2_viseron
FUUID 6162fc08-f33f-c4df-4047-272632788c94034c
IODev MQTT2_FHEM_Server
LASTInputDev MQTT2_FHEM_Server
MQTT2_FHEM_Server_MSGCNT 194
MQTT2_FHEM_Server_TIME 2021-10-10 16:46:49
MSGCNT 194
NAME MQTT2_viseron
NR 2786
STATE on
TYPE MQTT2_DEVICE
READINGS:
2021-10-10 16:43:20 IODev MQTT2_FHEM_Server
2021-10-10 16:45:23 attributes_count 1
2021-10-10 16:45:33 attributes_last_recording_end 2021-10-10T16:45:33.540045
2021-10-10 16:45:33 attributes_last_recording_start 2021-10-10T16:45:23.439796
2021-10-10 16:46:49 attributes_objects_1_confidence 0.723
2021-10-10 16:46:49 attributes_objects_1_label person
2021-10-10 16:46:49 attributes_objects_1_rel_height 0.346
2021-10-10 16:46:49 attributes_objects_1_rel_width 0.115
2021-10-10 16:46:49 attributes_objects_1_rel_x1 0.8700000047683716
2021-10-10 16:46:49 attributes_objects_1_rel_x2 0.9850000143051147
2021-10-10 16:46:49 attributes_objects_1_rel_y1 0.18199999630451202
2021-10-10 16:46:49 attributes_objects_1_rel_y2 0.527999997138977
2021-10-10 16:44:13 attributes_objects_2_confidence 0.5
2021-10-10 16:44:13 attributes_objects_2_label person
2021-10-10 16:44:13 attributes_objects_2_rel_height 0.564
2021-10-10 16:44:13 attributes_objects_2_rel_width 0.151
2021-10-10 16:44:13 attributes_objects_2_rel_x1 0.5299999713897705
2021-10-10 16:44:13 attributes_objects_2_rel_x2 0.6809999942779541
2021-10-10 16:44:13 attributes_objects_2_rel_y1 0.20100000500679016
2021-10-10 16:44:13 attributes_objects_2_rel_y2 0.7649999856948853
2021-10-10 16:45:23 image ����JFIF��C (noch viel mehr Bild-binär-müll)
2021-10-10 16:43:20 lwt alive
2021-10-10 16:46:49 state on
Attributes:
readingList viseron:viseron/lwt:.* lwt
viseron:viseron/terrasse_hinten/binary_sensor/motion_detected/state:.* { json2nameValue($EVENT) }
viseron:viseron/terrasse_hinten/binary_sensor/object_detected/state:.* { json2nameValue($EVENT) }
viseron:viseron/terrasse_hinten/binary_sensor/object_detected_person/state:.* { json2nameValue($EVENT) }
viseron:viseron/garage/binary_sensor/motion_detected/state:.* { json2nameValue($EVENT) }
viseron:viseron/garage/binary_sensor/object_detected/state:.* { json2nameValue($EVENT) }
viseron:viseron/garage/binary_sensor/object_detected_person/state:.* { json2nameValue($EVENT) }
viseron:viseron/terrasse_hinten/sensor/status/state:.* { json2nameValue($EVENT) }
viseron:viseron/garage/sensor/status/state:.* { json2nameValue($EVENT) }
viseron:viseron/terrasse_hinten/camera/latest_thumbnail/image:.* image
viseron:viseron/garage/camera/latest_thumbnail/image:.* image
room MQTT2_DEVICE
man sieht schon unten in der Readinglist das die beiden thumbnails jeweils nach CAM unterschiedliche Pfade haben...
Ein Weg ist in #14 beschrieben.
Zitat von: lynckmeister am 10 Oktober 2021, 16:50:50
ja kling gut, mir ist nur nicht klar, wie ich zwei Instanzen so anlege, dass die Daten jeweils dann in die Richtige laufen... aktuell schreibt fhem ja alles in eine Instanz...
Entweder mit "bridgeRegexp" beschäftigen oder halt manuell sortieren. Etwa so:
attr MQTT2_viseron readingList viseron/lwt:.* lwt\
homeassistant/.*/config:.* { }\
viseron/garage/binary_sensor/motion_detected/state:.* { json2nameValue($EVENT,'motion_') }\
viseron/garage/binary_sensor/object_detected/state:.* { json2nameValue($EVENT,'object_') }\
viseron/garage/binary_sensor/object_detected_person/state:.* { json2nameValue($EVENT,'person_') }\
viseron/garage/sensor/status/state:.* { json2nameValue($EVENT) }
viseron/garage/camera/image:.* image\
viseron/garage/camera/latest_thumbnail/image:.* tn_image
defmod MQTT2_viseron_2 MQTT2_DEVICE
attr MQTT2_viseron_2 readingList viseron/terrasse_hinten/binary_sensor/motion_detected/state:.* { json2nameValue($EVENT,'motion_') }\
viseron/terrasse_hinten/binary_sensor/object_detected/state:.* { json2nameValue($EVENT,'object_') }\
viseron/terrasse_hinten/binary_sensor/object_detected_person/state:.* { json2nameValue($EVENT,'person_') }\
viseron/terrasse_hinten/sensor/status/state:.* { json2nameValue($EVENT) }\
viseron/terrasse_hinten/camera/image:.* image\
viseron/terrasse_hinten/camera/latest_thumbnail/image:.* tn_image
Zur Erläuterung: die "homeassistant"-config-Infos sind völlig irrelevant für FHEM, die werden durch das erste Device abgefangen und sind dann weg (sollte eigentlich eine ignoreRegepx am IO machen). Da vermutlich viele Infos in den JSON gleich/ähnlich sind, bekommen die einen Präfix, damit man sieht, wo was herkommt. Muss man dann ggf. noch sortieren, was man wie braucht und kann es ggf. umbenennen.
genauso hat es auch geklappt, sobald man das zweite Device anlegt und die Readinglist einträgt, werden die richtigen Daten in dieses Device geschrieben... vielen Dank auch !