From f7e47d0971a8b1eea20b08899e36d3d3fa573864 Mon Sep 17 00:00:00 2001 From: Byte09 <> Date: Sun, 20 Oct 2019 17:48:50 +0000 Subject: [PATCH] 98_MSwitch.pm:Update -> V2.6(a) git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@20387 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- FHEM/98_MSwitch.pm | 1828 ++++++++++++++++++++++---------------------- 1 file changed, 899 insertions(+), 929 deletions(-) diff --git a/FHEM/98_MSwitch.pm b/FHEM/98_MSwitch.pm index c8f81d4c9..0f236b0c9 100644 --- a/FHEM/98_MSwitch.pm +++ b/FHEM/98_MSwitch.pm @@ -25,8 +25,8 @@ # ################################################################# # Todo's: -# reading las_cmd fehlerhaft bei befehlen mit delay -# del delays kontrollieren +# reading last_cmd fehlerhaft bei befehlen mit delay - fixed +# del delays kontrollieren - fixed #--------------------------------------------------------------- # # info sonderreadings @@ -84,32 +84,25 @@ else { $preconf = ""; } if ( $preconf && $preconf ne "" ) { - $preconf = "get_MSwitch_preconf:" . $preconf; + $preconf = "MSwitch_preconf:" . $preconf; } my $autoupdate = 'off'; #off/on -my $version = '2.40'; -my $vupdate = 'V2.00' - ; # versionsnummer der datenstruktur . änderung der nummer löst MSwitch_VUpdate aus . -my $savecount = 30 - ; # anzahl der zugriff im zeitraum zur auslösung des safemodes. kann durch attribut überschrieben werden . -my $standartstartdelay = 60 - ; # zeitraum nach fhemstart , in dem alle aktionen geblockt werden. kann durch attribut überschrieben werden . +my $version = '2.6a'; +my $vupdate = 'V2.00'; # versionsnummer der datenstruktur . änderung der nummer löst MSwitch_VUpdate aus . +my $savecount = 30; # anzahl der zugriff im zeitraum zur auslösung des safemodes. kann durch attribut überschrieben werden . +my $standartstartdelay = 60; # zeitraum nach fhemstart , in dem alle aktionen geblockt werden. kann durch attribut überschrieben werden . my $eventset = '0'; -my $deletesavedcmds = 1800 - ; # zeitraum nachdem gespeicherte devicecmds gelöscht werden ( beschleunugung des webinterfaces ) +my $deletesavedcmds = 1800; # zeitraum nachdem gespeicherte devicecmds gelöscht werden ( beschleunugung des webinterfaces ) -my $deletesavedcmdsstandart = "automatic" - ; # standartverhalten des attributes "MSwitch_DeleteCMDs" +my $deletesavedcmdsstandart = "automatic"; # standartverhalten des attributes "MSwitch_DeleteCMDs" # standartlist ignorierter Devices . kann durch attribut überschrieben werden . my @doignore = qw(notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul); my $startmode = "Notify"; - # degug - my $ip = qx(hostname -I); chop ($ip); chop ($ip); @@ -117,7 +110,6 @@ my $debugging = "0"; $debugging = "0" if $ip ne "192.168.178.109"; # Startmodus des Devices nach Define -##################### ############################################ sub MSwitch_Checkcond_time($$); sub MSwitch_Checkcond_state($$); @@ -164,6 +156,10 @@ sub MSwitch_Getsupport($); sub MSwitch_confchange($$); sub MSwitch_setconfig($$); sub MSwitch_check_setmagic_i($$); +sub MSwitch_Eventlog($$); +sub MSwitch_Writesequenz($); +sub MSwitch_del_singlelog($$); +sub MSwitch_Checkcond_history($$); ############################## my %sets = ( @@ -193,18 +189,23 @@ my %sets = ( "del_repeats" => "noArg", "wait" => "noArg", "VUpdate" => "noArg", + "Writesequenz" => "noArg", "confchange" => "noArg", "clearlog" => "noArg", "set_trigger" => "noArg", "reset_cmd_count" => "", "delcmds" => "", + "deletesinglelog" => "noArg", "change_renamed" => "" ); my %gets = ( "active_timer" => "noArg", "restore_MSwitch_Data" => "noArg", - "get_config" => "noArg" + "Eventlog" => "sequenzformated,timeline,clear", + "restore_MSwitch_Data" => "noArg", + "deletesinglelog" => "noArg", + "config" => "noArg" ); #################### @@ -252,6 +253,7 @@ sub MSwitch_Initialize($) { . " MSwitch_DeleteCMDs:manually,automatic,nosave" . " MSwitch_Mode:Full,Notify,Toggle,Dummy" . " MSwitch_Condition_Time:0,1" + . " MSwitch_Selftrigger_always:0,1" . " MSwitch_RandomTime" . " MSwitch_RandomNumber" . " MSwitch_Safemode:0,1" @@ -262,7 +264,7 @@ sub MSwitch_Initialize($) { . " MSwitch_Sequenz_time" . " setList:textField-long " . " readingList:textField-long " - . " MSwitch_Eventhistory:0,10,20,30,40,50,60,70,80,90,100,150,200" + . " MSwitch_Eventhistory:0,1,2,3,4,5,10,20,30,40,50,60,70,80,90,100,150,200" . " textField-long " . $readingFnAttributes; $hash->{FW_addDetailToSummary} = 0; @@ -344,7 +346,7 @@ sub MSwitch_summary($) { . $devtitle . "\" >" . $option . ""; - ### time +# time my $optiontime; my $devtitletime = ''; my $triggertime = ReadingsVal( $name, 'Trigger_device', 'not defined' ); @@ -430,7 +432,8 @@ sub MSwitch_summary($) { } } - else { + else + { $ret .= " "; + } + + if ( AttrVal( $Name, 'MSwitch_Mode', 'Notify' ) eq "Notify" ) { + $displaynot = "style='display:none;'"; + $inhalt = "execute 'cmd1' at :"; + $inhalt1 = "execute 'cmd2' at :"; + $inhalt2 = $help . "execute 'cmd1'"; + $inhalt3 = $help . "execute 'cmd2'"; + } + + if ( AttrVal( $Name, 'MSwitch_Mode', 'Notify' ) eq "Toggle" ) { + $displayntog = "style='display:none;'"; + $inhalt4 = "toggle $Name + execute 'cmd1/cmd2' at :"; + $inhalt5 = "toggle $Name + execute 'cmd1/cmd2'"; + } + #### + + + + $ret .=""; + + + $ret .= ""; $ret .= " @@ -5527,34 +5344,10 @@ sub MSwitch_fhemwebFn($$$$) { $ret = $ret . ""; - my $inhalt = "execute 'cmd1' only at :"; - my $inhalt1 = "execute 'cmd2' only at :"; - my $inhalt6 = "execute 'cmd1+cmd2' only at :"; - my $inhalt2 = "execute 'cmd1' only"; - my $inhalt3 = "execute 'cmd2' only"; - my $inhalt4 = "switch MSwitch on + execute 'cmd1' at :"; - my $inhalt5 = "switch $Name on + execute 'cmd1'"; - my $displaynot = ''; - my $displayntog = ''; - my $help = ""; - if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) { - $help = -" "; - } +### - if ( AttrVal( $Name, 'MSwitch_Mode', 'Notify' ) eq "Notify" ) { - $displaynot = "style='display:none;'"; - $inhalt = "execute 'cmd1' at :"; - $inhalt1 = "execute 'cmd2' at :"; - $inhalt2 = $help . "execute 'cmd1'"; - $inhalt3 = $help . "execute 'cmd2'"; - } - if ( AttrVal( $Name, 'MSwitch_Mode', 'Notify' ) eq "Toggle" ) { - $displayntog = "style='display:none;'"; - $inhalt4 = "toggle $Name + execute 'cmd1/cmd2' at :"; - $inhalt5 = "toggle $Name + execute 'cmd1/cmd2'"; - } +### $ret = $ret . " @@ -5632,6 +5425,12 @@ sub MSwitch_fhemwebFn($$$$) {
trigger device/time:   "; $ret .= "

