SSCAM - Steuerung von Kameras in Synology Surveillance Station
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 und/oder Telegram
- Stop einer Aufnahme per Befehl bzw. automatisch nach Ablauf einer einstellbaren Dauer
- Auslösen von Schnappschnüssen und optional gemeinsamer Email/TelegramBot-Versand mittels integriertem Email-Client
- Auslösen von Schnappschnüssen / Aufnahmen und optional gemeinsamer Email-Versand mit dem integrierten Email-Client oder Synology Chat / Telegram
- 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)
- lokales Abspeichern der letzten Kamera-Aufnahme
- Auswahl unterschiedlicher Cache-Typen zur Bilddatenspeicherung (Attribut cacheType)
- ausführen von Zoom-Aktionen (bei PTZ-Kameras die Zoom unterstützen)
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 !
Weiterhin dürfen die Kameranamen in Synology Surveillance Station keine Leerzeichen enthalten. So wäre zum Beispiel statt "Cam Nord" der Name "Cam_Nord" zu verwenden.
SVS-Device definieren
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.
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 werden. In den neu definierten Kameras wird ein grundlegender Satz von sinnvollen Attributen ebenfalls im Device inkludiert. Die bei der Definition des SVS-Devices angegebenen Credentials werden automatisch von den angelegten Kamera-Devices übernommen.
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
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.
permanente Anzeige des letzten Schnappschusses
Der Streaming Devicetyp "lastsnap" steht ab der SSCam-Version 8.9.0 zur Verfügung.
Die Aufgabe dieser Definition ist es, den letzten Schnappschuss in einem separaten Streaming Device anzuzeigen. Dieses Device kann zum Beispiel dazu dienen, immer den letzten Schnappschuß auf einer Dashboard-, Floorplan- oder FTUI-Seite anzuzeigen. Möglich ist auch, ein Popup-Fenster nach der Erstellung eines Schnappschusses für eine gewisse Zeit einzublenden.
Die Anlage eines solchen Streaming Devices ist sehr einfach. Dazu gibt es in dem entsprechenden Kamera-Device (hier "CamHE1") den Befehl:
set CamHE1 createStreamDev lastsnap
Das Streaming-Device, in diesem Beispiel "SSCamSTRM.CamHE1.lastsnap" wird angelegt. Im Device selbst steht ein Button zum manuellen Auslösen eines Schnappschusses zur Verfügung.
Damit die volle Funktionalität genutzt werden kann, sollten im Eltern-Device (im Beispiel "CamHE1") die folgenden Attribute gesetzt sein bzw. gesetzt werden:
attr CamHE1 snapGallerySize Full attr CamHE1 pollcaminfoall <Sekunden> (z.B. 180)
Das Attribut snapGallerySize bewirkt den Abruf des Schnappschusses in voller Auflösung. Stünde es auf "Icon" bzw. wäre nicht vorhanden, würde der Schnappschuss nur mit sehr geringer Auflösung an FHEM ausgeliefert. Mit dem Attribut pollcaminfoall werden regelmäßig die angefertigten Schnappschüsse der Kamera abgerufen auch wenn sie nicht durch FHEM getriggert wurden. Durch FHEM getriggerte Schnappschüsse werden immer in dem Streaming Device aktualisiert.
Weitere Attribute im Streaming Device dienen zur Steuerung der Darstellung. Im Beispiel werden noch gesetzt:
attr CamHE1 htmlattr width=500 height=325 attr CamHE1 popupStreamTo 5 attr CamHE1 popupWindowSize width="220" height="160"
Das Attrbut htmlattr legt die Darstellungsgröße des Schnappschusses im Streaming Device fest. Mit popupWindowSize wird die Größe des Popup-Windows bzw. mit popupStreamTo die Zeit bis zum automatischen Schließen des Popup-Windows eingestellt. Wird dieses Attribut auf "OK" gestellt, erscheint das Popup in Form eines durch "Ok" zu bestätigenden Fensters.
Um das Popup eines Schnappschusses einzublenden, kann der folgende Befehl zum Beispiel durch ein entsprechendes Notify ausgelöst werden:
set SSCamSTRM.CamHE1.lastsnap popupStream
Dieses Popup würde nun für 5 Sekunden den neuen Schnappschuss einblenden. Mit dem weiteren Attribut popupStreamFW würde die FHEMWEB-Instanz festgelegt, in deren aktiven Sessions dieses Popup erscheinen soll. Somit könnte die Ausgabe zum Beispiel auf bestimmte FHEMWEB-Devices begrenzt werden.
Ein solches Notify wäre zum Beispiel durch die folgende RAW-Definition gegeben:
defmod N.SSCamSTRM.CamHE1.opensnap notify CamHE1:.*LastSnapFilename.* { fhem ("defmod oshe1 at +00:00:02 set SSCamSTRM.CamHE1.lastsnap popupStream") } attr N.SSCamSTRM.CamHE1.opensnap disable 0 attr N.SSCamSTRM.CamHE1.opensnap room Cams attr N.SSCamSTRM.CamHE1.opensnap verbose 2
Nachfolgend noch die RAW-Definition des erstellten Streaming Devices:
defmod SSCamSTRM.CamHE1.lastsnap SSCamSTRM {SSCam_StreamDev('CamHE1','SSCamSTRM.CamHE1.lastsnap','lastsnap')} attr SSCamSTRM.CamHE1.lastsnap alias Hauseingang letzter Schnappschuß attr SSCamSTRM.CamHE1.lastsnap comment The device shows the last snapshot of camera device "CamHE1". \ If you always want to see the newest snapshot, please set attribute "pollcaminfoall" in camera device "CamHE1". attr SSCamSTRM.CamHE1.lastsnap htmlattr width=500 height=325 attr SSCamSTRM.CamHE1.lastsnap popupStreamTo 10 attr SSCamSTRM.CamHE1.lastsnap popupWindowSize width="220" height="160" attr SSCamSTRM.CamHE1.lastsnap room Livestream->4_Snaps
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".
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"
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.
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.
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.
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.
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.
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.
- 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)
- 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:
- Containername: RSTP_zu_HLS
- Container mit hoher Priorität ausführen
- Volume: Ordner hinzufügen -> z.B. "Temp/Stream" (vorgesehener Pfad auf der Diskstation für Streamfiles) - /tmp/stream (im Docker -> so lassen)
- Port-Einstellungen: lokaler Port 32000 (Port auf der Diskstation), Container-Port 80
- 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.
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"
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
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"
RTSP Stream in MJPEG umwandeln und anzeigen
Das nachfolgende Beispiel zeigt, wie der durch die SVS oder eine Kamera gelieferte RTSP-String in MJPEG umgewandelt werden kann um ihn danach im Browser in einem Streaming-Device anzuzeigen. Der Stream wird permanent wiedergegeben. Zur Umwandlung wird in dem Beispiel das Produkt Kerberos.io verwendet. Diese Lösung kann zwar deutlich mehr als RTSP umwandeln, aber für unseren Zweck verwenden wir lediglich diese Eigenschaft.
Kerberos.io ist als Docker-Abbild verfügbar und kann dadurch sehr einfach auf einer Synology Diskstation eingesetzt werden. Im folgenden Beispiel wird angenommen dass:
- das Kamera-Device "CamHE1" lauffähig eingerichtet ist
- Docker auf der Synology ausgeführt werden kann
Im ersten Schritt wird das Abbild kerberos/kerberos als latest vom Repository heruntergeladen. Von diesem Abbild wird ein neuer Container für jeden einzubindenden RTSP-Stream (d.h. im Prinzip für jede Kamara) gestartet. Hier im Beispiel wird lediglich ein Container erstellt.
Der Container wird mit "Starten" erstellt. Es sind wenige Eingaben zu machen, zunächst ein sprechender Name, z.B. "RTSP-MJPEG-CamHE1". Danach wird auf die "Erweiterte Einstellungen" verzweigt. Hier ist lediglich der Reiter "Port-Einstellungen" von Interesse. Der Container-Port 80 ist die Adresse des Admin-Interfaces, der Container-Port 8889 der Machinery-Port über den später der MJPEG-Stream abgerufen werden kann.
Die Einstellung von "Lokaler Port" steht für beide Container-Ports auf "Automatisch". Man kann sie natürlich gleich manuell setzen, aber ich empfehle die Einstellung anfangs so zu belassen und nach der automatischen Zuweisung fest einzustellen. Mit "Übernehmen" gelangt man zum Ausgangsbild und startet den Container mit "Weiter" und nochmaligem "Übernehmen".
War der Start erfolgreich, kann nun der gemappte Admin- und Machinery-Port ermittelt werden. Dazu ist links "Container" auszuwählen, der Container "RTSP-MJPEG-CamHE1" zu selektieren und dessen Details aufzurufen.
Im Beispiel wurden folgende Ports zugewiesen:
Admin-Port: 32784 (Container-Port 80) Machinery-Port: 32783 (Container-Port 8889)
Die Ports sollten nun im Docker-Container fest eingestellt werden damit sie sich bei einem Neustart nicht ändern, d.h. nicht mehr die Automatic-Zuweisung nutzen.
Über den Admin-Port 32784 wird nun das Admin-Interface auf der Diskstation aufgerufen:
http://192.168.2.10:32784
Die IP-Adresse ist natürlich entsprechend abzuändern.
Zuerst wird die Sprache eingestellt und ein Profil mit Username und Passwort eingestellt.
Es wird abschließend noch nach dem Cloud-Speicher gefragt, was wir natürlich ignorieren.
Mit "Abschließen" gelangen wir zum Login-Screen und können uns mit dem neu angelegten Profil einloggen.Nach dem Login wird sofort der Reiter "Einstellungen" aufgerufen. Es wird ein Name vergeben, im Beispiel "Hauseingang" und danach unter "Kamera" der Button "IP-Kamera" ausgewählt.
Nun muss die Adresse des umzuwandelnden RTSP-Streams eigegeben werden. Dieser Stream wird aus dem Reading StmKeyUnicst des Kamera-Devices "CamHE1" entnommen. Ist das Reading nicht vorhanden, ist das Attribut "showStmInfoFull = 1" zu setzen und die Streamingdaten mit "get CamHE1 stmUrlPath" neu abzurufen. (Browser-Refresh nicht vergessen)
Im Beispiel ist es die Adresse:
"rtsp://syno:f1cf5eb6fee2929f198af6393b86b22d@192.168.2.10:554/Sms=1.unicast"
Es ist noch Breite und Höhe anzugeben. Diese Werte müssen von der Kamera unterstützt werden. Ist man sich unsicher, können einfach die Angaben aus dem Reading CamLiveResolution übernommen werden. Dieses Reading gibt die eingestellte Größe in der SVS wieder.
Die weiteren Parameter können unverändert bleiben. Mit "Bestätigen und Auswählen" gelangt man zum Ausgangsbild zurück.
Da Kerberos keine Motion-Aufnahmen machen soll, wird das Selektionsbild über den Button "Bewegung" aufgerufen. Mit einem Doppelklick auf die roten Punkte werden sie alle von der Selektionsfläche entfernt und im Step 2 alle Schieberegler auf "0" gestellt. Mit "Übernehmen" wird abgeschlossen.
Nachdem mit dem linken Button "Aktualisieren" die Konfiguration gespeichert wurde, wird rechts oben der Schieberegler neben Admin auf "Aus" gestellt um das Speichern von Aufnahmen durch Kerberos zu unterbinden. Nach einer kurzen Zeit kann das empfangene Kamerabild mit dem rechten "Aktualisieren"-Button begutachtet werden.
Auf dem "Dashboard" wird der Stream ebenfalls angezeigt.
Abschließend muss nur noch das Streaming Device angelegt werden.
Das ist ganz einfach. Im Kamera-Device "CamHE1" ist dazu der Befehl:
set CamHE1 createStreamDev generic
auszuführen. Dadurch wird das Device "SSCamSTRM.CamHE1.generic" definiert. Der darzustellende Inhalt wird durch das Attribut genericStrmHtmlTag im neuen Streamingdevice oder alternativ zentral im Elterndevice "CamHE1" festgelegt. In diesem Attribut kann der User beliebige HTML-Tags zur Video-Spezifikation bestimmen.
Um den erstellten MJPEG-Stream wiederzugeben, ist der gemappte Machinery-Port (siehe oben) anzugeben.
Damit kann das Attribut folgendermaßen definiert werden:
attr CamHE1 genericStrmHtmlTag <img $HTMLATTR src="http://192.168.2.10:32783" >
Die IP-Adresse 192.168.2.10 ist die Adresse der Diskstation und ist natürlich auch anzupassen.
Mit dem Platzhalter $HTMLATTR kann das Attribut "htmlattr" des Devices "CamHE1" übernommen werden und so die Größe des Streambildes eingestellt werden.
Um ein Popup-Fenster zu erzeugen, welches mit einem "Klick" oder "Tipp" auf das Bild öffnet, kann die Definition des Attributes genericStrmHtmlTag erweitert werden:
attr CamHE1 genericStrmHtmlTag <img $HTMLATTR src="http://192.168.2.10:32783" onClick="FW_okDialog('<img src=http://192.168.2.10:32783 $PWS>')" >
Der Platzhalter $PWS übernimmt den eingestellten Wert des Attributes "popupWindowSize" im definierten Streaming-Device (SSCamSTRM.CamHE1.generic). Dadurch wird dir Größe des Popup-Fensters bestimmt.
Im Streaming-Device sind Drucktasten zum manuellen Starten einer Aufnahme bzw. zum Auslösen eines Schnappschusses verfügbar. Es stehen weitere Attribute im Streaming-Device zur Verfügung die in der SSCamSTRM-Commandref beschrieben sind.
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
- Hinweis
- Ab Chrome (Version 59 ?) wurde die Übertragung der Basic Authentication innerhalb des HTTP-Requests abgeschaltet. Bei Verwendung der in dem folgenden Link angegebenen Extension "MultiPass für Authentifizierung mit HTTP Basic" können die Credentials an die Kamera geliefert werden (https://stackoverflow.com/questions/44667676/sending-credentials-in-url-is-not-supported-in-chrome-59)
In diesem Fall ist nur noch der Aufruf:
http://<IP-Adresse>:<Port>/Streaming/channels/ID/httppreview
zu verwenden.
Die Seite https://www.ispyconnect.com/sources.aspx liefert die Stream-URL´s zu sehr vielen IP-Kameras und dort kann die MJPEG-Stream URL für den benutzten Kamaeratyp abgelesen werden.
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" >
(Hinweis: Seit SSCamSTRM-Version 2.4.0 kann dieses Attribut ebenfalls im Streaming-Device gesetzt werden. Dadurch können mehrere Generic-Streamingdevices dem PARENT-Kameradevice zugeordnet werden)
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.
direkten Kamera MJPEG Zugriff mit MJPEG-Proxy einrichten und mit mehreren Cients verwenden
Oft kann nur mit einem Client gleichzeitig auf den von der Kamera direkt gelieferten MJPEG Stream zugegriffen werden. Mit dem Einsatz eines MJPEG-Proxy können Mehrfachzugriffe auf einen MJPEG Stream realisiert werden.
In dem nachfolgenden Beispiel soll ein MJPEG Stream direkt von der Kamera anstatt von der Synology Surveillance Station mit dem Streaming Device wiedergegeben werden.
Ist die eingesetze Synology DS Docker-fähig, bietet sich der Einsatz des fertigen Docker Image roflmao/docker-mjpeg-proxy an. Nach dem Download des Image (wir benutzen immer "latest") sind beim Start einige wenige Einstellungen nötig. Die wichtigste Information die benötigt wird, ist die Adresse des MJPEG Stream der Kamera.
Die Seite https://www.ispyconnect.com/sources.aspx liefert die Stream-URL´s zu sehr vielen IP-Kameras und dort kann die MJPEG-Stream URL für den benutzten Kamaeratyp abgelesen werden.
Die Kamera für dieses Beispiel ist eine HIKVISION DS-2CD2042WD-I. Zunächst muß die URL für den MJPEG-Stream 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 d.h. im konkreten Beispiel -> http://<User>:<Password>@192.168.2.32:80/ISAPI/Streaming/channels/101/httppreview
Beim Start des Containers "roflmao/docker-mjpeg-proxy" wird eingegeben:
- Name des Containers
- z.B. MJPEG-Proxy_Terrasse. Der automatische Neustart wird aktiviert.
- Port-Einstellungen
- der interne Port des Containers ist default 8081. Den lokalen Port stellen wir von automatisch auf einen passenden festen Wert um damit sich dieser Port bei einem Neustart nicht ändert. Hier im Beispiel ist es der Port 32786.
- Umgebung
- In den Environment Einstellungen wird im Schlüssel MJPEG_URL die ermittelte MJPEG-URL der Kamera eingestellt. HIer im Beispiel ist es die Adresse:
http://<User>:<Password>@192.168.2.32:80/ISAPI/Streaming/channels/101/httppreview
Der User und dessen Paßwort sind die Anmeldedaten, die man für die direkte Anmeldung an der Kameraverwaltungsoberfläche benötigt.
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.32 CamPort 80
Nach Eingabe dieser Daten kann der Container gestartet werden. Der Zugriff mit einem Browser bzw. dem SSCam Streaming Device erfolgt über die Adresse:
http://<IP der Synology DS>:32786/index.jpg
Der Port 32786 ist natürlich entsprechend der Eingabe im Docker Container anzupassen.
Um ein Streaming-Device vom Typ "generic" zu definieren, wird der Set-Befehl im Kamera-Device (in diesem Beispiel "CamTER") verwendet:
set CamTER createStreamDev generic
Dadurch wird ein Device "SSCamSTRM.CamTER.generic" angelegt. Die Definition des darzustellenden Videos wird mit dem Attribut "genericStrmHtmlTag" im Streaming Device festgelegt. In unserem Beispiel:
<img $HTMLATTR src="http://192.168.2.10:32786/index.jpg" onClick="FW_okDialog('<img src=http://192.168.2.10:32786/index.jpg $PWS >')" >
Hinweis: Durch die onClick-Erweiterung wird beim Mausklick auf das Streaming-Bild ein Popup geöffnet.
Die verwendbaren Variablen $HTMLATTR, $PWS sind Platzhalter und übernehmen ein gesetztes Attribut "htmlattr" bzw. "popupWindowSize". 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.
Das angelegte Streaming Device kann nun auf mehreren FTUI-Seiten, Browser-Seiten oder Dashboards eingebunden werden um einen gleichzeitigen Zugriff auf den Kamera MJPEG über den Proxy zu erreichen.
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 Streaming Master Device - Typ "master"
Dieser Streaming Device Typ kann selbst keine Streams wiedergeben. Dieser Typ ist dazu gedacht, per Set-Kommando andere definierte Streaming Devices zu übernehmen, d.h. deren Einstellungen adoptieren und die Streams dieser Devices wiederzugeben.
Es ist somit auf einfache Weise (set-Kommando) möglich, die Wiedergabe an zentraler Stelle im FHEMWEB, Dashboard oder FTUI (über SSCamSTRM Widget) umzuschalten und den entsprechenden Content wiederzugeben.
Die Definition eine Masters erfolgt in einem SVS Device (nicht Cam !!) mit dem Kommando:
set <SVS-Device Name> createStreamDev master
Nach der Definition kann mit einem Set-Befehl ein anderes vorab definiertes Streamingsdevice übernommen (adoptiert) werden. Die verfügbaren Devices werden über eine Drop-Down Liste angeboten. Wurden in den Devices das Attribut alias vergeben, werden diese Aliasnamen in der Liste zur Auswahl angeboten.
In nachfolgenden Beispiel wurde eine Master Device "SSCamSTRM.SDS1.master" definiert und adoptiert das Streaming Device "SSCamSTRM.SSCam.Hauseingang.mjpeg1" mit dem Set-Befehl:
set SSCamSTRM.SDS1.master adopt SSCamSTRM.SSCam.Hauseingang.mjpeg1
Der Content des adoptierten Devices wird sofort wiedergegeben. Mit dem Befehl
set SSCamSTRM.SDS1.master adopt --reset--
wird die Übernahme eines adoptierten Streaming Devices rückgängig gemacht. Für die Bedienung in grafischen Oberflächen (wie FHEMWEB oder Dashboard) steht eine Drop-Down Liste über ein Widget zur Verfügung (siehe Screenshot). Die Funktionalität ist identisch zu dem Set-Befehl adopt.
Mit dem Attribut adoptSubset kann eine Teilmenge aller definierten Streaming Devices ausgewählt werden. Es wird ein gleichnamiges Reading im Streaming Device erstellt. Damit kann man z.B. bei unterschiedlichen Master Devices die Auswahl auf bestimmte Streams (Außenbereich, Innenbereich, etc.) begrenzen.
zeitgesteuertes Content-Switching
Möchte man nur eine gewisse Zeit lang den Content eines bestimmten Streaming Devices übernehmen und wiedergeben, kann mit dem Befehl
set <Name Master> adoptForTimer <Streaming Device>
die Umschaltung erfolgen. Nach dem Ablauf der Standard Schaltzeit (10 Sekunden) wird wieder auf das ursprünglich adoptierte Streaming Device zurückgeschaltet.
Die Standard Schaltzeit kann verändert werden mit:
set <Name Master> adoptTime <Sekunden>
Das Reading adoptTimer enthält die eingestellte Schaltzeit.
Wird vor den Ende der engestellten Schaltzeit ein weiterer adoptForTimer Befehl ausgeführt, startet die Schaltzeit erneut. Die bis zu diesem Zeitpunkt abgelaufene Zeit wird ignoriert.
Streaming Devices in TabletUI (FTUI) einbinden
Die im oberen Abschnitt beschriebenen Streaming Devices können über ein bereitgestelltes Widget in FTUI eingebunden werden. Neben dem Stream werden ebenfalls die Drucktasten zur Aufnahme/Wiedergabesteuerung oder das Bedienpanel bei PTZ-Kameras im FTUI bereitgestellt. Die Installation und Verwendung ist im Artikel FTUI Widget für SSCam Streaming Devices beschrieben.
Die im FHEMWEB nutzbare Popup-Funktionalität kann nicht ohne weiteres im TabletUI verwendet werden. Um Popups im FTUI erzeugen zu können, bietet sich die Nutzung des FTUI Popup Widget an.
Nachfolgendes Beispiel erzeugt eine Kachel mit der Live-Ansicht der Carport Kamera über das Streaming Device SSCamSTRM.CamCarport.generic:
<!-- Box Cam Carport -->
<li data-row="2" data-col="3" data-sizex="7" data-sizey="2" class="container round">
<header class="container round">Livebild Carport</header>
<!-- Popup Bereich zum klicken-->
<div data-type="popup" data-return-time="20" data-height="750px" data-width="1100px" data-device="dummy_Haustuerklingel" data-get-on="on">
<div data-type="sscamstrm" data-device="SSCamSTRM.CamCarport.generic" class="center"></div>
<!-- Popup Inhalt -->
<div class="dialog">
<header>Kamera Carport</header>
<div data-type="sscamstrm" data-device="SSCamSTRM.CamCarportBig.generic" class="center"></div>
</div>
</div>
</li>
Wird ein Touch auf das Live-Bild ausgeführt oder über das Device "dummy_Haustuerklingel" eine Popup-Bedingung ausgelöst, öffnet sich ein Popup mit dem Streaming-Device "SSCamSTRM.CamCarportBig.generic". Das Device "SSCamSTRM.CamCarportBig.generic" ist eine Kopie des Device "SSCamSTRM.CamCarport.generic" wobei über die html-Attribute des Devices ein größeres Stream Bild zur Verfügung gestellt wird.
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 < >
zu kodieren.
Definition | Erläuterungen |
---|---|
|
ReadingsGoup anlegen. |
attr Cams_All_States valueIcon {'Availability.enabled' => 'remotecontrol/black_btn_GREEN',
|
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" ' }
|
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',
|
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"',
|
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. |
Schnappschüsse mit TelegramBot versenden
Ein oder mehrere Schnappschüsse mit dem integrierten TelegramBot-Verfahren versenden
Ab SScam-Version 8.8.0 ist der Versand von Schnappschüssen über Telegram direkt integriert. Neben dem Schnappschuss kann auch ein Begleittext mitgesendet sowie mehrere Snaps ausgelöst/übertragen werden. Mounts zu dem Verzeichnis mit den Bilddaten der Synology Surveillance Station sind nicht nötig. Der Versand funktioniert out-of-the-box innerhalb des SSCam Devices/Moduls. Es muß natürlich ein funktionierendes TelegramBot-Device vorhanden sein.
Für das nachfolgende Beispiel des integrierten Versandes von 2 Schnappschüssen mit einem TelegramBot Device wird angenommen dass:
- ein TelegramBot-Device mit Namen "teleBot" funktionstüchtig vorhanden ist (siehe TelegramBot)
- das SSCam Kamera-Device zur Erzeugung der Schnappschüsse "CamHE1" heißt
Die permanente Aktivierung des integrierten Versandes mit Telegram ist sehr einfach. Es ist lediglich im Kamera-Device das Attribut "snapTelegramTxt" gemäß der angegeben Vorschrift zu definieren:
attr CamHE1 snapTelegramTxt tbot => teleBot, peers => @peer1 @peer2, subject => Bewegungsalarm bei $CAM. Es wurde $CTIME der Schnappschuss $FILE erstellt
Werden jetzt zwei Schnappschüsse im Abstand von 2 Sekunden mit:
set CamHE1 snap 2 2
getriggert, werden diese zwei Schnappschüsse an die angegebenen Empfänger @peer1 und @peer2 versendet.
Es können mehrere Empfänger (peers) durch Leerzeichen getrennt angegeben werden. Die Angabe des TelegramBot-Devices ist zwingend erforderlich. Die Angabe von "peers" oder "subject" kann leer bleiben wobei der Schlüssel angegeben werden muß.
attr CamHE1 snapTelegramTxt tbot => teleBot, peers => , subject =>
Ist "peers" leer, wird automatisch der default Peer des TelegramBot Devices verwendet. Innerhalb des "subject"-Textes können Platzhalter verwendet werden die zur Laufzeit mit entsprechenden Werten ersetzt werden. Das sind:
$CAM - Device-Alias bzw. der Name der Kamera in der SVS falls der Device-Alias nicht vorhanden ist $DATE - aktuelles Datum $TIME - aktuelle Zeit $FILE - Filename des Schnappschusses $CTIME - Erstellungszeit des Schnappschusses
Wenn man den Versand nur einmalig aktivieren möchte, reicht die Angabe beim snap-Kommando, z.B. um 3 Snaps auszulösen und zu versenden:
snap 3 snapTelegramTxt:"tbot => teleBot, peers => , subject => Bewegungsalarm bei $CAM. Es wurde $CTIME der Schnappschuss $FILE erstellt"
Der Zusatz muss durch snapTelegramTxt: angeführt und in doppelte Hochkomma eingeschlossen werden.
alternatives Versandverfahren mit gemounteten Synology Surveillance Verzeichnis
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:
- SSCam -> https://wiki.fhem.de/wiki/SSCAM_-_Steuerung_von_Kameras_in_Synology_Surveillance_Station
- TelegramBot -> https://wiki.fhem.de/wiki/TelegramBot
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.
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.
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.
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.
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
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.
# 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.
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.
Versand von Aufnahmen und Schnappschüssen mit Synology Chat (SSChatBot)
Zur Versendung von Aufnahmen und Schnappschüssen mit Synology Chat wird das Modul SSChatBot verwendet. Synology Chat arbeitet ähnlich Telegram, aber im Gegensatz dazu bleiben die Daten im geschützten Umfeld der private Cloud und verwenden keinen öffentlichen Dienst.
Der Synology Chat Dienst benötigt zur Versendung von Dateien Zugriff auf diese Daten über eine File URL.
Zu diesem Zweck wird auf Synology ein virtueller Webhost erstellt, der diese URL bereitstellt.
Vorbereitung - Erstellung eines virtuellen Hosts auf Synology
In dem Beispiel wird ein virtueller Host definiert der auf Port HTTP 8081 hört. Das Dokument-Root soll in dem Beispiel der Ordner "/volume1/web/fhemsvs" sein. Über die Adresse des virtuellen Host sind dann die Aufnahmen bzw. Schnappschüsse auf der Synology erreichbar.
- 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 des virtuellen Hosts zum SVS-Stammverzeichnis surveillance setzen:
ln -s /volume1/surveillance/ /volume1/web/fhemsvs
- den virtuellen Host (DSM 6) in Webstation -> virtueller Host anlegen.
Der virtuelle Host ist durch die Angabe des Unterordners (web/fhemsvs), des Protokolls und des Ports (8081) zu definieren. Die Angaben sind natürlichen den realen Werten anzupassen. Es wird die portbasierte Regel ausgewählt bzw. angewendet.
- die Recordings sind nun prinzipiell unter der Adresse virtueller Host/SVS-Stammverzeichnis erreichbar:
http://test.myds.me:8081/surveillance/<Kameraname>/<Zeit>/<Dateiname>
- Schnappschüsse sind erreichbar mit der Adresse:
http://test.myds.me:8081/surveillance/@Snapshot/<Dateiname>
In FHEM ist der Zugangspfad zu den Aufnahmen zusammengesetzt aus den Readings "VideoFolder" und "CamLastRec". Dementsprechend erreicht man einen Schnappschuss mit der Zusammensetzung von Reading "VideoFolder", @Snapshot und dem Reading LastSnapFilename.
setzen Attribut "videofolderMap" im SSCam-Device
Im SSCam Kameradevice muss der angelegte virtuelle Host bekannt gemacht werden.
Über das Attribut "videofolderMap" wird der Standardwert "/volume1/surveillance/<Kamera>" (geliefert durch die SVS) ersetzt durch
http://test.myds.me:8081/surveillance
.
Aktivierung des integrierten Schnappschuß- und Aufnahmen-Versand mit Synology Chat
Ab SSCam-Version 9.0.1 kann der Versand der Schnappschüsse ganz einfach durch Setzen des Attributs snapChatTxt aktiviert werden.
Das Attribut snapChatTxt muß in der angegebenen Form definiert werden:
chatbot => <SSChatBot-Device>, peers => [<peer1 peer2 ...>], subject => [<Betreff-Text>]
Im Schlüssel chatbot ist das SSChatBot-Device anzugeben, welches für den Versand der Daten verwendet werden soll. Das SSChatBot-Device muss natürlich vorhanden und funktionstüchtig sein. Der Schlüssel peers enthält gültige Namen von Synology Chat Nutzern an die die Nachricht gesendet werden soll. Die Angabe von peers ist optional, jedoch muß der Schlüssel (leer) angegeben werden. Wurde peer leer gelassen, wird der defaultPeer des SSChatBot-Devices verwendet.
Es können folgende Platzhalter im subject verwendet werden:
$CAM - Device-Alias bzw. den Namen der Kamera in der SVS ersetzt falls der Device-Alias nicht vorhanden ist $DATE - aktuelles Datum $TIME - aktuelle Zeit $FILE - Filename des Schnappschusses $CTIME - Erstellungszeit des Schnappschusses
Beispiele:
- attr <device> snapChatTxt chatbot => SynChatBot, peers => , subject => Bewegungsalarm ($FILE)
- attr <device> snapChatTxt chatbot => SynChatBot, peers => Aragorn Frodo Sam, subject => Ein Schnappschuss wurde ausgelöst
- attr <device> snapChatTxt chatbot => SynChatBot, peers => , subject => Achtung !
- attr <device> snapChatTxt chatbot => SynChatBot, peers => Frodo, subject => Bewegungsalarm bei $CAM. Es wurde $CTIME der Schnappschuss $FILE erstellt
Ähnlich kann der Versand von Aufnahmen durch Setzen des Attributs recChatTxt aktiviert werden.
Das Attribut recChatTxt muß in der angegebenen Form definiert werden:
recChatTxt chatbot => <SSChatBot-Device>, peers => [<peer1 peer2 ...>], subject => [<Betreff-Text>]
Es können die folgenden Platzhalter im subject verwendet werden.
$CAM - Device-Alias bzw. den Namen der Kamera in der SVS ersetzt falls der Device-Alias nicht vorhanden ist $DATE - aktuelles Datum $TIME - aktuelle Zeit $FILE - Filename $CTIME - Erstellungszeit der Aufnahme
Beispiele:
- attr <device> recChatTxt chatbot => SynChatBot, peers => , subject => Bewegungsalarm ($FILE)
- attr <device> recChatTxt chatbot => SynChatBot, peers => Frodo Sam Gollum, subject => Achtung
- attr <device> recChatTxt chatbot => SynChatBot, peers => , subject => Achtung Aufnahme
- attr <device> recChatTxt chatbot => SynChatBot, peers => , subject => Bewegungsalarm bei $CAM. Es wurde $CTIME die Aufnahme $FILE * erstellt. Jetzt ist es $TIME.
Alternativer Versand - Triggern des Versands mit notify
Vor dem Einrichten von entsprechenden notify ist das SSChatBot Device wie hier beschrieben anzulegen. Im Beispiel wird das SSChatBot-Device SynChatBot verwendet.
Die Angabe des zu versenden Files erfolgt im SSChatBot Device mit der Angabe im Tag fileUrl.
Dadurch ergibt sich das notify zum Versand von Schnappschüssen wie folgt:
define N.CamTER.Snap.SSChat notify CamTER:LastSnapFilename:.* set SynChatBot sendItem text="Ein Schnappschuss von Terrassentür wurde ausgelöst" fileUrl="[CamTER:VideoFolder]/@Snapshot/[CamTER:LastSnapFilename]"
Das notify zum Versand einer Aufnahme ist wie folgt ausfgebaut:
define N.CamTER.Rec.SSChat notify CamTER:CamLastRec:.* set SynChatBot sendItem text="Bewegung an der Terrassentür festgestellt" fileUrl="[CamTER:VideoFolder]/Terrasse/[CamTER:CamLastRec]"
Dabei ist:
- SynChatBot - das zum Versand verwendete SSChatBot-Device
- CamTER - das SSCam Kamera-Device
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 und Schnappschüssen
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 beschrieben wie man den internen Webserver des Synology DS statt dessen verwenden kann. Die nachfolgende Beschreibung bezieht sich auf DSM 5 mit Änderungehinweisen zu DSM 6.
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
- einen virtuellen Host in Systemsteuerung -> Webdienste -> virtueller Host anlegen (DSM 6: Webstation -> virtueller Host). 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.
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> http://test.myds.me:8081/surveillance/<Camname>/<Dateiname> (ab DSM 6)
- Schnappschüsse sind erreichbar mit der Adresse:
http://test.myds.me:8081/surveillance/@Snapshot/<Dateiname>
In FHEM ist der Zugangspfad zu den Aufnahmen zusammengesetzt aus den Readings "VideoFolder" und "CamLastRec". Dementsprechend erreicht man einen Schnappschuss mit der Zusammensetzung von Reading "VideoFolder", @Snapshot und dem Reading LastSnapFilename.
Beispiel für die Kamera "Carport"
Über das Attribut "videofolderMap" wird "/volume1/surveillance/Carport" (Standard geliefert durch die SVS) ersetzt durch
"http://test.myds.me:8081/surveillance/Carport/"
.
Der zusammengesetzte Link zur letzten Aufnahme wird dadurch 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.
- 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.
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.
- den Aktionsregeleditor in der SS aufrufen
- eine neue Aktionsregel "Licht einschalten" vom Typ "ausgelöst" anlegen -> "Weiter"
- 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"
- Im nächsten Screen ist die Aktion hinzuzufügen.
Das Aktionsgerät ist in diesem Fall "Externes Gerät" bzw. "Webhook" auf neueren Surveillance Station Releases. Es soll eine URL angesprochen werden.
http://<IP-FHEM>:<Port-FHEM>/fhem?cmd=set%20eg.wz.stehlampe%20on&XHR=1
Ist in dem verwendeten Ziel FHEMWEB Device ein CSRF-Token gesetzt, muß die URL noch entsprechend ergänzt werden:
http://<IP-FHEM>:<Port-FHEM>/fhem?cmd=set%20CamHE1%20snap&fwcsrf=<fester Token>&XHR=1
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" - 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/Synology Chat-Nachricht mit dem Link zur letzten Aufnahme oder das Schnappschußbild senden lassen.
Diese Möglichkeit ist zum Beispiel in diesem Abschnitt beschrieben.
SSChatBot als Empfangsdevice für SVS Webhooks verwenden
Mit Hilfe eines SSChatBot-Devices können ebenfalls konfigurierbare Befehle aus dem Synology Aktionsregelframework empfangen und ausgeführt werden. Siehe dazu die Beispiele für SSChatBot
Hinweise zu Fehlern
Workaround bei DSM 2-Stufen Verifizierung
- Benutzer in der SVS einrichten, zum Manager machen
- Benutzer wird automatisch auch in FHEM eingerichtet, dort zum Admin machen
- 2-Stufen Verifizierung ausschalten
- Modul / Kamera zum Laufen bringen
- Session im Modul auf SVS stellen
- Benutzer in der DSM aus der Admin-Gruppe rausnehmen
- 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 !