SSCAM - Steuerung von Kameras in Synology Surveillance Station: Unterschied zwischen den Versionen

Aus FHEMWiki
Zur Navigation springen Zur Suche springen
Zeile 37: Zeile 37:


Wenn sie über dieses Modul diskutieren oder zur Verbesserung des Moduls beitragen möchten, ist im FHEM-Forum ein Sammelplatz unter:<br>
Wenn sie über dieses Modul diskutieren oder zur Verbesserung des Moduls beitragen möchten, ist im FHEM-Forum ein Sammelplatz unter:<br>
{{Link2Forum|Topic=45671.0 |LinkText=49_SSCam: Fragen, Hinweise, Neuigkeiten und mehr rund um dieses Modul}}  
{{Link2Forum|Topic=45671.0 |LinkText=49_SSCam: Fragen, Hinweise, Neuigkeiten und mehr rund um dieses Modul}}
 
 
<br>


== Vorbereitung ==
== Vorbereitung ==

Version vom 26. September 2017, 22:27 Uhr

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 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 und Funktionen der SVS 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
  • steuern der Erkennungsparameterwerte Empfindlichkeit, Schwellwert, Objektgröße und Prozentsatz für Auslösung
  • 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 bzw. Anzeige des letzten Schnappschusses
  • Ein- bzw. Ausschalten des Surveillance Station HomeMode und abfragen des HomeMode-Status
  • erzeugen einer Gallerie der letzten 1-10 Schnappschüsse (als Popup oder permanentes Device)

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. Auf Debian-Linux basierenden Systemen kann es installiert werden mit:

sudo apt-get install libjson-perl

Das Modul verwendet für HTTP-Calls die nichtblockierenden Funktionen von HttpUtils bzw. HttpUtils_NonblockingGet. Im DSM bzw. der Synology Surveillance Station muß ein Nutzer angelegt sein. Die Zugangsdaten 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

Bei der Definition wird zwischen einer Kamera-Definition und der Definition einer Surveillance Station (SVS) unterschieden. Abhängig von der Art des definierten Devices wird das Internal MODEL auf CAM oder SVS gesetzt und eine passende Teilmenge der beschriebenen set/get-Befehle dem Device zugewiesen.
Der Gültigkeitsbereich von set/get-Befehlen ist nach dem jeweiligen Befehl angegeben (gilt für CAM, SVS, CAM/SVS).

Eine Kamera wird definiert durch:

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

Zunächst muß diese Kamera in der Synology Surveillance Station 7.0 oder höher eingebunden sein und entsprechend funktionieren.

Ein SVS-Device zur Steuerung von Funktionen der Surveillance Station wird definiert mit:

define <name> SSCAM SVS <ServerAddr> [Port]

In diesem Fall wird statt <Kameraname in SVS> nur SVS angegeben.

Das Modul SSCam basiert auf Funktionen der Synology Surveillance Station API. 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 für Kamera-Device, "SVS" für SVS-Device. 
                    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]
     erstellt ein neues Kamera-Device CamCP
     define DS1 SSCAM SVS 192.168.2.20 [5000] 
     erstellt ein neues SVS-Device DS1

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

Siehe Commandref

Get

Siehe Commandref

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).



Kamerastreams in Weblinks zusammenstellen

Eine Routine, die dynamisch alle "enabled" Devices vom TYPE=SSCam in einem Weblink zusammenstellt.

Internals: 
   CFGFN 
   DEF        htmlCode {SurveillanceMjpegHtml("WBL.sscamview",320,240)} 
   LINK       {SurveillanceMjpegHtml("WBL.sscamview",320,240)} 
   NAME       WBL.sscamview 
   NR         34874 
   STATE      initialized 
   TYPE       weblink 
   WLTYPE     htmlCode 
   Helper: 
     Bm: 
       Weblink_define: 
         cnt        6 
         dmx        0 
         mAr 
         max        0 
         tot        0 
Attributes: 
   alias      Livestream 
   group      Kameras - Livestream 
   htmlattr   width="800" height="600" 
   room       Cams 

Subroutine in 99_myUtils:

sub SurveillanceMjpegHtml(@) {
  my $name = "SurveillanceMjpegHtml";
  my ( $devWeblink, $width, $height ) = @_;
  my $debug = ( AttrVal( $devWeblink, "verbose", 3 ) == 5 ) ? 1 : 0;
  Log3 $name, 1, "DEBUG $name: devWeblink:$devWeblink width:$width height:$height"
      if ($debug);

  my $htmlCode;

  $htmlCode .=
      sprintf( '<div class="makeTable wide"> <a href="/fhem?detail=%s">Livestream</a>',
    $devWeblink );
  $htmlCode .= '<table class="block wide internals">';
  $htmlCode .= '<tbody>';

  $htmlCode .= '<tr class="odd">';
  my @camDevs = devspec2array("TYPE=SSCam");
  my $cell    = 1;
  foreach my $camDev (@camDevs) {
    my $StmKey = ReadingsVal( $camDev, "StmKey", undef );

    if ( defined($StmKey) && ReadingsVal( $camDev, "Availability", "" ) eq "enabled" ) {

      my $webapi = sprintf(
        'http://%s:%d/webapi/entry.cgi?api=SYNO.SurveillanceStation.VideoStreaming&version=1&method=Stream&format=mjpeg&cameraId=%d&StmKey="%s"',
        $defs{$camDev}{SERVERADDR},
        $defs{$camDev}{SERVERPORT},
        $defs{$camDev}{CAMID}, $StmKey
      );

      my $html = sprintf(
        '<td>%s<br /> <img src=\'%s\' width=%d height=%d /> </td>',
        $defs{$camDev}{CAMNAME},
        $webapi, $width, $height
      );

      Log3 $name, 1, "DEBUG $name: cell:$cell camDev:$camDev StmKey:$StmKey"
          if ($debug);

      $cell++;

      if ( $cell == 3 ) {
        $htmlCode .= $html;
        $htmlCode .= '</tr>';
        $htmlCode .= '<tr class="odd">';
        $cell = 1;
      }
      else {
        $htmlCode .= $html;
      }

      Log3 $name, 1, "DEBUG $name: cell: $cell"
          if ($debug);

    }
  }

  if ( $cell == 2 ) {
    $htmlCode .= '<td> </td>';
  }

  $htmlCode .= '</tr>';

  $htmlCode .= '</tbody>';
  $htmlCode .= '</table>';
  $htmlCode .= '</div>';
  return $htmlCode;
}


Aktionen mit dem Aktionsregeleditor der Surveillance Station auslösen

Das Modul SSCam ist vordergründig dafür gedacht die Kameras in der Surveillance Station (SS) durch auslösende Aktionen innerhalb von FHEM zu steuern, d.h. dass FHEM üblicherweise das führende Element in der Steuerkette ist.

Allerdings gibt es auch die Fälle, in denen eine Kamera durch die eigene Bewegungserkennung oder der Bewegungserkennung der SS Aufnahmen erstellt. Wenn neue Aufnahmen erstellt wurden, bekommt SSCam dies zwar über eine Pollingabfrage über "get ... caminfoall", "get ... snapinfo" bzw. "get ... eventlist" angezeigt, aber dies erfolgt mit entsprechender Zeitverzögerung des Pollingintervalls.

Mit Hilfe des Aktionsregeleditors der Surveillance Station können solche Aufgaben bei zeitkritischen Vorgängen recht elegant gelöst werden.

Um die Funktionsweise darzustellen, soll ein einfaches Beispiel dienen. Es soll ein Licht angeschaltet werden wenn die Kamera "Hauseingang" eine Bewegung entdeckt hat.

  1. den Aktionsregeleditor in der SS aufrufen
    Aktionsregeleditor neue Regel anlegen
    Ereignis definieren
  2. eine neue Aktionsregel "Licht einschalten" vom Typ "ausgelöst" anlegen -> "Weiter"











  3. Unter "Ereignis 1" das Ereignis hinzufügen. Als Ereignisquelle "Kamera", Gerät "Hauseingang" und Ereignis "Bewegung entdeckt" aswählen. Es können noch weitere Ereignisse hnzugefügt werden (z.B. Bewegung einer zweiten Kamera erkannt) und über die Einstellungssektion die logische Verknüpfung beider Ereignisse (AND/OR) ausgewählt werden. -> "Weiter"


    Aktion definieren
    Zeitplan einstellen
  4. Im nächsten Screen ist die Aktion hinzuzufügen.
    Das Aktionsgerät ist in diesem Fall "Externes Gerät". Es soll eine URL angesprochen werden.
    http://<IP-FHEM>:<Port-FHEM>/fhem?cmd=set%20eg.wz.stehlampe%20on
    Weiterhin ist noch der FHEM-User und Passwort für das Login einzugeben.
    Es könnte noch die Anzahl der auszulösenden Aktionen und deren Intervall eingegeben werden. Es kann auf "1" belassen werden. -> "Weiter"









  5. ein Zeitplan für diese Regel festlegen. Im Beispiel soll sie immer aktiv sein. Also keine Änderung und "Fertigstellen".




Sobald nun eine Bewegung durch die Kamera entdeckt wird, schaltet FHEM das Licht "eg.wz.stehlampe" an. Dazu muß natürlich die Bewegungserkennung der Kamera in der SS (unter IP-Kamera) aktiviert sein.

Nach dem gleichen Prinzip kann zum Beispiel auch ein "get ... caminfoall", "get ... snapinfo" bzw. "get ... eventlist" getriggert werden. Lässt man ein Notify oder DOIF auf das Reading "CamLastRec" oder "LastSnapFilename" lauschen, kann man sich daraus abgeleitet eine Mail bzw. eine TelegramBot/Jabber-Nachricht mit dem Link zur letzten Aufnahme oder das Schnappschußbild senden lassen.

Diese Möglichkeit ist zum Beispiel in diesem Abschnitt beschrieben.



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