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

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

Vorheriges Thema - Nächstes Thema

sparkiie

Zitat von: maluk am 14 Oktober 2018, 10:20:52
Vielleicht hilft dir diese Beschreibung bei der Fehlersuche. Alternativ kann ich mein Modul auch so anpassen, dass man optional Telnet-Port und Telnet-Passwort manuell angeben kann, dann hast du es selbst in der Hand, mit welchen Parametern der Server aufgerufen wird.

Wichtig: der Port, den man im Cloud-Device angebeben kann, ist nicht der Telnet-Port sondern der Port, unter dem der Python-Server-Prozess läuft. Dieser muss auf jeden Fall vom Telnet-Port abweichen, da dieser von FHEM belegt ist.

Das mit den Ports hatte ich erst falsch interpretiert, nun aber soweit verstanden.
Es wäre schön, wenn man den Port und ggf. das Kennwort für Telnet alternativ manuell eintragen könnte. Ich denke, dass würde mein Problem lösen...

Niko1987

Servus :)
ZitatVielleicht hilft dir diese Beschreibung bei der Fehlersuche. Alternativ kann ich mein Modul auch so anpassen, dass man optional Telnet-Port und Telnet-Passwort manuell angeben kann, dann hast du es selbst in der Hand, mit welchen Parametern der Server aufgerufen wird.
Das wär echt top! Ich steig bei dem Telnet noch nicht ganz durch  ???

Übrigens ist im DevSpec im Arlo Modul ein kleiner Fehler:

DOWNLOADDIR

Falls dieses Attribut am Cloud-Device (Subtype ACCOUNT) gesetzt ist, werden Dateien, die in der Arlo Cloud erzeugt werden (Videos / Bilder) in das hier angegebene Verzeichnis heruntergeladen. Damit man auf die Dateien über http zugreifen kann, muss ein Verzeichnis unterhalb /opt/fhem/www angegeben werden (oder dieses selbst). Wichtig: der fhem-User muss in in diesem Verzeichnis Schreibrechte haben.
DOWNLOADDIR

Falls über das Attribut downloadDir die Dateien ins lokale Verzeichnis heruntergeladen werden, kann über dieses Attribut am Cloud-Device angegeben werden, dass die in den Kameras gesetzten Links auf die lokale Kopie zeigen sollen. Die Angabe des Links muss in der Form http://hostname:8083/fhem/unterverzeichnis-unter-www angegeben werden.


das zweite DOWNLOADDIR sollte vermutlich DOWNLOADLINK heissen.

Aber so ist das echt ein tolles Modul. Habs schon in der TabletUI eingebunden.

Vielen Dank für deine Hilfe und deine Arbeit

Gruß
Flo


choetzu

Zitat von: maluk am 14 Oktober 2018, 09:57:18
Das Muster, dass der Verbindungsabbruch durch den Heartbeat verursacht wird, zieht sich sowohl durch Eure Meldungen als auch meine Verbindungsabbrüche, die allerdings deutlich seltener auftreten als hier beschrieben. Es sieht für mich so aus, als ob ein Verbindungsfehler im Heartbeat dazu führt, dass der Heartbeat-Thread komplett abstürzt und dadurch keine Heartbeat-Signale mehr an den Arlo-Server gesendet werden. Dadurch wird der Arlo-Server vermutlich irgendwann einfach die Verbindung abbrechen.

Das Exception Handling im Heartbeat-Thread ist quasi nicht vorhanden. Daher habe ich Modul /usr/local/lib/python2.7/dist-packages/Arlo.py in Zeile 308 folgende 2 Zeilen eingefügt:


                except Exception as e:
                    print(e)


Die modifizierte Heartbeat-Methode sieht jetzt also wie folgt aus:


        def Heartbeat(self, stop_event):
            while not stop_event.wait(90.0):
                try:
                    self.Ping(basestation)
                except queue.Empty:
                    pass
                except Exception as e:
                    print(e)


Es wäre super, wenn Ihr die Anpassung bei Euch auch vornehmen und danach den Python-Server neu starten könntet. Falls dies die Lösung ist, werde ich dies an Jeffrey Walter melden, der ja der Autor des Python-Moduls ist, das ich intern verwende.

Ich habe das versucht, aber danach konnte ich das Modul nicht mehr laden. AUch ein sudo reboot des Raspi und den Neustart des Arlo-Servers hat nix gebracht. Ich habe es wieder entfernt und es geht wieder...

