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 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:


SSCam bietet zur Zeit nachfolgende Features:


  • Start einer Aufnahme und optionaler Versand per Email
  • Stop einer Aufnahme per Befehl bzw. automatisch nach Ablauf einer einstellbaren Dauer
  • Auslösen von Schnappschnüssen und optionaler Email-Versand mittels integrierten Email-Client
  • Auslösen von Schnappschnüssen aller definierten Kameras und optionaler gemeinsamer Email-Versand mittels integrierten Email-Client
  • 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 incl. Audiowiedergabe, anzeigen der letzten Aufnahme oder des letzten Schnappschusses
  • Abruf und Ausgabe der Kamera Streamkeys sowie Stream-Urls (Nutzung von Kamera-Livestreams ohne Session Id)
  • abspielen der letzten Aufnahme bzw. Anzeige des letzten Schnappschusses
  • anzeigen der gespeicherten Anmeldeinformationen (Credentials)
  • Ein- bzw. Ausschalten des Surveillance Station HomeMode und abfragen des HomeMode-Status
  • abrufen des Surveillance Station Logs, auswerten des neuesten Eintrags als Reading
  • erzeugen einer Gallerie der letzten 1-10 Schnappschüsse (als Popup oder permanentes Device)
  • Start bzw. Stop Objekt Tracking (nur unterstützte PTZ-Kameras mit dieser Fähigkeit)
  • Setzen/Löschen eines Presets (bei PTZ-Kameras)
  • Setzen der Home-Position (bei PTZ-Kameras)
  • erstellen eines Paneels zur Kamera-Steuerung. (bei PTZ-Kameras)
  • erzeugen unterschiedlicher Typen von separaten Streaming-Devices (createStreamDev)
  • Aktivierung / Deaktivierung eines kamerainternen PIR-Sensors
  • Erzeugung einer readingsGroup zur Anzeige aller definierten SSCam-Devices (createReadingsGroup)
  • Automatisiertes Anlegen aller in der SVS vorhandenen Kameras in FHEM (autocreateCams)
  • integrierter Email-Versand von Schnappschüssen
  • lokales Abspeichern der letzten Kamera-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 die Perl-Module JSON und MIME::Lite die üblicherweise nachinstalliert werden müssen. Auf Debian-Linux basierenden Systemen können sie installiert werden mit:

sudo apt-get install libjson-perl
sudo apt-get install libmime-lite-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 
   Encode    
   HttpUtils       (FHEM-Modul)
   BlockingCall    (FHEM-Modul)
   Net::SMTP       (wenn Email-Versand verwendet)
   MIME::Lite      (wenn Email-Versand verwendet) 

Das PTZ-Paneel (nur PTZ Kameras) in SSCam benutzt einen eigenen Satz Icons. Damit das System sie findet, ist im FHEMWEB Device das Attribut "iconPath" um "sscam" zu ergänzen (z.B. "attr WEB iconPath default:fhemSVG:openautomation:sscam").


Definition eines SVS-Devices und von Kameras

Namensgebung für Kameras innerhalb der SVS

Die gegenwärtige API enthält einen Bug, der bei Namensähnlichkeit im Wortstamm der Kameras in der SVS Unschärfen beim Schnappschußabruf verursacht. Das trifft zu, wenn zum Beispiel Kameranamen wie Nord_Ost und Ost gleichzeitig in der SVS definiert sind. Solche Ähnlichkeiten der verwendeten Kameranamen sollte deswegen vermieden werden.

Das betrifft nur die Kameranamen innerhalb der SVS und ist nicht mit den Devicenamen in FHEM zu verwechseln !



SVS-Device definieren

SVS Device definiert

Die FHEM-seitige Definition eines SVS-Devices (SVS = Synology Surveillance Station) dient dazu, übergreifende Funktionen abzubilden die keinen direkten Bezug zu einer speziellen Kamera haben. So enthält ein SVS-Device Funktionen der Verwaltungsoberfläche der Synology Surveillance Station.

Das sind z.B. das Auslösen von externen Events die definierte Aktionen des Aktionsregeleditors in der SVS triggern, Schalten des SVS HomeMode oder der Abruf von Logeinträgen.

Möchte man nur Standards verwenden, also das HTTP-Protokoll mit dem Standardport 5000, ist die Definition einfach:

define <Name> SSCAM SVS <ServerAddr> [Port] [Protocol]
z.B.
define SDS1 SSCam SVS 192.168.2.10

Dabei ist "192.168.2.10" die IP-Adresse der Synology Diskstation. Um den Port 9001 mit dem HTTPS-Protokoll zu verwenden, wäre die Beispieldefinition:

define SDS2 SSCam SVS 192.168.2.10 9901 HTTPS

Nach der Definition sind zunächst User und Passwort mit "set <name> credentials <User> <Password>" anzugeben. Einzelheiten dazu sind im Abschnitt Credentials beschrieben.

SVS Device pollcaminfoall


Ist der initiale Verbindungsaufbau erfolgreich, werden einige grundlegende Eigenschaften der SVS und der Status "Initialized" angezeigt.

Es wird empfohlen, das Attribut "pollcaminfoall" zu setzen um regelmäßig Informationen zum SVS-Status abzurufen. Ein Pollingintervall von 100 - 200 Sekunden ist dabei allgemein hinreichend.

attr SDS2 pollcaminfoall 100


Der Status des Devices ändert sich in "polling" und es werden zusätzliche Readings erzeugt, wie z.B. "HomeModeState" zur Anzeige des aktuellen HomeMode-Status oder "LastLogEntry", welches den letzen Eintrag des SVS-Logfiles enthält. Sollten Timeouts beim Abruf von Kameradaten oder der Ausführung von Kommandos auftreten, hilft in den meisten Fällen eine Anpassung des Attributes timeout.




Kameras definieren

Wurde ein SVS-Device definiert und ist dieses nach Eingabe der Credentials einsatzbereit, können mit dem Befehl

set <SVS-Name> autocreateCams

alle in der SVS vorhandenen Kameras automatisch in FHEM definiert. In den neu definierten Kameras wird ein grundlegender Satz von sinnvollen Attributen ebenfalls im Device inkludiert. Die Namen der Kamera in der SVS werden entsprechend der Vorgaben für Devicenamen in FHEM überprüft und ggf. bei der Devicedefinition angepasst. Existiert bereits ein Pendant der Kamera in FHEM, wird sie nicht erneut angelegt. Somit kann dieser Befehl regelmäßig, z.B. mit einem AT, ausgeführt werden um neu aufgenommene Kameras automatisch auch in FHEM anzulegen.

Manuell wird eine Kamera mit dem Befehl:

define <Name> SSCam <Kameraname in SVS> <IP-Adresse der DS> [Port] [Protokoll]
z.B.
define CamTER SSCam Terrasse 192.168.2.10 5000
Kamera Device definiert

