diff --git a/fhem/CHANGED b/fhem/CHANGED index de47d221a..03d4d179e 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -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: motion detection parameters can be entered if + motion detection by camera or by SVS is used - feature: 74_AMAD: Flowinstaller and FlowsetUpdater - Support for older Androidversions - change: 59_Weather: included caching in YahooWeatherAPI diff --git a/fhem/FHEM/49_SSCam.pm b/fhem/FHEM/49_SSCam.pm index 2e0a946de..1f41aeb09 100644 --- a/fhem/FHEM/49_SSCam.pm +++ b/fhem/FHEM/49_SSCam.pm @@ -27,6 +27,8 @@ ########################################################################################################## # Versions History: # +# 1.25 18.04.2016 motion detection parameters can be entered if +# motion detection by camera or SVS is used # 1.24 16.04.2016 behavior of "set ... on" changed, Attr "recextend" added # please have a look at commandref and Wiki # bugfix: setstate-warning if FHEM will restarted and SVS is not reachable @@ -303,16 +305,13 @@ sub SSCam_Set { my $opt = $a[1]; my $prop = $a[2]; my $prop1 = $a[3]; + my $prop2 = $a[4]; + my $prop3 = $a[5]; my $camname = $hash->{CAMNAME}; my $success; my $logstr; my $setlist; my @prop; - - -# my $list .= "on off snap enable disable on-for-timer"; -# return SetExtensions($hash, $list, $name, $opt) if( $opt eq "?" ); -# return SetExtensions($hash, $list, $name, $opt) if( !grep( $_ =~ /^\Q$opt\E($|:)/, split( ' ', $list ) ) ); $setlist = "Unknown argument $opt, choose one of ". "credentials ". @@ -368,6 +367,22 @@ sub SSCam_Set { if (!$prop || $prop !~ /^(disable|camera|SVS)$/) { return " \"$opt\" needs one of those arguments: disable, camera, SVS !";} $hash->{HELPER}{MOTDETSC} = $prop; + + if ($prop1) { + # check ob Zahl zwischen 1 und 99 + return "invalid value for sensitivity (SVS or camera) - use number between 1 - 99" if ($prop1 !~ /^([1-9]|[1-9][0-9])*$/); + $hash->{HELPER}{MOTDETSC_PROP1} = $prop1; + } + if ($prop2) { + # check ob Zahl zwischen 1 und 99 + return "invalid value for threshold (SVS) / object size (camera) - use number between 1 - 99" if ($prop2 !~ /^([1-9]|[1-9][0-9])*$/); + $hash->{HELPER}{MOTDETSC_PROP2} = $prop2; + } + if ($prop3) { + # check ob Zahl zwischen 1 und 99 + return "invalid value for threshold (SVS) / object size (camera) - use number between 1 - 99" if ($prop3 !~ /^([1-9]|[1-9][0-9])*$/); + $hash->{HELPER}{MOTDETSC_PROP3} = $prop3; + } cammotdetsc($hash); } elsif ($opt eq "credentials") @@ -1499,7 +1514,7 @@ sub getcaminfoall { readingsSingleUpdate($hash,"PollState","Inactive",0); Log3($name, 3, "$name - Polling of Camera $camname is currently deactivated"); - } + } return; } @@ -1704,7 +1719,7 @@ sub getptzlistpatrol ($) { return; } - if ($hash->{HELPER}{ACTIVE} ne "on") { + if ($hash->{HELPER}{ACTIVE} ne "on") { # PTZ-ListPatrols abrufen Log3($name, 4, "$name - Retrieval PTZ-ListPatrols of $camname starts now"); @@ -2510,19 +2525,75 @@ sub camop_nonbl ($) { } $url = "http://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&version=\"$apicammaxver\"&method=\"SaveOptimizeParam\"&cameraIds=\"$camid\"&expMode=\"$expmode\"&camParamChkList=32&_sid=\"$sid\""; } - elsif ($OpMode eq "MotDetSc") + elsif ($OpMode eq "MotDetSc") { + # Hash für Optionswerte sichern für Logausgabe in Befehlsauswertung + # "my" nicht am Anfang setzten ! + my %motdetoptions = (); + if ($hash->{HELPER}{MOTDETSC} eq "disable") { $motdetsc = "-1"; + $url = "http://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventmaxver\"&method=\"MDParamSave\"&camId=\"$camid\"&source=$motdetsc&keep=true&_sid=\"$sid\""; } elsif ($hash->{HELPER}{MOTDETSC} eq "camera") { $motdetsc = "0"; + + $motdetoptions{SENSITIVITY} = $hash->{'HELPER'}{'MOTDETSC_PROP1'} if ($hash->{'HELPER'}{'MOTDETSC_PROP1'}); + $motdetoptions{OBJECTSIZE} = $hash->{'HELPER'}{'MOTDETSC_PROP2'} if ($hash->{'HELPER'}{'MOTDETSC_PROP2'}); + $motdetoptions{PERCENTAGE} = $hash->{'HELPER'}{'MOTDETSC_PROP3'} if ($hash->{'HELPER'}{'MOTDETSC_PROP3'}); + + $url = "http://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventmaxver\"&method=\"MDParamSave\"&camId=\"$camid\"&source=$motdetsc&_sid=\"$sid\""; + + if ($hash->{HELPER}{MOTDETSC_PROP1} || $hash->{HELPER}{MOTDETSC_PROP2} || $hash->{HELPER}{MOTDETSC_PROP13}) { + # umschalten und neue Werte setzen + $url .= "&keep=false"; + } else { + # nur Umschaltung, alte Werte beibehalten + $url .= "&keep=true"; + } + + if ($hash->{HELPER}{MOTDETSC_PROP1}) { + # der Wert für Bewegungserkennung Kamera -> Empfindlichkeit ist gesetzt + my $sensitivity = delete $hash->{HELPER}{MOTDETSC_PROP1}; + $url .= "&sensitivity=\"$sensitivity\""; + } + + if ($hash->{HELPER}{MOTDETSC_PROP2}) { + # der Wert für Bewegungserkennung Kamera -> Objektgröße ist gesetzt + my $objectsize = delete $hash->{HELPER}{MOTDETSC_PROP2}; + $url .= "&objectSize=\"$objectsize\""; + } + + if ($hash->{HELPER}{MOTDETSC_PROP3}) { + # der Wert für Bewegungserkennung Kamera -> Prozentsatz für Auslösung ist gesetzt + my $percentage = delete $hash->{HELPER}{MOTDETSC_PROP3}; + $url .= "&percentage=\"$percentage\""; + } } elsif ($hash->{HELPER}{MOTDETSC} eq "SVS") { $motdetsc = "1"; - } + + $motdetoptions{SENSITIVITY} = $hash->{'HELPER'}{'MOTDETSC_PROP1'} if ($hash->{'HELPER'}{'MOTDETSC_PROP1'}); + $motdetoptions{THRESHOLD} = $hash->{'HELPER'}{'MOTDETSC_PROP2'} if ($hash->{'HELPER'}{'MOTDETSC_PROP2'}); - $url = "http://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventmaxver\"&method=\"MDParamSave\"&camId=\"$camid\"&source=$motdetsc&keep=true&_sid=\"$sid\""; + # nur Umschaltung, alte Werte beibehalten + $url = "http://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventmaxver\"&method=\"MDParamSave\"&camId=\"$camid\"&source=$motdetsc&keep=true&_sid=\"$sid\""; + + + if ($hash->{HELPER}{MOTDETSC_PROP1}) { + # der Wert für Bewegungserkennung SVS -> Empfindlichkeit ist gesetzt + my $sensitivity = delete $hash->{HELPER}{MOTDETSC_PROP1}; + $url .= "&sensitivity=\"$sensitivity\""; + } + + if ($hash->{HELPER}{MOTDETSC_PROP2}) { + # der Wert für Bewegungserkennung SVS -> Schwellwert ist gesetzt + my $threshold = delete $hash->{HELPER}{MOTDETSC_PROP2}; + $url .= "&threshold=\"$threshold\""; + } + } + # Optionswerte in Hash sichern für Logausgabe in Befehlsauswertung + $hash->{HELPER}{MOTDETOPTIONS} = \%motdetoptions; } elsif ($OpMode eq "getmotionenum") { @@ -2638,6 +2709,10 @@ sub camret_nonbl ($) { my $verbose; my $httptimeout; my $motdetsc; + my ($sensitivity_camCap,$sensitivity_value,$sensitivity_ssCap); + my ($threshold_camCap,$threshold_value,$threshold_ssCap); + my ($percentage_camCap,$percentage_value,$percentage_ssCap); + my ($objectSize_camCap,$objectSize_value,$objectSize_ssCap); if ($err ne "") { @@ -2749,8 +2824,26 @@ sub camret_nonbl ($) { readingsEndUpdate($hash, 1); # Logausgabe - - Log3($name, 3, "$name - Camera $camname motion detection source was set to \"$hash->{HELPER}{MOTDETSC}\""); + if ($hash->{HELPER}{MOTDETSC} eq "SVS" && keys($hash->{HELPER}{MOTDETOPTIONS})) { + # Optionen für "SVS" sind gesetzt + my $sensitivity = $hash->{HELPER}{MOTDETOPTIONS}{SENSITIVITY} ? $hash->{HELPER}{MOTDETOPTIONS}{SENSITIVITY} : "-"; + my $threshold = $hash->{HELPER}{MOTDETOPTIONS}{THRESHOLD} ? $hash->{HELPER}{MOTDETOPTIONS}{THRESHOLD} : "-"; + + Log3($name, 3, "$name - Camera $camname motion detection source set to \"$hash->{HELPER}{MOTDETSC}\" with options sensitivity: $sensitivity, threshold: $threshold"); + + } elsif ($hash->{HELPER}{MOTDETSC} eq "camera" && keys($hash->{HELPER}{MOTDETOPTIONS})) { + # Optionen für "camera" sind gesetzt + my $sensitivity = $hash->{HELPER}{MOTDETOPTIONS}{SENSITIVITY} ? $hash->{HELPER}{MOTDETOPTIONS}{SENSITIVITY} : "-"; + my $objectSize = $hash->{HELPER}{MOTDETOPTIONS}{OBJECTSIZE} ? $hash->{HELPER}{MOTDETOPTIONS}{OBJECTSIZE} : "-"; + my $percentage = $hash->{HELPER}{MOTDETOPTIONS}{PERCENTAGE} ? $hash->{HELPER}{MOTDETOPTIONS}{PERCENTAGE} : "-"; + + Log3($name, 3, "$name - Camera $camname motion detection source set to \"$hash->{HELPER}{MOTDETSC}\" with options sensitivity: $sensitivity, objectSize: $objectSize, percentage: $percentage"); + + } else { + # keine Optionen Bewegungserkennung wurden gesetzt + Log3($name, 3, "$name - Camera $camname motion detection source was to \"$hash->{HELPER}{MOTDETSC}\" "); + } + Log3($name, 4, "$name - --- End Function cam: $OpMode nonblocking ---"); } elsif ($OpMode eq "Snap") @@ -3165,14 +3258,57 @@ sub camret_nonbl ($) { { $motdetsc = $data->{'data'}{'MDParam'}{'source'}; + $sensitivity_camCap = $data->{'data'}{'MDParam'}{'sensitivity'}{'camCap'}; + $sensitivity_value = $data->{'data'}{'MDParam'}{'sensitivity'}{'value'}; + $sensitivity_ssCap = $data->{'data'}{'MDParam'}{'sensitivity'}{'ssCap'}; + + $threshold_camCap = $data->{'data'}{'MDParam'}{'threshold'}{'camCap'}; + $threshold_value = $data->{'data'}{'MDParam'}{'threshold'}{'value'}; + $threshold_ssCap = $data->{'data'}{'MDParam'}{'threshold'}{'ssCap'}; + + $percentage_camCap = $data->{'data'}{'MDParam'}{'percentage'}{'camCap'}; + $percentage_value = $data->{'data'}{'MDParam'}{'percentage'}{'value'}; + $percentage_ssCap = $data->{'data'}{'MDParam'}{'percentage'}{'ssCap'}; + + $objectSize_camCap = $data->{'data'}{'MDParam'}{'objectSize'}{'camCap'}; + $objectSize_value = $data->{'data'}{'MDParam'}{'objectSize'}{'value'}; + $objectSize_ssCap = $data->{'data'}{'MDParam'}{'objectSize'}{'ssCap'}; + + if ($motdetsc == -1) { $motdetsc = "disabled"; } elsif ($motdetsc == 0) { $motdetsc = "Camera"; + + if ($sensitivity_camCap) { + $motdetsc .= ", sensitivity: $sensitivity_value"; + } + if ($threshold_camCap) { + $motdetsc .= ", threshold: $threshold_value"; + } + if ($percentage_camCap) { + $motdetsc .= ", percentage: $percentage_value"; + } + if ($objectSize_camCap) { + $motdetsc .= ", objectSize: $objectSize_value"; + } } elsif ($motdetsc == 1) { $motdetsc = "SVS"; + + if ($sensitivity_ssCap) { + $motdetsc .= ", sensitivity: $sensitivity_value"; + } + if ($threshold_ssCap) { + $motdetsc .= ", threshold: $threshold_value"; + } + if ($percentage_ssCap) { + $motdetsc .= ", percentage: $percentage_value"; + } + if ($objectSize_ssCap) { + $motdetsc .= ", objectSize: $objectSize_value"; + } } # Setreading @@ -3603,18 +3739,6 @@ sub experror { return ($error); } -############################################################################ -### Logausgabe - -sub printlog { - # Übernahmewerte ist $hash, $logstr, $verb (Verbose-Level) - my ($hash,$logstr,$verb)= @_; - my $name = $hash->{NAME}; - - Log3 ($name, $verb, "$name - $logstr"); -return; -} - 1; @@ -3635,6 +3759,7 @@ return;
  • Activate a Camera in Synology Surveillance Station
  • Control of the exposure modes day, night and automatic
  • switchover the motion detection by camera, by SVS or to deactivate
  • +
  • control of motion detection parameters sensitivity, threshold, object size and percentage for release
  • Retrieval of Camera Properties (also by Polling) as well as informations about the installed SVS-package
  • Move to a predefined Preset-position (at PTZ-cameras)
  • Start a predefined Patrol (at PTZ-cameras)
  • @@ -3902,14 +4027,53 @@ return; The successfully execution of this function depends on if SVS supports that functionality of the connected camera. Is the field for the Day/Night-mode shown greyed in SVS -> IP-camera -> optimization -> exposure mode, this function will be probably unsupported. -

    +


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

    The command "motdetsc" (stands for "motion detection source") switchover the motion detection to the desired mode. - If motion detection will be tuned by camera, the original camera settings are kept. - The successful execution of that opreration you can retrace by the state in SVS -> IP-camera -> event detection -> motion. - The state of motion detection source will also be shown by the Reading "CamMotDetSc". + If motion detection will be done by camera / SVS without any parameters, the original camera motion detection settings are kept. + The successful execution of that opreration one can retrace by the state in SVS -> IP-camera -> event detection -> motion.

    + + For the motion detection further parameter can be specified. The available options for motion detection by SVS are "sensitivity" and "threshold".

    + + +

    + + If the motion detection is used by camera, there are the options "sensitivity", "object size", "percentage for release" available.

    + + +

    + + Please consider always the sequence of parameters. Unwanted options have to be set to "0" if further options which have to be changed are follow (see example above). + The numerical values are between 1 - 99 (except special case "0").

    + + The each available options are dependend of camera type respectively the supported functions by SVS. Only the options can be used they are available in + SVS -> edit camera -> motion detection. Further informations please read in SVS online help.

    + + With the command "get ... caminfoall" the Reading "CamMotDetSc" also will be updated which documents the current setup of motion detection. + Only the parameters and parameter values supported by SVS at present will be shown. The camera itself may offer further options to adjust.

    + + Example: +
    +  CamMotDetSc    SVS, sensitivity: 76, threshold: 55
    +  


    @@ -4155,7 +4319,7 @@ return;
  • CamLastRecTime
  • - date / starttime / endtime of the last recording
  • CamLiveMode
  • - Source of Live-View (DS, Camera)
  • CamModel
  • - Model of camera -
  • CamMotDetSc
  • - state of motion detection source (disabled, by camera, by SVS) +
  • CamMotDetSc
  • - state of motion detection source (disabled, by camera, by SVS) and their parameter
  • CamPort
  • - IP-Port of Camera
  • CamPreRecTime
  • - Duration of Pre-Recording (in seconds) adjusted in SVS
  • CamRecShare
  • - shared folder on disk station for recordings @@ -4268,6 +4432,7 @@ return;
  • Aktivieren einer Kamera in Synology Surveillance Station
  • Steuerung der Belichtungsmodi Tag, Nacht bzw. Automatisch
  • Umschaltung der Ereigniserkennung durch Kamera, durch SVS oder deaktiviert
  • +
  • steuern der Erkennungsparameterwerte Empfindlichkeit, Schwellwert, Objektgröße und Prozentsatz für Auslösung
  • Abfrage von Kameraeigenschaften (auch mit Polling) sowie den Eigenschaften des installierten SVS-Paketes
  • Bewegen an eine vordefinierte Preset-Position (bei PTZ-Kameras)
  • Start einer vordefinierten Überwachungstour (bei PTZ-Kameras)
  • @@ -4534,14 +4699,52 @@ return; Die erfolgreiche Ausführung dieser Funktion ist davon abhängig ob die SVS diese Funktionalität der Kamera unterstützt. Ist in SVS -> IP-Kamera -> Optimierung -> Belichtungsmodus das Feld für den Tag/Nachtmodus grau hinterlegt, ist nicht von einer lauffähigen Unterstützung dieser Funktion auszugehen. -

    +


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

    Der Befehl "motdetsc" (steht für motion detection source) schaltet die Bewegungserkennung in den gewünschten Modus. - Wird die Bewegungserkennung durch die Kamera eingestellt, werden die originalen Kameraeinstellungen beibehalten. - Die erfolgreiche Ausführung der Operation lässt sich u.a anhand des Status von SVS -> IP-Kamera -> Ereigniserkennung -> Bewegung nachvollziehen. - Den Status der Bewegungserkennung wird ebenfalls durch das Reading "CamMotDetSc" angezeigt. + Wird die Bewegungserkennung durch die Kamera / SVS ohne weitere Optionen eingestellt, werden die momentan gültigen Bewegungserkennungsparameter der + Kamera / SVS beibehalten. Die erfolgreiche Ausführung der Operation lässt sich u.a. anhand des Status von SVS -> IP-Kamera -> Ereigniserkennung -> + Bewegung nachvollziehen.

    + Für die Bewegungserkennung durch SVS bzw. durch Kamera können weitere Optionen angegeben werden. Die verfügbaren Optionen bezüglich der Bewegungserkennung + durch SVS sind "Empfindlichkeit" und "Schwellwert".

    + +

    + + Wird die Bewegungserkennung durch die Kamera genutzt, stehen die Optionen "Empfindlichkeit", "Objektgröße" und "Prozentsatz für Auslösung" zur Verfügung.

    + +

    + + Es ist immer die Reihenfolge der Optionswerte zu beachten. Nicht gewünschte Optionen sind mit "0" zu besetzen sofern danach Optionen folgen + deren Werte verändert werden sollen (siehe Beispiele oben). Der Zahlenwert der Optionen beträgt 1 - 99 (außer Sonderfall "0").

    + + Die jeweils verfügbaren Optionen unterliegen der Funktion der Kamera und der Unterstützung durch die SVS. Es können jeweils nur die Optionen genutzt werden die in + SVS -> Kamera bearbeiten -> Ereigniserkennung zur Verfügung stehen. Weitere Infos sind der Online-Hilfe zur SVS zu entnehmen.

    + + Über den Befehl "get ... caminfoall" wird auch das Reading "CamMotDetSc" aktualisiert welches die gegenwärtige Einstellung der Bewegungserkennung dokumentiert. + Es werden nur die Parameter und Parameterwerte angezeigt, welche die SVS aktiv unterstützt. Die Kamera selbst kann weiterführende Einstellmöglichkeiten besitzen.

    + + Beipiel: +
    +  CamMotDetSc    SVS, sensitivity: 76, threshold: 55
    +  


    @@ -4797,7 +5000,7 @@ return;
  • CamLastRecTime
  • - Datum / Startzeit - Stopzeit der letzten Aufnahme
  • CamLiveMode
  • - Quelle für Live-Ansicht (DS, Camera)
  • CamModel
  • - Kameramodell -
  • CamMotDetSc
  • - Status der Bewegungserkennung (disabled, durch Kamera, durch SVS) +
  • CamMotDetSc
  • - Status der Bewegungserkennung (disabled, durch Kamera, durch SVS) und deren Parameter
  • CamPort
  • - IP-Port der Kamera
  • CamPreRecTime
  • - Dauer der der Voraufzeichnung in Sekunden (Einstellung in SVS)
  • CamRecShare
  • - gemeinsamer Ordner auf der DS für Aufnahmen