From b0b38c7e502df5c6fe62d390ee2f1f024495cfb4 Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Tue, 25 Aug 2020 20:54:18 +0000 Subject: [PATCH] 49_SSCam: switch to lib/FHEM/SynoModules/API.pm and lib/FHEM/SynoModules/SMUtils.pm git-svn-id: https://svn.fhem.de/fhem/trunk@22672 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/49_SSCam.pm | 1192 ++++++++++++++++------------------------- 1 file changed, 468 insertions(+), 724 deletions(-) diff --git a/fhem/FHEM/49_SSCam.pm b/fhem/FHEM/49_SSCam.pm index 0dfe82564..b21c4cb54 100644 --- a/fhem/FHEM/49_SSCam.pm +++ b/fhem/FHEM/49_SSCam.pm @@ -36,7 +36,9 @@ package FHEM::SSCam; use strict; use warnings; -use GPUtils qw(GP_Import GP_Export); # wird für den Import der FHEM Funktionen aus der fhem.pl benötigt +use GPUtils qw( GP_Import GP_Export ); # wird für den Import der FHEM Funktionen aus der fhem.pl benötigt +use FHEM::SynoModules::API qw(:all); +use FHEM::SynoModules::SMUtils qw(:all); use Data::Dumper; use MIME::Base64; use Time::HiRes qw( gettimeofday tv_interval ); @@ -159,6 +161,8 @@ BEGIN { # Versions History intern my %vNotesIntern = ( + "9.7.1" => "25.08.2020 switch to lib/FHEM/SynoModules/API.pm and lib/FHEM/SynoModules/SMUtils.pm move ". + "getPtzPresetList, getPtzPatrolList to return path of OpMOde Getcaminfo ", "9.7.0" => "17.08.2020 compatibility to SSChatBot version 1.10.0 ", "9.6.1" => "13.08.2020 avoid warnings during FHEM shutdown/restart ", "9.6.0" => "12.08.2020 new attribute ptzNoCapPrePat ", @@ -703,28 +707,7 @@ sub Define { $hash->{PROTOCOL} = $proto; $hash->{COMPATIBILITY} = $compstat; # getestete SVS-version Kompatibilität $hash->{HELPER}{MODMETAABSENT} = 1 if($modMetaAbsent); # Modul Meta.pm nicht vorhanden - - # benötigte API's in $hash einfügen - $hash->{HELPER}{APIINFO} = "SYNO.API.Info"; # Info-Seite für alle API's, einzige statische Seite ! - $hash->{HELPER}{APIAUTH} = "SYNO.API.Auth"; # API used to perform session login and logout - $hash->{HELPER}{APISVSINFO} = "SYNO.SurveillanceStation.Info"; - $hash->{HELPER}{APIEVENT} = "SYNO.SurveillanceStation.Event"; - $hash->{HELPER}{APIEXTREC} = "SYNO.SurveillanceStation.ExternalRecording"; - $hash->{HELPER}{APIEXTEVT} = "SYNO.SurveillanceStation.ExternalEvent"; - $hash->{HELPER}{APICAM} = "SYNO.SurveillanceStation.Camera"; # stark geändert ab API v2.8 - $hash->{HELPER}{APISNAPSHOT} = "SYNO.SurveillanceStation.SnapShot"; # This API provides functions on snapshot, including taking, editing and deleting snapshots. - $hash->{HELPER}{APIPTZ} = "SYNO.SurveillanceStation.PTZ"; - $hash->{HELPER}{APIPRESET} = "SYNO.SurveillanceStation.PTZ.Preset"; - $hash->{HELPER}{APICAMEVENT} = "SYNO.SurveillanceStation.Camera.Event"; - $hash->{HELPER}{APIVIDEOSTM} = "SYNO.SurveillanceStation.VideoStreaming"; # verwendet in Response von "SYNO.SurveillanceStation.Camera: GetLiveViewPath" -> StreamKey-Methode - # $hash->{HELPER}{APISTM} = "SYNO.SurveillanceStation.Streaming"; # provides methods to get Live View or Event video stream, removed in API v2.8 - $hash->{HELPER}{APISTM} = "SYNO.SurveillanceStation.Stream"; # Beschreibung ist falsch und entspricht "SYNO.SurveillanceStation.Streaming" auch noch ab v2.8 - $hash->{HELPER}{APIHM} = "SYNO.SurveillanceStation.HomeMode"; - $hash->{HELPER}{APILOG} = "SYNO.SurveillanceStation.Log"; - $hash->{HELPER}{APIAUDIOSTM} = "SYNO.SurveillanceStation.AudioStream"; # Audiostream mit SID, removed in API v2.8 (noch undokumentiert verfügbar) - $hash->{HELPER}{APIVIDEOSTMS} = "SYNO.SurveillanceStation.VideoStream"; # Videostream mit SID, removed in API v2.8 (noch undokumentiert verfügbar) - $hash->{HELPER}{APIREC} = "SYNO.SurveillanceStation.Recording"; # This API provides method to query recording information. - + # Startwerte setzen if(IsModelCam($hash)) { # initiale Webkommandos setzen $attr{$name}{webCmd} = "on:off:snap:enable:disable:runView:stopView"; @@ -743,20 +726,23 @@ sub Define { $hash->{HELPER}{TOTALCNT} = 0; # totale Anzahl Snaps # Versionsinformationen setzen - setVersionInfo($hash); + setVersionInfo ($hash, \%vNotesIntern); - readingsBeginUpdate ($hash); + readingsBeginUpdate ($hash ); readingsBulkUpdate ($hash, "PollState", "Inactive"); # es ist keine Gerätepolling aktiv + if(IsModelCam($hash)) { readingsBulkUpdate ($hash, "Availability", "???"); # Verfügbarkeit ist unbekannt readingsBulkUpdate ($hash, "state", "off"); # Init für "state" , Problemlösung für setstate, Forum #308 + } else { readingsBulkUpdate ($hash, "state", "Initialized"); # Init für "state" wenn SVS } - readingsEndUpdate($hash,1); - getCredentials($hash,1, "svs" ); # Credentials lesen und in RAM laden ($boot=1) - getCredentials($hash,1, "smtp"); + readingsEndUpdate ($hash,1); + + getCredentials ($hash,1, "svs" ); # Credentials lesen und in RAM laden ($boot=1) + getCredentials ($hash,1, "smtp"); # initiale Routinen zufällig verzögert nach Restart ausführen RemoveInternalTimer ($hash, "FHEM::SSCam::initOnBoot" ); @@ -1029,7 +1015,7 @@ sub Attr { } if ($aName eq "simu_SVSversion") { - delete $hash->{HELPER}{APIPARSET}; + delete $hash->{HELPER}{API}{PARSET}; delete $hash->{HELPER}{SID}; delete $hash->{CAMID}; RemoveInternalTimer ($hash, "FHEM::SSCam::getCaminfoAll" ); @@ -1145,7 +1131,7 @@ sub Set { "smtpcredentials ". "createReadingsGroup ". "extevent:1,2,3,4,5,6,7,8,9,10 ". - ($hash->{HELPER}{APIHMMAXVER} ? "homeMode:on,off " : ""). + ($hash->{HELPER}{API}{HMODE}{VER} ? "homeMode:on,off " : ""). "snapCams "; } @@ -1158,11 +1144,7 @@ sub Set { if($success) { getCaminfoAll($hash,0); - RemoveInternalTimer($hash, "FHEM::SSCam::getPtzPresetList"); - InternalTimer(gettimeofday()+11, "FHEM::SSCam::getPtzPresetList", $hash, 0); - RemoveInternalTimer($hash, "FHEM::SSCam::getPtzPatrolList"); - InternalTimer(gettimeofday()+12, "FHEM::SSCam::getPtzPatrolList", $hash, 0); - versionCheck($hash); + versionCheck ($hash); return "Username and Password saved successfully"; } else { return "Error while saving Username / Password - see logfile for details"; @@ -1361,12 +1343,12 @@ sub Set { } elsif ($opt eq "startTracking" && IsModelCam($hash)) { if (!$hash->{CREDENTIALS}) {return qq{Credentials of $name are not set - make sure you've set it with "set $name credentials username password"};} - if ($hash->{HELPER}{APIPTZMAXVER} < 5) {return "Function \"$opt\" needs a higher version of Surveillance Station";} + if ($hash->{HELPER}{API}{PTZ}{VER} < 5) {return "Function \"$opt\" needs a higher version of Surveillance Station";} startTrack($hash); } elsif ($opt eq "stopTracking" && IsModelCam($hash)) { if (!$hash->{CREDENTIALS}) {return qq{Credentials of $name are not set - make sure you've set it with "set $name credentials username password"};} - if ($hash->{HELPER}{APIPTZMAXVER} < 5) {return "Function \"$opt\" needs a higher version of Surveillance Station";} + if ($hash->{HELPER}{API}{PTZ}{VER} < 5) {return "Function \"$opt\" needs a higher version of Surveillance Station";} stopTrack($hash); } elsif ($opt eq "setZoom" && IsModelCam($hash)) { @@ -1672,13 +1654,13 @@ sub Set { } elsif ($opt eq "move" && IsModelCam($hash)) { if (!$hash->{CREDENTIALS}) {return qq{Credentials of $name are not set - make sure you've set it with "set $name credentials username password"};} - return "PTZ version of Synology API isn't set. Use \"get $name scanVirgin\" first." if(!$hash->{HELPER}{APIPTZMAXVER}); + return "PTZ version of Synology API isn't set. Use \"get $name scanVirgin\" first." if(!$hash->{HELPER}{API}{PTZ}{VER}); - if($hash->{HELPER}{APIPTZMAXVER} <= 4) { + if($hash->{HELPER}{API}{PTZ}{VER} <= 4) { if (!defined($prop) || ($prop !~ /^up$|^down$|^left$|^right$|^dir_\d$/x)) {return "Function \"move\" needs an argument like up, down, left, right or dir_X (X = 0 to CapPTZDirections-1)";} $hash->{HELPER}{GOMOVEDIR} = $prop; - } elsif ($hash->{HELPER}{APIPTZMAXVER} >= 5) { + } elsif ($hash->{HELPER}{API}{PTZ}{VER} >= 5) { if (!defined($prop) || ($prop !~ /^right$|^upright$|^up$|^upleft$|^left$|^downleft$|^down$|^downright$/x)) {return "Function \"move\" needs an argument like right, upright, up, upleft, left, downleft, down, downright ";} my %dirs = ( right => 0, @@ -1871,7 +1853,7 @@ sub Get { # getlist für SVS Devices $getlist = "Unknown argument $opt, choose one of ". "caminfoall:noArg ". - ($hash->{HELPER}{APIHMMAXVER}?"homeModeState:noArg ": ""). + ($hash->{HELPER}{API}{HMODE}{VER}?"homeModeState:noArg ": ""). "svsinfo:noArg ". "listLog ". "storedCredentials:noArg ". @@ -2000,16 +1982,15 @@ sub Get { } elsif ($opt eq "scanVirgin") { if (!$hash->{CREDENTIALS}) {return "Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\"";} sessionOff($hash); - delete $hash->{HELPER}{APIPARSET}; + delete $hash->{HELPER}{API}{PARSET}; delete $hash->{CAMID}; - # alte Readings außer state löschen + my @allrds = keys%{$defs{$name}{READINGS}}; - for my $key(@allrds) { - # Log3 ($name, 1, "DbRep $name - Reading Schlüssel: $key"); + for my $key(@allrds) { # vorhandene Readings außer "state" löschen delete($defs{$name}{READINGS}{$key}) if($key ne "state"); } - # "1" ist Statusbit für manuelle Abfrage, kein Einstieg in Pollingroutine - getCaminfoAll($hash,1); + + getCaminfoAll($hash,1); # "1" ist Statusbit für manuelle Abfrage, kein Einstieg in Pollingroutine } elsif ($opt =~ /versionNotes/x) { my $header = "Module release information
"; @@ -2364,7 +2345,7 @@ return $ret; # initiale Startroutinen nach Restart FHEM ###################################################################################### sub initOnBoot { - my ($hash) = @_; + my $hash = shift; my $name = $hash->{NAME}; RemoveInternalTimer($hash, "FHEM::SSCam::initOnBoot"); @@ -2374,36 +2355,28 @@ sub initOnBoot { delete($defs{$name}{READINGS}{LiveStreamUrl}) if($defs{$name}{READINGS}{LiveStreamUrl}); # LiveStream URL zurücksetzen - # check ob alle Recordings = "Stop" nach Reboot -> sonst stoppen - if (ReadingsVal($hash->{NAME}, "Record", "Stop") eq "Start") { + if (ReadingsVal($hash->{NAME}, "Record", "Stop") eq "Start") { # check ob alle Recordings = "Stop" nach Reboot -> sonst stoppen Log3($name, 2, "$name - Recording of $hash->{CAMNAME} seems to be still active after FHEM restart - try to stop it now"); camStopRec($hash); } - # Konfiguration der Synology Surveillance Station abrufen - if (!$hash->{CREDENTIALS}) { + if (!$hash->{CREDENTIALS}) { # Konfiguration der Synology Surveillance Station abrufen Log3($name, 2, "$name - Credentials of $name are not set - make sure you've set it with \"set $name credentials username password\""); + } else { readingsSingleUpdate($hash, "compstate", "true", 0); # Anfangswert f. versionCheck setzen - # allg. SVS-Eigenschaften abrufen - getSvsInfo($hash); + getSvsInfo ($hash); # allg. SVS-Eigenschaften abrufen if(IsModelCam($hash)) { - # Kameraspezifische Infos holen - getCamInfo($hash); - getCapabilities($hash); - getStmUrlPath($hash); - - # Preset/Patrollisten in Hash einlesen zur PTZ-Steuerung - getPtzPresetList($hash); - getPtzPatrolList($hash); + getCamInfo ($hash); # Kameraspezifische Infos holen + getCapabilities ($hash); + getStmUrlPath ($hash); - # Schnappschußgalerie abrufen oder nur Info des letzten Snaps - my ($slim,$ssize) = snapLimSize($hash,1); # Force-Bit, es wird $hash->{HELPER}{GETSNAPGALLERY} erzwungen ! + my ($slim,$ssize) = snapLimSize($hash,1); # Schnappschußgalerie abrufen oder nur Info des letzten Snaps, Force-Bit -> es wird $hash->{HELPER}{GETSNAPGALLERY} erzwungen ! RemoveInternalTimer ($hash, "FHEM::SSCam::getSnapInfo"); InternalTimer (gettimeofday()+0.9, "FHEM::SSCam::getSnapInfo", "$name:$slim:$ssize", 0); } - versionCheck($hash); # Einstieg in regelmäßigen Check Kompatibilität + versionCheck($hash); # Einstieg in regelmäßigen Check Kompatibilität } # Subroutine Watchdog-Timer starten (sollen Cam-Infos regelmäßig abgerufen werden ?), verzögerter zufälliger Start 0-30s @@ -3849,6 +3822,7 @@ sub getCaminfoAll { my ($hash,$mode) = @_; my $camname = $hash->{CAMNAME}; my $name = $hash->{NAME}; + my ($now,$new); RemoveInternalTimer($hash, "FHEM::SSCam::getCaminfoAll"); @@ -3857,8 +3831,7 @@ sub getCaminfoAll { RemoveInternalTimer($hash, "FHEM::SSCam::getSvsInfo"); InternalTimer(gettimeofday()+1, "FHEM::SSCam::getSvsInfo", $hash, 0); - if(IsModelCam($hash)) { - # Model ist CAM + if(IsModelCam($hash)) { # Model ist CAM RemoveInternalTimer ($hash, "FHEM::SSCam::getEventList"); InternalTimer (gettimeofday()+0.5, "FHEM::SSCam::getEventList", $hash, 0); RemoveInternalTimer ($hash, "FHEM::SSCam::getMotionEnum"); @@ -3870,20 +3843,13 @@ sub getCaminfoAll { RemoveInternalTimer ($hash, "FHEM::SSCam::getStreamFormat"); InternalTimer (gettimeofday()+1.4, "FHEM::SSCam::getStreamFormat", $hash, 0); - # Schnappschußgalerie abrufen (snapGalleryBoost) oder nur Info des letzten Snaps - my ($slim,$ssize) = snapLimSize($hash,1); # Force-Bit, es wird $hash->{HELPER}{GETSNAPGALLERY} erzwungen ! + my ($slim,$ssize) = snapLimSize($hash,1); # Schnappschußgalerie abrufen (snapGalleryBoost) oder nur Info des letzten Snaps, Force-Bit -> es wird $hash->{HELPER}{GETSNAPGALLERY} erzwungen ! RemoveInternalTimer ($hash, "FHEM::SSCam::getSnapInfo"); InternalTimer (gettimeofday()+1.5, "FHEM::SSCam::getSnapInfo", "$name:$slim:$ssize", 0); - - RemoveInternalTimer ($hash, "FHEM::SSCam::getPtzPresetList"); - InternalTimer (gettimeofday()+1.6, "FHEM::SSCam::getPtzPresetList", $hash, 0); - RemoveInternalTimer ($hash, "FHEM::SSCam::getPtzPatrolList"); - InternalTimer (gettimeofday()+1.9, "FHEM::SSCam::getPtzPatrolList", $hash, 0); RemoveInternalTimer ($hash, "FHEM::SSCam::getStmUrlPath"); InternalTimer (gettimeofday()+2.1, "FHEM::SSCam::getStmUrlPath", $hash, 0); - } else { - # Model ist SVS + } else { # Model ist SVS RemoveInternalTimer ($hash, "FHEM::SSCam::getHomeModeState"); InternalTimer (gettimeofday()+0.7, "FHEM::SSCam::getHomeModeState", $hash, 0); RemoveInternalTimer ($hash, "FHEM::SSCam::getSvsLog"); @@ -3908,10 +3874,9 @@ sub getCaminfoAll { Log3($name, 3, "$name - Polling now: $now , next Polling: $new"); } - } else { - # Beenden Polling aller Caminfos + } else { # Beenden Polling aller Caminfos readingsSingleUpdate($hash, "PollState", "Inactive", 1); - readingsSingleUpdate($hash, "state", "initialized",1) if(!IsModelCam($hash)); # state für SVS-Device setzen + readingsSingleUpdate($hash, "state", "initialized",1) if(!IsModelCam($hash)); # state für SVS-Device setzen Log3($name, 3, "$name - Polling of $camname is deactivated"); } @@ -3926,7 +3891,7 @@ return; # $tac = Transaktionscode (für gemeinsamen Versand) ########################################################################### sub getSnapInfo { - my ($str) = @_; + my $str = shift; my ($name,$slim,$ssize,$tac) = split(":",$str); my $hash = $defs{$name}; my $camname = $hash->{CAMNAME}; @@ -4014,7 +3979,7 @@ sub setHomeMode { my $name = $hash->{NAME}; RemoveInternalTimer($hash, "FHEM::SSCam::setHomeMode"); - return if(IsDisabled($name) || !defined($hash->{HELPER}{APIHMMAXVER})); + return if(IsDisabled($name) || !defined($hash->{HELPER}{API}{HMODE}{VER})); if ($hash->{HELPER}{ACTIVE} eq "off") { $hash->{OPMODE} = "sethomemode"; @@ -4064,7 +4029,7 @@ sub getHomeModeState { my $name = $hash->{NAME}; RemoveInternalTimer($hash, "FHEM::SSCam::getHomeModeState"); - return if(IsDisabled($name) || !defined($hash->{HELPER}{APIHMMAXVER})); + return if(IsDisabled($name) || !defined($hash->{HELPER}{API}{HMODE}{VER})); if ($hash->{HELPER}{ACTIVE} eq "off") { $hash->{OPMODE} = "gethomemodestate"; @@ -4163,10 +4128,10 @@ sub getStreamFormat { my $name = $hash->{NAME}; RemoveInternalTimer($hash, "FHEM::SSCam::getStreamFormat"); - my $apivideostmsmaxver = $hash->{HELPER}{APIVIDEOSTMSMAXVER}; + my $apivideostmsver = $hash->{HELPER}{API}{VIDEOSTMS}{VER}; return if(IsDisabled($name)); - if(!$apivideostmsmaxver) { + if(!$apivideostmsver) { # keine API "SYNO.SurveillanceStation.VideoStream" mehr ab API v2.8 readingsSingleUpdate($hash,"CamStreamFormat", "no API", 1); return; @@ -4359,44 +4324,26 @@ return; ####### Begin Kameraoperationen mit NonblockingGet (nicht blockierender HTTP-Call) ####### ############################################################################################################################# sub getApiSites { - my $hash = shift; - my $serveraddr = $hash->{SERVERADDR}; - my $serverport = $hash->{SERVERPORT}; - my $name = $hash->{NAME}; - my $apiinfo = $hash->{HELPER}{APIINFO}; # Info-Seite für alle API's, einzige statische Seite ! - my $apiauth = $hash->{HELPER}{APIAUTH}; - my $apiextrec = $hash->{HELPER}{APIEXTREC}; - my $apiextevt = $hash->{HELPER}{APIEXTEVT}; - my $apicam = $hash->{HELPER}{APICAM}; - my $apitakesnap = $hash->{HELPER}{APISNAPSHOT}; - my $apiptz = $hash->{HELPER}{APIPTZ}; - my $apipreset = $hash->{HELPER}{APIPRESET}; - my $apisvsinfo = $hash->{HELPER}{APISVSINFO}; - my $apicamevent = $hash->{HELPER}{APICAMEVENT}; - my $apievent = $hash->{HELPER}{APIEVENT}; - my $apivideostm = $hash->{HELPER}{APIVIDEOSTM}; - my $apiaudiostm = $hash->{HELPER}{APIAUDIOSTM}; - my $apivideostms = $hash->{HELPER}{APIVIDEOSTMS}; - my $apistm = $hash->{HELPER}{APISTM}; - my $apihm = $hash->{HELPER}{APIHM}; - my $apilog = $hash->{HELPER}{APILOG}; - my $apirec = $hash->{HELPER}{APIREC}; - my $proto = $hash->{PROTOCOL}; - my $url; - my $param; + my $hash = shift; + my $serveraddr = $hash->{SERVERADDR}; + my $serverport = $hash->{SERVERPORT}; + my $name = $hash->{NAME}; + my $proto = $hash->{PROTOCOL}; + + my ($url,$param); - # API-Pfade und MaxVersions ermitteln + # API-Pfade und Versions ermitteln Log3($name, 4, "$name - ####################################################"); Log3($name, 4, "$name - ### start cam operation $hash->{OPMODE} "); Log3($name, 4, "$name - ####################################################"); Log3($name, 4, "$name - --- Begin Function getApiSites nonblocking ---"); - if ($shutdownInProcess) { # shutdown in Proces -> keine weiteren Aktionen + if ($shutdownInProcess) { # shutdown in Proces -> keine weiteren Aktionen Log3($name, 3, "$name - Shutdown in process. No more activities allowed."); return; } - if ($hash->{HELPER}{APIPARSET}) { # API-Hashwerte sind bereits gesetzt -> Abruf überspringen + if ($hash->{HELPER}{API}{PARSET}) { # API-Hashwerte sind bereits gesetzt -> Abruf überspringen Log3($name, 4, "$name - API hashvalues already set - ignore get apisites"); return checkSid($hash); } @@ -4404,19 +4351,35 @@ sub getApiSites { my $httptimeout = AttrVal($name,"httptimeout",4); Log3($name, 5, "$name - HTTP-Call will be done with httptimeout-Value: $httptimeout s"); - # URL zur Abfrage der Eigenschaften der API's - $url = "$proto://$serveraddr:$serverport/webapi/query.cgi?api=$apiinfo&method=Query&version=1&query=$apiauth,$apiextrec,$apicam,$apitakesnap,$apiptz,$apipreset,$apisvsinfo,$apicamevent,$apievent,$apivideostm,$apiextevt,$apistm,$apihm,$apilog,$apiaudiostm,$apivideostms,$apirec"; + # API initialisieren und abrufen + #################################### + $hash->{HELPER}{API} = apistatic ("surveillance"); # API Template im HELPER instanziieren + # $hash->{HELPER}{API} = \%hapi; # API Template im HELPER instanziieren + Log3 ($name, 4, "$name - API imported:\n".Dumper $hash->{HELPER}{API}); + + my @ak; + for my $key (keys %{$hash->{HELPER}{API}}) { + next if($key =~ /^(?: PARSET | INFO)$/x); + push @ak, $hash->{HELPER}{API}{$key}{NAME}; + } + my $apis = join ",", @ak; + + $url = "$proto://$serveraddr:$serverport/webapi/$hash->{HELPER}{API}{INFO}{PATH}?". + "api=$hash->{HELPER}{API}{INFO}{NAME}". + "&method=Query". + "&version=$hash->{HELPER}{API}{INFO}{VER}". + "&query=$apis"; Log3($name, 4, "$name - Call-Out now: $url"); $param = { - url => $url, - timeout => $httptimeout, - hash => $hash, - method => "GET", - header => "Accept: application/json", - callback => \&getApiSites_Parse - }; + url => $url, + timeout => $httptimeout, + hash => $hash, + method => "GET", + header => "Accept: application/json", + callback => \&getApiSites_Parse + }; HttpUtils_NonblockingGet ($param); return; @@ -4434,25 +4397,25 @@ sub getApiSites_Parse { my $name = $hash->{NAME}; my $serveraddr = $hash->{SERVERADDR}; my $serverport = $hash->{SERVERPORT}; - my $apiauth = $hash->{HELPER}{APIAUTH}; - my $apiextrec = $hash->{HELPER}{APIEXTREC}; - my $apiextevt = $hash->{HELPER}{APIEXTEVT}; - my $apicam = $hash->{HELPER}{APICAM}; - my $apitakesnap = $hash->{HELPER}{APISNAPSHOT}; - my $apiptz = $hash->{HELPER}{APIPTZ}; - my $apipreset = $hash->{HELPER}{APIPRESET}; - my $apisvsinfo = $hash->{HELPER}{APISVSINFO}; - my $apicamevent = $hash->{HELPER}{APICAMEVENT}; - my $apievent = $hash->{HELPER}{APIEVENT}; - my $apivideostm = $hash->{HELPER}{APIVIDEOSTM}; - my $apiaudiostm = $hash->{HELPER}{APIAUDIOSTM}; - my $apivideostms = $hash->{HELPER}{APIVIDEOSTMS}; - my $apistm = $hash->{HELPER}{APISTM}; - my $apihm = $hash->{HELPER}{APIHM}; - my $apilog = $hash->{HELPER}{APILOG}; - my $apirec = $hash->{HELPER}{APIREC}; + my $apiauth = $hash->{HELPER}{API}{AUTH}{NAME}; + my $apiextrec = $hash->{HELPER}{API}{EXTREC}{NAME}; + my $apiextevt = $hash->{HELPER}{API}{EXTEVT}{NAME}; + my $apicam = $hash->{HELPER}{API}{CAM}{NAME}; + my $apitakesnap = $hash->{HELPER}{API}{SNAPSHOT}{NAME}; + my $apiptz = $hash->{HELPER}{API}{PTZ}{NAME}; + my $apipreset = $hash->{HELPER}{API}{PRESET}{NAME}; + my $apisvsinfo = $hash->{HELPER}{API}{SVSINFO}{NAME}; + my $apicamevent = $hash->{HELPER}{API}{CAMEVENT}{NAME}; + my $apievent = $hash->{HELPER}{API}{EVENT}{NAME}; + my $apivideostm = $hash->{HELPER}{API}{VIDEOSTM}{NAME}; + my $apiaudiostm = $hash->{HELPER}{API}{AUDIOSTM}{NAME}; + my $apivideostms = $hash->{HELPER}{API}{VIDEOSTMS}{NAME}; + my $apistm = $hash->{HELPER}{API}{STM}{NAME}; + my $apihm = $hash->{HELPER}{API}{HMODE}{NAME}; + my $apilog = $hash->{HELPER}{API}{LOG}{NAME}; + my $apirec = $hash->{HELPER}{API}{REC}{NAME}; - my ($apicammaxver,$apicampath); + my ($apicamver,$apicampath); if ($err ne "") { # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist @@ -4481,177 +4444,95 @@ sub getApiSites_Parse { $success = $data->{'success'}; if ($success) { - my $logstr; + my ($logp,$logv); + + my $pundef = "Path: undefined - Surveillance Station may be stopped"; + my $vundef = "Version: undefined - Surveillance Station may be stopped"; - # Pfad und Maxversion von "SYNO.API.Auth" ermitteln + # Pfad und Version von "SYNO.API.Auth" ermitteln my $apiauthpath = $data->{'data'}->{$apiauth}->{'path'}; - $apiauthpath =~ tr/_//d if (defined($apiauthpath)); - my $apiauthmaxver = $data->{'data'}->{$apiauth}->{'maxVersion'}; + $apiauthpath =~ tr/_//d if(defined($apiauthpath)); + my $apiauthver = $data->{'data'}->{$apiauth}->{'maxVersion'}; - $logstr = defined($apiauthpath) ? "Path of $apiauth selected: $apiauthpath" : "Path of $apiauth undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apiauthmaxver) ? "MaxVersion of $apiauth selected: $apiauthmaxver" : "MaxVersion of $apiauth undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - - # Pfad und Maxversion von "SYNO.SurveillanceStation.ExternalRecording" ermitteln + # Pfad und Version von "SYNO.SurveillanceStation.ExternalRecording" ermitteln my $apiextrecpath = $data->{'data'}->{$apiextrec}->{'path'}; - $apiextrecpath =~ tr/_//d if (defined($apiextrecpath)); - my $apiextrecmaxver = $data->{'data'}->{$apiextrec}->{'maxVersion'}; + $apiextrecpath =~ tr/_//d if (defined($apiextrecpath)); + my $apiextrecver = $data->{'data'}->{$apiextrec}->{'maxVersion'}; - $logstr = defined($apiextrecpath) ? "Path of $apiextrec selected: $apiextrecpath" : "Path of $apiextrec undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apiextrecmaxver) ? "MaxVersion of $apiextrec selected: $apiextrecmaxver" : "MaxVersion of $apiextrec undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - - # Pfad und Maxversion von "SYNO.SurveillanceStation.Camera" ermitteln + # Pfad und Version von "SYNO.SurveillanceStation.Camera" ermitteln $apicampath = $data->{'data'}->{$apicam}->{'path'}; $apicampath =~ tr/_//d if (defined($apicampath)); - $apicammaxver = $data->{'data'}->{$apicam}->{'maxVersion'}; - - $logstr = defined($apicampath) ? "Path of $apicam selected: $apicampath" : "Path of $apicam undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apiextrecmaxver) ? "MaxVersion of $apicam: $apicammaxver" : "MaxVersion of $apicam undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apicamver = $data->{'data'}->{$apicam}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.SurveillanceStation.SnapShot" ermitteln + # Pfad und Version von "SYNO.SurveillanceStation.SnapShot" ermitteln my $apitakesnappath = $data->{'data'}->{$apitakesnap}->{'path'}; - $apitakesnappath =~ tr/_//d if (defined($apitakesnappath)); - my $apitakesnapmaxver = $data->{'data'}->{$apitakesnap}->{'maxVersion'}; - - $logstr = defined($apitakesnappath) ? "Path of $apitakesnap selected: $apitakesnappath" : "Path of $apitakesnap undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apitakesnapmaxver) ? "MaxVersion of $apitakesnap: $apitakesnapmaxver" : "MaxVersion of $apitakesnap undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apitakesnappath =~ tr/_//d if (defined($apitakesnappath)); + my $apitakesnapver = $data->{'data'}->{$apitakesnap}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.SurveillanceStation.PTZ" ermitteln + # Pfad und Version von "SYNO.SurveillanceStation.PTZ" ermitteln my $apiptzpath = $data->{'data'}->{$apiptz}->{'path'}; - $apiptzpath =~ tr/_//d if (defined($apiptzpath)); - my $apiptzmaxver = $data->{'data'}->{$apiptz}->{'maxVersion'}; - - $logstr = defined($apiptzpath) ? "Path of $apiptz selected: $apiptzpath" : "Path of $apiptz undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apiptzmaxver) ? "MaxVersion of $apiptz: $apiptzmaxver" : "MaxVersion of $apiptz undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apiptzpath =~ tr/_//d if (defined($apiptzpath)); + my $apiptzver = $data->{'data'}->{$apiptz}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.SurveillanceStation.PTZ.Preset" ermitteln + # Pfad und Version von "SYNO.SurveillanceStation.PTZ.Preset" ermitteln my $apipresetpath = $data->{'data'}->{$apipreset}->{'path'}; - $apipresetpath =~ tr/_//d if (defined($apipresetpath)); - my $apipresetmaxver = $data->{'data'}->{$apipreset}->{'maxVersion'}; - - $logstr = defined($apipresetpath) ? "Path of $apipreset selected: $apipresetpath" : "Path of $apipreset undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apipresetmaxver) ? "MaxVersion of $apipreset: $apipresetmaxver" : "MaxVersion of $apipreset undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apipresetpath =~ tr/_//d if (defined($apipresetpath)); + my $apipresetver = $data->{'data'}->{$apipreset}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.SurveillanceStation.Info" ermitteln + # Pfad und Version von "SYNO.SurveillanceStation.Info" ermitteln my $apisvsinfopath = $data->{'data'}->{$apisvsinfo}->{'path'}; - $apisvsinfopath =~ tr/_//d if (defined($apisvsinfopath)); - my $apisvsinfomaxver = $data->{'data'}->{$apisvsinfo}->{'maxVersion'}; - - $logstr = defined($apisvsinfopath) ? "Path of $apisvsinfo selected: $apisvsinfopath" : "Path of $apisvsinfo undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apisvsinfomaxver) ? "MaxVersion of $apisvsinfo: $apisvsinfomaxver" : "MaxVersion of $apisvsinfo undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apisvsinfopath =~ tr/_//d if (defined($apisvsinfopath)); + my $apisvsinfover = $data->{'data'}->{$apisvsinfo}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.Surveillance.Camera.Event" ermitteln + # Pfad und Version von "SYNO.Surveillance.Camera.Event" ermitteln my $apicameventpath = $data->{'data'}->{$apicamevent}->{'path'}; $apicameventpath =~ tr/_//d if (defined($apicameventpath)); - my $apicameventmaxver = $data->{'data'}->{$apicamevent}->{'maxVersion'}; - - $logstr = defined($apicameventpath) ? "Path of $apicamevent selected: $apicameventpath" : "Path of $apicamevent undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apicameventmaxver) ? "MaxVersion of $apicamevent: $apicameventmaxver" : "MaxVersion of $apicamevent undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + my $apicameventver = $data->{'data'}->{$apicamevent}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.Surveillance.Event" ermitteln + # Pfad und Version von "SYNO.Surveillance.Event" ermitteln my $apieventpath = $data->{'data'}->{$apievent}->{'path'}; - $apieventpath =~ tr/_//d if (defined($apieventpath)); - my $apieventmaxver = $data->{'data'}->{$apievent}->{'maxVersion'}; - - $logstr = defined($apieventpath) ? "Path of $apievent selected: $apieventpath" : "Path of $apievent undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apieventmaxver) ? "MaxVersion of $apievent: $apieventmaxver" : "MaxVersion of $apievent undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apieventpath =~ tr/_//d if (defined($apieventpath)); + my $apieventver = $data->{'data'}->{$apievent}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.Surveillance.VideoStream" ermitteln + # Pfad und Version von "SYNO.Surveillance.VideoStream" ermitteln my $apivideostmpath = $data->{'data'}->{$apivideostm}->{'path'}; - $apivideostmpath =~ tr/_//d if (defined($apivideostmpath)); - my $apivideostmmaxver = $data->{'data'}->{$apivideostm}->{'maxVersion'}; - - $logstr = defined($apivideostmpath) ? "Path of $apivideostm selected: $apivideostmpath" : "Path of $apivideostm undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apivideostmmaxver) ? "MaxVersion of $apivideostm: $apivideostmmaxver" : "MaxVersion of $apivideostm undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apivideostmpath =~ tr/_//d if (defined($apivideostmpath)); + my $apivideostmver = $data->{'data'}->{$apivideostm}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.SurveillanceStation.ExternalEvent" ermitteln + # Pfad und Version von "SYNO.SurveillanceStation.ExternalEvent" ermitteln my $apiextevtpath = $data->{'data'}->{$apiextevt}->{'path'}; - $apiextevtpath =~ tr/_//d if (defined($apiextevtpath)); - my $apiextevtmaxver = $data->{'data'}->{$apiextevt}->{'maxVersion'}; - - $logstr = defined($apiextevtpath) ? "Path of $apiextevt selected: $apiextevtpath" : "Path of $apiextevt undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apiextevtmaxver) ? "MaxVersion of $apiextevt selected: $apiextevtmaxver" : "MaxVersion of $apiextevt undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apiextevtpath =~ tr/_//d if (defined($apiextevtpath)); + my $apiextevtver = $data->{'data'}->{$apiextevt}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.SurveillanceStation.Streaming" ermitteln + # Pfad und Version von "SYNO.SurveillanceStation.Streaming" ermitteln my $apistmpath = $data->{'data'}->{$apistm}->{'path'}; - $apistmpath =~ tr/_//d if (defined($apistmpath)); - my $apistmmaxver = $data->{'data'}->{$apistm}->{'maxVersion'}; - - $logstr = defined($apistmpath) ? "Path of $apistm selected: $apistmpath" : "Path of $apistm undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apistmmaxver) ? "MaxVersion of $apistm selected: $apistmmaxver" : "MaxVersion of $apistm undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apistmpath =~ tr/_//d if (defined($apistmpath)); + my $apistmver = $data->{'data'}->{$apistm}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.SurveillanceStation.HomeMode" ermitteln + # Pfad und Version von "SYNO.SurveillanceStation.HomeMode" ermitteln my $apihmpath = $data->{'data'}->{$apihm}->{'path'}; - $apihmpath =~ tr/_//d if (defined($apihmpath)); - my $apihmmaxver = $data->{'data'}->{$apihm}->{'maxVersion'}; - - $logstr = defined($apihmpath) ? "Path of $apihm selected: $apihmpath" : "Path of $apihm undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apihmmaxver) ? "MaxVersion of $apihm selected: $apihmmaxver" : "MaxVersion of $apihm undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apihmpath =~ tr/_//d if (defined($apihmpath)); + my $apihmver = $data->{'data'}->{$apihm}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.SurveillanceStation.Log" ermitteln + # Pfad und Version von "SYNO.SurveillanceStation.Log" ermitteln my $apilogpath = $data->{'data'}->{$apilog}->{'path'}; - $apilogpath =~ tr/_//d if (defined($apilogpath)); - my $apilogmaxver = $data->{'data'}->{$apilog}->{'maxVersion'}; - - $logstr = defined($apilogpath) ? "Path of $apilog selected: $apilogpath" : "Path of $apilog undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apilogmaxver) ? "MaxVersion of $apilog selected: $apilogmaxver" : "MaxVersion of $apilog undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apilogpath =~ tr/_//d if (defined($apilogpath)); + my $apilogver = $data->{'data'}->{$apilog}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.SurveillanceStation.AudioStream" ermitteln + # Pfad und Version von "SYNO.SurveillanceStation.AudioStream" ermitteln my $apiaudiostmpath = $data->{'data'}->{$apiaudiostm}->{'path'}; - $apiaudiostmpath =~ tr/_//d if (defined($apiaudiostmpath)); - my $apiaudiostmmaxver = $data->{'data'}->{$apiaudiostm}->{'maxVersion'}; - - $logstr = defined($apiaudiostmpath) ? "Path of $apiaudiostm selected: $apiaudiostmpath" : "Path of $apiaudiostm undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apiaudiostmmaxver) ? "MaxVersion of $apiaudiostm selected: $apiaudiostmmaxver" : "MaxVersion of $apiaudiostm undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apiaudiostmpath =~ tr/_//d if (defined($apiaudiostmpath)); + my $apiaudiostmver = $data->{'data'}->{$apiaudiostm}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.SurveillanceStation.VideoStream" ermitteln + # Pfad und Version von "SYNO.SurveillanceStation.VideoStream" ermitteln my $apivideostmspath = $data->{'data'}->{$apivideostms}->{'path'}; - $apivideostmspath =~ tr/_//d if (defined($apivideostmspath)); - my $apivideostmsmaxver = $data->{'data'}->{$apivideostms}->{'maxVersion'}; - - $logstr = defined($apivideostmspath) ? "Path of $apivideostms selected: $apivideostmspath" : "Path of $apivideostms undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apivideostmsmaxver) ? "MaxVersion of $apivideostms selected: $apivideostmsmaxver" : "MaxVersion of $apivideostms undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apivideostmspath =~ tr/_//d if (defined($apivideostmspath)); + my $apivideostmsver = $data->{'data'}->{$apivideostms}->{'maxVersion'}; - # Pfad und Maxversion von "SYNO.SurveillanceStation.Recording" ermitteln + # Pfad und Version von "SYNO.SurveillanceStation.Recording" ermitteln my $apirecpath = $data->{'data'}->{$apirec}->{'path'}; - $apirecpath =~ tr/_//d if (defined($apirecpath)); - my $apirecmaxver = $data->{'data'}->{$apirec}->{'maxVersion'}; - - $logstr = defined($apirecpath) ? "Path of $apirec selected: $apirecpath" : "Path of $apirec undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); - $logstr = defined($apirecmaxver) ? "MaxVersion of $apirec selected: $apirecmaxver" : "MaxVersion of $apirec undefined - Surveillance Station may be stopped"; - Log3($name, 4, "$name - $logstr"); + $apirecpath =~ tr/_//d if (defined($apirecpath)); + my $apirecver = $data->{'data'}->{$apirec}->{'maxVersion'}; # aktuelle oder simulierte SVS-Version für Fallentscheidung setzen my $major = $hash->{HELPER}{SVSVERSION}{MAJOR} // ""; @@ -4676,13 +4557,12 @@ sub getApiSites_Parse { # -> diese Steuerung erfolgt in den einzelnen Funktionsaufrufen in camOp Log3($name, 4, "$name - ------- Begin of adaption section -------"); - #$apiptzmaxver = 4; - #Log3($name, 4, "$name - MaxVersion of $apiptz adapted to: $apiptzmaxver"); - #$apicammaxver = 8; - #Log3($name, 4, "$name - MaxVersion of $apicam adapted to: $apicammaxver"); + #$apiptzver = 4; + #Log3($name, 4, "$name - Version of $apiptz adapted to: $apiptzver"); + #$apicamver = 8; + #Log3($name, 4, "$name - Version of $apicam adapted to: $apicamver"); Log3($name, 4, "$name - ------- End of adaption section -------"); - # Simulation anderer SVS-Versionen Log3($name, 4, "$name - ------- Begin of simulation section -------"); @@ -4690,48 +4570,52 @@ sub getApiSites_Parse { if (AttrVal($name, "simu_SVSversion", undef)) { Log3($name, 4, "$name - SVS version $actvs will be simulated"); if ($actvs =~ /^71/x) { - $apicammaxver = 8; - Log3($name, 4, "$name - MaxVersion of $apicam adapted to: $apicammaxver"); - $apiauthmaxver = 4; - Log3($name, 4, "$name - MaxVersion of $apiauth adapted to: $apiauthmaxver"); - $apiextrecmaxver = 2; - Log3($name, 4, "$name - MaxVersion of $apiextrec adapted to: $apiextrecmaxver"); - $apiptzmaxver = 4; - Log3($name, 4, "$name - MaxVersion of $apiptz adapted to: $apiptzmaxver"); + $apicamver = 8; + Log3($name, 4, "$name - Version of $apicam adapted to: $apicamver"); + $apiauthver = 4; + Log3($name, 4, "$name - Version of $apiauth adapted to: $apiauthver"); + $apiextrecver = 2; + Log3($name, 4, "$name - Version of $apiextrec adapted to: $apiextrecver"); + $apiptzver = 4; + Log3($name, 4, "$name - Version of $apiptz adapted to: $apiptzver"); + } elsif ($actvs =~ /^72/x) { - $apicammaxver = 8; - Log3($name, 4, "$name - MaxVersion of $apicam adapted to: $apicammaxver"); - $apiauthmaxver = 6; - Log3($name, 4, "$name - MaxVersion of $apiauth adapted to: $apiauthmaxver"); - $apiextrecmaxver = 3; - Log3($name, 4, "$name - MaxVersion of $apiextrec adapted to: $apiextrecmaxver"); - $apiptzmaxver = 5; - Log3($name, 4, "$name - MaxVersion of $apiptz adapted to: $apiptzmaxver"); + $apicamver = 8; + Log3($name, 4, "$name - Version of $apicam adapted to: $apicamver"); + $apiauthver = 6; + Log3($name, 4, "$name - Version of $apiauth adapted to: $apiauthver"); + $apiextrecver = 3; + Log3($name, 4, "$name - Version of $apiextrec adapted to: $apiextrecver"); + $apiptzver = 5; + Log3($name, 4, "$name - Version of $apiptz adapted to: $apiptzver"); + } elsif ($actvs =~ /^800/x) { - $apicammaxver = 9; - Log3($name, 4, "$name - MaxVersion of $apicam adapted to: $apicammaxver"); - $apiauthmaxver = 6; - Log3($name, 4, "$name - MaxVersion of $apiauth adapted to: $apiauthmaxver"); - $apiextrecmaxver = 3; - Log3($name, 4, "$name - MaxVersion of $apiextrec adapted to: $apiextrecmaxver"); - $apiptzmaxver = 5; - Log3($name, 4, "$name - MaxVersion of $apiptz adapted to: $apiptzmaxver"); + $apicamver = 9; + Log3($name, 4, "$name - Version of $apicam adapted to: $apicamver"); + $apiauthver = 6; + Log3($name, 4, "$name - Version of $apiauth adapted to: $apiauthver"); + $apiextrecver = 3; + Log3($name, 4, "$name - Version of $apiextrec adapted to: $apiextrecver"); + $apiptzver = 5; + Log3($name, 4, "$name - Version of $apiptz adapted to: $apiptzver"); + } elsif ($actvs =~ /^815/x) { - $apicammaxver = 9; - Log3($name, 4, "$name - MaxVersion of $apicam adapted to: $apicammaxver"); - $apiauthmaxver = 6; - Log3($name, 4, "$name - MaxVersion of $apiauth adapted to: $apiauthmaxver"); - $apiextrecmaxver = 3; - Log3($name, 4, "$name - MaxVersion of $apiextrec adapted to: $apiextrecmaxver"); - $apiptzmaxver = 5; - Log3($name, 4, "$name - MaxVersion of $apiptz adapted to: $apiptzmaxver"); + $apicamver = 9; + Log3($name, 4, "$name - Version of $apicam adapted to: $apicamver"); + $apiauthver = 6; + Log3($name, 4, "$name - Version of $apiauth adapted to: $apiauthver"); + $apiextrecver = 3; + Log3($name, 4, "$name - Version of $apiextrec adapted to: $apiextrecver"); + $apiptzver = 5; + Log3($name, 4, "$name - Version of $apiptz adapted to: $apiptzver"); + } elsif ($actvs =~ /^820/x) { # ab API v2.8 kein "SYNO.SurveillanceStation.VideoStream", "SYNO.SurveillanceStation.AudioStream", # "SYNO.SurveillanceStation.Streaming" mehr enthalten - $apivideostmsmaxver = 0; - Log3($name, 4, "$name - MaxVersion of $apivideostms adapted to: $apivideostmsmaxver"); - $apiaudiostmmaxver = 0; - Log3($name, 4, "$name - MaxVersion of $apiaudiostm adapted to: $apiaudiostmmaxver"); + $apivideostmsver = 0; + Log3($name, 4, "$name - Version of $apivideostms adapted to: $apivideostmsver"); + $apiaudiostmver = 0; + Log3($name, 4, "$name - Version of $apiaudiostm adapted to: $apiaudiostmver"); } } else { @@ -4740,49 +4624,49 @@ sub getApiSites_Parse { Log3($name, 4, "$name - ------- End of simulation section -------"); # ermittelte Werte in $hash einfügen - $hash->{HELPER}{APIAUTHPATH} = $apiauthpath; - $hash->{HELPER}{APIAUTHMAXVER} = $apiauthmaxver; - $hash->{HELPER}{APIEXTRECPATH} = $apiextrecpath; - $hash->{HELPER}{APIEXTRECMAXVER} = $apiextrecmaxver; - $hash->{HELPER}{APICAMPATH} = $apicampath; - $hash->{HELPER}{APICAMMAXVER} = $apicammaxver; - $hash->{HELPER}{APITAKESNAPPATH} = $apitakesnappath; - $hash->{HELPER}{APITAKESNAPMAXVER} = $apitakesnapmaxver; - $hash->{HELPER}{APIPTZPATH} = $apiptzpath; - $hash->{HELPER}{APIPTZMAXVER} = $apiptzmaxver; - $hash->{HELPER}{APIPRESETPATH} = $apipresetpath; - $hash->{HELPER}{APIPRESETMAXVER} = $apipresetmaxver; - $hash->{HELPER}{APISVSINFOPATH} = $apisvsinfopath; - $hash->{HELPER}{APISVSINFOMAXVER} = $apisvsinfomaxver; - $hash->{HELPER}{APICAMEVENTPATH} = $apicameventpath; - $hash->{HELPER}{APICAMEVENTMAXVER} = $apicameventmaxver; - $hash->{HELPER}{APIEVENTPATH} = $apieventpath; - $hash->{HELPER}{APIEVENTMAXVER} = $apieventmaxver; - $hash->{HELPER}{APIVIDEOSTMPATH} = $apivideostmpath; - $hash->{HELPER}{APIVIDEOSTMMAXVER} = $apivideostmmaxver; - $hash->{HELPER}{APIAUDIOSTMPATH} = $apiaudiostmpath?$apiaudiostmpath:"undefinded"; - $hash->{HELPER}{APIAUDIOSTMMAXVER} = $apiaudiostmmaxver?$apiaudiostmmaxver:0; - $hash->{HELPER}{APIEXTEVTPATH} = $apiextevtpath; - $hash->{HELPER}{APIEXTEVTMAXVER} = $apiextevtmaxver; - $hash->{HELPER}{APISTMPATH} = $apistmpath; - $hash->{HELPER}{APISTMMAXVER} = $apistmmaxver; - $hash->{HELPER}{APIHMPATH} = $apihmpath; - $hash->{HELPER}{APIHMMAXVER} = $apihmmaxver; - $hash->{HELPER}{APILOGPATH} = $apilogpath; - $hash->{HELPER}{APILOGMAXVER} = $apilogmaxver; - $hash->{HELPER}{APIVIDEOSTMSPATH} = $apivideostmspath?$apivideostmspath:"undefinded"; - $hash->{HELPER}{APIVIDEOSTMSMAXVER} = $apivideostmsmaxver?$apivideostmsmaxver:0; - $hash->{HELPER}{APIRECPATH} = $apirecpath; - $hash->{HELPER}{APIRECMAXVER} = $apirecmaxver; + $hash->{HELPER}{API}{AUTH}{PATH} = $apiauthpath; + $hash->{HELPER}{API}{AUTH}{VER} = $apiauthver; + $hash->{HELPER}{API}{EXTREC}{PATH} = $apiextrecpath; + $hash->{HELPER}{API}{EXTREC}{VER} = $apiextrecver; + $hash->{HELPER}{API}{CAM}{PATH} = $apicampath; + $hash->{HELPER}{API}{CAM}{VER} = $apicamver; + $hash->{HELPER}{API}{SNAPSHOT}{PATH} = $apitakesnappath; + $hash->{HELPER}{API}{SNAPSHOT}{VER} = $apitakesnapver; + $hash->{HELPER}{API}{PTZ}{PATH} = $apiptzpath; + $hash->{HELPER}{API}{PTZ}{VER} = $apiptzver; + $hash->{HELPER}{API}{PRESET}{PATH} = $apipresetpath; + $hash->{HELPER}{API}{PRESET}{VER} = $apipresetver; + $hash->{HELPER}{API}{SVSINFO}{PATH} = $apisvsinfopath; + $hash->{HELPER}{API}{SVSINFO}{VER} = $apisvsinfover; + $hash->{HELPER}{API}{CAMEVENT}{PATH} = $apicameventpath; + $hash->{HELPER}{API}{CAMEVENT}{VER} = $apicameventver; + $hash->{HELPER}{API}{EVENT}{PATH} = $apieventpath; + $hash->{HELPER}{API}{EVENT}{VER} = $apieventver; + $hash->{HELPER}{API}{VIDEOSTM}{PATH} = $apivideostmpath; + $hash->{HELPER}{API}{VIDEOSTM}{VER} = $apivideostmver; + $hash->{HELPER}{API}{AUDIOSTM}{PATH} = $apiaudiostmpath ? $apiaudiostmpath : "undefinded"; + $hash->{HELPER}{API}{AUDIOSTM}{VER} = $apiaudiostmver ? $apiaudiostmver : 0; + $hash->{HELPER}{API}{EXTEVT}{PATH} = $apiextevtpath; + $hash->{HELPER}{API}{EXTEVT}{VER} = $apiextevtver; + $hash->{HELPER}{API}{STM}{PATH} = $apistmpath; + $hash->{HELPER}{API}{STM}{VER} = $apistmver; + $hash->{HELPER}{API}{HMODE}{PATH} = $apihmpath; + $hash->{HELPER}{API}{HMODE}{VER} = $apihmver; + $hash->{HELPER}{API}{LOG}{PATH} = $apilogpath; + $hash->{HELPER}{API}{LOG}{VER} = $apilogver; + $hash->{HELPER}{API}{VIDEOSTMS}{PATH} = $apivideostmspath ? $apivideostmspath : "undefinded"; + $hash->{HELPER}{API}{VIDEOSTMS}{VER} = $apivideostmsver ? $apivideostmsver : 0; + $hash->{HELPER}{API}{REC}{PATH} = $apirecpath; + $hash->{HELPER}{API}{REC}{VER} = $apirecver; - readingsBeginUpdate($hash); readingsBulkUpdate ($hash,"Errorcode","none"); readingsBulkUpdate ($hash,"Error", "none"); readingsEndUpdate ($hash,1); - # API Hash values sind gesetzt - $hash->{HELPER}{APIPARSET} = 1; + $hash->{HELPER}{API}{PARSET} = 1; # API Hash values sind gesetzt + + Log3 ($name, 4, "$name - API completed after retrieval and adaption:\n".Dumper $hash->{HELPER}{API}); } else { my $error = "couldn't call API-Infosite"; @@ -4794,8 +4678,7 @@ sub getApiSites_Parse { Log3($name, 2, "$name - ERROR - the API-Query couldn't be executed successfully"); - # ausgeführte Funktion ist abgebrochen, Freigabe Funktionstoken - delActiveToken($hash); + delActiveToken($hash); # ausgeführte Funktion ist abgebrochen, Freigabe Funktionstoken return; } } @@ -4846,9 +4729,9 @@ sub getCamId { my $name = $hash->{NAME}; my $serveraddr = $hash->{SERVERADDR}; my $serverport = $hash->{SERVERPORT}; - my $apicam = $hash->{HELPER}{APICAM}; - my $apicampath = $hash->{HELPER}{APICAMPATH}; - my $apicammaxver = $hash->{HELPER}{APICAMMAXVER}; + my $apicam = $hash->{HELPER}{API}{CAM}{NAME}; + my $apicampath = $hash->{HELPER}{API}{CAM}{PATH}; + my $apicamver = $hash->{HELPER}{API}{CAM}{VER}; my $sid = $hash->{HELPER}{SID}; my $proto = $hash->{PROTOCOL}; @@ -4866,9 +4749,9 @@ sub getCamId { my $httptimeout = AttrVal($name,"httptimeout", 4); Log3($name, 5, "$name - HTTP-Call will be done with httptimeout-Value: $httptimeout s"); - $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=$apicam&version=$apicammaxver&method=List&basic=true&streamInfo=true&camStm=true&_sid=\"$sid\""; - if ($apicammaxver >= 9) { - $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=$apicam&version=$apicammaxver&method=\"List\"&basic=true&streamInfo=true&camStm=0&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=$apicam&version=$apicamver&method=List&basic=true&streamInfo=true&camStm=true&_sid=\"$sid\""; + if ($apicamver >= 9) { + $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=$apicam&version=$apicamver&method=\"List\"&basic=true&streamInfo=true&camStm=0&_sid=\"$sid\""; } Log3($name, 4, "$name - Call-Out now: $url"); @@ -4895,7 +4778,7 @@ sub getCamId_Parse { my $hash = $param->{hash}; my $name = $hash->{NAME}; my $camname = $hash->{CAMNAME}; - my $apicammaxver = $hash->{HELPER}{APICAMMAXVER}; + my $apicamver = $hash->{HELPER}{API}{CAM}{VER}; my $OpMode = $hash->{OPMODE}; my ($data,$success,$error,$errorcode,$camid); my ($i,$n,$id,$errstate,$camdef,$nrcreated); @@ -4934,7 +4817,7 @@ sub getCamId_Parse { # Namen aller installierten Kameras mit Id's in Assoziatives Array einlesen %allcams = (); while ($data->{'data'}->{'cameras'}->[$i]) { - if ($apicammaxver <= 8) { + if ($apicamver <= 8) { $n = $data->{'data'}->{'cameras'}->[$i]->{'name'}; } else { $n = $data->{'data'}->{'cameras'}->[$i]->{'newName'}; # Änderung ab SVS 8.0.0 @@ -5028,61 +4911,61 @@ return camOp($hash); sub camOp { my $hash = shift; - my $name = $hash->{NAME}; - my $apicam = $hash->{HELPER}{APICAM}; # SYNO.SurveillanceStation.Camera - my $apicampath = $hash->{HELPER}{APICAMPATH}; - my $apicammaxver = $hash->{HELPER}{APICAMMAXVER}; - my $apiextrec = $hash->{HELPER}{APIEXTREC}; # SYNO.SurveillanceStation.ExternalRecording - my $apiextrecpath = $hash->{HELPER}{APIEXTRECPATH}; - my $apiextrecmaxver = $hash->{HELPER}{APIEXTRECMAXVER}; - my $apiextevt = $hash->{HELPER}{APIEXTEVT}; # SYNO.SurveillanceStation.ExternalEvent - my $apiextevtpath = $hash->{HELPER}{APIEXTEVTPATH}; - my $apiextevtmaxver = $hash->{HELPER}{APIEXTEVTMAXVER}; - my $apitakesnap = $hash->{HELPER}{APISNAPSHOT}; # SYNO.SurveillanceStation.SnapShot - my $apitakesnappath = $hash->{HELPER}{APITAKESNAPPATH}; - my $apitakesnapmaxver = $hash->{HELPER}{APITAKESNAPMAXVER}; - my $apiptz = $hash->{HELPER}{APIPTZ}; # SYNO.SurveillanceStation.PTZ - my $apiptzpath = $hash->{HELPER}{APIPTZPATH}; - my $apiptzmaxver = $hash->{HELPER}{APIPTZMAXVER}; - my $apipreset = $hash->{HELPER}{APIPRESET}; # SYNO.SurveillanceStation.PTZ.Preset - my $apipresetpath = $hash->{HELPER}{APIPRESETPATH}; - my $apipresetmaxver = $hash->{HELPER}{APIPRESETMAXVER}; - my $apisvsinfo = $hash->{HELPER}{APISVSINFO}; # SYNO.SurveillanceStation.Info - my $apisvsinfopath = $hash->{HELPER}{APISVSINFOPATH}; - my $apisvsinfomaxver = $hash->{HELPER}{APISVSINFOMAXVER}; - my $apicamevent = $hash->{HELPER}{APICAMEVENT}; # SYNO.SurveillanceStation.Camera.Event - my $apicameventpath = $hash->{HELPER}{APICAMEVENTPATH}; - my $apicameventmaxver = $hash->{HELPER}{APICAMEVENTMAXVER}; - my $apievent = $hash->{HELPER}{APIEVENT}; # SYNO.SurveillanceStation.Event - my $apieventpath = $hash->{HELPER}{APIEVENTPATH}; - my $apieventmaxver = $hash->{HELPER}{APIEVENTMAXVER}; - my $apivideostm = $hash->{HELPER}{APIVIDEOSTM}; # SYNO.SurveillanceStation.VideoStreaming - my $apivideostmpath = $hash->{HELPER}{APIVIDEOSTMPATH}; - my $apivideostmmaxver = $hash->{HELPER}{APIVIDEOSTMMAXVER}; - my $apiaudiostm = $hash->{HELPER}{APIAUDIOSTM}; # SYNO.SurveillanceStation.AudioStream - my $apiaudiostmpath = $hash->{HELPER}{APIAUDIOSTMPATH}; - my $apiaudiostmmaxver = $hash->{HELPER}{APIAUDIOSTMMAXVER}; - my $apistm = $hash->{HELPER}{APISTM}; # SYNO.SurveillanceStation.Stream - my $apistmpath = $hash->{HELPER}{APISTMPATH}; - my $apistmmaxver = $hash->{HELPER}{APISTMMAXVER}; - my $apihm = $hash->{HELPER}{APIHM}; # SYNO.SurveillanceStation.HomeMode - my $apihmpath = $hash->{HELPER}{APIHMPATH}; - my $apihmmaxver = $hash->{HELPER}{APIHMMAXVER}; - my $apilog = $hash->{HELPER}{APILOG}; # SYNO.SurveillanceStation.Log - my $apilogpath = $hash->{HELPER}{APILOGPATH}; - my $apilogmaxver = $hash->{HELPER}{APILOGMAXVER}; - my $apivideostms = $hash->{HELPER}{APIVIDEOSTMS}; # SYNO.SurveillanceStation.VideoStream - my $apivideostmspath = $hash->{HELPER}{APIVIDEOSTMSPATH}; - my $apivideostmsmaxver = $hash->{HELPER}{APIVIDEOSTMSMAXVER}; - my $apirec = $hash->{HELPER}{APIREC}; # SYNO.SurveillanceStation.Recording - my $apirecpath = $hash->{HELPER}{APIRECPATH}; - my $apirecmaxver = $hash->{HELPER}{APIRECMAXVER}; - my $sid = $hash->{HELPER}{SID}; - my $OpMode = $hash->{OPMODE}; - my $camid = $hash->{CAMID}; - my $proto = $hash->{PROTOCOL}; - my $serveraddr = $hash->{SERVERADDR}; - my $serverport = $hash->{SERVERPORT}; + my $name = $hash->{NAME}; + my $apicam = $hash->{HELPER}{API}{CAM}{NAME}; # SYNO.SurveillanceStation.Camera + my $apicampath = $hash->{HELPER}{API}{CAM}{PATH}; + my $apicamver = $hash->{HELPER}{API}{CAM}{VER}; + my $apiextrec = $hash->{HELPER}{API}{EXTREC}{NAME}; # SYNO.SurveillanceStation.ExternalRecording + my $apiextrecpath = $hash->{HELPER}{API}{EXTREC}{PATH}; + my $apiextrecver = $hash->{HELPER}{API}{EXTREC}{VER}; + my $apiextevt = $hash->{HELPER}{API}{EXTEVT}{NAME}; # SYNO.SurveillanceStation.ExternalEvent + my $apiextevtpath = $hash->{HELPER}{API}{EXTEVT}{PATH}; + my $apiextevtver = $hash->{HELPER}{API}{EXTEVT}{VER}; + my $apitakesnap = $hash->{HELPER}{API}{SNAPSHOT}{NAME}; # SYNO.SurveillanceStation.SnapShot + my $apitakesnappath = $hash->{HELPER}{API}{SNAPSHOT}{PATH}; + my $apitakesnapver = $hash->{HELPER}{API}{SNAPSHOT}{VER}; + my $apiptz = $hash->{HELPER}{API}{PTZ}{NAME}; # SYNO.SurveillanceStation.PTZ + my $apiptzpath = $hash->{HELPER}{API}{PTZ}{PATH}; + my $apiptzver = $hash->{HELPER}{API}{PTZ}{VER}; + my $apipreset = $hash->{HELPER}{API}{PRESET}{NAME}; # SYNO.SurveillanceStation.PTZ.Preset + my $apipresetpath = $hash->{HELPER}{API}{PRESET}{PATH}; + my $apipresetver = $hash->{HELPER}{API}{PRESET}{VER}; + my $apisvsinfo = $hash->{HELPER}{API}{SVSINFO}{NAME}; # SYNO.SurveillanceStation.Info + my $apisvsinfopath = $hash->{HELPER}{API}{SVSINFO}{PATH}; + my $apisvsinfover = $hash->{HELPER}{API}{SVSINFO}{VER}; + my $apicamevent = $hash->{HELPER}{API}{CAMEVENT}{NAME}; # SYNO.SurveillanceStation.Camera.Event + my $apicameventpath = $hash->{HELPER}{API}{CAMEVENT}{PATH}; + my $apicameventver = $hash->{HELPER}{API}{CAMEVENT}{VER}; + my $apievent = $hash->{HELPER}{API}{EVENT}{NAME}; # SYNO.SurveillanceStation.Event + my $apieventpath = $hash->{HELPER}{API}{EVENT}{PATH}; + my $apieventver = $hash->{HELPER}{API}{EVENT}{VER}; + my $apivideostm = $hash->{HELPER}{API}{VIDEOSTM}{NAME}; # SYNO.SurveillanceStation.VideoStreaming + my $apivideostmpath = $hash->{HELPER}{API}{VIDEOSTM}{PATH}; + my $apivideostmver = $hash->{HELPER}{API}{VIDEOSTM}{VER}; + my $apiaudiostm = $hash->{HELPER}{API}{AUDIOSTM}{NAME}; # SYNO.SurveillanceStation.AudioStream + my $apiaudiostmpath = $hash->{HELPER}{API}{AUDIOSTM}{PATH}; + my $apiaudiostmver = $hash->{HELPER}{API}{AUDIOSTM}{VER}; + my $apistm = $hash->{HELPER}{API}{STM}{NAME}; # SYNO.SurveillanceStation.Stream + my $apistmpath = $hash->{HELPER}{API}{STM}{PATH}; + my $apistmver = $hash->{HELPER}{API}{STM}{VER}; + my $apihm = $hash->{HELPER}{API}{HMODE}{NAME}; # SYNO.SurveillanceStation.HomeMode + my $apihmpath = $hash->{HELPER}{API}{HMODE}{PATH}; + my $apihmver = $hash->{HELPER}{API}{HMODE}{VER}; + my $apilog = $hash->{HELPER}{API}{LOG}{NAME}; # SYNO.SurveillanceStation.Log + my $apilogpath = $hash->{HELPER}{API}{LOG}{PATH}; + my $apilogver = $hash->{HELPER}{API}{LOG}{VER}; + my $apivideostms = $hash->{HELPER}{API}{VIDEOSTMS}{NAME}; # SYNO.SurveillanceStation.VideoStream + my $apivideostmspath = $hash->{HELPER}{API}{VIDEOSTMS}{PATH}; + my $apivideostmsver = $hash->{HELPER}{API}{VIDEOSTMS}{VER}; + my $apirec = $hash->{HELPER}{API}{REC}{NAME}; # SYNO.SurveillanceStation.Recording + my $apirecpath = $hash->{HELPER}{API}{REC}{PATH}; + my $apirecver = $hash->{HELPER}{API}{REC}{VER}; + my $sid = $hash->{HELPER}{SID}; + my $OpMode = $hash->{OPMODE}; + my $camid = $hash->{CAMID}; + my $proto = $hash->{PROTOCOL}; + my $serveraddr = $hash->{SERVERADDR}; + my $serverport = $hash->{SERVERPORT}; my ($exturl,$winname,$attr,$room,$param); my ($url,$httptimeout,$expmode,$motdetsc); @@ -5094,26 +4977,26 @@ sub camOp { Log3($name, 5, "$name - HTTP-Call will be done with httptimeout-Value: $httptimeout s"); if ($OpMode eq "Start") { - $url = "$proto://$serveraddr:$serverport/webapi/$apiextrecpath?api=$apiextrec&method=Record&version=$apiextrecmaxver&cameraId=$camid&action=start&_sid=\"$sid\""; - if($apiextrecmaxver >= 3) { - $url = "$proto://$serveraddr:$serverport/webapi/$apiextrecpath?api=$apiextrec&method=Record&version=$apiextrecmaxver&cameraIds=$camid&action=start&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apiextrecpath?api=$apiextrec&method=Record&version=$apiextrecver&cameraId=$camid&action=start&_sid=\"$sid\""; + if($apiextrecver >= 3) { + $url = "$proto://$serveraddr:$serverport/webapi/$apiextrecpath?api=$apiextrec&method=Record&version=$apiextrecver&cameraIds=$camid&action=start&_sid=\"$sid\""; } } elsif ($OpMode eq "Stop") { - $url = "$proto://$serveraddr:$serverport/webapi/$apiextrecpath?api=$apiextrec&method=Record&version=$apiextrecmaxver&cameraId=$camid&action=stop&_sid=\"$sid\""; - if($apiextrecmaxver >= 3) { - $url = "$proto://$serveraddr:$serverport/webapi/$apiextrecpath?api=$apiextrec&method=Record&version=$apiextrecmaxver&cameraIds=$camid&action=stop&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apiextrecpath?api=$apiextrec&method=Record&version=$apiextrecver&cameraId=$camid&action=stop&_sid=\"$sid\""; + if($apiextrecver >= 3) { + $url = "$proto://$serveraddr:$serverport/webapi/$apiextrecpath?api=$apiextrec&method=Record&version=$apiextrecver&cameraIds=$camid&action=stop&_sid=\"$sid\""; } } elsif ($OpMode eq "Snap") { # ein Schnappschuß wird ausgelöst - $url = "$proto://$serveraddr:$serverport/webapi/$apitakesnappath?api=\"$apitakesnap\"&dsId=\"0\"&method=\"TakeSnapshot\"&version=\"$apitakesnapmaxver\"&camId=\"$camid\"&blSave=\"true\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apitakesnappath?api=\"$apitakesnap\"&dsId=\"0\"&method=\"TakeSnapshot\"&version=\"$apitakesnapver\"&camId=\"$camid\"&blSave=\"true\"&_sid=\"$sid\""; readingsSingleUpdate($hash,"state", "snap", 1); } elsif ($OpMode eq "SaveRec" || $OpMode eq "GetRec") { # eine Aufnahme soll in lokalem File (.mp4) gespeichert werden my $recid = ReadingsVal("$name", "CamLastRecId", 0); if($recid) { - $url = "$proto://$serveraddr:$serverport/webapi/$apirecpath?api=\"$apirec\"&id=$recid&mountId=0&version=\"$apirecmaxver\"&method=\"Download\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apirecpath?api=\"$apirec\"&id=$recid&mountId=0&version=\"$apirecver\"&method=\"Download\"&_sid=\"$sid\""; } else { Log3($name, 2, "$name - WARNING - Can't fetch recording due to no recording available."); delActiveToken($hash); @@ -5129,32 +5012,32 @@ sub camOp { if($OpMode eq "getsnapinfo" && $snapid =~/\d+/x) { # getsnapinfo UND Reading LastSnapId gesetzt Log3($name,4, "$name - Call getsnapinfo with params: Image numbers => $limit, Image size => $imgsize, Id => $snapid"); - $url = "$proto://$serveraddr:$serverport/webapi/$apitakesnappath?api=\"$apitakesnap\"&method=\"List\"&version=\"$apitakesnapmaxver\"&idList=\"$snapid\"&imgSize=\"$imgsize\"&limit=\"$limit\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apitakesnappath?api=\"$apitakesnap\"&method=\"List\"&version=\"$apitakesnapver\"&idList=\"$snapid\"&imgSize=\"$imgsize\"&limit=\"$limit\"&_sid=\"$sid\""; } else { # snapgallery oder kein Reading LastSnapId gesetzt Log3($name,4, "$name - Call getsnapinfo with params: Image numbers => $limit, Image size => $imgsize, Keyword => $keyword"); - $url = "$proto://$serveraddr:$serverport/webapi/$apitakesnappath?api=\"$apitakesnap\"&method=\"List\"&version=\"$apitakesnapmaxver\"&keyword=\"$keyword\"&imgSize=\"$imgsize\"&limit=\"$limit\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apitakesnappath?api=\"$apitakesnap\"&method=\"List\"&version=\"$apitakesnapver\"&keyword=\"$keyword\"&imgSize=\"$imgsize\"&limit=\"$limit\"&_sid=\"$sid\""; } } elsif ($OpMode eq "getsnapfilename") { # der Filename der aktuellen Schnappschuß-ID wird ermittelt my $snapid = ReadingsVal("$name", "LastSnapId", ""); Log3($name, 4, "$name - Get filename of present Snap-ID $snapid"); - $url = "$proto://$serveraddr:$serverport/webapi/$apitakesnappath?api=\"$apitakesnap\"&method=\"List\"&version=\"$apitakesnapmaxver\"&imgSize=\"0\"&idList=\"$snapid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apitakesnappath?api=\"$apitakesnap\"&method=\"List\"&version=\"$apitakesnapver\"&imgSize=\"0\"&idList=\"$snapid\"&_sid=\"$sid\""; } elsif ($OpMode eq "gopreset") { # Preset wird angefahren - $apiptzmaxver = ($apiptzmaxver >= 5)?4:$apiptzmaxver; - $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=\"$apiptz\"&version=\"$apiptzmaxver\"&method=\"GoPreset\"&position=\"$hash->{HELPER}{ALLPRESETS}{$hash->{HELPER}{GOPRESETNAME}}\"&cameraId=\"$camid\"&_sid=\"$sid\""; + $apiptzver = ($apiptzver >= 5) ? 4 : $apiptzver; + $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=\"$apiptz\"&version=\"$apiptzver\"&method=\"GoPreset\"&position=\"$hash->{HELPER}{ALLPRESETS}{$hash->{HELPER}{GOPRESETNAME}}\"&cameraId=\"$camid\"&_sid=\"$sid\""; } elsif ($OpMode eq "getPresets") { # Liste der Presets abrufen - $url = "$proto://$serveraddr:$serverport/webapi/$apipresetpath?api=\"$apipreset\"&version=\"$apipresetmaxver\"&method=\"Enum\"&cameraId=\"$camid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apipresetpath?api=\"$apipreset\"&version=\"$apipresetver\"&method=\"Enum\"&cameraId=\"$camid\"&_sid=\"$sid\""; } elsif ($OpMode eq "piract") { # PIR Sensor aktivieren/deaktivieren my $piract = $hash->{HELPER}{PIRACT}; - $url = "$proto://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventmaxver\"&method=\"PDParamSave\"&keep=true&source=$piract&camId=\"$camid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventver\"&method=\"PDParamSave\"&keep=true&source=$piract&camId=\"$camid\"&_sid=\"$sid\""; } elsif ($OpMode eq "setPreset") { # einen Preset setzen @@ -5162,31 +5045,31 @@ sub camOp { my $pname = $hash->{HELPER}{PNAME}; my $pspeed = $hash->{HELPER}{PSPEED}; if ($pspeed) { - $url = "$proto://$serveraddr:$serverport/webapi/$apipresetpath?api=\"$apipreset\"&version=\"$apipresetmaxver\"&method=\"SetPreset\"&position=$pnumber&name=\"$pname\"&speed=\"$pspeed\"&cameraId=\"$camid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apipresetpath?api=\"$apipreset\"&version=\"$apipresetver\"&method=\"SetPreset\"&position=$pnumber&name=\"$pname\"&speed=\"$pspeed\"&cameraId=\"$camid\"&_sid=\"$sid\""; } else { - $url = "$proto://$serveraddr:$serverport/webapi/$apipresetpath?api=\"$apipreset\"&version=\"$apipresetmaxver\"&method=\"SetPreset\"&position=$pnumber&name=\"$pname\"&cameraId=\"$camid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apipresetpath?api=\"$apipreset\"&version=\"$apipresetver\"&method=\"SetPreset\"&position=$pnumber&name=\"$pname\"&cameraId=\"$camid\"&_sid=\"$sid\""; } } elsif ($OpMode eq "delPreset") { # einen Preset löschen - $url = "$proto://$serveraddr:$serverport/webapi/$apipresetpath?api=\"$apipreset\"&version=\"$apipresetmaxver\"&method=\"DelPreset\"&position=\"$hash->{HELPER}{ALLPRESETS}{$hash->{HELPER}{DELPRESETNAME}}\"&cameraId=\"$camid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apipresetpath?api=\"$apipreset\"&version=\"$apipresetver\"&method=\"DelPreset\"&position=\"$hash->{HELPER}{ALLPRESETS}{$hash->{HELPER}{DELPRESETNAME}}\"&cameraId=\"$camid\"&_sid=\"$sid\""; } elsif ($OpMode eq "setHome") { # aktuelle Position als Home setzen if($hash->{HELPER}{SETHOME} eq "---currentPosition---") { - $url = "$proto://$serveraddr:$serverport/webapi/$apipresetpath?api=\"$apipreset\"&version=\"$apipresetmaxver\"&method=\"SetHome\"&cameraId=\"$camid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apipresetpath?api=\"$apipreset\"&version=\"$apipresetver\"&method=\"SetHome\"&cameraId=\"$camid\"&_sid=\"$sid\""; } else { my $bindpos = $hash->{HELPER}{ALLPRESETS}{$hash->{HELPER}{SETHOME}}; - $url = "$proto://$serveraddr:$serverport/webapi/$apipresetpath?api=\"$apipreset\"&version=\"$apipresetmaxver\"&method=\"SetHome\"&bindPosition=\"$bindpos\"&cameraId=\"$camid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apipresetpath?api=\"$apipreset\"&version=\"$apipresetver\"&method=\"SetHome\"&bindPosition=\"$bindpos\"&cameraId=\"$camid\"&_sid=\"$sid\""; } } elsif ($OpMode eq "startTrack") { # Object Tracking einschalten - $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=\"$apiptz\"&version=\"$apiptzmaxver\"&method=\"ObjTracking\"&cameraId=\"$camid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=\"$apiptz\"&version=\"$apiptzver\"&method=\"ObjTracking\"&cameraId=\"$camid\"&_sid=\"$sid\""; } elsif ($OpMode eq "stopTrack") { # Object Tracking stoppen - $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=\"$apiptz\"&version=\"$apiptzmaxver\"&method=\"ObjTracking\"&moveType=\"Stop\"&cameraId=\"$camid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=\"$apiptz\"&version=\"$apiptzver\"&method=\"ObjTracking\"&moveType=\"Stop\"&cameraId=\"$camid\"&_sid=\"$sid\""; } elsif ($OpMode eq "setZoom") { # Zoom in / stop / out @@ -5195,41 +5078,41 @@ sub camOp { my $sttime = $hash->{HELPER}{ZOOM}{STOPTIME} // ""; Log3($name, 4, qq{$name - execute operation Zoom "$dir:$moveType:$sttime"}); - $url = qq{$proto://$serveraddr:$serverport/webapi/$apiptzpath?api="$apiptz"&version="$apiptzmaxver"&method="Zoom"&cameraId="$camid"&control="$dir"&moveType="$moveType"&_sid="$sid"}; + $url = qq{$proto://$serveraddr:$serverport/webapi/$apiptzpath?api="$apiptz"&version="$apiptzver"&method="Zoom"&cameraId="$camid"&control="$dir"&moveType="$moveType"&_sid="$sid"}; } elsif ($OpMode eq "runpatrol") { # eine Überwachungstour starten - $url = qq{$proto://$serveraddr:$serverport/webapi/$apiptzpath?api="$apiptz"&version="$apiptzmaxver"&method="RunPatrol"&patrolId="$hash->{HELPER}{ALLPATROLS}{$hash->{HELPER}{GOPATROLNAME}}"&cameraId="$camid"&_sid="$sid"}; + $url = qq{$proto://$serveraddr:$serverport/webapi/$apiptzpath?api="$apiptz"&version="$apiptzver"&method="RunPatrol"&patrolId="$hash->{HELPER}{ALLPATROLS}{$hash->{HELPER}{GOPATROLNAME}}"&cameraId="$camid"&_sid="$sid"}; } elsif ($OpMode eq "goabsptz") { - $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=\"$apiptz\"&version=\"$apiptzmaxver\"&method=\"AbsPtz\"&cameraId=\"$camid\"&posX=\"$hash->{HELPER}{GOPTZPOSX}\"&posY=\"$hash->{HELPER}{GOPTZPOSY}\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=\"$apiptz\"&version=\"$apiptzver\"&method=\"AbsPtz\"&cameraId=\"$camid\"&posX=\"$hash->{HELPER}{GOPTZPOSX}\"&posY=\"$hash->{HELPER}{GOPTZPOSY}\"&_sid=\"$sid\""; } elsif ($OpMode eq "movestart") { - $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=\"$apiptz\"&version=\"$apiptzmaxver\"&method=\"Move\"&cameraId=\"$camid\"&direction=\"$hash->{HELPER}{GOMOVEDIR}\"&speed=\"3\"&moveType=\"Start\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=\"$apiptz\"&version=\"$apiptzver\"&method=\"Move\"&cameraId=\"$camid\"&direction=\"$hash->{HELPER}{GOMOVEDIR}\"&speed=\"3\"&moveType=\"Start\"&_sid=\"$sid\""; } elsif ($OpMode eq "movestop") { Log3($name, 4, "$name - Stop Camera $hash->{CAMNAME} moving to direction \"$hash->{HELPER}{GOMOVEDIR}\" now"); - $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=\"$apiptz\"&version=\"$apiptzmaxver\"&method=\"Move\"&cameraId=\"$camid\"&direction=\"$hash->{HELPER}{GOMOVEDIR}\"&moveType=\"Stop\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=\"$apiptz\"&version=\"$apiptzver\"&method=\"Move\"&cameraId=\"$camid\"&direction=\"$hash->{HELPER}{GOMOVEDIR}\"&moveType=\"Stop\"&_sid=\"$sid\""; } elsif ($OpMode eq "Enable") { - $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=$apicam&version=$apicammaxver&method=Enable&cameraIds=$camid&_sid=\"$sid\""; - if($apicammaxver >= 9) { - $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&version=$apicammaxver&method=\"Enable\"&idList=\"$camid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=$apicam&version=$apicamver&method=Enable&cameraIds=$camid&_sid=\"$sid\""; + if($apicamver >= 9) { + $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&version=$apicamver&method=\"Enable\"&idList=\"$camid\"&_sid=\"$sid\""; } } elsif ($OpMode eq "Disable") { - $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=$apicam&version=$apicammaxver&method=Disable&cameraIds=$camid&_sid=\"$sid\""; - if($apicammaxver >= 9) { - $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&version=$apicammaxver&method=\"Disable\"&idList=\"$camid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=$apicam&version=$apicamver&method=Disable&cameraIds=$camid&_sid=\"$sid\""; + if($apicamver >= 9) { + $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&version=$apicamver&method=\"Disable\"&idList=\"$camid\"&_sid=\"$sid\""; } } elsif ($OpMode eq "sethomemode") { my $sw = $hash->{HELPER}{HOMEMODE}; # HomeMode on,off - $sw = ($sw eq "on")?"true":"false"; - $url = "$proto://$serveraddr:$serverport/webapi/$apihmpath?on=$sw&api=$apihm&method=Switch&version=$apihmmaxver&_sid=\"$sid\""; + $sw = ($sw eq "on") ? "true" : "false"; + $url = "$proto://$serveraddr:$serverport/webapi/$apihmpath?on=$sw&api=$apihm&method=Switch&version=$apihmver&_sid=\"$sid\""; } elsif ($OpMode eq "gethomemodestate") { - $url = "$proto://$serveraddr:$serverport/webapi/$apihmpath?api=$apihm&method=GetInfo&version=$apihmmaxver&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apihmpath?api=$apihm&method=GetInfo&version=$apihmver&_sid=\"$sid\""; } elsif ($OpMode eq "getsvslog") { my $sev = $hash->{HELPER}{LISTLOGSEVERITY} // ""; @@ -5249,42 +5132,42 @@ sub camOp { delete($hash->{HELPER}{LISTLOGMATCH}); } elsif ($OpMode eq "getsvsinfo") { - $url = "$proto://$serveraddr:$serverport/webapi/$apisvsinfopath?api=\"$apisvsinfo\"&version=\"$apisvsinfomaxver\"&method=\"GetInfo\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apisvsinfopath?api=\"$apisvsinfo\"&version=\"$apisvsinfover\"&method=\"GetInfo\"&_sid=\"$sid\""; } elsif ($OpMode eq "setoptpar") { - my $mirr = $hash->{HELPER}{MIRROR}?$hash->{HELPER}{MIRROR}:ReadingsVal("$name","CamVideoMirror",""); - my $flip = $hash->{HELPER}{FLIP}?$hash->{HELPER}{FLIP}:ReadingsVal("$name","CamVideoFlip",""); - my $rot = $hash->{HELPER}{ROTATE}?$hash->{HELPER}{ROTATE}:ReadingsVal("$name","CamVideoRotate",""); - my $ntp = $hash->{HELPER}{NTPSERV}?$hash->{HELPER}{NTPSERV}:ReadingsVal("$name","CamNTPServer",""); - my $clst = $hash->{HELPER}{CHKLIST}?$hash->{HELPER}{CHKLIST}:""; - $apicammaxver = ($apicammaxver >= 9)?8:$apicammaxver; - $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&version=\"$apicammaxver\"&method=\"SaveOptimizeParam\"&vdoMirror=$mirr&vdoRotation=$rot&vdoFlip=$flip&timeServer=\"$ntp\"&camParamChkList=$clst&cameraIds=\"$camid\"&_sid=\"$sid\""; + my $mirr = $hash->{HELPER}{MIRROR} ? $hash->{HELPER}{MIRROR} : ReadingsVal("$name","CamVideoMirror",""); + my $flip = $hash->{HELPER}{FLIP} ? $hash->{HELPER}{FLIP} : ReadingsVal("$name","CamVideoFlip","" ); + my $rot = $hash->{HELPER}{ROTATE} ? $hash->{HELPER}{ROTATE} : ReadingsVal("$name","CamVideoRotate",""); + my $ntp = $hash->{HELPER}{NTPSERV} ? $hash->{HELPER}{NTPSERV} : ReadingsVal("$name","CamNTPServer","" ); + my $clst = $hash->{HELPER}{CHKLIST} ? $hash->{HELPER}{CHKLIST} : ""; + $apicamver = ($apicamver >= 9) ? 8 : $apicamver; + $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&version=\"$apicamver\"&method=\"SaveOptimizeParam\"&vdoMirror=$mirr&vdoRotation=$rot&vdoFlip=$flip&timeServer=\"$ntp\"&camParamChkList=$clst&cameraIds=\"$camid\"&_sid=\"$sid\""; } elsif ($OpMode eq "Getcaminfo") { - $apicammaxver = ($apicammaxver >= 9)?8:$apicammaxver; - $url = "$proto://$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\""; + $apicamver = ($apicamver >= 9) ? 8 : $apicamver; + $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&version=\"$apicamver\"&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 "getStmUrlPath") { - $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&version=\"$apicammaxver\"&method=\"GetStmUrlPath\"&cameraIds=\"$camid\"&_sid=\"$sid\""; - if($apicammaxver >= 9) { - $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&method=\"GetLiveViewPath\"&version=$apicammaxver&idList=\"$camid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&version=\"$apicamver\"&method=\"GetStmUrlPath\"&cameraIds=\"$camid\"&_sid=\"$sid\""; + if($apicamver >= 9) { + $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&method=\"GetLiveViewPath\"&version=$apicamver&idList=\"$camid\"&_sid=\"$sid\""; } } elsif ($OpMode eq "geteventlist") { # Abruf der Events einer Kamera - $url = "$proto://$serveraddr:$serverport/webapi/$apieventpath?api=\"$apievent\"&version=\"$apieventmaxver\"&method=\"List\"&cameraIds=\"$camid\"&locked=\"0\"&blIncludeSnapshot=\"false\"&reason=\"\"&limit=\"2\"&includeAllCam=\"false\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apieventpath?api=\"$apievent\"&version=\"$apieventver\"&method=\"List\"&cameraIds=\"$camid\"&locked=\"0\"&blIncludeSnapshot=\"false\"&reason=\"\"&limit=\"2\"&includeAllCam=\"false\"&_sid=\"$sid\""; } elsif ($OpMode eq "Getptzlistpreset") { - $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=$apiptz&version=$apiptzmaxver&method=ListPreset&cameraId=$camid&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=$apiptz&version=$apiptzver&method=ListPreset&cameraId=$camid&_sid=\"$sid\""; } elsif ($OpMode eq "Getcapabilities") { # Capabilities einer Cam werden abgerufen - $apicammaxver = ($apicammaxver >= 9)?8:$apicammaxver; - $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=$apicam&version=$apicammaxver&method=\"GetCapabilityByCamId\"&cameraId=$camid&_sid=\"$sid\""; + $apicamver = ($apicamver >= 9)?8:$apicamver; + $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=$apicam&version=$apicamver&method=\"GetCapabilityByCamId\"&cameraId=$camid&_sid=\"$sid\""; } elsif ($OpMode eq "Getptzlistpatrol") { # PTZ-ListPatrol werden abgerufen - $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=$apiptz&version=$apiptzmaxver&method=ListPatrol&cameraId=$camid&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apiptzpath?api=$apiptz&version=$apiptzver&method=ListPatrol&cameraId=$camid&_sid=\"$sid\""; } elsif ($OpMode eq "ExpMode") { if ($hash->{HELPER}{EXPMODE} eq "auto") { @@ -5296,8 +5179,8 @@ sub camOp { elsif ($hash->{HELPER}{EXPMODE} eq "night") { $expmode = "2"; } - $apicammaxver = ($apicammaxver >= 9)?8:$apicammaxver; - $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&version=\"$apicammaxver\"&method=\"SaveOptimizeParam\"&cameraIds=\"$camid\"&expMode=\"$expmode\"&camParamChkList=32&_sid=\"$sid\""; + $apicamver = ($apicamver >= 9)?8:$apicamver; + $url = "$proto://$serveraddr:$serverport/webapi/$apicampath?api=\"$apicam\"&version=\"$apicamver\"&method=\"SaveOptimizeParam\"&cameraIds=\"$camid\"&expMode=\"$expmode\"&camParamChkList=32&_sid=\"$sid\""; } elsif ($OpMode eq "MotDetSc") { # Hash für Optionswerte sichern für Logausgabe in Befehlsauswertung @@ -5305,7 +5188,7 @@ sub camOp { if ($hash->{HELPER}{MOTDETSC} eq "disable") { $motdetsc = "-1"; - $url = "$proto://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventmaxver\"&method=\"MDParamSave\"&camId=\"$camid\"&source=$motdetsc&keep=true&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventver\"&method=\"MDParamSave\"&camId=\"$camid\"&source=$motdetsc&keep=true&_sid=\"$sid\""; } elsif ($hash->{HELPER}{MOTDETSC} eq "camera") { $motdetsc = "0"; @@ -5313,7 +5196,7 @@ sub camOp { $motdetoptions{OBJECTSIZE} = $hash->{HELPER}{MOTDETSC_PROP2} if ($hash->{HELPER}{MOTDETSC_PROP2}); $motdetoptions{PERCENTAGE} = $hash->{HELPER}{MOTDETSC_PROP3} if ($hash->{HELPER}{MOTDETSC_PROP3}); - $url = "$proto://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventmaxver\"&method=\"MDParamSave\"&camId=\"$camid\"&source=$motdetsc&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventver\"&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 @@ -5348,7 +5231,7 @@ sub camOp { $motdetoptions{THRESHOLD} = $hash->{HELPER}{MOTDETSC_PROP2} if ($hash->{HELPER}{MOTDETSC_PROP2}); # nur Umschaltung, alte Werte beibehalten - $url = "$proto://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventmaxver\"&method=\"MDParamSave\"&camId=\"$camid\"&source=$motdetsc&keep=true&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventver\"&method=\"MDParamSave\"&camId=\"$camid\"&source=$motdetsc&keep=true&_sid=\"$sid\""; if ($hash->{HELPER}{MOTDETSC_PROP1}) { # der Wert für Bewegungserkennung SVS -> Empfindlichkeit ist gesetzt @@ -5366,28 +5249,28 @@ sub camOp { $hash->{HELPER}{MOTDETOPTIONS} = \%motdetoptions; } elsif ($OpMode eq "getmotionenum") { - $url = "$proto://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventmaxver\"&method=\"MotionEnum\"&camId=\"$camid\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apicameventpath?api=\"$apicamevent\"&version=\"$apicameventver\"&method=\"MotionEnum\"&camId=\"$camid\"&_sid=\"$sid\""; } elsif ($OpMode eq "extevent") { Log3($name, 4, "$name - trigger external event \"$hash->{HELPER}{EVENTID}\""); - $url = "$proto://$serveraddr:$serverport/webapi/$apiextevtpath?api=$apiextevt&version=$apiextevtmaxver&method=Trigger&eventId=$hash->{HELPER}{EVENTID}&eventName=$hash->{HELPER}{EVENTID}&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apiextevtpath?api=$apiextevt&version=$apiextevtver&method=Trigger&eventId=$hash->{HELPER}{EVENTID}&eventName=$hash->{HELPER}{EVENTID}&_sid=\"$sid\""; } elsif ($OpMode eq "runliveview" && $hash->{HELPER}{RUNVIEW} !~ m/snap|^live_.*hls$/x) { $exturl = AttrVal($name, "livestreamprefix", "$proto://$serveraddr:$serverport"); $exturl = ($exturl eq "DEF")?"$proto://$serveraddr:$serverport":$exturl; if ($hash->{HELPER}{RUNVIEW} =~ m/live/x) { - if($apiaudiostmmaxver) { # API "SYNO.SurveillanceStation.AudioStream" vorhanden ? (removed ab API v2.8) - $hash->{HELPER}{AUDIOLINK} = "$proto://$serveraddr:$serverport/webapi/$apiaudiostmpath?api=$apiaudiostm&version=$apiaudiostmmaxver&method=Stream&cameraId=$camid&_sid=$sid"; + if($apiaudiostmver) { # API "SYNO.SurveillanceStation.AudioStream" vorhanden ? (removed ab API v2.8) + $hash->{HELPER}{AUDIOLINK} = "$proto://$serveraddr:$serverport/webapi/$apiaudiostmpath?api=$apiaudiostm&version=$apiaudiostmver&method=Stream&cameraId=$camid&_sid=$sid"; } else { delete $hash->{HELPER}{AUDIOLINK} if($hash->{HELPER}{AUDIOLINK}); } - if($apivideostmsmaxver) { # API "SYNO.SurveillanceStation.VideoStream" vorhanden ? (removed ab API v2.8) + if($apivideostmsver) { # API "SYNO.SurveillanceStation.VideoStream" vorhanden ? (removed ab API v2.8) # externe URL in Reading setzen - $exturl .= "/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid"; + $exturl .= "/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid"; # interne URL - $url = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid"; + $url = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid"; } elsif ($hash->{HELPER}{STMKEYMJPEGHTTP}) { $url = $hash->{HELPER}{STMKEYMJPEGHTTP}; } @@ -5398,9 +5281,9 @@ sub camOp { my $lrecid = ReadingsVal("$name", "CamLastRecId", 0); if($lrecid) { # externe URL in Reading setzen - $exturl .= "/webapi/$apistmpath?api=$apistm&version=$apistmmaxver&method=EventStream&eventId=$lrecid×tamp=1&_sid=$sid"; + $exturl .= "/webapi/$apistmpath?api=$apistm&version=$apistmver&method=EventStream&eventId=$lrecid×tamp=1&_sid=$sid"; # interne URL - $url = "$proto://$serveraddr:$serverport/webapi/$apistmpath?api=$apistm&version=$apistmmaxver&method=EventStream&eventId=$lrecid×tamp=1&_sid=$sid"; + $url = "$proto://$serveraddr:$serverport/webapi/$apistmpath?api=$apistm&version=$apistmver&method=EventStream&eventId=$lrecid×tamp=1&_sid=$sid"; readingsSingleUpdate($hash,"LiveStreamUrl", $exturl, 1) if(AttrVal($name, "showStmInfoFull", 0)); } } @@ -5434,20 +5317,20 @@ sub camOp { my $limit = 1; # nur 1 Snap laden, für lastsnap_fw my $imgsize = 2; # full size image, für lastsnap_fw my $keyword = $hash->{CAMNAME}; # nur Snaps von $camname selektieren, für lastsnap_fw - $url = "$proto://$serveraddr:$serverport/webapi/$apitakesnappath?api=\"$apitakesnap\"&method=\"List\"&version=\"$apitakesnapmaxver\"&keyword=\"$keyword\"&imgSize=\"$imgsize\"&limit=\"$limit\"&_sid=\"$sid\""; + $url = "$proto://$serveraddr:$serverport/webapi/$apitakesnappath?api=\"$apitakesnap\"&method=\"List\"&version=\"$apitakesnapver\"&keyword=\"$keyword\"&imgSize=\"$imgsize\"&limit=\"$limit\"&_sid=\"$sid\""; } elsif (($OpMode eq "runliveview" && $hash->{HELPER}{RUNVIEW} =~ m/^live_.*?hls$/x) || $OpMode eq "activate_hls") { # HLS Livestreaming aktivieren $httptimeout = $httptimeout+90; # aktivieren HLS dauert lange ! - $url = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Open&cameraId=$camid&format=hls&_sid=$sid"; + $url = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsver&method=Open&cameraId=$camid&format=hls&_sid=$sid"; } elsif ($OpMode eq "stopliveview_hls" || $OpMode eq "reactivate_hls") { # HLS Livestreaming deaktivieren - $url = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Close&cameraId=$camid&format=hls&_sid=$sid"; + $url = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsver&method=Close&cameraId=$camid&format=hls&_sid=$sid"; } elsif ($OpMode eq "getstreamformat") { # aktuelles Streamformat abfragen - $url = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Query&cameraId=$camid&_sid=$sid"; + $url = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsver&method=Query&cameraId=$camid&_sid=$sid"; } Log3($name, 4, "$name - Call-Out now: $url"); @@ -5481,10 +5364,10 @@ sub camOp_Parse { my $serveraddr = $hash->{SERVERADDR}; my $serverport = $hash->{SERVERPORT}; my $camid = $hash->{CAMID}; - my $apivideostms = $hash->{HELPER}{APIVIDEOSTMS}; - my $apivideostmspath = $hash->{HELPER}{APIVIDEOSTMSPATH}; - my $apivideostmsmaxver = $hash->{HELPER}{APIVIDEOSTMSMAXVER}; - my $apicammaxver = $hash->{HELPER}{APICAMMAXVER}; + my $apivideostms = $hash->{HELPER}{API}{VIDEOSTMS}{NAME}; + my $apivideostmspath = $hash->{HELPER}{API}{VIDEOSTMS}{PATH}; + my $apivideostmsver = $hash->{HELPER}{API}{VIDEOSTMS}{VER}; + my $apicamver = $hash->{HELPER}{API}{CAM}{VER}; my $sid = $hash->{HELPER}{SID}; my $proto = $hash->{PROTOCOL}; @@ -5575,8 +5458,8 @@ sub camOp_Parse { if ($rectime != 0) { # Stop der Aufnahme nach Ablauf $rectime, wenn rectime = 0 -> endlose Aufnahme - my $emtxt = $hash->{HELPER}{SMTPRECMSG}?$hash->{HELPER}{SMTPRECMSG}:""; - my $teletxt = $hash->{HELPER}{TELERECMSG}?$hash->{HELPER}{TELERECMSG}:""; + my $emtxt = $hash->{HELPER}{SMTPRECMSG} // ""; + my $teletxt = $hash->{HELPER}{TELERECMSG} // ""; RemoveInternalTimer($hash, "FHEM::SSCam::camStopRec"); InternalTimer(gettimeofday()+$rectime, "FHEM::SSCam::camStopRec", $hash); } @@ -5908,9 +5791,9 @@ sub camOp_Parse { } $ncount--; # wird vermindert je Snap my $lag = $hash->{HELPER}{SNAPLAG}; # Zeitverzögerung zwischen zwei Schnappschüssen - my $emtxt = $hash->{HELPER}{SMTPMSG}?$hash->{HELPER}{SMTPMSG}:""; # Text für Email-Versand - my $teletxt = $hash->{HELPER}{TELEMSG}?$hash->{HELPER}{TELEMSG}:""; # Text für TelegramBot-Versand - my $chattxt = $hash->{HELPER}{CHATMSG}?$hash->{HELPER}{CHATMSG}:""; # Text für SSChatBot-Versand + my $emtxt = $hash->{HELPER}{SMTPMSG} // ""; # Text für Email-Versand + my $teletxt = $hash->{HELPER}{TELEMSG} // ""; # Text für TelegramBot-Versand + my $chattxt = $hash->{HELPER}{CHATMSG} // ""; # Text für SSChatBot-Versand if($ncount > 0) { InternalTimer(gettimeofday()+$lag, "FHEM::SSCam::camSnap", "$name!_!$num!_!$lag!_!$ncount!_!$emtxt!_!$teletxt!_!$chattxt!_!$tac", 0); if(!$tac) { @@ -5940,8 +5823,7 @@ sub camOp_Parse { Log3($name, $verbose, "$name - Snapinfos of camera $camname retrieved"); # aktuellsten Snap zur Anzeige im streamDev "lastsnap" speichern - # $hash->{HELPER}{".LASTSNAP"} = $data->{data}{data}[0]{imageData}; - $cache = cache($name, "c_init"); # Cache initialisieren + $cache = cache($name, "c_init"); # Cache initialisieren Log3($name, 1, "$name - Fall back to internal Cache due to preceding failure.") if(!$cache); if(!$cache || $cache eq "internal" ) { $data{SSCam}{$name}{LASTSNAP} = $data->{data}{data}[0]{imageData}; @@ -6312,15 +6194,15 @@ sub camOp_Parse { roomRefresh($hash,0,0,0); # kein Room-Refresh, SSCam-state-Event, SSCamSTRM-Event } - } elsif ($OpMode eq "runliveview" && $hash->{HELPER}{RUNVIEW} =~ m/^live_.*hls$/) { + } elsif ($OpMode eq "runliveview" && $hash->{HELPER}{RUNVIEW} =~ m/^live_.*hls$/x) { # HLS Streaming wurde aktiviert $hash->{HELPER}{HLSSTREAM} = "active"; # externe LivestreamURL setzen my $exturl = AttrVal($name, "livestreamprefix", "$proto://$serveraddr:$serverport"); - $exturl .= "/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=hls&_sid=$sid"; + $exturl .= "/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsver&method=Stream&cameraId=$camid&format=hls&_sid=$sid"; readingsSingleUpdate($hash,"LiveStreamUrl", $exturl, 1) if(AttrVal($name, "showStmInfoFull", undef)); - my $url = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=hls&_sid=$sid"; + my $url = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsver&method=Stream&cameraId=$camid&format=hls&_sid=$sid"; # Liveview-Link in Hash speichern und Aktivitätsstatus speichern $hash->{HELPER}{LINK} = $url; Log3($name, 4, "$name - HLS Streaming of camera \"$name\" activated, Streaming-URL: $url") if(AttrVal($name,"verbose",3) == 4); @@ -6573,7 +6455,7 @@ sub camOp_Parse { } elsif ($OpMode eq "getStmUrlPath") { # Parse SVS-Infos my($camforcemcast,$mjpegHttp,$multicst,$mxpegHttp,$unicastOverHttp,$unicastPath); - if($apicammaxver < 9) { + if($apicamver < 9) { $camforcemcast = jboolmap($data->{'data'}{'pathInfos'}[0]{'forceEnableMulticast'}); $mjpegHttp = $data->{'data'}{'pathInfos'}[0]{'mjpegHttpPath'}; $multicst = $data->{'data'}{'pathInfos'}[0]{'multicstPath'}; @@ -6581,7 +6463,7 @@ sub camOp_Parse { $unicastOverHttp = $data->{'data'}{'pathInfos'}[0]{'unicastOverHttpPath'}; $unicastPath = $data->{'data'}{'pathInfos'}[0]{'unicastPath'}; } - if($apicammaxver >= 9) { + if($apicamver >= 9) { $mjpegHttp = $data->{'data'}[0]{'mjpegHttpPath'}; $multicst = $data->{'data'}[0]{'multicstPath'}; $mxpegHttp = $data->{'data'}[0]{'mxpegHttpPath'}; @@ -6792,6 +6674,9 @@ sub camOp_Parse { $hash->{MODEL} = ReadingsVal($name,"CamVendor","")." - ".ReadingsVal($name,"CamModel","CAM") if(IsModelCam($hash)); Log3($name, $verbose, "$name - Informations of camera $camname retrieved"); + + getPtzPresetList($hash); # Preset/Patrollisten in Hash einlesen zur PTZ-Steuerung + getPtzPatrolList($hash); } elsif ($OpMode eq "geteventlist") { my $eventnum = $data->{'data'}{'total'}; @@ -7072,20 +6957,17 @@ sub camOp_Parse { return; } -############################################################################################################################# -######### Hilfsroutinen ############# -############################################################################################################################# - #################################################################################### -# Login in SVS wenn kein oder ungültige Session-ID vorhanden ist +# Login in wenn kein oder ungültige Session-ID vorhanden ist +#################################################################################### sub login { my ($hash,$fret) = @_; my $name = $hash->{NAME}; my $serveraddr = $hash->{SERVERADDR}; my $serverport = $hash->{SERVERPORT}; - my $apiauth = $hash->{HELPER}{APIAUTH}; - my $apiauthpath = $hash->{HELPER}{APIAUTHPATH}; - my $apiauthmaxver = $hash->{HELPER}{APIAUTHMAXVER}; + my $apiauth = $hash->{HELPER}{API}{AUTH}{NAME}; + my $apiauthpath = $hash->{HELPER}{API}{AUTH}{PATH}; + my $apiauthver = $hash->{HELPER}{API}{AUTH}{VER}; my $proto = $hash->{PROTOCOL}; my $lrt = AttrVal($name,"loginRetries",3); my ($url,$param); @@ -7121,27 +7003,28 @@ sub login { my $sid = AttrVal($name, "noQuotesForSID", "0") == 1 ? "sid" : "\"sid\""; if (AttrVal($name,"session","DSM") eq "SurveillanceStation") { - $url = "$proto://$serveraddr:$serverport/webapi/$apiauthpath?api=$apiauth&version=$apiauthmaxver&method=Login&account=$username&passwd=$password&session=SurveillanceStation&format=$sid"; - $urlwopw = "$proto://$serveraddr:$serverport/webapi/$apiauthpath?api=$apiauth&version=$apiauthmaxver&method=Login&account=$username&passwd=*****&session=SurveillanceStation&format=$sid"; + $url = "$proto://$serveraddr:$serverport/webapi/$apiauthpath?api=$apiauth&version=$apiauthver&method=Login&account=$username&passwd=$password&session=SurveillanceStation&format=$sid"; + $urlwopw = "$proto://$serveraddr:$serverport/webapi/$apiauthpath?api=$apiauth&version=$apiauthver&method=Login&account=$username&passwd=*****&session=SurveillanceStation&format=$sid"; } else { - $url = "$proto://$serveraddr:$serverport/webapi/$apiauthpath?api=$apiauth&version=$apiauthmaxver&method=Login&account=$username&passwd=$password&format=$sid"; - $urlwopw = "$proto://$serveraddr:$serverport/webapi/$apiauthpath?api=$apiauth&version=$apiauthmaxver&method=Login&account=$username&passwd=*****&format=$sid"; + $url = "$proto://$serveraddr:$serverport/webapi/$apiauthpath?api=$apiauth&version=$apiauthver&method=Login&account=$username&passwd=$password&format=$sid"; + $urlwopw = "$proto://$serveraddr:$serverport/webapi/$apiauthpath?api=$apiauth&version=$apiauthver&method=Login&account=$username&passwd=*****&format=$sid"; } AttrVal($name, "showPassInLog", "0") == 1 ? Log3($name, 4, "$name - Call-Out now: $url") : Log3($name, 4, "$name - Call-Out now: $urlwopw"); $hash->{HELPER}{LOGINRETRIES}++; $param = { - url => $url, - timeout => $httptimeout, - hash => $hash, - user => $username, - funcret => $fret, - method => "GET", - header => "Accept: application/json", - callback => \&loginReturn - }; - HttpUtils_NonblockingGet ($param); + url => $url, + timeout => $httptimeout, + hash => $hash, + user => $username, + funcret => $fret, + method => "GET", + header => "Accept: application/json", + callback => \&loginReturn + }; + + HttpUtils_NonblockingGet ($param); return; } @@ -7189,10 +7072,10 @@ sub loginReturn { # Session ID in hash eintragen $hash->{HELPER}{SID} = $sid; - readingsBeginUpdate($hash); - readingsBulkUpdate($hash,"Errorcode","none"); - readingsBulkUpdate($hash,"Error","none"); - readingsEndUpdate($hash, 1); + readingsBeginUpdate ($hash); + readingsBulkUpdate ($hash,"Errorcode","none"); + readingsBulkUpdate ($hash,"Error","none"); + readingsEndUpdate ($hash, 1); Log3($name, 4, "$name - Login of User $username successful - SID: $sid"); @@ -7205,10 +7088,10 @@ sub loginReturn { # Fehlertext zum Errorcode ermitteln my $error = expErrorsAuth($hash,$errorcode); - readingsBeginUpdate($hash); - readingsBulkUpdate($hash,"Errorcode",$errorcode); - readingsBulkUpdate($hash,"Error",$error); - readingsEndUpdate($hash, 1); + readingsBeginUpdate ($hash); + readingsBulkUpdate ($hash,"Errorcode",$errorcode); + readingsBulkUpdate ($hash,"Error",$error); + readingsEndUpdate ($hash, 1); Log3($name, 3, "$name - Login of User $username unsuccessful. Code: $errorcode - $error - try again"); @@ -7227,14 +7110,13 @@ sub logout { my $name = $hash->{NAME}; my $serveraddr = $hash->{SERVERADDR}; my $serverport = $hash->{SERVERPORT}; - my $apiauth = $hash->{HELPER}{APIAUTH}; - my $apiauthpath = $hash->{HELPER}{APIAUTHPATH}; - my $apiauthmaxver = $hash->{HELPER}{APIAUTHMAXVER}; + my $apiauth = $hash->{HELPER}{API}{AUTH}{NAME}; + my $apiauthpath = $hash->{HELPER}{API}{AUTH}{PATH}; + my $apiauthver = $hash->{HELPER}{API}{AUTH}{VER}; my $sid = $hash->{HELPER}{SID}; my $proto = $hash->{PROTOCOL}; - my $url; - my $param; - my $httptimeout; + + my ($url,$param,$httptimeout); Log3($name, 4, "$name - ####################################################"); Log3($name, 4, "$name - ### start cam operation $hash->{OPMODE} "); @@ -7245,19 +7127,19 @@ sub logout { Log3($name, 5, "$name - HTTP-Call will be done with httptimeout-Value: $httptimeout s"); if (AttrVal($name,"session","DSM") eq "SurveillanceStation") { - $url = "$proto://$serveraddr:$serverport/webapi/$apiauthpath?api=$apiauth&version=$apiauthmaxver&method=Logout&session=SurveillanceStation&_sid=$sid"; + $url = "$proto://$serveraddr:$serverport/webapi/$apiauthpath?api=$apiauth&version=$apiauthver&method=Logout&session=SurveillanceStation&_sid=$sid"; } else { - $url = "$proto://$serveraddr:$serverport/webapi/$apiauthpath?api=$apiauth&version=$apiauthmaxver&method=Logout&_sid=$sid"; + $url = "$proto://$serveraddr:$serverport/webapi/$apiauthpath?api=$apiauth&version=$apiauthver&method=Logout&_sid=$sid"; } $param = { - url => $url, - timeout => $httptimeout, - hash => $hash, - method => "GET", - header => "Accept: application/json", - callback => \&logoutReturn - }; + url => $url, + timeout => $httptimeout, + hash => $hash, + method => "GET", + header => "Accept: application/json", + callback => \&logoutReturn + }; HttpUtils_NonblockingGet ($param); @@ -7275,17 +7157,14 @@ sub logoutReturn { my $error; my $errorcode; - if ($err ne "") { - # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist + if ($err ne "") { # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist Log3($name, 2, "$name - error while requesting ".$param->{url}." - $err"); readingsSingleUpdate($hash, "Error", $err, 1); - } elsif ($myjson ne "") { - # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes) + } elsif ($myjson ne "") { # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes) Log3($name, 4, "$name - URL-Call: ".$param->{url}); - # Evaluiere ob Daten im JSON-Format empfangen wurden - ($hash, $success) = evaljson($hash,$myjson); + ($hash, $success) = evaljson($hash,$myjson); # Evaluiere ob Daten im JSON-Format empfangen wurden unless ($success) { Log3($name, 4, "$name - Data returned: ".$myjson); @@ -7294,31 +7173,25 @@ sub logoutReturn { } $data = decode_json($myjson); - - # Logausgabe decodierte JSON Daten - Log3($name, 4, "$name - JSON returned: ". Dumper $data); + + Log3($name, 4, "$name - JSON returned: ". Dumper $data); # Logausgabe decodierte JSON Daten $success = $data->{'success'}; - if ($success) { - # die Logout-URL konnte erfolgreich aufgerufen werden + if ($success) { # die Logout-URL konnte erfolgreich aufgerufen werden Log3($name, 2, "$name - Session of User \"$username\" terminated - session ID \"$sid\" deleted"); } else { - # Errorcode aus JSON ermitteln - $errorcode = $data->{'error'}->{'code'}; - - # Fehlertext zum Errorcode ermitteln - $error = expErrorsAuth($hash,$errorcode); + $errorcode = $data->{'error'}->{'code'}; # Errorcode aus JSON ermitteln + $error = expErrorsAuth($hash,$errorcode); # Fehlertext zum Errorcode ermitteln Log3($name, 2, "$name - ERROR - Logout of User $username was not successful, however SID: \"$sid\" has been deleted. Errorcode: $errorcode - $error"); } } - # Session-ID aus Helper-hash löschen - delete $hash->{HELPER}{SID}; - # ausgeführte Funktion ist erledigt (auch wenn logout nicht erfolgreich), Freigabe Funktionstoken - delActiveToken($hash); + delete $hash->{HELPER}{SID}; # Session-ID aus Helper-hash löschen + + delActiveToken($hash); # ausgeführte Funktion ist erledigt (auch wenn logout nicht erfolgreich), Freigabe Funktionstoken CancelDelayedShutdown($name); @@ -7378,7 +7251,8 @@ return ($err,$camname); # Test ob JSON-String empfangen wurde ############################################################################### sub evaljson { - my ($hash,$myjson) = @_; + my $hash = shift; + my $myjson = shift; my $OpMode = $hash->{OPMODE}; my $name = $hash->{NAME}; my $success = 1; @@ -7392,13 +7266,14 @@ sub evaljson { $success = 1; $myjson = '{"success":true}'; } + } else { $success = 0; - readingsBeginUpdate($hash); - readingsBulkUpdate($hash,"Errorcode","none"); - readingsBulkUpdate($hash,"Error","malformed JSON string received"); - readingsEndUpdate($hash, 1); + readingsBeginUpdate ($hash); + readingsBulkUpdate ($hash, "Errorcode", "none"); + readingsBulkUpdate ($hash, "Error", "malformed JSON string received"); + readingsEndUpdate ($hash, 1); } }; @@ -7505,7 +7380,7 @@ sub IsCapHLS { # HLS my ($hash) = @_; my $name = $hash->{NAME}; my $cap = 0; - my $api = $hash->{HELPER}{APIVIDEOSTMSMAXVER}; + my $api = $hash->{HELPER}{API}{VIDEOSTMS}{VER}; my $csf = (ReadingsVal($name,"CamStreamFormat","MJPEG") eq "HLS")?1:0; $cap = 1 if($api && $csf); @@ -7593,19 +7468,6 @@ sub IsModelMaster { # ist de return $mm; } -############################################################################### -# JSON Boolean Test und Mapping -############################################################################### -sub jboolmap { - my ($bool)= @_; - - if(JSON::is_bool($bool)) { - $bool = $bool?"true":"false"; - } - -return $bool; -} - ############################################################################### # Ermittlung Anzahl und Größe der abzurufenden Schnappschußdaten # @@ -7683,57 +7545,6 @@ sub extoptpar { return; } -############################################################################### -# Clienthash übernehmen oder zusammenstellen -# Identifikation ob über FHEMWEB ausgelöst oder nicht -> erstellen $hash->CL -############################################################################### -sub getClHash { - my ($hash,$nobgd)= @_; - my $name = $hash->{NAME}; - my $ret; - - if($nobgd) { - # nur übergebenen CL-Hash speichern, - # keine Hintergrundverarbeitung bzw. synthetische Erstellung CL-Hash - $hash->{HELPER}{CL}{1} = $hash->{CL}; - return; - } - - if (!defined($hash->{CL})) { - # Clienthash wurde nicht übergeben und wird erstellt (FHEMWEB Instanzen mit canAsyncOutput=1 analysiert) - my $outdev; - my @webdvs = devspec2array("TYPE=FHEMWEB:FILTER=canAsyncOutput=1:FILTER=STATE=Connected"); - my $i = 1; - for (@webdvs) { - $outdev = $_; - next if(!$defs{$outdev}); - $hash->{HELPER}{CL}{$i}->{NAME} = $defs{$outdev}{NAME}; - $hash->{HELPER}{CL}{$i}->{NR} = $defs{$outdev}{NR}; - $hash->{HELPER}{CL}{$i}->{COMP} = 1; - $i++; - } - } else { - # übergebenen CL-Hash in Helper eintragen - $hash->{HELPER}{CL}{1} = $hash->{CL}; - } - - # Clienthash auflösen zur Fehlersuche (aufrufende FHEMWEB Instanz - if (defined($hash->{HELPER}{CL}{1})) { - for (my $k=1; (defined($hash->{HELPER}{CL}{$k})); $k++ ) { - Log3($name, 4, "$name - Clienthash number: $k"); - while (my ($key,$val) = each(%{$hash->{HELPER}{CL}{$k}})) { - $val = $val?$val:" "; - Log3($name, 4, "$name - Clienthash: $key -> $val"); - } - } - } else { - Log3($name, 2, "$name - Clienthash was neither delivered nor created !"); - $ret = "Clienthash was neither delivered nor created. Can't use asynchronous output for function."; - } - -return ($ret); -} - ############################################################################### # konvertiere alle ptzPanel_rowXX-attribute zu html-Code für # das generierte Widget und das weblink-Device ptzPanel_$name @@ -8140,15 +7951,15 @@ sub streamDev { ## no critic 'comp pws => $pws, serveraddr => $hash->{SERVERADDR}, serverport => $hash->{SERVERPORT}, - apivideostm => $hash->{HELPER}{APIVIDEOSTM}, - apivideostmpath => $hash->{HELPER}{APIVIDEOSTMPATH}, - apivideostmmaxver => $hash->{HELPER}{APIVIDEOSTMMAXVER}, - apiaudiostm => $hash->{HELPER}{APIAUDIOSTM}, - apiaudiostmpath => $hash->{HELPER}{APIAUDIOSTMPATH}, - apiaudiostmmaxver => $hash->{HELPER}{APIAUDIOSTMMAXVER}, - apivideostms => $hash->{HELPER}{APIVIDEOSTMS}, - apivideostmspath => $hash->{HELPER}{APIVIDEOSTMSPATH}, - apivideostmsmaxver => $hash->{HELPER}{APIVIDEOSTMSMAXVER}, + apivideostm => $hash->{HELPER}{API}{VIDEOSTM}{NAME}, + apivideostmpath => $hash->{HELPER}{API}{VIDEOSTM}{PATH}, + apivideostmver => $hash->{HELPER}{API}{VIDEOSTM}{VER}, + apiaudiostm => $hash->{HELPER}{API}{AUDIOSTM}{NAME}, + apiaudiostmpath => $hash->{HELPER}{API}{AUDIOSTM}{PATH}, + apiaudiostmver => $hash->{HELPER}{API}{AUDIOSTM}{VER}, + apivideostms => $hash->{HELPER}{API}{VIDEOSTMS}{NAME}, + apivideostmspath => $hash->{HELPER}{API}{VIDEOSTMS}{PATH}, + apivideostmsver => $hash->{HELPER}{API}{VIDEOSTMS}{VER}, camid => $hash->{CAMID}, sid => $hash->{HELPER}{SID}, proto => $hash->{PROTOCOL}, @@ -8257,10 +8068,10 @@ sub _streamDevMJPEG { ## no critic 'complexity not my $serverport = $params->{serverport}; my $apivideostms = $params->{apivideostms}; my $apivideostmspath = $params->{apivideostmspath}; - my $apivideostmsmaxver = $params->{apivideostmsmaxver}; + my $apivideostmsver = $params->{apivideostmsver}; my $apiaudiostm = $params->{apiaudiostm}; my $apiaudiostmpath = $params->{apiaudiostmpath}; - my $apiaudiostmmaxver = $params->{apiaudiostmmaxver}; + my $apiaudiostmver = $params->{apiaudiostmver}; my $cmdrecendless = $params->{cmdrecendless}; my $ttrecstart = $params->{ttrecstart}; @@ -8280,16 +8091,16 @@ sub _streamDevMJPEG { ## no critic 'complexity not return $ret; } else { - if($apivideostmsmaxver) { - $link = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsmaxver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid"; + if($apivideostmsver) { + $link = "$proto://$serveraddr:$serverport/webapi/$apivideostmspath?api=$apivideostms&version=$apivideostmsver&method=Stream&cameraId=$camid&format=mjpeg&_sid=$sid"; } elsif ($hash->{HELPER}{STMKEYMJPEGHTTP}) { $link = $hash->{HELPER}{STMKEYMJPEGHTTP}; } return $ret if(!$link); - if($apiaudiostmmaxver) { - $audiolink = "$proto://$serveraddr:$serverport/webapi/$apiaudiostmpath?api=$apiaudiostm&version=$apiaudiostmmaxver&method=Stream&cameraId=$camid&_sid=$sid"; + if($apiaudiostmver) { + $audiolink = "$proto://$serveraddr:$serverport/webapi/$apiaudiostmpath?api=$apiaudiostm&version=$apiaudiostmver&method=Stream&cameraId=$camid&_sid=$sid"; } if(!$ftui) { @@ -9276,29 +9087,6 @@ sub expErrors { return ($error); } -################################################################ -# sortiert eine Liste von Versionsnummern x.x.x -# Schwartzian Transform and the GRT transform -# Übergabe: "asc | desc", -################################################################ -sub sortVersion { - my ($sseq,@versions) = @_; - - my @sorted = map {$_->[0]} - sort {$a->[1] cmp $b->[1]} - map {[$_, pack "C*", split /\./x]} @versions; - - @sorted = map {join ".", unpack "C*", $_} - sort - map {pack "C*", split /\./x} @versions; - - if($sseq eq "desc") { - @sorted = reverse @sorted; - } - -return @sorted; -} - ############################################################################## # Zusätzliche Redings in Rotation erstellen # Sub ($hash,,,,) @@ -11169,16 +10957,6 @@ sub subaddFromBlocking { return; } -############################################################################################# -# Leerzeichen am Anfang / Ende eines strings entfernen -############################################################################################# -sub trim { - my $str = shift; - $str =~ s/^\s+|\s+$//gx; - -return ($str); -} - ############################################################################################# # Check ob "sscam" im iconpath des FHEMWEB Devices enthalten ist ############################################################################################# @@ -11448,41 +11226,6 @@ sub cache { return 0; } -############################################################################################# -# Versionierungen des Moduls setzen -# Die Verwendung von Meta.pm und Packages wird berücksichtigt -############################################################################################# -sub setVersionInfo { - my ($hash) = @_; - my $name = $hash->{NAME}; - - my $v = (sortVersion("desc",keys %vNotesIntern))[0]; - my $type = $hash->{TYPE}; - $hash->{HELPER}{PACKAGE} = __PACKAGE__; - $hash->{HELPER}{VERSION} = $v; - - if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) { - # META-Daten sind vorhanden - $modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SMAPortal}{META}} - if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id$ im Kopf komplett! vorhanden ) - $modules{$type}{META}{x_version} =~ s/1\.1\.1/$v/gx; - } else { - $modules{$type}{META}{x_version} = $v; - } - return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id$ im Kopf komplett! vorhanden ) - if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) { - # es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen - # mit {->VERSION()} im FHEMWEB kann Modulversion abgefragt werden - use version 0.77; our $VERSION = FHEM::Meta::Get( $hash, 'version' ); ## no critic 'VERSION' - } - } else { - # herkömmliche Modulstruktur - $hash->{VERSION} = $v; - } - -return; -} - 1; =pod @@ -15462,7 +15205,8 @@ attr <name> genericStrmHtmlTag <img $HTMLATTR "GPUtils": 0, "HttpUtils": 0, "Blocking": 0, - "Encode": 0 + "Encode": 0, + "FHEM::SynoModules::API": 0 }, "recommends": { "FHEM::Meta": 0,