erstellt. Sind die optionalen Angaben Port und Protokoll nicht gesetzt, wird der Standardport 5000 und das HTTP-Protokoll verwendet. Wie bei der Definition eines SVS-Devices ist auch hier nach der erfolgreichen Definition zunächst der User und das Passwort für den Zugang zur SVS zu speichern.

set <name> credentials <User> <Password> 

Es gibt grundsätzlich zwei Arten des Verbindungsaufbaus, entweder mit dem DSM oder mit der SVS. Das Attribut "session" legt die Auswahl fest. Ist es nicht gesetzt (Standard), wird immer zunächst die Verbindung zur DSM aufgebaut. Es ist in diesem Fall bei "set .. credentials" ein User anzugeben der im DSM existiert und Mitglied der Admin-Gruppe ist.

Einzelheiten dazu sind im Abschnitt Credentials beschrieben.

Ist der Zugriff erfolgreich, werden im Device eine ganze Reihe von Readings erstellt. Das Reading "Availablility" sollte auf jeden Fall "enabled" enthalten sofern die Kamera in der SVS funktionsfähig und nicht deaktiviert ist. Die erstellten Readings werden teilweise für die Steuerung der verfügbaren Kameraoperationen verwendet. Dadurch bedingt sollte die Änderung der Eventgenerierung, z.B. durch event-on-change-reading, mit Bedacht erfolgen.

Initial ist das Polling nicht aktiviert (Reading PollState = Inactive). Es wird empfohlen das Polling der Kamera regelmäßig auszuführen. Dazu ist das Attribut "pollcaminfoall" zu setzen um das Pollingintervall in Sekunden zu definieren, z.B.:


attr SDS2 pollcaminfoall 210

Ist das Attribut eingestellt, ändert sind der Status des Readings "PollState" und zeigt den Zeitpunkt für den nächsten Datenabruf der Kamera:

PollState Active - next time: 11:49:17

Das Polling und dessen Ergebnisse werden im Logfile mit verbose 3 protokolliert.

2018.12.16 11:49:17.076 3: Cam - Polling now: 11:49:17 , next Polling: 11:52:47
2018.12.16 11:49:17.806 3: Cam - Query eventlist of camera Carport retrieved
2018.12.16 11:49:18.401 3: Cam - Informations of camera Carport retrieved
2018.12.16 11:49:18.875 3: Cam - Capabilities of camera Carport retrieved
2018.12.16 11:49:19.370 3: Cam - Informations related to Surveillance Station retrieved
2018.12.16 11:49:19.918 3: Cam - Enumerate motion detection parameters of camera Carport retrieved
2018.12.16 11:49:20.719 3: Cam - Snapinfos of camera Carport retrieved
2018.12.16 11:49:21.320 3: Cam - Stream-URLs of camera Carport retrieved

Um das zu verhindern kann das Attribut "pollnologging" verwendet werden:

attr SDS2 pollnologging 1

Mit diesen Einstellungen ist das Kameradevice grundsätzlich einsatzbereit. Es existieren natürlich noch etliche mehr Attribute zur Steuerung von Funktionen. Deren Bedeutung bzw. Anwendung wird in der Beschreibung der jeweiligen Devicefunktion beschrieben. Sollten Timeouts beim Abruf von Kameradaten oder der Ausführung von Kommandos auftreten, hilft in den meisten Fällen eine Anpassung des Attributes timeout.

Wurde eine neue Kamera definiert, wird diesem Device zunächst eine Standardaufnahmdauer von 15 Sekunden 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.

Erkennt das Modul die definierte Kamera als PTZ-Device (Reading "DeviceType = PTZ"), wird automatisch ein Steuerungspaneel in der Detailansicht erstellt. Dieses Paneel setzt SVS-Version >= 7.1 voraus. Die Eigenschaften und das Verhalten des Paneels können mit den Attributen "ptzPanel_.*" beeinflusst werden. Siehe dazu auch den Befehl "set <name> createPTZcontrol".


Credentials

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

    set <name> credentials <username> <password>

Die Passwortlänge beträgt maximal 20 Zeichen. Der Anwender kann in Abhängigkeit der beabsichtigten einzusetzenden Funktionen einen Nutzer im DSM bzw. in der Surveillance Station einrichten. Sollte im DSM die 2-Stufen Verifizierung aktiviert sein, ist die Session mit der Surveillance Station aufzubauen (Attribut "session = SurveillanceStation").

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



Auslösen von Schnappschüssen

Ist das SSCam Kameradevice definiert, können einzelne oder eine einstellbare Anzahl von Schnappschüssen ausgelöst werden. Die Schnappschüsse, d.h. die Bildfiles werden im Standardverzeichnis für Schnappschüsse, üblicherweise /surveillance/@Snapshot, gespeichert.

Um einen einzelnen Schnappschuß auszulösen wird einfach

set <name> snap

getriggert.

Das Modul gestattet es mit einem einzigen "snap"-Befehl eine beliebige Anzahl Schnappschüsse mit einem einstellbaren zeitlichen Abstand zwischen den Einzelaufnahmen zu starten.

set <name> snap 4 3

In diesem Fall werden 4 Schnappschüsse im Abstand von 3 Sekunden ausgelöst. Ist die Verzögerungszeit nicht angegeben, wird als Standard ein zeitlicher Abstand von 2 Sekunden zwischen den EInzelaufnahmen verwendet. Es ist möglich den modulinternen Email-Client zum Versand der angefertigten Schnappschüsse zu verwenden. Weitere Informationen dazu sind hier beschrieben.



Definition und Verwendung von Streaming Devices (SSCamSTRM)

Alle Streaming Devices vom Typ SSCamSTRM stellen einige Attribute zur Verfügung, die helfen könnnen eine stabile Stream-Wiedergabe zu realisieren. Die Verwendung dieser Attribute kann insbesondere helfen die Wiedergabe zu stabilisieren wenn man zum Beispiel Wandtablets verwendet werden die in einen Stromsparmodus wechseln o.ä.

autoRefresh
Aktive Browserseiten des FHEMWEB-Devices, welches das SSCamSTRM-Device aufgerufen hat, werden nach der eingestellten Zeit (Sekunden) neu geladen.

autoRefreshFW
Mit diesem Attribut kann ein bestimmtes FHEMWEB-Device festgelegt werden, dessen aktive Browserseiten regelmäßig neu geladen werden sollen.

forcePageRefresh
Das Attribut wird durch SSCam ausgewertet. Es wird ein Reload aller Browserseiten mit aktiven FHEMWEB-Verbindungen nach dem Abschluß bestimmter SSCam-Befehle, wie z.B. Schnappschüssen, erzwungen.



Erstellen einer Schnappschußgalerie

Schnappschüsse können zwar einfach mit dem Befehl "set/get <name> snapgallery" angezeigt werden, aber in doesem Kapitel geht es darum ein separates Device zur Anzeige einer Schnappschußgalerie anzulegen.

Soll z.B. für das Kameradevice "SSCam.Hauseingang" eine Galerie angelegt werden, kann dies einfach mit dem Befehl geschehen:

set SSCam.Hauseingang createSnapGallery

