2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 16:56:54 +00:00

49_SSCam: support of FTUI Widget with SSCamSTRM, new attributes in SSCamSTRM, some fixes

git-svn-id: https://svn.fhem.de/fhem/trunk@19837 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2019-07-15 21:09:30 +00:00
parent 7eda00c3c2
commit e22753d0f3
3 changed files with 672 additions and 351 deletions

View File

@ -1,5 +1,7 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it.
- feature: 49_SSCam: support of FTUI Widget with SSCamSTRM, new attributes
in SSCamSTRM, some fixes
- feature: 71_YAMAHA_NP: Added undocumented reverse-engineered
sound functionality :-)
(balance, enhancer, equalizer)

View File

@ -48,6 +48,11 @@ eval "use FHEM::Meta;1" or my $modMetaAbsent = 1;
# Versions History intern
our %SSCam_vNotesIntern = (
"8.16.0" => "14.07.2019 change detail link generation from SSCamSTRM to SSCam ",
"8.15.2" => "14.07.2019 fix order of snaps in snapgallery when adding new snaps, fix english date formating in composegallery, ".
"align center of FTUI table, set compatibility to 8.2.5 ",
"8.15.1" => "11.07.2019 enhancement and bugfixes for refresh of SSCamSTRM devices (integrate FUUID) ",
"8.15.0" => "09.07.2019 support of SSCamSTRM get function and FTUI widget ",
"8.14.2" => "28.06.2019 increase get SID timeout to at least 60 s, set compatibility to SVS 8.2.4, improve disable/enable behavior ",
"8.14.1" => "23.06.2019 Presets and Patrols containing spaces in its names are replaced by \"_\", deletion of Presets corrected ".
"bugfix userattr when changing Prests ",
@ -153,6 +158,7 @@ our %SSCam_vNotesIntern = (
# Versions History extern
our %SSCam_vNotesExtern = (
"8.15.0" => "09.07.2019 support of integrating Streaming-Devices in a SSCam FTUI widget ",
"8.14.0" => "01.06.2019 In detailview are buttons provided to open the camera native setup screen or Synology Surveillance Station and the Synology Surveillance Station online help. ",
"8.12.0" => "25.03.2019 Delay FHEM shutdown as long as sessions are not terminated, but not longer than global attribute \"maxShutdownDelay\". ",
"8.11.0" => "25.02.2019 compatibility set to SVS version 8.2.3, Popup possible for streaming devices of type \"generic\", ".
@ -266,7 +272,7 @@ our %SSCam_vNotesExtern = (
);
# getestete SVS-Version
my $compstat = "8.2.4";
my $compstat = "8.2.5";
# Aufbau Errorcode-Hashes (siehe Surveillance Station Web API)
my %SSCam_errauthlist = (
@ -326,7 +332,7 @@ our %SSCam_ttips_en = (
ttcmdstop => "Stopp playback of camera "§NAME§"",
tthlsreact => "Reactivate HTTP Livestreaming Interface of camera &quot;§NAME§&quot;.<br>The camera is enforced to restart HLS transmission.",
ttmjpegrun => "Playback the MJPEG Livestream of camera &quot;§NAME§&quot;.",
tthlsrun => "Playback the native HTTP Livestream of camera &quot;§NAME§&quot;.",
tthlsrun => "Playback the native HTTP Livestream of camera &quot;§NAME§&quot;. The browser must have native support for HLS streaming.",
ttlrrun => "Playback of last recording of camera &quot;§NAME§&quot; in an iFrame.<br>Both MJPEG and H.264 recordings are rendered.",
tth264run => "Playback of last H.264 recording of camera &quot;§NAME§&quot;.<br>It only starts if the recording is type H.264",
ttlmjpegrun => "Playback of last MJPEG recording of camera &quot;§NAME§&quot;.<br>It only starts if the recording is type MJPEG",
@ -344,7 +350,7 @@ our %SSCam_ttips_de = (
ttcmdstop => "Stopp Wiedergabe von Kamera &quot;§NAME§&quot;",
tthlsreact => "Reaktiviert das HTTP Livestreaming Interface von Kamera &quot;§NAME§&quot;.<br>Die Kamera wird aufgefordert die HLS Übertragung zu restarten.",
ttmjpegrun => "Wiedergabe des MJPEG Livestreams von Kamera &quot;§NAME§&quot;",
tthlsrun => "Wiedergabe des HTTP Livestreams von Kamera &quot;§NAME§&quot;.<br>Es wird die HLS Funktion der Synology Surveillance Station verwendet.",
tthlsrun => "Wiedergabe des HTTP Livestreams von Kamera &quot;§NAME§&quot;.<br>Es wird die HLS Funktion der Synology Surveillance Station verwendet. (der Browser muss HLS nativ unterstützen)",
ttlrrun => "Wiedergabe der letzten Aufnahme von Kamera &quot;§NAME§&quot; in einem iFrame.<br>Es werden sowohl MJPEG als auch H.264 Aufnahmen wiedergegeben.",
tth264run => "Wiedergabe der letzten H.264 Aufnahme von Kamera &quot;§NAME§&quot;.<br>Die Wiedergabe startet nur wenn die Aufnahme vom Typ H.264 ist.",
ttlmjpegrun => "Wiedergabe der letzten MJPEG Aufnahme von Kamera &quot;§NAME§&quot;.<br>Die Wiedergabe startet nur wenn die Aufnahme vom Typ MJPEG ist.",
@ -883,10 +889,15 @@ sub SSCam_Set($@) {
$hash->{HELPER}{RECTIME_TEMP} = $prop;
}
my $spec = join(" ",@a);
if($spec =~ /STRM:/) {
$spec =~ m/.*STRM:(.*).*/i; # Aufnahme durch SSCamSTRM-Device
$hash->{HELPER}{INFORM} = $1;
}
my $emtxt = AttrVal($name, "recEmailTxt", "");
my $at = join(" ",@a);
if($at =~ /recEmailTxt:/) {
$at =~ m/.*recEmailTxt:"(.*)".*/i;
if($spec =~ /recEmailTxt:/) {
$spec =~ m/.*recEmailTxt:"(.*)".*/i;
$emtxt = $1;
}
@ -898,9 +909,8 @@ sub SSCam_Set($@) {
}
my $teletxt = AttrVal($name, "recTelegramTxt", "");
my $bt = join(" ",@a);
if($bt =~ /recTelegramTxt:/) {
$bt =~ m/.*recTelegramTxt:"(.*)".*/i;
if($spec =~ /recTelegramTxt:/) {
$spec =~ m/.*recTelegramTxt:"(.*)".*/i;
$teletxt = $1;
}
@ -916,6 +926,13 @@ sub SSCam_Set($@) {
if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\"";}
my $emtxt = $hash->{HELPER}{SMTPRECMSG}?delete $hash->{HELPER}{SMTPRECMSG}:"";
my $teletxt = $hash->{HELPER}{TELERECMSG}?delete $hash->{HELPER}{TELERECMSG}:"";
my $spec = join(" ",@a);
if($spec =~ /STRM:/) {
$spec =~ m/.*STRM:(.*).*/i; # Aufnahmestop durch SSCamSTRM-Device
$hash->{HELPER}{INFORM} = $1;
}
SSCam_camstoprec("$name!_!$emtxt!_!$teletxt");
} elsif ($opt eq "snap" && SSCam_IsModelCam($hash)) {
@ -931,12 +948,17 @@ sub SSCam_Set($@) {
}
Log3($name, 4, "$name - Trigger snapshots - Number: $num, Lag: $lag");
$hash->{HELPER}{SNAPBYSTRMDEV} = 1 if ($prop2 && $prop2 =~ /STRM/); # $prop wird mitgegeben durch Snap by SSCamSTRM-Device
my $spec = join(" ",@a);
if($spec =~ /STRM:/) {
$spec =~ m/.*STRM:(.*).*/i; # Snap by SSCamSTRM-Device
$hash->{HELPER}{INFORM} = $1;
$hash->{HELPER}{SNAPBYSTRMDEV} = 1;
}
my $emtxt = AttrVal($name, "snapEmailTxt", "");
my $at = join(" ",@a);
if($at =~ /snapEmailTxt:/) {
$at =~ m/.*snapEmailTxt:"(.*)".*/i;
if($spec =~ /snapEmailTxt:/) {
$spec =~ m/.*snapEmailTxt:"(.*)".*/i;
$emtxt = $1;
}
@ -948,9 +970,8 @@ sub SSCam_Set($@) {
}
my $teletxt = AttrVal($name, "snapTelegramTxt", "");
my $bt = join(" ",@a);
if($bt =~ /snapTelegramTxt:/) {
$bt =~ m/.*snapTelegramTxt:"(.*)".*/i;
if($spec =~ /snapTelegramTxt:/) {
$spec =~ m/.*snapTelegramTxt:"(.*)".*/i;
$teletxt = $1;
}
@ -1355,6 +1376,13 @@ sub SSCam_Set($@) {
} elsif ($opt eq "runView" && SSCam_IsModelCam($hash)) {
if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\"";}
my $spec = join(" ",@a);
if($spec =~ /STRM:/) {
$spec =~ m/.*STRM:(.*).*/i; # Call by SSCamSTRM-Device
$hash->{HELPER}{INFORM} = $1;
}
if ($prop eq "live_open") {
if ($prop1) {$hash->{HELPER}{VIEWOPENROOM} = $prop1;} else {delete $hash->{HELPER}{VIEWOPENROOM};}
$hash->{HELPER}{OPENWINDOW} = 1;
@ -1427,12 +1455,20 @@ sub SSCam_Set($@) {
} elsif ($opt eq "hlsactivate" && SSCam_IsModelCam($hash)) {
# ohne SET-Menüeintrag
if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\"";}
my $spec = join(" ",@a);
if($spec =~ /STRM:/) {
$spec =~ m/.*STRM:(.*).*/i; # Call by SSCamSTRM-Device
$hash->{HELPER}{INFORM} = $1;
}
SSCam_hlsactivate($hash);
} elsif ($opt eq "refresh" && SSCam_IsModelCam($hash)) {
# ohne SET-Menüeintrag
if($prop =~ /STRM/) {
# Event in allen SSCamSTRM-Devices erzeugen um Contentwiedergabe aufzufrischen
my $spec = join(" ",@a);
if($spec =~ /STRM:/) {
$spec =~ m/.*STRM:(.*).*/i; # Refresh by SSCamSTRM-Device
$hash->{HELPER}{INFORM} = $1;
SSCam_refresh($hash,0,0,1); # kein Room-Refresh, kein SSCam-state-Event, SSCamSTRM-Event
}
@ -1443,6 +1479,12 @@ sub SSCam_Set($@) {
} elsif ($opt eq "stopView" && SSCam_IsModelCam($hash)) {
if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\"";}
my $spec = join(" ",@a);
if($spec =~ /STRM:/) {
$spec =~ m/.*STRM:(.*).*/i; # Stop by SSCamSTRM-Device
$hash->{HELPER}{INFORM} = $1;
}
SSCam_stopliveview($hash);
} elsif ($opt eq "setPreset" && SSCam_IsModelCam($hash)) {
@ -1906,7 +1948,6 @@ sub SSCam_FWdetailFn ($$$$) {
$ret .= $hash->{".setup"};
}
# return undef if(!AttrVal($d,"ptzPanel_use",1));
$hash->{".ptzhtml"} = SSCam_ptzpanel($d) if($hash->{".ptzhtml"} eq "");
if($hash->{".ptzhtml"} ne "" && AttrVal($d,"ptzPanel_use",1)) {
@ -5089,7 +5130,7 @@ sub SSCam_camop_parse ($) {
$sendrecs{$sn}{createdTm} = $createdTm;
$sendrecs{$sn}{fileName} = $fileName;
$sendrecs{$sn}{".imageData"} = $myjson;
Log3($name,4, "$name - Snap '$sn' added to send recording hash: ID => $recid, File => $fileName, Created => $createdTm");
Log3($name,4, "$name - Recording '$sn' added to send recording hash: ID => $recid, File => $fileName, Created => $createdTm");
# prüfen ob Recording als Email / Telegram versendet werden soll
SSCam_prepareSendData ($hash, $OpMode, \%sendrecs);
@ -5443,6 +5484,10 @@ sub SSCam_camop_parse ($) {
my $sn = 0;
my %sendsnaps = (); # Schnappschuss Hash zum Versand wird leer erstellt
if($hash->{HELPER}{".SNAPHASH"}) {
$hash->{HELPER}{".SNAPHASHOLD"} = delete($hash->{HELPER}{".SNAPHASH"});
}
while ($data->{'data'}{'data'}[$i]) {
if(!$data->{'data'}{'data'}[$i]{'camName'} || $data->{'data'}{'data'}[$i]{'camName'} ne $camname) { # Forum:#97706
$i += 1;
@ -5467,19 +5512,32 @@ sub SSCam_camop_parse ($) {
$sendsnaps{$sn}{".imageData"} = $imageData;
Log3($name,4, "$name - Snap '$sn' added to send gallery hash: ID => $snapid, File => $fileName, Created => $createdTm");
# Snaphash um die neuen Snaps ergänzen wenn existent
if($hash->{HELPER}{".SNAPHASH"}{$sn}) {
# Snaphash erstellen
$hash->{HELPER}{".SNAPHASH"}{$sn}{snapid} = $snapid;
$hash->{HELPER}{".SNAPHASH"}{$sn}{createdTm} = $createdTm;
$hash->{HELPER}{".SNAPHASH"}{$sn}{fileName} = $fileName;
$hash->{HELPER}{".SNAPHASH"}{$sn}{imageData} = $imageData;
Log3($name,4, "$name - Snap '$sn' added to gallery hash: ID => $snapid, File => $fileName, Created => $createdTm");
}
$sn += 1;
$i += 1;
}
my $sgn = AttrVal($name,"snapGalleryNumber",3);
my $ss = $sn;
$sn = 0;
if($hash->{HELPER}{".SNAPHASHOLD"} && $sgn > $ss) {
for my $kn ($ss..($sgn-1)) {
$hash->{HELPER}{".SNAPHASH"}{$kn}{snapid} = $hash->{HELPER}{".SNAPHASHOLD"}{$sn}{snapid};
$hash->{HELPER}{".SNAPHASH"}{$kn}{createdTm} = $hash->{HELPER}{".SNAPHASHOLD"}{$sn}{createdTm};
$hash->{HELPER}{".SNAPHASH"}{$kn}{fileName} = $hash->{HELPER}{".SNAPHASHOLD"}{$sn}{fileName};
$hash->{HELPER}{".SNAPHASH"}{$kn}{imageData} = $hash->{HELPER}{".SNAPHASHOLD"}{$sn}{imageData};
$sn += 1;
}
delete $hash->{HELPER}{".SNAPHASHOLD"};
}
# prüfen ob Schnappschuß versendet werden soll
SSCam_prepareSendData ($hash, $OpMode, \%sendsnaps);
@ -5491,6 +5549,10 @@ sub SSCam_camop_parse ($) {
$hash->{HELPER}{TOTALCNT} = $data->{data}{total}; # total Anzahl Schnappschüsse
if($hash->{HELPER}{".SNAPHASH"}) {
$hash->{HELPER}{".SNAPHASHOLD"} = delete($hash->{HELPER}{".SNAPHASH"});
}
while ($data->{'data'}{'data'}[$i]) {
if(!$data->{'data'}{'data'}[$i]{'camName'} || $data->{'data'}{'data'}[$i]{'camName'} ne $camname) { # Forum:#97706
$i += 1;
@ -5508,15 +5570,32 @@ sub SSCam_camop_parse ($) {
} else {
$createdTm = "$d[0]-$d[1]-$d[2] / $t[1]";
}
# Snaphash erstellen
$hash->{HELPER}{".SNAPHASH"}{$sn}{snapid} = $snapid;
$hash->{HELPER}{".SNAPHASH"}{$sn}{createdTm} = $createdTm;
$hash->{HELPER}{".SNAPHASH"}{$sn}{fileName} = $fileName;
$hash->{HELPER}{".SNAPHASH"}{$sn}{imageData} = $imageData;
Log3($name,4, "$name - Snap '$sn' added to gallery hash: ID => $hash->{HELPER}{\".SNAPHASH\"}{$sn}{snapid}, File => $hash->{HELPER}{\".SNAPHASH\"}{$sn}{fileName}, Created => $hash->{HELPER}{\".SNAPHASH\"}{$sn}{createdTm}");
$sn += 1;
$i += 1;
}
my $sgn = AttrVal($name,"snapGalleryNumber",3);
my $ss = $sn;
$sn = 0;
if($hash->{HELPER}{".SNAPHASHOLD"} && $sgn > $ss) {
for my $kn ($ss..($sgn-1)) {
$hash->{HELPER}{".SNAPHASH"}{$kn}{snapid} = $hash->{HELPER}{".SNAPHASHOLD"}{$sn}{snapid};
$hash->{HELPER}{".SNAPHASH"}{$kn}{createdTm} = $hash->{HELPER}{".SNAPHASHOLD"}{$sn}{createdTm};
$hash->{HELPER}{".SNAPHASH"}{$kn}{fileName} = $hash->{HELPER}{".SNAPHASHOLD"}{$sn}{fileName};
$hash->{HELPER}{".SNAPHASH"}{$kn}{imageData} = $hash->{HELPER}{".SNAPHASHOLD"}{$sn}{imageData};
$sn += 1;
}
delete $hash->{HELPER}{".SNAPHASHOLD"};
}
# Direktausgabe Snaphash wenn nicht gepollt wird
if(!AttrVal($name, "snapGalleryBoost",0)) {
my $htmlCode = SSCam_composegallery($name);
@ -5539,10 +5618,9 @@ sub SSCam_camop_parse ($) {
delete($hash->{HELPER}{GETSNAPGALLERY}); # Steuerbit getsnapgallery statt getsnapinfo
######## fallabhängige Eventgenerierung ########
if ($hash->{HELPER}{SNAPBYSTRMDEV} || $hash->{HELPER}{LSNAPBYSTRMDEV}) {
if ($hash->{HELPER}{INFORM} || $hash->{HELPER}{LSNAPBYSTRMDEV}) {
# Snap durch SSCamSTRM-Device ausgelöst
SSCam_refresh($hash,0,0,1); # kein Room-Refresh, kein SSCam-state-Event, SSCamSTRM-Event
delete $hash->{HELPER}{SNAPBYSTRMDEV};
delete $hash->{HELPER}{LSNAPBYSTRMDEV};
} elsif ($hash->{HELPER}{LSNAPBYDEV}) {
SSCam_refresh($hash,0,1,0); # kein Room-Refresh, SSCam-state-Event, kein SSCamSTRM-Event
@ -5550,26 +5628,6 @@ sub SSCam_camop_parse ($) {
} else {
SSCam_refresh($hash,0,0,0); # kein Room-Refresh, SSCam-state-Event, SSCamSTRM-Event
}
# longpoll für alle Streamingdevices v. Typ "lastsnap"
my @lsnapstrms = devspec2array("TYPE=SSCamSTRM:FILTER=PARENT=$name:FILTER=MODEL=lastsnap");
if(scalar(@lsnapstrms) >= 1) {
foreach (@lsnapstrms) {
if($defs{$_}) {
$hash->{HELPER}{STRMDEV} = $_;
SSCam_refresh($hash,0,0,1); # kein Room-Refresh, kein SSCam-state-Event, SSCamSTRM-Event
}
}
}
# longpoll für alle Streamingdevices v. Typ "snapgallery"
@lsnapstrms = devspec2array("TYPE=SSCamSTRM:FILTER=PARENT=$name:FILTER=MODEL=snapgallery");
if(scalar(@lsnapstrms) >= 1) {
foreach (@lsnapstrms) {
if($defs{$_}) {
$hash->{HELPER}{STRMDEV} = $_;
SSCam_refresh($hash,0,0,1); # kein Room-Refresh, kein SSCam-state-Event, SSCamSTRM-Event
}
}
}
} elsif ($OpMode eq "runliveview" && $hash->{HELPER}{RUNVIEW} =~ m/^live_.*hls$/) {
# HLS Streaming wurde aktiviert
@ -6653,13 +6711,11 @@ return($hash,$success,$myjson);
######################################################################################################
# Refresh eines Raumes aus $hash->{HELPER}{STRMROOM}
# bzw. Longpoll von SSCam bzw. eines SSCamSTRM Devices wenn
# $hash->{HELPER}{STRMDEV} gefüllt
# $hash, $pload (1=Page reload), SSCam-state-Event(1=Event), SSCamSTRM-Event (1=Event)
######################################################################################################
sub SSCam_refresh($$$$) {
my ($hash,$pload,$lpoll_scm,$lpoll_strm) = @_;
my $name;
my ($name,$st);
if (ref $hash ne "HASH")
{
($name,$pload,$lpoll_scm,$lpoll_strm) = split ",",$hash;
@ -6669,48 +6725,53 @@ sub SSCam_refresh($$$$) {
}
my $fpr = 0;
# Kontext des SSCamSTRM-Devices speichern für Refresh
my $sd = $hash->{HELPER}{STRMDEV}?$hash->{HELPER}{STRMDEV}:"\"n.a.\""; # Name des aufrufenden SSCamSTRM-Devices
my $sr = $hash->{HELPER}{STRMROOM}?$hash->{HELPER}{STRMROOM}:"\"n.a.\""; # Raum aus dem das SSCamSTRM-Device die Funktion aufrief
my $sl = $hash->{HELPER}{STRMDETAIL}?$hash->{HELPER}{STRMDETAIL}:"\"n.a.\""; # Name des SSCamSTRM-Devices (wenn Detailansicht)
$fpr = AttrVal($hash->{HELPER}{STRMDEV},"forcePageRefresh",0) if($hash->{HELPER}{STRMDEV});
Log3($name, 4, "$name - SSCam_refresh - caller: $sd, callerroom: $sr, detail: $sl, pload: $pload, forcePageRefresh: $fpr, event_STRMdev: $lpoll_strm");
# SSCamSTRM-Device mit hinterlegter FUUID ($hash->{HELPER}{INFORM}) selektieren
my @spgs = devspec2array("TYPE=SSCamSTRM");
my $room = "";
foreach(@spgs) {
if($defs{$_}{PARENT} eq $name) {
next if(IsDisabled($defs{$_}{NAME}) || !$hash->{HELPER}{INFORM} || $hash->{HELPER}{INFORM} ne $defs{$_}{FUUID});
$fpr = AttrVal($defs{$_}{NAME},"forcePageRefresh",0);
$room = AttrVal($defs{$_}{NAME},"room","");
Log3($name, 4, "$name - SSCam_refresh - pagerefresh: $defs{$_}{NAME}") if($fpr);
}
}
# Page-Reload
if($pload && $hash->{HELPER}{STRMROOM} && $hash->{HELPER}{STRMDETAIL}) {
if($hash->{HELPER}{STRMROOM} && !$hash->{HELPER}{STRMDETAIL} && !$fpr) {
Log3($name, 4, "$name - SSCam_refresh jetzt");
# trifft zu wenn in einer Raumansicht
my @rooms = split(",",$hash->{HELPER}{STRMROOM});
if($pload && $room) {
if(!$fpr) {
# nur Räume mit dem SSCamSTRM-Device reloaden
my @rooms = split(",",$room);
foreach (@rooms) {
my $room = $_;
{ map { FW_directNotify("FILTER=room=$room", "#FHEMWEB:$_", "location.reload('true')", "") } devspec2array("TYPE=FHEMWEB") }
my $r = $_;
{ map { FW_directNotify("FILTER=room=$r", "#FHEMWEB:$_", "location.reload('true')", "") } devspec2array("TYPE=FHEMWEB") }
}
} elsif ( !$hash->{HELPER}{STRMROOM} || $hash->{HELPER}{STRMDETAIL} || $fpr ) {
}
} elsif ($pload || $fpr) {
# trifft zu bei Detailansicht oder im FLOORPLAN bzw. Dashboard oder wenn Seitenrefresh mit dem
# SSCamSTRM-Attribut "forcePageRefresh" erzwungen wird
{ map { FW_directNotify("#FHEMWEB:$_", "location.reload('true')", "") } devspec2array("TYPE=FHEMWEB") }
}
} elsif ($fpr) {
# Seitenrefresh durch SSCamSTRM-Attribut "forcePageRefresh" erzwungen
{ map { FW_directNotify("#FHEMWEB:$_", "location.reload('true')", "") } devspec2array("TYPE=FHEMWEB") }
}
# Aufnahmestatus/Disabledstatus in state abbilden & SSCam-Device state setzen (mit/ohne Event)
my $st = (ReadingsVal($name, "Availability", "enabled") eq "disabled")?"disabled":(ReadingsVal($name, "Record", "") eq "Start")?"on":"off";
$st = (ReadingsVal($name, "Availability", "enabled") eq "disabled")?"disabled":(ReadingsVal($name, "Record", "") eq "Start")?"on":"off";
if($lpoll_scm) {
readingsSingleUpdate($hash,"state", $st, 1);
} else {
readingsSingleUpdate($hash,"state", $st, 0);
}
# parentState des SSCamSTRM-Device mit Opmode updaten (mit/ohne Event)
if($hash->{HELPER}{STRMDEV}) {
my $strmhash = $defs{$hash->{HELPER}{STRMDEV}};
if($lpoll_strm) {
readingsSingleUpdate($strmhash,"parentState", $hash->{OPMODE}, 1);
} else {
readingsSingleUpdate($strmhash,"parentState", $hash->{OPMODE}, 0);
# parentState des SSCamSTRM-Device updaten
$st = ReadingsVal($name, "state", "initialized");
foreach(@spgs) {
if($defs{$_}{PARENT} eq $name) {
next if(IsDisabled($defs{$_}{NAME}) || !$hash->{HELPER}{INFORM} || $hash->{HELPER}{INFORM} ne $defs{$_}{FUUID});
readingsBeginUpdate($defs{$_});
readingsBulkUpdate($defs{$_},"parentState", $st);
readingsBulkUpdate($defs{$_},"state", "updated");
readingsEndUpdate($defs{$_}, 1);
Log3($name, 4, "$name - SSCam_refresh - caller: $_, FUUID: $hash->{HELPER}{INFORM}");
delete $hash->{HELPER}{INFORM};
}
}
@ -6887,11 +6948,13 @@ return ($ret);
# konvertiere alle ptzPanel_rowXX-attribute zu html-Code für
# das generierte Widget und das weblink-Device ptzpanel_$name
###############################################################################
sub SSCam_ptzpanel($;$$) {
my ($name,$ptzcdev,$ptzcontrol) = @_;
sub SSCam_ptzpanel(@) {
my ($name,$ptzcdev,$ptzcontrol,$ftui) = @_;
my $hash = $defs{$name};
my $iconpath = AttrVal("$name","ptzPanel_iconPath","www/images/sscam");
my $iconprefix = AttrVal("$name","ptzPanel_iconPrefix","black_btn_");
my $pbs = AttrVal("$ptzcdev","ptzButtonSize", 100); # Größe der Druckbuttons in %
my $pbsf = AttrVal("$ptzcdev","ptzButtonSizeFTUI", 100); # Größe der Druckbuttons im FTUI in %
my $valPresets = ReadingsVal("$name","Presets","");
my $valPatrols = ReadingsVal("$name","Patrols","");
my $rowisset = 0;
@ -6900,7 +6963,8 @@ sub SSCam_ptzpanel($;$$) {
return "" if(SSCam_myVersion($hash) <= 71);
$ptz_ret = "<div class=\"ptzpanel\">";
$ptz_ret = "";
$ptz_ret .= "<style>TD.ptzcontrol {padding: 2px 2px;}</style>";
$ptz_ret .= '<table class="rc_body">';
foreach my $rownr (0..9) {
@ -6912,7 +6976,7 @@ sub SSCam_ptzpanel($;$$) {
my @btn = split (",",$row); # die Anzahl Buttons in einer Reihe
foreach my $btnnr (0..$#btn) {
$ptz_ret .= '<td class="rc_button">';
$ptz_ret .= '<td class="ptzcontrol">';
if ($btn[$btnnr] ne "") {
my $cmd;
my $img;
@ -6925,12 +6989,17 @@ sub SSCam_ptzpanel($;$$) {
}
if ($img =~ m/\.svg/) { # Verwendung für SVG's
$img = FW_makeImage($img, $cmd, "rc-button");
} else { # $FW_ME = URL-Pfad unter dem der FHEMWEB-Server via HTTP erreichbar ist, z.B. /fhem
if($ftui) {
$img = "<img src=\"$FW_ME/$iconpath/$iconprefix$img\" height=\"$pbsf%\" width=\"$pbsf%\">";
} else {
$img = "<img src=\"$FW_ME/$iconpath/$iconprefix$img\">"; # $FW_ME = URL-Pfad unter dem der FHEMWEB-Server via HTTP erreichbar ist, z.B. /fhem
$img = "<img src=\"$FW_ME/$iconpath/$iconprefix$img\" height=\"$pbs%\" width=\"$pbs%\">";
}
}
if ($cmd || $cmd eq "0") {
$cmd = "cmd=set $name $cmd";
$ptz_ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmd')\">$img</a>"; # $FW_subdir = Sub-path in URL, used by FLOORPLAN/weblink
my $cmd1 = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $name $cmd')"; # $FW_subdir = Sub-path in URL, used by FLOORPLAN/weblink
$cmd1 = "ftui.setFhemStatus('set $name $cmd')" if($ftui);
$ptz_ret .= "<a onClick=\"$cmd1\">$img</a>";
} else {
$ptz_ret .= $img;
}
@ -6942,11 +7011,10 @@ sub SSCam_ptzpanel($;$$) {
}
$ptz_ret .= "</table>";
$ptz_ret .= "</div>";
########################
# add Preset & Patrols
if(!$ftui) {
my ($Presets,$Patrols,$fn);
my $cmdPreset = "goPreset";
my $cmdPatrol = "runPatrol";
@ -6971,7 +7039,6 @@ sub SSCam_ptzpanel($;$$) {
last if(defined($Patrols));
}
# Rahmenklasse
$ptz_ret .= "<div class=\"ptzpanel\">";
$ptz_ret .= "<table class=\"rc_body\">";
@ -6998,6 +7065,7 @@ sub SSCam_ptzpanel($;$$) {
$ptz_ret .= "</div>";
#####################
}
if ($rowisset) {
return $ptz_ret;
@ -7088,8 +7156,8 @@ return;
# $fmt = Streaming Format
#
######################################################################################
sub SSCam_StreamDev($$$) {
my ($camname,$strmdev,$fmt) = @_;
sub SSCam_StreamDev($$$;$) {
my ($camname,$strmdev,$fmt,$ftui) = @_;
my $hash = $defs{$camname};
my $wltype = $hash->{HELPER}{WLTYPE};
my $serveraddr = $hash->{SERVERADDR};
@ -7106,47 +7174,77 @@ sub SSCam_StreamDev($$$) {
my $camid = $hash->{CAMID};
my $sid = $hash->{HELPER}{SID};
my $proto = $hash->{PROTOCOL};
my ($cause,$ret,$link,$audiolink,$devWlink,$wlhash,$alias,$wlalias);
$ftui = ($ftui && $ftui eq "ftui")?1:0;
my $hdrAlign = "center";
my ($cause,$ret,$link,$audiolink,$devWlink,$wlhash,$wlalias);
# Kontext des SSCamSTRM-Devices speichern für SSCam_refresh
$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
# Definition Tasten
my $imgblank = "<img src=\"$FW_ME/www/images/sscam/black_btn_CAMBLANK.png\">"; # nicht sichtbare Leertaste
my $cmdstop = "cmd=set $camname stopView"; # Stream deaktivieren
my $cmdstop = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname stopView STRM:$uuid')"; # Stream deaktivieren
my $imgstop = "<img src=\"$FW_ME/www/images/default/remotecontrol/black_btn_POWEROFF3.png\">";
my $cmdhlsreact = "cmd=set $camname hlsreactivate"; # HLS Stream reaktivieren
my $cmdhlsreact = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname hlsreactivate')"; # HLS Stream reaktivieren
my $imghlsreact = "<img src=\"$FW_ME/www/images/default/remotecontrol/black_btn_BACKDroid.png\">";
my $cmdmjpegrun = "cmd=set $camname runView live_fw"; # MJPEG Stream aktivieren
my $cmdmjpegrun = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname runView live_fw STRM:$uuid')"; # MJPEG Stream aktivieren
my $imgmjpegrun = "<img src=\"$FW_ME/www/images/sscam/black_btn_MJPEG.png\">";
my $cmdhlsrun = "cmd=set $camname runView live_fw_hls"; # HLS Stream aktivieren
my $cmdhlsrun = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname runView live_fw_hls STRM:$uuid')"; # HLS Stream aktivieren
my $imghlsrun = "<img src=\"$FW_ME/www/images/sscam/black_btn_HLS.png\">";
my $cmdlrirun = "cmd=set $camname runView lastrec_fw"; # Last Record IFrame
my $cmdlrirun = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname runView lastrec_fw STRM:$uuid')"; # Last Record IFrame
my $imglrirun = "<img src=\"$FW_ME/www/images/sscam/black_btn_LASTRECIFRAME.png\">";
my $cmdlh264run = "cmd=set $camname runView lastrec_fw_MPEG4/H.264"; # Last Record H.264
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
my $imglh264run = "<img src=\"$FW_ME/www/images/sscam/black_btn_LRECH264.png\">";
my $cmdlmjpegrun = "cmd=set $camname runView lastrec_fw_MJPEG"; # Last Record MJPEG
my $cmdlmjpegrun = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname runView lastrec_fw_MJPEG STRM:$uuid')"; # Last Record MJPEG
my $imglmjpegrun = "<img src=\"$FW_ME/www/images/sscam/black_btn_LRECMJPEG.png\">";
my $cmdlsnaprun = "cmd=set $camname runView lastsnap_fw STRM"; # Last SNAP
my $cmdlsnaprun = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname runView lastsnap_fw STRM:$uuid')"; # Last SNAP
my $imglsnaprun = "<img src=\"$FW_ME/www/images/sscam/black_btn_LSNAP.png\">";
my $cmdrecendless = "cmd=set $camname on 0"; # Endlosaufnahme Start
my $cmdrecendless = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname on 0 STRM:$uuid')"; # Endlosaufnahme Start
my $imgrecendless = "<img src=\"$FW_ME/www/images/sscam/black_btn_RECSTART.png\">";
my $cmdrecstop = "cmd=set $camname off"; # Aufnahme Stop
my $cmdrecstop = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname off STRM:$uuid')"; # Aufnahme Stop
my $imgrecstop = "<img src=\"$FW_ME/www/images/sscam/black_btn_RECSTOP.png\">";
my $cmddosnap = "cmd=set $camname snap 1 2 STRM"; # Snapshot auslösen mit Kennzeichnung "by STRM-Device"
my $cmddosnap = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname snap 1 2 STRM:$uuid')"; # Snapshot auslösen mit Kennzeichnung "by STRM-Device"
my $imgdosnap = "<img src=\"$FW_ME/www/images/sscam/black_btn_DOSNAP.png\">";
my $cmdrefresh = "cmd=set $camname refresh STRM"; # Refresh in SSCamSTRM-Devices
my $cmdrefresh = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $camname refresh STRM:$uuid')"; # Refresh in SSCamSTRM-Devices
my $imgrefresh = "<img src=\"$FW_ME/www/images/default/Restart.png\">";
# bei Aufruf durch FTUI Kommandosyntax anpassen
if ($ftui) {
$cmddosnap = "ftui.setFhemStatus('set $camname snap 1 2 STRM:$uuid')";
$cmdstop = "ftui.setFhemStatus('set $camname stopView STRM:$uuid')";
$cmdhlsreact = "ftui.setFhemStatus('set $camname hlsreactivate STRM:$uuid')";
$cmdmjpegrun = "ftui.setFhemStatus('set $camname runView live_fw STRM:$uuid')";
$cmdhlsrun = "ftui.setFhemStatus('set $camname runView live_fw_hls STRM:$uuid')";
$cmdlrirun = "ftui.setFhemStatus('set $camname runView lastrec_fw STRM:$uuid')";
$cmdlh264run = "ftui.setFhemStatus('set $camname runView lastrec_fw_MPEG4/H.264 STRM:$uuid')";
$cmdlmjpegrun = "ftui.setFhemStatus('set $camname runView lastrec_fw_MJPEG STRM:$uuid')";
$cmdlsnaprun = "ftui.setFhemStatus('set $camname runView lastsnap_fw STRM STRM:$uuid')";
$cmdrecendless = "ftui.setFhemStatus('set $camname on 0 STRM:$uuid')";
$cmdrecstop = "ftui.setFhemStatus('set $camname off STRM:$uuid')";
$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 htmattr Streaming-Device übersteuern
$ha = AttrVal($strmdev, "htmlattr", $ha); # htmlattr mit htmlattr Streaming-Device übersteuern
if($ftui) {
$ha = AttrVal($strmdev, "htmlattrFTUI", $ha); # wenn aus FTUI aufgerufen divers setzen
}
my $pws = AttrVal($strmdev, "popupWindowSize", ""); # Größe eines Popups
$pws =~ s/"//g if($pws);
my $show = $defs{$streamHash->{PARENT}}->{HELPER}{ACTSTRM} if($streamHash->{MODEL} =~ /switched/);
$show = $show?"($show)":"";
my $alias = AttrVal($strmdev, "alias", $strmdev); # Linktext als Aliasname oder Devicename setzen
my $dlink = "<a href=\"/fhem?detail=$strmdev\">$alias</a>";
my $StmKey = ReadingsVal($camname,"StmKey",undef);
# Javascript Bibliothek für Tooltips (http://www.walterzorn.de/tooltip/tooltip.htm#download) und Texte
@ -7183,13 +7281,18 @@ sub SSCam_StreamDev($$$) {
$ret = "";
$ret .= "<script type=\"text/javascript\" src=\"$ttjs\"></script>";
$ret .= '<table class="block wide internals">';
$ret .= '<table class="block wide internals" style="margin-left:auto;margin-right:auto">';
if($ftui) {
$ret .= "<span align=\"$hdrAlign\">$dlink $show </span><br>" if(!AttrVal($strmdev,"hideDisplayNameFTUI",0));
} else {
$ret .= "<span align=\"$hdrAlign\">$dlink $show </span><br>" if(!AttrVal($strmdev,"hideDisplayName",0));
}
$ret .= '<tbody>';
$ret .= '<tr class="odd">';
if(!$StmKey || ReadingsVal($camname, "Availability", "") ne "enabled" || IsDisabled($camname)) {
# Ausgabe bei Fehler
my $cam = AttrVal($camname, "alias", $camname);
my $cam = AttrVal($camname, "alias", $camname); # Linktext als Aliasname oder Devicename setzen
$cause = !$StmKey?"Camera $cam has no Reading \"StmKey\" set !":"Cam \"$cam\" is disabled";
$cause = "Camera \"$cam\" is disabled" if(IsDisabled($camname));
$ret .= "<td> <br> <b> $cause </b> <br><br></td>";
@ -7212,22 +7315,26 @@ sub SSCam_StreamDev($$$) {
if($apiaudiostmmaxver) {
$audiolink = "$proto://$serveraddr:$serverport/webapi/$apiaudiostmpath?api=$apiaudiostm&version=$apiaudiostmmaxver&method=Stream&cameraId=$camid&_sid=$sid";
}
if(!$ftui) {
$ret .= "<td><img src=$link $ha onClick=\"FW_okDialog('<img src=$link $pws>')\"><br>";
} else {
$ret .= "<td><img src=$link $ha><br>";
}
$streamHash->{HELPER}{STREAM} = "<img src=$link $pws>"; # Stream für "get <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
}
if(ReadingsVal($camname, "Record", "Stop") eq "Stop") {
# Aufnahmebutton endlos Start
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrecendless')\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
$ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
} else {
# Aufnahmebutton Stop
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrecstop')\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
}
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmddosnap')\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1)) {
my $ptz_ret = SSCam_ptzpanel($camname);
my $ptz_ret = SSCam_ptzpanel($camname,$strmdev,'',$ftui);
if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>";
}
@ -7246,8 +7353,12 @@ sub SSCam_StreamDev($$$) {
$link = $hash->{HELPER}{".LASTSNAP"};
my $gattr = (AttrVal($camname,"snapGallerySize","Icon") eq "Full")?$ha:"";
if($link) {
if(!$ftui) {
$ret .= "<td><img src='data:image/jpeg;base64,$link' $gattr onClick=\"FW_okDialog('<img src=data:image/jpeg;base64,$link $pws>')\"><br>";
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmddosnap')\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
} else {
$ret .= "<td><img src='data:image/jpeg;base64,$link' $gattr><br>";
}
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "</td>";
$streamHash->{HELPER}{STREAM} = "<img src=data:image/jpeg;base64,$link $pws>"; # Stream für "get <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
@ -7289,19 +7400,19 @@ sub SSCam_StreamDev($$$) {
}
$ret .= "<br>";
Log3($strmdev, 4, "$strmdev - generic Stream params:\n$htag");
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrefresh')\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= $imgblank;
if(ReadingsVal($camname, "Record", "Stop") eq "Stop") {
# Aufnahmebutton endlos Start
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrecendless')\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
$ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
} else {
# Aufnahmebutton Stop
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrecstop')\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
}
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmddosnap')\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1)) {
my $ptz_ret = SSCam_ptzpanel($camname);
my $ptz_ret = SSCam_ptzpanel($camname,$strmdev,'',$ftui);
if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>";
}
@ -7335,19 +7446,19 @@ sub SSCam_StreamDev($$$) {
$streamHash->{HELPER}{STREAM} = "<video $pws id=video_$d></video>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1; # Statusbit wenn ein Stream aktiviert ist
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrefresh')\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= $imgblank;
if(ReadingsVal($camname, "Record", "Stop") eq "Stop") {
# Aufnahmebutton endlos Start
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrecendless')\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
$ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
} else {
# Aufnahmebutton Stop
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrecstop')\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
}
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmddosnap')\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1)) {
my $ptz_ret = SSCam_ptzpanel($camname);
my $ptz_ret = SSCam_ptzpanel($camname,$strmdev,'',$ftui);
if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>";
}
@ -7362,25 +7473,29 @@ sub SSCam_StreamDev($$$) {
if(ReadingsVal($camname, "SVSversion", "8.2.3-5828") eq "8.2.3-5828" && ReadingsVal($camname, "CamVideoType", "") !~ /MJPEG/) {
$ret .= "<td> <br> <b> Because SVS version 8.2.3-5828 is running you cannot see the MJPEG-Stream. Please upgrade to a higher SVS version ! </b> <br><br>";
} else {
if(!$ftui) {
$ret .= "<td><img src=$link $ha onClick=\"FW_okDialog('<img src=$link $pws>')\"><br>" if($link);
} else {
$ret .= "<td><img src=$link $ha><br>" if($link);
}
$streamHash->{HELPER}{STREAM} = "<img src=$link $pws>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
}
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdstop')\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= $imgblank;
if($hash->{HELPER}{RUNVIEW} =~ /live_fw/) {
if(ReadingsVal($camname, "Record", "Stop") eq "Stop") {
# Aufnahmebutton endlos Start
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrecendless')\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
$ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
} else {
# Aufnahmebutton Stop
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrecstop')\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
}
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmddosnap')\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
}
$ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1) && $hash->{HELPER}{RUNVIEW} =~ /live_fw/) {
my $ptz_ret = SSCam_ptzpanel($camname);
my $ptz_ret = SSCam_ptzpanel($camname,$strmdev,'',$ftui);
if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>";
}
@ -7396,15 +7511,21 @@ sub SSCam_StreamDev($$$) {
}
} elsif ($wltype =~ /iframe/) {
if(!$ftui) {
$ret .= "<td><iframe src=$link $ha controls autoplay onClick=\"FW_okDialog('<img src=$link $pws>')\">
Iframes disabled
</iframe><br>" if($link);
} else {
$ret .= "<td><iframe src=$link $ha controls autoplay>
Iframes disabled
</iframe><br>" if($link);
}
$streamHash->{HELPER}{STREAM} = "<iframe src=$link $pws controls autoplay>".
"Iframes disabled".
"</iframe>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdstop')\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrefresh')\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= "</td>";
if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/) {
$ret .= '</tr>';
@ -7430,7 +7551,7 @@ sub SSCam_StreamDev($$$) {
"Your browser does not support the video tag".
"</video>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdstop')\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= "</td>";
if($hash->{HELPER}{AUDIOLINK} && ReadingsVal($camname, "CamAudioType", "Unknown") !~ /Unknown/) {
$ret .= '</tr>';
@ -7442,16 +7563,24 @@ sub SSCam_StreamDev($$$) {
$ret .= "<td></td>" if(AttrVal($camname,"ptzPanel_use",0));
}
} elsif($wltype =~ /base64img/) {
if(!$ftui) {
$ret .= "<td><img src='data:image/jpeg;base64,$link' $ha onClick=\"FW_okDialog('<img src=data:image/jpeg;base64,$link $pws>')\"><br>" if($link);
} else {
$ret .= "<td><img src='data:image/jpeg;base64,$link' $ha><br>" if($link);
}
$streamHash->{HELPER}{STREAM} = "<img src=data:image/jpeg;base64,$link $pws>"; # Stream für "get <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdstop')\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= $imgblank;
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmddosnap')\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "</td>";
} elsif($wltype =~ /embed/) {
if(!$ftui) {
$ret .= "<td><embed src=$link $ha onClick=\"FW_okDialog('<img src=$link $pws>')\"></td>" if($link);
} else {
$ret .= "<td><embed src=$link $ha></td>" if($link);
}
$streamHash->{HELPER}{STREAM} = "<embed src=$link $pws>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
@ -7467,21 +7596,21 @@ sub SSCam_StreamDev($$$) {
"Your browser does not support the video tag".
"</video>"; # Stream für "set <SSCamSTRM-Device> popupStream" speichern
$streamHash->{HELPER}{STREAMACTIVE} = 1 if($link); # Statusbit wenn ein Stream aktiviert ist
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdstop')\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrefresh')\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdhlsreact')\" onmouseover=\"Tip('$tthlsreact')\" onmouseout=\"UnTip()\">$imghlsreact </a>";
$ret .= "<a onClick=\"$cmdstop\" onmouseover=\"Tip('$ttcmdstop')\" onmouseout=\"UnTip()\">$imgstop </a>";
$ret .= "<a onClick=\"$cmdrefresh\" onmouseover=\"Tip('$ttrefresh')\" onmouseout=\"UnTip()\">$imgrefresh </a>";
$ret .= "<a onClick=\"$cmdhlsreact\" onmouseover=\"Tip('$tthlsreact')\" onmouseout=\"UnTip()\">$imghlsreact </a>";
$ret .= $imgblank;
if(ReadingsVal($camname, "Record", "Stop") eq "Stop") {
# Aufnahmebutton endlos Start
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrecendless')\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
$ret .= "<a onClick=\"$cmdrecendless\" onmouseover=\"Tip('$ttrecstart')\" onmouseout=\"UnTip()\">$imgrecendless </a>";
} else {
# Aufnahmebutton Stop
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdrecstop')\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
$ret .= "<a onClick=\"$cmdrecstop\" onmouseover=\"Tip('$ttrecstop')\" onmouseout=\"UnTip()\">$imgrecstop </a>";
}
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmddosnap')\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>";
$ret .= "</td>";
if(AttrVal($camname,"ptzPanel_use",1)) {
my $ptz_ret = SSCam_ptzpanel($camname);
my $ptz_ret = SSCam_ptzpanel($camname,$strmdev,'',$ftui);
if($ptz_ret) {
$ret .= "<td>$ptz_ret</td>";
}
@ -7493,12 +7622,12 @@ sub SSCam_StreamDev($$$) {
my $cam = AttrVal($camname, "alias", $camname);
$cause = "Playback cam \"$cam\" switched off";
$ret .= "<td> <br> <b> $cause </b> <br><br>";
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdmjpegrun')\" onmouseover=\"Tip('$ttmjpegrun')\" onmouseout=\"UnTip()\">$imgmjpegrun </a>";
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdhlsrun')\" onmouseover=\"Tip('$tthlsrun')\" onmouseout=\"UnTip()\">$imghlsrun </a>" if(SSCam_IsHLSCap($hash));
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdlrirun')\" onmouseover=\"Tip('$ttlrrun')\" onmouseout=\"UnTip()\">$imglrirun </a>";
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdlh264run')\" onmouseover=\"Tip('$tth264run')\" onmouseout=\"UnTip()\">$imglh264run </a>";
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdlmjpegrun')\" onmouseover=\"Tip('$ttlmjpegrun')\" onmouseout=\"UnTip()\">$imglmjpegrun </a>";
$ret .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmdlsnaprun')\" onmouseover=\"Tip('$ttlsnaprun')\" onmouseout=\"UnTip()\">$imglsnaprun </a>";
$ret .= "<a onClick=\"$cmdmjpegrun\" onmouseover=\"Tip('$ttmjpegrun')\" onmouseout=\"UnTip()\">$imgmjpegrun </a>";
$ret .= "<a onClick=\"$cmdhlsrun\" onmouseover=\"Tip('$tthlsrun')\" onmouseout=\"UnTip()\">$imghlsrun </a>" if(SSCam_IsHLSCap($hash));
$ret .= "<a onClick=\"$cmdlrirun\" onmouseover=\"Tip('$ttlrrun')\" onmouseout=\"UnTip()\">$imglrirun </a>";
$ret .= "<a onClick=\"$cmdlh264run\" onmouseover=\"Tip('$tth264run')\" onmouseout=\"UnTip()\">$imglh264run </a>";
$ret .= "<a onClick=\"$cmdlmjpegrun\" onmouseover=\"Tip('$ttlmjpegrun')\" onmouseout=\"UnTip()\">$imglmjpegrun </a>";
$ret .= "<a onClick=\"$cmdlsnaprun\" onmouseover=\"Tip('$ttlsnaprun')\" onmouseout=\"UnTip()\">$imglsnaprun </a>";
$ret .= "</td>";
}
} else {
@ -7564,8 +7693,8 @@ return $ret;
# Schnappschußgalerie zusammenstellen
# Verwendung durch SSCamSTRM-Devices
###############################################################################
sub SSCam_composegallery ($;$$) {
my ($name,$strmdev,$model) = @_;
sub SSCam_composegallery ($;$$$) {
my ($name,$strmdev,$model,$ftui) = @_;
my $hash = $defs{$name};
my $camname = $hash->{CAMNAME};
my $allsnaps = $hash->{HELPER}{".SNAPHASH"}; # = %allsnaps
@ -7575,6 +7704,9 @@ sub SSCam_composegallery ($;$$) {
my $limit = $hash->{HELPER}{SNAPLIMIT}; # abgerufene Anzahl Snaps
my $totalcnt = $hash->{HELPER}{TOTALCNT}; # totale Anzahl Snaps
$limit = $totalcnt if ($limit > $totalcnt); # wenn weniger Snaps vorhanden sind als $limit -> Text in Anzeige korrigieren
$ftui = ($ftui && $ftui eq "ftui")?1:0;
my $uuid = "";
my $hdrAlign = "center";
my $lupt = ((ReadingsTimestamp($name,"LastSnapTime"," ") gt ReadingsTimestamp($name,"LastUpdateTime"," "))
? ReadingsTimestamp($name,"LastSnapTime"," ")
: ReadingsTimestamp($name,"LastUpdateTime"," ")); # letzte Aktualisierung
@ -7584,22 +7716,35 @@ sub SSCam_composegallery ($;$$) {
$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} if($strmdev); # Hash des SSCamSTRM-Devices
delete $streamHash->{HELPER}{STREAM};
my $cmddosnap = "cmd=set $name snap 1 2 STRM"; # Snapshot auslösen mit Kennzeichnung "by STRM-Device"
if($strmdev) {
my $streamHash = $defs{$strmdev}; # Hash des SSCamSTRM-Devices
$uuid = $streamHash->{FUUID}; # eindeutige UUID des Streamingdevices
delete $streamHash->{HELPER}{STREAM};
}
my $cmddosnap = "FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $name snap 1 2 STRM:$uuid')"; # Snapshot auslösen mit Kennzeichnung "by STRM-Device"
my $imgdosnap = "<img src=\"$FW_ME/www/images/sscam/black_btn_DOSNAP.png\">";
# bei Aufruf durch FTUI Kommandosyntax anpassen
if($ftui) {
$cmddosnap = "ftui.setFhemStatus('set $name snap 1 2 STRM:$uuid')";
}
my $ha = AttrVal($name, "snapGalleryHtmlAttr", AttrVal($name, "htmlattr", 'width="500" height="325"'));
my $alias = AttrVal($strmdev, "alias", $strmdev); # Linktext als Aliasname oder Devicename setzen
my $dlink = "<a href=\"/fhem?detail=$strmdev\">$alias</a>";
# falls "SSCam_composegallery" durch ein SSCamSTRM-Device aufgerufen wird
my $devWlink = "";
my $pws = "";
if ($strmdev) {
$pws = AttrVal($strmdev, "popupWindowSize", ""); # Größe eines Popups (umgelegt: Forum:https://forum.fhem.de/index.php/topic,45671.msg927912.html#msg927912)
$pws =~ s/"//g if($pws);
my $wlha = AttrVal($strmdev, "htmlattr", undef);
$ha = (defined($wlha))?$wlha:$ha; # htmlattr vom SSCamSTRM-Device übernehmen falls von SSCamSTRM-Device aufgerufen und gesetzt
$ha = AttrVal($strmdev, "htmlattr", $ha); # htmlattr vom SSCamSTRM-Device übernehmen falls von SSCamSTRM-Device aufgerufen und gesetzt
if($ftui) {
$ha = AttrVal($strmdev, "htmlattrFTUI", $ha); # wenn aus FTUI aufgerufen divers setzen
}
}
# wenn SSCamSTRM-device genutzt wird und attr "snapGalleryBoost" nicht gesetzt ist -> Warnung in Gallerie ausgeben
@ -7611,19 +7756,26 @@ sub SSCam_composegallery ($;$$) {
# Javascript Bibliothek für Tooltips (http://www.walterzorn.de/tooltip/tooltip.htm#download) und Texte
my $ttjs = "/fhem/pgm2/sscam_tooltip.js";
my ($ttsnap);
if(AttrVal("global","language","EN") =~ /EN/) {
$ttsnap = $SSCam_ttips_en{"ttsnap"}; $ttsnap =~ s/§NAME§/$camname/g;
} else {
my $ttsnap = $SSCam_ttips_en{"ttsnap"}; $ttsnap =~ s/§NAME§/$camname/g;
if(AttrVal("global","language","EN") =~ /DE/) {
$ttsnap = $SSCam_ttips_de{"ttsnap"}; $ttsnap =~ s/§NAME§/$camname/g;
}
# Header Generierung
my $header;
if($ftui) {
$header .= "$dlink <br>" if(!AttrVal($strmdev,"hideDisplayNameFTUI",0));
} else {
$header .= "$dlink <br>" if(!AttrVal($strmdev,"hideDisplayName",0));
}
if ($lang eq "EN") {
$header = "Snapshots ($limit/$totalcnt) of camera <b>$camname</b> - newest Snapshot: $lss<br>";
$header .= "Snapshots ($limit/$totalcnt) of camera <b>$camname</b> - newest Snapshot: $lss<br>";
$header .= " (Possibly another snapshots are available. Last recall: $lupt)<br>" if(AttrVal($name,"snapGalleryBoost",0));
} else {
$header = "Schnappschüsse ($limit/$totalcnt) von Kamera <b>$camname</b> - neueste Aufnahme: $lss <br>";
$header .= "Schnappschüsse ($limit/$totalcnt) von Kamera <b>$camname</b> - neueste Aufnahme: $lss <br>";
$lupt =~ /(\d+)-(\d\d)-(\d\d)\s+(.*)/;
$lupt = "$3.$2.$1 $4";
$header .= " (Eventuell sind neuere Aufnahmen verfügbar. Letzter Abruf: $lupt)<br>" if(AttrVal($name,"snapGalleryBoost",0));
}
$header .= $sgbnote;
@ -7635,8 +7787,8 @@ sub SSCam_composegallery ($;$$) {
my ($htmlCode,$ct);
$htmlCode = "<html>";
$htmlCode .= "<script type=\"text/javascript\" src=\"$ttjs\"></script>";
$htmlCode .= sprintf("$devWlink <div class=\"makeTable wide\"; style=\"text-align:center\"> $header <br>");
$htmlCode .= "<table class=\"block wide internals\">";
$htmlCode .= "<div class=\"makeTable wide\"; style=\"text-align:$hdrAlign\"> $header <br>";
$htmlCode .= '<table class="block wide internals" style="margin-left:auto;margin-right:auto">';
$htmlCode .= "<tbody>";
$htmlCode .= "<tr class=\"odd\">";
my $cell = 1;
@ -7644,7 +7796,9 @@ sub SSCam_composegallery ($;$$) {
foreach my $key (@as) {
$ct = $allsnaps->{$key}{createdTm};
my $idata = "";
if(!$ftui) {
$idata = "onClick=\"FW_okDialog('<img src=data:image/jpeg;base64,$allsnaps->{$key}{imageData} $pws>')\"" if(AttrVal($name,"snapGalleryBoost",0));
}
my $html = sprintf("<td>$ct<br> <img src=\"data:image/jpeg;base64,$allsnaps->{$key}{imageData}\" $gattr $idata> </td>" );
$cell++;
@ -7666,7 +7820,7 @@ sub SSCam_composegallery ($;$$) {
$htmlCode .= "</tbody>";
$htmlCode .= "</table>";
$htmlCode .= "</div>";
$htmlCode .= "<a onClick=\"FW_cmd('$FW_ME$FW_subdir?XHR=1&$cmddosnap')\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>" if($strmdev);
$htmlCode .= "<a onClick=\"$cmddosnap\" onmouseover=\"Tip('$ttsnap')\" onmouseout=\"UnTip()\">$imgdosnap </a>" if($strmdev);
$htmlCode .= "</html>";
return $htmlCode;
@ -9155,7 +9309,14 @@ return;
For example the recordings are stored for a defined time in Surveillance Station and will be deleted after that period.<br><br>
If you like to discuss or help to improve this module please use FHEM-Forum with link: <br>
<a href="http://forum.fhem.de/index.php/topic,45671.msg374390.html#msg374390">49_SSCam: Fragen, Hinweise, Neuigkeiten und mehr rund um dieses Modul</a>.<br><br>
<a href="http://forum.fhem.de/index.php/topic,45671.msg374390.html#msg374390">49_SSCam: Fragen, Hinweise, Neuigkeiten und mehr rund um dieses Modul</a>.
<br><br>
<b>Integration into FHEM TabletUI: </b> <br><br>
There is a widget provided for integration of SSCam-Streaming devices (Type SSCamSTRM) into FTUI. For further information please be informed by the
(german) FHEM Wiki article: <br>
<a href="https://wiki.fhem.de/wiki/FTUI_Widget_f%C3%BCr_SSCam_Streaming_Devices_(SSCamSTRM)">FTUI Widget für SSCam Streaming Devices (SSCamSTRM)</a>.
<br><br><br>
<b>Prerequisites </b> <br><br>
<ul>
@ -9202,7 +9363,7 @@ return;
command in a previously defined SVS device.
<br><br>
A <b>camera</b> is defined by: <br><br>
A <b>camera device</b> is defined by: <br><br>
<ul>
<b><code>define &lt;Name&gt; SSCAM &lt;camera name in SVS&gt; &lt;ServerAddr&gt; [Port] [Protocol]</code></b> <br><br>
</ul>
@ -9266,6 +9427,7 @@ return;
panel can be affected by <a href="#SSCamattr">attributes</a> "ptzPanel_.*". <br>
Please see also <a href="#SSCamset">command</a> <b>"set &lt;name&gt; createPTZcontrol"</b> in this context.
<br><br><br>
</ul>
<a name="SSCam_Credentials"></a>
@ -10910,7 +11072,14 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
<a href="http://forum.fhem.de/index.php/topic,45671.msg374390.html#msg374390">49_SSCam: Fragen, Hinweise, Neuigkeiten und mehr rund um dieses Modul</a>.<br><br>
Weitere Infomationen zum Modul sind im FHEM-Wiki zu finden:<br>
<a href="http://www.fhemwiki.de/wiki/SSCAM_-_Steuerung_von_Kameras_in_Synology_Surveillance_Station">SSCAM - Steuerung von Kameras in Synology Surveillance Station</a>.<br><br>
<a href="http://www.fhemwiki.de/wiki/SSCAM_-_Steuerung_von_Kameras_in_Synology_Surveillance_Station">SSCAM - Steuerung von Kameras in Synology Surveillance Station</a>.
<br><br>
<b>Integration in FHEM TabletUI: </b> <br><br>
Zur Integration von SSCam Streaming Devices (Typ SSCamSTRM) wird ein Widget bereitgestellt.
Für weitere Information dazu bitte den Artikel im Wiki durchlesen: <br>
<a href="https://wiki.fhem.de/wiki/FTUI_Widget_f%C3%BCr_SSCam_Streaming_Devices_(SSCamSTRM)">FTUI Widget für SSCam Streaming Devices (SSCamSTRM)</a>.
<br><br><br>
<b>Vorbereitung </b> <br><br>

View File

@ -35,6 +35,8 @@ eval "use FHEM::Meta;1" or my $modMetaAbsent = 1;
# Versions History intern
our %SSCamSTRM_vNotesIntern = (
"2.7.0" => "15.07.2019 FTUI support, new attributes htmlattrFTUI, hideDisplayNameFTUI, ptzButtonSize, ptzButtonSizeFTUI ",
"2.6.0" => "21.06.2019 GetFn -> get <name> html ",
"2.5.0" => "27.03.2019 add Meta.pm support ",
"2.4.0" => "24.02.2019 support for \"genericStrmHtmlTag\" in streaming device MODEL generic ",
"2.3.0" => "04.02.2019 SSCamSTRM_Rename / SSCamSTRM_Copy added, Streaming device can now be renamed or copied ",
@ -61,12 +63,10 @@ our %SSCamSTRM_vNotesIntern = (
);
# Standardvariablen und Forward-Declaration
sub SSCam_ptzpanel($;$$);
sub SSCam_StreamDev($$$);
sub SSCam_ptzpanel(@);
sub SSCam_StreamDev($$$;$);
sub SSCam_getclhash($;$$);
# my $hlsjs = "hls.js"; # hls.js Release von Seite https://github.com/video-dev/hls.js/releases
################################################################
sub SSCamSTRM_Initialize($) {
my ($hash) = @_;
@ -75,16 +75,21 @@ sub SSCamSTRM_Initialize($) {
$hash->{DefFn} = "SSCamSTRM_Define";
$hash->{SetFn} = "SSCamSTRM_Set";
$hash->{GetFn} = "SSCamSTRM_Get";
$hash->{AttrList} = "autoRefresh:selectnumbers,120,0.2,1800,0,log10 ".
"autoRefreshFW:$fwd ".
"disable:1,0 ".
"forcePageRefresh:1,0 ".
"genericStrmHtmlTag ".
"htmlattr ".
"htmlattrFTUI ".
"hideDisplayName:1,0 ".
"hideDisplayNameFTUI:1,0 ".
"popupWindowSize ".
"popupStreamFW:$fwd ".
"popupStreamTo:OK,1,2,3,4,5,6,7,8,9,10,15,20,25,30,40,50,60 ".
"ptzButtonSize:selectnumbers,50,5,100,0,lin ".
"ptzButtonSizeFTUI:selectnumbers,50,5,100,0,lin ".
$readingFnAttributes;
$hash->{RenameFn} = "SSCamSTRM_Rename";
$hash->{CopyFn} = "SSCamSTRM_Copy";
@ -134,7 +139,10 @@ sub SSCamSTRM_Rename($$) {
return;
}
################################################################
###############################################################
# SSCamSTRM Copy
# passt die Deviceparameter bei kopierten Device an
###############################################################
sub SSCamSTRM_Copy($$) {
my ($old_name,$new_name) = @_;
my $hash = $defs{$new_name};
@ -145,6 +153,27 @@ sub SSCamSTRM_Copy($$) {
return;
}
###############################################################
# SSCamSTRM Get
###############################################################
sub SSCamSTRM_Get($@) {
my ($hash, @a) = @_;
return "\"get X\" needs at least an argument" if ( @a < 2 );
my $name = shift @a;
my $cmd = shift @a;
if ($cmd eq "html") {
return SSCamSTRM_AsHtml($hash);
}
if ($cmd eq "ftui") {
return SSCamSTRM_AsHtml($hash,"ftui");
}
return undef;
return "Unknown argument $cmd, choose one of html:noArg";
}
################################################################
sub SSCamSTRM_Set($@) {
my ($hash, @a) = @_;
@ -244,14 +273,8 @@ sub SSCamSTRM_FwFn($;$$$) {
$hash->{HELPER}{FW} = $FW_wname;
$link = AnalyzePerlCommand(undef, $link) if($link =~ m/^{(.*)}$/s);
my $show = $defs{$hash->{PARENT}}->{HELPER}{ACTSTRM} if($hash->{MODEL} =~ /switched/);
$show = $show?"($show)":"";
my $alias = AttrVal($d, "alias", $d); # Linktext als Aliasname oder Devicename setzen
my $dlink = "<a href=\"/fhem?detail=$d\">$alias</a>";
my $ret = "";
$ret .= "<span>$dlink $show</span><br>" if(!AttrVal($d,"hideDisplayName",0));
if(IsDisabled($d)) {
if(AttrVal($d,"hideDisplayName",0)) {
$ret .= "Stream-device <a href=\"/fhem?detail=$d\">$d</a> is disabled";
@ -327,6 +350,39 @@ sub SSCamSTRM_setVersionInfo($) {
return;
}
################################################################
# Grafik als HTML zurück liefern (z.B. für Widget)
################################################################
sub SSCamSTRM_AsHtml($;$) {
my ($hash,$ftui) = @_;
my $name = $hash->{NAME};
my $link = $hash->{LINK};
if ($ftui && $ftui eq "ftui") {
# Aufruf aus TabletUI -> FW_cmd ersetzen gemäß FTUI Syntax
my $s = substr($link,0,length($link)-2);
$link = $s.",'$ftui')}";
}
$link = AnalyzePerlCommand(undef, $link) if($link =~ m/^{(.*)}$/s);
my $ret = "<html>";
if(IsDisabled($name)) {
if(AttrVal($name,"hideDisplayName",0)) {
$ret .= "Stream-device <a href=\"/fhem?detail=$name\">$name</a> is disabled";
} else {
$ret .= "Stream-device is disabled";
}
} else {
$ret .= $link;
}
$ret .= "</html>";
return $ret;
}
1;
=pod
@ -337,6 +393,7 @@ return;
<a name="SSCamSTRM"></a>
<h3>SSCamSTRM</h3>
<br>
<ul>
The module SSCamSTRM is a special device module synchronized to the SSCam module. It is used for definition of
Streaming-Devices. <br>
Dependend of the Streaming-Device state, different buttons are provided to start actions:
@ -359,6 +416,13 @@ Dependend of the Streaming-Device state, different buttons are provided to start
</ul>
<br>
<b>Integration into FHEM TabletUI: </b> <br><br>
There is a widget provided for integration of SSCam-Streaming devices into FTUI. For further information please be informed by the
(german) FHEM Wiki article: <br>
<a href="https://wiki.fhem.de/wiki/FTUI_Widget_f%C3%BCr_SSCam_Streaming_Devices_(SSCamSTRM)">FTUI Widget für SSCam Streaming Devices (SSCamSTRM)</a>.
<br><br>
</ul>
<ul>
<a name="SSCamSTRMdefine"></a>
<b>Define</b>
@ -390,7 +454,17 @@ Dependend of the Streaming-Device state, different buttons are provided to start
<br>
<a name="SSCamSTRMget"></a>
<b>Get</b> <ul>N/A</ul><br>
<b>Get</b>
<ul>
<br>
<ul>
<li><b> get &lt;name&gt; html </b> </li>
The stream object (camera live view, snapshots or replay) is fetched as HTML-code and depicted.
</ul>
<br>
<br>
</ul>
<a name="SSCamSTRMattr"></a>
<b>Attributes</b>
@ -459,13 +533,30 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
</li>
<br>
<a name="hideDisplayNameFTUI"></a>
<li><b>hideDisplayNameFTUI</b><br>
Hide the device/alias name (link to detail view) in FHEM TabletUI.
</li>
<br>
<a name="htmlattr"></a>
<li><b>htmlattr</b><br>
Additional HTML tags to manipulate the streaming device.
<br><br>
<ul>
<b>Example: </b><br>
attr &lt;name&gt; htmlattr width="480" height="560" <br>
attr &lt;name&gt; htmlattr width="580" height="460" <br>
</ul>
</li>
<br>
<a name="htmlattrFTUI"></a>
<li><b>htmlattrFTUI</b><br>
Additional HTML tags to manipulate the streaming device in TabletUI.
<br><br>
<ul>
<b>Example: </b><br>
attr &lt;name&gt; htmlattr width="580" height="460" <br>
</ul>
</li>
<br>
@ -502,6 +593,18 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
attr &lt;name&gt; popupWindowSize width="600" height="425" <br>
</ul>
</li>
<br>
<a name="ptzButtonSize"></a>
<li><b>ptzButtonSize</b><br>
Specifies the PTZ-panel button size (in %).
</li>
<br>
<a name="ptzButtonSizeFTUI"></a>
<li><b>ptzButtonSizeFTUI</b><br>
Specifies the PTZ-panel button size used in a Tablet UI (in %).
</li>
</ul>
</ul>
@ -513,7 +616,7 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
<a name="SSCamSTRM"></a>
<h3>SSCamSTRM</h3>
<ul>
<br>
Das Modul SSCamSTRM ist ein mit SSCam abgestimmtes Gerätemodul zur Definition von Streaming-Devices. <br>
Abhängig vom Zustand des Streaming-Devices werden zum Start von Aktionen unterschiedliche Drucktasten angeboten:
@ -536,6 +639,13 @@ Abhängig vom Zustand des Streaming-Devices werden zum Start von Aktionen unters
</ul>
<br>
<b>Integration in FHEM TabletUI: </b> <br><br>
Zur Integration von SSCam Streaming Devices (Typ SSCamSTRM) wird ein Widget bereitgestellt.
Für weitere Information dazu bitte den Artikel im Wiki durchlesen: <br>
<a href="https://wiki.fhem.de/wiki/FTUI_Widget_f%C3%BCr_SSCam_Streaming_Devices_(SSCamSTRM)">FTUI Widget für SSCam Streaming Devices (SSCamSTRM)</a>.
<br><br><br>
</ul>
<ul>
<a name="SSCamSTRMdefine"></a>
<b>Define</b>
@ -568,7 +678,18 @@ Abhängig vom Zustand des Streaming-Devices werden zum Start von Aktionen unters
<br>
<a name="SSCamSTRMget"></a>
<b>Get</b> <ul>N/A</ul><br>
<b>Get</b>
<ul>
<br>
<ul>
<li><b> get &lt;name&gt; html </b> </li>
Das eingebundene Streamobjekt (Kamera Live View, Schnappschüsse oder Wiedergabe einer Aufnahme) wird als HTML-code
abgerufen und dargestellt.
</ul>
<br>
<br>
</ul>
<a name="SSCamSTRMattr"></a>
<b>Attribute</b>
@ -637,13 +758,30 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
</li>
<br>
<a name="hideDisplayNameFTUI"></a>
<li><b>hideDisplayNameFTUI</b><br>
Verbirgt den Device/Alias-Namen (Link zur Detailansicht) im TabletUI.
</li>
<br>
<a name="htmlattr"></a>
<li><b>htmlattr</b><br>
Zusätzliche HTML Tags zur Darstellungsänderung im Streaming Device.
Zusätzliche HTML Tags zur Darstellung im Streaming Device.
<br><br>
<ul>
<b>Beispiel: </b><br>
attr &lt;name&gt; htmlattr width="480" height="560" <br>
attr &lt;name&gt; htmlattr width="580" height="460" <br>
</ul>
</li>
<br>
<a name="htmlattrFTUI"></a>
<li><b>htmlattrFTUI</b><br>
Zusätzliche HTML Tags zur Darstellung des Streaming Device im TabletUI.
<br><br>
<ul>
<b>Beispiel: </b><br>
attr &lt;name&gt; htmlattr width="580" height="460" <br>
</ul>
</li>
<br>
@ -679,6 +817,18 @@ attr &lt;name&gt; genericStrmHtmlTag &lt;img $HTMLATTR
attr &lt;name&gt; popupWindowSize width="600" height="425" <br>
</ul>
</li>
<br>
<a name="ptzButtonSize"></a>
<li><b>ptzButtonSize</b><br>
Legt die Größe der Drucktasten des PTZ Paneels fest (in %).
</li>
<br>
<a name="ptzButtonSizeFTUI"></a>
<li><b>ptzButtonSizeFTUI</b><br>
Legt die Größe der Drucktasten des PTZ Paneels in einem Tablet UI fest (in %).
</li>
</ul>
</ul>