Welche Kameras sind die richtigen für ioBroker und VIS? Eine häufig gestellte Frage, die aus unserer Sicht nicht eindeutig beantwortet werden kann. Zwei aus unserer Sicht wesentliche Kriterien zur Bewertung sind:
- Die Kameras lassen sich ohne eine Kommunikation zu Cloud-Services des Herstellers betreiben und lokale Aufzeichnungen des Videostreams, entweder auf Speicherkarte direkt in der Kamera oder über eine Drittsoftware mithilfe des Videostreams sind möglich.
- Der Videostream lässt sich direkt in eine VIS-Oberfläche einbinden.
Das zweite Kriterium ist für uns nicht das Wesentliche, weswegen wir für die semi-professionelle Überwachung eines Ferienhauses und den gelegentlichen Rundumblick eine Kameralösung gesucht haben, die folgende Kriterien erfüllen:
- Schwenkbare Kameras
- Gutes Preisleistungsverhältnis (vor allem, weil unter dem Dachgiebel Indoor-Varianten der Kameras installiert werden)
- Speicherung auf lokaler SD-Karte oder mit Drittsoftware (z.B. MotionEye)
- Wenn möglich Personenerkennung statt einfach Bewegungserkennung
- Notifications bei Bewegung
Nach Recherche sind die Kameras der Marken Reolink und TP-Link Tapo in die nähere Auswahl gekommen. Beide Marken bieten Kameras für den Outdoor-Bereich, schwenkbare Kameras, Personenerkennung uvm.
Auswahl Reolink Kameras
Auswahl TP-Link Tapo Kameras
-
27%TP-Link Tapo C100 WLAN IP Kamera Überwachungskamera Innen (1080p-Auflösung, 2-We...29,90 € 21,90 €
-
38%TP-Link Tapo C110 WLAN IP Kamera Überwachungskamera (3MP-Auflösung, 2-Wege-Audio...39,90 € 24,90 €
-
32%TP-Link Tapo C200 WLAN IP Kamera Überwachungskamera (Linsenschwenkung- und Neigu...39,90 € 26,99 €
-
TP-Link Tapo C210 WLAN IP Kamera Überwachungskamera (Linsenschwenkung- und Neigu...27,90 €
-
22%TP-Link Tapo C310 Überwachungskamera Außen, WLAN IP Kamera, 3MP Hochauflösung, 3...44,90 € 34,99 €
Wir haben uns für die schwenkbaren Kameras TP-Link Tapo C210 und C200 und C100 entschieden, auch wenn die Kameras keinen HTTP-Stream des Videos für die Einbindung in ioBroker VIS bieten. Trotz halbwegs intensiver Recherche sind uns die Unterschiede zwischen Tapo C200 und C210 bzw. C100 und C110 nicht aufgefallen bzw. klar geworden.
Was ist der Unterschied zwischen TP-Link Tapo C200 und TP-Link Tapo C210?
Im direkten Vergleich der Eigenschaften besitzt die Kamera C200 eine HD-1080p-Auflösung, C210 ist mit 3MP angegeben. Tatsächlich fällt die Qualität der beiden Kameras im Ergebnis ziemlich gleich aus, was die Vermutung zulässt, dass die verbaute Hardware identisch ist und die Unterschiede durch die Software verursacht sind.
Die wesentlichen Unterschiede sind allerdings, dass die Kamera-Varianten mit C*10, also auch bei der Kamera C100 und C110,
- eine Personenerkennung bieten und
- die Bewegungs- und Personenerkennung einzeln abrufbar speichert (die C*00-Varianten bieten lediglich einen Zeitstrahl mit Markierungen).
Das Vorhaben: Zwei bewegliche Kameras TP-Link Tapo C210 werden an den gegenüberliegenden Ecken des Hauses unter dem Dach befestigt. Durch die 360°-Sicht können bei Bedarf alle vier Seiten des Hauses überwacht werden, primär ist dies allerdings nur für zwei Eingänge notwendig. Bisher zeigt unsere über 15-jährige LAN-Kamera-Erfahrung bisher noch keinen einzigen Ausfall einer Indoor-Kamera im Außenbereich, solange die Kamera vor direkter Nässe durch Regen geschützt ist.
Eine Einbindung in VIS als Bewegtbild ist nicht notwendig, weswegen regelmäßig ein Standbild per ioBroker-Script erzeugt und in VIS angezeigt werden soll, wir werden die Standbilder wie später beschrieben über ffmpeg aus dem Videostream extrahieren. Die Aufzeichnung der Bewegungserkennung erfolgt auf den SD-Karten bzw. einer MotionEye-Instanz.
Über ein ioBroker-Script soll außerdem die Bewegung der beiden TP-Link Tapo C210 Kameras für die Standbildaufnahme getriggert werden, also Position der Kamera verändern, Standbild aufnehmen und Kamera zurück auf die primäre Position verändern.
Die Tapo-Kameras bieten eine API, mit der wir die Steuerung übernehmen können, es gibt zwar keine offizielle API-Dokumentation von TP-Link, aber glücklicherweise bereits eine python-Bibliothek, die uns alle notwendigen Funktionen bereitstellt: https://github.com/JurajNyiri/pytapo
Wir werden also über ein lokales python-Script auf dem ioBroker-raspberryPI die Steuerung der Kameras übernehmen, das Script wird dabei über ein Blockly-Script mit den entsprechenden Befehlen aufgerufen, um die vollständige Steuerung und Kontrolle in ioBroker übernehmen zu können. Die Standbilder werden dann in einem lokalen Verzeichnis gespeichert und über einen lokalen Webserver als http-Request in VIS eingebunden.
Zur Installation der pytapo-Bibliothen müssen wir zunächst mit folgenden Befehlen auf dem raspberryPI in der Console python installieren:
sudo apt-get install python3-setuptools
sudo apt-get install python3-pip
Ist die Installation erfolgreich abgeschlossen, installieren wir die pytapo-Bibliothek mit folgendem Befehl:
sudo python3 -m pip install pytapo
Im nächsten Schritt müssen wir bei den Kameras den Zugriff über die API einrichten, hierzu definieren wir in den Kameraeinstellungen > Erweiterte Einstellungen > Kamerakonto einen Benutzernamen und ein Passwort für den Zugriff (Wir gehen davon aus, dass die Anmeldung der Kameras im TP-Link Konto und damit der APP bereits erfolgreich erfolgt ist).
WICHTIG:
Die API-Zugangsdaten für die Kameras C*00 lauten exakt so, wie in den Einstellungen eingegeben. Für die Kameras C*10 hingegen muss als Benutzername „admin“ und das Tapo-Konto-Passwort gewählt werden!
Wir legen also im nächsten Schritt unser python-Script an, um die Positionssteuerung der Kameras zu übernehmen.
Wir legen mit dem Befehl „mkdir tapo“ einen Ordner an, wecheln mit „cd tapo“ in den Ordner und starten den Editor „nano“. Wir fügen folgendes Script ein und speichern z.B. als c210.py:
#!/usr/bin/env python3 from pytapo import Tapo import sys position = sys.argv[2] #Position wird aus Aufruf-Argument ausgelesen cam = sys.argv[1] #KameraIP wird aus Aufruf-Argument ausgelesen user = 'admin' password = '' # Passwort des TP-Link-Tapo-Accounts host = cam tapo = Tapo(host, user, password) presets = tapo.getPresets() print(tapo.getBasicInfo()) print(presets) #tapo.setPreset(position)
Wir können jetzt mit folgendem Aufruf das Script testen, es verbindet sich mit der Kamera und listet alle gespeicherten Kamerapositionen auf:
python3 /home/pi/tapo/c210.py „IP-Adresse der Kamera“ 1
Funktioniert das Script problemlos, können wir folgende Zeilen auskommentieren bzw. kommentieren und das Script steuert die Positionen:
#presets = tapo.getPresets()
#print(tapo.getBasicInfo())
#print(presets)
tapo.setPreset(position)
Für den Aufruf aus ioBroker heraus als Blockly mussten wir den Umweg über ein Bash-Script gehen, das wie folgt aussieht:
#!/usr/bin/env bash
python3 /home/pi/tapo/c210.py $1 $2
Dieses speichern wir im Ordner /home/pi/tapo als c210.sh ab.
Installieren wir im nächsten Schritt ffmpeg, um aus dem rtsp-Stream der Kameras ein Standbild zu kopieren. Mit folgendem Befehl installieren wir ffmpeg auf dem raspberryPI:
sudo apt-get install ffmpeg
Nach erfolgreicher Installation folgt der einfache Webserver, um die Standbilder für die VIS-Anzeige bereitzustellen (neue Sicherheitsrichtlinien erlauben es leider nicht mehr, die Bilddateien direkt in dem VIS-ioBroker-Verzeichnis abzulegen).
Um den Webserver zu installieren, nutzen wir folgenden Befehl:
sudo apt install lighttpd
Der Webserver wird mit den Standardeinstellungen installiert und sollte sich automatisch starten. Wir können dies einfach über den Aufruf von http://IP-Adressse-raspberry prüfen, es sollte folgende Standard-Seite erscheinen:
Wir haben alle Installationen auf dem System vorgenommen und können nun die entsprechenden Scripte in ioBroker anlegen.
Das Blockly soll die im System hinterlegten Scripte aufrufen, die Kameras steuern bzw. bewegen und Standbilder erzeugen. Diese werden dann über den http-Link in eine beliebige VIS eingebunden.
Wir nutzen das Exec-Modul in Blockly, um die angelegten Scripte aufzurufen. Die Scripte sind dynamisch, d.h. wir geben die IP-Adresse der Kamera und die Position direkt im Blockly an. Zunächst müssen wir in den Einstellungen der Javascript-Instanz sicherstellen, dass wir exec-Aufrufe ausführen können, hierzu einfach den Haken setzen:
Danach legen wir ein Blockly-Script an, in dem wir nacheinander die Position der Kamera verändern und ein Standbild erzeugen.
Der exec-Befehl für die Positionierung lautet:
bash /home/pi/tapo/c210.sh IP-Adresse-Kamera Positionsnummer
Der Befehl für das Standbild lautet:
ffmpeg -rtsp_transport tcp -i rtsp://Benutzername:Passwort@192.168.XXX.XXX:554/stream2 -frames:v 1 -pix_fmt yuvj420p /var/www/html/Standbildname.jpg -y -loglevel 0
Das Standbild lässt sich direkt unter der URL http://IP-Adresse-raspberry/Standbildname.jpg abrufen und in einer VIS einbinden.
Hallo,
herzlichen dank an den Erstellers des Beitrags du hast ein problem von mir gelöst das mich seit 2 Jahren beschäftigt!!!! Ist es auch noch möglich eine Bewegungserkennung in de ioBroker zu bekommen?
Vielen dank im Voraus
Martin
Das freut uns! Die Bewegungserkennung sollte eigentlich problemlos über den onvif-Adapter möglich sein, Bewegungserkennung in der Kamera-APP aktivieren und einstellen, onvif-Adapter connecten und über den Datenpunkt IsMotion trigger erkennen.
Danke, auch bei mir eine lange gesuchte Lösung für die tollen TAPO-Kameras. Das Steuern klappt wunderbar, die Idee statt Video mit Standbildern zu arbeiten reicht auch bei mir für einen gelegentlichen Blick aus!
Moin und vielen Dank für das super Tutorial.
Leider hapert es bei mir an einigen Stellen und ich komme dort partout nicht weiter.
1.) lighttpd Installation war erfolgreich, ich sehe auch das es läuft (via systemctl status lighttpd), ich erreiche den Webserver auf Port 80 aber nicht. Ich bekomme dort nur ein 403 forbidden.
2.) ffmpeg will ebenso nicht – ich habe den Befehl versucht zunächst über die Console mal direkt auf dem Raspi abzufeuern, Bekomme dort immer nur ein „Server returned 401 Unauthorized (authorization failed)“ – sowohl mit dem admin Tapo Konto (habe eine C210) als auch mit meinem Benutzerkonto in der Kamera (mit der ich bei VLC einen Stream einsehen kann).
Alles andere funktioniert wunderbar. Irgendeine Idee, wo ich falsch abgebogen bin?
Zu 1) Evt. die Rechte der Dateien anpassen, z.B. chmod 777 „Pfad zu jpg“
Zu 2) Vielleicht Sonderzeichen im Passwort?
Danke für deine Antwort.
zu 1) Das mit den Rechten hatte ich schon versucht, ändert aber am Zugriff über IP auf Port 80 nichts, bleibt beim 403 Forbidden
zu 2) Hatte ich schon escaped und sogar auf ein „simples“ testweise geändert, um das auszuschließen, leider ohne Erfolg.
Was ich aber gefunden hatte im Netz war, dass ein rtsp Stream wohl zwei Auth Header in der response hat und ffmpeg damit gar nicht umgehen kann. Eventuell ist das der Grund, warum VLC es hinbekommt und ffmpeg nicht (aktuell nutze ich hier: ffmpeg version 4.1.9-0+deb10u1+rpt1). Vielleicht eine spannende Info für die, die versuchen das hier auch nachzubauen.
Heyho,
Brauch auch mal dein Ratschlag,
Ich möchte explizit nur in Iobroker die Bewegungserkennung an und ausschalten von hauseigen Tapo, dies kann man doch bestimmt über Pytabo, hast du eine Idee wie ?
Mfg
Die Scriptbibliothek pytapo hat auch eine Funktion, um den Privacy-Modus ein- und auszuschalten. Statt dem Befehl für eine Bewegung der Kamera, kann einfach diese Funktion aufgerufen werden.
Mag vielleicht nur bei mir ein Problem sein aber nach Durchführung der Installationssteps von Python3 und PIP hatte ich eine Version = Version 3.8 installiert habt.
Viele Grüße
Niko
Hi
ich hab ein prolem und zwar wen ich das hier eingebe
python3 /home/pi/tapo/c210.py „IP-Adresse der Kamera“ 1
kommt bei mir immer wieder das hier
Traceback (most recent call last):
File „/root/tapo/c210.py“, line 13, in
tapo = Tapo (host, user, password)
File „/usr/local/lib/python3.10/dist-packages/pytapo/__init__.py“, line 48, in __init__
self.basicInfo = self.getBasicInfo()
File „/usr/local/lib/python3.10/dist-packages/pytapo/__init__.py“, line 446, in getBasicInfo
return self.executeFunction(
File „/usr/local/lib/python3.10/dist-packages/pytapo/__init__.py“, line 119, in executeFunction
data = self.performRequest(
File „/usr/local/lib/python3.10/dist-packages/pytapo/__init__.py“, line 148, in performRequest
self.ensureAuthenticated()
File „/usr/local/lib/python3.10/dist-packages/pytapo/__init__.py“, line 68, in ensureAuthenticated
return self.refreshStok()
File „/usr/local/lib/python3.10/dist-packages/pytapo/__init__.py“, line 98, in refreshStok
raise Exception(„Invalid authentication data“)
Exception: Invalid authentication data
brauche hilfe
Da scheinen die Zugangsdaten nicht zu stimmen, letzte Zeile der Errormeldung.
Hm, also zuerst mal vielen vielen Dank für die Anleitung, ich würde damit gerne ein bisschen mehr Automatisierung aus meiner C100 herausholen. Leider komme ich nicht weiter, und ich weiß nicht, ob es an mir und meiner Umgebung liegt oder an der Camera. C100, Hardware 2.0, Firmware 1.3.9 Build 231019
Da ich kein Linux habe sondern einen Mac wollte ich es dort drauf ausprobieren. Also Xcode (Entwicklungsumgebung von Apple) installiert, den Paketmanager homebrew, über diesen dann python 3.10.2, schön mit pip das Paket pytapo installiert.
Das Basic Test Script von ganz am Anfang abgetippt (tatsächlich, kein copy-paste, dachte dabei an die Zeileenenden), gestartet und tja, läuft nicht.
Die Zeile, in der das tapo-Objekt erzeugt werden soll, erzeugt statt dessen einen Fehler:
Traceback (most recent call last):
File „/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/requests/models.py“, line 910, in json
return complexjson.loads(self.text, **kwargs)
File „/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/__init__.py“, line 346, in loads
return _default_decoder.decode(s)
File „/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/decoder.py“, line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File „/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/decoder.py“, line 355, in raw_decode
raise JSONDecodeError(„Expecting value“, s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File „/Users/admin/Entwicklungen/tapo/./c.py“, line 13, in
tapo = Tapo(host, user, password)
File „/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pytapo/__init__.py“, line 86, in __init__
self.basicInfo = self.getBasicInfo()
File „/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pytapo/__init__.py“, line 1009, in getBasicInfo
return self.executeFunction(
File „/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pytapo/__init__.py“, line 491, in executeFunction
data = self.performRequest(
File „/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pytapo/__init__.py“, line 530, in performRequest
self.ensureAuthenticated()
File „/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pytapo/__init__.py“, line 108, in ensureAuthenticated
return self.refreshStok()
File „/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pytapo/__init__.py“, line 305, in refreshStok
if self.isSecureConnection():
File „/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pytapo/__init__.py“, line 215, in isSecureConnection
response = res.json()
File „/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/requests/models.py“, line 917, in json
raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
requests.exceptions.JSONDecodeError: [Errno Expecting value] getcgivars(): Unsupported Content-Type.
: 0
Und hier weiß ich nicht weiter. Ist jemand hier so hilfreich, einen Tipp zu geben, was für eine weitere Analyse benötigt wird oder wo ich selbst weiter graben soll?
Grüße, Holger