Wahrscheinlich erscheint zunächst die Ausgabe:

Before use "createSnapGallery" you have to set the attribute "snapGalleryBoost" first due to the technology of retrieving snapshots automatically is needed.

Die Ausgabe erinnert uns daran, dass man bei Benutzung einer Schnappschußgalerie das Attribut "snapGalleryBoost" auf 1 setzen muss. Dieses Attribut setzt seinerseits die Verwendung des Attributes "pollcaminfoall" voraus, damit die für diese Technologie benötigten Hintergrundprozesse ablaufen.

Sind diese Attribute gesetzt, erstellt ein erneutes Ausführen von "set SSCam.Hauseingang createSnapGallery" ein Galerie-Device im Raum "SSCam".

Schnappschußgalerie definiert

Die erstellte Schnappschußgalerie zeigt per Default die 3 neuesten Schnappschüsse des verbundenen Kamera-Devices (siehe Internal PARENT) im Format "Icon", d.h. in einer verkleinerten Form in geringer Auflösung an. Je nach eingestellter Systemsprache (Attribut language im global Device) wird die Beschriftung der Galerie in deutsch oder englisch ausgeprägt.

Sollen die Schnappschüsse in der originalen Auflösung angzeigt werden, setzt man im Kamera-Device:

attr SSCam.Hauseingang snapGallerySize Full

Zu berücksichtigen ist dabei, dass die Bilddaten permanent von der SVS abgerufen und im RAM gespeichert werden. Im Normalfall ist dies kein Problem, man sollte diesen Umstand aber wissen.

Um die Größe der Einzelbilder in der Galerie zu verändern bzw. an die Wünsche anzupassen, benutzt man das Attribut:

 attr SSCam.Hauseingang snapGalleryHtmlAttr width="325" height="225"
Schnappschußgalerie arrangiert in 4 Spalten

Die Anzahl der darzustellenden (und damit auch abgerufenen und gespeicherten) Schnappschüsse kann mit dem Attribut "snapGalleryNumber" eigestellt werden, wobei das Attribut "snapGalleryColumns" die Anzahl der darzustellenden Schnappschüsse in einer Reihe definiert. Z.B. für 6 Schnappschüsse mit 4 Bildern in einer Reihe:

attr SSCam.Hauseingang snapGalleryNumber 6
attr SSCam.Hauseingang snapGalleryColumns 4

Nach einem neuen Seitenaufruf oder Refresh erscheinen 6 Schnappschüsse arrangiert in 4 Spalten.

Wird mit der Maus auf einen der dargestellten Schnappschüsse geklickt, wird das entsprechende Bild in einem OK-Popup separat dargestellt. Die Größe des Popups kann mit dem Attribut "popupWindowSize" im Streaming-Device !! eingestellt werden, z.B.:

attr SSCamSTRM.SSCam.Hauseingang.snapgallery popupWindowSize width="600" height="425"

Dadurch kann das jeweilige Snapshot vergrößert angezeigt werden.

Schnappschußgalerie mit Popup
Take snapshot



In der Fußzeile des Galleriedevices befindet sich ein Button "Take Snapshot". Mit diesem Button kann einn ein Schnappschuß der verbundenen Kamera (wird ebenfalls im Tooltipp genannt) angetriggert werden.







Streaming-Device zur MJPEG Wiedergabe

Die Wiedergabe von MJPEG Videos ist die einfachste Form des Streamings von Kameravideos. Um eine möglichst gleichmäßige Wiedergabe zu erhalten, sollte die Kamera in der SVS auf das Videoformat "MJPEG" eingestellt werden:

SVS Verwaltung -> Kamera bearbeiten -> Geräteeinstellungen -> Video -> Allgemein -> Videoformat

Die gewählte Auflösung, Bildrate (FPS) und Bildqualität haben ebenfalls Einfluß auf die Flüssigkeit der Videodarstellung. Möchte oder kann man die Einstellungen nicht auf "MJPEG" ändern, z.B. weil man ebenfalls HLS-Streaming verwenden möchte, bietet sich alternativ die Verwendung eines Streaming Devices vom Typ "generic" an um eine flüssige MJPEG-Wiedergabe zu erhalten.

MJPEG Streaming Device

In einem Kameradevice (z.B. "SSCam.Hauseingang") erfolgt die abgeleitete Definition eines Streaming Devices vom Typ MJPEG mit:

set SSCam.Hauseingang createStreamDev mjpeg

Mit dieser Rohinstallation ist das Device bereits einsatzbereit und zeigt den MJPEG Stream der verbundenen Kamera an. Sollte das Kamera-Device zusätzlich einen Audiostream zur Verfügung stellen können (Reading "CamAudioType" ist gefüllt), wird ebenfalls ein kleines Bedienpaneel zur Audiosteuerung mit aufgebaut.

Beim Überfahren der angebotenen Schaltflächen mit der Maus werden entsprechende Tooltipp-Hinweise angezeigt.


MJPEG Streaming PTZ Device mit Steuerungspaneel

Ist die Kamera schwenkbar (PTZ), wird zusätzlich ein PTZ-Paneel zur Schwenksteuerung bzw. zum Anfahren voreingestellter Positionen (Preset) und automatisch durchführbaren Touren (Patrol) erstellt. Mit dem Attribut "ptzPanel_use = 0" im verbundenen Kamera-Device (Internal PARENT im Streaming Device) kann die Ausgabe des Paneels unterdrückt werden.


Ein Mausklick auf das Videobild öffnet ein OK-Popup Fenster. Ein Popup Fenster kann ebenfalls mit dem Befehl:

set SSCamSTRM.SSCam.Hauseingang.mjpeg popupStream [option]

geöffnet werden.

OK-Popup Window

Das Popup-Fenster wird per default ebenfalls als OK-Popup ausgeführt. Mit dem Attribut:

attr SSCamSTRM.SSCam.Hauseingang.mjpeg popupStreamTo 5

lässt das Popup für 5 Sekunden öffnen und wieder automatisch schließen. Diese Möglichkeit ist vor allem für Event gesteuerte Aktivitäten vorgesehen. Ein gesetzter Attributwert kann temporär mit dem Zusatz [option] übersteuert wreden, entweder mit einem Sekundenwert oder "OK" für ein Popup mit einer OK-Bestätigungstaste. Ein mit "set <name> popupStream" geöffnetes Popup Fenster wird in allen aktiven FHEMWEB Browserseiten geöffnet.

Mit dem Attribut "popupStreamFW" kann aus einer Drop-Down-Liste ein spezifisches FHEMWEB-Device ausgewählt werden, auf dessen aktiver Browserseiten das Popup stattdessen geöffnet werden soll. Somit kann bestimmt werden, dass z.B. das Popup nur auf Wandtablets geöffnet wird, wenn ein speziell vorgesehenes FHEMWEB-Device dafür verwendet ist.

Popup Window mit Timeout


Ein solches Popup kan z.B. für eine Klingelsignalisierung verwendet werden, über dessen Event das Poup für 60 Sekunden aufgeblendet wird.

