SSCAM - Steuerung von Kameras in Synology Surveillance Station

Aus FHEMWiki
Zur Navigation springen Zur Suche springen
SSCam
Zweck / Funktion
Steuerung von Kameras in Synology Surveillance Station
Allgemein
Typ Gerätemodul
Details
Dokumentation EN / DE
Support (Forum) Sonstiges
Modulname 49_SSCam.pm
Ersteller nasseeder1 (Forum: DS_Starter)
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref!


Zweckbeschreibung

Mit diesem Modul können Operationen von in der Synology Surveillance Station (SVS) definierten Kameras ausgeführt werden. Es basiert auf der SVS API und unterstützt die SVS ab Version 7. Zur Zeit werden folgende Funktionen unterstützt:

  • Start einer Aufnahme
  • Stop einer Aufnahme (per Befehl bzw. automatisch nach Ablauf der Aufnahmedauer)
  • Aufnehmen eines Schnappschusses und Ablage in der Synology Surveillance Station
  • Deaktivieren einer Kamera in Synology Surveillance Station
  • Aktivieren einer Kamera in Synology Surveillance Station
  • Steuerung der Belichtungsmodi Tag, Nacht bzw. Automatisch
  • Umschaltung der Ereigniserkennung durch Kamera, durch SVS oder deaktiviert
  • Abfrage von Kameraeigenschaften (auch mit Polling) sowie den Eigenschaften des installierten SVS-Paketes
  • Bewegen an eine vordefinierte Preset-Position (bei PTZ-Kameras)
  • Start einer vordefinierten Überwachungstour (bei PTZ-Kameras)
  • Positionieren von PTZ-Kameras zu absoluten X/Y-Koordinaten
  • kontinuierliche Bewegung von PTZ-Kameras
  • auslösen externer Ereignisse 1-10 (Aktionsregel SVS)
  • starten und beenden von Kamera-Livestreams
  • Abruf und Ausgabe der Kamera Streamkeys sowie Stream-Urls (zur Nutzung von Kamera-Livestreams ohne Session Id)
  • abspielen der letzten Aufnahme

Die Aufnahmen stehen in der Synology Surveillance Station (SVS) zur Verfügung und unterliegen, wie jede andere Aufnahme, den in der Synology Surveillance Station eingestellten Regeln. So werden zum Beispiel die Aufnahmen entsprechend ihrer Archivierungsfrist gespeichert und dann gelöscht.

Wenn sie über dieses Modul diskutieren oder zur Verbesserung des Moduls beitragen möchten, ist im FHEM-Forum ein Sammelplatz unter:
49_SSCam: Fragen, Hinweise, Neuigkeiten und mehr rund um dieses Modul



Vorbereitung

Dieses Modul nutzt das Perl-Modul JSON. Bitte darauf achten dieses Paket zu installieren. (Debian: apt-get install libjson-perl). SSCAM verwendet für HTTP-Calls die nichtblockierenden Funktionen von HttpUtils bzw. HttpUtils_NonblockingGet. Im DSM bzw. der Synology Surveillance Station muß ein Nutzer für den Zugriff aus FHEM angelegt sein. Die Zugangsdaten für diesen Nutzer werden später über ein Set-Kommando dem angelegten Gerät zugewiesen.
Nähere Informationen dazu unter Credentials.

Überblick über die Perl-Module welche von SSCam genutzt werden:

   JSON            
   Data::Dumper                     
   MIME::Base64   
   Time::HiRes    
   HttpUtils       (FHEM-Modul)


Define

    define <name> SSCam <Kameraname in SVS> <ServerAddr> [Port]

Definiert eine neue Kamera für SSCam. Zunächst muß diese Kamera in der Synology Surveillance Station 7.0 oder höher eingebunden sein und entsprechend funktionieren.

Das Modul SSCam basiert auf Funktionen der Synology Surveillance Station API. Weitere Informationen unter: Web API Guide.

Momentan wird nur das HTTP-Protokoll unterstützt um die Web-Services der Synology DS aufzurufen.

Die Parameter beschreiben im Einzelnen:

    name :	    der Name des neuen Gerätes in FHEM
    Kameraname :    Kameraname wie er in der Synology Surveillance Station angegeben ist. Leerzeichen im Namen sind nicht erlaubt !
    ServerAddr :    die IP-Addresse des Synology Surveillance Station Host. 
                    Achtung: Es sollte kein Servername verwendet werden weil DNS-Aufrufe in FHEM blockierend sind
    Port :	    optional - der Port des Synology Surveillance Station Host. 
                    Wenn nicht angegeben, wird der Standardport 5000 gesetzt(nur HTTP)

Beispiel:

         define CamCP SSCAM Carport 192.168.2.20 [5000]

Wird eine neue Kamera definiert, wird diesem Device zunächst eine Standardaufnahmdauer von 15 zugewiesen. Über das Attribut "rectime" kann die Aufnahmedauer für jede Kamera individuell angepasst werden. Der Wert "0" für "rectime" führt zu einer Endlosaufnahme die durch "set <name> off" gestoppt werden muß. Ein Logeintrag mit einem entsprechenden Hinweis auf diesen Umstand wird geschrieben.

Wird das Attribut "rectime" gelöscht, greift wieder der Default-Wert (15s) für die Aufnahmedauer.

Mit dem Befehl "set <name> on [rectime]" wird die Aufnahmedauer temporär festgelegt und überschreibt einmalig sowohl den Defaultwert als auch den Wert des gesetzten Attributs "rectime". Auch in diesem Fall führt "set <name> on 0" zu einer Daueraufnahme.

Eine eventuell in der SVS eingestellte Dauer der Voraufzeichnung wird weiterhin berücksichtigt.


Credentials

Nach dem Definieren des Gerätes müssen zuerst die Zugangsparameter gespeichert werden. Das geschieht mit dem Befehl:

    set <name> credentials <username> <password>

Der Anwender kann in Abhängigkeit der beabsichtigten einzusetzenden Funktionen einen Nutzer im DSM bzw. in der Surveillance Station einrichten. Ist der DSM-Nutzer der Gruppe Administratoren zugeordnet, hat er auf alle Funktionen Zugriff. Ohne diese Gruppenzugehörigkeit können nur Funktionen mit niedrigeren Rechtebedarf ausgeführt werden. Die benötigten Mindestrechte der Funktionen sind in der Tabelle weiter unten aufgeführt. Alternativ zum DSM-Nutzer kann ein in der SVS angelegter Nutzer verwendet werden. Auch in diesem Fall hat ein Nutzer vom Typ Manager das Recht alle Funktionen auszuführen, wobei der Zugriff auf bestimmte Kameras/ im Privilegienprofil beschränkt werden kann (siehe Hilfefunktion in SVS). Als Best Practice wird vorgeschlagen jeweils einen User im DSM und einen in der SVS anzulegen.

  • DSM-User als Mitglied der Admin-Gruppe: uneingeschränkter Test aller Modulfunktionen -> session:DSM
  • SVS-User als Manager oder Betrachter: angepasstes Privilegienprofil -> session: SurveillanceStation

Über das Attribut "session" kann ausgewählt werden, ob die Session mit dem DSM oder der SVS augebaut werden soll. Erfolgt der Session-Aufbau mit dem DSM, stehen neben der SVS Web-API auch darüber hinaus gehende API Zugriffe zur Verfügung die unter Umständen zur Verarbeitung benötigt werden.

Nach der Gerätedefinition ist die Grundeinstellung "Login in das DSM", d.h. es können Credentials mit Admin-Berechtigungen genutzt werden um zunächst alle Funktionen der Kameras testen zu können. Danach können die Credentials z.B. in Abhängigkeit der benötigten Funktionen auf eine SVS-Session mit entsprechend beschränkten Privilegienprofil umgestellt werden.

Die nachfolgende Aufstellung zeigt die Mindestanforderungen der jeweiligen Modulfunktionen an die Nutzerrechte.

* set ... on	       session: ServeillanceStation - Betrachter mit erweiterten Privileg "manuelle Aufnahme"
* set ... off	       session: ServeillanceStation - Betrachter mit erweiterten Privileg "manuelle Aufnahme"
* set ... snap	       session: ServeillanceStation - Betrachter
* set ... disable      session: ServeillanceStation - Manager
* set ... enable       session: ServeillanceStation - Manager
* set ... expmode      session: ServeillanceStation - Manager 
* set ... motdetsc     session: ServeillanceStation - Manager 
* set ... goPreset     session: ServeillanceStation - Betrachter mit Privileg Objektivsteuerung der Kamera
* set ... runPatrol    session: ServeillanceStation - Betrachter mit Privileg Objektivsteuerung der Kamera
* set ... goAbsPTZ     session: ServeillanceStation - Betrachter mit Privileg Objektivsteuerung der Kamera
* set ... move         session: ServeillanceStation - Betrachter mit Privileg Objektivsteuerung der Kamera
* set ... runView      session: ServeillanceStation - Betrachter mit Privileg Liveansicht für Kamera
* set ... stopView     -
* set ... credentials  -
* set ... extevent     session: DSM - Nutzer Mitglied von Admin-Gruppe 
* get ... caminfoall   session: ServeillanceStation - Betrachter 
* get ... eventlist    session: ServeillanceStation - Betrachter
* get ... scanVirgin   session: ServeillanceStation - Betrachter
* get ... svsinfo      session: ServeillanceStation - Betrachter
* get ... svsinfo      session: ServeillanceStation - Betrachter 
* get ... stmUrlPath   session: ServeillanceStation - Betrachter

