diff --git a/fhem/FHEM/49_SSCam.pm b/fhem/FHEM/49_SSCam.pm index 0f02ad592..e274c9118 100644 --- a/fhem/FHEM/49_SSCam.pm +++ b/fhem/FHEM/49_SSCam.pm @@ -156,6 +156,7 @@ BEGIN { # Versions History intern my %vNotesIntern = ( + "9.4.3" => "13.07.2020 streamDev refactored, comref revised ", "9.4.2" => "11.07.2020 more changes according PBP level 3, headline PTZ Control, revised comref ", "9.4.1" => "05.07.2020 new Zoom icons ", "9.4.0" => "01.07.2020 switch to packages, much more changes according PBP ", @@ -425,52 +426,69 @@ my %errlist = ( # Tooltipps Textbausteine (http://www.walterzorn.de/tooltip/tooltip.htm#download), §NAME§ wird durch Kameranamen ersetzt my %ttips_en = ( - ttrefresh => "The playback of streaming content of camera of "§NAME§" will be restartet.", - ttrecstart => "Start an endless recording of camera "§NAME§".
You have to stop the recording manually.", - ttrecstop => "Stopp the recording of camera "§NAME§".", - ttsnap => "Take a snapshot of camera "§NAME§".", - ttcmdstop => "Stopp playback of camera "§NAME§"", - tthlsreact => "Reactivate HTTP Livestreaming Interface of camera "§NAME§".
The camera is enforced to restart HLS transmission.", - ttmjpegrun => "Playback the MJPEG Livestream of camera "§NAME§".", - tthlsrun => "Playback the native HTTP Livestream of camera "§NAME§". The browser must have native support for HLS streaming.", - ttlrrun => "Playback of last recording of camera "§NAME§" in an iFrame.
Both MJPEG and H.264 recordings are rendered.", - tth264run => "Playback of last H.264 recording of camera "§NAME§".
It only starts if the recording is type H.264", - ttlmjpegrun => "Playback of last MJPEG recording of camera "§NAME§".
It only starts if the recording is type MJPEG", - ttlsnaprun => "Playback of last snapshot of camera "§NAME§".", - confcam => "The configuration menu of camera "§NAME§" will be opened in a new Browser page", - confsvs => "The configuration page of Synology Surveillance Station will be opened in a new Browser page", - helpsvs => "The online help page of Synology Surveillance Station will be opened in a new Browser page", + ttrefresh => "The playback of streaming content of camera of "§NAME§" will be restartet.", + ttrecstart => "Start an endless recording of camera "§NAME§".
You have to stop the recording manually.", + ttrecstop => "Stopp the recording of camera "§NAME§".", + ttsnap => "Take a snapshot of camera "§NAME§".", + ttcmdstop => "Stopp playback of camera "§NAME§"", + tthlsreact => "Reactivate HTTP Livestreaming Interface of camera "§NAME§".
The camera is enforced to restart HLS transmission.", + ttmjpegrun => "Playback the MJPEG Livestream of camera "§NAME§".", + tthlsrun => "Playback the native HTTP Livestream of camera "§NAME§". The browser must have native support for HLS streaming.", + ttlrrun => "Playback of last recording of camera "§NAME§" in an iFrame.
Both MJPEG and H.264 recordings are rendered.", + tth264run => "Playback of last H.264 recording of camera "§NAME§".
It only starts if the recording is type H.264", + ttlmjpegrun => "Playback of last MJPEG recording of camera "§NAME§".
It only starts if the recording is type MJPEG", + ttlsnaprun => "Playback of last snapshot of camera "§NAME§".", + confcam => "The configuration menu of camera "§NAME§" will be opened in a new Browser page", + confsvs => "The configuration page of Synology Surveillance Station will be opened in a new Browser page", + helpsvs => "The online help page of Synology Surveillance Station will be opened in a new Browser page", ); my %ttips_de = ( - ttrefresh => "Die Wiedergabe des Streams von Kamera "§NAME§" wird neu gestartet.", - ttrecstart => "Startet eine Endlosaufnahme von Kamera "§NAME§".
Die Aufnahme muß manuell gestoppt werden.", - ttrecstop => "Stoppt die laufende Aufnahme von Kamera "§NAME§".", - ttsnap => "Ein Schnappschuß von Kamera "§NAME§" wird aufgenommen.", - ttcmdstop => "Stopp Wiedergabe von Kamera "§NAME§"", - tthlsreact => "Reaktiviert das HTTP Livestreaming Interface von Kamera "§NAME§".
Die Kamera wird aufgefordert die HLS Übertragung zu restarten.", - ttmjpegrun => "Wiedergabe des MJPEG Livestreams von Kamera "§NAME§"", - tthlsrun => "Wiedergabe des HTTP Livestreams von Kamera "§NAME§".
Es wird die HLS Funktion der Synology Surveillance Station verwendet. (der Browser muss HLS nativ unterstützen)", - ttlrrun => "Wiedergabe der letzten Aufnahme von Kamera "§NAME§" in einem iFrame.
Es werden sowohl MJPEG als auch H.264 Aufnahmen wiedergegeben.", - tth264run => "Wiedergabe der letzten H.264 Aufnahme von Kamera "§NAME§".
Die Wiedergabe startet nur wenn die Aufnahme vom Typ H.264 ist.", - ttlmjpegrun => "Wiedergabe der letzten MJPEG Aufnahme von Kamera "§NAME§".
Die Wiedergabe startet nur wenn die Aufnahme vom Typ MJPEG ist.", - ttlsnaprun => "Wiedergabe des letzten Schnappschusses von Kamera "§NAME§".", - confcam => "Das Konfigurationsmenü von Kamera "§NAME§" wird in einer neuen Browserseite geöffnet", - confsvs => "Die Konfigurationsseite der Synology Surveillance Station wird in einer neuen Browserseite geöffnet", - helpsvs => "Die Onlinehilfe der Synology Surveillance Station wird in einer neuen Browserseite geöffnet", + ttrefresh => "Die Wiedergabe des Streams von Kamera "§NAME§" wird neu gestartet.", + ttrecstart => "Startet eine Endlosaufnahme von Kamera "§NAME§".
Die Aufnahme muß manuell gestoppt werden.", + ttrecstop => "Stoppt die laufende Aufnahme von Kamera "§NAME§".", + ttsnap => "Ein Schnappschuß von Kamera "§NAME§" wird aufgenommen.", + ttcmdstop => "Stopp Wiedergabe von Kamera "§NAME§"", + tthlsreact => "Reaktiviert das HTTP Livestreaming Interface von Kamera "§NAME§".
Die Kamera wird aufgefordert die HLS Übertragung zu restarten.", + ttmjpegrun => "Wiedergabe des MJPEG Livestreams von Kamera "§NAME§"", + tthlsrun => "Wiedergabe des HTTP Livestreams von Kamera "§NAME§".
Es wird die HLS Funktion der Synology Surveillance Station verwendet. (der Browser muss HLS nativ unterstützen)", + ttlrrun => "Wiedergabe der letzten Aufnahme von Kamera "§NAME§" in einem iFrame.
Es werden sowohl MJPEG als auch H.264 Aufnahmen wiedergegeben.", + tth264run => "Wiedergabe der letzten H.264 Aufnahme von Kamera "§NAME§".
Die Wiedergabe startet nur wenn die Aufnahme vom Typ H.264 ist.", + ttlmjpegrun => "Wiedergabe der letzten MJPEG Aufnahme von Kamera "§NAME§".
Die Wiedergabe startet nur wenn die Aufnahme vom Typ MJPEG ist.", + ttlsnaprun => "Wiedergabe des letzten Schnappschusses von Kamera "§NAME§".", + confcam => "Das Konfigurationsmenü von Kamera "§NAME§" wird in einer neuen Browserseite geöffnet", + confsvs => "Die Konfigurationsseite der Synology Surveillance Station wird in einer neuen Browserseite geöffnet", + helpsvs => "Die Onlinehilfe der Synology Surveillance Station wird in einer neuen Browserseite geöffnet", ); my %imc = ( # disbled String modellabhängig (SVS / CAM) - 0 => { 0 => "initialized", 1 => "inactive" }, - 1 => { 0 => "off", 1 => "inactive" }, + 0 => { 0 => "initialized", 1 => "inactive" }, + 1 => { 0 => "off", 1 => "inactive" }, ); my %zd = ( # Hash der Zoomsteuerung - ".++" => {dir => "in", sttime => 6, moveType => "Start", panimg => "Zoom_in_wide_w.png", }, - "+" => {dir => "in", sttime => 0.5, moveType => "Start", panimg => "Zoom_in_w.png", }, - "stop" => {dir => undef, sttime => undef, moveType => "Stop" , panimg => "black_btn_CAMBLANK.png", }, - "-" => {dir => "out", sttime => 0.5, moveType => "Start", panimg => "Zoom_out_w.png", }, - "--." => {dir => "out", sttime => 6, moveType => "Start", panimg => "Zoom_out_wide_w.png", } + ".++" => {dir => "in", sttime => 6, moveType => "Start", panimg => "Zoom_in_wide_w.png", }, + "+" => {dir => "in", sttime => 0.5, moveType => "Start", panimg => "Zoom_in_w.png", }, + "stop" => {dir => undef, sttime => undef, moveType => "Stop" , panimg => "black_btn_CAMBLANK.png", }, + "-" => {dir => "out", sttime => 0.5, moveType => "Start", panimg => "Zoom_out_w.png", }, + "--." => {dir => "out", sttime => 6, moveType => "Start", panimg => "Zoom_out_wide_w.png", } +); + +my %sdfn = ( # Funktionshash Streamingdevices + "mjpeg" => {fn => "_streamDevMJPEG" }, + "lastsnap" => {fn => "_streamDevLASTSNAP" }, + "generic" => {fn => "_streamDevGENERIC" }, + "hls" => {fn => "_streamDevHLS" }, + "switched" => {fn => "_streamDevSWITCHED" }, +); + +my %sdswfn = ( # Funktionshash Streamingdevices Typ "switched" + "image" => {fn => "__switchedIMAGE" }, + "iframe" => {fn => "__switchedIFRAME" }, + "video" => {fn => "__switchedVIDEO" }, + "base64img" => {fn => "__switchedBASE64IMG" }, + "embed" => {fn => "__switchedEMBED" }, + "hls" => {fn => "__switchedHLS" }, ); # Standardvariablen und Forward-Deklaration @@ -485,8 +503,6 @@ my $valZoom = ".++,+,stop,-,--."; # Inhalt des Setters " #use vars qw($FW_detail); # currently selected device for detail view #use vars qw($FW_wname); # Web instance # sub FW_pH(@); # add href -# use vars qw(%vHintsExt_en); -# use vars qw(%vHintsExt_de); #sub SSChatBot_formString; #sub SSChatBot_addQueue($$$$$$$$); @@ -7412,7 +7428,7 @@ return ($hash,$success,$myjson); } ###################################################################################################### -# Refresh eines Raumes aus $hash->{HELPER}{STRMROOM} +# Refresh eines Raumes # $hash, $pload (1=Page reload), SSCam-state-Event(1=Event), SSCamSTRM-Event (1=Event) ###################################################################################################### sub roomRefresh { @@ -7984,50 +8000,32 @@ return; # # $camname = Name der Kamaera (Parent-Device) # $strmdev = Name des Streaming-Devices -# $fmt = Streaming Format +# $fmt = Streaming Format (Vergleich auf "eq" !) # ###################################################################################### -sub streamDev { +sub streamDev { ## no critic 'complexity' my ($camname,$strmdev,$fmt,$ftui) = @_; - my $hash = $defs{$camname}; - my $wltype = $hash->{HELPER}{WLTYPE}; - my $serveraddr = $hash->{SERVERADDR}; - my $serverport = $hash->{SERVERPORT}; - my $apivideostm = $hash->{HELPER}{APIVIDEOSTM}; - my $apivideostmpath = $hash->{HELPER}{APIVIDEOSTMPATH}; - my $apivideostmmaxver = $hash->{HELPER}{APIVIDEOSTMMAXVER}; - my $apiaudiostm = $hash->{HELPER}{APIAUDIOSTM}; - my $apiaudiostmpath = $hash->{HELPER}{APIAUDIOSTMPATH}; - my $apiaudiostmmaxver = $hash->{HELPER}{APIAUDIOSTMMAXVER}; - my $apivideostms = $hash->{HELPER}{APIVIDEOSTMS}; - my $apivideostmspath = $hash->{HELPER}{APIVIDEOSTMSPATH}; - my $apivideostmsmaxver = $hash->{HELPER}{APIVIDEOSTMSMAXVER}; - my $camid = $hash->{CAMID}; - my $sid = $hash->{HELPER}{SID}; - my $proto = $hash->{PROTOCOL}; - $ftui = ($ftui && $ftui eq "ftui")?1:0; - my $hdrAlign = "center"; - my ($show,$cause,$ret,$link,$audiolink,$devWlink,$wlhash,$wlalias); + my $hash = $defs{$camname}; + my $streamHash = $defs{$strmdev}; # Hash des SSCamSTRM-Devices + my $uuid = $streamHash->{FUUID}; # eindeutige UUID des Streamingdevices + $ftui = ($ftui && $ftui eq "ftui") ? 1 : 0; + my $hdrAlign = "center"; - # Kontext des SSCamSTRM-Devices speichern für roomRefresh - $hash->{HELPER}{STRMDEV} = $strmdev; # Name des aufrufenden SSCamSTRM-Devices - $hash->{HELPER}{STRMROOM} = $FW_room?$FW_room:""; # Raum aus dem das SSCamSTRM-Device die Funktion aufrief - $hash->{HELPER}{STRMDETAIL} = $FW_detail?$FW_detail:""; # Name des SSCamSTRM-Devices (wenn Detailansicht) - my $streamHash = $defs{$strmdev}; # Hash des SSCamSTRM-Devices - my $uuid = $streamHash->{FUUID}; # eindeutige UUID des Streamingdevices delete $streamHash->{HELPER}{STREAM}; - delete $streamHash->{HELPER}{STREAMACTIVE}; # Statusbit ob ein Stream aktiviert ist + delete $streamHash->{HELPER}{STREAMACTIVE}; # Statusbit ob ein Stream aktiviert ist + + my ($show,$cause,$ret); # Definition Tasten my $imgblank = ""; # nicht sichtbare Leertaste my $cmdstop = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname stopView STRM:$uuid')"; # Stream deaktivieren - my $imgstop = ""; + my $imgstop = ""; my $cmdhlsreact = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname hlsreactivate')"; # HLS Stream reaktivieren my $imghlsreact = ""; my $cmdmjpegrun = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname runView live_fw STRM:$uuid')"; # MJPEG Stream aktivieren my $imgmjpegrun = ""; my $cmdhlsrun = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname runView live_fw_hls STRM:$uuid')"; # HLS Stream aktivieren - my $imghlsrun = ""; + my $imghlsrun = ""; my $cmdlrirun = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname runView lastrec_fw STRM:$uuid')"; # Last Record IFrame my $imglrirun = ""; my $cmdlh264run = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname runView lastrec_fw_MPEG4/H.264 STRM:$uuid')"; # Last Record H.264 @@ -8061,16 +8059,46 @@ sub streamDev { $cmdrefresh = "ftui.setFhemStatus('set $camname refresh STRM:$uuid')"; } - my $ha = AttrVal($camname, "htmlattr", 'width="500" height="325"'); # HTML Attribute der Cam - $ha = AttrVal($strmdev, "htmlattr", $ha); # htmlattr mit htmlattr Streaming-Device übersteuern - if($ftui) { - $ha = AttrVal($strmdev, "htmlattrFTUI", $ha); # wenn aus FTUI aufgerufen divers setzen + # Javascript Bibliothek für Tooltips (http://www.walterzorn.de/tooltip/tooltip.htm#download) und Texte + my $calias = $hash->{CAMNAME}; # Alias der Kamera + my $ttjs = "/fhem/pgm2/sscam_tooltip.js"; + my ($ttrefresh, $ttrecstart, $ttrecstop, $ttsnap, $ttcmdstop, $tthlsreact, $ttmjpegrun, $tthlsrun, $ttlrrun, $tth264run, $ttlmjpegrun, $ttlsnaprun); + + # Hinweis Popups + if(AttrVal("global","language","EN") =~ /EN/x) { + $ttrefresh = $ttips_en{"ttrefresh"}; $ttrefresh =~ s/§NAME§/$calias/gx; + $ttrecstart = $ttips_en{"ttrecstart"}; $ttrecstart =~ s/§NAME§/$calias/gx; + $ttrecstop = $ttips_en{"ttrecstop"}; $ttrecstop =~ s/§NAME§/$calias/gx; + $ttsnap = $ttips_en{"ttsnap"}; $ttsnap =~ s/§NAME§/$calias/gx; + $ttcmdstop = $ttips_en{"ttcmdstop"}; $ttcmdstop =~ s/§NAME§/$calias/gx; + $tthlsreact = $ttips_en{"tthlsreact"}; $tthlsreact =~ s/§NAME§/$calias/gx; + $ttmjpegrun = $ttips_en{"ttmjpegrun"}; $ttmjpegrun =~ s/§NAME§/$calias/gx; + $tthlsrun = $ttips_en{"tthlsrun"}; $tthlsrun =~ s/§NAME§/$calias/gx; + $ttlrrun = $ttips_en{"ttlrrun"}; $ttlrrun =~ s/§NAME§/$calias/gx; + $tth264run = $ttips_en{"tth264run"}; $tth264run =~ s/§NAME§/$calias/gx; + $ttlmjpegrun = $ttips_en{"ttlmjpegrun"}; $ttlmjpegrun =~ s/§NAME§/$calias/gx; + $ttlsnaprun = $ttips_en{"ttlsnaprun"}; $ttlsnaprun =~ s/§NAME§/$calias/gx; + } else { + $ttrefresh = $ttips_de{"ttrefresh"}; $ttrefresh =~ s/§NAME§/$calias/gx; + $ttrecstart = $ttips_de{"ttrecstart"}; $ttrecstart =~ s/§NAME§/$calias/gx; + $ttrecstop = $ttips_de{"ttrecstop"}; $ttrecstop =~ s/§NAME§/$calias/gx; + $ttsnap = $ttips_de{"ttsnap"}; $ttsnap =~ s/§NAME§/$calias/gx; + $ttcmdstop = $ttips_de{"ttcmdstop"}; $ttcmdstop =~ s/§NAME§/$calias/gx; + $tthlsreact = $ttips_de{"tthlsreact"}; $tthlsreact =~ s/§NAME§/$calias/gx; + $ttmjpegrun = $ttips_de{"ttmjpegrun"}; $ttmjpegrun =~ s/§NAME§/$calias/gx; + $tthlsrun = $ttips_de{"tthlsrun"}; $tthlsrun =~ s/§NAME§/$calias/gx; + $ttlrrun = $ttips_de{"ttlrrun"}; $ttlrrun =~ s/§NAME§/$calias/gx; + $tth264run = $ttips_de{"tth264run"}; $tth264run =~ s/§NAME§/$calias/gx; + $ttlmjpegrun = $ttips_de{"ttlmjpegrun"}; $ttlmjpegrun =~ s/§NAME§/$calias/gx; + $ttlsnaprun = $ttips_de{"ttlsnaprun"}; $ttlsnaprun =~ s/§NAME§/$calias/gx; } - my $hb = AttrVal($strmdev, "hideButtons", 0); # Drucktasten im Footer ausblenden ? - my $hau = AttrVal($strmdev, "hideAudio", 0); # Audio Steuerblock im Footer ausblenden ? - - my $pws = AttrVal($strmdev, "popupWindowSize", ""); # Größe eines Popups + my $ha = AttrVal($camname, "htmlattr", 'width="500" height="325"'); # HTML Attribute der Cam + $ha = AttrVal($strmdev, "htmlattr", $ha); # htmlattr mit htmlattr Streaming-Device übersteuern + $ha = AttrVal($strmdev, "htmlattrFTUI", $ha) if($ftui); # wenn aus FTUI aufgerufen divers setzen + my $hb = AttrVal($strmdev, "hideButtons", 0); # Drucktasten im Footer ausblenden ? + my $hau = AttrVal($strmdev, "hideAudio", 0); # Audio Steuerblock im Footer ausblenden ? + my $pws = AttrVal($strmdev, "popupWindowSize", ""); # Größe eines Popups $pws =~ s/"//gx if($pws); $show = $defs{$streamHash->{PARENT}}->{HELPER}{ACTSTRM} if($streamHash->{MODEL} =~ /switched/x); @@ -8082,38 +8110,67 @@ sub streamDev { my $StmKey = ReadingsVal($camname,"StmKey",undef); - # Javascript Bibliothek für Tooltips (http://www.walterzorn.de/tooltip/tooltip.htm#download) und Texte - my $calias = $hash->{CAMNAME}; # Alias der Kamera - my $ttjs = "/fhem/pgm2/sscam_tooltip.js"; - my ($ttrefresh, $ttrecstart, $ttrecstop, $ttsnap, $ttcmdstop, $tthlsreact, $ttmjpegrun, $tthlsrun, $ttlrrun, $tth264run, $ttlmjpegrun, $ttlsnaprun); - - if(AttrVal("global","language","EN") =~ /EN/x) { - $ttrefresh = $ttips_en{"ttrefresh"}; $ttrefresh =~ s/§NAME§/$calias/gx; - $ttrecstart = $ttips_en{"ttrecstart"}; $ttrecstart =~ s/§NAME§/$calias/gx; - $ttrecstop = $ttips_en{"ttrecstop"}; $ttrecstop =~ s/§NAME§/$calias/gx; - $ttsnap = $ttips_en{"ttsnap"}; $ttsnap =~ s/§NAME§/$calias/gx; - $ttcmdstop = $ttips_en{"ttcmdstop"}; $ttcmdstop =~ s/§NAME§/$calias/gx; - $tthlsreact = $ttips_en{"tthlsreact"}; $tthlsreact =~ s/§NAME§/$calias/gx; - $ttmjpegrun = $ttips_en{"ttmjpegrun"}; $ttmjpegrun =~ s/§NAME§/$calias/gx; - $tthlsrun = $ttips_en{"tthlsrun"}; $tthlsrun =~ s/§NAME§/$calias/gx; - $ttlrrun = $ttips_en{"ttlrrun"}; $ttlrrun =~ s/§NAME§/$calias/gx; - $tth264run = $ttips_en{"tth264run"}; $tth264run =~ s/§NAME§/$calias/gx; - $ttlmjpegrun= $ttips_en{"ttlmjpegrun"}; $ttlmjpegrun =~ s/§NAME§/$calias/gx; - $ttlsnaprun = $ttips_en{"ttlsnaprun"}; $ttlsnaprun =~ s/§NAME§/$calias/gx; - } else { - $ttrefresh = $ttips_de{"ttrefresh"}; $ttrefresh =~ s/§NAME§/$calias/gx; - $ttrecstart = $ttips_de{"ttrecstart"}; $ttrecstart =~ s/§NAME§/$calias/gx; - $ttrecstop = $ttips_de{"ttrecstop"}; $ttrecstop =~ s/§NAME§/$calias/gx; - $ttsnap = $ttips_de{"ttsnap"}; $ttsnap =~ s/§NAME§/$calias/gx; - $ttcmdstop = $ttips_de{"ttcmdstop"}; $ttcmdstop =~ s/§NAME§/$calias/gx; - $tthlsreact = $ttips_de{"tthlsreact"}; $tthlsreact =~ s/§NAME§/$calias/gx; - $ttmjpegrun = $ttips_de{"ttmjpegrun"}; $ttmjpegrun =~ s/§NAME§/$calias/gx; - $tthlsrun = $ttips_de{"tthlsrun"}; $tthlsrun =~ s/§NAME§/$calias/gx; - $ttlrrun = $ttips_de{"ttlrrun"}; $ttlrrun =~ s/§NAME§/$calias/gx; - $tth264run = $ttips_de{"tth264run"}; $tth264run =~ s/§NAME§/$calias/gx; - $ttlmjpegrun= $ttips_de{"ttlmjpegrun"}; $ttlmjpegrun =~ s/§NAME§/$calias/gx; - $ttlsnaprun = $ttips_de{"ttlsnaprun"}; $ttlsnaprun =~ s/§NAME§/$calias/gx; - } + my %params = ( + camname => $camname, + strmdev => $strmdev, + ftui => $ftui, + uuid => $uuid, + ha => $ha, + hb => $hb, + hau => $hau, + pws => $pws, + serveraddr => $hash->{SERVERADDR}, + serverport => $hash->{SERVERPORT}, + apivideostm => $hash->{HELPER}{APIVIDEOSTM}, + apivideostmpath => $hash->{HELPER}{APIVIDEOSTMPATH}, + apivideostmmaxver => $hash->{HELPER}{APIVIDEOSTMMAXVER}, + apiaudiostm => $hash->{HELPER}{APIAUDIOSTM}, + apiaudiostmpath => $hash->{HELPER}{APIAUDIOSTMPATH}, + apiaudiostmmaxver => $hash->{HELPER}{APIAUDIOSTMMAXVER}, + apivideostms => $hash->{HELPER}{APIVIDEOSTMS}, + apivideostmspath => $hash->{HELPER}{APIVIDEOSTMSPATH}, + apivideostmsmaxver => $hash->{HELPER}{APIVIDEOSTMSMAXVER}, + camid => $hash->{CAMID}, + sid => $hash->{HELPER}{SID}, + proto => $hash->{PROTOCOL}, + cmdstop => $cmdstop, + cmdhlsreact => $cmdhlsreact, + cmdmjpegrun => $cmdmjpegrun, + cmdhlsrun => $cmdhlsrun, + cmdlrirun => $cmdlrirun, + cmdlh264run => $cmdlh264run, + cmdlmjpegrun => $cmdlmjpegrun, + cmdlsnaprun => $cmdlsnaprun, + cmdrecendless => $cmdrecendless, + cmdrecstop => $cmdrecstop, + cmddosnap => $cmddosnap, + cmdrefresh => $cmdrefresh, + imgblank => $imgblank, + imgstop => $imgstop, + imghlsreact => $imghlsreact, + imgmjpegrun => $imgmjpegrun, + imghlsrun => $imghlsrun, + imglrirun => $imglrirun, + imglh264run => $imglh264run, + imglmjpegrun => $imglmjpegrun, + imglsnaprun => $imglsnaprun, + imgrecendless => $imgrecendless, + imgrecstop => $imgrecstop, + imgdosnap => $imgdosnap, + imgrefresh => $imgrefresh, + ttrefresh => $ttrefresh, + ttrecstart => $ttrecstart, + ttrecstop => $ttrecstop, + ttsnap => $ttsnap, + ttcmdstop => $ttcmdstop, + tthlsreact => $tthlsreact, + ttmjpegrun => $ttmjpegrun, + tthlsrun => $tthlsrun, + ttlrrun => $ttlrrun, + tth264run => $tth264run, + ttlmjpegrun => $ttlmjpegrun, + ttlsnaprun => $ttlsnaprun, + ); $ret = ""; $ret .= ""; @@ -8139,362 +8196,768 @@ sub streamDev { return $ret; } - if ($fmt =~ /mjpeg/x) { - if(ReadingsVal($camname, "SVSversion", "8.2.3-5828") eq "8.2.3-5828" && ReadingsVal($camname, "CamVideoType", "") !~ /MJPEG/) { - $ret .= "
Because SVS version 8.2.3-5828 is running you cannot see the MJPEG-Stream. Please upgrade to a higher SVS version !

"; - } else { - if($apivideostmsmaxver) { - $link = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid"; - } elsif ($hash->{HELPER}{STMKEYMJPEGHTTP}) { - $link = $hash->{HELPER}{STMKEYMJPEGHTTP}; - } - if($apiaudiostmmaxver) { - $audiolink = "$proto://$serveraddr:$serverport/webapi/$apiaudiostmpath?api=$apiaudiostm&version=$apiaudiostmmaxver&method=Stream&cameraId=$camid&_sid=$sid"; - } - if(!$ftui) { - $ret .= "')\">
"; - } else { - $ret .= "
"; - } - $streamHash->{HELPER}{STREAM} = ""; # Stream für "get popupStream" speichern - $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist - } - if(!$hb) { - if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { - # Aufnahmebutton endlos Start - $ret .= "$imgrecendless "; - } else { - # Aufnahmebutton Stop - $ret .= "$imgrecstop "; - } - $ret .= "$imgdosnap "; - } - $ret .= ""; - if(AttrVal($camname,"ptzPanel_use",1)) { - my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); - if($ptz_ret) { - $ret .= "$ptz_ret"; - } - } - if($audiolink && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) { - $ret .= ''; - $ret .= ''; - $ret .= ""; - $ret .= ""; - $ret .= "" if(AttrVal($camname,"ptzPanel_use",0)); - } - - } elsif ($fmt =~ /lastsnap/x) { - # $link = $hash->{HELPER}{".LASTSNAP"}; - my $cache = cache($camname, "c_init"); # Cache initialisieren - Log3($camname, 1, "$camname - Fall back to internal Cache due to preceding failure.") if(!$cache); - if(!$cache || $cache eq "internal" ) { - $link = $data{SSCam}{$camname}{LASTSNAP}; - } else { - $link = cache($camname, "c_read", "{LASTSNAP}"); - } - - my $gattr = (AttrVal($camname,"snapGallerySize","Icon") eq "Full")?$ha:""; - if($link) { - if(!$ftui) { - $ret .= "')\">
"; - } else { - $ret .= "
"; - } - if(!$hb) { - $ret .= "$imgdosnap "; - } - $ret .= ""; - $streamHash->{HELPER}{STREAM} = ""; # Stream für "get popupStream" speichern - $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist - } else { - $cause = "no snapshot available to display"; - $cause = "kein Schnappschuss zur Anzeige vorhanden" if(AttrVal("global","language","EN") =~ /DE/ix); - $ret .= "
$cause

"; - } - - } elsif ($fmt =~ /generic/x) { - my $htag = AttrVal($strmdev,"genericStrmHtmlTag",AttrVal($camname,"genericStrmHtmlTag","")); - - if( $htag =~ m/^\s*(.*)\s*$/s ) { - $htag = $1; - $htag =~ s/\$NAME/$camname/xg; - $htag =~ s/\$HTMLATTR/$ha/g; - $htag =~ s/\$PWS/$pws/g; - } - - if(!$htag) { - $ret .= "
Set attribute \"genericStrmHtmlTag\" in device $camname or in device $strmdev

"; - $ret .= ''; - $ret .= ''; - $ret .= ''; - $ret .= ''; - return $ret; - } - $ret .= ""; - $ret .= "$htag"; - if($htag) { - # Popup-Tag um den Popup-Teil bereinigen - my $ptag = $htag; - $ptag =~ m/^(\s+)?(?<)(\s+)?(?.*)(\s+)?(?onClick=.*)(\s+)?(?>)(\s+)?$/s; - $ptag = $+{heart}?$+{b}.$+{heart}.$+{e}:$ptag; - $streamHash->{HELPER}{STREAM} = "$ptag"; # Stream für "set popupStream" speichern - $streamHash->{HELPER}{STREAM} =~ s/["']//gx; - $streamHash->{HELPER}{STREAM} =~ s/\s+/ /gx; - $streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist - } - $ret .= "
"; - Log3($strmdev, 4, "$strmdev - generic Stream params:\n$htag"); - if(!$hb) { - $ret .= "$imgrefresh "; - $ret .= $imgblank; - if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { - # Aufnahmebutton endlos Start - $ret .= "$imgrecendless "; - } else { - # Aufnahmebutton Stop - $ret .= "$imgrecstop "; - } - $ret .= "$imgdosnap "; - } - $ret .= ""; - if(AttrVal($camname,"ptzPanel_use",1)) { - my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); - if($ptz_ret) { - $ret .= "$ptz_ret"; - } - } - - } elsif ($fmt =~ /hls/x) { - # es ist ein .m3u8-File bzw. ein Link dorthin zu übergeben - my $cam = AttrVal($camname, "alias", $camname); - my $m3u8 = AttrVal($camname, "hlsStrmObject", ""); - - if( $m3u8 =~ m/^\s*(.*)\s*$/s ) { - $m3u8 = $1; - $m3u8 =~ s/\$NAME/$camname/gx; - } - my $d = $camname; - $d =~ s/\./_/x; # Namensableitung zur javascript Codeanpassung - - if(!$m3u8) { - $cause = "You have to specify attribute \"hlsStrmObject\" in Camera $cam !"; - $ret .= "
$cause

"; - $ret .= ''; - $ret .= ''; - $ret .= ''; - $ret .= ''; - return $ret; - } - - $ret .= "
"; - $ret .= bindhlsjs ($camname, $strmdev, $m3u8, $d); - - $streamHash->{HELPER}{STREAM} = ""; # Stream für "set popupStream" speichern - $streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist - if(!$hb) { - $ret .= "$imgrefresh "; - $ret .= $imgblank; - if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { - # Aufnahmebutton endlos Start - $ret .= "$imgrecendless "; - } else { - # Aufnahmebutton Stop - $ret .= "$imgrecstop "; - } - $ret .= "$imgdosnap "; - } - $ret .= ""; - if(AttrVal($camname,"ptzPanel_use",1)) { - my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); - if($ptz_ret) { - $ret .= "$ptz_ret"; - } - } - - } elsif ($fmt =~ /switched/x) { - my $wltype = $hash->{HELPER}{WLTYPE}; - $link = $hash->{HELPER}{LINK}; - - if($link && $wltype =~ /image|iframe|video|base64img|embed|hls/x) { - if($wltype =~ /image/x) { - if(ReadingsVal($camname, "SVSversion", "8.2.3-5828") eq "8.2.3-5828" && ReadingsVal($camname, "CamVideoType", "") !~ /MJPEG/) { - $ret .= "
Because SVS version 8.2.3-5828 is running you cannot see the MJPEG-Stream. Please upgrade to a higher SVS version !

"; - } else { - if(!$ftui) { - $ret .= "')\">
" if($link); - } else { - $ret .= "
" if($link); - } - $streamHash->{HELPER}{STREAM} = ""; # Stream für "set popupStream" speichern - $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist - } - $ret .= "$imgstop "; - $ret .= $imgblank; - if($hash->{HELPER}{RUNVIEW} =~ /live_fw/x) { - if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { - # Aufnahmebutton endlos Start - $ret .= "$imgrecendless "; - } else { - # Aufnahmebutton Stop - $ret .= "$imgrecstop "; - } - $ret .= "$imgdosnap "; - } - $ret .= ""; - if(AttrVal($camname,"ptzPanel_use",1) && $hash->{HELPER}{RUNVIEW} =~ /live_fw/x) { - my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); - if($ptz_ret) { - $ret .= "$ptz_ret"; - } - } - if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) { - $ret .= ""; - $ret .= ''; - $ret .= ""; - $ret .= ""; - $ret .= "" if(AttrVal($camname,"ptzPanel_use",0)); - } - - } elsif ($wltype =~ /iframe/x) { - if(!$ftui) { - $ret .= "
" if($link); - } else { - $ret .= "
" if($link); - } - $streamHash->{HELPER}{STREAM} = ""; # Stream für "set popupStream" speichern - $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist - $ret .= "$imgstop "; - $ret .= "$imgrefresh "; - $ret .= ""; - if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) { - $ret .= ''; - $ret .= ''; - $ret .= ""; - $ret .= ""; - $ret .= "" if(AttrVal($camname,"ptzPanel_use",0)); - } - - } elsif ($wltype =~ /video/x) { - $ret .= "
"; - $streamHash->{HELPER}{STREAM} = ""; # Stream für "set popupStream" speichern - $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist - $ret .= "$imgstop "; - $ret .= ""; - if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) { - $ret .= ''; - $ret .= ''; - $ret .= ""; - $ret .= ""; - $ret .= "" if(AttrVal($camname,"ptzPanel_use",0)); - } - } elsif($wltype =~ /base64img/x) { - if(!$ftui) { - $ret .= "')\">
" if($link); - } else { - $ret .= "
" if($link); - } - $streamHash->{HELPER}{STREAM} = ""; # Stream für "get popupStream" speichern - $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist - $ret .= "$imgstop "; - $ret .= $imgblank; - $ret .= "$imgdosnap "; - $ret .= ""; - - } elsif($wltype =~ /embed/x) { - if(!$ftui) { - $ret .= "')\">" if($link); - } else { - $ret .= "" if($link); - } - $streamHash->{HELPER}{STREAM} = ""; # Stream für "set popupStream" speichern - $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist - - } elsif($wltype =~ /hls/x) { - $ret .= "
"; - $streamHash->{HELPER}{STREAM} = ""; # Stream für "set popupStream" speichern - $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist - $ret .= "$imgstop "; - $ret .= "$imgrefresh "; - $ret .= "$imghlsreact "; - $ret .= $imgblank; - if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { - # Aufnahmebutton endlos Start - $ret .= "$imgrecendless "; - } else { - # Aufnahmebutton Stop - $ret .= "$imgrecstop "; - } - $ret .= "$imgdosnap "; - $ret .= ""; - if(AttrVal($camname,"ptzPanel_use",1)) { - my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); - if($ptz_ret) { - $ret .= "$ptz_ret"; - } - } - - } - - } else { - my $cam = AttrVal($camname, "alias", $camname); - $cause = "Playback cam \"$cam\" switched off"; - $ret .= "
$cause

"; - $ret .= "$imgmjpegrun "; - $ret .= "$imghlsrun " if(IsCapHLS($hash)); - $ret .= "$imglrirun "; - $ret .= "$imglh264run "; - $ret .= "$imglmjpegrun "; - $ret .= "$imglsnaprun "; - $ret .= ""; - } + # Streaming ausführen + no strict "refs"; ## no critic 'NoStrict' + if(defined &{$sdfn{$fmt}{fn}}) { + $ret .= &{$sdfn{$fmt}{fn}} (\%params); } else { - $cause = "Videoformat not supported"; - $ret .= "
$cause

"; - } + $cause = qq{Streaming of format "$fmt" is not supported}; + $ret .= "
$cause

"; + } + use strict "refs"; $ret .= ''; $ret .= ''; $ret .= ''; - Log3($strmdev, 4, "$strmdev - Link called: $link") if($link); - - undef $link; return $ret; } +###################################################################################### +# Streaming Device Typ: mjpeg +sub _streamDevMJPEG { + my $params = shift; + + my $camname = $params->{camname}; + my $strmdev = $params->{strmdev}; + + my $hash = $defs{$camname}; + my $streamHash = $defs{$strmdev}; + my $ftui = $params->{ftui}; + my $camid = $params->{camid}; + my $proto = $params->{proto}; + my $sid = $params->{sid}; + my $pws = $params->{pws}; + my $ha = $params->{ha}; + my $hb = $params->{hb}; + my $hau = $params->{hau}; + + my $serveraddr = $params->{serveraddr}; + my $serverport = $params->{serverport}; + my $apivideostms = $params->{apivideostms}; + my $apivideostmspath = $params->{apivideostmspath}; + my $apivideostmsmaxver = $params->{apivideostmsmaxver}; + my $apiaudiostm = $params->{apiaudiostm}; + my $apiaudiostmpath = $params->{apiaudiostmpath}; + my $apiaudiostmmaxver = $params->{apiaudiostmmaxver}; + + my $cmdrecendless = $params->{cmdrecendless}; + my $ttrecstart = $params->{ttrecstart}; + my $imgrecendless = $params->{imgrecendless}; + my $cmdrecstop = $params->{cmdrecstop}; + my $ttrecstop = $params->{ttrecstop}; + my $imgrecstop = $params->{imgrecstop}; + my $cmddosnap = $params->{cmddosnap}; + my $ttsnap = $params->{ttsnap}; + my $imgdosnap = $params->{imgdosnap}; + + my ($link,$audiolink); + my $ret = ""; + + if(ReadingsVal($camname, "SVSversion", "8.2.3-5828") eq "8.2.3-5828" && ReadingsVal($camname, "CamVideoType", "") !~ /MJPEG/) { + $ret .= "
Because SVS version 8.2.3-5828 is running you cannot play back MJPEG-Stream. Please upgrade to a higher SVS version !

"; + return $ret; + + } else { + if($apivideostmsmaxver) { + $link = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid"; + } elsif ($hash->{HELPER}{STMKEYMJPEGHTTP}) { + $link = $hash->{HELPER}{STMKEYMJPEGHTTP}; + } + + if($apiaudiostmmaxver) { + $audiolink = "$proto://$serveraddr:$serverport/webapi/$apiaudiostmpath?api=$apiaudiostm&version=$apiaudiostmmaxver&method=Stream&cameraId=$camid&_sid=$sid"; + } + + if(!$ftui) { + $ret .= "')\">
"; + } else { + $ret .= "
"; + } + + $streamHash->{HELPER}{STREAM} = ""; # Stream für "get popupStream" speichern + $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist + } + + if(!$hb) { + if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { + # Aufnahmebutton endlos Start + $ret .= "$imgrecendless "; + } else { + # Aufnahmebutton Stop + $ret .= "$imgrecstop "; + } + $ret .= "$imgdosnap "; + } + + $ret .= ""; + + if(AttrVal($camname,"ptzPanel_use",1)) { + my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); + if($ptz_ret) { + $ret .= "$ptz_ret"; + } + } + + if($audiolink && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) { + $ret .= ''; + $ret .= ''; + $ret .= ""; + $ret .= ""; + $ret .= "" if(AttrVal($camname,"ptzPanel_use",0)); + } + + Log3($strmdev, 4, "$strmdev - Link called: $link") if($link); + undef $link; + +return $ret; +} + +###################################################################################### +# Streaming Device Typ: lastsnap +sub _streamDevLASTSNAP { + my $params = shift; + + my $camname = $params->{camname}; + my $strmdev = $params->{strmdev}; + + my $hash = $defs{$camname}; + my $streamHash = $defs{$strmdev}; + my $ftui = $params->{ftui}; + my $pws = $params->{pws}; + my $ha = $params->{ha}; + my $hb = $params->{hb}; + + my $cmddosnap = $params->{cmddosnap}; + my $ttsnap = $params->{ttsnap}; + my $imgdosnap = $params->{imgdosnap}; + + my ($link,$cause,$ret) = ("","",""); + + my $cache = cache($camname, "c_init"); # Cache initialisieren + Log3($camname, 1, "$camname - Fall back to internal Cache due to preceding failure.") if(!$cache); + + if(!$cache || $cache eq "internal" ) { + $link = $data{SSCam}{$camname}{LASTSNAP}; + } else { + $link = cache($camname, "c_read", "{LASTSNAP}"); + } + + my $gattr = (AttrVal($camname,"snapGallerySize","Icon") eq "Full") ? $ha : ""; + + if($link) { + if(!$ftui) { + $ret .= "')\">
"; + } else { + $ret .= "
"; + } + + if(!$hb) { + $ret .= "$imgdosnap "; + } + + $ret .= ""; + + $streamHash->{HELPER}{STREAM} = ""; # Stream für "get popupStream" speichern + $streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist + + } else { + $cause = "no snapshot available to display"; + $cause = "kein Schnappschuss zur Anzeige vorhanden" if(AttrVal("global","language","EN") =~ /DE/ix); + $ret .= "
$cause

"; + } + + Log3($strmdev, 4, "$strmdev - Link called: $link") if($link); + undef $link; + +return $ret; +} + +###################################################################################### +# Streaming Device Typ: generic +sub _streamDevGENERIC { + my $params = shift; + + my $camname = $params->{camname}; + my $strmdev = $params->{strmdev}; + + my $hash = $defs{$camname}; + my $streamHash = $defs{$strmdev}; + my $ftui = $params->{ftui}; + my $pws = $params->{pws}; + my $ha = $params->{ha}; + my $hb = $params->{hb}; + + my $cmdrefresh = $params->{cmdrefresh}; + my $cmdrecendless = $params->{cmdrecendless}; + my $cmdrecstop = $params->{cmdrecstop}; + my $cmddosnap = $params->{cmddosnap}; + + my $imgrecendless = $params->{imgrecendless}; + my $imgrecstop = $params->{imgrecstop}; + my $imgdosnap = $params->{imgdosnap}; + my $imgrefresh = $params->{imgrefresh}; + my $imgblank = $params->{imgblank}; + + my $ttrefresh = $params->{ttrefresh}; + my $ttsnap = $params->{ttsnap}; + my $ttrecstop = $params->{ttrecstop}; + my $ttrecstart = $params->{ttrecstart}; + + my $ret = ""; + my $htag = AttrVal( $strmdev, "genericStrmHtmlTag", AttrVal($camname, "genericStrmHtmlTag", "") ); + + if($htag =~ m/^\s*(.*)\s*$/s) { + $htag = $1; + $htag =~ s/\$NAME/$camname/xg; + $htag =~ s/\$HTMLATTR/$ha/g; + $htag =~ s/\$PWS/$pws/g; + } + + if(!$htag) { + $ret .= "
Set attribute \"genericStrmHtmlTag\" in device $camname or in device $strmdev

"; + $ret .= ''; + $ret .= ''; + $ret .= ''; + $ret .= ''; + return $ret; + } + + $ret .= ""; + $ret .= "$htag"; + + if($htag) { + # Popup-Tag um den Popup-Teil bereinigen + my $ptag = $htag; + $ptag =~ m/^(\s+)?(?<)(\s+)?(?.*)(\s+)?(?onClick=.*)(\s+)?(?>)(\s+)?$/s; + $ptag = $+{heart} ? $+{b}.$+{heart}.$+{e} : $ptag; + $streamHash->{HELPER}{STREAM} = "$ptag"; # Stream für "set popupStream" speichern + $streamHash->{HELPER}{STREAM} =~ s/["']//gx; + $streamHash->{HELPER}{STREAM} =~ s/\s+/ /gx; + $streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist + } + + $ret .= "
"; + + Log3($strmdev, 4, "$strmdev - generic Stream params:\n$htag"); + + if(!$hb) { + $ret .= "$imgrefresh "; + $ret .= $imgblank; + + if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { # Aufnahmebutton endlos Start + $ret .= "$imgrecendless "; + } else { # Aufnahmebutton Stop + $ret .= "$imgrecstop "; + } + + $ret .= "$imgdosnap "; + } + $ret .= ""; + + if(AttrVal($camname,"ptzPanel_use",1)) { + my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); + if($ptz_ret) { + $ret .= "$ptz_ret"; + } + } + +return $ret; +} + +###################################################################################### +# Streaming Device Typ: hls +sub _streamDevHLS { + my $params = shift; + + my $camname = $params->{camname}; + my $strmdev = $params->{strmdev}; + + my $hash = $defs{$camname}; + my $streamHash = $defs{$strmdev}; + my $ftui = $params->{ftui}; + my $pws = $params->{pws}; + my $ha = $params->{ha}; + my $hb = $params->{hb}; + + my $cmdrefresh = $params->{cmdrefresh}; + my $cmdrecendless = $params->{cmdrecendless}; + my $cmdrecstop = $params->{cmdrecstop}; + my $cmddosnap = $params->{cmddosnap}; + + my $imgrecendless = $params->{imgrecendless}; + my $imgrecstop = $params->{imgrecstop}; + my $imgdosnap = $params->{imgdosnap}; + my $imgrefresh = $params->{imgrefresh}; + my $imgblank = $params->{imgblank}; + + my $ttrefresh = $params->{ttrefresh}; + my $ttsnap = $params->{ttsnap}; + my $ttrecstop = $params->{ttrecstop}; + my $ttrecstart = $params->{ttrecstart}; + + my ($cause,$ret) = ("",""); + + # es ist ein .m3u8-File bzw. ein Link dorthin zu übergeben + my $cam = AttrVal($camname, "alias", $camname); + my $m3u8 = AttrVal($camname, "hlsStrmObject", ""); + + if( $m3u8 =~ m/^\s*(.*)\s*$/s ) { + $m3u8 = $1; + $m3u8 =~ s/\$NAME/$camname/gx; + } + + my $d = $camname; + $d =~ s/\./_/x; # Namensableitung zur javascript Codeanpassung + + if(!$m3u8) { + $cause = "You have to specify attribute \"hlsStrmObject\" in Camera $cam !"; + $ret .= "
$cause

"; + $ret .= ''; + $ret .= ''; + $ret .= ''; + $ret .= ''; + return $ret; + } + + $ret .= "
"; + $ret .= bindhlsjs ($camname, $strmdev, $m3u8, $d); + + $streamHash->{HELPER}{STREAM} = ""; # Stream für "set popupStream" speichern + $streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist + + if(!$hb) { + $ret .= "$imgrefresh "; + $ret .= $imgblank; + + if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { # Aufnahmebutton endlos Start + $ret .= "$imgrecendless "; + } else { # Aufnahmebutton Stop + $ret .= "$imgrecstop "; + } + + $ret .= "$imgdosnap "; + } + + $ret .= ""; + + if(AttrVal($camname,"ptzPanel_use",1)) { + my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); + if($ptz_ret) { + $ret .= "$ptz_ret"; + } + } + +return $ret; +} + +###################################################################################### +# Streaming Device Typ: switched +sub _streamDevSWITCHED { + my $params = shift; + my $camname = $params->{camname}; + my $strmdev = $params->{strmdev}; + my $hash = $defs{$camname}; + + my $cmdmjpegrun = $params->{cmdmjpegrun}; + my $cmdhlsrun = $params->{cmdhlsrun}; + my $cmdlrirun = $params->{cmdlrirun}; + my $cmdlh264run = $params->{cmdlh264run}; + my $cmdlsnaprun = $params->{cmdlsnaprun}; + my $cmdlmjpegrun = $params->{cmdlmjpegrun}; + + my $imgmjpegrun = $params->{imgmjpegrun}; + my $imghlsrun = $params->{imghlsrun}; + my $imglh264run = $params->{imglh264run}; + my $imglmjpegrun = $params->{imglmjpegrun}; + my $imglsnaprun = $params->{imglsnaprun}; + my $imglrirun = $params->{imglrirun}; + + my $ttmjpegrun = $params->{ttmjpegrun}; + my $tthlsrun = $params->{tthlsrun}; + my $ttlrrun = $params->{ttlrrun}; + my $tth264run = $params->{tth264run}; + my $ttlmjpegrun = $params->{ttlmjpegrun}; + my $ttlsnaprun = $params->{ttlsnaprun}; + + my ($link,$cause,$ret) = ("","",""); + + my $wltype = $hash->{HELPER}{WLTYPE}; + $link = $hash->{HELPER}{LINK}; + + if(!$link) { + my $cam = AttrVal($camname, "alias", $camname); + $cause = "Playback cam \"$cam\" switched off"; + $ret .= "
$cause

"; + $ret .= "$imgmjpegrun "; + $ret .= "$imghlsrun " if(IsCapHLS($hash)); + $ret .= "$imglrirun "; + $ret .= "$imglh264run "; + $ret .= "$imglmjpegrun "; + $ret .= "$imglsnaprun "; + $ret .= ""; + return $ret; + } + + # Streaming ausführen + no strict "refs"; ## no critic 'NoStrict' + if(defined &{$sdswfn{$wltype}{fn}}) { + $ret .= &{$sdswfn{$wltype}{fn}} ($params); + } else { + $cause = qq{Streaming of format "$wltype" is not supported}; + $ret .= "
$cause

"; + } + use strict "refs"; + + Log3($strmdev, 4, "$strmdev - Link called: $link"); + undef $link; + +return $ret; +} + +###################################################################################### +# Streaming Device Typ: switched image +sub __switchedIMAGE { + my $params = shift; + + my $camname = $params->{camname}; + my $strmdev = $params->{strmdev}; + + my $hash = $defs{$camname}; + my $streamHash = $defs{$strmdev}; + my $ftui = $params->{ftui}; + my $pws = $params->{pws}; + my $ha = $params->{ha}; + my $hau = $params->{hau}; + + my $cmdrecendless = $params->{cmdrecendless}; + my $cmdrecstop = $params->{cmdrecstop}; + my $cmddosnap = $params->{cmddosnap}; + my $cmdstop = $params->{cmdstop}; + + my $imgrecendless = $params->{imgrecendless}; + my $imgrecstop = $params->{imgrecstop}; + my $imgdosnap = $params->{imgdosnap}; + my $imgblank = $params->{imgblank}; + my $imgstop = $params->{imgstop}; + + my $ttsnap = $params->{ttsnap}; + my $ttrecstop = $params->{ttrecstop}; + my $ttrecstart = $params->{ttrecstart}; + my $ttcmdstop = $params->{ttcmdstop}; + + my ($link,$ret) = ("",""); + $link = $hash->{HELPER}{LINK}; + + if(ReadingsVal($camname, "SVSversion", "8.2.3-5828") eq "8.2.3-5828" && ReadingsVal($camname, "CamVideoType", "") !~ /MJPEG/) { + $ret .= "
Because SVS version 8.2.3-5828 is running you cannot see the MJPEG-Stream. Please upgrade to a higher SVS version !

"; + } else { + if(!$ftui) { + $ret .= "')\">
" if($link); + } else { + $ret .= "
" if($link); + } + + $streamHash->{HELPER}{STREAM} = ""; # Stream für "set popupStream" speichern + $streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist + } + + $ret .= "$imgstop "; + $ret .= $imgblank; + + if($hash->{HELPER}{RUNVIEW} =~ /live_fw/x) { + if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { # Aufnahmebutton endlos Start + $ret .= "$imgrecendless "; + } else { # Aufnahmebutton Stop + $ret .= "$imgrecstop "; + } + + $ret .= "$imgdosnap "; + } + + $ret .= ""; + + if(AttrVal($camname,"ptzPanel_use",1) && $hash->{HELPER}{RUNVIEW} =~ /live_fw/x) { + my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); + if($ptz_ret) { + $ret .= "$ptz_ret"; + } + } + + if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) { + $ret .= ""; + $ret .= ''; + $ret .= ""; + $ret .= ""; + $ret .= "" if(AttrVal($camname,"ptzPanel_use",0)); + } + +return $ret; +} + +###################################################################################### +# Streaming Device Typ: switched iframe +sub __switchedIFRAME { + my $params = shift; + + my $camname = $params->{camname}; + my $strmdev = $params->{strmdev}; + + my $hash = $defs{$camname}; + my $streamHash = $defs{$strmdev}; + my $ftui = $params->{ftui}; + my $pws = $params->{pws}; + my $ha = $params->{ha}; + my $hau = $params->{hau}; + + my $cmdstop = $params->{cmdstop}; + my $cmdrefresh = $params->{cmdrefresh}; + + my $imgstop = $params->{imgstop}; + my $imgrefresh = $params->{imgrefresh}; + + my $ttcmdstop = $params->{ttcmdstop}; + my $ttrefresh = $params->{ttrefresh}; + + my ($link,$ret) = ("",""); + $link = $hash->{HELPER}{LINK}; + + if(!$ftui) { + $ret .= "
" if($link); + } else { + $ret .= "
" if($link); + } + $streamHash->{HELPER}{STREAM} = ""; # Stream für "set popupStream" speichern + $streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist + + $ret .= "$imgstop "; + $ret .= "$imgrefresh "; + $ret .= ""; + + if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) { + $ret .= ''; + $ret .= ''; + $ret .= ""; + $ret .= ""; + $ret .= "" if(AttrVal($camname,"ptzPanel_use",0)); + } + +return $ret; +} + +###################################################################################### +# Streaming Device Typ: switched video +sub __switchedVIDEO { + my $params = shift; + + my $camname = $params->{camname}; + my $strmdev = $params->{strmdev}; + + my $hash = $defs{$camname}; + my $streamHash = $defs{$strmdev}; + my $ftui = $params->{ftui}; + my $pws = $params->{pws}; + my $ha = $params->{ha}; + my $hau = $params->{hau}; + my $cmdstop = $params->{cmdstop}; + my $imgstop = $params->{imgstop}; + my $ttcmdstop = $params->{ttcmdstop}; + + my ($link,$ret) = ("",""); + $link = $hash->{HELPER}{LINK}; + + $ret .= "
"; + + $streamHash->{HELPER}{STREAM} = ""; # Stream für "set popupStream" speichern + + $streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist + + $ret .= "$imgstop "; + $ret .= ""; + + if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/ && !$hau) { + $ret .= ''; + $ret .= ''; + $ret .= ""; + $ret .= ""; + $ret .= "" if(AttrVal($camname,"ptzPanel_use",0)); + } + +return $ret; +} + +###################################################################################### +# Streaming Device Typ: switched base64img +sub __switchedBASE64IMG { + my $params = shift; + + my $camname = $params->{camname}; + my $strmdev = $params->{strmdev}; + + my $hash = $defs{$camname}; + my $streamHash = $defs{$strmdev}; + my $ftui = $params->{ftui}; + my $pws = $params->{pws}; + my $ha = $params->{ha}; + + my $cmdstop = $params->{cmdstop}; + my $cmddosnap = $params->{cmddosnap}; + + my $imgstop = $params->{imgstop}; + my $imgdosnap = $params->{imgdosnap}; + my $imgblank = $params->{imgblank}; + + my $ttcmdstop = $params->{ttcmdstop}; + my $ttsnap = $params->{ttsnap}; + + my ($link,$ret) = ("",""); + $link = $hash->{HELPER}{LINK}; + + if(!$ftui) { + $ret .= "')\">
" if($link); + } else { + $ret .= "
" if($link); + } + $streamHash->{HELPER}{STREAM} = ""; # Stream für "get popupStream" speichern + $streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist + + $ret .= "$imgstop "; + $ret .= $imgblank; + $ret .= "$imgdosnap "; + $ret .= ""; + +return $ret; +} + +###################################################################################### +# Streaming Device Typ: switched embed +sub __switchedEMBED { + my $params = shift; + + my $camname = $params->{camname}; + my $strmdev = $params->{strmdev}; + + my $hash = $defs{$camname}; + my $streamHash = $defs{$strmdev}; + my $ftui = $params->{ftui}; + my $pws = $params->{pws}; + my $ha = $params->{ha}; + + my ($link,$ret) = ("",""); + $link = $hash->{HELPER}{LINK}; + + if(!$ftui) { + $ret .= "')\">" if($link); + } else { + $ret .= "" if($link); + } + $streamHash->{HELPER}{STREAM} = ""; # Stream für "set popupStream" speichern + $streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist + +return $ret; +} + +###################################################################################### +# Streaming Device Typ: switched hls +sub __switchedHLS { + my $params = shift; + + my $camname = $params->{camname}; + my $strmdev = $params->{strmdev}; + + my $hash = $defs{$camname}; + my $streamHash = $defs{$strmdev}; + my $ftui = $params->{ftui}; + my $pws = $params->{pws}; + my $ha = $params->{ha}; + + my $cmdrecendless = $params->{cmdrecendless}; + my $cmdrecstop = $params->{cmdrecstop}; + my $cmddosnap = $params->{cmddosnap}; + my $cmdstop = $params->{cmdstop}; + my $cmdrefresh = $params->{cmdrefresh}; + my $cmdhlsreact = $params->{cmdhlsreact}; + + my $imgrecendless = $params->{imgrecendless}; + my $imgrecstop = $params->{imgrecstop}; + my $imgdosnap = $params->{imgdosnap}; + my $imgblank = $params->{imgblank}; + my $imgstop = $params->{imgstop}; + my $imgrefresh = $params->{imgrefresh}; + my $imghlsreact = $params->{imghlsreact}; + + my $ttsnap = $params->{ttsnap}; + my $ttrecstop = $params->{ttrecstop}; + my $ttrecstart = $params->{ttrecstart}; + my $ttcmdstop = $params->{ttcmdstop}; + my $ttrefresh = $params->{ttrefresh}; + my $tthlsreact = $params->{tthlsreact}; + + my ($link,$ret) = ("",""); + $link = $hash->{HELPER}{LINK}; + + $ret .= "
"; + + $streamHash->{HELPER}{STREAM} = ""; # Stream für "set popupStream" speichern + + $streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist + + $ret .= "$imgstop "; + $ret .= "$imgrefresh "; + $ret .= "$imghlsreact "; + $ret .= $imgblank; + + if(ReadingsVal($camname, "Record", "Stop") eq "Stop") { # Aufnahmebutton endlos Start + $ret .= "$imgrecendless "; + } else { # Aufnahmebutton Stop + $ret .= "$imgrecstop "; + } + + $ret .= "$imgdosnap "; + $ret .= ""; + + if(AttrVal($camname,"ptzPanel_use",1)) { + my $ptz_ret = ptzPanel($camname,$strmdev,'',$ftui); + if($ptz_ret) { + $ret .= "$ptz_ret"; + } + } + +return $ret; +} + ############################################################################################# # hls.js laden für Streamimgdevice Typen HLS, RTSP # $m3u8 - ein .m3u8-File oder ein entsprechender Link @@ -8566,9 +9029,9 @@ sub composeGallery { my ($cache,$imgdat,$imgTm); # Kontext des SSCamSTRM-Devices speichern für roomRefresh - $hash->{HELPER}{STRMDEV} = $strmdev; # Name des aufrufenden SSCamSTRM-Devices - $hash->{HELPER}{STRMROOM} = $FW_room?$FW_room:""; # Raum aus dem das SSCamSTRM-Device die Funktion aufrief - $hash->{HELPER}{STRMDETAIL} = $FW_detail?$FW_detail:""; # Name des SSCamSTRM-Devices (wenn Detailansicht) + #$hash->{HELPER}{STRMDEV} = $strmdev; # Name des aufrufenden SSCamSTRM-Devices + #$hash->{HELPER}{STRMROOM} = $FW_room?$FW_room:""; # Raum aus dem das SSCamSTRM-Device die Funktion aufrief + #$hash->{HELPER}{STRMDETAIL} = $FW_detail?$FW_detail:""; # Name des SSCamSTRM-Devices (wenn Detailansicht) if($strmdev) { my $streamHash = $defs{$strmdev}; # Hash des SSCamSTRM-Devices @@ -9985,10 +10448,10 @@ sub sendEmail { my $m1 = "Net::SMTP"; my $m2 = "MIME::Lite"; my $m3 = "Net::SMTP::SSL"; - my $sslfb = 0; # Flag für Verwendung altes Net::SMTP::SSL + my $sslfb = 0; # Flag für Verwendung altes Net::SMTP::SSL my ($vm1,$vm2,$vm3); - eval { require Net::SMTP; + eval { require Net::SMTP; ## no critic 'eval not tested' Net::SMTP->import; $vm1 = $Net::SMTP::VERSION; @@ -10016,8 +10479,8 @@ sub sendEmail { Log3($name, 1, "$name - $ret"); readingsBeginUpdate($hash); - readingsBulkUpdate($hash,"sendEmailState",$ret); - readingsEndUpdate($hash, 1); + readingsBulkUpdate ($hash,"sendEmailState",$ret); + readingsEndUpdate ($hash, 1); return $ret; } @@ -10072,13 +10535,15 @@ sub sendEmail { if ($#err >= 0) { $ret = "Missing at least one required parameter or attribute: ".join(', ',@err); Log3($name, 2, "$name - $ret"); + readingsBeginUpdate($hash); - readingsBulkUpdate($hash,"sendEmailState",$ret); - readingsEndUpdate($hash, 1); + readingsBulkUpdate ($hash,"sendEmailState",$ret); + readingsEndUpdate ($hash, 1); + return $ret; } - $hash->{HELPER}{RUNNING_PID} = BlockingCall("FHEM::SSCam::sendEmailblocking", $data{SSCam}{$name}{PARAMS}{$tac}, "FHEM::SSCam::sendEmaildone", $timeout, "FHEM::SSCam::sendEmailto", $hash); + $hash->{HELPER}{RUNNING_PID} = BlockingCall("FHEM::SSCam::sendEmailblocking", $data{SSCam}{$name}{PARAMS}{$tac}, "FHEM::SSCam::sendEmaildone", $timeout, "FHEM::SSCam::sendEmailto", $hash); $hash->{HELPER}{RUNNING_PID}{loglevel} = 5 if($hash->{HELPER}{RUNNING_PID}); # Forum #77057 undef %mailparams; @@ -10303,8 +10768,8 @@ sub sendEmailblocking { Log3($name, 3, "$name - SMTP-Host $smtphost use unencrypted connection !"); } } else { - eval { $sslver = $smtp->get_sslversion(); }; # Forum: https://forum.fhem.de/index.php/topic,45671.msg880602.html#msg880602 - $sslver = $sslver?$sslver:"n.a."; + eval { $sslver = $smtp->get_sslversion(); }; ## no critic 'eval not tested' # Forum: https://forum.fhem.de/index.php/topic,45671.msg880602.html#msg880602 + $sslver = $sslver ? $sslver : "n.a."; Log3($name, 3, "$name - SMTP-Host $smtphost use immediately encrypted connection with SSL version: $sslver"); } @@ -10398,8 +10863,8 @@ sub sendEmaildone { } readingsBeginUpdate($hash); - readingsBulkUpdate($hash,"sendEmailState",$ret); - readingsEndUpdate($hash, 1); + readingsBulkUpdate ($hash,"sendEmailState",$ret); + readingsEndUpdate ($hash, 1); delete($hash->{HELPER}{RUNNING_PID}); @@ -10413,12 +10878,12 @@ sub sendEmailto { my ($hash,$cause) = @_; my $name = $hash->{NAME}; - $cause = $cause?$cause:"Timeout: process terminated"; + $cause = $cause // "Timeout: process terminated"; Log3 ($name, 1, "$name -> BlockingCall $hash->{HELPER}{RUNNING_PID}{fn} pid:$hash->{HELPER}{RUNNING_PID}{pid} $cause"); - readingsBeginUpdate($hash); - readingsBulkUpdateIfChanged($hash,"sendEmailState",$cause); - readingsEndUpdate($hash, 1); + readingsBeginUpdate ($hash); + readingsBulkUpdateIfChanged ($hash,"sendEmailState",$cause); + readingsEndUpdate ($hash, 1); delete($hash->{HELPER}{RUNNING_PID}); @@ -10459,7 +10924,7 @@ return; # Transaktion starten oder vorhandenen TA Code zurück liefern ############################################################################################# sub openOrgetTrans { - my ($hash) = @_; + my $hash = shift; my $name = $hash->{NAME}; my $tac = ""; @@ -10469,6 +10934,7 @@ sub openOrgetTrans { if (AttrVal($name,"debugactivetoken",0)) { Log3($name, 1, "$name - Transaction opened, TA-code: $tac"); } + } else { $tac = $hash->{HELPER}{TRANSACTION}; # vorhandenen Transaktionscode zurück liefern } @@ -10480,8 +10946,8 @@ return $tac; # Transaktion freigeben ############################################################################################# sub closeTrans { - my ($hash) = @_; - my $name = $hash->{NAME}; + my $hash = shift; + my $name = $hash->{NAME}; my $tac = delete $hash->{HELPER}{TRANSACTION}; # diese Transaktion beenden $tac = $tac?$tac:""; @@ -10781,7 +11247,7 @@ sub cache { # Test ob Redis Serververbindung möglich my $rc = $hash->{HELPER}{REDISKEY}; if ($rc) { - eval { $r = $rc->ping }; + eval { $r = $rc->ping }; ## no critic 'eval not tested' if (!$r || $r ne "PONG") { # Verbindungskeys löschen -> Neugenerierung mit "c_init" Log3($name, 1, "$name - ERROR - connection to Redis server not possible. May be no route to host or port is wrong."); delete $hash->{HELPER}{REDISKEY}; @@ -10892,7 +11358,7 @@ sub setVersionInfo { if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) { # es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen # mit {->VERSION()} im FHEMWEB kann Modulversion abgefragt werden - use version 0.77; our $VERSION = FHEM::Meta::Get( $hash, 'version' ); + use version 0.77; our $VERSION = FHEM::Meta::Get( $hash, 'version' ); ## no critic 'VERSION' } } else { # herkömmliche Modulstruktur @@ -11326,32 +11792,18 @@ attr <name> genericStrmHtmlTag <img $HTMLATTR

    -
  • enable | disable     (valid for CAM)

  • + +
  • disable     (gilt für CAM)
    + Disables the camera in Synology Surveillance Station. +
  • +
+

- For deactivating / activating a list of cameras or all cameras by Regex-expression, subsequent two - examples using "at": -
-     define a13 at 21:46 set CamCP1,CamFL,CamHE1,CamTER disable (enable)
-     define a14 at 21:46 set Cam.* disable (enable)
-  
- - A bit more convenient is it to use a dummy-device for enable/disable all available cameras in Surveillance Station.
- At first the Dummy will be created. -
-     define allcams dummy
-     attr allcams eventMap on:enable off:disable
-     attr allcams room Cams
-     attr allcams webCmd enable:disable
-  
- - With combination of two created notifies, respectively one for "enable" and one for "diasble", you are able to switch all cameras into "enable" or "disable" state at the same time if you set the dummy to "enable" or "disable". -
-     define all_cams_disable notify allcams:.*off set CamCP1,CamFL,CamHE1,CamTER disable
-     attr all_cams_disable room Cams
-
-     define all_cams_enable notify allcams:on set CamCP1,CamFL,CamHE1,CamTER enable
-     attr all_cams_enable room Cams
-  
+
    + +
  • enable     (gilt für CAM)
    + Activate the camera in Synology Surveillance Station. +


@@ -13262,33 +13714,20 @@ attr <name> genericStrmHtmlTag <img $HTMLATTR

    -
  • enable | disable     (gilt für CAM)

  • - - Aktviviert / deaktiviert eine Kamera.
    - Um eine Liste von Kameras oder alle Kameras (mit Regex) zum Beispiel um 21:46 zu deaktivieren / zu aktivieren zwei Beispiele mit at: -
    -     define a13 at 21:46 set CamCP1,CamFL,CamHE1,CamTER disable (enable)
    -     define a14 at 21:46 set Cam.* disable (enable)
    -  
    - - Etwas komfortabler gelingt das Schalten aller Kameras über einen Dummy. Zunächst wird der Dummy angelegt: -
    -     define allcams dummy
    -     attr allcams eventMap on:enable off:disable
    -     attr allcams room Cams
    -     attr allcams webCmd enable:disable
    -  
    - - Durch Verknüpfung mit zwei angelegten notify, jeweils ein notify für "enable" und "disable", kann man durch Schalten des Dummys auf "enable" bzw. "disable" alle Kameras auf einmal aktivieren bzw. deaktivieren. -
    -     define all_cams_disable notify allcams:.*off set CamCP1,CamFL,CamHE1,CamTER disable
    -     attr all_cams_disable room Cams
    -
    -     define all_cams_enable notify allcams:on set CamCP1,CamFL,CamHE1,CamTER enable
    -     attr all_cams_enable room Cams
    -  
    + +
  • disable     (gilt für CAM)
    + Deaktiviert die Kamera in der Synology Surveillance Station. +
-
+

+ +
    + +
  • enable     (gilt für CAM)
    + Aktiviert die Kamera in der Synology Surveillance Station. +
  • +
+

  • expmode [day|night|auto]     (gilt für CAM)