"; + + + + + #} + #################### # triggerdetails my $selectedcheck3 = ""; @@ -5640,7 +5439,28 @@ sub MSwitch_fhemwebFn($$$$) { if ( $testlog eq 'on' ) { $selectedcheck3 = "checked=\"checked\""; } - if ( ReadingsVal( $Name, 'Trigger_device', 'no_trigger' ) ne 'no_trigger' ) + + my $selftrigger =""; + + my $showtriggerdevice = $Triggerdevice; + + if ( AttrVal( $Name, "MSwitch_Selftrigger_always", 0 ) eq "1" && ReadingsVal( $Name, 'Trigger_device', 'no_trigger' ) ne 'no_trigger') + { + $selftrigger ="1"; + $showtriggerdevice =$showtriggerdevice." (or MSwitch_Self)"; + } + elsif ( AttrVal( $Name, "MSwitch_Selftrigger_always", 0 ) eq "1" && ReadingsVal( $Name, 'Trigger_device', 'no_trigger' ) eq 'no_trigger') + { + $selftrigger ="1"; + $showtriggerdevice = "MSwitch_Self:"; + + } + + + + + + if ( ReadingsVal( $Name, 'Trigger_device', 'no_trigger' ) ne 'no_trigger' || $selftrigger ne "") { $ret .= " @@ -5658,7 +5478,7 @@ sub MSwitch_fhemwebFn($$$$) { $ret .= $inhalt5 . "
"; - $ret .= "Trigger " . $Triggerdevice . " : + $ret .= "Trigger " . $showtriggerdevice. " : "; $ret .= @@ -5688,7 +5508,7 @@ sub MSwitch_fhemwebFn($$$$) { switch " . $Name . " off + execute 'cmd2' - Trigger " . $Triggerdevice . " : + Trigger " . $showtriggerdevice. " : "; $ret .= @@ -5723,7 +5543,7 @@ sub MSwitch_fhemwebFn($$$$) {
" . $inhalt2 . " - Trigger " . $Triggerdevice . " : + Trigger " . $showtriggerdevice." : "; @@ -5752,7 +5572,7 @@ sub MSwitch_fhemwebFn($$$$) { $ret .= "
" . $inhalt3 . " - Trigger " . $Triggerdevice . " : + Trigger " . $showtriggerdevice. " : 2019-10-18 05:55:37 0x00158d000200b8f0:state:motion

\\'"; +# '); +#$j1 .= "FW_okDialog('$text');"; +$j1 .= "FW_cmd(FW_root+'?cmd=get $Name Eventlog timeline&XHR=1', function(data){FW_okDialog(data)});"; +} + + + +#if ( AttrVal( $Name, 'MSwitch_Mode', 'Notify' ) ne "Dummy" ) { # triggerlock $j1 .= " var triggerdetails = document.getElementById('MSwitchWebTRDT').innerHTML; @@ -6055,7 +5907,7 @@ sub MSwitch_fhemwebFn($$$$) { } } "; - +#} ##################### $j1 .= " if (document.getElementById('trigon')){ @@ -6238,6 +6090,29 @@ sub MSwitch_fhemwebFn($$$$) { var def = nm+\" VUpdate \"+encodeURIComponent(conf); location = location.pathname+\"?detail=" . $Name . "&cmd=set \"+addcsrf(def); }"; + + + $j1 .= "function saveconfig(conf){ + + conf = conf.replace(/\\n/g,'#[EOL]'); + conf = conf.replace(/:/g,'#c[dp]'); + conf = conf.replace(/;/g,'#c[se]'); + conf = conf.replace(/ /g,'#c[sp]'); + + var nm = \$(t).attr(\"nm\"); + var def = nm+\" saveconfig \"+encodeURIComponent(conf); + location = location.pathname+\"?detail=" . $Name . "&cmd=set \"+addcsrf(def); + }"; + + $j1 .= "function writeattr(){ + conf=''; + var nm = \$(t).attr(\"nm\"); + var def = nm+\" Writesequenz \"+encodeURIComponent(conf); + location = location.pathname+\"?detail=" . $Name . "&cmd=set \"+addcsrf(def); + }"; + + + $j1 .= "function clearlog(){ conf=''; @@ -6355,57 +6230,21 @@ Hier kann die Angabe von Bedingungen erfolgen, die erfüllt sein müssen um den
Sonderfunktionen:


-Tendenz:
+Tendenz: +Beschreibung im Wiki
-Syntax:
-[TEND<wert>:<reading>] > <Mindestwert>
-
-Beispiel:
-[TEND2:countdown] > 2
-
-Reading:
-entspricht dem getriggerten Reading
-
-Wert:
-Es wird jeweils der Durchschnitt von 2 Wertepaaren gebildet. In diesem Fall -werden die letzten 4 Werte herangezogen. Paar 1 = aktueller und letzter Wert , -Paar 2 = die 2 vorherigen Werte. Bei TEND3 würden diel letzten 6 Wertezur -Paarbildung genutzt werden.
-
-Mindestwert:
-Der Werteunterschied zwischen den Wertepaaren , der minimal erreicht sein muss, -um eine Tendenz zu erkennen.
-
-Rechenzeichen (><):
-Dieses ist hier nicht als Rechenzeichen zu werten , sonder als Tendenzanzeige . -( < es wird nach fallender Tendenz gesucht / > sucht nach steigender Tendenz)
-
-Schaltung erfolgt einmalig bei Erkennung der -gesuchten Tendenz.
-Danach erfolgt keine Schaltung mehr, solange bis eine Tendenzumkehr erfolgt ist.
-Erst dann erfolgt wieder eine Schaltung bei erneuter Tendenzumkehr in gesuchte -Richtung
-

-Differenz
+Differenz: +Beschreibung im Wiki
-Syntax:
-[DIFF<wert>:<reading>] > <differenz>
+Average +Beschreibung im Wiki
-Beispiel:
-[DIFF2:countdown] > 0
+Increase +Beschreibung im Wiki
-Reading:
-entspricht dem getriggerten Reading
-
-Wert:
-gespeicherter wert (in diesem fall der vorletzte)
-
-Differenz:
-geforderter differenz zwische aktuellem und vorletztem wert
-
-Schaltung erfolg wenn diese Bedingung \\'wahr\\' ist.
-

+ +
'; @@ -6782,6 +6621,38 @@ Schaltung erfolg wenn diese Bedingung \\'wahr\\' ist.
FW_okDialog(sel,''); } + + function deletelog() { + anzahl =document.getElementById('dellog').value; + //alert(anzahl); + arg =''; + for (i = 1; i < anzahl; i++) { + test = document.getElementById('Checkbox-' + i).checked; + //alert('x '+test); + + if (document.getElementById('Checkbox-' + i).checked) + { + //alert('match '+i); + arg=arg+i+','; + } + + } + //alert(arg); + + conf=arg; + var nm = \$(t).attr(\"nm\"); + var def = nm+\" deletesinglelog \"+encodeURIComponent(conf); + location = location.pathname+\"?detail=" . $Name . "&cmd=set \"+addcsrf(def); + + + + + return; + } + + + + function removeFn() { var targ = document.getElementById('devices'); for (i = 0; i < targ.options.length; i++) { @@ -6998,6 +6869,7 @@ sub MSwitch_Delete_Triggermemory($) { if ( !defined $triggercmdoff ) { $triggercmdoff = "" } my $triggerdevice = ReadingsVal( $Name, 'Trigger_device', '' ); delete( $hash->{helper}{events} ); + $hash->{helper}{events}{$triggerdevice}{'no_trigger'} = "on"; $hash->{helper}{events}{$triggerdevice}{$triggeron} = "on"; $hash->{helper}{events}{$triggerdevice}{$triggeroff} = "on"; @@ -7668,16 +7540,33 @@ sub MSwitch_checkcondition($$$) { my $hash = $modules{MSwitch}{defptr}{$name}; my $attrrandomnumber = AttrVal( $name, 'MSwitch_RandomNumber', '' ); - + my $debugmode = AttrVal( $name, 'MSwitch_Debug', "0" ); #### kompatibilität v < 2.01 $condition =~ s/\[\$EVENT\]/"\$EVENT"/g; $condition =~ s/\[\$EVTFULL\]/"\$EVTFULL"/g; $condition =~ s/\[\$EVTPART1\]/"\$EVTPART1"/g; $condition =~ s/\[\$EVTPART2\]/"\$EVTPART2"/g; $condition =~ s/\[\$EVTPART3\]/"\$EVTPART3"/g; - $condition =~ s/\[\$EVT_CMD1_COUNT\]/"\$EVT_CMD1_COUNT"/g; $condition =~ s/\[\$EVT_CMD2_COUNT\]/"\$EVT_CMD2_COUNT"/g; + #### evt anpassung wenn alleinstehend + + $condition =~ s/\[EVENT]/[$name:EVENT]/g; + $condition =~ s/\[EVTFULL]/[$name:EVTFULL]/g; + $condition =~ s/\[EVTPART1]/[$name:EVTPART1]/g; + $condition =~ s/\[EVTPART2]/[$name:EVTPART2]/g; + $condition =~ s/\[EVTPART3]/[$name:EVTPART3]/g; + + $condition =~ s/\[EVT_CMD1_COUNT\]/[$name:EVT_CMD1_COUNT]/g; + $condition =~ s/\[EVT_CMD2_COUNT\]/[$name:EVT_CMD2_COUNT]/g; + $condition =~ s/\[DIFFDIRECTION\]/[$name:DIFFDIRECTION]/g; + + $condition =~ s/\[DIFFERENCE\]/[$name:DIFFERENCE]/g; + $condition =~ s/\[TENDENCY\]/[$name:TENDENCY]/g; + $condition =~ s/\[INCREASE\]/[$name:INCREASE]/g; + $condition =~ s/\[AVERAGE\]/[$name:AVERAGE]/g; + $condition =~ s/\[SEQUENCE_Number\]/[$name:SEQUENCE_Number]/g; + $condition =~ s/\[SEQUENCE\]/[$name:SEQUENCE]/g; if ( !defined($condition) ) { return 'true'; } if ( $condition eq '' ) { return 'true'; } @@ -7692,25 +7581,24 @@ sub MSwitch_checkcondition($$$) { my $funktionsstringavg; my $funktionsstringinc; - if ( $condition =~ m/(.*)(\[DIFF.*[>|<].*\d{1,3})(.*)/ ) { + if ( $condition =~ m/(.*)(\[DIFF.*[>|<].*?\d{1,3})(.*)/ ) { $funktionstring = $2; $condition = $1 . "[$name:DIFFERENCE] eq \"true\"" . $3; - MSwitch_LOG( $name, 5, "$name: condition -> " . $condition ); } - if ( $condition =~ m/(.*)(\[TEND.*[>|<].*\d{1,3})(.*)/ ) { + if ( $condition =~ m/(.*)(\[TEND.*[>|<].*?\d{1,3})(.*)/ ) { $funktionstring = $2; $condition = $1 . "[$name:TENDENCY] eq \"true\"" . $3; MSwitch_LOG( $name, 5, "$name: condition -> " . $condition ); } - if ( $condition =~ m/(.*)(\[AVG.*[>|<].*\d{1,3})(.*)/ ) { + if ( $condition =~ m/(.*)(\[AVG.*[>|<].*?\d{1,3})(.*)/ ) { $funktionstring = $2; $condition = $1 . "[$name:AVERAGE] eq \"true\"" . $3; MSwitch_LOG( $name, 5, "$name: condition -> " . $condition ); } - if ( $condition =~ m/(.*)(\[INC.*[>|<].*\d{1,3})(.*)/ ) { + if ( $condition =~ m/(.*)(\[INC.*[>|<].*?\d{1,3})(.*)/ ) { $funktionstring = $2; $condition = $1 . "[$name:INCREASE] eq \"true\"" . $3; MSwitch_LOG( $name, 5, "$name: condition -> " . $condition ); @@ -7736,6 +7624,7 @@ sub MSwitch_checkcondition($$$) { #Function DIFF if ( $funktionsstringdiff =~ m/(DIFF)(.*)/ ) { my $finaldiff; + my $finaldiff1; MSwitch_LOG( $name, 5, "#########################" ); $vergloperand = $2; $vergloperand = 0 if $2 eq ""; @@ -7747,34 +7636,32 @@ sub MSwitch_checkcondition($$$) { my $vergleichswert = $2; MSwitch_LOG( $name, 5, "$name: Funktion ist: - $function" ); MSwitch_LOG( $name, 5, "$name: index ist: - $vergloperand" ); - MSwitch_LOG( $name, 5, - "$name: vergleichswert ist: - $vergleichswert" ); - my @eventfunction = - split( / /, $hash->{helper}{eventhistory}{$eventhistorie} ); + MSwitch_LOG( $name, 5, "$name: vergleichswert ist: - $vergleichswert" ); + my @eventfunction =split( / /, $hash->{helper}{eventhistory}{$eventhistorie} ); if ( @eventfunction < $vergloperand ) { - MSwitch_LOG( - $name, - 4, -"$name: Funktionberechnung DIFF erkannt-> nicht genug Daten für berechnung vorhanden" - ); + MSwitch_LOG($name,4,"$name: Funktionberechnung DIFF erkannt-> nicht genug Daten für berechnung vorhanden"); - $finaldiff = -"Funktionberechnung DIFFERENCE
Berechnung nicht möglich, nicht genug Daten vorhanden
Ergebniss: false"; + $finaldiff ="Funktionberechnung DIFFERENCE
Berechnung nicht möglich, nicht genug Daten vorhanden
Ergebniss: false"; $hash->{helper}{eventhistory}{DIFFERENCE} = $finaldiff; - readingsSingleUpdate( $hash, "DIFFERENCE", 'false', 1 ); + } - else { + else + { my $operand = $eventfunction[0]; my $index = $vergloperand - 1; $index = 0 if $index < 0; MSwitch_LOG( $name, 5, "$name: index ist: - $index" ); - my $operand1 = $eventfunction[$index]; - MSwitch_LOG( $name, 5, - "$name: vergleichswert1 - $operand" ); - MSwitch_LOG( $name, 5, - "$name: vergleichswert2 - $operand1" ); + my $operand1 = $eventfunction[$index]; + + readingsSingleUpdate( $hash, "Debug-DIFF-Wert1", $operand, 1 )if ($debugmode > 0); + readingsSingleUpdate( $hash, "Debug-DIFF-Wert2", $operand1, 1 )if ($debugmode > 0); + + + + MSwitch_LOG( $name, 5,"$name: vergleichswert1 - $operand" ); + MSwitch_LOG( $name, 5,"$name: vergleichswert2 - $operand1" ); my $diff = abs( $operand1 - $operand ); MSwitch_LOG( $name, 5, "$name: Differenz : $diff" ); my $ret; @@ -7784,65 +7671,80 @@ sub MSwitch_checkcondition($$$) { . $rechenzeichen . $vergleichswert . ";return \$ret;"; - - if ($debugging eq "1") - { - MSwitch_LOG( "Debug", 0,"eveal line" . __LINE__ ); - } - - + my $erg2 = eval $erg; MSwitch_LOG( $name, 5, "$name: ergebniss : $erg" ); MSwitch_LOG( $name, 5, "$name: ergebniss : $erg2" ); - $finaldiff = -"Funktionberechnung DIFFERENCE
Wertepaar: $operand - $operand1
Differenz (Zahlenwert): $diff
Wahr wenn $diff $rechenzeichen $vergleichswert
Ergebniss: $erg2"; - $hash->{helper}{eventhistory}{DIFFERENCE} = $finaldiff; + $finaldiff ="Funktionberechnung DIFFERENCE
Wertepaar: $operand - $operand1
Differenz (Zahlenwert): $diff
Wahr wenn $diff $rechenzeichen $vergleichswert
Ergebniss: $erg2"; + $finaldiff1="Funktionberechnung: Wertepaar: $operand - $operand1-Differenz (Zahlenwert): $diff-Wahr wenn $diff $rechenzeichen $vergleichswert-Ergebniss: $erg2"; + + + $hash->{helper}{eventhistory}{DIFFERENCE} = $finaldiff; readingsSingleUpdate( $hash, "DIFFERENCE", $erg2, 1 ); - + + + if ($operand > $operand1) + { + readingsSingleUpdate( $hash, "DIFFDIRECTION", "up", 1 ); + } + elsif ($operand < $operand1) + { + readingsSingleUpdate( $hash, "DIFFDIRECTION", "down", 1 ); + } + else + { + readingsSingleUpdate( $hash, "DIFFDIRECTION", "no_tendency", 1 ); + } } - } + + if ($debugmode > 0){ +readingsSingleUpdate( $hash, "Debug-DIFF-Event-History", $hash->{helper}{eventhistory}{$eventhistorie}, 1 ); +readingsSingleUpdate( $hash, "Debug-DIFF-Summary", $finaldiff1, 1 ); + +} + } # DIFF ende ########################## + #Function TEND if ( $funktionsstringtend =~ m/(TEND)(.*)/ ) { my $finaltend; $vergloperand = $2; $vergloperand = 0 if $2 eq ""; my $function = "TEND"; - MSwitch_LOG( $name, 5, - "$name: \$vergloperand - $vergloperand" ); + MSwitch_LOG( $name, 5,"$name: \$vergloperand - $vergloperand" ); $ausdruck =~ m/.*?([<>]).*?(\d.*)/; my $rechenzeichen = $1; my $vergleichswert = $2; - my $anzahl = - $vergloperand; # anzahl der getesteten events aus historia - my $anzahl1 = - $vergloperand * 2; # anzahl der getesteten events aus historia + my $anzahl =$vergloperand; # anzahl der getesteten events aus historia + my $anzahl1 =$vergloperand * 2; # anzahl der getesteten events aus historia - my @eventfunction = - split( / /, $hash->{helper}{eventhistory}{$eventhistorie} ); + my @eventfunction = split( / /, $hash->{helper}{eventhistory}{$eventhistorie} ); if ( @eventfunction < $anzahl1 ) { - MSwitch_LOG( - $name, - 4, -"$name: Funktion TEND erkannt-> nicht genug Daten für berechnung vorhanden" + MSwitch_LOG($name,4,"$name: Funktion TEND erkannt-> nicht genug Daten für berechnung vorhanden" ); - $finaltend = -"Funktionberechnung TENDENCY
Berechnung nicht möglich, nicht genug Daten vorhanden"; + $finaltend ="Funktionberechnung TENDENCY
Berechnung nicht möglich, nicht genug Daten vorhanden"; $hash->{helper}{eventhistory}{TENDENCY} = $finaltend; readingsSingleUpdate( $hash, "TENDENCY", 'false', 1 ); + + readingsSingleUpdate( $hash, "Debug-TENDENCY-Result", 'FALSE - nicht genug Daten für berechnung vorhanden. Benötigt:'.$anzahl1.' Vorhanden:'.@eventfunction, 1 ) if ($debugmode > 0); + } else { my $wert1 = 0; my $wert2 = 0; my $count = 0; +my @wertpaar1; +my @wertpaar2; foreach (@eventfunction) { last if $count >= $anzahl1; $wert1 = $wert1 + $_ if $count < $anzahl; + push (@wertpaar1,$_) if $count < $anzahl; $wert2 = $wert2 + $_ if $count >= $anzahl; + push (@wertpaar2,$_) if $count >= $anzahl; $count++; } @@ -7851,11 +7753,8 @@ sub MSwitch_checkcondition($$$) { my $tendenz = 'notendenz'; - MSwitch_LOG( $name, 5, - "$name: neueres wertepaar wert1: $wert1" ); - MSwitch_LOG( $name, 5, - "$name: aelteres wertepaar wert2: $wert2" ); - + MSwitch_LOG( $name, 5, "$name: neueres wertepaar wert1: $wert1" ); + MSwitch_LOG( $name, 5, "$name: aelteres wertepaar wert2: $wert2" ); MSwitch_LOG( $name, 5, "$name: $wert1<$wert2 -> down" ); MSwitch_LOG( $name, 5, "$name: $wert1>$wert2 -> up" ); $tendenz = "down" if $wert1 < $wert2; @@ -7863,11 +7762,7 @@ sub MSwitch_checkcondition($$$) { my $tendenzwert = abs( $wert1 - $wert2 ); - MSwitch_LOG( - $name, - 5, -"$name: geforderte tendenz als rechenzeichen: $rechenzeichen" - ); + MSwitch_LOG($name,5,"$name: geforderte tendenz als rechenzeichen: $rechenzeichen"); my $tendenzgefordert = "no_entry"; @@ -7882,44 +7777,50 @@ sub MSwitch_checkcondition($$$) { { $hash->{helper}{eventhistory}{TENDlast}{$tendenzgefordert} = "not_set"; - + # mögliche zustände: not_set / set } - my $tendenzsetsoon = - $hash->{helper}{eventhistory}{TENDlast}{$tendenzgefordert}; + +# debug + + if ($debugmode > 0){ + readingsSingleUpdate( $hash, "Debug-TENDENCY-Wert-Ist", $tendenzwert, 1 ); + readingsSingleUpdate( $hash, "Debug-TENDENCY-Wert-Soll", $tendenzwertgefordert, 1 ); + readingsSingleUpdate( $hash, "Debug-TENDENCY-Event-History", $hash->{helper}{eventhistory}{$eventhistorie}, 1 ); + if ( defined $hash->{helper}{eventhistory}{TENDlast}{$tendenzgefordert} ) + { + readingsSingleUpdate( $hash, "Debug-TENDENCY-Schaltung-erfolgt", $hash->{helper}{eventhistory}{TENDlast}{$tendenzgefordert}, 1 ); + }else + { + readingsSingleUpdate( $hash, "Debug-TENDENCY-Schaltung-erfolgt", "not_set", 1 ); + } + + readingsSingleUpdate( $hash, "Debug-TENDENCY-Wertepaar-1", "@wertpaar1", 1 ); + readingsSingleUpdate( $hash, "Debug-TENDENCY-Wertepaar-2", "@wertpaar2", 1 ); + readingsSingleUpdate( $hash, "Debug-TENDENCY-Wertepaar-Schnitt-1", $wert1, 1 ); + readingsSingleUpdate( $hash, "Debug-TENDENCY-Wertepaar-Schnitt-2", $wert2, 1 ); + readingsSingleUpdate( $hash, "Debug-TENDENCY-Soll-Richtung", $tendenzgefordert, 1 ); + } +# + + my $tendenzsetsoon =$hash->{helper}{eventhistory}{TENDlast}{$tendenzgefordert}; # verfügbare werte - MSwitch_LOG( $name, 5, - "$name: aktuelle tendenz: $tendenz" ); - MSwitch_LOG( $name, 5, - "$name: geforderte tendenz: $tendenzgefordert" ); - MSwitch_LOG( $name, 5, - "$name: aktueller tendenzwert: $tendenzwert" ); - MSwitch_LOG( - $name, - 5, -"$name: geforderter tendenzwert: groesser $tendenzwertgefordert" - ); - MSwitch_LOG( $name, 5, - "$name: Tendenz geschaltet ?: $tendenzsetsoon" ); + MSwitch_LOG( $name, 5,"$name: aktuelle tendenz: $tendenz" ); + MSwitch_LOG( $name, 5,"$name: geforderte tendenz: $tendenzgefordert" ); + MSwitch_LOG( $name, 5,"$name: aktueller tendenzwert: $tendenzwert" ); + MSwitch_LOG($name,5,"$name: geforderter tendenzwert: groesser $tendenzwertgefordert"); + MSwitch_LOG( $name, 5,"$name: Tendenz geschaltet ?: $tendenzsetsoon" ); # abbruch wenn tendenzwert unter gefordertem wert - MSwitch_LOG( - $name, - 5, -"$name: Tendenzpaar $tendenzwert < $tendenzwertgefordert" - ); + MSwitch_LOG($name,5,"$name: Tendenzpaar $tendenzwert < $tendenzwertgefordert"); + if ( $tendenzwert < $tendenzwertgefordert ) { - MSwitch_LOG( - $name, - 4, -"$name: TEND Abbruch, geforderter Tendenzumkehrwert nicht erreicht." - ); - $finaltend = -"Funktionberechnung DIFFERENCE
geforderter Tendenzumkehrwert nicht erreicht"; + MSwitch_LOG( $name,4,"$name: TEND Abbruch, geforderter Tendenzumkehrwert nicht erreicht."); + $finaltend ="Funktionberechnung DIFFERENCE
geforderter Tendenzumkehrwert nicht erreicht"; $hash->{helper}{eventhistory}{TENDENCY} = $finaltend; readingsSingleUpdate( $hash, "TENDENCY", 'false', 1 ); - + readingsSingleUpdate( $hash, "Debug-TENDENCY-Result", 'FALSE - geforderter Tendenzumkehrwert nicht erreicht', 1 ) if ($debugmode > 0); } elsif ( $tendenzgefordert ne $tendenz ) @@ -7930,15 +7831,11 @@ sub MSwitch_checkcondition($$$) { #$tendenz $hash->{helper}{eventhistory}{TENDlast}{$tendenzgefordert} = "not_set"; - MSwitch_LOG( - $name, - 4, -"$name: TENDenzumkehr in nicht geforgerte Richtung erkannt loesche bereits 'gesetzt' Tag ." - ); - $finaltend = -"TENDenzumkehr in nicht geforderte Richtung erkannt loesche bereits 'gesetzt' Tag "; + MSwitch_LOG($name,4,"$name: TENDenzumkehr in nicht geforgerte Richtung erkannt loesche bereits 'gesetzt' Tag ."); + $finaltend ="TENDenzumkehr in nicht geforderte Richtung erkannt loesche bereits 'gesetzt' Tag "; $hash->{helper}{eventhistory}{TENDENCY} = $finaltend; readingsSingleUpdate( $hash, "TENDENCY", 'false', 1 ); + readingsSingleUpdate( $hash, "Debug-TENDENCY-Result", 'FALSE - TENDenzumkehr entgegen geforderter Richtung erkannt loesche bereits gesetzt Tag', 1 ) if ($debugmode > 0); } elsif ( $tendenzsetsoon eq "set" ) @@ -7948,37 +7845,26 @@ sub MSwitch_checkcondition($$$) { ## zustandsmöglichkeiten ab hier richtige richtung erkannt - schon gesetzt/nicht gesetzt unklar ## aktion ab hier: 'false' liefern falls 'bereits gesetzt Tag' existiert 'set' ## aktion ab hier: 'true' liefern und 'bereits gesetzt Tag' setzen falls auf 'not_set' - # geforderte tendenz erkannt aber bereits geschaltet #if ($tendenzsetsoon eq "set") { - MSwitch_LOG( - $name, - 4, -"$name: TEND geforderte Tendenz erkannt, Schaltbefehl ist bereits erfolgt. Warte auf Richtungsumkehr" - ); - $finaltend = -"TEND geforderte Tendenz erkannt, Schaltbefehl ist bereits erfolgt. Warte auf Richtungsumkehr"; + MSwitch_LOG($name,4,"$name: TEND geforderte Tendenz erkannt, Schaltbefehl ist bereits erfolgt. Warte auf Richtungsumkehr"); + $finaltend ="TEND geforderte Tendenz erkannt, Schaltbefehl ist bereits erfolgt. Warte auf Richtungsumkehr"; $hash->{helper}{eventhistory}{TENDENCY} = $finaltend; readingsSingleUpdate( $hash, "TENDENCY", 'false', 1 ); + readingsSingleUpdate( $hash, "Debug-TENDENCY-Result", 'FALSE - Tendenz erkannt, Schaltbefehl ist bereits erfolgt. Warte auf Richtungsumkehr', 1 ) if ($debugmode > 0); } elsif ( $tendenzsetsoon eq "not_set" ) - - #if ($tendenzsetsoon eq "not_set") { - MSwitch_LOG( - $name, - 3, -"$name: TEND geforderte Tendenz erkannt, Schaltbefehl erfolgt." - ); + MSwitch_LOG($name,3,"$name: TEND geforderte Tendenz erkannt, Schaltbefehl erfolgt."); $hash->{helper}{eventhistory}{TENDlast}{$tendenzgefordert} = "set"; $finaltend = "TEND geforderte Tendenz erkannt, Schaltbefehl erfolgt."; $hash->{helper}{eventhistory}{TENDENCY} = $finaltend; readingsSingleUpdate( $hash, "TENDENCY", 'true', 1 ); - + readingsSingleUpdate( $hash, "Debug-TENDENCY-Result", 'TRUE - geforderte Tendenz erkannt, Schaltbefehl erfolgt', 1 ) if ($debugmode > 0); } } @@ -8193,10 +8079,9 @@ sub MSwitch_checkcondition($$$) { } ################################### - - ###### perlersetzung - ############## - +# $condition +# perlersetzung +############## my $x = 0; my $field = ""; my $SELF = $name; @@ -8214,7 +8099,7 @@ sub MSwitch_checkcondition($$$) { if ($debugging eq "1") { - MSwitch_LOG( "Debug", 0,"eveal line" . __LINE__ ); + MSwitch_LOG( "Debug", 0,"eval line" . __LINE__ ); } @@ -8355,7 +8240,6 @@ m/(.*?)(\[\[[a-zA-Z][a-zA-Z0-9_]{0,30}:[a-zA-Z0-9_]{0,30}\]-\[[a-zA-Z][a-zA-Z0-9 $x++; last if $x > 10; #notausstieg my $x = 0; - # Searchstring -> [[t1:state]-[t2:state]] while ( $searchstring =~ m/(.*?)(\[[a-zA-Z][a-zA-Z0-9_]{0,30}:[a-zA-Z0-9_]{0,30}\])(.*)?/ ) @@ -8377,8 +8261,6 @@ m/(.*?)(\[\[[a-zA-Z][a-zA-Z0-9_]{0,30}:[a-zA-Z0-9_]{0,30}\]-\[[a-zA-Z][a-zA-Z0-9 $x = 0; while ( $condition =~ m/(.*)(\{ )(.*)(\$we)( \})(.*)/ ) - - #while ( $condition =~ m/(.*)(\{ )(.*)(\$we)( \})(.*)/ ) { last if $x > 20; # notausstieg $condition = $1 . " " . $3 . $4 . " " . $6; @@ -8396,10 +8278,8 @@ m/(.*?)(\[\[[a-zA-Z][a-zA-Z0-9_]{0,30}:[a-zA-Z0-9_]{0,30}\]-\[[a-zA-Z][a-zA-Z0-9 if ($debugging eq "1") { - MSwitch_LOG( "Debug", 0,"eveal line" . __LINE__ ); + MSwitch_LOG( "Debug", 0,"eval line" . __LINE__ ); } - - my $part2 = eval $3; chop($part2); chop($part2); @@ -8457,24 +8337,31 @@ m/(.*?)(\[\[[a-zA-Z][a-zA-Z0-9_]{0,30}:[a-zA-Z0-9_]{0,30}\]-\[[a-zA-Z][a-zA-Z0-9 my @newargarray; foreach my $args (@argarray) { $testarg = $args; + #MSwitch_LOG( "Debug", 0,"suche history $name $testarg" . __LINE__ ); + + + if ( $testarg =~ '.*:h\d{1,3}' ) { + # historyformatierung erkannt - auswerten über sub + # in der regex evtl auf zeilenende definieren + $newargarray[$count] = MSwitch_Checkcond_history( $args, $name ); + + MSwitch_LOG( "Debug", 0,"suche history $testarg" . __LINE__ ); + + next; + } $testarg =~ s/[0-9]+//gs; if ( $testarg eq '[:-:|]' || $testarg eq '[:-:]' ) { - # timerformatierung erkannt - auswerten über sub # my $param = $argarray[$count]; - $newargarray[$count] = MSwitch_Checkcond_time( $args, $name ); } elsif ( $testarg =~ '[.*:.*]' ) { - # stateformatierung erkannt - auswerten über sub $newargarray[$count] = MSwitch_Checkcond_state( $args, $name ); } else { $newargarray[$count] = $args; - } - $count++; } @@ -8497,7 +8384,6 @@ m/(.*?)(\[\[[a-zA-Z][a-zA-Z0-9_]{0,30}:[a-zA-Z0-9_]{0,30}\]-\[[a-zA-Z][a-zA-Z0-9 MSwitch_LOG( "Debug", 0,"eveal line" . __LINE__ ); } - my $ret = eval $finalstring; if ($@) { @@ -8510,9 +8396,7 @@ m/(.*?)(\[\[[a-zA-Z][a-zA-Z0-9_]{0,30}:[a-zA-Z0-9_]{0,30}\]-\[[a-zA-Z][a-zA-Z0-9 MSwitch_LOG( $name, 6, "$name: Checkcondition - return -> " . $ret ); my $test = ReadingsVal( $name, 'last_event', 'undef' ); - $hash->{helper}{conditioncheck} = $finalstring; - return $ret; } #################### @@ -8544,13 +8428,11 @@ sub MSwitch_Checkcond_state($$) { my $test; if ( defined $reading[2] and $reading[2] eq "d" ) { $test = ReadingsNum( $reading[0], $reading[1], 'undef' ); - $return = - "ReadingsNum('$reading[0]', '$reading[1]', 'undef')"; #00:00:00 + $return ="ReadingsNum('$reading[0]', '$reading[1]', 'undef')"; #00:00:00 } else { $test = ReadingsVal( $reading[0], $reading[1], 'undef' ); - $return = - "ReadingsVal('$reading[0]', '$reading[1]', 'undef')"; #00:00:00 + $return ="ReadingsVal('$reading[0]', '$reading[1]', 'undef')"; #00:00:00 } MSwitch_LOG( $name, 6, "$name: MSwitch_Checkcond_state OUT -> " . $return ); @@ -8562,8 +8444,6 @@ sub MSwitch_Checkcond_time($$) { $condition =~ s/\[//; $condition =~ s/\]//; -#MSwitch_LOG( $name, 0,"$name: condition -> " .$condition) if $name eq "Motion_Kueche"; - my $hash = $defs{$name}; my $adday = 0; my $days = ''; @@ -8665,6 +8545,44 @@ sub MSwitch_Checkcond_time($$) { return $return; } #################### +sub MSwitch_Checkcond_history($$) { + + my ( $condition, $name ) = @_; + $condition =~ s/\[//; + $condition =~ s/\]//; + my $hash = $defs{$name}; + my $return; + + my $seq; + my $x=0; + my $log = $hash->{helper}{eventlog}; + + + +if ($hash->{helper}{history}{eventberechnung} ne "berechnet") # teste auf vorhandene berechnung +{ +foreach $seq ( sort{$b <=> $a} keys %{$log} ) + { + my @historyevent = split( /:/, $hash->{helper}{eventlog}{$seq} ); + $hash->{helper}{history}{event}{$x}{EVENT} = $historyevent[1].":".$historyevent[2]; + $hash->{helper}{history}{event}{$x}{EVFULL} = $hash->{helper}{eventlog}{$seq}; + $hash->{helper}{history}{event}{$x}{EVTPART1} = $historyevent[0]; + $hash->{helper}{history}{event}{$x}{EVTPART2} = $historyevent[1]; + $hash->{helper}{history}{event}{$x}{EVTPART3} = $historyevent[2]; + $x++; + } + $hash->{helper}{history}{eventberechnung} ="berechnet"; +} + +my @historysplit = split( /\:/, $condition ); +my $historynumber = $historysplit[1]; +#$historynumber =~ s/[0-9]+//gs; +$historynumber =~ s/[a-z]+//gs; +my $inhalt = $hash->{helper}{history}{event}{1}{$historysplit[0]}; +$return ="'".$inhalt."'"; +return $return; +} +#################### sub MSwitch_Checkcond_day($$$$) { my ( $days, $name, $adday, $day ) = @_; @@ -8743,8 +8661,7 @@ sub MSwitch_Createtimer($) { { MSwitch_LOG( "Debug", 0,"eveal line" . __LINE__ ); } - - + my $part2 = eval $2; if ( $part2 !~ m/^[0-9]{2}:[0-9]{2}$|^[0-9]{2}:[0-9]{2}:[0-9]{2}$/ ) { @@ -8771,10 +8688,6 @@ sub MSwitch_Createtimer($) { $timer[3] = '' if ( !defined $timer[3] ); #cmd2 $timer[4] = '' if ( !defined $timer[4] ); #cmd1+2 - -#MSwitch_LOG($Name,0,"$Name timer: $timer[2] "); - - # lösche bei notify und toggle if ( AttrVal( $Name, 'MSwitch_Mode', 'Notify' ) eq "Notify" ) { $timer[0] = ''; @@ -8819,12 +8732,6 @@ sub MSwitch_Createtimer($) { my $i = 0; my $id = ""; LOOP2: foreach my $option (@timer) { - - - - - - $i++; $id = ""; @@ -8835,30 +8742,13 @@ sub MSwitch_Createtimer($) { $option =~ s/$key//ig; $key = '\]'; $option =~ s/$key//ig; - my $y = 0; - - -#MSwitch_LOG($Name,0,"$Name option: $option "); - - - while ( $option =~ m/(.*?)([0-9]{2}):([0-9]{2})\*([0-9]{2}:[0-9]{2})-([0-9]{2}:[0-9]{2})\|?([0-9!\$we]{0,7})(.*)?/ ) { $y++; last if $y > 20; - - -# MSwitch_LOG($Name,0,"$Name 1: $1 "); -# MSwitch_LOG($Name,0,"$Name 2: $2 "); -# MSwitch_LOG($Name,0,"$Name 3: $3 "); -# MSwitch_LOG($Name,0,"$Name 4: $4 "); -# MSwitch_LOG($Name,0,"$Name 5: $5 "); -# MSwitch_LOG($Name,0,"$Name 6: $6 "); -# MSwitch_LOG($Name,0,"$Name 7: $7 "); - my $part1 = ''; $part1 = $1 . ' ' if defined $1; @@ -8867,11 +8757,6 @@ m/(.*?)([0-9]{2}):([0-9]{2})\*([0-9]{2}:[0-9]{2})-([0-9]{2}:[0-9]{2})\|?([0-9!\$ my $part7 = ''; $part7 = ' ' . $7 if defined $7; - - -#MSwitch_LOG($Name,0,"$Name part6: $part6 "); -#MSwitch_LOG($Name,0,"$Name part7: $part7 "); - my $sectoadd = $2 * 3600 + $3 * 60; my $t1 = $4; my $t2 = $5; @@ -8907,10 +8792,7 @@ m/(.*?)([0-9]{2}):([0-9]{2})\*([0-9]{2}:[0-9]{2})-([0-9]{2}:[0-9]{2})\|?([0-9!\$ #my $timestamp = FmtDateTime($timecond1); my $timestamp =substr( FmtDateTime($timecond1), 11, 5 ) . $part6; - -#MSwitch_LOG($Name,0,"$Name timestamp: $timestamp "); - - + $timecond1 = $timecond1 + $sectoadd; push( @newarray, $timestamp ); } @@ -9402,14 +9284,26 @@ sub MSwitch_Check_Event($$) { } else { my @eventin = split( /:/, $eventin ); + + if ($eventin[0] ne "MSwitch_self") + { $dev_hash = $defs{ ReadingsVal( $Name, 'Trigger_device', '' ) }; $hash->{helper}{testevent_device} = ReadingsVal( $Name, 'Trigger_device', '' ); $hash->{helper}{testevent_event} = $eventin[0] . ":" . $eventin[1]; + } + else + { + $dev_hash = $hash; + $hash->{helper}{testevent_device} =$Name; + $hash->{helper}{testevent_event} = $eventin[1] . ":" . $eventin[2]; + + } } } + if ( $eventin eq $hash ) { my $logout = $hash->{helper}{writelog}; $logout =~ s/:/[#dp]/g; @@ -9448,6 +9342,7 @@ sub MSwitch_Check_Event($$) { delete( $hash->{helper}{testevent_event1} ); return; } + ######################################### sub MSwitch_makeAffected($) { my ($hash) = @_; @@ -9490,8 +9385,7 @@ sub MSwitch_checktrigger(@) { { MSwitch_LOG( "Debug", 0,"eveal line" . __LINE__ ); } - - + eval($exec); } @@ -9548,12 +9442,9 @@ sub MSwitch_checktrigger(@) { sub MSwitch_VUpdate($) { my ($hash) = @_; my $Name = $hash->{NAME}; - readingsSingleUpdate( $hash, ".V_Check", $vupdate, 0 ); - # my $devs = ReadingsVal( $Name, '.Device_Affected_Details', '' ); # encode from old format - # $devs =~ s/,/#[NF]/g; # $devs =~ s/\|/#[ND]/g; # $devs =~ s/~/ /g; @@ -9561,9 +9452,7 @@ sub MSwitch_VUpdate($) { # $devs =~ s/\[se\]/;/g; # $devs =~ s/#\[ko\]/,/g; # $devs =~ s/#\[sp\]/ /g; - # # decode to new format - # $devs =~ s/#\[wa\]/|/g; # $devs =~ s/\n/#[nl]/g; # $devs =~ s/;/#[se]/g; @@ -9575,9 +9464,7 @@ sub MSwitch_VUpdate($) { # $devs =~ s/^#\[/#[eo]/g; # $devs =~ s/^#\]/#[ec]/g; # $devs =~ s/\|/#[wa]/g; - # # change timerkey to new format - # my $x = 0; # while ( $devs =~ m/(.*#\[NF\])([0-9]{2})([0-9]{2})([0-9]{2})(#\[NF\].*)/ ) { # $x++; # exit @@ -9585,8 +9472,7 @@ sub MSwitch_VUpdate($) { # $devs = $1 . $2 . "#[dp]" . $3 . "#[dp]" . $4 . $5; # } # readingsSingleUpdate( $hash, ".Device_Affected_Details", $devs, 0 ); - - #fhem("deletereading $Name Exec_cmd"); +#fhem("deletereading $Name Exec_cmd"); return; } @@ -9868,7 +9754,7 @@ sub MSwitch_Getconfig($) { my $client_hash = $hash->{CL}; my $ret = asyncOutput( $hash->{CL}, -"Änderungen sollten hier nur von erfahrenen Usern durchgeführt werden.