diff --git a/fhem/CHANGED b/fhem/CHANGED index c99bc851f..a3a24c807 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,8 @@ # 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. + - change: 49_SSCam: version 2.2.1, last record playback possible as iFrame, + deviceoverview available, + CAUTION - syntax of runView options has been changed !! - change: 22_HOMEMODE: v1.1.0 please change %ALARM% to %ALARMHR% - change: 93_DbRep: version 4.15.0, limitation of fetchrows result to 1000 adjustable by attr limit, performance increased in many diff --git a/fhem/FHEM/49_SSCam.pm b/fhem/FHEM/49_SSCam.pm index d38e9e886..ed7dcc4d1 100644 --- a/fhem/FHEM/49_SSCam.pm +++ b/fhem/FHEM/49_SSCam.pm @@ -27,6 +27,11 @@ ######################################################################################################################### # Versions History: # +# 2.2.1 15.05.2017 avoid FW_detailFn because of FW_deviceOverview is active (double streams in detailview if on) +# 2.2.0 10.05.2017 check if JSON module has been loaded successfully, DeviceOverview available, options of +# runView changed image->live_fw, link->live_link, link_open->live_open, lastrec ->lastrec_fw, +# commandref revised +# 2.1.4 08.05.2017 commandref changed # 2.1.3 05.05.2017 issue of operation error if CAMID is set and SID isn't valid, more login-errorcodes evaluation # 2.1.2 04.05.2017 default login retries increased to 3 # 2.1.1 17.04.2017 runliveview routine changed, {HELPER}{SID_STRM} deleted @@ -43,8 +48,7 @@ # 1.35 17.09.2016 internal timer of start-routines optimized # 1.34 15.09.2016 simu_SVSversion changed, added 407 errorcode message, external recording changed # for SVS 7.2 -# 1.33 21.08.2016 function get stmUrlPath added, fit to new commandref style, attribute showStmInfoFull -# added +# 1.33 21.08.2016 function get stmUrlPath added, fit to new commandref style, attribute showStmInfoFull added # 1.32.1 18.08.2016 empty event LastSnapId fixed # 1.32 17.08.2016 Logging of verbose 4 changed # 1.31 15.08.2016 Attr "noQuotesForSID" added, avoid possible 402 - permission denied problems @@ -154,9 +158,9 @@ # package main; - -use JSON qw( decode_json ); # from CPAN, Debian: apt-get install libjson-perl -use Data::Dumper; # Perl Core module + +eval "use JSON qw( decode_json );1" or my $SScamMMDBI = "JSON"; # Debian: apt-get install libjson-perl +use Data::Dumper; # Perl Core module use strict; use warnings; use MIME::Base64; @@ -164,7 +168,7 @@ use Time::HiRes; use HttpUtils; # no if $] >= 5.017011, warnings => 'experimental'; -my $SSCamVersion = "2.1.3"; +my $SSCamVersion = "2.2.1"; # Aufbau Errorcode-Hashes (siehe Surveillance Station Web API) my %SSCam_errauthlist = ( @@ -218,8 +222,9 @@ sub SSCam_Initialize($) { $hash->{GetFn} = "SSCam_Get"; $hash->{AttrFn} = "SSCam_Attr"; # Aufrufe aus FHEMWEB - $hash->{FW_summaryFn} = "SSCam_liveview"; - $hash->{FW_detailFn} = "SSCam_liveview"; + $hash->{FW_summaryFn} = "SSCam_FWview"; + # $hash->{FW_detailFn} = "SSCam_FWview"; + $hash->{FW_deviceOverview} = 1; $hash->{AttrList} = "disable:1,0 ". @@ -253,6 +258,8 @@ sub SSCam_Define { my ($hash, $def) = @_; my $name = $hash->{NAME}; + return "Error: Perl module ".$SScamMMDBI." is missing. Install it on Debian with: sudo apt-get install libjson-perl" if($SScamMMDBI); + my @a = split("[ \t][ \t]*", $def); if(int(@a) < 4) { @@ -400,7 +407,7 @@ sub SSCam_Set { "snap ". "enable ". "disable ". - "runView:image,lastrec,lastrec_open,link,link_open ". + "runView:live_fw,live_link,live_open,lastrec_fw,lastrec_open ". "stopView:noArg ". "extevent:1,2,3,4,5,6,7,8,9,10 ". ((ReadingsVal("$name", "CapPTZPan", "false") ne "false") ? "runPatrol:".ReadingsVal("$name", "Patrols", "")." " : ""). @@ -572,19 +579,35 @@ sub SSCam_Set { return "module is deactivated" if(IsDisabled($name)); if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\"";} - if ($prop eq "link_open") { - $prop = "link"; + if ($prop eq "live_open") { if ($prop1) {$hash->{HELPER}{VIEWOPENROOM} = $prop1;} else {delete $hash->{HELPER}{VIEWOPENROOM};} $hash->{HELPER}{OPENWINDOW} = 1; - $hash->{HELPER}{WLTYPE} = $prop; - } elsif ($prop eq "lastrec_open") { - $prop = "lastrec"; - if ($prop1) {$hash->{HELPER}{VIEWOPENROOM} = $prop1;} else {delete $hash->{HELPER}{VIEWOPENROOM};} - $hash->{HELPER}{OPENWINDOW} = 1; - $hash->{HELPER}{WLTYPE} = $prop; - } else { + $hash->{HELPER}{WLTYPE} = "link"; + $hash->{HELPER}{ALIAS} = "LiveView"; + $hash->{HELPER}{RUNVIEW} = "live_open"; + } elsif ($prop eq "live_link") { $hash->{HELPER}{OPENWINDOW} = 0; - $hash->{HELPER}{WLTYPE} = $prop; + $hash->{HELPER}{WLTYPE} = "link"; + $hash->{HELPER}{ALIAS} = "LiveView"; + $hash->{HELPER}{RUNVIEW} = "live_link"; + } elsif ($prop eq "lastrec_open") { + if ($prop1) {$hash->{HELPER}{VIEWOPENROOM} = $prop1;} else {delete $hash->{HELPER}{VIEWOPENROOM};} + $hash->{HELPER}{OPENWINDOW} = 1; + $hash->{HELPER}{WLTYPE} = "link"; + $hash->{HELPER}{ALIAS} = "LastRecording"; + $hash->{HELPER}{RUNVIEW} = "lastrec_open"; + } elsif ($prop eq "lastrec_fw") { + $hash->{HELPER}{OPENWINDOW} = 0; + $hash->{HELPER}{WLTYPE} = "iframe"; + $hash->{HELPER}{ALIAS} = " "; + $hash->{HELPER}{RUNVIEW} = "lastrec"; + } elsif ($prop eq "live_fw") { + $hash->{HELPER}{OPENWINDOW} = 0; + $hash->{HELPER}{WLTYPE} = "image"; + $hash->{HELPER}{ALIAS} = " "; + $hash->{HELPER}{RUNVIEW} = "live_fw"; + } else { + return "$prop isn't a valid option of runview, use one of live_fw, live_link, live_open, lastrec_fw, lastrec_open"; } runliveview($hash); @@ -664,8 +687,10 @@ return; ###################################################################################### # Kamera Liveview Anzeige in FHEMWEB ###################################################################################### -sub SSCam_liveview ($$$$) { - my ($FW_wname, $d, $room, $pageHash) = @_; # pageHash für summaryFn in FHEMWEB +# wird von FW aufgerufen. $FW_wname = aufrufende Webinstanz, $d = aufrufendes +# Device (z.B. CamCP1) +sub SSCam_FWview ($$$$) { + my ($FW_wname, $d, $room, $pageHash) = @_; # # pageHash is set for summaryFn in FHEMWEB my $hash = $defs{$d}; my $name = $hash->{NAME}; my $link = $hash->{HELPER}{LINK}; @@ -675,25 +700,21 @@ sub SSCam_liveview ($$$$) { return if(!$hash->{HELPER}{LINK} || ReadingsVal("$name", "state", "") =~ /^dis.*/ || IsDisabled($name)); + Log3($name, 5, "$name - SSCam_FWview called by FW_wname: $FW_wname, device: $d, room: $room"); my $attr = AttrVal($d, "htmlattr", ""); if($wltype eq "image") { - $ret = "
"; + $ret = "
" .weblink_FwDetail($d); } elsif($wltype eq "iframe") { - $ret = ""; + $ret = "" .weblink_FwDetail($d); } elsif($wltype eq "link") { - # $alias = AttrVal($d, "alias", $d)."_liveview"; - $alias = "LiveCam"; + $alias = $hash->{HELPER}{ALIAS}; $ret = "$alias
"; # wenn attr target=_blank neuer Browsertab - - } elsif($wltype eq "lastrec") { - $alias = "LastRecording"; - $ret = "$alias
"; # wenn attr target=_blank neuer Browsertab - + } - + # FW_directNotify("FILTER=room=$room", "#FHEMWEB:$FW_wname", "location.reload('true')", "") if($d eq $name); return $ret; } @@ -1242,7 +1263,7 @@ sub stopliveview ($) { if ($hash->{HELPER}{ACTIVE} eq "off") { - # kurzer state-switch -> Browser aktualisieren + # kurzer state-switch -> Browser aktualisieren readingsSingleUpdate($hash,"state","stopview",1); # Liveview stoppen @@ -1262,6 +1283,7 @@ sub stopliveview ($) { # Reading LiveStreamUrl löschen delete($defs{$name}{READINGS}{LiveStreamUrl}) if ($defs{$name}{READINGS}{LiveStreamUrl}); + # vorhandenen Aufnahmestatus wieder herstellen if (ReadingsVal("$name", "Record", "") eq "Start") { readingsSingleUpdate( $hash,"state", "on", 1); } else { @@ -1272,7 +1294,7 @@ sub stopliveview ($) { if ($attr{$name}{debugactivetoken}) { Log3($name, 3, "$name - Active-Token deleted by OPMODE: $hash->{OPMODE}"); } - + } else { RemoveInternalTimer($hash, "stopliveview"); InternalTimer(gettimeofday()+0.5, "stopliveview", $hash, 0); @@ -2561,7 +2583,7 @@ sub sscam_camop ($) { $url = "http://$serveraddr:$serverport/webapi/$apiextevtpath?api=$apiextevt&version=$apiextevtmaxver&method=Trigger&eventId=$hash->{HELPER}{EVENTID}&eventName=$hash->{HELPER}{EVENTID}&_sid=\"$sid\""; } elsif ($OpMode eq "runliveview") { - if ($hash->{HELPER}{WLTYPE} ne "lastrec") { + if ($hash->{HELPER}{RUNVIEW} =~ m/live/) { # externe URL $livestream = !AttrVal($name, "livestreamprefix", undef) ? "http://$serveraddr:$serverport" : AttrVal($name, "livestreamprefix", undef); $livestream .= "/webapi/$apivideostmpath?api=$apivideostm&version=$apivideostmmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=\"$sid\""; @@ -2574,7 +2596,7 @@ sub sscam_camop ($) { $url = "http://$serveraddr:$serverport/webapi/$apistmpath?api=$apistm&version=$apistmmaxver&method=EventStream&eventId=$hash->{HELPER}{CAMLASTRECID}&_sid=$sid"; } - # Liveview-Link in Hash speichern -> Anzeige über SSCam_liveview, in Reading setzen für Linkversand + # Liveview-Link in Hash speichern -> Anzeige über SSCam_FWview, in Reading setzen für Linkversand $hash->{HELPER}{LINK} = $url; Log3($name, 4, "$name - Set Streaming-URL: $url"); @@ -3784,8 +3806,8 @@ sub experror { 1; =pod -=item summary operate surveillance cameras which are defined in Synology Surveillance Station -=item summary_DE steuert Kameras welche in der Synology Surveillance Station definiert sind +=item summary operates surveillance cameras defined in Synology Surveillance Station +=item summary_DE steuert Kameras welche der Synology Surveillance Station =begin html @@ -3933,6 +3955,7 @@ sub experror {
  • set ... credentials -
  • get ... caminfoall session: ServeillanceStation - observer
  • get ... eventlist session: ServeillanceStation - observer
  • +
  • get ... scanVirgin session: ServeillanceStation - observer
  • get ... svsinfo session: ServeillanceStation - observer
  • get ... snapfileinfo session: ServeillanceStation - observer
  • get ... stmUrlPath session: ServeillanceStation - observer
  • @@ -3943,8 +3966,8 @@ sub experror { HTTP-Timeout Settings

    - All functions of the SSCam-Module are using HTTP-Calls to the SVS Web API.
    - The Default-Value of the HTTP-Timeout amounts 4 seconds. You can set the Attribute "httptimeout" > 0 to adjust the value as needed in your technical environment.
    + All functions of SSCam use HTTP-calls to SVS Web API.
    + The default-value of HTTP-Timeout amounts 4 seconds. You can set the attribute "httptimeout" > 0 to adjust the value as needed in your technical environment.



    @@ -3977,7 +4000,8 @@ sub experror {

    - "set <name> [on] [off]"

    + +

    - - "set <name> snap"

    + +

    - "set <name> [enable] [disable]"

    +

    - "set <name> expmode [day] [night] [auto]"

    + +

    -


    - - "set <name> motdetsc [camera] [SVS] [disable]"

    +

    - "set <name> goPreset <Preset>"

    +

    - "set <name> runPatrol <Patrolname>"

    +

    - "set <name> goAbsPTZ [ X Y | up | down | left | right ]"

    + +

    - set <name> move [ up | down | left | right | dir_X ] [seconds]

    + +

    -
    +

    - set <name> extevent [ 1-10 ]

    + +


    @@ -4279,10 +4330,11 @@ sub experror { Get + -Internals
    +Internals



    Es ist immer die Reihenfolge der Optionswerte zu beachten. Nicht gewünschte Optionen sind mit "0" zu besetzen sofern danach Optionen folgen @@ -4857,10 +4951,10 @@ sub experror {
       CamMotDetSc    SVS, sensitivity: 76, threshold: 55
       
    -

    - "set <name> goPreset <Preset>"

    + +

    -
    - - "set <name> runPatrol <Patrolname>"

    +

    - "set <name> goAbsPTZ [ X Y | up | down | left | right ]"

    + +

    -


    - - set <name> move [ up | down | left | right | dir_X ] [Sekunden]

    + +

    - set <name> runView [ image | lastrec | lastrec_open | link | link_open <room> ]

    +

    - set <name> extevent [ 1-10 ]

    + +


    @@ -5043,13 +5154,17 @@ sub experror { Es ist darauf zu achten dass die Credentials gespeichert wurden !

    - get <name> scanVirgin

    + +

    - get <name> stmUrlPath

    + +

    Polling der Kameraeigenschaften:

    @@ -5111,8 +5227,9 @@ sub experror { Ein geringfügiger Unterschied zwischen den Pollingintervallen der definierten Kameras von z.B. 1s kann bereits als ausreichend angesehen werden.

    + -Internals
    +Internals