FHEM-Integration von Tapo Kameras

Begonnen von Prof. Dr. Peter Henning, 18 März 2026, 11:39:03

Vorheriges Thema - Nächstes Thema

Prof. Dr. Peter Henning

#30
Zitat von: andre07 am 19 April 2026, 20:59:54PASSWORD = "passwortvonderkamera"
In der Anleitung steht ganz klar CLOUD-PASSWORT

pah

Prof. Dr. Peter Henning

Ich habe jetzt eine zweite Tapo-Kamera angeschafft, und zwar eine C425. Features: Nicht motorisch bewegbar, kein permanenter Stream, keine Snapshots, eingebauter Akku mit 10 Ah.

Das Teil ist ganz witzig, hängt bei mir im Kirschbaum zur Beobachtung von Vögeln. Events werden auf eine interne SD-Karte geschrieben und können mit den hier schon diskutierten Python-Skripten abgefragt und als Videoclips heruntergeladen werden. Nach 4 Tagen Betrieb ist der Ladestand dieses Akkus von 100 auf 97% gefallen, die Kamera kann also eine Weile damit betrieben werden. Wenn der Akku leer ist, einfach aus der magnetischen Halterung nehmen und eine Weile an das Ladegerät hängen.

Bitte melden, wenn jemand sich für die erweiterten Skripte interessiert.

LG

pah

swsmily

Vielen Dank für die Skripte und das Modul.
Ich hab seit gestern eine Tapo C246D. Ich bin heute dann zufällig auf diesen Thread gestoßen und war direkt begeistert. Einrichtung hat auch geklappt, nachdem ich (leider überlesen) Drittanbieter freigeschaltet habe. Kamera lässt sich sehr gut über FHEM steuern. Meine SD-Karte für die Kamera ist leider noch nicht geliefert, daher konnte ich etwas mit Events noch nicht testen.


Prof. Dr. Peter Henning

#33
OK, dann hänge ich die überarbeiteten Skripte einfach mal hier an. Das Einzige, was sich geändert hat, ist die Möglichkeit zum Definieren mehrerer Kameras in der credentials-Datei. Die C425 ist wesentlich eingeschränkter als die andere Kamera: Keine Bewegung, kein RTSP-Stream. Das muss man also aus dem FHEM-Device herauslassen. Außerdem gibt es noch ein neues Skript zum Holen von Eventlisten. Das benutze ich, um einen FHEM-Plot zu generieren, der mir übersichtshalber die Events der letzten Stunden zeigt. Das Log-Device ist ganz einfach:
defmod TapoCam.LOG FileLog /home/fhem/fhemlogs/TapoCam-%Y-%m-%d.log (TapoCam1:det_.*)|(TapoCam2:det_.*)
Eigentlich müsste ich das Wiki entsprechend überarbeiten, dafür fehlt mir aber im Moment die Zeit.

Im TapoCam.N-DOIF kann man sehen, wie das Eventlisten-Ding aufgerufen wird:
defmod TapoCam.N DOIF ([8:00] or [12:00] or [16:00] or [20:00] or [TapoCam.N:"update"])\
({my $python='/opt/fhem/tapo/.venv/bin/python3';;\
  my $scrpre='/opt/fhem/tapo/tapo_control_';;\
  TapoCamRunBg("$python ${scrpre}eventlist.py");;\
})\
DOELSEIF\
([TapoCam1:state] ne "ready") \
({TapoCamHandler("TapoCam1","$EVENT")})\
(setreading TapoCam1 state ready)\
DOELSEIF\
([TapoCam2:state] ne "ready") \
({TapoCamHandler("TapoCam2","$EVENT")})\
(setreading TapoCam2 state ready)\
DOELSEIF\
(([houseProfileC:housestate] eq "unsecured") and ([houseProfileC:housemode] ne "absence"))\
(set TapoCam1 detection_person 0)\
(set TapoCam2 detection_person 0)\
DOELSEIF\
(([houseProfileC:housestate] ne "unsecured") or ([houseProfileC:housemode] eq "absence"))\
(set TapoCam1 detection_person 66)\
(set TapoCam2 detection_person 66)\
\