Für alle Arten der Popups kann deren Größe bestimmt werden mit:

attr SSCamSTRM.SSCam.Hauseingang.mjpeg popupWindowSize width="600" height="425"




Hingegen wird die Größe des Videos im Streamingdevice mit:

attr SSCamSTRM.SSCam.Hauseingang.mjpeg htmlattr width="380" height="240"

festgelegt.




Streaming-Device zur Wiedergabe eines permanenten HLS Streams

Im Gegensatz zu dem Befehl "set <Kamera> runView live_fw_hls" oder der Wiedergabe von HLS in einem Streaming-Device vom Typ "switched", welche beide mit dem nativen HLS-Stream arbeiten der von der Surveillance Station geliefert wird, kann mit dem Streaming Device vom Typ "hls" ein permanenter HSL-Datenstrom (z.B. von ffmpeg geliefert) dargestellt werden.

Im nachfolgenden Beispiel wird davon ausgegangen:

  • es wird das Docker Image "gihad/streamer" verwendet um die von den Kameras gelieferten RTSP-Streams in HLS umzuwandeln
  • der Docker Container wird auf einer Synology Diskstation mit dem Dockerpaket ausgeführt (beispielhaft)
  • es für eine Kamera "Hauseingang" die HLS-Streameinbindung in FHEM erläutert


Zunächst wird die Implementierung des Dockercontainers beschrieben.


Docker Image "gihad/streamer" zur Umwandlung von RTSP in HLS auf Synology Diskstation

An dem folgenden Beispiel soll aufgezeigt werden, wie man die gelieferten RTSP-Streams der SVS mit dem Dockerimage gihad/streamer in HLS umwandelt um sie in ein Streamin Device vom Typ "hls" einzubinden. Dieses Image hat die Eigenschaft, mehrere RTSP's gleichzeitig behandeln zu können und verbraucht dabei wenig Ressourcen.


  1. zunächst in der SVS in allen Cams die Gültigkeitsdauer der Streamskeys auf unendlich setzen: SVS -> Live-Ansicht-Einstellungen -> Erweitert (auf neuesten SVS-Versionen ist diese Einstellung nicht mehr vorhanden)
  2. Die Kamera muss H.264 liefern. Ebenfalls in SVS einstellen: SVS -> Geräteeinstellungen -> Video -> Videoformat


Im Docker der Diskstation das Image gihad/streamer suchen und herunterladen. Beim Anlegen des Containers werden die Infos zu den RTSP-Streams benötigt. Sie werden als Parameter-String in folgender Art übergeben:

INPUT_STREAM_1 NAME1 INPUT_STREAM_2 NAME2 INPUT_STREAM_3 NAME3 INPUT_STREAM_4 NAME4  ...


Für z.B. 5 Kameras werden die Angaben zu den RTSP's aus dem Reading "StmKeyUnicst" entnommen. Sollte das Reading nicht sichtbar sein, ist das Attribut "showStmInfoFull = 1" im Kamera-Device zu setzen.

Als "NAME<Nr>" (für die spätere Eingabe im Docker-Container) werden die FHEM-Devicenamen für die jeweilige Kamera verwendet. Das ist zwar nicht nötig, macht es in der Folge aber leichter. Der später zu verwendende PARAMETER-String sieht dann wie folgt aus:

rtsp://syno:1b9ee4585ce3cd0f36e2dd792e1b8a41@sds1.myds.me:554/Sms=5.unicast CamCP1 rtsp://syno:8a487936c83d17e5ebd46f50e6fe7abf@sds1.myds.me:554/Sms=7.unicast CamGW1 rtsp://syno:f1cf5eb6fee2929f198af6393b86b22d@192.168.2.10:554/Sms=1.unicast CamHE1 rtsp://syno:b1217a3fc752cb347f7fd97b196963c0@192.168.2.10:554/Sms=4.unicast CamKE1 rtsp://syno:fb69b2abd6120079cdad9a4c69ea7f35@192.168.2.10:554/Sms=2.unicast CamTER

Die Namen CamCP1, CamGW1 etc. sind die FHEM-Devicenamen für die jeweilige Kamera.

Ist der Docker-Container heruntergeladen, sind beim ersten Start einige Angaben zu tätigen um die Eigenschaften zur Laufzeit zu definieren. Nachfolgend werden diese beispielhaft beschrieben:

  1. Containername: RSTP_zu_HLS
  2. Container mit hoher Priorität ausführen
  3. Volume: Ordner hinzufügen -> z.B. "Temp/Stream" (vorgesehener Pfad auf der Diskstation für Streamfiles) - /tmp/stream (im Docker -> so lassen)
  4. Port-Einstellungen: lokaler Port 32000 (Port auf der Diskstation), Container-Port 80
  5. Umwelt: PARAMETERS - rtsp://syno:1b9ee4585ce3cd0f36e2dd792e1b8a41@sds1.myds.me:554/Sms=5.unicast CamCP1 rtsp://syno:8a487936c83d17e5ebd46f50e6fe7abf@sds1.myds.me:554/Sms=7.unicast CamGW1 rtsp://syno:f1cf5eb6fee2929f198af6393b86b22d@192.168.2.10:554/Sms=1.unicast CamHE1 rtsp://syno:b1217a3fc752cb347f7fd97b196963c0@192.168.2.10:554/Sms=4.unicast CamKE1 rtsp://syno:fb69b2abd6120079cdad9a4c69ea7f35@192.168.2.10:554/Sms=2.unicast CamTER


Mit diesen Einstellungen kann der Container gestartet werden. Im Pfad "Temp/Stream" auf der Diskstation werden für jede Kamera Dateien angelegt:

<NAME>.m3u8 <NAME>xx.ts ...
z.B.
CamCP1.m3u8 CamCP19616.ts ...

Da in Parameters für NAME der FHEM-Devicenamen für die jeweilige Kamera angegeben wurde, ist die Zuordnung innerhalb des zu erstellenden Streaming-Devices nun leicht möglich.

Es hat sich als günstig erwiesen den Container regelmäßig zu restarten um Fehlersituationen vorzubeugen. Dazu kann der Aufgabenplaner der Synology DS verwendet werden. Im Aufagbenplaner ist dazu eine geplante Aufgabe vom Typ "benutzerdefiniertes Script" anzulegen. Die Parameter sind:

Benutzer:
root

Zeitplan:
jede Stunde 

Aufgabeneinstellungen:
# docker restart RSTP_zu_HLS
/usr/syno/bin/synowebapi --exec api=SYNO.Docker.Container version=1 method=restart name="RSTP_zu_HLS" 

Definieren und Parametrisieren des Streaming Devices

In FHEM wird im Kamera-Device nun ein Streaming-Device vom Typ "hls" angelegt:

set <Kamera-Device> createStreamDev hls
z.B.
set SSCam.Hauseingang createStreamDev hls

Das neue Device, in diesem Beispiel mit Namen "SSCamSTRM.SSCam.Hauseingang.hls", wird im Raum "SSCam" angelegt.

