diff --git a/fhem/CHANGED b/fhem/CHANGED index c9b39eecd..0665044a2 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,9 @@ # 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: function "get ... eventlist" added, + Reading "CamEventNum" added which containes total + number of camera events, + change usage of reading "LastUpdateTime" - added: 79_BDKM: new module for Buderus KM Gateways - feature: 57_Calendar: get ... uid ... - feature 49_SSCAM: function "runPatrol" added that starts predefined diff --git a/fhem/FHEM/49_SSCam.pm b/fhem/FHEM/49_SSCam.pm index 3a2c101e8..66d573f1f 100644 --- a/fhem/FHEM/49_SSCam.pm +++ b/fhem/FHEM/49_SSCam.pm @@ -27,6 +27,10 @@ ########################################################################################################## # Versions History: # +# 1.18 20.02.2016 function "get ... eventlist" added, +# Reading "CamEventNum" added which containes total number of +# camera events, +# change usage of reading "LastUpdateTime" # 1.17 19.02.2016 function "runPatrol" added that starts predefined patrols # of PTZ-cameras, # Reading "CamDetMotSc" added @@ -84,7 +88,7 @@ # LWP is not needed anymore # # -# Definition: define SSCam +# Definition: define SSCam [ServerPort] # # Example: define CamCP1 SSCAM Carport 192.168.2.20 [5000] # @@ -152,6 +156,7 @@ sub SSCam_Define { $hash->{HELPER}{APIINFO} = "SYNO.API.Info"; # Info-Seite für alle API's, einzige statische Seite ! $hash->{HELPER}{APIAUTH} = "SYNO.API.Auth"; $hash->{HELPER}{APISVSINFO} = "SYNO.SurveillanceStation.Info"; + $hash->{HELPER}{APIEVENT} = "SYNO.SurveillanceStation.Event"; $hash->{HELPER}{APIEXTREC} = "SYNO.SurveillanceStation.ExternalRecording"; $hash->{HELPER}{APICAM} = "SYNO.SurveillanceStation.Camera"; $hash->{HELPER}{APISNAPSHOT} = "SYNO.SurveillanceStation.SnapShot"; @@ -390,6 +395,7 @@ sub SSCam_Get { caminfoall => "caminfoall", svsinfo => "svsinfo", snapfileinfo => "snapfileinfo", + eventlist => "eventlist", ); my @cList; @@ -418,6 +424,11 @@ sub SSCam_Get { { if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\"";} getsnapfilename($hash); + } + elsif ($opt eq "eventlist") + { + if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\"";} + geteventlist ($hash); } } return undef; @@ -1172,6 +1183,7 @@ sub getcaminfoall { my $logstr; my ($now,$new); + geteventlist($hash); getcaminfo($hash); getmotionenum($hash); getcapabilities($hash); @@ -1268,6 +1280,37 @@ sub getcaminfo ($) { } +########################################################################### +### query SVS-Event information , sub von getcaminfoall + +sub geteventlist ($) { + my ($hash) = @_; + my $camname = $hash->{CAMNAME}; + my $name = $hash->{NAME}; + my $logstr; + + if ($hash->{HELPER}{ACTIVE} eq "off") { + # Kamerainfos abrufen + $logstr = "Query event informations of $camname starts now"; + &printlog($hash,$logstr,"4"); + + $hash->{OPMODE} = "geteventlist"; + $hash->{HELPER}{ACTIVE} = "on"; + + if ($attr{$name}{debugactivetoken}) { + $logstr = "Active-Token was set by OPMODE: $hash->{OPMODE}" ; + &printlog($hash,$logstr,"3"); + } + + getapisites_nonbl($hash); + } + else + { + InternalTimer(gettimeofday()+0.55 , "geteventlist", $hash, 0); + } + +} + ########################################################################### ### Enumerate motion detection parameters, sub von getcaminfoall @@ -1399,7 +1442,7 @@ sub getptzlistpatrol ($) { } else { - InternalTimer(gettimeofday()+1 .58, "getptzlistpatrol", $hash, 0); + InternalTimer(gettimeofday()+1.58, "getptzlistpatrol", $hash, 0); } } @@ -1432,6 +1475,7 @@ sub getapisites_nonbl { my $apiptz = $hash->{HELPER}{APIPTZ}; my $apisvsinfo = $hash->{HELPER}{APISVSINFO}; my $apicamevent = $hash->{HELPER}{APICAMEVENT}; + my $apievent = $hash->{HELPER}{APIEVENT}; my $logstr; my $url; my $param; @@ -1448,7 +1492,7 @@ sub getapisites_nonbl { &printlog($hash,$logstr,"5"); # URL zur Abfrage der Eigenschaften der API's - $url = "http://$serveraddr:$serverport/webapi/query.cgi?api=$apiinfo&method=Query&version=1&query=$apiauth,$apiextrec,$apicam,$apitakesnap,$apiptz,$apisvsinfo,$apicamevent"; + $url = "http://$serveraddr:$serverport/webapi/query.cgi?api=$apiinfo&method=Query&version=1&query=$apiauth,$apiextrec,$apicam,$apitakesnap,$apiptz,$apisvsinfo,$apicamevent,$apievent"; $logstr = "Call-Out now: $url"; &printlog($hash,$logstr,"4"); @@ -1485,6 +1529,7 @@ sub login_nonbl ($) { my $apiptz = $hash->{HELPER}{APIPTZ}; my $apisvsinfo = $hash->{HELPER}{APISVSINFO}; my $apicamevent = $hash->{HELPER}{APICAMEVENT}; + my $apievent = $hash->{HELPER}{APIEVENT}; my $data; my $logstr; my $url; @@ -1503,6 +1548,8 @@ sub login_nonbl ($) { my $apisvsinfomaxver; my $apicameventpath; my $apicameventmaxver; + my $apieventpath; + my $apieventmaxver; my $error; my $httptimeout; @@ -1635,7 +1682,19 @@ sub login_nonbl ($) { $logstr = defined($apicameventpath) ? "Path of $apicamevent selected: $apicameventpath" : "Path of $apicamevent undefined - Surveillance Station may be stopped"; &printlog($hash, $logstr,"4"); $logstr = defined($apicameventmaxver) ? "MaxVersion of $apicamevent: $apicameventmaxver" : "MaxVersion of $apicamevent undefined - Surveillance Station may be stopped"; - &printlog($hash, $logstr,"4"); + &printlog($hash, $logstr,"4"); + + # Pfad und Maxversion von "SYNO.Surveillance.Event" ermitteln + + $apieventpath = $data->{'data'}->{$apievent}->{'path'}; + # Unterstriche im Ergebnis z.B. "_______entry.cgi" eleminieren + $apieventpath =~ tr/_//d if (defined($apieventpath)); + $apieventmaxver = $data->{'data'}->{$apievent}->{'maxVersion'}; + + $logstr = defined($apieventpath) ? "Path of $apievent selected: $apieventpath" : "Path of $apievent undefined - Surveillance Station may be stopped"; + &printlog($hash, $logstr,"4"); + $logstr = defined($apieventmaxver) ? "MaxVersion of $apievent: $apieventmaxver" : "MaxVersion of $apievent undefined - Surveillance Station may be stopped"; + &printlog($hash, $logstr,"4"); # ermittelte Werte in $hash einfügen $hash->{HELPER}{APIAUTHPATH} = $apiauthpath; @@ -1652,6 +1711,8 @@ sub login_nonbl ($) { $hash->{HELPER}{APISVSINFOMAXVER} = $apisvsinfomaxver; $hash->{HELPER}{APICAMEVENTPATH} = $apicameventpath; $hash->{HELPER}{APICAMEVENTMAXVER} = $apicameventmaxver; + $hash->{HELPER}{APIEVENTPATH} = $apieventpath; + $hash->{HELPER}{APIEVENTMAXVER} = $apieventmaxver; # Setreading readingsBeginUpdate($hash); @@ -1926,6 +1987,9 @@ sub camop_nonbl ($) { my $apicamevent = $hash->{HELPER}{APICAMEVENT}; my $apicameventpath = $hash->{HELPER}{APICAMEVENTPATH}; my $apicameventmaxver = $hash->{HELPER}{APICAMEVENTMAXVER}; + my $apievent = $hash->{HELPER}{APIEVENT}; + my $apieventpath = $hash->{HELPER}{APIEVENTPATH}; + my $apieventmaxver = $hash->{HELPER}{APIEVENTMAXVER}; my $sid = $hash->{HELPER}{SID}; my $OpMode = $hash->{OPMODE}; my $url; @@ -2055,12 +2119,10 @@ sub camop_nonbl ($) { if ($OpMode eq "Start") { - # die Aufnahme wird gestartet, Rückkehr wird mit "camret_nonbl" verarbeitet $url = "http://$serveraddr:$serverport/webapi/$apiextrecpath?api=$apiextrec&method=Record&version=$apiextrecmaxver&cameraId=$camid&action=start&_sid=\"$sid\""; } elsif ($OpMode eq "Stop") { - # die Aufnahme wird gestoppt, Rückkehr wird mit "camret_nonbl" verarbeitet $url = "http://$serveraddr:$serverport/webapi/$apiextrecpath?api=$apiextrec&method=Record&version=$apiextrecmaxver&cameraId=$camid&action=stop&_sid=\"$sid\""; } elsif ($OpMode eq "Snap") @@ -2103,37 +2165,37 @@ sub camop_nonbl ($) { } elsif ($OpMode eq "Enable") { - # eine Kamera wird aktiviert, Rückkehr wird mit "camret_nonbl" verarbeitet $url = "http://$serveraddr:$serverport/webapi/$apicampath?api=$apicam&version=$apicammaxver&method=Enable&cameraIds=$camid&_sid=\"$sid\""; } elsif ($OpMode eq "Disable") { - # eine Kamera wird aktiviert, Rückkehr wird mit "camret_nonbl" verarbeitet $url = "http://$serveraddr:$serverport/webapi/$apicampath?api=$apicam&version=$apicammaxver&method=Disable&cameraIds=$camid&_sid=\"$sid\""; } elsif ($OpMode eq "Getsvsinfo") { - # Infos bezüglich Synology Surveillance Station werden ermittelt $url = "http://$serveraddr:$serverport/webapi/$apisvsinfopath?api=\"$apisvsinfo\"&version=\"$apisvsinfomaxver\"&method=\"GetInfo\"&_sid=\"$sid\""; } elsif ($OpMode eq "Getcaminfo") { - # Infos einer Kamera werden abgerufen, Rückkehr wird mit "camret_nonbl" verarbeitet $url = "http://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&version=\"$apicammaxver\"&method=\"GetInfo\"&cameraIds=\"$camid\"&deviceOutCap=\"true\"&streamInfo=\"true\"&ptz=\"true\"&basic=\"true\"&camAppInfo=\"true\"&optimize=\"true\"&fisheye=\"true\"&eventDetection=\"true\"&_sid=\"$sid\""; } + elsif ($OpMode eq "geteventlist") + { + # Abruf der Events einer Kamera + $url = "http://$serveraddr:$serverport/webapi/$apieventpath?api=\"$apievent\"&version=\"$apieventmaxver\"&method=\"List\"&cameraIds=\"$camid\"&locked=\"0\"&blIncludeSnapshot=\"false\"&reason=\"\"&limit=\"2\"&includeAllCam=\"false\"&_sid=\"$sid\""; + } elsif ($OpMode eq "Getptzlistpreset") { - # PTZ-ListPresets werden abgerufen, Rückkehr wird mit "camret_nonbl" verarbeitet $url = "http://$serveraddr:$serverport/webapi/$apiptzpath?api=$apiptz&version=$apiptzmaxver&method=ListPreset&cameraId=$camid&_sid=\"$sid\""; } elsif ($OpMode eq "Getcapabilities") { - # Capabilities einer Cam werden abgerufen, Rückkehr wird mit "camret_nonbl" verarbeitet + # Capabilities einer Cam werden abgerufen $url = "http://$serveraddr:$serverport/webapi/$apicampath?api=$apicam&version=$apicammaxver&method=GetCapabilityByCamId&cameraId=$camid&_sid=\"$sid\""; } elsif ($OpMode eq "Getptzlistpatrol") { - # PTZ-ListPatrol werden abgerufen, Rückkehr wird mit "camret_nonbl" verarbeitet + # PTZ-ListPatrol werden abgerufen $url = "http://$serveraddr:$serverport/webapi/$apiptzpath?api=$apiptz&version=$apiptzmaxver&method=ListPatrol&cameraId=$camid&_sid=\"$sid\""; } elsif ($OpMode eq "ExpMode") @@ -2591,8 +2653,8 @@ sub camret_nonbl ($) { $camLiveMode = $data->{'data'}->{'cameras'}->[0]->{'camLiveMode'}; if ($camLiveMode eq "0") {$camLiveMode = "Liveview from DS";}elsif ($camLiveMode eq "1") {$camLiveMode = "Liveview from Camera";} - $update_time = $data->{'data'}->{'cameras'}->[0]->{'update_time'}; - ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($update_time); + # $update_time = $data->{'data'}->{'cameras'}->[0]->{'update_time'}; + ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime; $update_time = sprintf "%02d.%02d.%04d / %02d:%02d:%02d" , $mday , $mon+=1 ,$year+=1900 , $hour , $min , $sec ; $deviceType = $data->{'data'}->{'cameras'}->[0]->{'deviceType'}; @@ -2606,7 +2668,7 @@ sub camret_nonbl ($) { $deviceType = "PTZ"; } elsif ($deviceType eq "8") { - $deviceType = "Fisheye"; + $deviceType = "Fisheye"; } $camStatus = $data->{'data'}->{'cameras'}->[0]->{'camStatus'}; @@ -2710,7 +2772,32 @@ sub camret_nonbl ($) { # Logausgabe $logstr = "Camera-Informations of $camname retrieved"; - # wenn "pollnologging" = 1 -> logging nur bei Verbose=4, sonst 2 + # wenn "pollnologging" = 1 -> logging nur bei Verbose=4, sonst 3 + if (defined($attr{$name}{pollnologging}) and $attr{$name}{pollnologging} eq "1") { + $verbose = 4; + } + else + { + $verbose = 3; + } + &printlog($hash,$logstr,$verbose); + $logstr = "--- End Function cam: $OpMode nonblocking ---"; + &printlog($hash,$logstr,"4"); + } + elsif ($OpMode eq "geteventlist") + { + my $eventnum = $data->{'data'}{'total'}; + + # Setreading + readingsBeginUpdate($hash); + readingsBulkUpdate($hash,"CamEventNum",$eventnum); + readingsBulkUpdate($hash,"Errorcode","none"); + readingsBulkUpdate($hash,"Error","none"); + readingsEndUpdate($hash, 1); + + # Logausgabe + $logstr = "Query event list of $camname successfully done"; + # wenn "pollnologging" = 1 -> logging nur bei Verbose=4, sonst 3 if (defined($attr{$name}{pollnologging}) and $attr{$name}{pollnologging} eq "1") { $verbose = 4; } @@ -3380,6 +3467,7 @@ return;
  • set ... move session: ServeillanceStation - observer with privilege objective control of camera
  • set ... credentials -
  • get ... caminfoall session: ServeillanceStation - observer
  • +
  • get ... eventlist session: ServeillanceStation - observer
  • get ... svsinfo session: ServeillanceStation - observer
  • get ... snapfileinfo session: ServeillanceStation - observer
  • @@ -3616,18 +3704,21 @@ return; Get
      - With SSCam the properties of defined Cameras could be retrieved. It could be done by using the command: + With SSCam the properties of SVS and defined Cameras could be retrieved. Actually it could be done by using the following commands:
             get <name> caminfoall
      +      get <name> eventlist
             get <name> svsinfo
             get <name> snapfileinfo
         
      - With command "get <name> caminfoall" dependend of the type of Camera (e.g. Fix- or PTZ-Camera) the available properties will be retrieved and provided as Readings.
      + With command "get <name> caminfoall" dependend of the type of Camera (e.g. Fix- or PTZ-Camera) the available properties will be retrieved and provided as Readings.
      For example the Reading "Availability" will be set to "disconnected" if the Camera would be disconnected from Synology Surveillance Station and can be used for further processing like creating events.
      - Using "get <name> snapfileinfo" the filename of the last snapshot will be retrieved. This command will be executed with "get <name> snap" automatically.
      - The command "get <name> svsinfo" is not really dependend on a camera, but rather a command to determine common informations about the installed SVS-version and other properties.
      + By command "get <name> eventlist" the Reading "CamEventNum" will be refreshed which containes the total number of in SVS registered camera events. + This command will be implicit executed when "get ... caminfoall" is running.
      + Using "get <name> snapfileinfo" the filename of the last snapshot will be retrieved. This command will be executed with "get <name> snap" automatically.
      + The command "get <name> svsinfo" is not really dependend on a camera, but rather a command to determine common informations about the installed SVS-version and other properties.
      The functions "caminfoall" and "svsinfo" will be executed automatically once-only after FHEM restarts to collect some relevant informations for camera control.
      Please consider to save the credentials what will be used for login to DSM or SVS !

      @@ -3696,6 +3787,7 @@ return; + @@ -3725,7 +3817,7 @@ return; - + @@ -3915,6 +4007,7 @@ return; +
    • Availability
    • - Availability of Camera (disabled, enabled, disconnected, other)
    • CamEventNum
    • - delivers the total number of in SVS registered events of the camera
    • CamExposureControl
    • - indicating type of exposure control
    • CamExposureMode
    • - current exposure mode (Day, Night, Auto, Schedule, Unknown)
    • CamIP
    • - IP-Address of Camera
    • Errorcode
    • - error code of last error
    • LastSnapFilename
    • - the filename of the last snapshot
    • LastSnapId
    • - the ID of the last snapshot
    • LastUpdateTime
    • - date / time of last update of Camera in Synology Surrveillance Station
    • LastUpdateTime
    • - date / time the last update of readings by "caminfoall"
    • Patrols
    • - in Synology Surveillance Station predefined patrols (at PTZ-Cameras)
    • PollState
    • - shows the state of automatic polling
    • Presets
    • - in Synology Surveillance Station predefined Presets (at PTZ-Cameras)
    • set ... move
    • session: ServeillanceStation - Betrachter mit Privileg Objektivsteuerung der Kamera
    • set ... credentials
    • -
    • get ... caminfoall
    • session: ServeillanceStation - Betrachter
    • get ... eventlist
    • session: ServeillanceStation - Betrachter
    • get ... svsinfo
    • session: ServeillanceStation - Betrachter
    • get ... snapfileinfo
    • session: ServeillanceStation - Betrachter
      @@ -4148,18 +4241,21 @@ return; Get
        - Mit SSCam können die Eigenschaften der Kameras aus der Surveillance Station abgefragt werden. Dazu steht der Befehl zur Verfügung: + Mit SSCam können die Eigenschaften der Surveillance Station und der Kameras abgefragt werden. ZUr Zeit stehen dazu folgende Befehle zur Verfügung:
               get <name> caminfoall
        +      get <name> eventlist
               get <name> svsinfo
               get <name> snapfileinfo
           
        - Mit dem Befehl "get <name> caminfoall" werden abhängig von der Art der Kamera (z.B. Fix- oder PTZ-Kamera) die verfügbaren Eigenschaften ermittelt und als Readings zur Verfügung gestellt.
        - So wird zum Beispiel das Reading "Availability" auf "disconnected" gesetzt falls die Kamera von der Surveillance Station getrennt wird und kann für weitere
        - Verarbeitungen genutzt werden.
        - Mit "get <name> snapfileinfo" wird der Filename des letzten Schnapschusses ermittelt. Der Befehl wird implizit mit "get <name> snap" ausgeführt.
        - Der Befehl "get <name> svsinfo" ist eigentlich nicht von der Kamera abhängig, sondern ermittelt vielmehr allgemeine Informationen zur installierten SVS-Version und andere Eigenschaften.
        + Mit dem Befehl "get <name> caminfoall" werden abhängig von der Art der Kamera (z.B. Fix- oder PTZ-Kamera) die verfügbaren Eigenschaften ermittelt und als Readings zur Verfügung gestellt.
        + So wird zum Beispiel das Reading "Availability" auf "disconnected" gesetzt falls die Kamera von der Surveillance Station getrennt wird und kann für weitere Verarbeitungen genutzt werden.
        + Durch "get <name> eventlist" wird das Reading "CamEventNum" aktualisiert, welches die Gesamtanzahl der registrierten Kameraevents enthält. + Dieser Befehl wird implizit mit "get ... caminfoall" ausgeführt.
        + + Mit "get <name> snapfileinfo" wird der Filename des letzten Schnapschusses ermittelt. Der Befehl wird implizit mit "get <name> snap" ausgeführt.
        + Der Befehl "get <name> svsinfo" ist eigentlich nicht von der Kamera abhängig, sondern ermittelt vielmehr allgemeine Informationen zur installierten SVS-Version und andere Eigenschaften.
        Die Funktionen "caminfoall" und "svsinfo" werden einmalig automatisch beim Start von FHEM ausgeführt um steuerungsrelevante Informationen zu sammeln.
        Es ist darauf zu achten dass die Credentials gespeichert wurden !

        @@ -4230,6 +4326,7 @@ return; + @@ -4259,7 +4356,7 @@ return; - +
      • Availability
      • - Verfügbarkeit der Kamera (disabled, enabled, disconnected, other)
      • CamEventNum
      • - liefert die Gesamtanzahl der in SVS registrierten Events der Kamera
      • CamExposureControl
      • - zeigt den aktuell eingestellten Typ der Belichtungssteuerung
      • CamExposureMode
      • - aktueller Belichtungsmodus (Day, Night, Auto, Schedule, Unknown)
      • CamIP
      • - IP-Adresse der Kamera
      • Errorcode
      • - Fehlercode des letzten Fehlers
      • LastSnapFilename
      • - der Filename des letzten Schnapschusses
      • LastSnapId
      • - die ID des letzten Schnapschusses
      • LastUpdateTime
      • - Datum / Zeit der letzten Aktualisierung der Kamera in der Synology Surveillance Station
      • LastUpdateTime
      • - Datum / Zeit der letzten Aktualisierung durch "caminfoall"
      • Patrols
      • - in Surveillance Station voreingestellte Überwachungstouren (bei PTZ-Kameras)
      • PollState
      • - zeigt den Status des automatischen Pollings an
      • Presets
      • - in Surveillance Station voreingestellte Positionen (bei PTZ-Kameras)