HTTP-Timeout setzen

Alle Funktionen dieses Moduls verwenden HTTP-Aufrufe gegenüber der SVS Web API.
Der Standardwert für den HTTP-Timeout beträgt 4 Sekunden. Durch Setzen des Attributes "httptimeout" > 0 kann dieser Wert bei Bedarf entsprechend den technischen Gegebenheiten angepasst werden.



Set

Es gibt zur Zeit folgende Optionen für "set <name> ...".


    "on [rectime]":                                startet eine Aufnahme. Die Aufnahme wird automatisch nach Ablauf der Zeit [rectime] 
                                                   gestoppt.
                                                   mit rectime = 0 wird eine Daueraufnahme gestartet die durch "set <name> off" 
                                                   wieder gestoppt werden muß.
    "off" :                                        stoppt eine laufende Aufnahme manuell oder durch die Nutzung anderer Events 
                                                   (z.B. über at, notify)
    "snap":                                        löst einen Schnappschuß der entsprechenden Kamera aus und speichert ihn in der SVS
    "disable":                                     deaktiviert eine Kamera in der Surveillance Station
    "enable":                                      aktiviert eine Kamera in der Surveillance Station
    "credentials <username> <password>":           speichert die Zugangsinformationen
    "expmode [ day | night | auto ]":              aktiviert den Belichtungsmodus Tag, Nacht oder Automatisch
    "extevent [ 1-10 ]": 	                   löst das externe Ereignis 1-10 aus (Aktionsregeleditor in SVS) 
    "motdetsc [ by_camera | by_SVS | disable ]":   schaltet die Bewegungserkennung in den gewünschten Modus 
                                                   (durch Kamera, SVS, oder deaktiviert) 
    "goPreset <Presetname>":                       fährt eine PTZ-Kamera zu einer vordefinierten Preset-Position
    "runPatrol <Patrolname>":                      startet eine vordefinierte Überwachungstour einer PTZ-Kamera
    "goAbsPTZ [ X Y | up | down | left | right ]": positioniert eine PTZ-Kamera zu einer X/Y-Koordinate oder in Richtung up/down/left/right
    "move [ up | down | left | right | dir_X ]":   startet kontinuerliche Bewegung einer PTZ-Kamera in Richtung up/down/left/right bzw. dir_X
    "runView [image | lastrec | lastrec_open | 
     link | link_open <room>]":                    startet einen Livestream bzw. die letzte Aufnahme als eingbettetes Image, als Link 
                                                   oder öffnet diesen Medienstream sofort 
    "stopView":                                    Gegenteil von "runView"


set <name> [on [rectime] | off]

Der Befehl "set <name> on" startet eine Aufnahme. Die Standardaufnahmedauer beträgt 15 Sekunden. Sie kann mit dem Attribut "rectime" individuell festgelegt werden. Die im Attribut (bzw. im Standard) hinterlegte Aufnahmedauer kann einmalig mit "set <name> on [rectime]" überschrieben werden. Die Aufnahme stoppt automatisch nach Ablauf der Zeit "rectime".

Ein Sonderfall ist der Start einer Daueraufnahme mit "set <name> on 0" bzw. dem Attributwert "rectime = 0". In diesem Fall wird eine Daueraufnahme gestartet die explizit wieder mit dem Befehl ""set <name> off" gestoppt werden muß.

Das Aufnahmeverhalten kann weiterhin mit dem Attribut "recextend" wie folgt beeinflusst werden.

Attribut "recextend = 0" bzw. nicht gesetzt (Standard):

  • wird eine Aufnahme mit z.B. rectime=22 gestartet, wird kein weiterer Startbefehl für eine Aufnahme akzeptiert bis diese gestartete Aufnahme nach 22 Sekunden beendet ist. Ein Hinweis wird bei verbose=3 im Logfile protokolliert.

Attribut "recextend = 1" gesetzt:

  • eine zuvor gestartete Aufnahme wird bei einem erneuten "set <name> on"-Befehl mit der Aufnahmezeit "rectime" neu parametrisiert. Das bedeutet, dass der Timer für den automatischen Stop auf den Wert "rectime" neu gesetzt wird. Dieser Vorgang wiederholt sich mit jedem Start-Befehl. Dadurch verlängert sich eine laufende Aufnahme bis kein Start-Inpuls mehr registriert wird.
  • eine zuvor gestartete Endlos-Aufnahme wird mit einem erneuten "set <name> on"-Befehl nach der Aufnahmezeit "rectime" gestoppt (Timerneustart). Ist dies nicht gewünscht, ist darauf zu achten dass bei der Verwendung einer Endlos-Aufnahme das Attribut "recextend" nicht verwendet wird.


Beispiele für einfache Operationen:

   set <name> on [rectime] :   startet die Aufnahme der Kamera <name>. 
   set <name> off :            stoppt die Aufnahme der Kamera <name>
   set <name> disable :        deaktiviert die Kamera <name> in der Surveillance Station
   set <name> enable :         aktiviert die Kamera <name> in der Surveillance Station

Hinweis:

In der SVS kann unter Aufnahmeeinstellungen der Kamera eine Vor-Aufnahmezeit eingestellt werden. Die Einstellung wird von der SVS bezüglich der Gesamtaufnahmezeit automatisch mit berücksichtigt.

Eine eingestellte Vor-Aufnahmezeit von z.B. 10s und eine rectime von 20s führt zu einer Gesamtaufnahmezeit von 30s (zzgl. Prozesszeit zur Befehlsabarbeitung).

set <name> snap

Ein Schnappschuß kann ausgelöst werden durch:

  set <name> snap

Soll eine Reihe Schnappschüsse ausgelöst werden wenn eine Aufnahme startet, kann das durch folgendes notify geschehen. Wird der Start der Kamera CamHE1 ausgelöst (vorher Attribut event-on-change-reading -> "Record" setzen), werden 3 Snapshots im Abstand von 2 Sekunden getriggert.

 define he1_snap_3 notify CamHE1:Record.*on define h3 at +*{3}00:00:02 set CamHE1 snap

Triggern von 2 Schnappschüssen der Kamera "CamHE1" im Abstand von 6 Sekunden nachdem der Bewegungsmelder "MelderHE1" einen Event gesendet hat, kann z.B. mit folgendem notify geschehen:

 define he1_snap_2 notify MelderHE1:on.* define h2 at +*{2}00:00:06 set CamHE1 snap

Es wird die ID des letzten Snapshots als Wert der Variable "LastSnapId" in den Readings der Kamera ausgegeben.

set <name> [enable] [disable]

Um eine Liste von Kameras oder alle Kameras (mit Regex) zum Beispiel um 21:46 zu deaktivieren / zu aktivieren zwei Beispiele mit at:

 define a13 at 21:46 set CamCP1,CamFL,CamHE1,CamTER disable (enable)
 define a14 at 21:46 set Cam.* disable (enable)

Etwas komfortabler gelingt das Schalten aller Kameras über einen Dummy. Zunächst wird der Dummy angelegt:

 define allcams dummy
 attr allcams eventMap on:enable off:disable
 attr allcams room Cams
 attr allcams webCmd enable:disable

Durch Verknüpfung mit zwei angelegten notify, jeweils ein notify für "enable" und "disable", kann man durch Schalten des Dummys auf "enable" bzw. "disable" alle Kameras auf einmal aktivieren bzw. deaktivieren.

 define all_cams_disable notify allcams:.*off set CamCP1,CamFL,CamHE1,CamTER disable
 attr all_cams_disable room Cams
 
 define all_cams_enable notify allcams:on set CamCP1,CamFL,CamHE1,CamTER enable
 attr all_cams_enable room Cams


set <name> expmode [day] [night] [auto]

Mit diesem Befehl kann der Belichtungsmodus der Kameras gesetzt werden. Dadurch wird z.B. das Verhalten der Kamera-LED's entsprechend gesteuert. Die erfolgreiche Umschaltung wird durch das Reading CamExposureMode ("get ... caminfoall") reportet.

Hinweis: Die erfolgreiche Ausführung dieser Funktion ist davon abhängig ob die SVS diese Funktionalität der Kamera unterstützt. Ist in SVS -> IP-Kamera -> Optimierung -> Belichtungsmodus das Feld für den Tag/Nachtmodus grau hinterlegt, ist nicht von einer lauffähigen Unterstützung dieser Funktion auszugehen.