Big Buck Bunny

In dem verbundenen Kamera-Device (Internal PARENT) ist zwingend das Attribut "hlsStrmObject" zu setzen. Mit diesem Attribut wird der darzustellende HLS-Stream definiert. Um die Funktion des neuen Devices zu testen kann zunächst definiert werden:

attr SSCam.Hauseingang hlsStrmObject https://video-dev.github.io/streams/x36xhzz/x36xhzz.m3u8

Wenn alles funktioniert, wird ein kleines Beispielvideo abgespielt. Wird die Maus über dem Video positioniert, erscheint eine Steuerungsleiste für Pause, Play, Laustärke (Mute) oder zur Vollbilddarstellung.

Generell kann die Videogröße mit dem Attrbut "htmlattr" im Streaming-Device eingestellt werden:

attr SSCamSTRM.SSCam.Hauseingang.hls htmlattr width="680" height="460"
RestartTooltipp





Unterhalb des Videos befinden sich Drucktasten zum Restarten des Videos, zum Starten einer Aufnahme der Kamera und zum Triggern eines Schnappschusses der verbundenen Kamera. Tooltipps beim Überstreichen der Buttons mit der Maus geben entsprechende Hinweise.







Um einen im Dockercontainer erstellten Videostream in das Streaming-Device einzubinden, ist das Attribut "hlsStrmObject" im Kamera-Device zu setzen:

attr SSCam.Hauseingang hlsStrmObject http://192.168.2.10:32000/CamHE1.m3u8
Kamera HLS Stream

Dabei ist:

 192.168.2.10: Die IP-Adresse der Synology Diskstation 
               mit dem Docker Container
 32000       : der lokaler Port der DS (angegeben bei 
               der Einrichtung des Docker Containers) 

Für die weiteren im Docker Container definierten Kameras und Streams kann die Definition der Streaming Devices entsprechend erfolgen. Die Angabe des HLS-Streams zur Wiedergabe kann mit der Platzhaltervariable $NAME vereinfacht werden. Dabei steht "$NAME" für den Devicenamen des Kameranamens in FHEM. Aus diesem Grund wurde dieser Name bei der Einrichtung des Docker-Containers angegeben. Man kann unter diesen Voraussetzungen in jedes Attribut "hlsStrmObject" der Kamera-Devices schreiben:

attr SSCam.Hauseingang hlsStrmObject http://192.168.2.10:32000/$NAME.m3u8

Das Streaming Device nutzt per default eine lokal installierte sscam_hls.js Javascript Bibliothek. Mit dem Attribut "hlsNetScript = 1" in einem SVS-Device kann definiert werden, dass immer die aktuellste Bibliothek von der Projektseite verwendet werden soll. Diese Einstellung gilt dann zentral für alle definierten SSCam-Devices und benötigt eine Internetverbindung.




Das flexible Streaming-Device vom Typ "generic"

MJPEG direkt von Kamera wiedergeben

Mit dem generischen Streaming Device Typ können beliebige HTTP Video Tags verwendet werden um einen Videostream oder ein Bild wiederzugeben.

In dem nachfolgenden Beispiel soll ein MJPEG Stream direkt von der Kamera anstatt von der Synology Video Station mit dem Streaming Device wiedergegeben werden.

Die Kamera für dieses Beispiel ist eine HIKVISION DS-2CD2042WD-I. Zunächst muß die URL ermittelt werden, z.B. aus der Angabe in diesem Dokument "http://download.viakom.cz/HIKVISION/Manualy/Navod%20Hikvision%20URL%20streaming%20EN.pdf":

http://<user>:<Password>@<IP-Adresse>:<Port>/Streaming/channels/ID/httppreview
Streaming Device "generic"

Der User "admin" und dessen Paßwort sind die Anmeldedaten, die man für die direkte Anmeldung an der Kameraverwaltungsoberfläche benötigt und sind nicht mit den Credentials innerhalb des SSCam-Devices zu verwechseln !! Die Zahl nach "/channels/" ist die ID und beschreibt den Main- oder Substream. "2" repräsentiert den Substream, "1" repräsentiert den Mainstream. Bei dieser Kamera kann die HTTP streaming push URL nur einen MJPEG Substream nutzen, deswegen ist der Wert der ID 2 oder 102. Der Substream "2" ist vorab auf MJPEG einzustellen.

Die Ip-Adresse und der Port sind z.B. den Readings des Kamera-Devices zu entnehmen:

CamIP   192.168.2.34
CamPort 80

Um ein Streaming-Device vom Typ "generic" zu definieren, wird der Set-Befehl im Kamera-Device (in diesem Beispiel "SSCam.GiebelWest") verwendet:

set SSCam.GiebelWest createStreamDev generic

Dadurch wird ein Device "SSCamSTRM.SSCam.GiebelWest.generic" angelegt. Die Definition des darzustellenden Videos ist im Kamera-Device (Internal PARENT) mit dem Attribut "genericStrmHtmlTag" festzulegen:

<img $HTMLATTR 
   src="http://admin:<Password>@192.168.2.34:80/Streaming/channels/2/httppreview"
>

Die verwendbaren Variablen $HTMLATTR, $NAME sind Platzhalter und übernehmen ein gesetztes Attribut "htmlattr" bzw. entsprechen dem Kamera-Devicenamen. Die Angaben im Attribut "genericStrmHtmlTag" können frei gestaltet werden sofern sie die geforderte Syntax für Video Tags in HTML erfüllen.

Mit den Attributen:

htmlattr
popupStreamTo
popupWindowSize

können verschiedene Eigenschaften des Devices und das Verhalten der Videodarstellung im Streaming Device beeinflusst werden.


einen bereitgestellten HLS Stream wiedergeben

Wird ein HLS Video Stream, z.B. über einen Onlinedienst oder durch ein lokales ffmpeg, bereitgestellt und soll dieses Video in einem Streaming Device vom Typ "generic" eingebunden werden, wäre das Attribut "genericStrmHtmlTag" entsprechend abzuändern. Die Schritte zur Erstellung des Streaming Devices und zur anschließenden Einstellung der Eigenschaften entsprechen der Beschreibung im vorherigen Abschnitt.

<video $HTMLATTR controls autoplay> 
   <source src='http://192.168.2.10:32000/$NAME.m3u8' type='application/x-mpegURL'> 
</video>



Das Streaming-Device für geschaltete Wiedergabe - Typ "switched"

Tbd.



Das Modul bzw. eine Kamera deaktivieren / aktivieren

Mit dem Attribut "disable" kann das Modul bzw. eine Gerätedefinition deaktiviert werden. 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.

Im Gegensatz zum "disable" Attribut wird mit dem Befehl "set <name> disable" die Kamera selbst in der SVS deaktiviert bzw. mit "set <name> enable" wieder aktiviert.



Eine Übersicht mit Hilfe von readingsGroup