Aber die Fehlermeldungen bleiben:
Exception in thread HeartbeatThread:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/local/lib/python2.7/dist-packages/Arlo.py", line 304, in Heartbeat
    self.Ping(basestation)
  File "/usr/local/lib/python2.7/dist-packages/Arlo.py", line 407, in Ping
    return self.NotifyAndGetResponse(basestation, {"action":"set","resource":"subscriptions/"+self.user_id+"_web","publishResponse":False,"properties":{"devices":[basestation_id]}})
  File "/usr/local/lib/python2.7/dist-packages/Arlo.py", line 387, in NotifyAndGetResponse
    transId = self.Notify(basestation, body)
  File "/usr/local/lib/python2.7/dist-packages/Arlo.py", line 378, in Notify
    self.request.post('https://arlo.netgear.com/hmsweb/users/devices/notify/'+body['to'], body, headers={"xcloudId":basestation.get('xCloudId')})
  File "/usr/local/lib/python2.7/dist-packages/Arlo.py", line 157, in post
    return self._request(url, 'POST', params, headers, raw)
  File "/usr/local/lib/python2.7/dist-packages/Arlo.py", line 136, in _request
    r = self.session.post(url, json=params, headers=headers)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 559, in post
    return self.request('POST', url, data=data, json=json, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 512, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 622, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 495, in send
    raise ConnectionError(err, request=request)
ConnectionError: ('Connection aborted.', error("(104, 'ECONNRESET')",))

Raspi3, EnOcean, Zwave, Homematic

maluk

Bei Python ist es wichtig, dass die Einrückung der Befehle mit gleich vielen Zeichen gemacht wird. Eine Einrückung in Arlo.py besteht immer aus 4 Leerzeichen (keinen Tab verwenden, sondern Leerzeichen!). Wenn das nicht eingehalten wird, ist das für Python ein Syntax-Fehler und das Modul wird nicht gestartet. Also einfach darauf achten, dass die "except Execption as e" diesselbe Einrückung hat wie das "except queue.Empty" und dass "print(e)" diesselbe Einrückung wie "pass" hat.

Der von dir gepostete Fehler "ConnectionError: ('Connection aborted.', error("(104, 'ECONNRESET')",))" ist eindeutig ein Netzwerk-Problem, da kann ich leider nichts machen. Die Idee hinter meiner Code-Änderung ist, dass genau solche Netzwerk-Probleme zukünftig nicht mehr dafür sorgen sollen, dass der Heartbeat-Thread abstürzt und dadurch die Verbindung des Arlo-Servers zur Cloud irgendwann in einen Timeout läuft.

maluk

Zitat von: Niko1987 am 14 Oktober 2018, 15:22:45
Servus,

danke. Hab das mal geändert.

Mal sehen :) Im Log bleibt aber immernoch ein eintrag bei jedem UpdateReadings und bei jedem cmd an eine Cam

127.0.0.1 - - [14/Oct/2018 15:10:59] "GET /BASESTATION?device=Arlo_Arlo&cmd=updateReadings&basestationId=xxx&cameraId= HTTP/1.0" 200 -
127.0.0.1 - - [14/Oct/2018 15:13:25] "GET /BASESTATION?device=Arlo_Arlo&cmd=arm&basestationId=xxx&cameraId= HTTP/1.0" 200 -
127.0.0.1 - - [14/Oct/2018 15:13:44] "GET /BASESTATION?device=Arlo_Arlo&cmd=disarm&basestationId=xxx&cameraId= HTTP/1.0" 200 -
127.0.0.1 - - [14/Oct/2018 15:13:45] "GET /BASESTATION?device=Arlo_Arlo&cmd=disarm&basestationId=xxx&cameraId= HTTP/1.0" 200 -
127.0.0.1 - - [14/Oct/2018 15:13:48] "GET /BASESTATION?device=Arlo_Arlo&cmd=arm&basestationId=xxx&cameraId= HTTP/1.0" 200 -
127.0.0.1 - - [14/Oct/2018 15:13:52] "GET /CAMERA?device=Arlo_Hof&cmd=off&basestationId=xxx&cameraId=4N7167SKCDA8D HTTP/1.0" 200 -
127.0.0.1 - - [14/Oct/2018 15:13:55] "GET /CAMERA?device=Arlo_Hof&cmd=on&basestationId=xxx&cameraId=xxxHTTP/1.0" 200 -