set <name> motdetsc [camera] [SVS] [disable] (geändert ab Rev 11284)

Der Befehl "motdetsc" (steht für "motion detection source") schaltet die Bewegungserkennung in den gewünschten Modus. Wird die Bewegungserkennung durch die Kamera / SVS ohne weitere Optionen eingestellt, werden die momentan gültigen Bewegungserkennungsparameter der Kamera / SVS beibehalten. Die erfolgreiche Ausführung der Operation lässt sich u.a. anhand des Status von SVS -> IP-Kamera -> Ereigniserkennung -> Bewegung nachvollziehen.

Für die Bewegungserkennung durch SVS bzw. durch Kamera können weitere Optionen angegeben werden. Die verfügbaren Optionen bezüglich der Bewegungserkennung durch SVS sind "Empfindlichkeit" und "Schwellwert".

 set <name> motdetsc SVS [Empfindlichkeit] [Schwellwert]     # Befehlsmuster
 set <name> motdetsc SVS 91 30                               # setzt die Empfindlichkeit auf 91 und den Schwellwert auf 30
 set <name> motdetsc SVS 0 40                                # behält gesetzten Wert für Empfindlichkeit bei, setzt Schwellwert auf 40
 set <name> motdetsc SVS 15                                  # setzt die Empfindlichkeit auf 15, Schwellwert bleibt unverändert 

Wird die Bewegungserkennung durch die Kamera genutzt, stehen die Optionen "Empfindlichkeit", "Objektgröße" und "Prozentsatz für Auslösung" zur Verfügung.

 set <name> motdetsc camera [Empfindlichkeit] [Schwellwert] [Prozentsatz]    # Befehlsmuster
 set <name> motdetsc camera 89 0 20                                          # setzt die Empfindlichkeit auf 89, Prozentsatz auf 20
 set <name> motdetsc camera 90 40 10                                         # setzt Empfindlichkeit auf 90, Schwellwert auf 40, 
                                                                               Prozentsatz auf 10
 set <name> motdetsc camera 30                                               # setzt die Empfindlichkeit auf 30, andere Werte bleiben 
                                                                               unverändert 

Es ist immer die Reihenfolge der Optionswerte zu beachten. Nicht gewünschte Optionen sind mit "0" zu besetzen sofern danach Optionen folgen deren Werte verändert werden sollen (siehe Beispiele oben). Der Zahlenwert der Optionen beträgt 1 - 99 (außer Sonderfall "0").

Die jeweils verfügbaren Optionen unterliegen der Funktion der Kamera und der Unterstützung durch die SVS. Es können jeweils nur die Optionen genutzt werden die in SVS -> Kamera bearbeiten -> Ereigniserkennung zur Verfügung stehen. Weitere Infos sind der Online-Hilfe zur SVS zu entnehmen.

Über den Befehl "get ... caminfoall" wird auch das Reading "CamMotDetSc" aktualisiert welches die gegenwärtige Einstellung der Bewegungserkennung dokumentiert. Es werden nur die Parameter und Parameterwerte angezeigt, welche die SVS aktiv unterstützt. Die Kamera selbst kann weiterführende Einstellmöglichkeiten besitzen.

Beispiel:

CamMotDetSc    SVS, sensitivity: 76, threshold: 55



set <name> goPreset <Preset>

Mit diesem Kommando können PTZ-Kameras in eine vordefininierte Position bewegt werden.
Die Preset-Positionen müssen dazu zunächst in der Synology Surveillance Station angelegt worden sein. Das geschieht in der PTZ-Steuerung im IP-Kamera Setup. Die Presets werden über das Kommando "set <name> getinfo" eingelesen (geschieht bei restart von FHEM automatisch). Der Einlesevorgang kann durch ein Kamerapolling regelmäßig wiederholt werden. Ein langes Pollingintervall ist in diesem Fall empfehlenswert da die Presetpositionen sich nur im Fall der Neuanlage bzw. Änderung verändern werden.

Hier ein Beispiel einer PTZ-Steuerung in Abhängigkeit eines IR-Melder Events:

    define CamFL.Preset.Wandschrank notify MelderTER:on.* set CamFL goPreset Wandschrank, ;; define CamFL.Preset.record 
    at +00:00:10 set CamFL on 5 ;;;; define s3 at +*{3}00:00:05 set CamFL snap ;; define CamFL.Preset.back at +00:00:30 set CamFL goPreset Home
  

Funktionsweise:
Der IR-Melder "MelderTER" registriert eine Bewegung. Daraufhin wird die Kamera CamFL in die Preset-Position "Wandschrank" gebracht. Eine Aufnahme mit Dauer von 5 Sekunden startet 10 Sekunden später. Da die Voraufnahmezeit der Kamera 10s beträgt (vgl. Reading "CamPreRecTime"), startet die effektive Aufnahme wenn der Kameraschwenk beginnt.
Mit dem Start der Aufnahme werden drei Schnappschüsse im Abstand von 5 Sekunden angefertigt.
Nach einer Zeit von 30 Sekunden fährt die Kamera wieder zurück in die "Home"-Position.

Ein Auszug aus dem Log verdeutlicht den Ablauf:

  
   2016.02.04 15:02:14 2: CamFL - Camera Flur_Vorderhaus has moved to position "Wandschrank"
   2016.02.04 15:02:24 2: CamFL - Camera Flur_Vorderhaus Recording with Recordtime 5s started
   2016.02.04 15:02:29 2: CamFL - Snapshot of Camera Flur_Vorderhaus has been done successfully
   2016.02.04 15:02:30 2: CamFL - Camera Flur_Vorderhaus Recording stopped
   2016.02.04 15:02:34 2: CamFL - Snapshot of Camera Flur_Vorderhaus has been done successfully
   2016.02.04 15:02:39 2: CamFL - Snapshot of Camera Flur_Vorderhaus has been done successfully
   2016.02.04 15:02:44 2: CamFL - Camera Flur_Vorderhaus has moved to position "Home"


set <name> runPatrol <Patrolname>

Dieses Kommando startet die vordefinierterte Überwachungstour einer PTZ-Kamera.
Die Überwachungstouren müssen dazu zunächst in der Synology Surveillance Station angelegt worden sein. Das geschieht in der PTZ-Steuerung im IP-Kamera Setup -> PTZ-Steuerung -> Überwachung.

Die Überwachungstouren (Patrols) werden über das Kommando "get <name> caminfoall" eingelesen, welches beim Restart von FHEM automatisch abgearbeitet wird. Der Einlesevorgang kann durch ein Kamerapolling regelmäßig wiederholt werden. Ein langes Pollingintervall ist in diesem Fall empfehlenswert, da sich die Überwachungstouren nur im Fall der Neuanlage bzw. Änderung verändern werden.

Nähere Informationen zur Anlage von Überwachungstouren sind in der Hilfe zur Surveillance Station enthalten.



set <name> goAbsPTZ [ X Y | up | down | left | right ]

Mit diesem Kommando wird eine PTZ-Kamera in Richtung einer wählbaren absoluten X/Y-Koordinate bewegt, oder zur maximalen Absolutposition in Richtung up/down/left/right. Die Option ist nur für Kameras verfügbar die das Reading "CapPTZAbs=true" (die Fähigkeit für PTZAbs-Aktionen) besitzen. Die Eigenschaften der Kamera kann mit "get <name> caminfoall" abgefragt werden.

Beispiel für Ansteuerung absoluter X/Y-Koordinaten:

 set <name> goAbsPTZ 120 450

Dieses Beispiel bewegt die Kameralinse in die Position X=120 und Y=450.
Der Wertebereich ist dabei:

 X = 0 - 640      (0 - 319 bewegt nach links, 321 - 640 bewegt nach rechts, 320 bewegt die Linse nicht)
 Y = 0 - 480      (0 - 239 bewegt nach unten, 241 - 480 bewegt nach oben, 240 bewegt die Linse nicht) 

Die Linse kann damit in kleinsten bis sehr großen Schritten in die gewünschte Richtung bewegt werden. Dieser Vorgang muß ggf. mehrfach wiederholt werden um die Kameralinse in die gewünschte Position zu bringen.

Soll die Bewegung mit der maximalen Schrittweite erfolgen, kann zur Vereinfachung der Befehl:

 set <name> goAbsPTZ up [down ] [left] [right]

verwendet werden. Die Optik wird in diesem Fall mit der größt möglichen Schrittweite zur Absolutposition in der angegebenen Richtung bewegt. Auch in diesem Fall muß der Vorgang ggf. mehrfach wiederholt werden um die Kameralinse in die gewünschte Position zu bringen.


set <name> move [ up | down | left | right | dir_X ] [Sekunden]

Mit diesem Kommando wird eine kontinuierliche Bewegung der PTZ-Kamera gestartet. Neben den vier Grundrichtungen up/down/left/right stehen auch Zwischenwinkelmaße "dir_X" zur Verfügung. Die Feinheit dieser Graduierung ist von der Kamera abhängig und kann dem Reading "CapPTZDirections" entnommen werden.