Hinweis: Ab der SSCam-Version 7.4.0 kann eine Readingsgroup einfach über das Kommando "set <name> createReadingsGroup" erstellt werden. Dazu ist in einem Kamera- oder SVS-Device der Befehl "set <name> createReadingsGroup" auszuführen. Die erstellte RG kann danach entsprechend eigener Wünsche weiter bearbeitet werden.

Wer es selbst machen möchte, kann die nachfolgende Anleitung verwenden.

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 in der commandref/readingsGroup 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:FILTER=MODEL!=SVS: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.:

<Name oder IP Synology DS:>/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

(Der Code kann als RAW-Definition im FHEMWEB übernommen werden)

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.



Mailversand von Schnappschüssen und Aufnahmen

mehrere Schnappschüsse gesammelt mit dem integrierten Email-Client versenden

Das SScam-Modul enthält ab der Version 8.2.0 einen integrierten Email-Client, mit dem die durch das Kamera-Device erstellten Schnappschüsse versendet werden können. Bei diesem Verfahren müssen keine Verzeichnisse der Synology mit den Bilddaten beim FHEM-Server gemountet werden.

Zur Verwendung dieser Funktion muss das Perl-Modul MIME::Lite installiert sein. Auf Debian-System kann es mit

sudo apt-get install libmime-lite-perl

installiert werden.

Grundsätzlich sind zunächst die Zugangsdaten für den Email-Server zu hinterlegen. Dies geschieht mit dem Befehl:

set <name> smtpcredentials <user> <password>

Die Credentials werden verscrambelt in einem File auf Betriebssystemebene abgelegt. Der Email-Versand wird durch das Setzen des Attributs "snapEmailTxt" eingeschaltet.

Zunächst müssen weitere, für den Email-Versand unbedingt notwendige Attribute, gesetzt werden. Dies sind:

smtpHost  - Hostname oder die IP-Adresse des Postausgangsservers (z.B. securesmtp.t-online.de)
smtpFrom  - Absenderadresse (<name>@<domain>)
smtpTo    - ein oder mehrere  Empfängeradresse(n) (<name>@<domain>, <name>@<domain> ...)

Sind diese Angaben korrekt abgespeichert, wird die Email-Option durch das Setzen des Attributes:

attr snapEmailTxt subject => <Betreff-Text>, body => <Mitteilung-Text> (z.B. subject => Bewegungsalarm $CAM, body => Eine Bewegung wurde an der $CAM registriert.)

permanent aktiviert werden.

Als Platzhalter können "$CAM", "$DATE" und "$TIME" verwendet werden. Die Variable "$CAM" wird durch den Alias des Kamera-Devices ersetzt falls vorhanden, ansonsten wird der originale Name der Kamera in der SVS dafür verwendet. Ansonsten ist die angegbene Form der Kombination aus "subject" und "body" einzuhalten. "$DATE" und "$TIME" werden durch den aktuellen Zeitstempel zum Zeitpunkt der Email-Erstellung ersetzt. Innerhalb des Attributes "snapEmailTxt" darf kein Doppelpunkt (":") verwendet werden !

Der Verbindungsaufbau zum Postausgangsserver erfolgt initial unverschüsselt und wechselt zu einer verschlüsslten Verbindung wenn SSL zur Verfügung steht. In diesem Fall erfolgt auch die Übermittlung von User/Password verschlüsselt. Ist das Attribut "smtpSSLPort" explizit definiert, erfolgt auch der initiale Verbindungsaufbau sofort verschlüsselt. Es wird per Default der Port "465" verwendet.

Soll in besonderen Fällen auf die Verwendung der SSL-Verschlüsselung verzichtet werden, kann es durch Setzen des Attributes "smtpNoUseSSL = 1" vorgenommen werden.

Schnappschuß als Email-Anhang empfangen

So eingestellt, ist der Versand von Emails mit dem erstellen Schnappschuß als Anhang aktiviert und wird bei jeder Ausführung von

set <name> snap

im Anschluß an die Schnappschußerstellung integriert ausgeführt. Der Versand erfolgt non-Blocking im Hintergrund und dadurch wird FHEM bei Sendeproblemen nicht beeinträchtigt.

SSCam bietet auch die Möglichkeit mehrere Schnappschüsse in einem einstellbaren Abstand auszulösen, z.B. drei Schnappschüsse in einem Abstand von fünf Sekunden:

set <name> snap 3 5

Sind alle drei Schnappschüsse erzeugt, werden sie gemeinsam in einer Mail an den oder die Empfänger gesendet.

drei Schnappschüsse als Email-Anhang empfangen

Ist keine Zeitdifferenz (die letzte Ziffer) definiert, wird der Standard von zwei Sekunden als Zeitverzögerung zwischen den Schnappschüssen verwendet.


Soll der Text im Attributs "snapEmailTxt" temporär geändert werden, weil man z.B. auf verschiedene Auslösungsursachen reagieren möchte und abhängig davon der Text geändert werden soll, kann der snap-Befehl optional ergänzt werden:

set <name> snap 3 5 snapEmailTxt:"subject => Bewegungsalarm $CAM, body => Eine Bewegung wurde am $CAM durch Melder 1 registriert."

Dieser Zusatz aktiviert ebenfalls den Emailversand einmalig, falls das Attribut snapEmailTxt nicht gesetzt ist um den Versand permanent einzuschalten.

Der Text wird durch snapEmailTxt: angeführt und ist in " einzuschließen. Innerhalb des optionalen Textes darf kein Doppelpunkt (":") verwendet werden !



Im Reading "sendEmailState" wird der Status des Email-Versands dargestellt, bzw. Fehlermitteilungen bei fehlenden Perl-Modulen, Connect-Problemen zum Postausgangsser usw.:

sendEmailState Email successfully sent encoded by TLSv1_2

Weitere Attribute können optional verwendet werden.

 smtpPort      - (optional) Port des Postausgangsservers (default: 25)
 smtpCc        - (optional) Carbon-Copy Empfängeradresse(n) (<name>@<domain>, <name>@<domain> ...)
 smtpNoUseSSL  - (optional) auf 1 setzen wenn kein SSL beim Email-Versand verwendet werden soll (default: 0)
 smtpSSLPort   - (optional) SSL-Port des Postausgangsservers (default: 465) 
 smtpDebug     - (optional) kann zur Fehlerermittlung beim SMTP-Versand verwendet werden. 

Mit verbose Level 4 erfolgt eine Protokollierung des Email-Versands.

