Tapo Kameras: Unterschied zwischen den Versionen
| Zeile 18: | Zeile 18: | ||
in voller Auflösung, sowie mit reduzierter Auflösung als | in voller Auflösung, sowie mit reduzierter Auflösung als | ||
ffplay rtsp://<USERKAMERA>:<PWKAMERA>@<IPKAMERA>:554/stream2 | ffplay rtsp://<USERKAMERA>:<PWKAMERA>@<IPKAMERA>:554/stream2 | ||
'''TODO''': Beschreibung RSTPtoWeb nachziehen | |||
Die Erstellung eines Snapshots wird über ein Shellskript gesteuert, das man unter https://github.com/pahenning/TapoCam_for_FHEM/tapo_snapshot.sh findet. Für das Weitere gehen wir davon aus, dass dieses Shellskript unter /opt/fhem/tapo liegt und durch den FHEM-Prozess ausführbar ist. Wir definieren ein Dummy-Device mit zunächst minimalen Eigenschaften | Die Erstellung eines Snapshots wird über ein Shellskript gesteuert, das man unter https://github.com/pahenning/TapoCam_for_FHEM/tapo_snapshot.sh findet. Für das Weitere gehen wir davon aus, dass dieses Shellskript unter /opt/fhem/tapo liegt und durch den FHEM-Prozess ausführbar ist. Wir definieren ein Dummy-Device mit zunächst minimalen Eigenschaften | ||
Aktuelle Version vom 24. März 2026, 17:42 Uhr
Verifiziert für Tapo C530WS
Cloud-Installation
Die Kamera zunächst mit der von Tapo angegebenen App installieren und testen. Dafür muss ein Konto angelegt werden, mit Mailadresse und einem Passwort, das im Folgenden als <PWCLOUD> abgekürzt wird.
Die Kamera erhält im internen Netz eine IP-Adresse, die im Folgenden als <IPKAMERA> abgekürzt wird.
Wichtig: In der Tapo-App unter "Ich" unbedingt "Dienste von Drittanbietern" aufrufen und "Kompatibilität mit Drittanbietern" auf EIN stellen!
Stream und Snapshot
Hierfür muss zunächst ein so genanntes Kamera-Konto auf der Kamera angelegt werden, unter Einstellungen->Erweiterte Einstellungen. Dabei werden ein Username und ein Passwort festgelegt, die im Folgenden als <USERKAMERA> und <PWKAMERA> abgekürzt werden.
Auf dem FHEM-Server (oder einem anderen System zum Testen) muss dann die ffmpeg-Suite installiert werden.
Wenn die Kamera eingeschaltet ist, lässt sich dann der Stream der Kamera abgreifen mit
ffplay rtsp://<USERKAMERA>:<PWKAMERA>@<IPKAMERA>:554/stream1
in voller Auflösung, sowie mit reduzierter Auflösung als
ffplay rtsp://<USERKAMERA>:<PWKAMERA>@<IPKAMERA>:554/stream2
TODO: Beschreibung RSTPtoWeb nachziehen
Die Erstellung eines Snapshots wird über ein Shellskript gesteuert, das man unter https://github.com/pahenning/TapoCam_for_FHEM/tapo_snapshot.sh findet. Für das Weitere gehen wir davon aus, dass dieses Shellskript unter /opt/fhem/tapo liegt und durch den FHEM-Prozess ausführbar ist. Wir definieren ein Dummy-Device mit zunächst minimalen Eigenschaften
defmod TapoCam dummy attr TapoCam readingList snapshot attr TapoCam setList getPhoto:noArg
sowie ein DOIF
defmod TapoCam.N DOIF ([TapoCam:state] =~ /^getPhoto$/) \
({my $res = qx(/opt/fhem/tapo/tapo_snapshot.sh);;\
chomp($res);;\
fhem("setreading TapoCam snapshot $res");;\
fhem("setreading TapoCam state ready")\
}\
)
mit Attribut
attr TapoCam.N do always
Dann sorgt der FHEM-Befehl
set TapoCam getPhoto
dafür, dass ein Snapshot unter /opt/fhem/www/images gespeichert wird. Im FHEMWEB Frontend ist er dann unter /fhem/images/Tapo.jpg ansehbar
TODO: Komfortabler machen
Kamerasteuerung mit Python
FHEM-Device
defmod TapoCam dummy
attr TapoCam devStateIcon stream_running:it_camera@green stream_stopped:it_camera@black
attr TapoCam readingList snapshot motor_action motor_result motor_presets error
attr TapoCam setList getPhoto:noArg getClip getEvents privacy:on,off light:on,off light_intensity light_duration light_night:ir,white,auto led:on,off moveLeft moveRight moveUp moveDown calibrate:noArg preset_goto:1,2,3,4,5,6,7,8 preset_save preset_delete getPresets detection_motion detection_person detection_pet detection_tamper detection_vehicle detection_linecrossing alarm:on,off alarm_light:on,off alarm_sound:on,off alarm_duration alarm_volume:low,medium,high
attr TapoCam stateFormat {my $x=ReadingsAge("TapoCam","snapshot","");;\
my $v=ReadingsVal("TapoCam","event_dl_link","");;\
my $w=ReadingsAge("TapoCam","event_dl","");;\
my $y=(ReadingsVal("TapoCam","privacy","") eq "off")?"<a href=\"http://192.168.0.94:8085/pages/player/webrtc/stream1/0\">\nstream_running\n</a>":"stream_stopped";;\
sprintf("<p style=\"text-align:left;;font-weight:normal\">\n%s\n<br/><br/><a href=\"http://192.168.0.94:8083/fhem/images/Tapo.jpg\">Tapo.jpg</a> (%s)\n<br/><a href=\"%s\">TapoClip.mp4</a> (%s)\n</p>",$y,$x,$v,$w)}
attr TapoCam webCmd getPhoto:moveLeft:moveRight:moveUp:moveDown
DOIF
defmod TapoCam.N DOIF ([TapoCam:state] ne "ready")
({TapoCamHandler("$DEVICE","$EVENT")})
(setreading TapoCam state ready)
DOELSEIF
([+00:05:00])
({TapoCamHandler("TapoCam","status_update")})
attr TapoCam.N do always
attr TapoCam.N wait 0,3
Handler
In der Datei https://github.com/pahenning/TapoCam_for_FHEM/99_TapoCamUtils.pm findet man zwei Funktionen:
- TapoCamHelper - nimmt als Parameter den Namen eines FHEM_Devices für die Kamera und ein Event entgegen und ruft dann eines der Python-Skripte auf. Dieses läuft asynchron ab, d.h. die Rückmeldung an FHEM kann bis zu 10 Sekunden dauern.
- TapoReturnHelper - wird aus dem Python-Skript gerufen und mit einer JSON-Struktur befüllt. Die Inhalte dieser JSON-Struktur werden auf Readings in dem FHEM-Device verteilt.
Python Vorbereitung
Zur Vorbereitung folgende Schritte ggf. mit root-Rechten unternehmen:
mkdir -p /opt/fhem/tapo cd /opt/fhem/tapo python3 -m venv .venv /opt/fhem/tapo/.venv/bin/pip install --upgrade pip /opt/fhem/tapo/.venv/bin/pip install pytapo /opt/fhem/tapo/.venv/bin/pip install aiofiles chown -R fhem:dialout /opt/fhem/tapo chmod -R u+rwX /opt/fhem/tapo
Dadurch wird im Verzeichnis /opt/fhem/tapo eine virtuelle Umgebung für die TapoCam angelegt.
Achtung: Falls mit den nachfolgend aufgeführten Skripten irgendwelche Laufzeitfehler auftauchen, kann dies an einer veralteten Version von Python liegen. Aktuell ist eigentlich die Version 3.13 erforderlich.
In dieses Verzeichnis können nun die Python-Skripte aus https://github.com/pahenning/TapoCam_for_FHEM hineinkopiert werden.
- tapo_credentials.py - enthält <IPKAMERA> und <PWCLOUD>, sowie IP-Adresse, Port des FHEM-Servers, dessen statischen (!) csrf-Parameter und den Devicenamen des TapoCam-Devices.
- tapo_helper.py - diverse Hilfsfunktionen, die von den anderen Skripten importiert werden.
- tapo_control_privacy.py - Kontrollprogramm für den "PRIVAT"-Modus der Kamera - d.h. das Ausschalten der Kamera. Kann wie folgt gerufen werden:
tapo_control_privacy.py-> Statusmeldung an FHEMtapo_control_privacy.py on|off-> setzt den "PRIVAT"-Modus (Kamera aus), oder hebt ihn auf (Kamera eingeschaltet)
Bewegung
- tapo_control_motor.py - Kontrollprogramm für die Bewegungen der Kamera. Kann wie folgt gerufen werden:
tapo_control_motor.py left [0-359]-> Bewege die Kamera nach links. Ohne Parameter wird um den in der Kamera eingestellten Wert, typisch 10°, bewegt. Wenn ein Parameter angegeben wird, ist das der Winkel für die Bewegung.tapo_control_motor.py right [0-359]-> Bewege die Kamera nach rechts. Parameter wie obentapo_control_motor.py up [0-359]-> Bewege die Kamera nach oben. Parameter wie obentapo_control_motor.py down [0-359]-> Bewege die Kamera nach unten. Parameter wie obentapo_control_motor.py calibrate-> Kalibrierung der Kamerabewegungtapo_control_motor.py presets-> Hole die definierten Positionentapo_control_motor.py goto <preset>-> Gehe zur definierten Position (Zahlenangabe)tapo_control_motor.py save <preset> <name>-> Speichere die gegenwärtige Position (Zahlenangabe und Name)tapo_control_motor.py delete <preset>-> Lösche die definierte Position (Zahlenangabe)
Beleuchtung
- tapo_control_light.py - Kontrollprogramm für die Lichtfunktionen der Kamera. Kann wie folgt gerufen werden:
tapo_control_light.py status-> Statusmeldung an FHEMtapo_control_light.py led on|off-> Schaltet die Kamera-LED an oder austapo_control_light.py light on|off-> Schaltet das Kameralicht an oder austapo_control_light.py intensity <0-100>-> Helligkeit des Kameralichtsstapo_control_light.py time <0-3600>-> Dauer des Kameralichtstapo_control_light.py night ir|white|auto-> Modus des Kameralichts bei Nacht
Kamera-Events
Events werden ausgelöst, wenn eine bestimmte Detektion erfolgt ist. Dafür gibt es
- tapo_control_detection.py - Kontrollprogramm für die Erkennungsfunktionen der Kamera. Kann wie folgt gerufen werden:
tapo_control_detection.py status-> Statusmeldung an FHEMtapo_control_detection.py motion <0-100>-> setzt die Empfindlichkeit der Bewegungserkennung. 0 => ausgeschaltet.tapo_control_detection.py person <0-100>-> setzt die Empfindlichkeit der Personenserkennung. 0 => ausgeschaltet.tapo_control_detection.py vehicle <0-100>-> setzt die Empfindlichkeit der Fahrzeugerkennung. 0 => ausgeschaltet.tapo_control_detection.py pet <0-100>-> setzt die Empfindlichkeit der Haustiererkennung. 0 => ausgeschaltet.tapo_control_detection.py tamper <0-100>-> setzt die Empfindlichkeit der Sabotageerkennung. 0 => ausgeschaltet.tapo_control_detection.py linecrossing <0-100>-> setzt die Empfindlichkeit der Erkennung des Übertretens einer virtuellen Linie. 0 => ausgeschaltet.
Diese Events werden nur gespeichert, wenn in der Kamera eine SD-Karte eingesetzt wurde. Empfohlen werden mindesten 16 GByte, diese Karte wird als Ringpuffer mit den Erkennungsevents beschrieben. Dabei werden jeweils kurze Videoclips aufgenommen (1 min Dauer). Welche Events vorhanden sind, kann man abfragen mit
- tapo_control_events.py - Kontrollprogramm für die Eventfunktionen der Kamera. Kann wie folgt gerufen werden:
tapo_control_events.py <seconds>- Hole die während der vergangenen <seconds> Sekunden detektierten Events von der Kamera und meldet sie an FHEM. Diese Clips werden dabei durchnummeriert. Die Liste der im Zeitfenster vorhandenen Events wird in der Datei /tmp/tapo_control_events.json zwischengespeichert.
Das Programm zum Download ist
- tapo_control_download.py - Kontrollprogramm zum Download eines Event-Videoclips auf den FHEM-Server. Kann wie folgt gerufen werden:
tapo_control_download.py clip <number> [DEBUG]-> <number> ist die aus der o.a. Nummerierung abzulesende Nummer des Events. DEBUG: 0 oder 1, default 0. Wenn DEBUG eingeschaltet ist, werden auf STDOUT Kontrollnachrichten ausgegeben.
Bei diesem Download laufen etliche Dinge im Hintergrund ab, insbesondere ist das Linux-Paket ffmpeg nötig, um die Umwandlung des Kameravideos in eine MP4-Datei durchzuführen. Diese wird in /tmp/tapo_recordings/clips gespeichert, und ein Link von /opt/fhem/www/images/TapoClip.mp4 auf diese Datei angelegt.
Alarmierung
Bei entsprechend detektierten Events kann auch ein lokaler Alarm in der Kamera ausgelöst werden (blinkende Beleuchtung = light und/oder Sirene=sound). Achtung: light und sound dürfen nicht beide off sein.
- tapo_control_alarm.py- Kontrollprogramm für die Alarmfunktionen der Kamera. Kann wie folgt gerufen werden:
tapo_control_alarm.py status-> Statusmeldung an FHEMtapo_control_alarm.py on|off-> schaltet die Alarmfunktionen an oder austapo_control_alarm.py light on|off-> bei Alarm wird das Licht eingeschaltet, oder nichttapo_control_alarm.py sound on|off-> bei Alarm wird die Sirene eingeschaltet, oder nicht.tapo_control_alarm.py volume low|medium|high-> Lautstärke der Sirenetapo_control_alarm.py duration <zahl>-> Dauer eines Alarms in Sekunden