Das Bogenmaß von 360 Grad teilt sich durch den Wert von "CapPTZDirections" und beschreibt die Bewegungsrichtungen beginnend mit "0=rechts" entgegen dem Uhrzeigersinn. D.h. bei einer Kamera mit "CapPTZDirections = 8" bedeutet dir_0 = rechts, dir_2 = oben, dir_4 = links, dir_6 = unten bzw. dir_1, dir_3, dir_5 und dir_7 die entsprechenden Zwischenrichtungen. Die möglichen Bewegungsrichtungen bei Kameras mit "CapPTZDirections = 32" sind dementsprechend kleinteliger.

Im Gegensatz zum "set <name> goAbsPTZ"-Befehl startet der Befehl "set <name> move" eine kontinuierliche Bewegung bis ein Stop-Kommando empfangen wird. Das Stop-Kommando wird nach Ablauf der optional anzugebenden Zeit [Sekunden] ausgelöst. Wird diese Laufzeit nicht angegeben, wird implizit Sekunde = 1 gesetzt.

Beispiele:

 set <name> move up 0.5          : bewegt die Linse 0,5 Sekunden (zzgl. Prozesszeit) nach oben (zzgl. Prozesszeit)
 set <name> move dir_1 1.5       : bewegt die Linse 1,5 Sekunden (zzgl. Prozesszeit) nach rechts-oben 
 set <name> move dir_20 0.7      : bewegt die Linse 1,5 Sekunden (zzgl. Prozesszeit) nach links-unten bei "CapPTZDirections = 32"



set <name> runView [ image | lastrec | lastrec_open | link | link_open <room>]

Mit "image, link, link_open" Es wird ein Livestream (mjpeg-Stream) der Kamera, entweder als eingebettetes Image oder als generierter Link, gestartet. Der Zugriff auf die letzte Aufnahme einer Kamera kann über die Zusätze "lastrec" bzw. "lastrec_open" erfolgen.

Beispiele:

  attr <name> htmlattr target=_blank width="500" height="375"
  attr <name> htmlattr target=_blank width=500,height=375
  attr <name> htmlattr width=700,height=525,top=200,left=300

Das Verhalten des Livestreams im FHEMWEB kann durch Angaben im Attribut "htmlattr" beeinflusst werden. Mit diesen Attributwerten öffnet der Link als weiteres Fenster/Browsertab. Wird der Stream als Image gestartet, ändert sich die Größe entsprechend der Angaben von Width und Height. Das Kommando "set <name> runView link_open" startet den Livestreamlink sofort in einem neuen Browsertab (longpoll=1 muß für WEB gesetzt sein). Dabei wird für jede aktive FHEM-Session eine Fensteröffnung initiiert. Soll dieses Verhalten geändert werden, kann "set <name> runView link_open <room>" verwendet werden um das Öffnen des Browserwindows in einem beliebigen, in einer FHEM-Session angezeigten Raum <room>, zu initiieren.

Das gesetzte Attribut "livestreamprefix" überschreibt im Reading "LiveStreamUrl" die Angaben für Protokoll, Servername und Port. Damit kann z.B. die LiveStreamUrl für den Versand und externen Zugriff auf die SVS modifiziert werden.

Beispiel:

 attr <name> livestreamprefix https://<Servername>:<Port>

Der Livestream wird über das Kommando "set <name> stopView" wieder beendet.



set <name> extevent [ 1-10 ]

Dieses Kommando triggert ein externes Ereignis (1-10) in der SVS. Die Aktionen, die dieses Ereignis auslöst, sind zuvor in dem Aktionsregeleditor der SVS einzustellen. Es stehen die Ereignisse 1-10 zur Verfügung. In der Banchrichtigungs-App der SVS können auch Email, SMS oder Mobil (DS-Cam) Nachrichten ausgegeben werden wenn ein externes Ereignis ausgelöst wurde. Nähere Informationen dazu sind in der Hilfe zum Aktionsregeleditor zu finden. Der verwendete User benötigt Admin-Rechte in einer DSM-Session.



Get

Mit SSCam können die Eigenschaften der Kameras aus der Surveillance Station abgefragt werden. Dazu steht der Befehl zur Verfügung:

 get <name> caminfoall
 get <name> eventlist
 get <name> scanVirgin
 get <name> stmUrlPath
 get <name> svsinfo
 get <name> snapfileinfo

Mit dem Befehl "get <name> caminfoall" werden abhängig von der Art der Kamera (z.B. Fix- oder PTZ-Kamera) die verfügbaren Eigenschaften ermittelt und als Readings zur Verfügung gestellt. So wird zum Beispiel das Reading "Availability" auf "disconnected" gesetzt falls die Kamera von der Surveillance Station getrennt wird und kann für weitere Verarbeitungen genutzt werden. Durch "get <name> eventlist" wird das Reading "CamEventNum" aktualisiert, welches die Gesamtanzahl der registrierten Kameraevents enthält. Mit "get <name> snapfileinfo" wird der Filename des letzten Schnapschusses ermittelt. Der Befehl wird implizit mit "set <name> snap" ausgeführt.

Der Befehl "get <name> svsinfo" ist nicht von der Kamera abhängig, sondern ermittelt vielmehr allgemeine Informationen zur installierten SVS-Version und andere Eigenschaften. Die Funktionen "caminfoall" und "svsinfo" werden einmalig automatisch beim Start von FHEM ausgeführt um steuerungsrelevante Informationen zu sammeln. Es ist darauf zu achten dass vorher die Credentials gespeichert wurden !

get <name> scanVirgin

Wie mit get caminfoall werden alle Informationen der SVS und Kamera abgerufen. Allerdings wird in jedem Fall eine neue Session ID generiert (neues Login), die Kamera-ID neu ermittelt und es werden alle notwendigen API-Parameter neu eingelesen.

Die Funktion kann hilfreich sein um regelmäßig eine neue Session ID von der SVS dem Nutzer zuweisen zu lassen bzw. die API-Seiten des Surveillance Station Paketes auf der Synology DS neu einzulesen, ebenso die ID's der installierten Kameras. Im normalen Bertieb werden diese Informationen nur einmalig eingelesen bzw. die Session ID nur bei Bedarf erneuert.


get <name> stmUrlPath

Mit diesem Kommando wird der aktuelle Streamkey der Kamera abgerufen und das Reading mit dem Key-Wert gefüllt. Dieser Streamkey kann verwendet werden um eigene Aufrufe eines Livestreams aufzubauen (siehe Beispiel). Wenn das Attribut "showStmInfoFull" gesetzt ist, werden zusaätzliche Stream-Informationen wie "StmKeyUnicst", "StmKeymjpegHttp" ausgegeben. Diese Readings enthalten die gültigen Stream-Pfade zu einem Livestream und können z.B. versendet und von einer entsprechenden Anwendung ohne session Id geöffnet werden. Wenn das Attribut "livestreamprefix" (Format: "http(s)://<hostname><port>) gesetzt ist, wird der Servername und Port überschrieben soweit es sinnvoll ist. Wird Polling der Kameraeigenschaften genutzt, wird die stmUrlPath-Funktion automatisch mit ausgeführt.

Beispiel für den Aufbau eines Http-Calls zu einem Livestream mit StmKey:

http(s)://<hostname><port>/webapi/entry.cgi?api=SYNO.SurveillanceStation.VideoStreaming&version=1&method=Stream&format=mjpeg&cameraId=5StmKey="31fd87279976d89bb98409728cced890"

cameraId (INTERNAL), StmKey müssen durch gültige Werte ersetzt werden.

Hinweis:

Falls der Stream-Aufruf versendet und von extern genutzt wird sowie hostname / port durch gültige Werte ersetzt und die Routerports entsprechend geöffnet werden, ist darauf zu achten dass diese sensiblen Daten nicht durch unauthorisierte Personen für den Zugriff genutzt werden können !


Polling der Kameraeigenschaften:
Die Abfrage der Kameraeigenschaften erfolgt automatisch, wenn das Attribut "pollcaminfoall" (siehe Attribute) mit einem Wert > 10 gesetzt wird. Per Default ist das Attribut "pollcaminfoall" nicht gesetzt und das automatische Polling nicht aktiv. Der Wert dieses Attributes legt das Intervall der Abfrage in Sekunden fest. Ist das Attribut nicht gesetzt oder < 10 wird kein automatisches Polling gestartet bzw. gestoppt wenn vorher der Wert > 10 gesetzt war.

Das Attribut "pollcaminfoall" wird durch einen Watchdog-Timer überwacht. Änderungen des Attributwertes werden alle 90 Sekunden ausgewertet und entsprechend umgesetzt. Eine Änderung des Pollingstatus / Pollingintervalls wird im FHEM-Logfile protokolliert. Diese Protokollierung kann durch Setzen des Attributes "pollnologging" abgeschaltet werden. Dadurch kann ein unnötiges Anwachsen des Logs vermieden werden. Ab verbose=4 wird allerdings trotz gesetzten "pollnologging"-Attribut ein Log des Pollings zu Analysezwecken aktiviert.

Wird FHEM neu gestartet, wird bei aktivierten Polling der ersten Datenabruf innerhalb 60s nach dem Start ausgeführt.

Der Status des automatischen Pollings wird durch das Reading "PollState" signalisiert:

  PollState = Active     -    automatisches Polling wird mit Intervall entsprechend <pollcaminfoall> ausgeführt
  PollState = Inactive   -    automatisches Polling wird nicht ausgeführt

Die Bedeutung der Readingwerte ist unter Readings beschrieben.

Hinweise:

Wird Polling eingesetzt, sollte das Intervall nur so kurz wie benötigt eingestellt werden da die ermittelten Werte überwiegend statisch sind. Das eingestellte Intervall sollte nicht kleiner sein als die Summe aller HTTP-Verarbeitungszeiten. Pro Pollingaufruf und Kamera werden ca. 10 - 20 Http-Calls gegen die Surveillance Station abgesetzt.

Bei einem eingestellten HTTP-Timeout (siehe Attribut) "httptimeout") von 4 Sekunden kann die theoretische Verarbeitungszeit nicht höher als 80 Sekunden betragen. In dem Beispiel sollte man das Pollingintervall mit einem Sicherheitszuschlag auf nicht weniger 160 Sekunden setzen. Ein praktikabler Richtwert könnte zwischen 600 - 1800 (s) liegen.