2018.12.30 20:58:55.557 4: CamHE1 - ####################################################
2018.12.30 20:58:55.558 4: CamHE1 - ###         start send snapshot by email            
2018.12.30 20:58:55.558 4: CamHE1 - ####################################################
2018.12.30 20:58:55.559 4: CamHE1 - sendEmail version of "Net::SMTP" is "3.08_01"
2018.12.30 20:58:55.559 4: CamHE1 - sendEmail version of "MIME::Lite" is "3.030"
2018.12.30 20:58:55.559 4: CamHE1 - param lsnaptime is now "30.12.2018 / 20:58:53" 
2018.12.30 20:58:55.560 4: CamHE1 - param fname is now "Hauseingang-20181230-2058533887.jpg" 
2018.12.30 20:58:55.560 4: CamHE1 - param smtpTo is now "<name>@<domain>" 
2018.12.30 20:58:55.560 4: CamHE1 - param smtpdebug is now "0" 
2018.12.30 20:58:55.561 4: CamHE1 - param smtpnousessl is now "0" 
2018.12.30 20:58:55.561 4: CamHE1 - param smtphost is now "<Host>" 
2018.12.30 20:58:55.561 4: CamHE1 - param image is now "" 
2018.12.30 20:58:55.562 4: CamHE1 - param smtpCc is now "" 
2018.12.30 20:58:55.562 4: CamHE1 - param part1txt is now "Eine Bewegung wurde an der Hauseingang registriert." 
2018.12.30 20:58:55.562 4: CamHE1 - param smtpFrom is now "<name>@<domain>" 
2018.12.30 20:58:55.563 4: CamHE1 - param sdat is set
2018.12.30 20:58:55.563 4: CamHE1 - param part2type is now "image/jpeg" 
2018.12.30 20:58:55.563 4: CamHE1 - param smtpport is now "25" 
2018.12.30 20:58:55.564 4: CamHE1 - param opmode is now "getsnapinfo" 
2018.12.30 20:58:55.564 4: CamHE1 - param subject is now "Bewegungsalarm Hauseingang" 
2018.12.30 20:58:55.564 4: CamHE1 - param part1type is now "text/plain; charset=UTF-8" 
2018.12.30 20:58:55.576 4: CamHE1 - SMTPCredentials read from RAM: Heiko ********
2018.12.30 20:58:55.600 4: CamHE1 - image data were saved to memory handle for smtp prepare
2018.12.30 20:58:55.629 3: CamHE1 - SMTP-Host Host connection switched to SSL version: TLSv1_2
2018.12.30 20:58:56.499 3: CamHE1 - Email successfully sent encoded by TLSv1_2 To: <name>@<domain>

Die Informationen können mit "smtpDebug = 1" noch bedeutend! erweitert werden.

Die nachfolgende Auflistung zeigt getestete Einstellungen für oft verwendete Provider:

T-Online:

smtpHost      securesmtp.t-online.de

GMX

smtpHost      mail.gmx.net
smtpSSLPort   465

1&1

smtpHost      smtp.1und1.de
smtpPort      25


Hinweis:
Die gegenwärtige API enthält einen Bug, der bei Namensähnlichkeit im Wortstamm der Kameras in der SVS Unschärfen beim Schnappschußabruf verursacht. Das trifft zu, wenn zum Beispiel Kameranamen wie Nord_Ost und Ost gleichzeitig in der SVS definiert sind. Solche Ähnlichleiten vorsorglich bitte vermeiden.



Schnappschüsse mehrerer Kameras gesammelt in einer Email versenden


Schnappschüsse mehrere Kameras gesammelt als Email-Anhang versendet

Ziel ist es wie im nebenstehenden Screenshot dargestellt, einen oder mehrere Schnappschüsse in mehr als einer Kamera auszulösen und diese gesammelt in einer Email zu versenden. Dazu wird der Befehl "snapCams" in einem SVS-Device verwendet.

Wie im oberen Abschnitt beschrieben, müssen zunächst im SVS-Device die SMTP-Einstellungen vorgenommen werden.

Das sind grundsätzlich zunächst die Zugangsdaten für den Email-Server mit dem Befehl:


set <SVS-name> smtpcredentials <user> <password>


Der Email-Versand wird durch das Setzen des Attributs "snapEmailTxt" eingeschaltet.

Es müssen weitere, für den Email-Versand unbedingt notwendige Attribute, gesetzt werden.





Dies sind:

smtpHost  - Hostname oder die IP-Adresse des Postausgangsservers (z.B. securesmtp.t-online.de)
smtpFrom  - Absenderadresse (<name>@<domain>)
smtpTo    - ein oder mehrere  Empfängeradresse(n) (<name>@<domain>, <name>@<domain> ...)

Um den EmailVersand zu aktivieren, ist in dem SVS-Device und in den Kamera-Devices deren Schnappschüsse versendet werden sollen, das Attribut "snapEmailTxt" zu setzen, z.B. wie folgt:

attr snapEmailTxt subject => zentraler Bewegungsalarm, body => Schnappschüsse aller Cams wurden ausgelöst.

Nur der gesetzte Text im SVS-Device wird in der Email verwendet. Das definierte Attribut in den einzelnen Kamera-DEvices dient lediglich zur Aktivierung des Email-Versands der Schnappschüsse dieser Kamera.

Der oder die Schnappschüsse werden nun im SVS-Device gestartet mit:

set <SVS-name> snapCams 2 1 

Mit diesem Befehl werden in jeder in FHEM definierten Kamera zwei Schnappschüsse im Abstand von einer Sekunde angetriggert. Zusammengefasst und versendet werden aber nur die Schnappschüsse der Kameras, welche das Attribut "snapEmailTxt" gesetzt haben.

Sollen Schnappschüsse nur bei bestimmten Kameras ausgelöst werden, kann der Befehl optional umd den "CAM:"-Tag erweitert werden. In diesem Tag sind diese Kameras anzugeben, z.B.:

set <SVS-name> snapCams 3 3 CAM:"CamHE1, CamCarport"



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

sudo apt-get install sendemail libio-socket-ssl-perl

Die Mail wird mit einem notify oder DOIF 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/HTTPSRV) 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.



Aufnahmen nach der Erstellung mit dem integrierten Email-Client versenden

Das SScam-Modul enthält ab der Version 8.2.0 einen integrierten Email-Client, mit dem die durch das Kamera-Device erstellten Aufnahmen versendet werden können. Bei diesem Verfahren müssen keine Verzeichnisse der Synology mit den Aufnahmen beim FHEM-Server gemountet werden.

Zur Verwendung dieser Funktion muss das Perl-Modul MIME::Lite installiert sein. Auf Debian-System kann es mit

sudo apt-get install libmime-lite-perl

installiert werden.

Grundsätzlich sind zunächst die Zugangsdaten für den Email-Server zu hinterlegen. Dies geschieht mit dem Befehl:

set <name> smtpcredentials <user> <password>

Die Credentials werden verscrambelt in einem File auf Betriebssystemebene abgelegt. Der Email-Versand von Aufnahmen wird durch das Setzen des Attributs "recEmailTxt" permanent eingeschaltet.

Zunächst müssen weitere, für den Email-Versand unbedingt notwendige Attribute, gesetzt werden. Dies sind:

smtpHost  - Hostname oder die IP-Adresse des Postausgangsservers (z.B. securesmtp.t-online.de)
smtpFrom  - Absenderadresse (<name>@<domain>)
smtpTo    - ein oder mehrere  Empfängeradresse(n) (<name>@<domain>, <name>@<domain> ...)