Gruß
Flo

Sorry für die Verwirrung, ich hatte da etwas falsch in Erinnerung. Das ist das normale Verhalten innerhalb des FHEM-Logfiles. Detail-Informationen stehen im Logfile /tmp/arlo.log, falls der Log-Level in 49_Arlo.py auf DEBUG steht.

maluk

Zitat von: Niko1987 am 14 Oktober 2018, 20:57:03
DOWNLOADDIR

Falls dieses Attribut am Cloud-Device (Subtype ACCOUNT) gesetzt ist, werden Dateien, die in der Arlo Cloud erzeugt werden (Videos / Bilder) in das hier angegebene Verzeichnis heruntergeladen. Damit man auf die Dateien über http zugreifen kann, muss ein Verzeichnis unterhalb /opt/fhem/www angegeben werden (oder dieses selbst). Wichtig: der fhem-User muss in in diesem Verzeichnis Schreibrechte haben.
DOWNLOADDIR

Falls über das Attribut downloadDir die Dateien ins lokale Verzeichnis heruntergeladen werden, kann über dieses Attribut am Cloud-Device angegeben werden, dass die in den Kameras gesetzten Links auf die lokale Kopie zeigen sollen. Die Angabe des Links muss in der Form http://hostname:8083/fhem/unterverzeichnis-unter-www angegeben werden.


das zweite DOWNLOADDIR sollte vermutlich DOWNLOADLINK heissen.

Danke für den Hinweis, ich korrigiere das mit der nächsten Version. Da werde ich dann auch die Möglichkeit einbauen, Telnet-Port und Telnet-Passwort manuell zu setzen.

maluk

Zitat von: sparkiie am 14 Oktober 2018, 19:52:18
Es wäre schön, wenn man den Port und ggf. das Kennwort für Telnet alternativ manuell eintragen könnte. Ich denke, dass würde mein Problem lösen...

Telnet-Port und -Passwort können jetzt auch manuell gesetzt werden. Einfach beim Define des Cloud-Devices hinter dem Python-Server-Port anhängen, also

define Arlo_Cloud Arlo ACCOUNT user@domain.de arlo-password 8001 7072 fhem-telnet-passwort

Wichtig: der Python-Server-Port muss in diesem Fall zwingend angegeben werden. Default-Wert hierfür ist 8001. Im Beispiel habe ich als FHEM-Telnet-Port 7072 genommen, also den Default-Wert von FHEM.

Falls Ihr wieder auf das Default-Verhalten wechseln möchtet (also automatische Erkennung von Telnet-Port und -Passwort) muss nach dem Entfernen der neuen Parameter aus dem define FHEM neu gestartet werden.

sparkiie

Zitat von: maluk am 21 Oktober 2018, 10:49:15
Telnet-Port und -Passwort können jetzt auch manuell gesetzt werden. Einfach beim Define des Cloud-Devices hinter dem Python-Server-Port anhängen, also

define Arlo_Cloud Arlo ACCOUNT user@domain.de arlo-password 8001 7072 fhem-telnet-passwort

Wichtig: der Python-Server-Port muss in diesem Fall zwingend angegeben werden. Default-Wert hierfür ist 8001. Im Beispiel habe ich als FHEM-Telnet-Port 7072 genommen, also den Default-Wert von FHEM.

Falls Ihr wieder auf das Default-Verhalten wechseln möchtet (also automatische Erkennung von Telnet-Port und -Passwort) muss nach dem Entfernen der neuen Parameter aus dem define FHEM neu gestartet werden.

Prima, Danke! 👍

choetzu

Zitat von: maluk am 20 Oktober 2018, 09:25:31
Bei Python ist es wichtig, dass die Einrückung der Befehle mit gleich vielen Zeichen gemacht wird. Eine Einrückung in Arlo.py besteht immer aus 4 Leerzeichen (keinen Tab verwenden, sondern Leerzeichen!). Wenn das nicht eingehalten wird, ist das für Python ein Syntax-Fehler und das Modul wird nicht gestartet. Also einfach darauf achten, dass die "except Execption as e" diesselbe Einrückung hat wie das "except queue.Empty" und dass "print(e)" diesselbe Einrückung wie "pass" hat.