Sind mehrere Kameras in SSCam definiert, sollte "pollcaminfoall" nicht bei allen Kameras auf exakt den gleichen Wert gesetzt werden um Verarbeitungsengpässe und dadurch versursachte potentielle Fehlerquellen bei der Abfrage der Synology Surveillance Station zu vermeiden. Ein geringfügiger Unterschied zwischen den Pollingintervallen der definierten Kameras von z.B. 1s kann bereits als ausreichend angesehen werden.




Readings

Über den Pollingmechanismus bzw. durch Abfrage mit "Get" werden Readings bereitgestellt, deren Bedeutung in der nachfolgenden Tabelle dargestellt sind. Die übermittelten Readings können in Abhängigkeit des Kameratyps variieren.

  
* Availability       - Verfügbarkeit der Kamera (disabled, enabled, disconnected, other)
* CamEventNum        - liefert die Gesamtanzahl der in SVS registrierten Events der Kamera
* CamExposureControl - zeigt den aktuell eingestellten Typ der Belichtungssteuerung
* CamExposureMode    - aktueller Belichtungsmodus (Day, Night, Auto, Schedule, Unknown)
* CamIP              - IP-Adresse der Kamera
* CamLiveMode        - Quelle für Live-Ansicht (DS, Camera)
* CamModel           - Kameramodell
* CamPort            - IP-Port der Kamera
* CamPreRecTime      - Dauer der der Voraufzeichnung in Sekunden (Einstellung in SVS)
* CamRecShare        - gemeinsamer Ordner auf der DS für Aufnahmen
* CamRecVolume       - Volume auf der DS für Aufnahmen
* CamVendor          - Kamerahersteller Bezeichnung
* CamVideoFlip       - Ist das Video gedreht  </td></tr>
* CamVideoMirror     - Ist das Video gespiegelt  </td></tr>
* CapAudioOut        - Fähigkeit der Kamera zur Audioausgabe über Surveillance Station (false/true)
* CapChangeSpeed     - Fähigkeit der Kamera verschiedene Bewegungsgeschwindigkeiten auszuführen
* CapPTZAbs          - Fähigkeit der Kamera für absolute PTZ-Aktionen 
* CapPTZAutoFocus    - Fähigkeit der Kamera für Autofokus Aktionen
* CapPTZDirections   - die verfügbaren PTZ-Richtungen der Kamera
* CapPTZFocus        - Art der Kameraunterstützung für Fokussierung
* CapPTZHome         - Unterstützung der Kamera für Home-Position
* CapPTZIris         - Unterstützung der Kamera für Iris-Aktion 
* CapPTZPan          - Unterstützung der Kamera für Pan-Aktion
* CapPTZTilt         - Unterstützung der Kamera für Tilt-Aktion
* CapPTZZoom         - Unterstützung der Kamera für Zoom-Aktion
* DeviceType         - Kameratyp (Camera, Video_Server, PTZ, Fisheye)
* Error              - Meldungstext des letzten Fehlers
* Errorcode          - Fehlercode des letzten Fehlers
* LastSnapFilename   - der Filename des letzten Schnapschusses
* LastSnapId         - die ID des letzten Schnapschusses
* LastUpdateTime     - Datum / Zeit der letzten Aktualisierung durch "caminfoall"
* LiveStreamUrl      - die LiveStream-Url wenn der Stream gestartet ist. (Attribut "showStmInfoFull" muss gesetzt sein)
* Patrols            - in Surveillance Station voreingestellte Überwachungstouren (bei PTZ-Kameras)
* PollState          - zeigt den Status des automatischen Pollings an
* Presets            - in Surveillance Station voreingestellte Positionen (bei PTZ-Kameras)
* Record             - Aufnahme läuft = Start, keine Aufnahme = Stop
* StmKey             - aktueller StreamKey. Kann zum öffnen eines Livestreams ohne Session Id genutzt werden. 
* StmKeyUnicst       - Uni-cast Stream Pfad der Kamera. ((Attribut "showStmInfoFull" muss gesetzt sein)
* StmKeymjpegHttp    - Mjpeg Stream Pfad (über http) der Kamera. (Attribut "showStmInfoFull" muss gesetzt sein)
* SVScustomPortHttp  - benutzerdefinierter Port der Surveillance Station (HTTP) im DSM-Anwendungsportal (get mit "svsinfo")
* SVScustomPortHttps - benutzerdefinierter Port der Surveillance Station (HTTPS) im DSM-Anwendungsportal (get mit "svsinfo")
* SVSlicenseNumber   - die Anzahl der installierten Kameralizenzen (get mit "svsinfo")
* SVSuserPriv        - die effektiven Rechte des verwendeten Users nach dem Login (get mit "svsinfo")
* SVSversion         - die Paketversion der installierten Surveillance Station (get mit "svsinfo")
* UsedSpaceMB        - durch Aufnahmen der Kamera belegter Plattenplatz auf dem Volume


Attribute

  • debugactivetoken - wenn gesetzt wird der Status des Active-Tokens gelogged - nur für Debuggung, nicht im normalen Betrieb benutzen
  • httptimeout - Timeout-Wert für HTTP-Aufrufe zur Synology Surveillance Station, Default: 4 Sekunden (wenn httptimeout = "0" oder nicht gesetzt)
  • htmlattr - ergänzende Angaben zur Livestream-Url um das Verhalten wie Bildgröße zu beeinflussen
  • livestreamprefix - überschreibt die Angaben zu Protokoll, Servernamen und Port zur Weiterverwendung der Livestreamadresse als z.B. externer Link. Die Angabe muss in der Form "http(s)://<servername>:<port>" erfolgen.
  • noQuotesForSID - dieses Attribut kann in bestimmten Fällen die Fehlermeldung "402 - permission denied" vermeiden und ein login ermöglichen. (normalerweise nicht zu setzen)
  • pollcaminfoall - Intervall der automatischen Eigenschaftsabfrage (Polling) einer Kamera (kleiner 10: kein Polling, größer 10: Polling mit Intervall)
  • pollnologging - 0 bzw. nicht gesetzt = Logging Gerätepolling aktiv (default), 1 = Logging Gerätepolling inaktiv
  • rectime - festgelegte Aufnahmezeit wenn eine Aufnahme gestartet wird. Mit rectime = 0 wird eine Endlosaufnahme gestartet. Ist "rectime" nicht gesetzt, wird der Defaultwert von 15s verwendet.
  • session - Auswahl der Login-Session. Nicht gesetzt oder "DSM" -> session wird mit DSM aufgebaut (Standard). "SurveillanceStation" -> Session-Aufbau erfolgt mit SVS
  • simu_SVSversion - simuliert eine andere SVS-Version. NUR FÜR DEBUGGING, nicht im normalen Betrieb zu nutzen !
  • showStmInfoFull - zusaätzliche Streaminformationen wie LiveStreamUrl, StmKeyUnicst, StmKeymjpegHttp werden ausgegeben
  • verbose
  Es werden verschiedene Verbose-Level unterstützt.
  Dies sind im Einzelnen:

        0   -   Start/Stop-Ereignisse werden geloggt
        1   -   Fehlermeldungen werden geloggt
        2   -   Meldungen über wichtige Ereignisse oder Alarme 
        3   -   gesendete Kommandos werden geloggt
        4   -   gesendete und empfangene Daten werden geloggt
        5   -   alle Ausgaben zur Fehleranalyse werden geloggt. ACHTUNG: unter Umständen werden sehr viele Daten in das Logfile geschrieben!
  

weitere Attribute:



Das Modul bzw. eine Gerätedefinition deaktivieren

Mit dem Attribut "disable" kann das Modul bzw. eine Gerätedefinition deaktiviert werden. Im Gegensatz zum Befehl "set ... disable" wird nicht die Kamera an sich deaktiviert, sondern lediglich das Gerätemodul. In diesem Fall werden keine Funktionen mehr ausgeführt. Wird das Modul deaktiviert, werden die folgenden Readings gesetzt:

state:         inactive     
Availability:  ???
PollState:     Inactive   

Ist für eine Kamera Polling aktiviert, wird diese Aktivität abgeschaltet. Nach Reaktivierung des Gerätemoduls wird das Polling automatisch wieder fortgesetzt.



Lösungsbeispiele und Ansätze für verschiedene Aufgabenstellungen

Eine Übersicht mit Hilfe von readingsGroup

Mit den umfangreichen Möglichkeiten des Moduls readingsGroup kann ein FHEM-Widget nach eigenen Vorstellungen erstellt werden. Hierbei ist es möglich sowohl einen Überblick über die Status der Kameras zu erhalten als auch Steuerungsaktivitäten vorzusehen. Das nachfolgende Beipiel soll als Anregung dafür dienen. Weitere Informationen unter der commandref zu readingsGroup.

Hinweis: Die folgenden Beispiele enthalten keine Maskierungen oder Verdopplungen für ; und Zeilenende, sondern sind so angegeben, wie sie im Web Interface im Befehls-Eingabefeld, nach Klick auf DEF und im Attribut-Eingabefeld eingegeben werden. Mehrere Leerzeichen innerhalb von < > sind als <&nbsp;&nbsp;&nbsp;> zu kodieren.

Definition Erläuterungen
Kamerastatus und Steuerung
define Cams_All_States readingsGroup <%it_camera>,<Verfügbar>,< >,<Status>,< >,<Erkennung>,< >,<letzte Aufnahme>,< >,<bel. Platz (MB)>,< >,<letzte Aktualisierung>,< >,<Modul Deaktivierung>,< >,<Image> TYPE=SSCam:Availability,

<&nbsp;&nbsp;&nbsp;>,state,<&nbsp;&nbsp;&nbsp;>,CamMotDetSc,<&nbsp;&nbsp;&nbsp;>,CamLastRecTime,<&nbsp;&nbsp;&nbsp;>,UsedSpaceMB, <&nbsp;&nbsp;&nbsp;>,LastUpdateTime,<&nbsp;&nbsp;&nbsp;>,?!disable,<&nbsp;&nbsp;&nbsp;>,<%Start>,<%Stop>

ReadingsGoup anlegen.
attr Cams_All_States valueIcon {'Availability.enabled' => 'remotecontrol/black_btn_GREEN',

'Availability.disabled' => 'remotecontrol/black_btn_RED', 'state.inactive' => 'StandBy', 'state' => '%devStateIcon'}

In Abhängigkeit vom Wert der Kameraverfügbarkeit und des state-Readings entsprechende Icons anzeigen. Wird das Modul deaktiviert, wird ein Standby-Icon angezeigt unabhängig davon ob in der Kameradefinition ein devStateIcon hinterlegt wurde.
attr Cams_All_States valueStyle {if($READING eq "Availability" && $VALUE eq "enabled"){ ' style="color:green" ' }

elsif( $READING eq "Availability" && $VALUE eq "disabled"){ ' style="color:red" ' } elsif( $READING eq "CamMotDetSc" && $VALUE =~ /SVS.*/ ){ ' style="color:orange" ' } elsif( $READING eq "CamMotDetSc" && $VALUE eq "disabled"){ ' style="color:LimeGreen" ' } elsif( $READING eq "CamMotDetSc" && $VALUE =~ /Cam.*/ ){ ' style="color:SandyBrown" ' }}

Farbgestaltung der Texte in Anhängigkeit der Werte setzen.
attr Cams_All_States valueFormat {($READING eq "CamMotDetSc" && $VALUE eq "disabled") ? "external" : $VALUE} Wenn die Quelle der Bewegungserkennung auf "disabled" gestellt wurde, soll "external" in der Übersicht angezeigt werden weil die Bewegungserkennung in dem Fall durch IR-Melder durchgeführt wird.
attr Cams_All_States valueColumns { 'Image' => 'colspan="2"'} Die Überschrift "Image" soll sich über die letzten zwei Spalten strecken. Es gilt sowohl für "Start" und "Stop" .
attr Cams_All_States nameStyle style="color:black;font-weight:bold" Die Überschriften sollen schwarz und fett sein.
attr Cams_All_States commands { 'Availability.enabled' => 'set $DEVICE disable',

'Availability.disabled' => 'set $DEVICE enable', 'Cams_All_States.Start' => 'set %DEVICE runView image', 'Cams_All_States.Stop' => 'set %DEVICE stopView', disable => "disable:"}

Es sollen Kommandos bestimmten Readings / Werten unterlegt werden. Zum Beispiel kann die Kamera mit Klick auf das Availability-Icon disabled werden wenn der Readingswert "enabled" ist. Der Livestream kann mit "Start" in der letzten Spalte gestartet, oder das Modul über eine Auswahl in der Drop-Down-Liste unterhalb von "Modul Deaktivierung" deaktiviert/aktiviert werden.
attr Cams_All_States cellStyle { "c:0" => 'style="text-align:left;color:green;font-weight:normal"',

"c:5" => 'style="text-align:center;color:green;font-weight:normal"', "c:9" => 'style="text-align:center;font-weight:normal"'}

Formatierung bestimmter Spalten (0,5,9).
attr Cams_All_States alias Status aller Kameras Alias setzen.
attr Cams_All_States group Kamerastatus Gruppenzugehörigkeit setzen. Wird auch für die Anzeige im Dashboard benutzt.



Einen Snapshot der Surveillance Station mit TelegramBot versenden

In dieser Beispielbeschreibung wird der Versand eines Snapshots mit Hilfe eines TelegramBot-Devices beschrieben. Es wird vorausgesetzt dass sowohl ein TelegramBot-Device als auch ein SSCam-Device definiert sind und als solches für sich bereits fehlerfrei funktionieren.

Informationen zur Definition dieser Devices finden sich sowohl in der Commandref als auch im Wiki:

Weiterhin wird angenommen, dass FHEM auf einem separaten Rechner (Rasperry Pi oder virtuellem Server) läuft und die Synology Diskstation den Surveillance Dienst bereitstellt.

Mit Stand DSM 6.1 werden die Snapshots aller Kameras in einem zentralen Ordner "/volume1/surveillance/@Snapshot" abgelegt, wobei "volume1" von der konkreten Installation abhängt. Die Dateinamen beginnen mit dem Kameranamen und enthalten weiterhin den Timestamp des Schnapschusses.

NFS-Regel erstellen

Zunächst wird im Synology DSM -> Systemsteuerung -> Gemeinsamer Ordner der Ordner "surveillance" zum Bearbeiten geöffnet. Im Reiter "NFS-Berechtigungen" wird eine neue NFS-Regel erstellt um den oder die FHEM-Rechner den Zugriff zu erlauben.


Um nur bestimmte Hosts zu erlauben, können die zugelassenen IP-Adressen in der Spalte "Client" spezifiziert werden. Im unteren Bereich des Fensters ist der später benötigte Mount-Pfad ersichtlich. In diesem Beispiel ist es "/volume1/surveillance". Da der zugreifende User lediglich Leseberechtigung benötigt, brauchen keine weiteren Einstellungen vorgenommen werden da dem Client beim Zugriff auf den gemeinsamen Ordner die Berechtigungen von others/Sonstige“ zugewiesen werden sofern die UID/GID von Client nicht mit Synology NAS User numerisch übereinstimmt.

Auf dem FHEM-Rechner nun ein Directory anlegen, in welches der Mount-Pfad "/volume1/surveillance" eingehängt werden soll, z.B.:

sudo mkdir /sds1/surveillance

und in der Datei "/etc/fstab" den Mount hinzufügen/abspeichern, z.B.:

sds1.myds.me:/volume1/surveillance /sds1/surveillance nfs auto,defaults,tcp,intr 0 0

Nun kann mit:

sudo mount -a

das freigegebene Verzeichnis mit den Snapshots gemounted werden und steht damit auf dem FHEM-Server zur Verfügung.

Damit sind die Voraussetzungen für einen Snapshotversand erfüllt und es kann direkt mit der Definition eines Notify fortgefahren werden, z.B.:

define N.CamHE1.Snap.TeleBot notify CamHE1:LastSnapFilename.* { my $var = '/sds1/surveillance/@Snapshot/'.(ReadingsVal("CamHE1","LastSnapFilename","")); fhem ("set teleBot sendImage $var Eine Bewegung an der Haustür wurde aufgezeichnet"); }
attr N.CamHE1.Snap.TeleBot room Cams

Zur Funktionsweise: Wenn durch die Kamera "CamHE1" ein Snapshot aufgenommen wurde, erstellt das Cam-Device im Reading "LastSnapFilename" den Namen der Bilddatei im Ordner @Snapshot der Synology bzw. des gemounteten Verzeichnis "/sds1/surveillance/@Snapshot". Ergänzt wird noch der Dateiname des Schnapschusses mit "ReadingsVal("CamHE1","LastSnapFilename","") und wird mit dem TelegramBot-Device "teleBot" sowie einem erläuternden Text an den default Peer des Telebot-Devices versendet.



Mail mit Snapshot im Anhang und Aufnahmelink versenden (sendemail)

Nachfolgendes Beispiel zeigt eine Möglichkeit in Linux mit dem Tool sendemail eine Mail mit einem Link zu einer Kameraaufnahme und bis zu drei Anhängen zu versenden. Das Tool ist in vielen Repositories erhalten und kann unter Debian (z.B. Ubuntu) installiert werden mittels apt-get install sendemail libio-socket-ssl-perl. Die Mail wird mit einem DOIF Kommando in Abhängigkeit von einer angefertigten Aufnahme angestoßen.

Zunächst die Mailfunktion in der 99_myUtils als Unterroutinen einfügen. Die Funktion ist nicht blockierend (mit Modul Blocking.pm) ausgeführt. Die "\" dienen nachfolgend nur zur Kennzeichnung eines Zeilenumbruchs - den Code bitte auf eine Zeile schreiben.

# Am Anfang von 99_myUtils hinzufügen
use Blocking;

##############################################################################
########        DebianMail  Mail  versenden  nonblocking          ############
##############################################################################

sub DebianMailnbl {

 my $rcpt = shift;
 my $subject = shift; 
 my $text = shift;
 my $attach = shift; 
 my $attach1 = shift; 
 my $attach2 = shift; 
 my $hash->{NAME_MAIL} = "Debianmail";
 my $name = $hash->{NAME_MAIL};

if ($attach2) {
    $hash->{helper}{RUNNING_PID} = BlockingCall("DebianMailnbl_send", $name."|".$rcpt."|".$subject."|".$text."|".$attach." \
    |".$attach1."|".$attach2, "", "", "", "");
} elsif ($attach1) {
    $hash->{helper}{RUNNING_PID} = BlockingCall("DebianMailnbl_send", $name."|".$rcpt."|".$subject."|".$text."|".$attach."|" \
   .$attach1, "", "", "", "");
} else {
    $hash->{helper}{RUNNING_PID} = BlockingCall("DebianMailnbl_send", $name."|".$rcpt."|".$subject."|".$text."|".$attach,
     "", "", "", "");
}

}

######################################################
########       Mailfunktion nonblocking           
######################################################

sub DebianMailnbl_send {
 my ($string) = @_;
 my ($name, $rcpt, $subject, $text, $attach, $attach1, $attach2) = split("\\|", $string);
 my $ret = "";
 my $sender = "<Sendername>\@<Domäne>"; 
 my $konto = "<Mailkonto";
 my $passwrd = "<Mailkontopasswort>";
 my $provider = "<Mailserver>";
 
 
if ($attach2) {
    $ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -a '$attach' -a '$attach1' -a '$attach2' -s '$provider' \
    -xu '$konto' -xp '$passwrd' -o tls=no -o message -charset=utf-8 -o message-content-type=text/plain );
} elsif ($attach1) {
    $ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -a '$attach' -a '$attach1' -s '$provider' -xu '$konto' \
    -xp '$passwrd' -o tls=no -o message-charset=utf-8 -o message-content-type=text/plain );
} else {
    $ret .= qx(sendEmail -f '$sender' -t '$rcpt' -u '$subject' -m '$text' -a '$attach' -s '$provider' -xu '$konto' -xp '$passwrd' \
    -o tls=no -o message-charset=utf-8 -o message-content-type=text/plain );
}

 # remove CR from return-string 
 $ret =~ s,[\r\n]*,,g;    

 Log3 $name, 3, "$name - sendEmail returned: $ret";
}

