From 081ecf0fac768fafa523bdaf14c8792d4fdd7557 Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Mon, 27 Jul 2020 22:00:20 +0000 Subject: [PATCH] 49_SSCamSTRM: new commands adoptForTimer / adoptTime in master devs git-svn-id: https://svn.fhem.de/fhem/trunk@22482 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/49_SSCamSTRM.pm | 227 ++++++++++++++++++++++++++++++-------- 2 files changed, 182 insertions(+), 46 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 2970cf96d..f8dc03a2f 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: 49_SSCamSTRM: new commands adoptForTimer / adoptTime in master devs - feature: 74_XiaomiBTLESens: add Support for Mijia LYWSD03MMC - bugfix: 73_AutoShuttersControl: Fix Shading bug then shutters ClosedPos, Split in to new modul files Shading.pm and Helper.pm diff --git a/fhem/FHEM/49_SSCamSTRM.pm b/fhem/FHEM/49_SSCamSTRM.pm index a937fdd8b..52f401013 100644 --- a/fhem/FHEM/49_SSCamSTRM.pm +++ b/fhem/FHEM/49_SSCamSTRM.pm @@ -47,6 +47,7 @@ BEGIN { defs devspec2array FmtDateTime + init_done InternalTimer IsDisabled Log3 @@ -90,6 +91,7 @@ BEGIN { # Versions History intern my %vNotesIntern = ( + "2.14.0" => "27.07.2020 new commands adoptForTimer and control command adoptTime ", "2.13.1" => "21.07.2020 fix: set of values in attr adoptSubset is empty after restart, changes according level 3 PBP ", "2.13.0" => "14.07.2020 integrate streamDev master ", "2.12.0" => "28.06.2020 upgrade SSCam functions due to SSCam switch to packages ", @@ -154,9 +156,11 @@ my %hvattr = ( # Has ); my %hset = ( # Hash für Set-Funktion - popupStream => { fn => "_setpopupStream" }, - adopt => { fn => "_setadopt" }, - reset => { fn => "_setreset" }, + popupStream => { fn => "_setpopupStream" }, + adopt => { fn => "_setadopt" }, + adoptForTimer => { fn => "_setadoptForTimer" }, + adoptTime => { fn => "_setAdoptTimer" }, + reset => { fn => "_setreset" }, ); my %sdevs = (); # Hash der vorhandenen Streaming Devices @@ -304,12 +308,14 @@ sub Set { $sd =~ s/\s+/#/gx; my $rsd = $as; - $rsd =~ s/#/ /g; ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!! + $rsd =~ s/#/ /g; ## no critic 'regular expression' # Regular expression without "/x" flag nicht anwenden !!! push my @ado, "adoptList:$rsd"; setReadings($hash, \@ado, 0); $setlist = "Unknown argument $opt, choose one of ". - "adopt:$sd " + "adopt:$sd ". + "adoptForTimer:$sd ". + "adoptTime " ; } @@ -323,8 +329,9 @@ sub Set { no strict "refs"; ## no critic 'NoStrict' if($hset{$opt}) { - &{$hset{$opt}{fn}} (\%params) if(defined &{$hset{$opt}{fn}}); - return; + my $ret = ""; + $ret = &{$hset{$opt}{fn}} (\%params) if(defined &{$hset{$opt}{fn}}); + return $ret; } use strict "refs"; @@ -423,6 +430,85 @@ sub _setadopt { ## no critic "not used" return; } +############################################################### +# setter adopt-for-timer +# schaltet für eine bestimmte Zeit auf das ausgewählte +# Streaming Device und wieder auf das vorherige zurück +############################################################### +sub _setadoptForTimer { ## no critic "not used" + my $paref = shift; + my $hash = $paref->{hash}; + my $name = $paref->{name}; + my $opt = $paref->{opt}; + my $odev = $paref->{odev}; # bisheriges adoptiertes Device (wird erst im InternalTimer gesetzt und verwendet) + + my $atime = ReadingsVal($name, "adoptTimer", 10); + + RemoveInternalTimer($hash, "FHEM::SSCamSTRM::_setadoptForTimer"); + + if ($init_done != 1) { + InternalTimer(gettimeofday()+3, "FHEM::SSCamSTRM::_setadoptForTimer", $paref, 0); + return; + } + + return if(IsDisabled($name)); + + my $sdev; + + if(!$odev) { # Step 1 -> erster Durchlauf ohne odef + $paref->{odev} = $hash->{LINKNAME}; # bisheriges adoptiertes Device in %params aufnehmen, InternalTimer mitgeben + + } else { # Step 2 -> zweiter Durchlauf mit odef gesetzt + my @a; + $sdev = $odev eq $name ? "--reset--" : $odev; + + push @a, $name; + push @a, $opt; + push @a, $sdev; + + $paref->{aref} = \@a; + } + + no strict "refs"; ## no critic 'NoStrict' + &{$hset{adopt}{fn}} ($paref); + use strict "refs"; + + if($odev) { + Log3($name, 4, qq{$name - Switched Stream Device back to "$sdev".}); + return; + } + + Log3($name, 4, qq{$name - Switched to Stream Device "$hash->{LINKNAME}" for $atime seconds.}); + InternalTimer(gettimeofday()+$atime, "FHEM::SSCamSTRM::_setadoptForTimer", $paref, 0); + +return; +} + +################################################################ +# Setter adoptTimer +# setzt die Schaltzeit für setter adoptForTimer +################################################################ +sub _setAdoptTimer { ## no critic "not used" + my $paref = shift; + my $hash = $paref->{hash}; + my $opt = $paref->{opt}; + my $prop = $paref->{prop} // 0; + + my $ret = ""; + $ret = qq{The command "$opt" needs an integer as argument.} if($prop !~ /[0-9]+/x); + return $ret if($ret); + + delReadings ($hash, "adoptTimer"); + + if($prop) { # bei "0" wird das Reading nur gelöscht, nicht wieder gesetzt + my @r; + push @r, "adoptTimer:$prop"; + + setReadings($hash, \@r, 0); + } + +return; +} ################################################################ # Setter reset @@ -736,29 +822,6 @@ sub streamAsHtml { return $ret; } -################################################################ -# delete Readings -# $rd = angegebenes Reading löschen -################################################################ -sub delReadings { - my $hash = shift; - my $rd = shift; - my $name = $hash->{NAME}; - - my $bl = "state|parentState|adoptSubset"; # Blacklist - - if($rd) { # angegebenes Reading löschen wenn nicht im providerLevel enthalten - readingsDelete($hash, $rd) if($rd !~ /$bl/x); - return; - } - - for my $key (keys %{$hash->{READINGS}}) { - readingsDelete($hash, $key) if($key !~ /$bl/x); - } - -return; -} - ################################################################ # Wertevorrat für adoptSubset generieren ################################################################ @@ -806,6 +869,30 @@ sub setReadings { return; } +################################################################ +# delete Readings +# $rd = angegebenes Reading löschen unabhängig vom +# Inhalt der Blacklist +################################################################ +sub delReadings { + my $hash = shift; + my $rd = shift; + my $name = $hash->{NAME}; + + my $bl = "state|parentState|adoptSubset|adoptTimer"; # Blacklist + + if($rd) { # angegebenes Reading löschen + readingsDelete($hash, $rd); + return; + } + + for my $key (keys %{$hash->{READINGS}}) { + readingsDelete($hash, $key) if($key !~ /$bl/x); + } + +return; +} + ################################################################ # liefert String aller Streamingdevices außer MODEL = master # und füllt Hash %sdevs{Alias} = Devicename zu Auflösung @@ -941,6 +1028,38 @@ return $ret; Set
@@ -1203,6 +1314,38 @@ attr <name> genericStrmHtmlTag <img $HTMLATTR Set