Der von dir gepostete Fehler "ConnectionError: ('Connection aborted.', error("(104, 'ECONNRESET')",))" ist eindeutig ein Netzwerk-Problem, da kann ich leider nichts machen. Die Idee hinter meiner Code-Änderung ist, dass genau solche Netzwerk-Probleme zukünftig nicht mehr dafür sorgen sollen, dass der Heartbeat-Thread abstürzt und dadurch die Verbindung des Arlo-Servers zur Cloud irgendwann in einen Timeout läuft.

danke, das Einrücken hat geklappt. Perfekt.. lange hat es auch gut ausgesehen, doch nun kommt erneut eine Fehlermeldung:

Exception in thread EventStream:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/local/lib/python2.7/dist-packages/Arlo.py", line 294, in QueueEvents
    self.event_streams[basestation_id].Disconnect()
  File "/usr/local/lib/python2.7/dist-packages/Arlo.py", line 99, in Disconnect
    self.Unregister()
  File "/usr/local/lib/python2.7/dist-packages/Arlo.py", line 119, in Unregister
    if self.heartbeat_thread != threading.current_thread():
AttributeError: 'EventStream' object has no attribute 'heartbeat_thread'


so wie ich dich verstanden habe, kann man da nix machen, ausser in meinem eigenen Netzwerk...oder?
Raspi3, EnOcean, Zwave, Homematic

Niko1987

Hallo zusammen,

ich hab den neuesten Stand installiert. Leider verliert fhem trotz allem die Verbindung zu Arlo.
Ich kann zwar zu jeder Zeit befehle an die Arlo Basis schicken, diese kommen auch an aber ich bekomm keine Rückmeldung mehr.
Die Verbindung bricht sporadisch ab. Ohne Fehler im FileLog.

Ich habs jetzt erst mal über einen kleinen Umweg gelöst:

Ich erstelle einen userReading in der BASESTATION mit dem Namen Verbindung:
attr Arlo_Arlo userReadings Verbindung { return "getrennt" if ( (time_str2num(ReadingsTimestamp($NAME,"state","0")) - time_str2num(OldTimestamp($NAME))) > 600 );; return "verbunden" }

Wenn in diesen 600 Sekunden kein neues Reading mehr bekomme wird der Reading "Verbindung" auf getrennt gesetzt.
Den Intervall hab ich auf 300 Sekunden
attr Arlo_Arlo interval 300

Dann schau ich einfach mit einem Notify und warte bis der Reading den Status "getrennt" bekommt.
Stoppe die ArloCloud, warte kurz und starte die Arlo_Cloud wieder. Gefolgt von einem updateReadings der Arlo_Arlo
define ArloNeustart notify Arlo_Arlo:Verbindung:.*getrennt set Arlo_Cloud stopServer; sleep 30; set Arlo_Cloud startServer; sleep 30; set Arlo_Arlo updateReadings;

Nicht die feine Englische Art aber vielleicht hilft es dem ein oder anderen erst mal.
Im schlimmsten Fall ist die Verbindung halt für diese 1000 Sekunden weg.

Bei mir steht die Verbindung nach jedem "Neustart" wieder.

Trotz allem ein Super geniales Modul.

Danke
Gruß
Flo


mi.ke

Zitat von: mi.ke am 25 Juni 2018, 11:50:41
Die Version mit der 2.ten Basisstation verursacht bei mir "Hänger"
und zwar, betrifft dies entweder die erste oder die zweite, anscheinend abhängig von der Startreihenfolge. Hier die Fehlermeldung: . . .
. . . Bin jetzt erstmal zurück auf die Version vom 21.06.2018


Hallo maluk,

ich wollte nochmal vorsichtig nachfragen, ob Du doch noch mal nach der 2.ten Basis Station schauen könntest?

Danke und Grüße

mi.ke
FHEM 5.9 | RPi4 + 5 x RPi(Z) + FB7590 + FB 6890 LTE via LAN und WAN (VPN) verbunden.
2 x CUL868 + 3 x RFXTRX(e) + 6 x HMwLanGW + 4 x z2tGw + 5 x LGW + 2 x IRBlast + CO2 +++
FS20, FHT, FMS, Elro(mod), CM160, Revolt, LGTV, STV, AVR, withings, HM-sec-*, HM-CC-RT-DN, AMAD, PCA301, arlo, Aqara

m0urs

#191
Hallo maluk,

