Hauptmenü

YI Kamera integrieren

Begonnen von lukasbastelpeter, 03 September 2020, 17:30:24

Vorheriges Thema - Nächstes Thema

hydrotec

Hallo an alle Interessierten,
die eine Möglichkeit suchen, um den von einer Kamera zur Verfügung gestellten rtsp-stream in ein video-file zu exportieren.

Mit nur einer Kamera kann man es über scripts lösen,
doch wenn man mehrere Kameras hat, besteht die Schwierigkeit die richtige Aufnahme zu stoppen.

Die folgende Funktion arbeitet ohne scripts.
Vorraussetzung ist ein installiertes ffmpeg auf dem System,
und ein mit Schreibrechten versehenes Aufnahmeverzeichnis.

Der hier vorgestellte code ist nicht perfekt, ein Profi würde das eventuell anders gestalten.
(Wenn jemand Verbesserungsvorschläge hat wie man die Funktion einfacher, oder besser umsetzen kann, gerne her damit)
Doch generell funktioniert das Ganze, hab ich mit zwei Kameras getestet, bzw. am laufen.


Ok, dann versuche ich mal die Funktion zu beschreiben.
Sollte etwas unklar sein, Rückfragen sind erwünscht.

Zuerst braucht man ein device welches das motion der Kamera erkennt, um darauf reagieren zu können.
Vermutlich wird es bei den meisten Kameras über MQTT/MQTT2 umgesetzt.
Prinzipiell ist es egal, man benötigt ja nur das event.