attr TapoCam.N do always
attr TapoCam.N group Kameras
attr TapoCam.N room Kontrollraum
attr TapoCam.N wait 0,3
attr TapoCam.N webCmd update

LG

pah


swsmily

#34
Vielen Dank für die erweiterten Skripte.
Ich hab diese nun bei mir integriert und es funktioniert soweit alles. Aber ich bekomme 2 Fehlermeldungen. Einmal beim reboot von FHEM im FHEM-LOG:

2026.07.26 22:07:22 1: reload: Error:Modul 99_TapoCamUtils deactivated:
Ein Grund steht leider nicht dabei. Daraus vermute ich, dass daher alle 5 Minuten diese Fehlermeldung im Log kommt:
2026.07.26 22:09:40.013 2: TapoCam.N: {TapoCamHandler("TapoCam","status_update")}: error: unknown event: status_update

Hier mal meine Definitionen:
DOIF TapoCam.N:
defmod TapoCam.N DOIF ([08:00] or [12:00] or [16:00] or [20:00] or [TapoCam.N:"update"])\
({my $python='/opt/fhem/tapo/.venv/bin/python3';;;;\
  my $scrpre='/opt/fhem/tapo/tapo_control_';;;;\
  TapoCamRunBg("$python ${scrpre}eventlist.py");;;;\
})\
DOELSEIF \
([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 room Kameras
attr TapoCam.N wait 0:0,3

TapCam.LOG:
defmod TapoCam.LOG FileLog ./log/TapoCam-%Y-%m-%d.log TapoCam:(det_.*|event_.*person.*|event_.*pet.*)
TapoCam-Dummy:
defmod TapoCam dummy
attr TapoCam alias Kamera_Wall_E
attr TapoCam devStateIcon stream_running:it_camera@green stream_stopped:it_camera@orange
attr TapoCam readingList snapshot motor_action motor_result motor_presets error
attr TapoCam room Kameras
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 $cache=time();;\
 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://10.5.3.1:8083/fhem/images/Tapo.jpg?$cache\">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

EDIT:
Dank Ki hab ich die Fehler beheben können:
99_TapoCamUtils - dort hat am Ende eine geschweifte Klammer zu und 1; gefehlt - damit ist der Fehler beim Start von FHEM weg.

Im DOIF TapoCam.N stand status_update, aber in der 99_TapoCamUtils.pm war es update_status.

Nachdem das lief, kam im Privacy-Reading statt on oder off {'enabled': 'off'} zurück.
Dafür musste in tapo_control_privacy.py folgendes geändert werden.

Statt:   
try:
        data = method()
    except Exception as exc:
        helper.error_exit(f"Fehler bei getPrivacyMode: {exc}")

    return {
        "privacy": helper.normalize_on_off(data),
    }

    try:
        data = method()
    except Exception as exc:
        helper.error_exit(f"Fehler bei getPrivacyMode: {exc}")

    value = data.get("enabled") if isinstance(data, dict) else data

    return {
        "privacy": helper.normalize_on_off(value),
    }

Also die Zeile value hinzugefügt werden und in der letzten Zeile statt data musste value rein.

Damit läuft das Modul/die Skripte für mich nun wirklich perfekt. Nun muss ich nur mal noch Events (außer Bewegungs) auslösen! Vielen vielen Dank für die Skripte! Ohne diese hätte ich die Kamera nicht so schön in FHEM eingebunden bekommen. Danke!

Prof. Dr. Peter Henning

Die 1 am Ende fehlte tatsächlich - ist beim Kopieren verloren gegangen. Allerdings fehlte keine "}", wundert mich.

control_privacy funktionierte bei mir auch ohne die Ergänzung - die ist aber unschädlich, also kann man sie übernehmen.

LG

pah

swsmily

Vielleicht ist die fehlende Klammer bei mir durch kopieren verloren gegangen. Es läuft aber wunderbar. Vielen Dank dafür  :)