ich fürchte die Arlo Security Lights sind derzeit nicht unterstützt, oder? Wenn nicht, besteht Hoffnung, dass Du das auch einbauen wirst?

Danke und Grüße,
Michael

Update: Hab mal ein wenig rumprobiert, aber bisher ohne Ergebnis. Siehe hier https://github.com/jeffreydwalter/arlo/issues/97

m0urs

Wenn ich einen User Mode für die Bewegungserkennung einer Kamera definiere und dort als Aktion neben der Videoaufzeichnung gleichzeitig noch eine zusätzliche Aktion für ein Arlo Security Light definiere, dann lässt sich dieser User Mode nicht mehr von FHEM aus aktivieren. Wenn ich dies bei der Standard-Aktion "Arm" mache, dann funktioniert es. Nur bei den User Modes geht es nicht. Woran kann das liegen?

maluk

Ich habe leider keine Security Light und kann daher den Fehler nicht reproduzieren. Gibt es irgendwelche Fehlermeldungen im FHEM-Log oder in /tmp/arlo.log? Setze den Log-Level in 49_Arlo.py auf jeden Fall mal auf logging.DEBUG (Zeile 26), evtl. sieht man dann in /tmp/arlo.log etwas mehr.

Ich habe auch gesehen, dass du mit Jeffrey Walter wegen dem Thema in Kontakt bist. Vielleicht kommt er hier weiter.

choetzu

Zitat von: Niko1987 am 23 Oktober 2018, 18:05:01
Hallo zusammen,

ich hab den neuesten Stand installiert. Leider verliert fhem trotz allem die Verbindung zu Arlo.
Ich kann zwar zu jeder Zeit befehle an die Arlo Basis schicken, diese kommen auch an aber ich bekomm keine Rückmeldung mehr.
Die Verbindung bricht sporadisch ab. Ohne Fehler im FileLog.

Ich habs jetzt erst mal über einen kleinen Umweg gelöst:

Ich erstelle einen userReading in der BASESTATION mit dem Namen Verbindung:
attr Arlo_Arlo userReadings Verbindung { return "getrennt" if ( (time_str2num(ReadingsTimestamp($NAME,"state","0")) - time_str2num(OldTimestamp($NAME))) > 600 );; return "verbunden" }

Wenn in diesen 600 Sekunden kein neues Reading mehr bekomme wird der Reading "Verbindung" auf getrennt gesetzt.
Den Intervall hab ich auf 300 Sekunden
attr Arlo_Arlo interval 300

Dann schau ich einfach mit einem Notify und warte bis der Reading den Status "getrennt" bekommt.
Stoppe die ArloCloud, warte kurz und starte die Arlo_Cloud wieder. Gefolgt von einem updateReadings der Arlo_Arlo
define ArloNeustart notify Arlo_Arlo:Verbindung:.*getrennt set Arlo_Cloud stopServer; sleep 30; set Arlo_Cloud startServer; sleep 30; set Arlo_Arlo updateReadings;

Nicht die feine Englische Art aber vielleicht hilft es dem ein oder anderen erst mal.
Im schlimmsten Fall ist die Verbindung halt für diese 1000 Sekunden weg.

Bei mir steht die Verbindung nach jedem "Neustart" wieder.

Trotz allem ein Super geniales Modul.

Danke
Gruß
Flo

Super workaround! Perfekt. Bin grad am Testen.

Wie ist es bei dir/euch mit folgender Thematik? Wenn am Abend die Aussencam ,,scharf" geschaltet ist und eine Motion erkannt, fange ich das wie folg mit einem DOIF ab und schalte das Aussenlicht ein. Wie ein Bewegungsmelder.

([Arlo_Terasse:activityState] eq "alertStreamActive"
and [?Bewegungsmelder_L_Gartenhaus_XLED2:luminance:d] < [Bewegungsmelder_L_Gartenhaus_XLED2:configLightThreshold:d])
(set Aktor_L_Terasse_NodOn6 on-for-timer 30)
(set Steingarten_D_FUD61 on-for-timer 30)

DOELSE



Das geht in 90% der Fällen und in 10 eben nicht, obschon die BasisStation verbunden ist. Es löst den Event offensichtlich nicht aus und es gibt auch keine Fehlermeldung. Ein Restart hilft dann jeweils. Ist das Euch auch schon aufgefallen? Wenn ja, wie löst man das?
Raspi3, EnOcean, Zwave, Homematic