diff --git a/fhem/CHANGED b/fhem/CHANGED index b6a0ee85e..54b326507 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it + - change: 49_SSCAM: NOTE! set enable/disable renamed to enableCam/disableCam + switch commandref to ID tags - change: 74_AutomowerConnect: minor changes - feature: 76_SolarForecast: currentMeterDev: contotal and feedtotal can be reset at day begin (day meter) diff --git a/fhem/FHEM/49_SSCam.pm b/fhem/FHEM/49_SSCam.pm index 90caf63ec..6767995ce 100644 --- a/fhem/FHEM/49_SSCam.pm +++ b/fhem/FHEM/49_SSCam.pm @@ -192,6 +192,8 @@ BEGIN { # Versions History intern my %vNotesIntern = ( + "9.11.5" => "19.05.2024 optimize memory consumption once more, set enable/disable renamed to enableCam/disableCam ". + "switch commandref to ID tags ", "9.11.4" => "13.05.2024 optimize memory consumption once more ", "9.11.3" => "08.05.2024 optimize memory consumption ", "9.11.2" => "14.04.2024 internal change logic for sending data via telegram, email, chat and their Saving ", @@ -397,8 +399,8 @@ my %hset = ( # Ha createPTZcontrol => { fn => "_setcreatePTZcontrol", needcred => 1 }, createStreamDev => { fn => "_setcreateStreamDev", needcred => 1 }, createReadingsGroup => { fn => "_setcreateReadingsGroup", needcred => 1 }, - enable => { fn => "_setenable", needcred => 1 }, - disable => { fn => "_setdisable", needcred => 1 }, + enableCam => { fn => "_setenable", needcred => 1 }, + disableCam => { fn => "_setdisable", needcred => 1 }, motdetsc => { fn => "_setmotdetsc", needcred => 1 }, expmode => { fn => "_setexpmode", needcred => 1 }, homeMode => { fn => "_sethomeMode", needcred => 1 }, @@ -592,7 +594,8 @@ my %hsimu = ( # Fun # Standardvariablen und Forward-Deklaration my $defSlim = 3; # default Anzahl der abzurufenden Schnappschüsse mit snapGallery my $defColumns = 3; # default Anzahl der Spalten einer snapGallery -my $defSnum = "1,2,3,4,5,6,7,8,9,10"; # mögliche Anzahl der abzurufenden Schnappschüsse mit snapGallery +my $sgnum = "1,2,3,4,5,6,7,8,9,10"; # mögliche Anzahl der abzurufenden Schnappschüsse mit snapGallery +my $sgbdef = 0; # default value Attr snapGalleryBoost my $compstat = "9.0.00"; # getestete SVS-Version my $valZoom = ".++,+,stop,-,--."; # Inhalt des Setters "setZoom" my $shutdownInProcess = 0; # Statusbit shutdown @@ -798,7 +801,7 @@ sub Initialize { "snapTelegramTxt:textField-long ". "snapGalleryBoost:0,1 ". "snapGallerySize:Icon,Full ". - "snapGalleryNumber:$defSnum ". + "snapGalleryNumber:$sgnum ". "snapGalleryColumns ". "snapGalleryHtmlAttr ". "snapReadingRotate:0,1,2,3,4,5,6,7,8,9,10 ". @@ -1351,18 +1354,18 @@ sub Attr { if ($aName eq "snapGallerySize") { if ($cmd eq "set") { - $do = ($aVal eq "Icon")?1:2; + $do = $aVal eq 'Icon' ? 1 : 2; } - $do = 0 if($cmd eq "del"); + $do = 0 if($cmd eq 'del'); if ($do == 0) { - delete($hash->{HELPER}{".SNAPHASH"}) if(AttrVal($name,"snapGalleryBoost",0)); # Snaphash nur löschen wenn Snaps gepollt werden + delete($hash->{HELPER}{".SNAPHASH"}) if(AttrVal($name, 'snapGalleryBoost', $sgbdef)); # Snaphash nur löschen wenn Snaps gepollt werden Log3($name, 4, "$name - Snapshot hash deleted"); } - elsif (AttrVal($name,"snapGalleryBoost",0) && $init_done == 1) { # snap-Infos abhängig ermitteln wenn gepollt werden soll + elsif (AttrVal($name, 'snapGalleryBoost', $sgbdef) && $init_done == 1) { # snap-Infos abhängig ermitteln wenn gepollt werden soll $hash->{HELPER}{GETSNAPGALLERY} = 1; - my $slim = AttrVal($name,"snapGalleryNumber",$defSlim); # Anzahl der abzurufenden Snaps + my $slim = AttrVal($name, 'snapGalleryNumber', $defSlim); # Anzahl der abzurufenden Snaps my $ssize = $do; RemoveInternalTimer($hash, "FHEM::SSCam::__getSnapInfo" ); @@ -1370,7 +1373,7 @@ sub Attr { } } - if ($aName eq "snapGalleryBoost") { + if ($aName eq 'snapGalleryBoost') { if ($cmd eq "set") { $do = ($aVal == 1) ? 1 : 0; } @@ -1378,7 +1381,7 @@ sub Attr { if ($do == 0) { delete($hash->{HELPER}{".SNAPHASH"}); # Snaphash löschen - Log3($name, 4, "$name - Snapshot hash deleted"); + Log3 ($name, 4, "$name - Snapshot hash deleted"); } elsif ($init_done == 1) { # snapgallery regelmäßig neu einlesen wenn Polling ein @@ -1395,13 +1398,13 @@ sub Attr { } } - if ($aName eq "snapGalleryNumber" && AttrVal($name,"snapGalleryBoost",0)) { + if ($aName eq "snapGalleryNumber" && AttrVal($name, 'snapGalleryBoost', $sgbdef)) { my ($slim,$ssize); - if ($cmd eq "set") { - $do = ($aVal != 0) ? 1 : 0; + if ($cmd eq 'set') { + $do = $aVal != 0 ? 1 : 0; } - $do = 0 if($cmd eq "del"); + $do = 0 if($cmd eq 'del'); if ($do == 0) { $slim = 3; @@ -1421,12 +1424,12 @@ sub Attr { } } - if ($aName eq "snapReadingRotate") { - if ($cmd eq "set") { - $do = ($aVal) ? 1 : 0; + if ($aName eq 'snapReadingRotate') { + if ($cmd eq 'set') { + $do = $aVal ? 1 : 0; } - $do = 0 if($cmd eq "del"); + $do = 0 if($cmd eq 'del'); if (!$do) {$aVal = 0} for my $i (1..10) { if ($i>$aVal) { @@ -1457,7 +1460,7 @@ sub Attr { InternalTimer (gettimeofday()+1.0, "FHEM::SSCam::wdpollcaminfo", $hash, 0); } - if ($cmd eq "set") { + if ($cmd eq 'set') { if ($aName =~ m/httptimeout|snapGalleryColumns|rectime|pollcaminfoall/x) { unless ($aVal =~ /^\d+$/x) { return " The Value for $aName is not valid. Use only figures 1-9 !";} } @@ -1468,8 +1471,8 @@ sub Attr { if ($aName =~ m/cacheServerParam/x) { return "Please provide the Redis server parameters in form: : or unix:" if($aVal !~ /:\d+$|unix:.+$/x); - my $type = AttrVal($name, "cacheType", "internal"); - if($hash->{HELPER}{CACHEKEY} && $type eq "redis") { + my $type = AttrVal($name, 'cacheType', 'internal'); + if($hash->{HELPER}{CACHEKEY} && $type eq 'redis') { cache($name, "c_destroy"); } } @@ -1478,16 +1481,15 @@ sub Attr { return "When you want activate \"$aName\", you have to set first the attribute \"videofolderMap\" to the root folder ". "of recordings and snapshots provided by an URL.\n". "Example: http://server.domain:8081/surveillance " - if(!AttrVal($name, "videofolderMap", "") && $init_done == 1); + if(!AttrVal($name, 'videofolderMap', '') && $init_done == 1); } } - if ($cmd eq "del") { - if ($aName =~ m/pollcaminfoall/x) { - # Polling nicht ausschalten wenn snapGalleryBoost ein (regelmäßig neu einlesen) + if ($cmd eq 'del') { + if ($aName =~ m/pollcaminfoall/x) { # Polling nicht ausschalten wenn snapGalleryBoost ein (regelmäßig neu einlesen) return "Please switch off \"snapGalleryBoost\" first if you want to deactivate \"pollcaminfoall\" because the functionality of \"snapGalleryBoost\" depends on retrieving snapshots periodical." - if(AttrVal($name,"snapGalleryBoost",0)); + if(AttrVal($name, 'snapGalleryBoost', $sgbdef)); } } @@ -1520,18 +1522,23 @@ sub Set { elsif (IsModelCam($hash)) { # selist für Cams my $hlslfw = IsCapHLS($hash) ? ",live_fw_hls," : ","; + my $sg = AttrVal ($name, 'snapGalleryBoost', $sgbdef) ? + (AttrVal($name, 'snapGalleryNumber', undef) || AttrVal($name, 'snapGalleryBoost', $sgbdef)) ? + "snapGallery:noArg " : + "snapGallery:$sgnum " : + ""; $setlist = "Unknown argument $opt, choose one of ". "createSnapGallery:noArg ". "createStreamDev:generic,hls,lastsnap,mjpeg,switched ". "createReadingsGroup ". "credentials ". - "disable:noArg ". - "enable:noArg ". + "disableCam:noArg ". + "enableCam:noArg ". "expmode:auto,day,night ". "motdetsc:disable,camera,SVS ". "snap ". - (AttrVal($name, "snapGalleryBoost",0) ? (AttrVal($name,"snapGalleryNumber",undef) || AttrVal($name,"snapGalleryBoost",0)) ? "snapGallery:noArg " : "snapGallery:$defSnum " : " "). + $sg. "on ". "off:noArg ". "optimizeParams ". @@ -1942,7 +1949,7 @@ sub _setsnapGallery { ## no critic "not used" my $ret = getClHash($hash); return $ret if($ret); - if(!AttrVal($name, "snapGalleryBoost",0)) { # Snaphash ist nicht vorhanden und wird neu abgerufen und ausgegeben + if (!AttrVal($name, 'snapGalleryBoost', $sgbdef)) { # Snaphash ist nicht vorhanden und wird neu abgerufen und ausgegeben $hash->{HELPER}{GETSNAPGALLERY} = 1; my $slim = $prop // AttrVal($name,"snapGalleryNumber",$defSlim); # Anzahl der abzurufenden Snapshots @@ -1986,7 +1993,7 @@ sub _setcreateSnapGallery { ## no critic "not used" return if(!IsModelCam($hash)); - if(!AttrVal($name,"snapGalleryBoost",0)) { + if (!AttrVal($name, 'snapGalleryBoost', $sgbdef)) { return qq{Before you can use "$opt", you must first set the "snapGalleryBoost" attribute, since automatic snapshot retrieval is required.}; } @@ -4072,8 +4079,8 @@ sub Get { } elsif(IsModelCam($hash)) { # getlist für Cams $getlist .= "caminfo:noArg ". - ((AttrVal($name,"snapGalleryNumber",undef) || AttrVal($name,"snapGalleryBoost",0)) - ? "snapGallery:noArg " : "snapGallery:$defSnum "). + ((AttrVal($name, 'snapGalleryNumber', undef) || AttrVal($name, 'snapGalleryBoost', $sgbdef)) + ? "snapGallery:noArg " : "snapGallery:$sgnum "). (IsCapPTZPan($hash) ? "listPresets:noArg " : ""). "snapinfo:noArg ". "saveRecording ". @@ -4319,7 +4326,7 @@ sub _getsnapGallery { ## no critic "not used" my $ret = getClHash($hash); return $ret if($ret); - if(!AttrVal($name, "snapGalleryBoost",0)) { # Snaphash ist nicht vorhanden und wird abgerufen + if (!AttrVal($name, 'snapGalleryBoost', $sgbdef)) { # Snaphash ist nicht vorhanden und wird abgerufen $hash->{HELPER}{GETSNAPGALLERY} = 1; my $slim = $arg // AttrVal($name,"snapGalleryNumber",$defSlim); # Anzahl der abzurufenden Snapshots @@ -5725,12 +5732,15 @@ sub camOp_Parse { if (!$success) { Log3 ($name, 4, "$name - Data returned: ".$data{SSCam}{$name}{TMPMJ}); + delete $data{SSCam}{$name}{TMPMJ}; delActiveToken ($hash); return; } $data{SSCam}{$name}{TMPDA} = decode_json ($data{SSCam}{$name}{TMPMJ}); $success = $data{SSCam}{$name}{TMPDA}->{'success'}; + delete $data{SSCam}{$name}{TMPMJ}; + Log3 ($name, 5, "$name - JSON returned: ". Dumper $data{SSCam}{$name}{TMPDA}); # Logausgabe decodierte JSON Daten } else { @@ -5752,6 +5762,7 @@ sub camOp_Parse { if ($hparse{$OpMode} && defined &{$hparse{$OpMode}{fn}}) { my $ret = q{}; $ret = &{$hparse{$OpMode}{fn}} ($params); + delete $data{SSCam}{$name}{TMPDA}; return if($ret); } @@ -5835,7 +5846,7 @@ sub camOp_Parse { elsif ($OpMode eq "reactivate_hls") { # HLS Streaming wurde deaktiviert, Aktivitätsstatus speichern $hash->{HELPER}{HLSSTREAM} = "inactive"; Log3($name, 3, "$name - HLS Streaming of camera \"$name\" deactivated for reactivation"); - + delete $data{SSCam}{$name}{TMPDA}; delActiveToken ($hash); # Token freigeben vor hlsactivate __activateHls ($hash); return; @@ -5851,6 +5862,7 @@ sub camOp_Parse { if (!$snapid) { Log3 ($name, 2, "$name - Snap-ID \"LastSnapId\" isn't set. Filename can't be retrieved"); delActiveToken ($hash); # Token freigeben vor hlsactivate + delete $data{SSCam}{$name}{TMPDA}; return; } @@ -5938,7 +5950,6 @@ sub camOp_Parse { if ($errorcode =~ /105/x) { Log3 ($name, 2, "$name - ERROR - $errorcode - $error in operation $OpMode -> try new login"); delete $data{SSCam}{$name}{TMPDA}; - delete $data{SSCam}{$name}{TMPMJ}; return login ($hash, $hash->{HELPER}{API}, \&camOp); } @@ -5946,7 +5957,6 @@ sub camOp_Parse { } delete $data{SSCam}{$name}{TMPDA}; - delete $data{SSCam}{$name}{TMPMJ}; } delActiveToken ($hash); # Token freigeben @@ -7050,7 +7060,7 @@ sub _parsegetsnapgallery { ## no critic "not used" __copySnapsBackFromOld ($paref); # gesicherte Schnappschußdaten aus SNAPOLDHASH an SNAPHASH anhängen # Direktausgabe Snaphash wenn nicht gepollt wird - if (!AttrVal($name, "snapGalleryBoost", 0)) { + if (!AttrVal($name, 'snapGalleryBoost', $sgbdef)) { my %pars = ( linkparent => $name, linkname => '', @@ -8935,9 +8945,9 @@ sub composeGallery { # wenn SSCamSTRM-device genutzt wird und attr "snapGalleryBoost" nicht gesetzt ist -> Warnung in Gallerie ausgeben my $sgbnote = " "; - if ($strmdev && !AttrVal ($name,"snapGalleryBoost",0)) { + if ($strmdev && !AttrVal($name, 'snapGalleryBoost', $sgbdef)) { $sgbnote = "CAUTION - The gallery is not updated automatically. Please set the attribute \"snapGalleryBoost=1\" in device $name"; - $sgbnote = "ACHTUNG - Die Galerie wird nicht automatisch aktualisiert. Dazu bitte das Attribut \"snapGalleryBoost=1\" im Device $name setzen." if ($lang eq "DE"); + $sgbnote = "ACHTUNG - Die Galerie wird nicht automatisch aktualisiert. Dazu bitte das Attribut \"snapGalleryBoost=1\" im Device $name setzen." if($lang eq "DE"); } my $ttsnap = $ttips_en{"ttsnap"}; $ttsnap =~ s/§NAME§/$camname/xg; @@ -8959,13 +8969,13 @@ sub composeGallery { if ($lang eq "EN") { $header .= "Snapshots (_LIMIT_/$totalcnt) of camera $camname - newest Snapshot: $lss
"; - $header .= " (Possibly another snapshots are available. Last recall: $lupt)
" if(AttrVal($name,"snapGalleryBoost",0)); + $header .= " (Possibly another snapshots are available. Last recall: $lupt)
" if(AttrVal($name, 'snapGalleryBoost', $sgbdef)); } else { $header .= "Schnappschüsse (_LIMIT_/$totalcnt) von Kamera $camname - neueste Aufnahme: $lss
"; $lupt =~ /(\d+)-(\d\d)-(\d\d)\s+(.*)/x; $lupt = "$3.$2.$1 $4"; - $header .= " (Eventuell sind neuere Aufnahmen verfügbar. Letzter Abruf: $lupt)
" if(AttrVal($name,"snapGalleryBoost",0)); + $header .= " (Eventuell sind neuere Aufnahmen verfügbar. Letzter Abruf: $lupt)
" if(AttrVal($name, 'snapGalleryBoost', $sgbdef)); } $header .= $sgbnote; @@ -9001,7 +9011,7 @@ sub composeGallery { } if (!$ftui) { - $data{SSCam}{$name}{TMPIDAT} = "onClick=\"FW_okDialog('')\"" if(AttrVal($name, "snapGalleryBoost", 0)); + $data{SSCam}{$name}{TMPIDAT} = "onClick=\"FW_okDialog('')\"" if(AttrVal($name, 'snapGalleryBoost', $sgbdef)); } $data{SSCam}{$name}{TMPIDAT} = '' if(!defined $data{SSCam}{$name}{TMPIDAT}); @@ -9045,7 +9055,7 @@ sub composeGallery { $imgTm = cache ($name, "c_read", "{SNAPHASH}{$key}{createdTm}"); if (!$ftui) { - $data{SSCam}{$name}{TMPIDAT} = "onClick=\"FW_okDialog('')\"" if(AttrVal ($name, "snapGalleryBoost", 0)); + $data{SSCam}{$name}{TMPIDAT} = "onClick=\"FW_okDialog('')\"" if(AttrVal ($name, 'snapGalleryBoost', $sgbdef)); } $data{SSCam}{$name}{TMPIDAT} = '' if(!defined $data{SSCam}{$name}{TMPIDAT}); @@ -9103,13 +9113,13 @@ sub snapLimSize { my ($slim,$ssize); - if (!AttrVal($name,"snapGalleryBoost",0)) { + if (!AttrVal($name,'snapGalleryBoost', $sgbdef)) { $slim = 1; $ssize = 0; } else { $hash->{HELPER}{GETSNAPGALLERY} = 1; - $slim = AttrVal ($name,"snapGalleryNumber",$defSlim); # Anzahl der abzurufenden Snaps + $slim = AttrVal ($name, 'snapGalleryNumber', $defSlim); # Anzahl der abzurufenden Snaps } if (AttrVal($name,"snapGallerySize","Icon") eq "Full") { @@ -12043,7 +12053,7 @@ return; =item summary_DE Kamera-Modul für die Steuerung der Synology Surveillance Station =begin html - +

SSCam

- + Define - + Credentials


- Using the Attribute "session" can be selected, if the session should be established to DSM or the + Using the session attribute can be selected, if the session should be established to DSM or the SVS instead. Further informations about user management in SVS are available by execute "get <name> versionNotes 5".
If the session will be established to DSM, SVS Web-API methods are available as well as further API methods of other API's @@ -12304,19 +12314,19 @@ return;

- + HTTP-Timeout Settings




- + Set