From 9ef271cec6ffc7ac39656856f4859706776b9dbe Mon Sep 17 00:00:00 2001 From: Byte09 <> Date: Mon, 22 Oct 2018 16:50:03 +0000 Subject: [PATCH] 98_MSwitch.pm:update V2.02 git-svn-id: https://svn.fhem.de/fhem/trunk@17596 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/98_MSwitch.pm | 8355 ++++++++++++++++++++------------------- 1 file changed, 4307 insertions(+), 4048 deletions(-) diff --git a/fhem/FHEM/98_MSwitch.pm b/fhem/FHEM/98_MSwitch.pm index a894a9a24..b4b0fa53f 100644 --- a/fhem/FHEM/98_MSwitch.pm +++ b/fhem/FHEM/98_MSwitch.pm @@ -26,7 +26,17 @@ ################################################################# # Todo's: # -# +# info conf +# reading '.lock' wenn definiert -> device locked +# reading '.info' wenn definiert -> infotext für device +# reading '.change' wenn definiert -> angeforderte deviceänderung +# reading '.change_inf' wenn definiert -> info für angeforderte deviceänderung +# +# info conffile - austausch eines/mehrerer devices +# I testinfo +# Q dummy1#zu schaltendes geraet#device +# Q dummy2#zu schaltendes geraet2#device +# ################################################################# package main; @@ -36,13 +46,19 @@ use warnings; use POSIX; # Version ####################################################### -my $autoupdate = 'on'; #off/on -my $version = 'V2.01a'; -my $vupdate = 'V2.00'; -my $savecount = 30; -my $standartstartdelay =60; -# standartlist ignorierter Devices -my @doignore =qw(notify allowed at watchdog doif fhem2fhem telnet FileLog readingsGroup FHEMWEB autocreate eventtypes readingsproxy svg cul); +my $autoupdate = 'on'; #off/on +my $version = '2.02'; +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'; + +# 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); ##################### ############################################ @@ -80,8 +96,9 @@ sub MSwitch_Createnumber($); sub MSwitch_Createnumber1($); sub MSwitch_Savemode($); sub MSwitch_set_dev($); -sub MSwitch_EventBulk($$$); -sub MSwitch_priority ; +sub MSwitch_EventBulk($$$$); +sub MSwitch_priority; +sub MSwitch_sort; sub MSwitch_dec($$); sub MSwitch_makefreecmd($$); sub MSwitch_clearlog($); @@ -89,11 +106,10 @@ sub MSwitch_LOG($$$); sub MSwitch_Getsupport($); sub MSwitch_confchange($$); - my %sets = ( "on" => "noArg", "off" => "noArg", - "reload_timer" => "noArg", + "reload_timer" => "noArg", "active" => "noArg", "inactive" => "noArg", "devices" => "noArg", @@ -108,16 +124,18 @@ my %sets = ( "backup_MSwitch" => "noArg", "import_config" => "noArg", "saveconfig" => "noArg", - "savesys" => "noArg", - "fakeevent" => "noArg", - "exec_cmd1" => "noArg", - "exec_cmd2" => "noArg", - "exec_cmd1+2" => "noArg", - "wait" => "noArg", - "VUpdate" => "noArg", - "confchange" => "noArg", - "clearlog" => "noArg", - "set_trigger" => "noArg" + "savesys" => "noArg", + "sort_device" => "noArg", + "fakeevent" => "noArg", + "exec_cmd1" => "noArg", + "exec_cmd2" => "noArg", + "exec_cmd1+2" => "noArg", + "wait" => "noArg", + "VUpdate" => "noArg", + "confchange" => "noArg", + "clearlog" => "noArg", + "set_trigger" => "noArg", + "change_renamed" => "" ); my %gets = ( "active_timer" => "noArg", @@ -125,15 +143,13 @@ my %gets = ( "get_config" => "noArg" ); - - #################### sub MSwitch_Initialize($) { my ($hash) = @_; $hash->{SetFn} = "MSwitch_Set"; $hash->{AsyncOutput} = "MSwitch_AsyncOutput"; - $hash->{RenameFn} = "MSwitch_Rename"; - $hash->{CopyFn} = "MSwitch_Copy"; + $hash->{RenameFn} = "MSwitch_Rename"; + $hash->{CopyFn} = "MSwitch_Copy"; $hash->{GetFn} = "MSwitch_Get"; $hash->{DefFn} = "MSwitch_Define"; $hash->{UndefFn} = "MSwitch_Undef"; @@ -147,7 +163,9 @@ sub MSwitch_Initialize($) { $hash->{NotifyOrderPrefix} = "45-"; $hash->{AttrList} = " disable:0,1" - . " disabledForIntervals" + . " disabledForIntervals" + . " stateFormat" + . " MSwitch_Comments:0,1" . " MSwitch_Help:0,1" . " MSwitch_Debug:0,1,2,3,4" . " MSwitch_Expert:0,1" @@ -165,53 +183,40 @@ sub MSwitch_Initialize($) { . " MSwitch_Condition_Time:0,1" . " MSwitch_RandomTime" . " MSwitch_RandomNumber" - . " MSwitch_Safemode:0,1" - . " MSwitch_Startdelay:0,10,20,30,60,90,120" + . " MSwitch_Safemode:0,1" + . " MSwitch_Startdelay:0,10,20,30,60,90,120" . " MSwitch_Wait"; $hash->{FW_addDetailToSummary} = 0; } #################### -sub MSwitch_Rename ($) -{ - my ( $new_name, $old_name ) = @_; - my $hash_new = $defs{$new_name}; - -#Log3( $new_name, 0,"new_name " .$new_name ); -#Log3( $new_name, 0,"old_name " .$old_name ); - -$modules{MSwitch}{defptr}{$new_name} = $hash_new; - -#foreach my $testdevice ( keys %{ $modules{MSwitch}{defptr} } ) # - # { - # Log3( $new_name, 0,"dev " .$testdevice ); - # Log3( $new_name, 0,"devnhash " .$defs{$testdevice} ); - #} - +sub MSwitch_Rename($) { + # routine nicht in funktion + my ( $new_name, $old_name ) = @_; + my $hash_new = $defs{$new_name}; + $modules{MSwitch}{defptr}{$new_name} = $hash_new; } #################### -sub MSwitch_Copy ($) -{ - my ( $old_name, $new_name ) = @_; - my $hash = $defs{$new_name}; - my @areadings = - qw(.Device_Affected .Device_Affected_Details .Device_Events .First_init .Trigger_Whitelist .Trigger_cmd_off .Trigger_cmd_on .Trigger_condition .Trigger_off .Trigger_on .Trigger_time .V_Check Exec_cmd Trigger_device Trigger_log last_event state .sysconf Sys_Extension) ; #alle readings - - my $cs = "attr $new_name disable 1"; +sub MSwitch_Copy ($) { + my ( $old_name, $new_name ) = @_; + my $hash = $defs{$new_name}; + my @areadings = + qw(.Device_Affected .Device_Affected_Details .Device_Events .First_init .Trigger_Whitelist .Trigger_cmd_off .Trigger_cmd_on .Trigger_condition .Trigger_off .Trigger_on .Trigger_time .V_Check Exec_cmd Trigger_device Trigger_log last_event state .sysconf Sys_Extension) + ; #alle readings + + my $cs = "attr $new_name disable 1"; my $errors = AnalyzeCommandChain( undef, $cs ); - if ( defined($errors) ) - { - Log3( $new_name, 1, "ERROR $cs" ); - } - - foreach my $key (@areadings) - { + if ( defined($errors) ) { + Log3( $new_name, 1, "ERROR $cs" ); + } + + foreach my $key (@areadings) { my $tmp = ReadingsVal( $old_name, $key, 'undef' ); - fhem("setreading ".$new_name." ".$key." ".$tmp); - } - MSwitch_LoadHelper($hash); + fhem( "setreading " . $new_name . " " . $key . " " . $tmp ); + } + MSwitch_LoadHelper($hash); } #################### @@ -229,171 +234,170 @@ sub MSwitch_summary($) { my $html = ''; my $triggerc = 1; my $timer = 1; - my $trigger = ReadingsVal( $name, 'Trigger_device', 'undef' ); - my @devaff = split( / /, MSwitch_makeAffected($hash) ); + my $trigger = ReadingsVal( $name, 'Trigger_device', 'undef' ); + my @devaff = split( / /, MSwitch_makeAffected($hash) ); $option .= ""; - foreach (@devaff) - { + foreach (@devaff) { $devtitle .= $_ . ", "; $option .= ""; } - + chop($devtitle); chop($devtitle); - my $affected = ""; - ### time + my $affected = + ""; + ### time my $optiontime; my $devtitletime = ''; - my $triggertime = ReadingsVal( $name, 'Trigger_device', 'not defined' ); - - my $devtime = ReadingsVal( $name, '.Trigger_time', '' ); - $devtime =~ s/\[//g; - $devtime =~ s/\]/ /g; - - my @devtime = split( /~/, $devtime ); + my $triggertime = ReadingsVal( $name, 'Trigger_device', 'not defined' ); + + my $devtime = ReadingsVal( $name, '.Trigger_time', '' ); + $devtime =~ s/\[//g; + $devtime =~ s/\]/ /g; + + my @devtime = split( /~/, $devtime ); $optiontime .= ""; my $count = @devtime; - $devtime[0] =~ s/on/on+cmd1: /g if defined $devtime[0]; - $devtime[1] =~ s/off/off+cmd2: /g if defined $devtime[1]; - $devtime[2] =~ s/ononly/only cmd1: /g if defined $devtime[2]; - $devtime[3] =~ s/offonly/only cmd2: /g if defined $devtime[3]; - - if ( AttrVal( $name, 'MSwitch_Mode', 'Full' ) ne "Notify" ) - { - $optiontime .= "" if defined $devtime[0]; - $optiontime .= "" if defined $devtime[1]; - } - - $optiontime .= "" if defined $devtime[2]; - $optiontime .= "" if defined $devtime[3]; + $devtime[0] =~ s/on/on+cmd1: /g if defined $devtime[0]; + $devtime[1] =~ s/off/off+cmd2: /g if defined $devtime[1]; + $devtime[2] =~ s/ononly/only cmd1: /g if defined $devtime[2]; + $devtime[3] =~ s/offonly/only cmd2: /g if defined $devtime[3]; + + if ( AttrVal( $name, 'MSwitch_Mode', 'Full' ) ne "Notify" ) { + $optiontime .= + "" + if defined $devtime[0]; + $optiontime .= + "" + if defined $devtime[1]; + } + + $optiontime .= "" + if defined $devtime[2]; + $optiontime .= "" + if defined $devtime[3]; my $affectedtime = ''; - if ( $count == 0 ) - { - $timer = 0; - $affectedtime = - ""; - } - else - { - chop($devtitletime); - chop($devtitletime); - $affectedtime = - ""; - } - if ( $info eq 'No Info saved at ATTR omment' ) - { - $ret .= - ""; - } - else - { - $ret .= - ""; - } + if ( $count == 0 ) { + $timer = 0; + $affectedtime = + ""; + } + else { + chop($devtitletime); + chop($devtitletime); + $affectedtime = + ""; + } + if ( $info eq 'No Info saved at ATTR omment' ) { + $ret .= + ""; + } + else { + $ret .= + ""; + } + + if ( $trigger eq 'no_trigger' || $trigger eq 'undef' ) { + $triggerc = 0; + if ( $triggerc != 0 || $timer != 0 ) { + $ret .= +""; + } + else { + $affectedtime = ""; + $ret .= "  Multiswitchmode (no trigger / no timer) "; + } + } + else { + $ret .= ""; + } - if ( $trigger eq 'no_trigger' || $trigger eq 'undef' ) - { - $triggerc = 0; - if ( $triggerc != 0 || $timer != 0 ) - { - $ret .=""; - } - else - { - $affectedtime = ""; - $ret .= "  Multiswitchmode (no trigger / no timer) "; - } - } - else - { - $ret .= ""; - } - $ret .= $affectedtime; $ret .= $affected; - - if (ReadingsVal( $name, '.V_Check', 'not defined' ) ne $vupdate) - { - $ret .= " + + if ( ReadingsVal( $name, '.V_Check', 'not defined' ) ne $vupdate ) { + $ret .= " Versionskonflikt !
(please help)
"; - - } - else{ - if ( AttrVal( $name, 'disable', "0" ) eq '1' ) - { - $ret .= " + + } + else { + if ( AttrVal( $name, 'disable', "0" ) eq '1' ) { + $ret .= " State:
disabled
"; - } - else - { - $ret .= " + } + else { + $ret .= " State: -
" . ReadingsVal( $name, 'state', '' ) . "
+
" + . ReadingsVal( $name, 'state', '' ) . "
"; - if ( AttrVal( $name, 'MSwitch_Mode', 'Full' ) ne "Notify" ) - { - $ret .= - "
" - . ReadingsTimestamp( $name, 'state', '' ) - . "
"; - } - else - { - $ret .= - "
" - . ReadingsTimestamp( $name, 'state', '' ) - . "
"; - } - } - } + if ( AttrVal( $name, 'MSwitch_Mode', 'Full' ) ne "Notify" ) { + $ret .= + "
" + . ReadingsTimestamp( $name, 'state', '' ) + . "
"; + } + else { + $ret .= + "
" + . ReadingsTimestamp( $name, 'state', '' ) + . "
"; + } + } + } $ret .= ""; - return "$ret"."$j1"; - } + }"; + $j1 .= "}"; + return "$ret" . "$j1"; + } - - #readingsSingleUpdate( $hash, ".wrong_version", $1, 0 ); - if ( ReadingsVal( $Name, '.wrong_version', 'undef') ne "undef") - { - $ret .=" + #readingsSingleUpdate( $hash, ".wrong_version", $1, 0 ); + if ( ReadingsVal( $Name, '.wrong_version', 'undef' ) ne "undef" ) { + $ret .= "
-
 
Einspielen des Configfiles nicht möglich !
falsche Versionsnummer: ".ReadingsVal( $Name, '.wrong_version', '')."
geforderte Versionsnummer $vupdate
  +
 
Einspielen des Configfiles nicht möglich !
falsche Versionsnummer: " + . ReadingsVal( $Name, '.wrong_version', '' ) + . "
geforderte Versionsnummer $vupdate
 


"; - fhem("deletereading $Name .wrong_version"); + fhem("deletereading $Name .wrong_version"); - } + } - if ( ReadingsVal( $Name, '.V_Check', $vupdate ) ne $vupdate ) - { - - my $ver = ReadingsVal( $Name, '.V_Check', '' ); - $ret .=" + if ( ReadingsVal( $Name, '.V_Check', $vupdate ) ne $vupdate ) { + + my $ver = ReadingsVal( $Name, '.V_Check', '' ); + $ret .= "
 
Versionskonflikt erkannt!
Das Device führt derzeit keine Aktionen aus. Bitte ein Update des Devices vornehmen.
Erwartete Strukturversionsnummer: $vupdate
Vorhandene Strukturversionsnummer: $ver
 
{"; - $j1 .= - "var t=\$(\"#MSwitchWebTR\"), ip=\$(t).attr(\"ip\"), ts=\$(t).attr(\"ts\"); + $j1 = ""; - return "$ret"."$j1"; - } - - - - $ret .=" + }"; + $j1 .= "}"; + return "$ret" . "$j1"; + } + + $ret .= "
 
Device is disabled, configuration avaible
 
-

" if ( IsDisabled($Name)); - +

" if ( IsDisabled($Name) ); + #################### - $ret .=""; - $ret .=" "; - $ret .="
trigger device/time:   "; - + $ret .= +""; + $ret .= " "; + $ret .= +" @@ -3757,65 +4117,63 @@ if ( ReadingsVal( $Name, '.change', 'undef') ne "undef") + + $ret .= "Trigger device: "; my $visible = 'visible'; - if ( $globalon ne 'on' ) - { + if ( $globalon ne 'on' ) { $visible = 'collapse'; } - $ret = $ret . " + $ret = + $ret + . ""; - my $inhalt = "execute 'cmd1' only at :"; - my $inhalt1 = "execute '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 $inhalt = "execute 'cmd1' only at :"; + my $inhalt1 = "execute '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 = " "; - } + my $help = ""; + if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) { + $help = +" "; + } - - if ( AttrVal( $Name, 'MSwitch_Mode', 'Full' ) eq "Notify" ) - { + if ( AttrVal( $Name, 'MSwitch_Mode', 'Full' ) eq "Notify" ) { $displaynot = "style='display:none;'"; $inhalt = "execute 'cmd1' at :"; $inhalt1 = "execute 'cmd2' at :"; - $inhalt2 = $help."execute 'cmd1'"; - $inhalt3 = $help."execute 'cmd2'"; + $inhalt2 = $help . "execute 'cmd1'"; + $inhalt3 = $help . "execute 'cmd2'"; } - if ( AttrVal( $Name, 'MSwitch_Mode', 'Full' ) eq "Toggle" ) - { + if ( AttrVal( $Name, 'MSwitch_Mode', 'Full' ) eq "Toggle" ) { $displayntog = "style='display:none;'"; $inhalt4 = "toggle $Name + execute 'cmd1/cmd2' at :"; $inhalt5 = "toggle $Name + execute 'cmd1/cmd2'"; @@ -3824,13 +4182,13 @@ if ( ReadingsVal( $Name, '.change', 'undef') ne "undef") $ret = $ret . " + + $ret = $ret . "Trigger time: @@ -3839,19 +4197,19 @@ if ( ReadingsVal( $Name, '.change', 'undef') ne "undef") + . $timeon . "'> + . $timeoff . "'> + . $timeononly . "'> @@ -3860,28 +4218,25 @@ if ( ReadingsVal( $Name, '.change', 'undef') ne "undef") . $timeoffonly . "'>"; my $triggerinhalt = "Trigger condition (events only): "; - if ( AttrVal( $Name, 'MSwitch_Condition_Time', "0" ) eq '1' ) - { - $triggerinhalt ="Trigger condition (time&events): "; + + if ( AttrVal( $Name, 'MSwitch_Condition_Time', "0" ) eq '1' ) { + $triggerinhalt = "Trigger condition (time&events): "; } $ret = $ret . " + + $ret = $ret . $triggerinhalt . ""; @@ -3892,16 +4247,16 @@ if ( ReadingsVal( $Name, '.change', 'undef') ne "undef")
trigger device/time:   "; + $ret = $ret . "
"; - if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) - { - $ret = $ret. " "; + if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) { + $ret = $ret + . " "; } - - - $ret .="Trigger device: - +
"; - - if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) - { - $ret = $ret. " "; + + if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) { + $ret = $ret + . " "; } - $ret = $ret. "Trigger Device Global Whitelist: + $ret = $ret . "Trigger Device Global Whitelist: "; - + . ReadingsVal( $Name, '.Trigger_Whitelist', '' ) + . "' onClick=\"javascript:bigwindow(this.id);\" >"; + $ret = $ret . "
"; - - if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) - { - $ret = $ret. " "; + + if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) { + $ret = $ret + . " "; } - - $ret = $ret. "Trigger time: " . $inhalt4 . "
switch MSwitch off + execute 'cmd2' at :
" . $inhalt . "
"; - if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) - { - $ret = $ret .= " "; + if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) { + $ret = $ret .= +" "; } - - $ret = $ret . $triggerinhalt." "; - - if ( AttrVal( $Name, 'MSwitch_Debug', "0" ) eq '1' ) - { - # $ret = $ret. " "; - - $ret = $ret. " "; + . $triggercondition . "' onClick=\"javascript:bigwindow(this.id);\" >"; + if ( AttrVal( $Name, 'MSwitch_Debug', "0" ) eq '1' ) { + $ret = $ret + . " "; } $ret = $ret . "

"; #################### -# triggerdetails + # triggerdetails my $selectedcheck3 = ""; my $testlog = ReadingsVal( $Name, 'Trigger_log', 'on' ); - if ( $testlog eq 'on' ) - { + if ( $testlog eq 'on' ) { $selectedcheck3 = "checked=\"checked\""; } if ( ReadingsVal( $Name, 'Trigger_device', 'no_trigger' ) ne 'no_trigger' ) { - $ret .=" + $ret .= +"
@@ -3914,7 +4269,7 @@ if ( ReadingsVal( $Name, '.change', 'undef') ne "undef") "; $ret .= " @@ -3971,12 +4327,12 @@ if ( ReadingsVal( $Name, '.change', 'undef') ne "undef")
trigger details :
"; - $ret .= $inhalt5. " + $ret .= $inhalt5 . " Trigger " . $Triggerdevice . " : @@ -3951,18 +4306,19 @@ if ( ReadingsVal( $Name, '.change', 'undef') ne "undef") + . $optioncmdoff . "
"; - if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) - { - $ret = $ret . " "; + + if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) { + $ret = $ret + . " "; } - - $ret = $ret . "Save incomming events : + + $ret = $ret . "Save incomming events :
"; - if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) - { - $ret = $ret . " "; + if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) { + $ret = $ret + . " "; } - - $ret .= "Add event manually : + + $ret .= "Add event manually : @@ -3995,22 +4351,24 @@ if ( ReadingsVal( $Name, '.change', 'undef') ne "undef") "; - if ( AttrVal( $Name, 'MSwitch_Debug', "0" ) eq '1' && $optiongeneral ne '' ) + if ( AttrVal( $Name, 'MSwitch_Debug', "0" ) eq '1' + && $optiongeneral ne '' ) { - $ret .=""; + $ret .= + ""; } - + $ret .= "

"; } - else - { + else { $ret .= "

"; } # affected devices - $ret .= " + $ret .= +"
@@ -4025,13 +4383,13 @@ if ( ReadingsVal( $Name, '.change', 'undef') ne "undef") + if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) { + $ret .= +" "; + } + + $ret .= "multiple selection with ctrl + mousebutton
affected devices :
"; - - if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) - { - $ret .= " "; - } - $ret .="multiple selection with ctrl + mousebutton


" - ); - + . "
" ); + return; } ################## sub MSwitch_Getconfig($) { my ($hash) = @_; - my $Name = $hash->{NAME}; - my @areadings = qw(.Device_Affected .Device_Affected_Details .Device_Events .First_init .Trigger_Whitelist .Trigger_cmd_off .Trigger_cmd_on .Trigger_condition .Trigger_off .Trigger_on .Trigger_time .V_Check Trigger_device Trigger_log last_event .sysconf state Sys_Extension); + my $Name = $hash->{NAME}; + my @areadings = + qw(.Device_Affected .Device_Affected_Details .Device_Events .First_init .Trigger_Whitelist .Trigger_cmd_off .Trigger_cmd_on .Trigger_condition .Trigger_off .Trigger_on .Trigger_time .V_Check Trigger_device Trigger_log last_event .sysconf state Sys_Extension .sortby); - #.sysconf - - - #alle readings - # my %keys; $vupdate - my $count = 0; - my $out = "#V $version\\n"; - $out .= "#VS $vupdate\\n"; + my $count = 0; + my $out = "#V $version\\n"; + $out .= "#VS $vupdate\\n"; my $testdevice = $Name; - foreach my $key (@areadings) - { - my $tmp = ReadingsVal( $testdevice, $key, 'undef' ); - if ($key eq ".Device_Affected_Details") - { - $tmp =~ s/#\[nl\]/;;/g; - - $tmp =~ s/#\[sp\]/ /g; - $tmp =~ s/#\[nl\]/\\n/g; - $tmp =~ s/#\[se\]/;/g; - $tmp =~ s/#\[dp\]/:/g; - $tmp =~ s/\(DAYS\)/|/g; - $tmp =~ s/#\[ko\]/,/g; #neu - $tmp =~ s/#\[wa\]/|/g; - $tmp =~ s/#\[st\]/\\'/g; - $tmp =~ s/'/\\'/g; - $tmp =~ s/#\[bs\]/\\\\/g; - #Log3( $Name, 0, $tmp ); - } - - if ($key eq ".sysconf") - { + foreach my $key (@areadings) { + my $tmp = ReadingsVal( $testdevice, $key, 'undef' ); + if ( $key eq ".Device_Affected_Details" ) { + $tmp =~ s/#\[nl\]/;;/g; + $tmp =~ s/#\[sp\]/ /g; + $tmp =~ s/#\[nl\]/\\n/g; + $tmp =~ s/#\[se\]/;/g; + $tmp =~ s/#\[dp\]/:/g; + $tmp =~ s/\(DAYS\)/|/g; + $tmp =~ s/#\[ko\]/,/g; #neu + $tmp =~ s/#\[wa\]/|/g; + $tmp =~ s/#\[st\]/\\'/g; + $tmp =~ s/'/\\'/g; + $tmp =~ s/#\[bs\]/\\\\/g; + } - } - - if ($key eq ".Device_Events") - { - $tmp =~ s/#\[tr\]/ /g; - - } - + if ( $key eq ".sysconf" ) { + } + if ( $key eq ".Device_Events" ) { + $tmp =~ s/#\[tr\]/ /g; + } $out .= "#S $key -> $tmp\\n"; $count++; } @@ -6922,76 +7255,78 @@ sub MSwitch_Getconfig($) { # my %keys; foreach my $attrdevice ( keys %{ $attr{$testdevice} } ) #geht { - $out .= "#A $attrdevice -> ". AttrVal( $testdevice, $attrdevice, '' ) . "\\n"; + + my $tmp = AttrVal( $testdevice, $attrdevice, '' ); + $tmp =~ s//\\>/g; + $tmp =~ s/'/\\'/g; + +# $out .= "#A $attrdevice -> ". AttrVal( $testdevice, $attrdevice, '' ) . "\\n"; + + $out .= "#A $attrdevice -> " . $tmp . "\\n"; $count++; } $count++; $count++; - my $client_hash = $hash->{CL}; - + Log3( $Name, 0, "MSWITCH-CONFIG: " . $out ); asyncOutput( $hash->{CL}, - "Änderungen sollten hier nur von erfahrenen Usern durchgeführt werden.
" ); - - return; } ####################################################### sub MSwitch_Sysextension($) { my ($hash) = @_; - my $Name = $hash->{NAME}; - my $count = 30; - my $out = ReadingsVal( $Name,'.sysconf', '' ); - + my $Name = $hash->{NAME}; + my $count = 30; + my $out = ReadingsVal( $Name, '.sysconf', '' ); - $out =~ s/#\[sp\]/ /g; - $out =~ s/#\[nl\]/\\n/g; - $out =~ s/#\[se\]/;/g; - $out =~ s/#\[dp\]/:/g; - $out =~ s/#\[st\]/\\'/g; - $out =~ s/#\[dst\]/\"/g; - $out =~ s/#\[tab\]/ /g; - $out =~ s/#\[ko\]/,/g; - $out =~ s/#\[wa\]/|/g; - - - $out =~ s/#\[bs\]/\\\\/g; - - my $client_hash = $hash->{CL}; + $out =~ s/#\[sp\]/ /g; + $out =~ s/#\[nl\]/\\n/g; + $out =~ s/#\[se\]/;/g; + $out =~ s/#\[dp\]/:/g; + $out =~ s/#\[st\]/\\'/g; + $out =~ s/#\[dst\]/\"/g; + $out =~ s/#\[tab\]/ /g; + $out =~ s/#\[ko\]/,/g; + $out =~ s/#\[wa\]/|/g; + $out =~ s/#\[bs\]/\\\\/g; + + my $client_hash = $hash->{CL}; asyncOutput( $hash->{CL}, - "

Achtung! Hier angegebener Code greift direkt in das Programm 98_MSwitch ein und wird unmittelbar zu beginn der Routine X_Set ausgeführt

" ); return; - - } + +} ################################ sub MSwitch_backup_all($) { my ($hash) = @_; my $Name = $hash->{NAME}; my $answer = ''; my $Zeilen = (""); - open( BACKUPDATEI, ") - { + open( BACKUPDATEI, ") { $Zeilen = $Zeilen . $_; } close(BACKUPDATEI); foreach my $testdevice ( keys %{ $modules{MSwitch}{defptr} } ) # { - - Log3( $testdevice, 0, "MSWITCH-RESTORE: ".$testdevice ); + + Log3( $testdevice, 0, "MSWITCH-RESTORE: " . $testdevice ); my $devhash = $defs{$testdevice}; $Zeilen =~ s/\n/[NL]/g; @@ -7003,11 +7338,9 @@ sub MSwitch_backup_all($) { foreach (@found) { if ( $_ =~ m/#S (.*) -> (.*)/ ) # setreading { - if ( $2 eq 'undef' || $2 eq '' || $2 eq ' ' ) - { + if ( $2 eq 'undef' || $2 eq '' || $2 eq ' ' ) { } - else - { + else { readingsSingleUpdate( $devhash, "$1", $2, 0 ); } } @@ -7015,23 +7348,20 @@ sub MSwitch_backup_all($) { { my $cs = "attr $testdevice $1 $2"; my $errors = AnalyzeCommandChain( undef, $cs ); - if ( defined($errors) ) - { + if ( defined($errors) ) { Log3( $testdevice, 1, "ERROR $cs" ); } } } - - my $cs = "attr $testdevice verbose 0"; - my $errors = AnalyzeCommandChain( undef, $cs ); - if ( defined($errors) ) - { - Log3( $testdevice, 1, "ERROR $cs" ); - } + my $cs = "attr $testdevice verbose 0"; + my $errors = AnalyzeCommandChain( undef, $cs ); + if ( defined($errors) ) { + Log3( $testdevice, 1, "ERROR $cs" ); + } - MSwitch_LoadHelper($devhash); - Log3( $testdevice, 0, "MSWITCH-RESTORE ready -> ".$testdevice ); + MSwitch_LoadHelper($devhash); + Log3( $testdevice, 0, "MSWITCH-RESTORE ready -> " . $testdevice ); $answer = $answer . "MSwitch $testdevice restored.\n"; } return $answer; @@ -7039,133 +7369,111 @@ sub MSwitch_backup_all($) { ################################################ sub MSwitch_savesys($$) { -my ( $hash, $cont ) = @_; + my ( $hash, $cont ) = @_; my $name = $hash->{NAME}; - - - $cont = urlDecode( $cont ); - $cont =~ s/\n/#[nl]/g; - $cont =~ s/\t/ /g; - $cont =~ s/ /#[sp]/g; - $cont =~ s/\\/#[bs]/g; - $cont =~ s/,/#[ko]/g; - $cont =~ s/^#\[/#[eo]/g; - $cont =~ s/^#\]/#[ec]/g; - $cont =~ s/\|/#[wa]/g; + $cont = urlDecode($cont); + $cont =~ s/\n/#[nl]/g; + $cont =~ s/\t/ /g; + $cont =~ s/ /#[sp]/g; + $cont =~ s/\\/#[bs]/g; + $cont =~ s/,/#[ko]/g; + $cont =~ s/^#\[/#[eo]/g; + $cont =~ s/^#\]/#[ec]/g; + $cont =~ s/\|/#[wa]/g; - if (!defined $cont){$cont ="";}; - - if ($cont ne '') - { - readingsSingleUpdate( $hash, ".sysconf", $cont, 0 ); - } - else - { - fhem("deletereading $name .sysconf"); - } - - + if ( !defined $cont ) { $cont = ""; } - -return; + if ( $cont ne '' ) { + readingsSingleUpdate( $hash, ".sysconf", $cont, 0 ); + } + else { + fhem("deletereading $name .sysconf"); + } + + return; } ################################################ sub MSwitch_saveconf($$) { my ( $hash, $cont ) = @_; - my $name = $hash->{NAME}; - my $contcopy = $cont; - $cont =~ s/#c\[sp\]/ /g; - $cont =~ s/#c\[se\]/;/g; - $cont =~ s/#c\[dp\]/:/g; - - my @changes; - my $info =""; + my $name = $hash->{NAME}; + my $contcopy = $cont; + $cont =~ s/#c\[sp\]/ /g; + $cont =~ s/#c\[se\]/;/g; + $cont =~ s/#c\[dp\]/:/g; + + my @changes; + my $info = ""; my @found = split( /#\[EOL\]/, $cont ); - foreach (@found) - { + foreach (@found) { - - if ( $_ =~ m/#Q (.*)/ ) # setattr - { - push(@changes,$1); - } - - if ( $_ =~ m/#I (.*)/ ) # setattr - { - $info =$1; - } + if ( $_ =~ m/#Q (.*)/ ) # setattr + { + push( @changes, $1 ); + } + + if ( $_ =~ m/#I (.*)/ ) # setattr + { + $info = $1; + } + + if ( $_ =~ m/#VS (.*)/ ) # setattr + { + if ( $1 ne $vupdate ) { + readingsSingleUpdate( $hash, ".wrong_version", $1, 0 ); + return; + } + + } - - if ( $_ =~ m/#VS (.*)/ ) # setattr - { - if ( $1 ne $vupdate ) - { - readingsSingleUpdate( $hash, ".wrong_version", $1, 0 ); - return ; - } - - } - if ( $_ =~ m/#S (.*) -> (.*)/ ) # setreading - { - if ( $2 eq 'undef' || $2 eq '' || $2 eq ' ' ) - { - } - else - { - my $newstring =$2; - if ($1 eq ".Device_Affected_Details") - { - $newstring =~ s/;/#[se]/g; - $newstring =~ s/:/#[dp]/g; - $newstring =~ s/\t/ /g; - $newstring =~ s/ /#[sp]/g; - $newstring =~ s/\\/#[bs]/g; - $newstring =~ s/,/#[ko]/g; - $newstring =~ s/^#\[/#[eo]/g; - $newstring =~ s/^#\]/#[ec]/g; - $newstring =~ s/\|/#[wa]/g; - $newstring =~ s/#\[se\]#\[se\]#\[se\]/#[se]#[nl]/g; - $newstring =~ s/#\[se\]#\[se\]/#[nl]/g; - } - - if ($1 eq ".sysconf") - { - } - - - - if ($1 eq ".Device_Events") - { - $newstring =~ s/ /#[tr]/g; - } + { + if ( $2 eq 'undef' || $2 eq '' || $2 eq ' ' ) { + } + else { + my $newstring = $2; + if ( $1 eq ".Device_Affected_Details" ) { + $newstring =~ s/;/#[se]/g; + $newstring =~ s/:/#[dp]/g; + $newstring =~ s/\t/ /g; + $newstring =~ s/ /#[sp]/g; + $newstring =~ s/\\/#[bs]/g; + $newstring =~ s/,/#[ko]/g; + $newstring =~ s/^#\[/#[eo]/g; + $newstring =~ s/^#\]/#[ec]/g; + $newstring =~ s/\|/#[wa]/g; + $newstring =~ s/#\[se\]#\[se\]#\[se\]/#[se]#[nl]/g; + $newstring =~ s/#\[se\]#\[se\]/#[nl]/g; + } + + if ( $1 eq ".sysconf" ) { + } + + if ( $1 eq ".Device_Events" ) { + $newstring =~ s/ /#[tr]/g; + } + + readingsSingleUpdate( $hash, "$1", $newstring, 0 ); + } + } - readingsSingleUpdate( $hash, "$1", $newstring, 0 ); - } - } - if ( $_ =~ m/#A (.*) -> (.*)/ ) # setattr - { - $attr{$name}{$1} = $2; - } + { + $attr{$name}{$1} = $2; + } } - MSwitch_set_dev($hash); - - if (@changes > 0) - { - my $save = join( '|', @changes ); - readingsSingleUpdate( $hash, ".change", $save, 0 ); - } - - if ($info ne "") - { - - - readingsSingleUpdate( $hash, ".change_info", $info, 0 ); - } - - + MSwitch_set_dev($hash); + + if ( @changes > 0 ) { + my $save = join( '|', @changes ); + readingsSingleUpdate( $hash, ".change", $save, 0 ); + } + + if ( $info ne "" ) { + + readingsSingleUpdate( $hash, ".change_info", $info, 0 ); + } + return; } @@ -7180,6 +7488,7 @@ sub MSwitch_backup_done($) { delete( $hash->{helper}{RUNNING_PID} ); my $client_hash = $hash->{helper}{RESTORE_ANSWER}; $answer =~ s/\[nl\]/\n/g; + foreach my $testdevice ( keys %{ $modules{MSwitch}{defptr} } ) # { my $devhash = $defs{$testdevice}; @@ -7208,26 +7517,23 @@ sub MSwitch_Execute_randomtimer($) { ############################################ sub MSwitch_replace_delay($$) { my ( $hash, $timerkey ) = @_; - my $name = $hash->{NAME}; + my $name = $hash->{NAME}; my $time = time; my $ltime = TimeNow(); - - MSwitch_LOG( $name, 5, "----------------------------------------" ); - MSwitch_LOG( $name, 5, "$name: MSwitch_replace_delay-> $timerkey" ); - MSwitch_LOG( $name, 5, "----------------------------------------" ); - - + + MSwitch_LOG( $name, 5, "----------------------------------------" ); + MSwitch_LOG( $name, 5, "$name: MSwitch_replace_delay-> $timerkey" ); + MSwitch_LOG( $name, 5, "----------------------------------------" ); + my ( $aktdate, $akttime ) = split / /, $ltime; my $hh = ( substr( $timerkey, 0, 2 ) ); my $mm = ( substr( $timerkey, 2, 2 ) ); my $ss = ( substr( $timerkey, 4, 2 ) ); my $referenz = time_str2num("$aktdate $hh:$mm:$ss"); - if ( $referenz < $time ) - { + if ( $referenz < $time ) { $referenz = $referenz + 86400; } - if ( $referenz >= $time ) - { + if ( $referenz >= $time ) { } $referenz = $referenz - $time; my $timestampGMT = FmtDateTimeRFC1123($referenz); @@ -7238,504 +7544,458 @@ sub MSwitch_replace_delay($$) { sub MSwitch_repeat($) { my ( $msg, $name ) = @_; my $incomming = $_[0]; - my @msgarray = split( /\|/, $incomming ); - $name = $msgarray[1]; - - my $time = $msgarray[2]; - my $cs = $msgarray[0]; - my $hash = $defs{$name}; - $cs =~ s/\n//g; - - - MSwitch_LOG( $name, 5, "----------------------------------------" ); - MSwitch_LOG( $name, 5, "$name: Repeat -> ".$cs ); - MSwitch_LOG( $name, 5, "----------------------------------------" ); - - - if ( $cs =~ m/set (.*)(MSwitchtoggle)(.*)/ ) - { - $cs = MSwitch_toggle( $hash, $cs ); - MSwitch_LOG( $name, 5, "$name: fround toggle -> ".$cs ); - + my @msgarray = split( /\|/, $incomming ); + $name = $msgarray[1]; + + my $time = $msgarray[2]; + my $cs = $msgarray[0]; + my $hash = $defs{$name}; + $cs =~ s/\n//g; + + MSwitch_LOG( $name, 5, "----------------------------------------" ); + MSwitch_LOG( $name, 5, "$name: Repeat -> " . $cs ); + MSwitch_LOG( $name, 5, "----------------------------------------" ); + + if ( $cs =~ m/set (.*)(MSwitchtoggle)(.*)/ ) { + $cs = MSwitch_toggle( $hash, $cs ); + MSwitch_LOG( $name, 5, "$name: fround toggle -> " . $cs ); + } - - - - MSwitch_LOG( $name, 5, "$name: execute repeat $time -> ".$cs ); - if ( AttrVal( $name, 'MSwitch_Debug', "0" ) ne '2' ) - { - - - if ( $cs =~ m/{.*}/ ) - { + + MSwitch_LOG( $name, 5, "$name: execute repeat $time -> " . $cs ); + if ( AttrVal( $name, 'MSwitch_Debug', "0" ) ne '2' ) { + + if ( $cs =~ m/{.*}/ ) { eval($cs); - if ($@) - { - MSwitch_LOG( $name, 1,"$name MSwitch_repeat: ERROR $cs: $@ " . __LINE__ ); + if ($@) { + MSwitch_LOG( $name, 1, + "$name MSwitch_repeat: ERROR $cs: $@ " . __LINE__ ); } } - else - { - my $errors = AnalyzeCommandChain( undef, $cs ); - if ( defined($errors) ) - { - MSwitch_LOG( $name, 1, "$name Absent_repeat $cs: ERROR : $errors -> Comand: $cs" ); - } - } - - - } - - delete( $hash->{helper}{repeats}{$time} ); - + else { + my $errors = AnalyzeCommandChain( undef, $cs ); + if ( defined($errors) ) { + MSwitch_LOG( $name, 1, + "$name Absent_repeat $cs: ERROR : $errors -> Comand: $cs" ); + } + } + } + + delete( $hash->{helper}{repeats}{$time} ); + } ######################### sub MSwitch_Createnumber($) { my ($hash) = @_; my $Name = $hash->{NAME}; - my $number = AttrVal( $Name, 'MSwitch_RandomNumber', '' )+1; - my $number1 = int (rand ($number)); - readingsSingleUpdate( $hash, "RandomNr", $number1, 1 ); - return; - - } + my $number = AttrVal( $Name, 'MSwitch_RandomNumber', '' ) + 1; + my $number1 = int( rand($number) ); + readingsSingleUpdate( $hash, "RandomNr", $number1, 1 ); + return; + +} ################################ - sub MSwitch_Createnumber1($) { +sub MSwitch_Createnumber1($) { my ($hash) = @_; my $Name = $hash->{NAME}; - my $number = AttrVal( $Name, 'MSwitch_RandomNumber', '' )+1; - my $number1 = int (rand ($number)); - readingsSingleUpdate( $hash, "RandomNr1", $number1, 1 ); - return; - } -############################### - - sub MSwitch_Safemode($) { + my $number = AttrVal( $Name, 'MSwitch_RandomNumber', '' ) + 1; + my $number1 = int( rand($number) ); + readingsSingleUpdate( $hash, "RandomNr1", $number1, 1 ); + return; +} +############################### + +sub MSwitch_Safemode($) { my ($hash) = @_; my $Name = $hash->{NAME}; - if (AttrVal( $Name, 'MSwitch_Safemode', '0' ) == 0){ return;} - my $time = gettimeofday(); - $time =~ s/\.//g; - my $time1 =int ($time); - my $count =0; - my $timehash = $hash->{helper}{savemode}; - foreach my $a ( keys %{$timehash} ) - { - $count++; - if ($a < $time1-1000000) # für 10 sekunden - { - delete( $hash->{helper}{savemode}{$a} ); - $count = $count-1; - } - } - - $hash->{helper}{savemode}{$time1} =$time1; - if ($count > $savecount) - { - Log3( $Name, 1, "Das Device ".$Name." wurde automatisch deaktiviert ( Safemode )" ); - $hash->{helper}{savemodeblock}{blocking} ='on'; - readingsSingleUpdate( $hash, "Safemode", 'on', 1 ); - foreach my $a ( keys %{$timehash} ) - { - delete( $hash->{helper}{savemode}{$a} ); - } - $attr{$Name}{disable} = '1'; - } - return; - } + if ( AttrVal( $Name, 'MSwitch_Safemode', '0' ) == 0 ) { return; } + my $time = gettimeofday(); + $time =~ s/\.//g; + my $time1 = int($time); + my $count = 0; + my $timehash = $hash->{helper}{savemode}; + foreach my $a ( keys %{$timehash} ) { + $count++; + if ( $a < $time1 - 1000000 ) # für 10 sekunden + { + delete( $hash->{helper}{savemode}{$a} ); + $count = $count - 1; + } + } + + $hash->{helper}{savemode}{$time1} = $time1; + if ( $count > $savecount ) { + Log3( $Name, 1, + "Das Device " + . $Name + . " wurde automatisch deaktiviert ( Safemode )" ); + $hash->{helper}{savemodeblock}{blocking} = 'on'; + readingsSingleUpdate( $hash, "Safemode", 'on', 1 ); + foreach my $a ( keys %{$timehash} ) { + delete( $hash->{helper}{savemode}{$a} ); + } + $attr{$Name}{disable} = '1'; + } + return; +} ############################################################### -sub MSwitch_EventBulk($$$){ - my ( $hash, $event, $update ) = @_; +sub MSwitch_EventBulk($$$$) { + my ( $hash, $event, $update, $from ) = @_; - my $name = $hash->{NAME}; + my $name = $hash->{NAME}; + + MSwitch_LOG( $name, 5, "aufruf eventbulk eventin: " . $event ); + + return if !defined $event; + return if !defined $hash; + if ( $hash eq "" ) { return; } + my @evtparts = split( /:/, $event ); + $update = '1'; - return if !defined $event; - return if !defined $hash; - if ($hash eq ""){return;} - my @evtparts = split( /:/, $event ); - $update ='1'; - my $evtsanzahl = @evtparts; - if ( $evtsanzahl < 3 ) - { + + MSwitch_LOG( $name, 5, "aufruf eventzahl: " . $evtsanzahl ); + if ( $evtsanzahl < 3 ) { my $eventfrom = $hash->{helper}{eventfrom}; unshift( @evtparts, $eventfrom ); $evtsanzahl = @evtparts; } my $evtfull = join( ':', @evtparts ); - $evtparts[2] ='' if !defined $evtparts[2]; + $evtparts[2] = '' if !defined $evtparts[2]; + MSwitch_LOG( $name, 5, "aufruf eventbulk eventfullout: " . $evtfull ); - if (ReadingsVal( $name, 'last_event', '' ) ne $event && $event ne '') - { - - readingsBeginUpdate($hash); - readingsBulkUpdate( $hash, "EVENT", $event ) if $event ne ''; - readingsBulkUpdate( $hash, "EVTFULL", $evtfull ) if $evtfull ne ''; - readingsBulkUpdate( $hash, "EVTPART1", $evtparts[0] ) if $evtparts[0] ne ''; - readingsBulkUpdate( $hash, "EVTPART2", $evtparts[1] ) if $evtparts[1] ne ''; - readingsBulkUpdate( $hash, "EVTPART3", $evtparts[2] ) if $evtparts[2] ne ''; - readingsBulkUpdate( $hash, "last_event", $event ) if $event ne ''; - readingsEndUpdate( $hash, $update ); - } - return; + MSwitch_LOG( $name, 5, "aufruf eventbulk event " . $event ); + MSwitch_LOG( $name, 5, "aufruf eventbulk eventset " . $hash->{eventsave} ); + + if ( ReadingsVal( $name, 'last_event', '' ) ne $event + && $event ne '' + && $hash->{eventsave} ne 'saved' ) + { + #$hash-Bulkfrom} ="saved"; + $hash->{eventsave} = "saved"; + readingsBeginUpdate($hash); + + # if ( AttrVal( $name, 'MSwitch_Debug', "0" ) eq '4' ) + # { + # readingsBulkUpdate( $hash, "Bulkfrom", "von:".$from ) ; + # } + readingsBulkUpdate( $hash, "EVENT", $event ) if $event ne ''; + readingsBulkUpdate( $hash, "EVTFULL", $evtfull ) if $evtfull ne ''; + readingsBulkUpdate( $hash, "EVTPART1", $evtparts[0] ) + if $evtparts[0] ne ''; + readingsBulkUpdate( $hash, "EVTPART2", $evtparts[1] ) + if $evtparts[1] ne ''; + readingsBulkUpdate( $hash, "EVTPART3", $evtparts[2] ) + if $evtparts[2] ne ''; + readingsBulkUpdate( $hash, "last_event", $event ) if $event ne ''; + readingsEndUpdate( $hash, $update ); + } + return; } ########################################################## - # setzt reihenfolge und testet ID -sub MSwitch_priority(@) -{ - my ( $hash,$execids, @devices ) = @_; - my $name = $hash->{NAME}; +sub MSwitch_priority(@) { + my ( $hash, $execids, @devices ) = @_; + my $name = $hash->{NAME}; + MSwitch_LOG( $name, 5, "$name: zuweisung der reihenfolge und der id" ); + if ( AttrVal( $name, 'MSwitch_Expert', "0" ) ne '1' ) { + return @devices; + } - - MSwitch_LOG( $name, 5, "$name: zuweisung der reihenfolge und der id" ); - - if ( AttrVal( $name, 'MSwitch_Expert', "0" ) ne'1' ) - { - return @devices; - } - - - - my %devicedetails = MSwitch_makeCmdHash($name); - - # my $execids = "0" if !defined $execids; - - my %new; - foreach my $device (@devices) - { - - - # $execids beinhaltet auszuführende ids gesetzt bei init - - my $key1 = $device . "_id"; - Log3( $name, 5, "$name: device hat die ID $device - $devicedetails{$key1}" ); - next if $devicedetails{$key1} ne $execids; - - my $key = $device . "_priority"; - - - my $prio = $devicedetails{$key}; - - MSwitch_LOG( $name, 5, "$name: device hat die priority $device - $devicedetails{$key1}" ); - $new{$device}=$prio; - - - - - - } - - - my @new = %new; - my @newlist; - for my $key (sort { $new{ $a } <=> $new{ $b } } keys %new) - { - if ($key ne "" && $key ne " "){ - push(@newlist,$key); - } - } - @devices=@newlist; - my $test = join( '|', @devices ); - return @devices; + my %devicedetails = MSwitch_makeCmdHash($name); + + # my $execids = "0" if !defined $execids; + + my %new; + foreach my $device (@devices) { + + # $execids beinhaltet auszuführende ids gesetzt bei init + my $key1 = $device . "_id"; + Log3( $name, 5, + "$name: device hat die ID $device - $devicedetails{$key1}" ); + next if $devicedetails{$key1} ne $execids; + my $key = $device . "_priority"; + my $prio = $devicedetails{$key}; + MSwitch_LOG( $name, 5, + "$name: device hat die priority $device - $devicedetails{$key1}" + ); + $new{$device} = $prio; + } + + my @new = %new; + my @newlist; + for my $key ( sort { $new{$a} <=> $new{$b} } keys %new ) { + if ( $key ne "" && $key ne " " ) { + push( @newlist, $key ); + } + } + + my $anzahl = @newlist; + MSwitch_LOG( $name, 5, "$name: anzahl $anzahl" ); + @devices = @newlist if $anzahl > 0; + + return @devices; } +########################################################## +########################################################## + +# setzt reihenfolge und testet ID +sub MSwitch_sort(@) { + my ( $hash, $typ, @devices ) = @_; + my $name = $hash->{NAME}; + MSwitch_LOG( $name, 5, "$name: zuweisung der reihenfolge" ); + my %devicedetails = MSwitch_makeCmdHash($name); + my %new; + foreach my $device (@devices) { + + my $key = $device . $typ; + my $prio = $devicedetails{$key}; + MSwitch_LOG( $name, 5, + "$name: device hat $typ $device - $devicedetails{$key}" ); + $new{$device} = $prio; + } + + my @new = %new; + my @newlist; + for my $key ( sort { $new{$a} <=> $new{$b} } keys %new ) { + if ( $key ne "" && $key ne " " ) { + push( @newlist, $key ); + } + } + + my $anzahl = @newlist; + MSwitch_LOG( $name, 5, "$name: anzahl $anzahl" ); + @devices = @newlist if $anzahl > 0; + + return @devices; +} ########################################################## - - - sub MSwitch_set_dev($) { -# setzt NOTIFYDEF + + # setzt NOTIFYDEF my ($hash) = @_; my $name = $hash->{NAME}; - my $not = ReadingsVal( $name, 'Trigger_device', '' ); - if ( $not ne 'no_trigger' ) - { - if ( $not eq "all_events" ) - { - delete( $hash->{NOTIFYDEV} ); - if ( ReadingsVal( $name, '.Trigger_Whitelist', '' ) ne '' ) - { - $hash->{NOTIFYDEV} = - ReadingsVal( $name, '.Trigger_Whitelist', '' ); - } - } - else - { - $hash->{NOTIFYDEV} = $not; - my $devices = MSwitch_makeAffected($hash); - $hash->{DEF} = $not . ' # ' . $devices; + my $not = ReadingsVal( $name, 'Trigger_device', '' ); + if ( $not ne 'no_trigger' ) { + if ( $not eq "all_events" ) { + delete( $hash->{NOTIFYDEV} ); + if ( ReadingsVal( $name, '.Trigger_Whitelist', '' ) ne '' ) { + $hash->{NOTIFYDEV} = + ReadingsVal( $name, '.Trigger_Whitelist', '' ); } } - else - { - $hash->{NOTIFYDEV} = 'no_trigger'; - delete $hash->{DEF}; + else { + $hash->{NOTIFYDEV} = $not; + my $devices = MSwitch_makeAffected($hash); + $hash->{DEF} = $not . ' # ' . $devices; } -} - + } + else { + $hash->{NOTIFYDEV} = 'no_trigger'; + delete $hash->{DEF}; + } +} ############################################################## sub MSwitch_dec($$) { -# ersetzungen direkt vor befehlsausführung -my ( $hash, $todec) = @_; -my $name = $hash->{NAME}; -$todec =~ s/\n//g; -$todec =~ s/#\[wa\]/|/g; + # ersetzungen direkt vor befehlsausführung + my ( $hash, $todec ) = @_; + my $name = $hash->{NAME}; + $todec =~ s/\n//g; + $todec =~ s/#\[wa\]/|/g; + $todec =~ s/\$NAME/$hash->{helper}{eventfrom}/; + $todec =~ s/MSwitch_Self/$name/; - $todec =~ s/\$NAME/$hash->{helper}{eventfrom}/; - - $todec =~ s/MSwitch_Self/$name/; - - - - - - my $x = 0; - while ( $todec =~ m/(.*?)(\$SELF)(.*)?/) - { - my $firstpart = $1; - my $secondpart = $2; - my $lastpart = $3; - $todec = $firstpart.$name.$lastpart; - $x++; - last if $x > 10; #notausstieg - } + my $x = 0; + while ( $todec =~ m/(.*?)(\$SELF)(.*)?/ ) { + my $firstpart = $1; + my $secondpart = $2; + my $lastpart = $3; + $todec = $firstpart . $name . $lastpart; + $x++; + last if $x > 10; #notausstieg + } + # setmagic ersetzun + $x = 0; + while ( $todec =~ m/(.*)\[(.*)\:(.*)\](.*)/ ) { + $x++; # notausstieg notausstieg + last if $x > 20; # notausstieg notausstieg + my $setmagic = ReadingsVal( $2, $3, 0 ); + $todec = $1 . $setmagic . $4; + } - # setmagic ersetzun - $x =0; - while ( $todec =~ m/(.*)\[(.*)\:(.*)\](.*)/ ) - { - $x++; # notausstieg notausstieg - last if $x > 20; # notausstieg notausstieg - my $setmagic = ReadingsVal( $2, $3, 0 ); - $todec = $1.$setmagic.$4; - } - - -return $todec; + return $todec; } - + ################################################################ -sub MSwitch_clearlog($){ +sub MSwitch_clearlog($) { -my ( $hash, $cs) = @_; -my $name = $hash->{NAME}; + my ( $hash, $cs ) = @_; + my $name = $hash->{NAME}; -open( BACKUPDATEI, ">./log/MSwitch_debug_$name.log" ); -print BACKUPDATEI localtime()." Starte Log\n"; # - - -close(BACKUPDATEI); + open( BACKUPDATEI, ">./log/MSwitch_debug_$name.log" ); + print BACKUPDATEI localtime() . " Starte Log\n"; # + + close(BACKUPDATEI); } ################################################################ - - sub MSwitch_debug2($$) { -my ( $hash, $cs) = @_; -my $name = $hash->{NAME}; -return if $cs eq ''; -open( BACKUPDATEI, ">>./log/MSwitch_debug_$name.log" ); # Datei zum Schreiben öffnen -print BACKUPDATEI localtime().": -> $cs\n"; # - - -close(BACKUPDATEI); + my ( $hash, $cs ) = @_; + my $name = $hash->{NAME}; + return if $cs eq ''; + open( BACKUPDATEI, ">>./log/MSwitch_debug_$name.log" ) + ; # Datei zum Schreiben öffnen + print BACKUPDATEI localtime() . ": -> $cs\n"; # + + close(BACKUPDATEI); } ################################## +sub MSwitch_LOG($$$) { + my ( $name, $level, $cs ) = @_; + my $hash = $defs{$name}; + if ( + ( + AttrVal( $name, 'MSwitch_Debug', "0" ) eq '2' + || AttrVal( $name, 'MSwitch_Debug', "0" ) eq '3' + ) + && ( $level eq "6" || $level eq "1" ) + ) + { + MSwitch_debug2( $hash, $cs ); + } + $level = 5 if $level eq "6"; -################################## -sub MSwitch_LOG($$$) -{ - -my ( $name,$level, $cs) = @_; -my $hash = $defs{$name}; - - - if ( AttrVal( $name, 'MSwitch_Debug', "0" ) eq '2' || AttrVal( $name, 'MSwitch_Debug', "0" ) eq '3' ) - { - MSwitch_debug2($hash, $cs); - } - - -Log3( $name, $level, $cs ); + Log3( $name, $level, $cs ); } ######################### -sub MSwitch_confchange($$) -{ +sub MSwitch_confchange($$) { -# change wenn folgende einträge vorhanden + # change wenn folgende einträge vorhanden + #I testinfo + #Q dummy1#zu schaltendes geraet#device -#I testinfo -#Q dummy1#zu schaltendes geraet#device + my ( $hash, $cs ) = @_; + my $name = $hash->{NAME}; + MSwitch_clearlog($hash); + $cs = urlDecode($cs); + $cs =~ s/#\[sp\]/ /g; -my ( $hash, $cs) = @_; -my $name = $hash->{NAME}; -MSwitch_clearlog($hash); + my @changes = split( /\|/, $cs ); + foreach my $change (@changes) { -$cs = urlDecode( $cs ); -$cs =~ s/#\[sp\]/ /g; + #MSwitch_LOG( $name, 5, "zu ersetzen: ".$change ); + my @names = split( /#/, $change ); -my @changes = split( /\|/, $cs ); - foreach my $change (@changes) - { - #MSwitch_LOG( $name, 5, "zu ersetzen: ".$change ); - my @names = split( /#/, $change ); - - # afected devices - my $tochange1 = ReadingsVal( $name, ".Device_Affected", "" ); - my $oldname = $names[0]."-"; - my $newname = $names[1]."-"; - my @devices = split( /,/,$tochange1 ); - my $x =0; - foreach (@devices) - { - $_ =~ s/$oldname/$newname/g; - $devices[$x] = $_; - $x++; - } - my $newdevices = join( ',', @devices ); -readingsSingleUpdate( $hash, ".Device_Affected", $newdevices, 0 ); + # afected devices + my $tochange1 = ReadingsVal( $name, ".Device_Affected", "" ); + my $oldname = $names[0] . "-"; + my $newname = $names[1] . "-"; + my @devices = split( /,/, $tochange1 ); + my $x = 0; + foreach (@devices) { + $_ =~ s/$oldname/$newname/g; + $devices[$x] = $_; + $x++; + } + my $newdevices = join( ',', @devices ); + readingsSingleUpdate( $hash, ".Device_Affected", $newdevices, 0 ); - - - - - #details - my $tochange2 = ReadingsVal( $name, ".Device_Affected_Details", "" ); -#Log3( $name, 0, "vor change: ".$tochange2 ); - my @devicesdetails = split( /#\[ND\]/,$tochange2 ); - $x =0; - foreach (@devicesdetails) - { - $_ =~ s/$oldname/$newname/g; - $devicesdetails[$x] = $_; - $x++; - } - $tochange2 = join( '#[ND]', @devicesdetails ); - -#Log3( $name, 0, "oldname: ".$oldname ); -#Log3( $name, 0, "newname: ".$newname ); - -#Log3( $name, 0, "navh change: ".$tochange2 ); - - $x = 0; - while ( $tochange2 =~ m/(.*?)($names[0])(.*)?/) - { - my $firstpart = $1; - my $secondpart = $2; - my $lastpart = $3; - $tochange2 = $firstpart.$names[1].$lastpart; - $x++; - last if $x > 10; #notausstieg - } - -# Log3( $name, 0, "navh 2 change: ".$tochange2 ); - - -readingsSingleUpdate( $hash, ".Device_Affected_Details", $tochange2, 0 ); - } -fhem("deletereading $name .change"); -fhem("deletereading $name .change_info"); + #details + my $tochange2 = ReadingsVal( $name, ".Device_Affected_Details", "" ); + my @devicesdetails = split( /#\[ND\]/, $tochange2 ); + $x = 0; + foreach (@devicesdetails) { + $_ =~ s/$oldname/$newname/g; + $devicesdetails[$x] = $_; + $x++; + } + $tochange2 = join( '#[ND]', @devicesdetails ); + $x = 0; + while ( $tochange2 =~ m/(.*?)($names[0])(.*)?/ ) { + my $firstpart = $1; + my $secondpart = $2; + my $lastpart = $3; + $tochange2 = $firstpart . $names[1] . $lastpart; + $x++; + last if $x > 10; #notausstieg + } + readingsSingleUpdate( $hash, ".Device_Affected_Details", $tochange2, + 0 ); + } + fhem("deletereading $name .change"); + fhem("deletereading $name .change_info"); } ######################### sub MSwitch_makefreecmd($$) { -#ersetzungen und variablen für freecmd - my ( $hash, $cs) = @_; + + #ersetzungen und variablen für freecmd + my ( $hash, $cs ) = @_; my $name = $hash->{NAME}; - my $ersetzung =""; - - - # entferne kommntarzeilen - $cs =~ s/#.*\n//g; - # entferne zeilenumbruch - $cs =~ s/\n//g; - - # ersetze Eventvariablen - $ersetzung = ReadingsVal( $name, "EVTPART3", "" ); - $cs =~ s/\$EVTPART3/$ersetzung/g; - $ersetzung = ReadingsVal( $name, "EVTPART2", "" ); - $cs =~ s/\$EVTPART2/$ersetzung/g; - $ersetzung = ReadingsVal( $name, "EVTPART1", "" ); - $cs =~ s/\$EVTPART1/$ersetzung/g; - $ersetzung = ReadingsVal( $name, "EVENT", "" ); - $cs =~ s/\$EVENT/$ersetzung/g; - $ersetzung = ReadingsVal( $name, "EVENTFULL", "" ); - $cs =~ s/\$EVENTFULL/$ersetzung/g; - - $cs =~ s/\$NAME/$hash->{helper}{eventfrom}/; - - - - #$cs =~ s/\$SELF/$name/; - - - my $x = 0; - while ( $cs =~ m/(.*?)(\$SELF)(.*)?/) - { - my $firstpart = $1; - my $secondpart = $2; - my $lastpart = $3; - $cs = $firstpart.$name.$lastpart; - $x++; - last if $x > 10; #notausstieg - } - - - # setmagic ersetzun - MSwitch_LOG( $name, 5, "vor freecmd: ".$cs ); - $x =0; - while ( $cs =~ m/(.*)\[(.*)\:(.*)\](.*)/ ) - { - $x++; # notausstieg notausstieg - last if $x > 20; # notausstieg notausstieg - my $setmagic = ReadingsVal( $2, $3, 0 ); - $cs = $1.$setmagic.$4; - } - - MSwitch_LOG( $name, 5, "after freecmd: ".$cs ); - - - - return $cs; + my $ersetzung = ""; + + # entferne kommntarzeilen + $cs =~ s/#.*\n//g; + + # entferne zeilenumbruch + $cs =~ s/\n//g; + + # ersetze Eventvariablen + $ersetzung = ReadingsVal( $name, "EVTPART3", "" ); + $cs =~ s/\$EVTPART3/$ersetzung/g; + $ersetzung = ReadingsVal( $name, "EVTPART2", "" ); + $cs =~ s/\$EVTPART2/$ersetzung/g; + $ersetzung = ReadingsVal( $name, "EVTPART1", "" ); + $cs =~ s/\$EVTPART1/$ersetzung/g; + $ersetzung = ReadingsVal( $name, "EVENT", "" ); + $cs =~ s/\$EVENT/$ersetzung/g; + $ersetzung = ReadingsVal( $name, "EVENTFULL", "" ); + $cs =~ s/\$EVENTFULL/$ersetzung/g; + $cs =~ s/\$NAME/$hash->{helper}{eventfrom}/; + + my $x = 0; + while ( $cs =~ m/(.*?)(\$SELF)(.*)?/ ) { + my $firstpart = $1; + my $secondpart = $2; + my $lastpart = $3; + $cs = $firstpart . $name . $lastpart; + $x++; + last if $x > 10; #notausstieg + } + + # setmagic ersetzun + MSwitch_LOG( $name, 5, "vor freecmd: " . $cs ); + $x = 0; + while ( $cs =~ m/(.*)\[(.*)\:(.*)\](.*)/ ) { + $x++; # notausstieg notausstieg + last if $x > 20; # notausstieg notausstieg + my $setmagic = ReadingsVal( $2, $3, 0 ); + $cs = $1 . $setmagic . $4; + } + + MSwitch_LOG( $name, 5, "after freecmd: " . $cs ); + + return $cs; } -################################# +################################# - - # devices = devices.replace(/:/g,'#[dp]'); - # devices = devices.replace(/;/g,'#[se]'); - # devices = devices.replace(/ /g,'#[sp]'); - - # auskommentierte wurden bereits dur jscript ersetzt - # $savedetails =~ s/#\[wa\]/|/g; - # $savedetails =~ s/\n/#[nl]/g; - # $savedetails =~ s/;/#[se]/g; - # $savedetails =~ s/\:/#[dp]/g; - # $savedetails =~ s/\t/ /g; - # $savedetails =~ s/ /#[sp]/g; - # $savedetails =~ s/\\/#[bs]/g; - # $savedetails =~ s/,/#[ko]/g; - # $savedetails =~ s/^#\[/#[eo]/g; - # $savedetails =~ s/^#\]/#[ec]/g; - # $savedetails =~ s/\|/#[wa]/g; - - 1; =pod @@ -7898,4 +8158,3 @@ MSwitch is an auxiliary module that works both event- and time-controlled.