Danach noch ein DOIF, welches auf das event reagiert, mit dem Funktionsaufruf erstellen.
(Der trigger muss natürlich auf das vorher angelegte device der Kamera angepasst werden.
([mq_XXX_01:"^motion:.ON$"]) {camera_ffmpeg_XX("$SELF", 'address stream', 'camera name', 'destination', 'duration')}

Beschreibung des Funktionaufrufes:
{camera_ffmpeg_XX(...)} ->  Funktionsbezeichnung
                                              - Muss einmalig sein, da jede Kamera ihre eigene Funktionsbezeichnung benötigt.
                                              - Bspl.: camera_ffmpeg_01, camera_ffmpeg_02, ...
"$SELF"                            ->  Damit die readings in das aufrufende Device geschrieben werden.
'address stream'              ->  Die Adresse unter welcher der rtsp-stream der Kamera aufgerufen werden kann.
                                              - Bspl.: 'rtsp://192.168.178.186:8554/unicast' oder 'rtsp://{USERNAME}:{PASSWORD}\@192.168.178.186:8554/unicast'
'camera name'                 ->  Eine einmalige Bezeichnung
                                             - Am einfachsten den Namen der Kamera welche motion triggert verwenden
                                             - Bspl.: 'mq_XXX_01'
'destination'                     ->  Verzeichnispfad wo die Dateien später landen sollen
                                              - kann ein lokales oder entferntes Verzeichnis sein
'duration'                          ->  Aufnahmedauer in Sekunden



Anschließend noch die im Anhang befindliche "99_myUtils_camera.pm" in das Verzeichnis,
in dem auch die anderen "99_myUtils" Dateien angelegt sind, kopieren.
Entweder direkt kopieren, oder den Inhalt der Datei über die FHEM Oberfläche (Edit files) in eine "99_myUtils" einfügen.
https://wiki.fhem.de/wiki/99_myUtils_anlegen

Jetzt ist noch etwas eigene Arbeit angesagt.
In der angelegten "99_myUtils_camera.pm" MUSS für jede Kamera eine Funktion vorhanden sein.
Heißt, man kopiert den ganzen Block einer Kamera, und passt die Funktion dementsprechend an.
Beispiel:
sub camera_ffmpeg_01 {...}
sub camera_ffmpeg_02 {...}
sub camera_ffmpeg_03 {...}
usw.

Genauso wird für jede Kamera ein DOIF mit dem jeweiligen Funktionsaufruf benötigt.
Beispiel:
{camera_ffmpeg_01(...)}
{camera_ffmpeg_02(...)}
{camera_ffmpeg_03(...)}
usw.

Das war es im Prinzip schon.


Kurzbeschreibung:
Die Kamera triggert das DOIF, ffmpeg wird gestartet, und die PID an fhem übergeben.
Nachdem die eingestellte Dauer abgelaufen ist, wird ffmpeg mit der zugewiesenen PID wieder gestoppt.
Sollte während der laufenden Aufnahme die Kamera erneut triggern, wird die aktuell noch laufende Aufnahme um die eingestellte Dauer verlängert.
Die zugehörige PID bleibt erhalten, auch wenn ein anderes Gerät ffmpeg startet.


Viel Spaß damit
Gruß Karsten



Ein Beispiel wie ich es mit zwei Kameras am laufen habe.

Kamera 1

Device welches motion triggert

defmod mq_dafang_01 MQTT_DEVICE
attr mq_dafang_01 DbLogExclude .*
attr mq_dafang_01 IODev Mosquitto
attr mq_dafang_01 cmdIcon calibrate:recycling up:control_arrow_up left:control_arrow_left right:control_arrow_right down:control_arrow_down
attr mq_dafang_01 event-on-change-reading motion
attr mq_dafang_01 eventMap /vertical up:up/vertical down:down/horizontal left:left/horizontal right:right/calibrate calibrate:calibrate/
attr mq_dafang_01 group zone_hallway_general
attr mq_dafang_01 publishSet brightness:slider,0,1,100 myhome/Dafang_01/brightness/
attr mq_dafang_01 publishSet_auto_night_mode ON OFF myhome/Dafang_01/night_mode/auto/set
attr mq_dafang_01 publishSet_blue ON OFF myhome/Dafang_01/leds/blue/set
attr mq_dafang_01 publishSet_calibrate calibrate myhome/Dafang_01/motors/set
attr mq_dafang_01 publishSet_detection ON OFF myhome/Dafang_01/motion/detection/set
attr mq_dafang_01 publishSet_horizontal left right myhome/Dafang_01/motors/horizontal/set
attr mq_dafang_01 publishSet_ir ON OFF myhome/Dafang_01/leds/ir/set
attr mq_dafang_01 publishSet_ir-cut ON OFF myhome/Dafang_01/ir_cut/set
attr mq_dafang_01 publishSet_motion_tracking ON OFF myhome/Dafang_01/motion/tracking/set
attr mq_dafang_01 publishSet_night_mode ON OFF myhome/Dafang_01/night_mode/set
attr mq_dafang_01 publishSet_reboot ON myhome/Dafang_01/reboot/set
attr mq_dafang_01 publishSet_remount_sdcard ON myhome/Dafang_01/remount_sdcard/set
attr mq_dafang_01 publishSet_rtsp_h264_server ON OFF myhome/Dafang_01/rtsp_h264_server/set
attr mq_dafang_01 publishSet_rtsp_mjpeg_server ON OFF myhome/Dafang_01/rtsp_mjpeg_server/set
attr mq_dafang_01 publishSet_send_mail ON OFF myhome/Dafang_01/motion/send_mail/set
attr mq_dafang_01 publishSet_send_telegram ON OFF myhome/Dafang_01/motion/send_telegram/set
attr mq_dafang_01 publishSet_snapshot ON myhome/Dafang_01/snapshot/set
attr mq_dafang_01 publishSet_vertical up down myhome/Dafang_01/motors/vertical/set
attr mq_dafang_01 publishSet_yellow ON OFF myhome/Dafang_01/leds/yellow/set
attr mq_dafang_01 room 08_Camera->Dafang_01
attr mq_dafang_01 stateFormat Motion: motion - am: motion_timestamp
attr mq_dafang_01 subscribeReading_auto myhome/Dafang_01/night_mode/auto
attr mq_dafang_01 subscribeReading_blue myhome/Dafang_01/leds/blue
attr mq_dafang_01 subscribeReading_brightness myhome/Dafang_01/brightness
attr mq_dafang_01 subscribeReading_data myhome/Dafang_01/*
attr mq_dafang_01 subscribeReading_detection myhome/Dafang_01/motion/detection
attr mq_dafang_01 subscribeReading_horizontal myhome/Dafang_01/motors/horizontal
attr mq_dafang_01 subscribeReading_ir myhome/Dafang_01/leds/ir
attr mq_dafang_01 subscribeReading_ir-cut myhome/Dafang_01/ir_cut
attr mq_dafang_01 subscribeReading_motion myhome/Dafang_01/motion
attr mq_dafang_01 subscribeReading_night_mode myhome/Dafang_01/night_mode
attr mq_dafang_01 subscribeReading_rtsp_h264_server myhome/Dafang_01/rtsp_h264_server
attr mq_dafang_01 subscribeReading_rtsp_mjpeg_server myhome/Dafang_01/rtsp_mjpeg_server
attr mq_dafang_01 subscribeReading_send_mail myhome/Dafang_01/motion/send_mail
attr mq_dafang_01 subscribeReading_send_telegram myhome/Dafang_01/motion/send_telegram
attr mq_dafang_01 subscribeReading_tracking myhome/Dafang_01/motion/tracking
attr mq_dafang_01 subscribeReading_uptime myhome/Dafang_01
attr mq_dafang_01 subscribeReading_vertical myhome/Dafang_01/motors/vertical
attr mq_dafang_01 subscribeReading_yellow myhome/Dafang_01/leds/yellow
attr mq_dafang_01 userReadings motion_timestamp {ReadingsTimestamp("mq_dafang_01","motion","")}
attr mq_dafang_01 webCmd calibrate:left:up:down:right

Doif mit dem Funktionsaufruf

defmod di_dafang_01_ffmpeg_automatic DOIF (([mq_dafang_01:"^motion:.ON$"]) and ([rgr_myhome:presence] eq "absent")) ({camera_ffmpeg_01("$SELF", 'rtsp://192.168.178.186:8554/unicast', 'mq_dafang_01', '/mnt/ipcam/dafang_01/movie', '60')})
attr di_dafang_01_ffmpeg_automatic DbLogExclude .*
attr di_dafang_01_ffmpeg_automatic do always
attr di_dafang_01_ffmpeg_automatic group zone_hallway_general
attr di_dafang_01_ffmpeg_automatic room 08_Camera->Dafang_01


Kamera 2

Device welches motion triggert

defmod mq_yi_home_01 MQTT_DEVICE
attr mq_yi_home_01 DbLogExclude .*
attr mq_yi_home_01 IODev Mosquitto
attr mq_yi_home_01 event-on-change-reading motion_detection
attr mq_yi_home_01 group zone_livingroom_general
attr mq_yi_home_01 room 08_Camera->Yi_Home_01
attr mq_yi_home_01 stateFormat Motion: motion_detection - am: motion_timestamp
attr mq_yi_home_01 subscribeReading_motion_detection yi_home_01/motion_detection
attr mq_yi_home_01 userReadings motion_timestamp {ReadingsTimestamp("mq_yi_home_01","motion_detection","")}

Doif mit dem Funktionsaufruf

defmod di_yi_home_01_ffmpeg_automatic DOIF (([mq_yi_home_01:"^motion_detection:.motion_start$"]) and ([?du_yi_home_01_ffmpeg_switch:state] eq "on")) ({camera_ffmpeg_02("$SELF", 'rtsp://192.168.178.187/ch0_0.h264', 'mq_yi_home_01', '/mnt/ipcam/yi_01/movie', '120')})
attr di_yi_home_01_ffmpeg_automatic DbLogExclude .*
attr di_yi_home_01_ffmpeg_automatic do always
attr di_yi_home_01_ffmpeg_automatic group zone_livingroom_general
attr di_yi_home_01_ffmpeg_automatic room 08_Camera->Yi_Home_01



In der angehängten 99_myUtils_camera.pm ist noch eine Funktion zum Löschen älterer Dateien vorhanden.
Diese Funktion nur verwenden wenn die Pfade zu den Verzeichnissen angepasst ist.
(Hatte ich nur auf die Schnelle für mich gebastelt)

Aufnahmen löschen

defmod at_camera_ffmpeg_file_delete at *00:10:00 {camera_ffmpeg_file_delete()}
attr at_camera_ffmpeg_file_delete DbLogExclude .*
attr at_camera_ffmpeg_file_delete group zone_apartment_automatic
attr at_camera_ffmpeg_file_delete room 08_Camera->General


Henni

Erstmal vielen Dank and rob und hydrotec, von euch habe ich viel gelernt. Bei mir läuft jetzt alles, wie es soll.
In meinem meinem MQTT2 log habe ich nun folgenden Einträge gefunden:
2021-01-22_16:18:25 MQTT2_yi_cam motion_detection: motion_start
2021-01-22_16:18:27 MQTT2_yi_cam motion_detection_image: ����JFIF��C 

  ��C      

��8�"��    ���}!1AQa"q2���#B��R��$3br�    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���������������������������������������������������������������������������    ���w!1AQaq"2�B����   #3R�br� $4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�������������������������������������������������������������������������� ?��� r�ɣŠ��   ����}jMB��
]�mL���5��-"���=*�S1��h�֬GUӭY���Va5K�Y�s@U��5%XD�   W�9z�GJr�� +Ҕu�^���N�)i�.
:�u���s@ 5:�)�� �F(1NQ�;m(^hU�KH:R��Z�*�5:@/JZR��4�9�x���@PqNPsR*�S�y�   �-`R�E.
4�U�I�J��,/JZE�c4�֦^��S/J��֊Z�zR�/JZu(�IJ:��Җ��4�F�S�i�p(�74ݹ�J��L{����>cQH�N*�o���`�-�#�*�.............

Das wird natürlich im Reading für motion_detection_image genau so übernommen. Ist das normal? Kann man das rausfiltern?

hydrotec

Hallo Henni,

poste mal bitte die Definition des device. (list oder RAW-definition)

Zitat2021-01-22_16:18:27 MQTT2_yi_cam motion_detection_image:
Kann mir nicht vorstellen das über MQTT Bilder versendet werden können.

Gruß Karsten

Henni

#63
Hi Karsten,
meintest du vom Log? Der wurde, wie bei euch, automatisch angelegt.
defmod FileLog_MQTT2_yi_cam FileLog ./log/MQTT2_yi_cam-%Y.log MQTT2_yi_cam
attr FileLog_MQTT2_yi_cam logtype text
attr FileLog_MQTT2_yi_cam room MQTT2_DEVICE

setstate FileLog_MQTT2_yi_cam active
setstate FileLog_MQTT2_yi_cam 2021-01-22 23:48:17 linesInTheFile 199


ZitatKann mir nicht vorstellen das über MQTT Bilder versendet werden können.
Bei mir scheint der Empfang/Decodieren das Problem zu sein. Das Senden kommt ja rein von der Cam?
Die Cam hat FW 9.0.19*, daher benutze ich Allwinner v2. Evtl liegt es daran? Gibt auch ein open issue, könnte mit meinem vielleicht zusammenhängen?
https://github.com/roleoroleo/yi-hack-Allwinner-v2/issues/35

Hier auch nochmal für die cam
defmod MQTT2_yi_cam MQTT2_DEVICE yi_cam
attr MQTT2_yi_cam IODev m2s
attr MQTT2_yi_cam readingList yi_cam:yicam/motion_detection:.* motion_detection\
yi_cam:yicam/motion_detection_image:.* motion_detection_image\
yi_cam:yicam/motion_files:.* { json2nameValue($EVENT) }\
yi_cam:yicam/status:.* status
attr MQTT2_yi_cam room MQTT2_DEVICE

setstate MQTT2_yi_cam 2021-01-22 23:48:17 end 2021-01-22T22:47:07+0000
setstate MQTT2_yi_cam 2021-01-22 23:48:17 files_1 2021Y01M22D22H/47M00S60.mp4
setstate MQTT2_yi_cam 2021-01-22 23:47:07 motion_detection motion_stop
setstate MQTT2_yi_cam 2021-01-22 23:46:09 motion_detection_image ����JFIF��C\
 \         <-hier abgeschnitten, da ewig lang
setstate MQTT2_yi_cam 2021-01-22 23:48:17 start 2021-01-22T22:46:07+0000
setstate MQTT2_yi_cam 2021-01-22 16:08:28 status online


Gruß Stefan
Nachtrag:
Konnte beim Cam Interface in der MQTT section folgendes finden:
Topic Suffix for jpeg image
"motion_detection_image"
A raw jpeg image is sent to this topic when a motion is detected.

https://forum.fhem.de/index.php?topic=99173.0 hier wird versucht ein png(Karte) eines Roborocks zu empfangen. Es scheint nicht unmöglich zu sein


hydrotec

Guten Morgen Stefan,

was es nicht alles gibt  ???
Kannte ich seither noch nicht, bzw. hatte ich nicht benötigt, müsste ich mich auch erst einmal eine gewisse Zeit damit beschäftigen.
Was sich mir noch nicht ganz erschließt, was für einen Vorteil bringt es, einen snapshot über MQTT zu übermitteln.
Da FHEM mit den reinen Daten des image offensichtlich nichts anfangen kann, müsste man also noch eine zusätzliche Software installieren.
Und da bin ich mir etwas unschlüßig, warum sollte ich den Raspi zusätzlich mit etwas beschäftigen, was die Kamera schon von Haus aus erledigt.
Aber ich lasse mich gerne eines Besseren belehren.

Eventuell gibst du mal einen kurzen Umriss was du erreichen möchtest.

Gruß Karsten

Henni

Hi Karsten,
im Grunde ging es mir um 2 Sachen:
1. Ist das "Verhalten" normal (da ich es bei euren Beispielen nicht gesehen hatte)? Antwort in diesem Fall klar ja
2. Aus deiner Argumentation und da ich auch die Videos/snapshots anders aufs NAS bekomme, würde ich gerne dieses (heißt es MQTT topic?) rausfiltern, da mein Log "zugespamt" wird. Bei den Kameraeinstellungen ist es nicht möglich (Testweise den Namen auf "" gesetzt, wird dennoch als motion_detection_image versendet) Lese mich mal hier ein: https://wiki.fhem.de/wiki/MQTT_Einf%C3%BChrung_Teil_2, wobei ich gerne wohl ein "-" hätte, aber es nur "+" gibt.
Danke für dein Feedback
VG

hydrotec

Hallo Stefan,

mit MQTT2 kann dir bestimmt jemand anderes weiterhelfen, welcher sich besser damit auskennt.
Doch wenn ich mir dein mqtt-cam-device anschaue, und das von rob ansehe,
sind da schon Unterschiede.
Wie du schon richtig erwähnt hast, kannst du es in der Konfiguration der Kamera nicht so ohne Weiteres unterbinden.
Ich könnte mir vorstellen, das wenn du die setList folgendermaßen anpasst, die Topics ignoriert werden.
defmod MQTT2_yi_cam MQTT2_DEVICE yi_cam
attr MQTT2_yi_cam IODev m2s
attr MQTT2_yi_cam readingList yi_cam:yicam/motion_detection:.* motion_detection\
yi_cam:yicam/motion_files:.* { json2nameValue($EVENT) }\
yi_cam:yicam/status:.* status
attr MQTT2_yi_cam room MQTT2_DEVICE


Versuch macht kluch  ;)

Gruß Karsten

Henni

das war dann sogar die Lösung  :D
Hatte auch schon früh diese Idee gehabt, nur wurden meine Änderungen nie "übernommen"
attr MQTT2_yi_cam autocreate 0 war halt noch nötig ;)
Danke nochmal :)


Grist

Hallo zusammen,

ich habe diesen Thread jetzt gefunden...falls jemand eine Lösung mit Node-Red braucht:
https://discourse.nodered.org/t/yi-hack-send-video-files-to-telegram/41490/7

Apropos, ich bräuchte bitte eure Hilfe:
1. Ich habe die Kamera mit dem IPCAM Modul definiert: "define yi IPCAM 192.168.x.x:8080" + "attr yi basicauth user:passwd"
Diese Zugangsdaten "user:passwd" sind als Klartext in FHEM sichtbar. Wie könnte man sie verstecken?

2. "attr yi webCmd on:off" ist gesetzt. Was mus noch definiert werden, damit on & off funktioniert?

3. Ähnlich zu 2. -> Ich brauche etwas wie "set yi on" bzw. "set yi off"

VG

hydrotec

Hallo Grist,

zu allen drei Punkten findest du in der commandref eine Antwort.
IPCAM

zu Punkt
1) Attributes -> basicauth -> credentials
2) Attributes -> cmd01, cmd02, cmd03, ..
3) Set -> cmd 1 .. 15

Anwendungsbeispiele findest du unter Antwort #8 und #9.

Zitat von: Grist am 05 März 2021, 12:15:14
2. "attr yi webCmd on:off" ...
wird nicht benötigt.

Gruß Karsten

Grist

Hallo Karsten,

Zitat von: hydrotec am 07 März 2021, 11:06:32
zu Punkt
1) Attributes -> basicauth -> credentials

Die Lösung mit dem "credentials" hatte ich schon gesehen...hab mich gefragt, ob es wohl eine andere Lösung gäbe...ohne eine Datei anzulegen...

Zitat von: hydrotec am 07 März 2021, 11:06:32
2) Attributes -> cmd01, cmd02, cmd03, ..
3) Set -> cmd 1 .. 15

Ich habe anhand der Beispiele #8 und #9 die Kamera angelegt...habe aber vergessen, pathCmd anzugelegen...jetzt tut es!

Danke und Gruß
Steve

cosmo87

Hallo,

ich bin relativ neu hier und wollte fragen ob mir jemand bezüglich der YI Kamera behilflich sein kann.
Ich hoffe dieser Post ist hier nicht unpassend.

Ich habe mir letztens dieser hier gekauft:
https://www.amazon.de/gp/product/B07YG2TTM3/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1

Darauf musste ich feststellen dass ich NUR mit der App den Stream anschauen kann würde aber gerne von der App unabhängig sein.
So bin ich auf diesen Thread gestoßen und konnte auch den "Yi Hack" von AllwinnerV2 "halb" erfolgreich installieren.
Jedoch bekomme ich mit dem VLC, via rtsp, kein Bild.
Kann hier jemand behilflich sein?

Toll wäre es noch wenn ich,bei Bewegungerkennung, mittels FHEM oder IOBroker eine Benachrichtigung auf mein Handy bekomme aber hierzu muss ich mich als blutiger Anfänger erst noch reinkämpfen  ::)

Gruß

hydrotec

Hallo cosmo87,

vermutlich funktioniert der Hack nicht mit dieser Kamera.

https://github.com/TheCrypt0/yi-hack-v4/issues/163
https://github.com/roleoroleo/yi-hack-Allwinner-v2/issues/105

Musst du etwas im Internet suchen ob schon jemand einen Hack entwickelt hat, oder selber hacken  ;)

Kannst du mittels Webbrowser auf die Kamera zugreifen?


Ansonsten noch schöne Ostern
Gruß, Karsten

cosmo87

Hallo Karsten,

ich war tatsächlich so naiv und dachte IP Camera bleibt IP Camera (IP eingeben, rtsp port dazu, fertig)

Selbst den hack schreiben wird zeitlich etwas schwer momentan (Abschlussprüfungen) und in Skripten bin ich auch blutiger Anfänger :)

Ja mit dem Browser komme ich drauf. Ein paar Einstellungen kann ich auch setzen aber nicht alle (zB. IR LED kann ich nicht deaktivieren)
Aber ich bekomme weder eine FTP, noch eine SSH oder eine RTSP (via VLC) Verbindung zustande.

Ich wünsche euch auch Frohe Ostern
Gruß