Um die TLS Verschlüsselung (ehem. SSL) zu nutzen, dann tls=auto verwenden.

Falls der Body-Text in einem (Android-)Mailer auf dem Handy nicht gezeigt wird, kann evtl. der Parameter -o message-content-type=html helfen.



Versand triggern - Beispiel mit DOIF

Der Mailversand wird in dem Beispiel mit einem DOIF angetriggert:

define CamHE1.email DOIF ([CamHE1:"CamLastRec"]) ({DebianMailnbl ('<Empfänger>@<Domäne>','Bewegungsalarm CamHE1','Eine Bewegung wurde an der Haustür registriert. 
Aufnahmelink: [CamHE1:VideoFolder]/[CamHE1:CamLastRec]','/media/sf_surveillance/@Snapshot/[CamHE1:LastSnapFilename]')})

Wird eine Aufnahme der Kamera CamHE1 beendet, wird integriert der Befehl "get .. eventlist" ausgeführt. Dadurch aktualisiert sich das Reading "CamLastRec". Dieser Event wird genutzt um eine Mail mit einem Link zur Aufnahme und einem während der Aufnahme angelegten Schnappschuß zu versenden. Will man einen weiteren Anhang versenden, sähe das DOIF folgendermaßen aus:

define CamHE1.email DOIF ([CamHE1:"CamLastRec"]) ({DebianMailnbl ('<Empfänger>@<Domäne>','Bewegungsalarm CamHE1','Eine Bewegung wurde an der Haustür registriert. 
Aufnahmelink: [CamHE1:VideoFolder]/[CamHE1:CamLastRec]','/media/sf_surveillance/@Snapshot/[CamHE1:LastSnapFilename]','<weiteres File>')})


Dss Reading "VideoFolder" muß, wie in dem Beispiel zu sehen, dem "CamLastRec" vorangestellt werden um den kompletten Pfad zur Aufnahme zu erhalten. Der versendete Link würde somit etwa den folgenden Aufbau haben:

/volume1/surveillance/Carport/20160407PM/Carport20160407-221541-1460060141.mp4

Wenn in einer Mail nach extern versendet wird, ist ein solcher Link wahrscheinlich über eine Anwendung nicht zugreifbar. Um den Link dynamisch anzupassen und so den Zugriff von extern über z.B. einen Webserver zu ermöglichen, kann das Attribut "videofolderMap" verwendet werden.

Wird dieses Attribut auf zum Beispiel ...

"http://<Server>:8083/fhem/svs/Carport/"

...gesetzt, ergibt sich folgender Link der in der Mail versendet wird:

http://<Server>:8083/fhem/svs/Carport/20160407PM/Carport20160407-221541-1460060141.mp4

In dem obigen Beispiel wird ein FHEM-Webserver verwendet, der zuvor über HTTPSRV (siehe Commandref) angelegt wurde, WIe der Webserver angelegt werden kann ist hier beschrieben.

Hinweis:

Nach dem Snapshot wird implizit die Funktion "get ... snapfileinfo" aufgerufen. Diese Funktion trägt den neuen/letzten Snapfilename in das Reading "LastSnapFilename" ein. Es ist somit sicherzustellen dass dieses Funktion abgeschlossen ist bevor die Aufnahme per Mail versendet werden soll. Das kann zum Beispiel mit einem Notify auf den Event "<Device>:LastSnapFilename.*" geschehen. Sollten das Problem auftreten dass alte Snapshots versendet werden, ist aller Wahrscheinlichkeit nach in dem beschriebenen Sachverhalt die Ursache zu finden.



Versand triggern - Beispiel mit Notify

Mit diesem Notify wird das Snapshotfile angehängt und auch ein Link zu dem Snapshot mit eingefügt.

define CamHE1.email NOTIFY CamHE1:LastSnapFilename.* {DebianMailnbl ('<Empfänger>@<Domäne>','Bewegungsalarm CamHE1', 
'Eine Bewegung wurde an der Haustür registriert. Aufnahmelink: http://<Server>:8083/fhem/snap/'.(ReadingsVal("CamHE1","LastSnapFilename","")), 
'/media/sf_surveillance/@Snapshot/'.(ReadingsVal("CamHE1","LastSnapFilename","")))}

Um den Link in dieser Form aufrufen zu können ist erst ein HTTPSRV anzulegen mit:

define snapweb HTTPSRV snap /media/sf_surveillance/@Snapshot SVS-Snapshots

Natürlich muß dabei der Pfad "/media/sf_surveillance/" so angepasst werden dass er dem (gemounteten) SVS-Aufnahmeverzeichnis entspricht.



Einsatz eines Webservers zum Zugriff auf Aufnahmen

Nutzung des FHEM-internen HTTPSRV Plug-In

Ziel der nachfolgenden Beschreibung ist es, eine Möglichkeit darzustellen, um den FHEM Webserver für den Zugriff auf die Aufnahmen der Synology Surveillance Station zu nutzen.

Folgende Ausgangslage wird für das Beispiel als gegeben angenommen:


  • der gemeinsame Ordner der Surveillance Station (normalerweise "surveillance") in der Diskstation ist am FHEM-Server gemountet.
    Für das Beipiel ist das gemountete Verzeichnis: /media/sf_surveillance
  • FHEMWEB ist im Einsatz
  • für das Beispiel ist eine Kamera CamHE1 (SVS-Name: Hauseingang) definiert


HTTPSRV ist ein Plug-in für FHEMWEB und stellt den Webserver für den Zugriff zur Verfügung. Diese Möglichkeit ist sicherlich für jene Fälle interessant bei denen der Zugriff über einen Verzeichnisdienst nicht möglich oder nicht gewünscht ist (zum Bespiel von extern). Es steht auch eine Modul-interne Zugriffsmöglichkeit auf die letzte Aufnahme mit dem Befehl "set CamHE1 runView lastrec (oder lastrec_open)" zur Verfügung.


Der Webserver wird definiert mit:

define svsweb HTTPSRV svs /media/sf_surveillance WebServer SVS-Aufnahmen

Der definierte Webserver sollte nun links im Seitenmenü unter dem Namen "WebServer SVS-Aufnahmen" erscheinen. Ein Klick auf diesen Link sollte nun die Meldung zeigen:

File not found: /media/sf_surveillance/index.html

Die Datei index.html existiert natürlich normalerweise nicht im surveillance-Verzeichnis. Der Inhalt des Verzeichnisses "/media/sf_surveillance", also des surveillance-Stammordners, wird nun mit der Basisadresse ...

http://<FHEM-Server>:8083/fhem/svs/

...erreicht.

Alle Aufnahmen der Kameras werden in Unterordnern des surveillance-Stammerzeichnisses gespeichert, die den gleichen Namen wie die Kamera in der Surveillance Station haben. Um den Pfad zu dem Aufnahmefile zu spezifizieren, ist die Basisadresse des erstellten Webservers mit dem Unterordner der entsprechenden Kamera zu ergänzen. Mit diesem zusammengesetzten Gesamtpfad ist ebenfalls das Reading "VideoFolder", welches den physikalischen Pfad von Aufnahmen der entsprechenden Kamera beschreibt, zu überschreiben.

Die wird mit dem Attribut "videofolderMap" erreicht. In dem Beispiel wird es gesetzt auf:

attr CamHE1 videofolderMap http://<FHEM-Server>:8083/fhem/svs/Hauseingang/

Jede Aufnahme der Kamera "Hauseingang" bzw. "CamHE1" wird somit durch die Webadresse ...

http://<FHEM-Server>:8083/fhem/svs/Hauseingang/<Inhalt Reading CamLastRec>

... erreicht.

Wie eine Mail mit diesem Link versendet werden kann ist hier beschrieben.

Der komplette in der Mail versendete Aufnahmelink sieht folgendermaßen aus:

http://<FHEM-Server>:8083/fhem/svs/Hauseingang//20160408PM/Hauseingang20160408-215150-1460145110.mp4



Nutzung der Webstation auf Synology DS zum Zugriff auf Recordings

Da die Benutzung des HTTPSRV für diesen Zweck FHEM belastet bzw. blockiert, hat Martin Fischer im Forum unter: https://forum.fhem.de/index.php/topic,45671.msg482616.html#msg482616

zwei Möglichkeiten bschrieben wie man den internen Webserver des Synology DS statt dessen verwenden kann (DSM 6).

Darauf aufbauend ist hier folgend die Umsetzung im DSM 5.2 beschrieben.


1. schnelle Variante A

Die nachfolgende Beschreibung bezieht sich auf DSM 5.2. Es wird ein virtueller Host (test.myds.me) definiert, der auf Port HTTP 8081 hört. Das Dokument-Root soll in dem Beispiel der Ordner "/volume1/web/fhemsvs" sein.

  • Nach dem Login als root wechselt man in das web-Verzeichnis mit "cd /volume1/web"
  • anlegen des Root-Verzeichnisses für den virtuellen Host und setzen der Berechtigungen:
 mkdir fhemsvs
 chown http:http fhemsvs
 chmod 775 fhemsvs
  • Link im Root-Verzeichnis zum SVS-Stammverzeichnis setzen:
 ln -s /volume1/surveillance/ /volume1/web/fhemsvs

(Hinweis: Wenn es zu Problemen beim Mailversand kommt - "leere" Bilder angehängt -, schaut mal, ob das Verzeichnis richtig ist. Einige (Beta-)Versionen von SVS benutzen @surveillance statt surveillance als Verzeichnis, so dass ein leicht anderer Link gesetzt werden muss: ln -s /volume1/\@surveillance/ /volume1/web/fhemsvs)

  • einen virtuellen Host in Systemsteuerung -> Webdienste -> virtueller Host anlegen. Soll der Host von extern erreichbar sein, muß ebenfalls eine Registrierung des Hostnamens z.B. bei dem kostenfreien DNS-Dienst von Synology erfolgen sowie der verwendete Port im Router freigeschaltet werden.
VHost.PNG

Der virtuelle Host ist durch die Angabe des Unterodners (fhemsvs), des Hostnamens (test.myds.me), des Protokolls und des Ports (8081) zu definieren. Die Angaben sind natürlichen den realen Werten anzupassen.

  • die Recordings sind nun prinzipiell unter der Adresse erreichbar:
  http://test.myds.me:8081/surveillance/<Camname>/<Zeitordner>/<Dateiname>
  
  • in FHEM ist der Zugangspfad zu dem Aufnahmen zusammengesetzt aus den Readings "VideoFolder" (Original z.B. /volume1/surveillance/Carport) und "CamLastRec". Über das Attribut "videofolderMap" wird "/volume1/surveillance/Carport" nun ersetzt durch
    "http://test.myds.me:8081/surveillance/Carport/"

Der substituierte Aufnahmelink wird nun zu: (ReadingsVal("<camname>","VideoFolder","")).(ReadingsVal("<name>","CamLastRec",""))

  • Der Versand des Aufnahmelinks per Mail kann durch ein Notify erfolgen:
 define N.CamCP1.Rec.Email notify CamCP1:CamLastRec:.*  {DebianMailnbl ('<Mailempfänger>','Bewegungsaufnahme Carport', 'Aufnahmelink: '.(ReadingsVal("CamCP1","VideoFolder","")).(ReadingsVal("CamCP1","CamLastRec",""))) }

Die Funktion DebianMailnbl für den Mailversand ist zuvor in 99_myUtils zu definieren. (siehe Mailversandroutine )


  • Der Versand des Aufnahmelinks per TelegramBot kann durch folgendes Notify erfolgen:
define N.CamCP1.Rec.TeleBot notify CamCP1:CamLastRec:.* { my $var = (ReadingsVal("CamCP1","VideoFolder","")).(ReadingsVal("CamCP1","CamLastRec","")); fhem ("set teleBot message $var Bewegungsaufnahme beim Carport"); }

Natürlich ist TelegramBot vorab einzurichten. Der Versand erfolgt in dem Beispiel an den defaultPeer.



2. Variante B

(noch für DSM 5.2 zu beschreiben).



Workaround bei DSM 2-Stufen Verifizierung

1. Benutzer in der SVS einrichten, zum Manager machen
2. Benutzer wird automatisch auch in FHEM eingerichtet, dort zum Admin machen
3. 2-Stufen Verifizierung ausschalten
4. Modul / Kamera zum Laufen bringen
5. Session im Modul auf SVS stellen
6. Benutzer in der DSM aus der Admin-Gruppe rausnehmen
7. 2-Stufen Verifizierung einschalten (Option nur für Admins)


Hinweise zu Fehlern

"Execution failed" in Snap-Funktion nach SVS update auf 8.0.1

Die Rechte auf das Verzeichnis /volume1/surveillance/@Snapshot wurden nicht auf den neuen Benutzer/Gruppe SurveillanceStation/SurveillanceStation umgesetzt.

Mit

 chown -R SurveillanceStation:SurveillanceStation  /volume1/surveillance/@Snapshot

konnte das Problem behoben werden. Die Rechte des Verzeichnisses sind jetzt:

drwxrwxrwx   8 root                root                 4096 Mar  4 16:03 .
drwxr-xr-x  49 root                root                 4096 Mar  4 15:06 ..
drwxrwxrwx  47 SurveillanceStation SurveillanceStation  4096 Mar  3 21:26 Carport
drwxrwxrwx+  3 root                root                 4096 Mar  2 01:01 @eaDir
drwxr-xr-x  24 SurveillanceStation SurveillanceStation  4096 Mar  4 15:07 Hauseingang
drwxr-xr-x   4 SurveillanceStation SurveillanceStation  4096 Feb 26 19:59 Keller
drwxr-xr-x   3 SurveillanceStation SurveillanceStation 45056 Mar  4 15:39 @Snapshot
drwxr-xr-x  20 SurveillanceStation SurveillanceStation  4096 Mar  3 07:17 Terrasse