Modul für Netgear Arlo-Kameras (Python-Version)

Begonnen von maluk, 07 Mai 2018, 20:40:06

Vorheriges Thema - Nächstes Thema

maluk

Bitte beachten: dieses Modul habe ich inzwischen durch ein neues Modul ersetzt, das kein Python mehr benötigt (siehe https://forum.fhem.de/index.php/topic,94025.0.html). Das nachfolgend beschriebene Modul wird daher nicht mehr weiterentwickelt.

Arlo Sicherheitskameras von NETGEAR werden über eine Basisstation an die Arlo Cloud angebunden. Dieses Modul nutzt das Python-Modul "arlo" (https://github.com/jeffreydwalter/arlo). Für die Kommunikation wird ein Python-Prozess als Server gestartet, der die Verbindung zur Arlo Cloud aufbaut und per HTTP Befehle von FHEM empfängt.

Um das Modul nutzen zu können, müssen zunächst einige Python-Module installiert werden:

Falls Pip noch nicht installiert ist, zunächst dieses installieren:

sudo apt-get install python-pip
sudo apt-get install python-cffi


Danach mit pip folgende Module installieren:


sudo pip install urllib3[secure]
sudo pip install sseclient
sudo pip install git+https://github.com/jeffreydwalter/arlo
sudo pip install fhem


Falls dies nicht funktioniert, kann man noch mit dem Parameter "-i https://pypi.python.org/simple" den Server festlegen, von dem die Installations-Informationen geholt werden sollen,
also z.B. sudo pip install -i https://pypi.python.org/simple cffi

Die beiden Dateien 49_Arlo.pm und 49_Arlo.py herunterladen und nach /opt/fhem/FHEM kopieren. Der fhem-User muss später Leserechte auf die beiden Dateien haben. Falls FHEM nicht neu gestartet werden soll, kann das Modul mit reload 49_Arlo geladen werden.

Nun muss die Verbindung zur Arlo Cloud hergestellt werden. Dies erfolgt in FHEM mit folgendem Befehl:

define Arlo_Cloud Arlo ACCOUNT hans.mustermann@xyz.de meinPasswort

hans.mustermann@xyz.de durch die E-Mail-Adresse ersetzen, mit der man bei Arlo registriert ist, meinPasswort durch das Passwort dort. Nach dem Define wird der Python-Server auf Port 8001 gestartet. Sollte dieser Port bereits durch einen anderen Prozess belegt sein, kann beim Define als dritter Parameter hinter Username und Passwort ein anderer Port angeben werden.

Nach der erfolgreichen Definition des Account kann auf dem neu erzeugten Device set Arlo_Cloud autocreate aufgerufen werden. Dies legt die Basistation(en) an, die zu dem Arlo Account zugeordnet sind. Das neue Device befindet sich im Raum Arlo.

Um die Kameras anzulegen, muss auf dem Device der Basisstation erneut ein autocreate ausgeführt werden: set Arlo_Basisstation autocreate, wobei Arlo_Basisstation durch die erkannte Basissation zu ersetzen ist. Danach sind die Kameras ebenfalls im Raum Arlo vorhanden.

Folgende Funktionen stehen für die Devices zur Verfügung:

Account:

  • startServer => Starten des Python-Servers, falls dieser aus irgendwelchen Gründen nicht mehr läuft
  • stopServer => Stoppen des Python-Servers (wird normalerweise nicht benötigt)
Basisstation:

  • arm => Aktivieren der Bewegungserkennung
  • disarm => Deaktivieren der Bewegungserkennung
  • updateReadings => aktuelle Daten der zur Basisstation gehörenden Kameras aus der Coud abrufen. Dies passiert einmal stündlich automatisch, falls dies nicht durch Setzen des Attributes disabled=1 an der Basisstation unterbunden wird. Den Abruf-Intervall kann man durch Setzen des Attributs interval anpassen (Angabe von Sekunden, also z.B. 600 für Abruf alle 10 Minuten oder 7200 für Abruf alle 2 Stunden).
Kamera:

  • on => Kamera einschalten
  • off => Kamera ausschalten
  • snapshot => ein Standbild aufnehmen. Dieses kann über die URL aus dem Reading snapshotUrl aufgerufen werden. Damit der Befehl funktioniert, muss die Kamera den Status on haben.
  • startRecording => Aufnahme starten. Damit der Befehl funktioniert, muss die Kamera den Status on haben.
  • stopRecording => Aufnahme stoppen. Die Aufnahme kann über lastVideoUrl abgerufen werden, das Standbild dazu unter lastVideoThumbnailUrl.

Noch einige Hinweise zur Funktionsweise:
Das Modul wird vermutlich nur unter Linux funktionieren. Es muss auf jeden Fall ein Verzeichnis /tmp vorhanden sein und der FHEM-User muss Schreibzugriff auf dieses Verzeichnis haben. Der Python-Server schreibt ein Logfile /tmp/arlo.log, in dem man bei Problemen evtl. Hinweise findet. Um mehr Details zu bekommen, kann in 49_Arlo.py der Loglevel temporär auf DEBUG gesetzt werden.
Danach muss über FHEM der Server neu gestartet werden (zuerst set Arlo_Cloud stopServer, kurz warten, dann set Arlo_Cloud startServer).

Der Python-Server verbindet sich über Telnet wieder mit FHEM, um Befehle absetzen zu können. Wenn für Telnet ein Passwort in FHEM hinterlegt ist, wird dieses aus der Konfiguration ausgelesen und an den Python-Server übergeben. Ich habe bisher noch nicht ohne Telnet-Passwort getestet. Es müsste eigentlich funktionieren, falls es aber Probleme gibt bitte melden.

Der Python-Server bekommt über einen separaten Thread Änderungen vom Arlo Cloudserver mit. Wenn z.B. Bewegung erkannt wird, ändert sich der activityState der betroffenen Kamera zuerst auf alertStreamActive. Wenn man in FHEM Events bei Bewegung auslösen möchte, muss man dieses Reading überwachen.

Eigentlich bekommt FHEM alle Änderungen über den Python-Server mit. Trotzdem ist ein Auto-Polling implementiert, das jede Stunde den Status der Basisstation und der Kameras abfrägt. Um das Poll-Intervall anzupassen, muss an der Basisstation in FHEM das Attribut interval gesetzt werden (in Sekunden, also 1 Stunde = 3600). Um das Polling komplett zu deaktivieren, muss das Attribut disable für die Basisstation auf 1 gesetzt werden.

Bitte beachten, dass der Python-Server aktuell nur mit einer Basisstation funktioniert. Falls jemand mehrere Basisstationen im Einsatz hat, bitte melden.

Update 10.05.2018:
- Bugfixing beim Starten von Aufnahmen. Während der Aufnahme gibt es jetzt auch ein reading streamUrl mit einem RTSPS-Link zur aktuellen Aufnahme
- Probleme mit falscher Reihenfolgen im Python-Pfad für einige Raspberries behoben

Update 12.05.2018
- an der Basisstation kann mit set mode <Mode-Name> ein benutzerdefinierter Modus gesetzt werden (alternativ zu arm/disarm)

Update 19.05.2018
- am Cloud-Device können jetzt die Attribute downloadDir und downloadLink gesetzt werden. Damit werden die Videos und Bilder aus der Cloud auf das lokale System kopiert.

Update 21.06.2018
- bei Verbindungsabbrüchen (z.B. DSL-Zwangstrennung) erfolgt korrekter neuer Verbindungsaufbau zum Netgear-Server
- Sirene der Basisstation kann jetzt ausgelöst werden (set siren on/off)
- Helligkeit der Kameras kann angepasst werden (set brigtness)

Update 22.06.2018
- Unterstützung mehrerer Basisstationen

Update 14.10.2018
- Umstellung auf NonBlocking-Calls zum Server
- Angabe des Server-Ports beim Define des Cloud-Devices wurde ignoriert

Update 21.10.2018
- Telnet-Port und -Passwort können im define des Cloud-Devices jetzt optional manuell gesetzt werden. Normalerweise werden beide Parameter automatisch erkannt.

Update 24.11.2018
- verbessertes Fehler-Handling bei Verbindungsabbrüchen

Vampy20

Hallo maluk,

gerade alles eingerichtet. Bis auf leichte Installationsprobleme wg. fehlende Abhängigkeiten klappt alles.
Basis Station und Kameras werden mittels autocreate erkannt. Arm/Disarm funktioniert auch zuverlässig.
Als nächstes werde ich versuchen die Aufnahmen abzufragen.

Danke für das Modul.

Grüße,
Vampy

FHEM 5.7 auf RPi 2 (Raspbian 4.4.13+, Perl v5.20.2), HM-CFG-USB, HM-SEC-RHS, HM-ES-PMSw1-Pl, HM-LC-Bl1PBU-FM, HM-SEC-SD-2, co2mini, Philips Hue, MySensors, DashButton

Vampy20

Der Server verbraucht die verfügbare CPU, Arlo log ist voll mit dieser Warnung:


2018-05-07 22:27:53,331 WARNING: 'EventStream' object has no attribute 'event_stream_thread'
2018-05-07 22:27:53,340 WARNING: 'EventStream' object has no attribute 'event_stream_thread'
2018-05-07 22:27:53,349 WARNING: 'EventStream' object has no attribute 'event_stream_thread'
2018-05-07 22:27:53,357 WARNING: 'EventStream' object has no attribute 'event_stream_thread'
2018-05-07 22:27:53,366 WARNING: 'EventStream' object has no attribute 'event_stream_thread'
FHEM 5.7 auf RPi 2 (Raspbian 4.4.13+, Perl v5.20.2), HM-CFG-USB, HM-SEC-RHS, HM-ES-PMSw1-Pl, HM-LC-Bl1PBU-FM, HM-SEC-SD-2, co2mini, Philips Hue, MySensors, DashButton

choetzu

sehr cool!! Werde ich über Auffahrt ausprobieren.

Was das ganze abrunden würde, wäre noch ein Event/Reading sobald motion detected wurde.  Dies brauche ich, um die Alarmanlage auszulösen. Z.Z. mach ich den Umweg via IFTTT. Ginge sowas?
Raspi3, EnOcean, Zwave, Homematic

Vampy20

Das Deinstallieren von sseclient-py hat den CPU Verbrauch wesentlich reduziert und die Warnungen im Log sind weg.
FHEM 5.7 auf RPi 2 (Raspbian 4.4.13+, Perl v5.20.2), HM-CFG-USB, HM-SEC-RHS, HM-ES-PMSw1-Pl, HM-LC-Bl1PBU-FM, HM-SEC-SD-2, co2mini, Philips Hue, MySensors, DashButton

maluk

Ich bin mir nicht sicher, ob das Python-Arlo-Modul ohne sseclient funktioniert. Versuche mal folgendes: stoppe den Python-Server, installiere nochmal sseclient-py, lösche /tmp/arlo.log und starte dann nochmal den Python-Server. Danach bitte mal die ersten Zeilen von /tmp/arlo.log posten, vielleicht erkennt man dort den Fehler.

Ich verwende das Modul auf einem Cubietruck und bei mir verbraucht das Modul meistens zwischen 0,3 und 0,7% CPU.

Vampy20

Hab ich gemacht:
2018-05-08 20:34:20,971 INFO: Started arlo http server on port 8001
2018-05-08 20:34:20,974 INFO: Start event handler
2018-05-08 20:34:20,980 WARNING: 'EventStream' object has no attribute 'event_stream_thread'
2018-05-08 20:34:20,989 WARNING: 'EventStream' object has no attribute 'event_stream_thread'
2018-05-08 20:34:20,998 WARNING: 'EventStream' object has no attribute 'event_stream_thread'
2018-05-08 20:34:21,007 WARNING: 'EventStream' object has no attribute 'event_stream_thread'
2018-05-08 20:34:21,022 WARNING: 'EventStream' object has no attribute 'event_stream_thread'
2018-05-08 20:34:21,034 WARNING: 'EventStream' object has no attribute 'event_stream_thread'
2018-05-08 20:34:21,043 WARNING: 'EventStream' object has no attribute 'event_stream_thread'
2018-05-08 20:34:21,052 WARNING: 'EventStream' object has no attribute 'event_stream_thread'
2018-05-08 20:34:21,061 WARNING: 'EventStream' object has no attribute 'event_stream_thread'


Den Trick mit sseclient-py habe ich von hier: https://github.com/jeffreydwalter/arlo/issues/54

Arm/Disarm funktioniert wunderbar, aber den Rest bekomme ich nicht hin. Es werden auch keine Readings angelegt.
FHEM 5.7 auf RPi 2 (Raspbian 4.4.13+, Perl v5.20.2), HM-CFG-USB, HM-SEC-RHS, HM-ES-PMSw1-Pl, HM-LC-Bl1PBU-FM, HM-SEC-SD-2, co2mini, Philips Hue, MySensors, DashButton

maluk

#7
Kannst du mal noch im FHEM-Log prüfen, ob dort noch um 20:34 Uhr  irgendwelche Fehlermeldungen von Python ausgegeben wurden?

Aber wahrscheinlich ist das tatsächlich die Lösung, da sseclient ja bestehen bleibt. Wenn der Rest nicht funktioniert, bitte mal in meinem Modul 49_Arlo.py den Log-Level auf DEBUG stellen. Dort müsste man dann eigentlich Events sehen, die von Arlo zurückgesendet werden.

Hast du in der Basisstation das set autocreate ausgeführt? Falls ja, wurden keine Kameras erkannt?

maluk

@choetzu: das Event für deine Alarmanlage kannst du ganz leicht über Notify erzeugen:

define Terasse_Bewegung notify Kamera_Terrasse:activityState:.alertStreamActive { Log 1, "Bewegung auf Terrasse erkannt"}

Kamera_Terrasse ist in diesem Beispiel der FHEM Device-Name der betroffenen Kamera. Wenn Bewegung erkannt und die Aufnahme gestartet wird, wechselt das Reading activityState auf den Wert alertStreamActive. Der wird einfach obe abgefragt und eine Aktion ausgeführt (im Beispiel die Ausgabe ins Logfile).

Vampy20

#9
Ab 20:34 steht folgendes im FHEM log:

Exception AttributeError: "'EventStream' object has no attribute 'event_stream_thread'" in <bound method EventStream.__del__ of <Arlo.EventStream object at 0xb60f4cf0>> ignored
Exception AttributeError: "'EventStream' object has no attribute 'event_stream_thread'" in <bound method EventStream.__del__ of <Arlo.EventStream object at 0xb60f4810>> ignored
Exception AttributeError: "'EventStream' object has no attribute 'event_stream_thread'" in <bound method EventStream.__del__ of <Arlo.EventStream object at 0xb60f4cf0>> ignored
Exception AttributeError: "'EventStream' object has no attribute 'event_stream_thread'" in <bound method EventStream.__del__ of <Arlo.EventStream object at 0xb60f4810>> ignored


autocreate hat funktioniert und die Kameras wurden erkannt.

Und hier noch Arlo.log mit Debug:

2018-05-08 21:25:57,331 DEBUG: Starting new HTTPS connection (1): arlo.netgear.com
2018-05-08 21:25:58,017 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/login/v2 HTTP/1.1" 200 630
2018-05-08 21:25:58,256 DEBUG: https://arlo.netgear.com:443 "GET /hmsweb/users/devices HTTP/1.1" 200 None
2018-05-08 21:25:58,290 INFO: Started arlo http server on port 8001
2018-05-08 21:25:58,293 INFO: Start event handler
2018-05-08 21:25:58,586 DEBUG: https://arlo.netgear.com:443 "GET /hmsweb/client/subscribe?token=*************************** HTTP/1.1" 200 None
2018-05-08 21:25:59,152 DEBUG: Starting new HTTPS connection (2): arlo.netgear.com
2018-05-08 21:25:59,729 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 None
2018-05-08 21:26:29,526 DEBUG: https://arlo.netgear.com:443 "GET /hmsweb/users/devices HTTP/1.1" 200 3520
2018-05-08 21:26:29,672 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:26:29,775 DEBUG: {u'resource': u'modes', u'to': u'HS*******99_web', u'action': u'is', u'from': u'48E4******CE', u'transId': u'web!18c9********50', u'properties': {u'active': u'mode0', u'modes': [{u'rules': [], u'type': u'disarmed', u'name': u'', u'id': u'mode0'}, {u'rules': [u'rule0', u'rule2'], u'type': u'armed', u'name': u'', u'id': u'mode1'}, {u'rules': [u'rule1'], u'name': u'test', u'id': u'mode2'}]}}
2018-05-08 21:26:29,779 INFO: Send command to FHEM: set myArloCloud reading 48E4****CE state disarmed
2018-05-08 21:26:29,816 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:26:30,426 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
FHEM 5.7 auf RPi 2 (Raspbian 4.4.13+, Perl v5.20.2), HM-CFG-USB, HM-SEC-RHS, HM-ES-PMSw1-Pl, HM-LC-Bl1PBU-FM, HM-SEC-SD-2, co2mini, Philips Hue, MySensors, DashButton

maluk

Offensichtlich sind sseclient-py und jeffreydwalter/arlo inkompatibel, daher war die Deinstallation von sseclient-py richtig. Werden bei deinen Kameras die Readings batteryLevel, chargingState, signalStrength und state korrekt angezeigt? Diese Readings werden angelegt/aktualisiert, wenn man set Basisstation updateReadings aufruft.

Außerdem kannst du noch prüfen, in welchem Intervall im /tmp/arlo.log der Request "POST /hmsweb/users/devices/notify" ausgeführt wird. Das sollte nur alle 30 Sekunden erfolgen. Bis vor ein paar Tagen hatte jeffreydwalter/arlo noch einen Fehler und hat alle 2 Sekunden diese Heartbeat-Request ausgeführt.

Vampy20

#11
Das ist ja das Problem, die Readings werden erst gar nicht angelegt.


2018-05-08 21:26:29,816 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:26:30,426 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:27:00,846 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:27:31,342 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:28:02,303 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:28:38,529 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:29:09,216 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:29:39,741 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:29:40,346 DEBUG: https://arlo.netgear.com:443 "GET /hmsweb/users/devices HTTP/1.1" 200 3518
2018-05-08 21:29:40,491 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:29:40,631 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4*****CE HTTP/1.1" 200 16
2018-05-08 21:30:10,137 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:30:40,630 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:31:11,108 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:31:41,597 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 21:32:12,042 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 22:01:52,688 DEBUG: Resetting dropped connection: arlo.netgear.com
2018-05-08 22:01:53,409 DEBUG: https://arlo.netgear.com:443 "GET /hmsweb/users/devices HTTP/1.1" 200 3522
2018-05-08 22:01:53,554 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16
2018-05-08 22:01:53,696 DEBUG: https://arlo.netgear.com:443 "POST /hmsweb/users/devices/notify/48E4******CE HTTP/1.1" 200 16


Die 30 Sekunden scheinen eingehalten zu werden, aber seit 21:32 gibt es keinen LogEintrag mehr, obwohl der Server noch läuft.
FHEM 5.7 auf RPi 2 (Raspbian 4.4.13+, Perl v5.20.2), HM-CFG-USB, HM-SEC-RHS, HM-ES-PMSw1-Pl, HM-LC-Bl1PBU-FM, HM-SEC-SD-2, co2mini, Philips Hue, MySensors, DashButton

choetzu

i
Zitat von: maluk am 08 Mai 2018, 21:22:20
@choetzu: das Event für deine Alarmanlage kannst du ganz leicht über Notify erzeugen:

define Terasse_Bewegung notify Kamera_Terrasse:activityState:.alertStreamActive { Log 1, "Bewegung auf Terrasse erkannt"}

Kamera_Terrasse ist in diesem Beispiel der FHEM Device-Name der betroffenen Kamera. Wenn Bewegung erkannt und die Aufnahme gestartet wird, wechselt das Reading activityState auf den Wert alertStreamActive. Der wird einfach obe abgefragt und eine Aktion ausgeführt (im Beispiel die Ausgabe ins Logfile).
Super herzlichen Dank.

Ich habs auch grad gemäss deiner Anleitung installiert. Basisstation und die Kameras wurden alle erkannt. Aber ich habe genau das selbe Problem wie Vampy20. Da geht die Post ab im Log...

Leider weiss ich nicht, wie man sseclient-py deinstalliert. Mit
sudo apt remove sseclient-py
hat es nicht funktioniert.

Ich habe nun alles wieder deleted. Warte bis Vampy20 Problem gelöst ist...

Lg c
Raspi3, EnOcean, Zwave, Homematic

Vampy20

Zitat von: choetzu am 08 Mai 2018, 22:11:49
Leider weiss ich nicht, wie man sseclient-py deinstalliert. Mit

Versuch es mit
sudo pip uninstall sseclient-py
FHEM 5.7 auf RPi 2 (Raspbian 4.4.13+, Perl v5.20.2), HM-CFG-USB, HM-SEC-RHS, HM-ES-PMSw1-Pl, HM-LC-Bl1PBU-FM, HM-SEC-SD-2, co2mini, Philips Hue, MySensors, DashButton

choetzu

Zitat von: Vampy20 am 08 Mai 2018, 22:13:23
Versuch es mit
sudo pip uninstall sseclient-py

danke. ich teste es morgen. Bei dir funktioniert es ohne sseclient-py problemlos? Nicht dass ich es lösche und dann sind andere Programme/Module davon abhängig.

danke. lg c
Raspi3, EnOcean, Zwave, Homematic