Sind diese Angaben korrekt abgespeichert, wird die Email-Option durch das Setzen des Attributes:

attr recEmailTxt subject => <Betreff-Text>, body => <Mitteilung-Text> (z.B. subject => Neue Aufnahme $CAM, body => Die aktuelle Aufnahme von $CAM ist angehängt.)

permanent aktiviert werden.

Als Platzhalter können "$CAM", "$DATE" und "$TIME" verwendet werden. Die Variable "$CAM" wird durch den Alias des Kamera-Devices ersetzt falls vorhanden, ansonsten wird der originale Name der Kamera in der SVS dafür verwendet. Ansonsten ist die angegbene Form der Kombination aus "subject" und "body" einzuhalten. "$DATE" und "$TIME" werden durch den aktuellen Zeitstempel zum Zeitpunkt der Email-Erstellung ersetzt. Innerhalb des Attributes "recEmailTxt" darf kein Doppelpunkt (":") verwendet werden !

Der Verbindungsaufbau zum Postausgangsserver erfolgt initial unverschüsselt und wechselt zu einer verschlüsslten Verbindung wenn SSL zur Verfügung steht. In diesem Fall erfolgt auch die Übermittlung von User/Password verschlüsselt. Ist das Attribut "smtpSSLPort" explizit definiert, erfolgt auch der initiale Verbindungsaufbau sofort verschlüsselt. Es wird per Default der Port "465" verwendet.

Soll in besonderen Fällen auf die Verwendung der SSL-Verschlüsselung verzichtet werden, kann es durch Setzen des Attributes "smtpNoUseSSL = 1" vorgenommen werden.

Aufnahme als Email-Anhang versendet

So eingestellt, ist der Versand von Emails mit der erstellen Aufnahme als Anhang aktiviert und wird bei jeder Ausführung von

set <name> on

nach Abschluß der Aufnahme integriert ausgeführt. Der Versand erfolgt non-Blocking im Hintergrund und FHEM wird bei Sendeproblemen nicht beeinträchtigt.

Hinweis:
Aufnahmen können, insbesondere bei HD-Auflösung, recht schnell eine nicht unerhebliche Größe annehmen. Das verwendete Email-System und auch das zur Verfügung stehende Netzwerk muß in der Lage sein diese Datenmengen zu verarbeiten. Oftmals ist die Größe eines Dateianhangs bei Emails begrenzt.


Soll der Text im Attributs "recEmailTxt" temporär geändert werden, weil man z.B. auf verschiedene Auslösungsursachen reagieren möchte und abhängig davon der Text geändert werden soll, kann der on-Befehl optional ergänzt werden:

set <name> on recEmailTxt:"subject => Bewegungsalarm $CAM, body => Eine Bewegung wurde am $CAM durch Melder 1 registriert."

Dieser Zusatz aktiviert ebenfalls den Emailversand einmalig, falls das Attribut recEmailTxt nicht gesetzt ist um den Versand permanent einzuschalten.

Der Text wird durch recEmailTxt: angeführt und ist in " einzuschließen. Innerhalb des optionalen Textes darf kein Doppelpunkt (":") verwendet werden !


Im Reading "sendEmailState" wird der Status des Email-Versands dargestellt, bzw. Fehlermitteilungen bei fehlenden Perl-Modulen, Connect-Problemen zum Postausgangsser usw.:

sendEmailState Email successfully sent encoded by TLSv1_2

Weitere Attribute können optional verwendet werden.

 smtpPort      - (optional) Port des Postausgangsservers (default: 25)
 smtpCc        - (optional) Carbon-Copy Empfängeradresse(n) (<name>@<domain>, <name>@<domain> ...)
 smtpNoUseSSL  - (optional) auf 1 setzen wenn kein SSL beim Email-Versand verwendet werden soll (default: 0)
 smtpSSLPort   - (optional) SSL-Port des Postausgangsservers (default: 465) 
 smtpDebug     - (optional) kann zur Fehlerermittlung beim SMTP-Versand verwendet werden.



Aufnahmen lokal speichern

Aufnahmen einer Kamera werden zentral in der Surveillance Station (SVS) typischwerweise im Verzeichnis /volume1/surveillance gespeichert.

Manchmal besteht der Wunsch, diese Aufnahmen lokal auf dem FHEM-Server zur weiteren Verarbeitung verfügbar zu haben. Ab SSCam-Version 8.3.0 gibt es die Möglichkeit dieses Aufnahmen auf einen lokalen Pfad zu übertragen. Mit dem Get-Befehl:

get <name> saveRecording [<Pfad>] 
z.B.
get <name> saveRecording /opt/fhem/log

wird die aktuell im Reading "CamLastRec" angegebene Aufnahme lokal als MP4-File gespeichert. D.h. es muss bereits eine Aufnahme durch die Kamera ausgeführt worden sein. Optional kann der Pfad zur Speicherung des Files im Befehl angegeben werden (default: Attribut "modpath" im global Device). Das File erhält lokal den gleichen Namen wie im Reading "CamLastRec" angegeben.

Um die lokale Speicherung zu automatisieren, kann ein einfaches notify verwendet werden.

Wurde eine Aufnahme durch das SSCam-Modul mit

set <name> on

gestartet, wird nachdem die Aufnahme wieder gestoppt und die Aufnahme abgeschlossen ist, das Reading "CamLastRec" mit dem erstellten Aufnahmefile aktualisert. Um diese Aufnahme lokal in dem zuvor erstellten Verzeichnis "/opt/fhem/cam" automatisch zu speichern kann z.B. dieses notify verwendet werden:

defmod N.Keller.Save.Rec notify SSCam.Keller:CamLastRec:.*.mp4 get $NAME saveRecording /opt/fhem/cam
attr N.Keller.Save.Rec room Cams
attr N.Keller.Save.Rec verbose 2

Dabei ist "SSCam.Keller" der Name des auslösenden SSCam-Devices. Das Verzeichnis "/opt/fhem/cam" muß natürlich durch FHEM beschreibbar sein.

Hinweis: Das Attribut "event-on-change-reading" sollte bei dieser Verwendung das Reading "CamLastRec" enthalten.



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

Hinweis: Inzwischen gibt es den Befehl "createStreamDev" um komfortabel Streamingdevices zu erstellen. Siehe Abschnitt Streaming Devices.


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.



Hinweise zu Fehlern

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)


"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


Fehler beim Schnappschußabruf bei Ähnlichkeiten von Kameranamen in der Surveillance Station

Die gegenwärtige API enthält einen Bug, der bei Namensähnlichkeit im Wortstamm der Kameras in der SVS Unschärfen beim Schnappschußabruf verursacht. Das trifft zu, wenn zum Beispiel Kameranamen wie Nord_Ost und Ost gleichzeitig in der SVS definiert sind. Solche Ähnlichkeiten der verwendeten Kameranamen sollte deswegen vermieden werden.

Das betrifft nur die Kameranamen innerhalb der SVS und ist nicht mit den Devicenamen in FHEM zu verwechseln !