" . $time . " execute 'cmd1' commands from ID ".$id." only
";
+ }
+ if ( $number eq '7' ) {
+ $ret .="
" . $time . " execute 'cmd2' commands from ID ".$id." only
";
+ }
+
+
}
#delays
@@ -758,13 +868,20 @@ sub MSwitch_Get($$@) {
$extension = 'get_sysextension:noArg';
}
+
+ if ( AttrVal( $name, 'MSwitch_Mode', 'Full' ) eq "Dummy" ) {
+ return "Unknown argument $opt, choose one of get_support_info:noArg restore_MSwitch_Data:this_Device,all_Devices";
+ }
+
+
+
if ( ReadingsVal( $name, '.lock', 'undef' ) ne "undef" ) {
return
-"Unknown argument $opt, choose one of active_timer:show,delete get_config:noArg restore_MSwitch_Data:this_Device,all_Devices";
+"Unknown argument $opt, choose one of active_timer:show,delete get_config:noArg restore_MSwitch_Data:this_Device,all_Devices $preconf";
}
else {
return
-"Unknown argument $opt, choose one of get_support_info:noArg get_config:noArg active_timer:show,delete restore_MSwitch_Data:this_Device,all_Devices $extension";
+"Unknown argument $opt, choose one of get_support_info:noArg get_config:noArg active_timer:show,delete restore_MSwitch_Data:this_Device,all_Devices $preconf $extension";
}
}
@@ -778,33 +895,22 @@ sub MSwitch_AsyncOutput ($) {
sub MSwitch_Set($@) {
my ( $hash, $name, $cmd, @args ) = @_;
+ Log3( $name, 5, "$name Set $cmd, @args " . __LINE__ );
+
+
##############################
-
- if ( $cmd eq 'inactive' ) {
-
- # setze device auf inaktiv
- readingsSingleUpdate( $hash, "state", 'inactive', 1 );
- return;
- }
-##############################
- if ( $cmd eq 'active' ) {
-
- # setze device auf aktiv
- readingsSingleUpdate( $hash, "state", 'active', 1 );
- return;
- }
-##############################
-
return ""
if ( IsDisabled($name) && ( $cmd eq 'on' || $cmd eq 'off' ) )
; # Return without any further action if the module is disabled
my $execids = "0";
$hash->{eventsave} = 'unsaved';
- # verry special commands readingactivated (
+##############################
+# verry special commands readingactivated (
my $special = '';
my $cs = ReadingsVal( $name, '.sysconf', 'undef' );
if ( $cs ne "undef" ) {
+ $cs =~ s/#\[tr\]/[tr]/g;
$cs =~ s/#\[wa\]/|/g;
$cs =~ s/#\[sp\]/ /g;
$cs =~ s/#\[nl\]/\n/g;
@@ -816,50 +922,24 @@ sub MSwitch_Set($@) {
$cs =~ s/#\[ko\]/,/g;
$cs =~ s/#.*\n//g;
$cs =~ s/\n//g;
-
- my $return = "no value";
+ $cs =~ s/\[tr\]/#[tr]/g;
+ my $return = "no value";
$return = eval($cs);
if ($@) {
Log3( $name, 1, "$name MSwitch_repeat: ERROR $cs: $@ " . __LINE__ );
+
}
-
return if $return eq "exit";
}
- ############################
+############################
if ( !defined $args[0] ) { $args[0] = ''; }
- if ( $cmd eq 'exec_cmd1' && $args[0] eq 'ID' ) {
- Log3( $name, 5, "$name: execids werden gesetzt -> " . $args[1] );
- $execids = $args[1];
- $args[0] = 'ID';
- }
-
- if ( $cmd eq 'exec_cmd2' && $args[0] eq 'ID' ) {
- Log3( $name, 5, "$name: execids werden gesetzt als -> " . $args[1] );
- $execids = $args[1];
- $args[0] = 'ID';
- }
- my $ic = '';
- $ic = $hash->{IncommingHandle};
- #######################################
- if ( ( ( $cmd eq 'on' ) || ( $cmd eq 'off' ) )
- && ( $args[0] ne '' )
- && ( $ic ne 'fromnotify' ) )
- {
- readingsSingleUpdate( $hash, "Parameter", $args[0], 1 );
- if ( $cmd eq 'on' ) { $args[0] = "$name:on_with_Parameter:$args[0]"; }
- if ( $cmd eq 'off' ) { $args[0] = "$name:off_with_Parameter:$args[0]"; }
- }
-
- delete( $hash->{IncommingHandle} );
-
- #######################################
- if ( AttrVal( $name, 'MSwitch_Debug', "0" ) eq '4' )
-
- #AUFRUF DEBUGFUNKTIONEN
- {
- MSwitch_Debug($hash);
- }
+
+ my $setList = AttrVal($name, "setList", " ");
+ $setList =~ s/\n/ /g;
+
+ my $devicemode = AttrVal( $name, 'MSwitch_Mode', 'Full' );
+
if ( !exists( $sets{$cmd} ) ) {
my @cList;
@@ -882,29 +962,108 @@ sub MSwitch_Set($@) {
if ( ReadingsVal( $name, '.change', '' ) ne '' ) {
return "Unknown argument $cmd, choose one of ";
}
+
+
+# bearbeite setlist und readinglist
+##############################
+if ($cmd ne "?")
+{
+ my @sl = split(" ", AttrVal($name, "setList", ""));
+ my $re = qr/$cmd/;
+ my @gefischt=grep(/$re/,@sl);
+ if(@sl && grep /$re/, @sl )
+ {
+ my @rl = split(" ", AttrVal($name, "readingList", ""));
+ if(@rl && grep /$re/, @rl )
+ {
+ readingsSingleUpdate( $hash, $cmd, "@args", 1 );
+ }
+ else
+ {
+ readingsSingleUpdate( $hash, "state", $cmd." @args", 1 );
+ }
+ return;
+ }
+##############################
+# dummy state setzen und exit
+ if ( $devicemode eq "Dummy" )
+ {
+ readingsSingleUpdate( $hash, "state", $cmd." @args", 1 );
+ return;
+ }
+#AUFRUF DEBUGFUNKTIONEN
+ if ( AttrVal( $name, 'MSwitch_Debug', "0" ) eq '4' )
+ {
+ MSwitch_Debug($hash);
+ }
+#######################################
- if ( AttrVal( $name, 'MSwitch_Mode', 'Full' ) eq "Notify" ) {
+ my $ic = '';
+ $ic = $hash->{IncommingHandle};
+ if ( ( ( $cmd eq 'on' ) || ( $cmd eq 'off' ) )
+ && ( $args[0] ne '' )
+ && ( $ic ne 'fromnotify' ) )
+ {
+ readingsSingleUpdate( $hash, "Parameter", $args[0], 1 );
+ if ( $cmd eq 'on' ) { $args[0] = "$name:on_with_Parameter:$args[0]"; }
+ if ( $cmd eq 'off' ) { $args[0] = "$name:off_with_Parameter:$args[0]"; }
+ }
+ delete( $hash->{IncommingHandle} );
+#######################################
+
+}
+############################################
+
+
+
+ if ( $devicemode eq "Notify" ) {
return
-"Unknown argument $cmd, choose one of active:noArg inactive:noArg del_delays:noArg backup_MSwitch:all_devices fakeevent exec_cmd1 exec_cmd2 exec_cmd1+2 wait reload_timer:noArg change_renamed $special";
+"Unknown argument $cmd, choose one of active:noArg inactive:noArg del_delays:noArg backup_MSwitch:all_devices fakeevent exec_cmd_1 exec_cmd_2 wait reload_timer:noArg change_renamed $setList $special";
}
- elsif ( AttrVal( $name, 'MSwitch_Mode', 'Full' ) eq "Toggle" ) {
+ elsif ( $devicemode eq "Toggle" ) {
return
-"Unknown argument $cmd, choose one of active:noArg inactive:noArg on offdel_delays:noArg backup_MSwitch:all_devices fakeevent wait reload_timer:noArg change_renamed $special";
+"Unknown argument $cmd, choose one of active:noArg inactive:noArg on off del_delays:noArg backup_MSwitch:all_devices fakeevent wait reload_timer:noArg change_renamed $setList $special";
}
- else {
+
+
+ elsif ( $devicemode eq "Dummy" ) {
return
-"Unknown argument $cmd, choose one of active:noArg inactive:noArg on off del_delays:noArg backup_MSwitch:all_devices fakeevent exec_cmd1 exec_cmd2 exec_cmd1+2 wait reload_timer:noArg change_renamed $special";
+"Unknown argument $cmd, choose one of state $setList $special";
+ }
+
+ else {
+ #full
+ return
+"Unknown argument $cmd, choose one of active:noArg inactive:noArg on off del_delays:noArg backup_MSwitch:all_devices fakeevent exec_cmd_1 exec_cmd_2 wait reload_timer:noArg change_renamed $setList $special";
}
}
+
+
if ( AttrVal( $name, 'MSwitch_RandomNumber', '' ) ne '' ) {
# randomnunner erzeugen wenn attr an
MSwitch_Createnumber1($hash);
}
- #######################################
+
+##############################
+
+ if ( $cmd eq 'inactive' ) {
+
+ # setze device auf inaktiv
+ readingsSingleUpdate( $hash, "state", 'inactive', 1 );
+ return;
+ }
+##############################
+ if ( $cmd eq 'active' ) {
+
+ # setze device auf aktiv
+ readingsSingleUpdate( $hash, "state", 'active', 1 );
+ return;
+ }
+##############################
if ( $cmd eq 'change_renamed' ) {
my $changestring = $args[0] . "#" . $args[1];
MSwitch_confchange( $hash, $changestring );
@@ -952,10 +1111,14 @@ sub MSwitch_Set($@) {
MSwitch_Check_Event( $hash, $args[0] );
return;
}
-
##############################
- if ( $cmd eq 'exec_cmd1' ) {
+ if ( $cmd eq 'exec_cmd_1' ) {
+
+ if ( $args[0] eq 'ID' ) {
+ $execids = $args[1];
+ $args[0] = 'ID';
+ }
# cmd1 abarbeiten
MSwitch_Exec_Notif( $hash, 'on', 'nocheck', '', $execids );
@@ -964,9 +1127,14 @@ sub MSwitch_Set($@) {
##############################
- if ( $cmd eq 'exec_cmd2' ) {
+ if ( $cmd eq 'exec_cmd_2' ) {
- # cmd1 abarbeiten
+ if ( $args[0] eq 'ID' ) {
+ $execids = $args[1];
+ $args[0] = 'ID';
+ }
+
+ # cmd2 abarbeiten
MSwitch_Exec_Notif( $hash, 'off', 'nocheck', '', $execids );
return;
}
@@ -1010,8 +1178,13 @@ sub MSwitch_Set($@) {
# event manuell zufügen
my $devName = ReadingsVal( $name, 'Trigger_device', '' );
- $args[0] =~ s/~/ /g;
- my @newevents = split( /,/, $args[0] );
+ $args[0] =~ s/\[sp\]/ /g;
+
+ # MSwitch_LOG( $name, 0, "args0 ".$args[0] );
+ # TODO leerzeichen im perteil ersetzen
+
+ my @newevents = split( / /, $args[0] );
+
if ( ReadingsVal( $name, 'Trigger_device', '' ) eq "all_events" ) {
foreach (@newevents) {
$hash->{helper}{events}{all_events}{$_} = "on";
@@ -1066,25 +1239,26 @@ sub MSwitch_Set($@) {
##############################
if ( $cmd eq "set_trigger" ) {
- # setze trigger
- chop( $args[1], $args[2], $args[3], $args[4], $args[5] );
+ chop( $args[1], $args[2], $args[3], $args[4], $args[5], $args[6] );
my $triggertime = 'on'
. $args[1] . '~off'
. $args[2]
. '~ononly'
. $args[3]
. '~offonly'
- . $args[4];
+ . $args[4]
+ . '~onoffonly'
+ . $args[5];
my $oldtrigger = ReadingsVal( $name, 'Trigger_device', '' );
readingsSingleUpdate( $hash, "Trigger_device", $args[0], '1' );
- readingsSingleUpdate( $hash, ".Trigger_condition", $args[5], 0 );
+ readingsSingleUpdate( $hash, ".Trigger_condition", $args[6], 0 );
- if ( !defined $args[6] ) {
+ if ( !defined $args[7] ) {
readingsDelete( $hash, '.Trigger_Whitelist' );
}
else {
- readingsSingleUpdate( $hash, ".Trigger_Whitelist", $args[6], 0 );
+ readingsSingleUpdate( $hash, ".Trigger_Whitelist", $args[7], 0 );
}
my $testtrig = ReadingsVal( $name, 'Trigger_device', '' );
@@ -1095,7 +1269,8 @@ sub MSwitch_Set($@) {
if ( $args[1] ne ''
|| $args[2] ne ''
|| $args[3] ne ''
- || $args[4] ne '' )
+ || $args[4] ne ''
+ || $args[5] ne '' )
{
readingsSingleUpdate( $hash, ".Trigger_time", $triggertime, 0 );
MSwitch_Createtimer($hash);
@@ -1107,18 +1282,33 @@ sub MSwitch_Set($@) {
$hash->{helper}{events}{ $args[0] }{'no_trigger'} = "on";
- if ( $args[0] ne 'no_trigger' ) {
- if ( $args[0] eq "all_events" ) {
+ if ( $args[0] ne 'no_trigger' )
+ {
+ if ( $args[0] eq "all_events" )
+ {
delete( $hash->{NOTIFYDEV} );
- if ( ReadingsVal( $name, '.Trigger_Whitelist', '' ) ne '' ) {
+ if ( ReadingsVal( $name, '.Trigger_Whitelist', '' ) ne '' )
+ {
$hash->{NOTIFYDEV} =
ReadingsVal( $name, '.Trigger_Whitelist', '' );
}
}
- else {
+ else
+ {
+
+
+ if ( $args[0] ne "MSwitch_Self" ){
$hash->{NOTIFYDEV} = $args[0];
my $devices = MSwitch_makeAffected($hash);
$hash->{DEF} = $args[0] . ' # ' . $devices;
+ }
+ else{
+ $hash->{NOTIFYDEV} = $name;
+ my $devices = MSwitch_makeAffected($hash);
+ $hash->{DEF} = $name . ' # ' . $devices;
+
+}
+
}
}
else {
@@ -1221,7 +1411,6 @@ sub MSwitch_Set($@) {
split( /,/, ReadingsVal( $name, '.Device_Affected', '' ) );
my @inputcmds = split( /#\[ND\]/, $args[0] );
- #my $counter = 0;
my $error = '';
my $key = '';
my $savedetails = '';
@@ -1378,10 +1567,15 @@ sub MSwitch_Set($@) {
# liste anpassen ( reihenfolge ) wenn expert = 1
@devices = MSwitch_priority( $hash, $execids, @devices );
- LOOP1: foreach my $device (@devices) {
+
+ my $expertmode = AttrVal( $name, 'MSwitch_Expert', "0" );
+ my $randomtime = AttrVal( $name, 'MSwitch_RandomTime', '');
+
+ LOOP1: foreach my $device (@devices)
+ {
$out = '0';
- if ( AttrVal( $name, 'MSwitch_Expert', "0" ) eq '1' ) {
+ if ( $expertmode eq '1' ) {
$ekey = $device . "_exit" . $exittest;
$out = $devicedetails{$ekey};
}
@@ -1491,6 +1685,10 @@ sub MSwitch_Set($@) {
MSwitch_LOG( $name, 6,
"$name: ergebniss condition -> ergebniss " . $execute );
if ( $execute eq 'true' ) {
+
+
+
+
$cs =~ s/\$NAME/$hash->{helper}{eventfrom}/;
$cs =~ s/\$SELF/$name/;
MSwitch_LOG( $name, 6,
@@ -1502,6 +1700,7 @@ sub MSwitch_Set($@) {
MSwitch_LOG( $name, 6,
"$name: Abbruchbefehl erhalten von "
. $device );
+
last LOOP1;
}
@@ -1511,7 +1710,7 @@ sub MSwitch_Set($@) {
MSwitch_LOG( $name, 6,
"$name: teste auf condition -> keine vorhanden " );
- if ( AttrVal( $name, 'MSwitch_RandomTime', '' ) ne ''
+ if ( $randomtime ne ''
&& $devicedetails{$timerkey} eq '[random]' )
{
MSwitch_LOG( $name, 6,
@@ -1525,7 +1724,7 @@ sub MSwitch_Set($@) {
"$name: timerd ersetzt-> "
. $devicedetails{$timerkey} );
}
- elsif ( AttrVal( $name, 'MSwitch_RandomTime', '' ) eq ''
+ elsif ( $randomtime eq ''
&& $devicedetails{$timerkey} eq '[random]' )
{
MSwitch_LOG( $name, 6,
@@ -1580,7 +1779,7 @@ sub MSwitch_Set($@) {
"$name: delay wird ersetzt " );
$devicedetails{$timerkey} =
MSwitch_replace_delay( $hash, $teststateorg );
- Log3( $name, 6,
+ MSwitch_LOG( $name, 6,
"$name: delay ersetzt -> "
. $devicedetails{$timerkey} );
}
@@ -1620,6 +1819,7 @@ sub MSwitch_Set($@) {
MSwitch_LOG( $name, 6,
"$name: Abbruchbefehl erhalten von "
. $device );
+
last LOOP1;
}
@@ -1629,7 +1829,7 @@ sub MSwitch_Set($@) {
}
- if ( AttrVal( $name, 'MSwitch_Mode', 'Full' ) ne "Notify" ) {
+ if ( $devicemode ne "Notify" ) {
readingsSingleUpdate( $hash, "state", $cmd, 1 );
}
else {
@@ -1643,8 +1843,12 @@ sub MSwitch_Set($@) {
MSwitch_LOG( $name, 6, "$name: uebergabe an sub execute " )
if $anzahl > 0;
MSwitch_Cmd( $hash, @cmdpool ) if $anzahl > 0;
+ #$lastdevice = $device ;
+
+ #readingsSingleUpdate( $hash, "last_cmd", $hash->{helper}{priorityids}{$lastdevice}, 1 );
return;
}
+
return;
}
@@ -1654,17 +1858,21 @@ sub MSwitch_Cmd(@) {
my ( $hash, @cmdpool ) = @_;
my $Name = $hash->{NAME};
-
+my $lastdevice ;
my %devicedetails = MSwitch_makeCmdHash($Name);
foreach my $cmds (@cmdpool) {
MSwitch_LOG( $Name, 6, "$Name: execute -> " . $cmds );
my @cut = split( /\|/, $cmds );
$cmds = $cut[0];
- # ersetze platzhakter vor ausführung
+ #ersetze platzhakter vor ausführung
#change # $cmds =~ s/#\[wa\]/|/g; #neu
my $device = $cut[1];
+
+ $lastdevice = $device;
+
+
my $toggle = '';
if ( $cmds =~ m/set (.*)(MSwitchtoggle)(.*)/ ) {
MSwitch_LOG( $Name, 6,
@@ -1764,6 +1972,7 @@ sub MSwitch_Cmd(@) {
if ($@) {
MSwitch_LOG( $Name, 1,
"$Name MSwitch_Set: ERROR $cmds: $@ " . __LINE__ );
+
}
}
@@ -1774,6 +1983,7 @@ sub MSwitch_Cmd(@) {
if ( defined($errors) ) {
MSwitch_LOG( $Name, 1,
"$Name MSwitch_Set: ERROR $cmds: $errors " . __LINE__ );
+
}
}
}
@@ -1784,7 +1994,11 @@ sub MSwitch_Cmd(@) {
if ( length($showpool) > 100 ) {
$showpool = substr( $showpool, 0, 100 ) . '....';
}
- readingsSingleUpdate( $hash, "Exec_cmd", $showpool, 1 ) if $showpool ne '';
+
+ readingsSingleUpdate( $hash, "last_exec_cmd", $showpool, 1 ) if $showpool ne '';
+ if ( AttrVal( $Name, 'MSwitch_Expert', '0' ) eq "1" ) {
+ readingsSingleUpdate( $hash, "last_cmd", $hash->{helper}{priorityids}{$lastdevice}, 1 );
+ }
}
####################
@@ -1900,9 +2114,22 @@ sub MSwitch_Attr(@) {
if ( $aName eq 'MSwitch_Mode' && ( $aVal eq 'Full' || $aVal eq 'Toggle' ) )
{
+
my $cs = "setstate $name ???";
my $errors = AnalyzeCommandChain( undef, $cs );
}
+
+
+
+
+ if ( $aName eq 'MSwitch_Mode' && ( $aVal eq 'Dummy' ) )
+ {
+ MSwitch_Delete_Delay( $hash, 'all' );
+ MSwitch_Clear_timer($hash);
+ $hash->{NOTIFYDEV} = 'no_trigger';
+
+ }
+
if ( $aName eq 'MSwitch_Mode' && $aVal eq 'Notify' ) {
readingsSingleUpdate( $hash, "state", 'active', 1 );
@@ -2000,9 +2227,25 @@ sub MSwitch_Notify($$) {
if ( IsDisabled($ownName) )
; # Return without any further action if the module is disabled
+
+
+ my $devicemode = AttrVal( $ownName, 'MSwitch_Mode', 'Full' );
+ my $devicefilter = AttrVal( $ownName, 'MSwitch_Trigger_Filter', 'undef' );
+ my $debugmode = AttrVal( $ownName, 'MSwitch_Debug', "0" ) ;
+ my $startdelay = AttrVal( $ownName, 'MSwitch_Startdelay', $standartstartdelay );
+ my $attrrandomnumber= AttrVal( $ownName, 'MSwitch_RandomNumber', '' );
+
+ return if ( $devicemode eq 'Dummy' );
+ return if ( ReadingsVal($ownName,"Trigger_device","no_trigger") eq 'no_trigger' );
+ return if (!$own_hash->{NOTIFYDEV});
+
+
+
+
+
+
# startverzöferung abwarten
- my $startdelay =
- AttrVal( $ownName, 'MSwitch_Startdelay', $standartstartdelay );
+
my $diff = int(time) - $fhem_started;
if ( $diff < $startdelay ) {
MSwitch_LOG( $ownName, 6,
@@ -2032,7 +2275,7 @@ sub MSwitch_Notify($$) {
return;
}
- if ( AttrVal( $ownName, 'MSwitch_RandomNumber', '' ) ne '' ) {
+ if ( $attrrandomnumber ne '' ) {
# create randomnumber wenn attr an
MSwitch_Createnumber1($own_hash);
@@ -2079,14 +2322,14 @@ sub MSwitch_Notify($$) {
my $triggercmdon = ReadingsVal( $ownName, '.Trigger_cmd_on', '' );
my $triggercmdoff = ReadingsVal( $ownName, '.Trigger_cmd_off', '' );
- if ( AttrVal( $ownName, 'MSwitch_Mode', 'Full' ) eq "Notify" ) {
+ if ( $devicemode eq "Notify" ) {
# passt triggerfelder an attr an
$triggeron = 'no_trigger';
$triggeroff = 'no_trigger';
}
- if ( AttrVal( $ownName, 'MSwitch_Mode', 'Full' ) eq "Toggle" ) {
+ if ( $devicemode eq "Toggle" ) {
# passt triggerfelder an attr an
$triggeroff = 'no_trigger';
@@ -2162,13 +2405,9 @@ sub MSwitch_Notify($$) {
}
# wird nur ausgefüht wenn ankommende events gelogd werden
- if ( AttrVal( $ownName, 'MSwitch_Trigger_Filter', 'undef' ) ne
- 'undef'
- && AttrVal( $ownName, 'MSwitch_Trigger_Filter', 'undef' ) ne
- "" )
+ if ( $devicefilter ne 'undef' && $devicefilter ne "" )
{
my $eventcopy1 = $eventcopy;
-
if ( $triggerdevice eq "all_events" ) {
# fügt dem event den devicenamen hinzu , wenn global getriggert wird
@@ -2176,8 +2415,7 @@ sub MSwitch_Notify($$) {
}
my @filters =
- split( /,/,
- AttrVal( $ownName, 'MSwitch_Trigger_Filter', 'undef' ) )
+ split( /,/, $devicefilter )
; # beinhaltet filter durch komma getrennt
MSwitch_LOG( $ownName, 5,
"$ownName: Filtertest Event -> " . $eventcopy );
@@ -2206,7 +2444,7 @@ sub MSwitch_Notify($$) {
}
}
-##############################################################################################################
+############################################################################################################
#anzahl checken / ggf nicht mehr nötig
#check checken / ggf nicht mehr nötig
@@ -2223,7 +2461,7 @@ sub MSwitch_Notify($$) {
}
# Teste auf einhaltung Triggercondition ENDE
-###############################################################################################################
+############################################################################################################
my $eventcopy1 = $eventcopy;
@@ -2293,7 +2531,6 @@ sub MSwitch_Notify($$) {
push @cmdarray, $own_hash . ',off,check,' . $eventcopy1;
$check = 1;
- #readingsSingleUpdate( $own_hash, "incomming", $eventcopy, 0 );
}
MSwitch_LOG( $ownName, 6,
"$ownName: checktrigger ergebniss -> " . $testvar );
@@ -2309,8 +2546,6 @@ sub MSwitch_Notify($$) {
if ( $testvar ne 'undef' ) {
push @cmdarray, $own_hash . ',on,check,' . $eventcopy1;
$check = 1;
-
- #readingsSingleUpdate( $own_hash, "incomming", $eventcopy, 0 );
}
MSwitch_LOG( $ownName, 6,
"$ownName: checktrigger ergebniss -> " . $testvar );
@@ -2324,10 +2559,8 @@ sub MSwitch_Notify($$) {
MSwitch_LOG( $ownName, 6,
"$ownName: inhalt gefundener Befehle -> @cmdarray" );
$own_hash->{IncommingHandle} = 'fromnotify';
-
- #$event =~ s/ //ig; #?
$event =~ s/~/ /g; #?
- if ( AttrVal( $ownName, 'MSwitch_Mode', 'Full' ) eq "Notify"
+ if ( $devicemode eq "Notify"
and $activecount == 0 )
{
# reading activity aktualisieren
@@ -2346,7 +2579,7 @@ sub MSwitch_Notify($$) {
# abfrage und setzten von blocking ENDE
- if ( AttrVal( $ownName, 'MSwitch_Mode', 'Full' ) eq "Toggle"
+ if ( $devicemode eq "Toggle"
&& $set eq 'on' )
{ # umschalten des devices nur im togglemode
@@ -2358,7 +2591,7 @@ sub MSwitch_Notify($$) {
MSwitch_LOG( $ownName, 6,
"$ownName: togglemode execute -> " . $cmd );
- if ( AttrVal( $ownName, 'MSwitch_Debug', "0" ) ne '2' ) {
+ if ($debugmode ne '2' ) {
my $errors = AnalyzeCommandChain( undef, $cmd );
if ( defined($errors) ) {
MSwitch_LOG( $ownName, 1,
@@ -2374,7 +2607,9 @@ sub MSwitch_Notify($$) {
#my @cmdarray1; #enthält auszuführende befehle nach conditiontest
#schaltet zweig 3 und 4
- if ( $anzahl != 0 ) {
+
+ # ACHTUNG
+ if ( $anzahl && $anzahl != 0 ) {
MSwitch_LOG( $ownName, 6,
"$ownName: abarbeiten aller befehle aus eventprüfung " );
@@ -2388,12 +2623,9 @@ sub MSwitch_Notify($$) {
if ( !defined $ar2 ) { $ar2 = ''; }
if ( $ar2 eq '' ) { next LOOP31; }
my $returncmd = 'undef';
-
- #MSwitch_LOG( $ownName, 0,"$ownName: aufruf execnotif $_ $ar2, $ar3, $ar4 ");
$returncmd =
MSwitch_Exec_Notif( $own_hash, $ar2, $ar3, $ar4, $execids );
- #MSwitch_LOG( $ownName, 0,"$ownName: ergebniss execnotif -> ".$returncmd);
if ( defined $returncmd && $returncmd ne 'undef' ) {
@@ -2411,14 +2643,14 @@ sub MSwitch_Notify($$) {
foreach ( split( /,/, $befehlssatz ) ) {
my $ecec = $_;
if ( !$ecec =~ m/set (.*)(MSwitchtoggle)(.*)/ ) {
- if ( AttrVal( $ownName, 'MSwitch_RandomNumber', '' ) ne '' )
+ if ( $attrrandomnumber ne '' )
{
MSwitch_Createnumber($own_hash);
}
MSwitch_LOG( $ownName, 6,
"$ownName: Befehlsausfuehrung -> " . $ecec );
- if ( AttrVal( $ownName, 'MSwitch_Debug', "0" ) ne '2' ) {
+ if ( $debugmode ne '2' ) {
my $errors = AnalyzeCommandChain( undef, $_ );
@@ -2431,7 +2663,7 @@ sub MSwitch_Notify($$) {
if ( length($ecec) > 100 ) {
$ecec = substr( $ecec, 0, 100 ) . '....';
}
- readingsSingleUpdate( $own_hash, "Exec_cmd", $ecec, 1 )
+ readingsSingleUpdate( $own_hash, "last_exec_cmd", $ecec, 1 )
if $ecec ne '';
}
else {
@@ -2485,11 +2717,11 @@ sub MSwitch_Notify($$) {
# variabelersetzung
$cs =~ s/\$NAME/$own_hash->{helper}{eventfrom}/;
$cs =~ s/\$SELF/$ownName/;
- if ( AttrVal( $ownName, 'MSwitch_RandomNumber', '' ) ne '' ) {
+ if ( $attrrandomnumber ne '' ) {
MSwitch_Createnumber($own_hash);
}
MSwitch_LOG( $ownName, 6, "$ownName: Befehlsausführung -> " . $cs );
- if ( AttrVal( $ownName, 'MSwitch_Debug', "0" ) ne '2' ) {
+ if ( $debugmode ne '2' ) {
my $errors = AnalyzeCommandChain( undef, $cs );
}
@@ -2508,6 +2740,8 @@ sub MSwitch_fhemwebFn($$$$) {
my $jsvarset = '';
my $j1 = '';
my $border = 0;
+
+ return if ( AttrVal( $Name, 'MSwitch_Mode', "Full" ) eq 'Dummy' );
if ( AttrVal( $Name, 'MSwitch_Debug', "0" ) eq '4' ) {
$border = 0;
@@ -2718,6 +2952,7 @@ sub MSwitch_fhemwebFn($$$$) {
my $cs = "";
my %cmdsatz; # ablage desbefehlssatzes jedes devices
my $globalon = 'off';
+ my $globalon1 = 'off';
if ( ReadingsVal( $Name, 'Trigger_device', 'no_trigger' ) eq 'no_trigger' )
{
@@ -2729,19 +2964,32 @@ sub MSwitch_fhemwebFn($$$$) {
}
if ( AttrVal( $Name, 'MSwitch_Expert', "0" ) eq '1' ) {
- if ( ReadingsVal( $Name, 'Trigger_device', 'no_trigger' ) eq
- 'all_events' )
+
+ if ( ReadingsVal( $Name, 'Trigger_device', 'no_trigger' ) eq 'all_events' )
{
- $triggerdevices .=
-"";
+ $triggerdevices .="";
$globalon = 'on';
}
- else {
+ else
+ {
$triggerdevices .= "";
}
+
+
}
- my @notype = split( / /, AttrVal( $Name, 'MSwitch_Ignore_Types', "" ) );
+
+
+ if ( ReadingsVal( $Name, 'Trigger_device', 'no_trigger' ) eq 'MSwitch_Self' )
+ {
+ $triggerdevices .="";
+
+ }
+ else
+ {
+ $triggerdevices .= "";
+ }
+
my $affecteddevices = ReadingsVal( $Name, '.Device_Affected', 'no_device' );
# affected devices to hash
@@ -2762,11 +3010,6 @@ sub MSwitch_fhemwebFn($$$$) {
my @testid = split( /#\[NF\]/, $_ );
my $x = 0;
- #foreach (@testid)
- #{
- #MSwitch_LOG( $Name, 0, "devfelder $x -> $testid[$x]");
- #$x++;
- #}
MSwitch_LOG( $Name, 5, "devfelder @testid" );
my $id = $testid[13];
MSwitch_LOG( $Name, 5, "id $id" );
@@ -2795,11 +3038,6 @@ sub MSwitch_fhemwebFn($$$$) {
my @testid = split( /#\[NF\]/, $_ );
my $x = 0;
- #foreach (@testid)
- #{
- #MSwitch_LOG( $Name, 0, "devfelder $x -> $testid[$x]");
- #$x++;
- #}
MSwitch_LOG( $Name, 5, "devfelder @testid" );
my $id = $testid[18];
MSwitch_LOG( $Name, 5, "id $id" );
@@ -2833,7 +3071,101 @@ sub MSwitch_fhemwebFn($$$$) {
$usedevices{$a} = 'on';
}
- LOOP9: for my $name ( sort keys %defs ) {
+
+ my $notype = AttrVal( $Name, 'MSwitch_Ignore_Types', "" ) ;
+ my @found_devices;
+ my $setpattern = "";
+ my $setpattern1 = "";
+
+
+
+ ###### ersetzung ATTR oder READING
+ if ($notype =~ /(.*)\[(ATTR|READING):(.*):(.*)\](.*)/)
+ {
+ my $devname = $3;
+ my $firstpart = $1;
+ my $lastpart = $5;
+ my $readname = $4;
+ my $type = $2;
+
+ $devname =~ s/\$SELF/$Name/;
+
+ my $magic = ".*";
+ $magic = AttrVal( $devname, $readname, ".*" ) if $type eq "ATTR";
+ $magic = ReadingsVal( $devname, $readname, '.*' ) if $type eq "READING";
+
+ $notype =$firstpart.$magic.$lastpart;
+
+ }
+
+ if ($notype =~ /(")(.*)(")/)
+ {
+
+
+ my $reg =$2;
+ if ($reg =~ /(.*?)(s)(!=|=)([a-zA-Z]{1,10})(:?)(.*)/)
+ {
+ $reg = $1.$5.$6;
+ $setpattern1 = $4;
+ $setpattern = "=~" if ($3 eq "=");
+ $setpattern = "!=" if ($3 eq "!=");
+
+ chop $reg if $6 eq "";
+ $reg =~ s/::/:/g;
+
+
+ }
+
+ @found_devices =devspec2array("$reg");
+ }
+ else
+ {
+ $notype =~ s/ /|/g;
+ @found_devices =devspec2array("TYPE!=$notype");
+ }
+
+ if ($setpattern eq "=~" )
+ {
+ my @found_devices_new;
+ my $re = qr/$setpattern1/;
+ for my $name (@found_devices)
+ {
+ my $cs = "set $name ?";
+ my $errors = AnalyzeCommandChain( undef, $cs );
+ if ($errors =~ /$re/)
+ {
+ push @found_devices_new, $name;
+ }
+ }
+ @found_devices = @found_devices_new;
+ }
+
+
+ if ($setpattern eq "!=" )
+ {
+ my @found_devices_new;
+ my $re = qr/$setpattern1/;
+ for my $name (@found_devices)
+ {
+ my $cs = "set $name ?";
+ my $errors = AnalyzeCommandChain( undef, $cs );
+ if ($errors !~ /$re/)
+ {
+ push @found_devices_new, $name;
+ }
+ }
+ @found_devices = @found_devices_new;
+ }
+
+
+ if (!grep {$_ eq $Name} @found_devices)
+ {
+ MSwitch_LOG( $Name, 5, "grep Devicetest $Name nicht vorhanden -> wird ergänzt" );
+ push @found_devices, $Name;
+ }
+
+
+ LOOP9: for my $name ( sort @found_devices) {
my $selectedtrigger = '';
my $devicealias = AttrVal( $name, 'alias', "" );
my $devicewebcmd =
@@ -2842,9 +3174,6 @@ sub MSwitch_fhemwebFn($$$$) {
my $deviceTYPE = $devicehash->{TYPE};
# triggerfile erzeugen
- foreach (@notype) {
- if ( lc($_) eq lc($deviceTYPE) ) { next LOOP9; }
- }
if ( ReadingsVal( $Name, 'Trigger_device', '' ) eq $name ) {
$selectedtrigger = 'selected=\"selected\"';
@@ -2867,14 +3196,14 @@ sub MSwitch_fhemwebFn($$$$) {
else {
$errors = '';
}
-
+
+
if ( !defined $errors ) { $errors = '' }
my @tmparg = split( /of /, $errors );
if ( !defined $tmparg[1] ) { $tmparg[1] = "" }
- #if ( defined $tmparg[1] && $tmparg[1] ne '' ) { $errors = $tmparg[1]; }
if ( $tmparg[1] ne '' ) {
$errors = $tmparg[1];
}
@@ -3109,13 +3438,15 @@ sub MSwitch_fhemwebFn($$$$) {
if ( !defined( $savedetails{ $aktdevice . '_timeon' } ) ) {
my $key = '';
$key = $aktdevice . "_timeon";
- $savedetails{$key} = '000000';
+ #$savedetails{$key} = '000000'; #change
+ $savedetails{$key} = '00:00:00';
}
if ( !defined( $savedetails{ $aktdevice . '_timeoff' } ) ) {
my $key = '';
$key = $aktdevice . "_timeoff";
- $savedetails{$key} = '000000';
+ #$savedetails{$key} = '000000'; #change
+ $savedetails{$key} = '00:00:00';
}
if ( !defined( $savedetails{ $aktdevice . '_conditionon' } ) ) {
@@ -3884,12 +4215,14 @@ sub MSwitch_fhemwebFn($$$$) {
my $timeoff = '';
my $timeononly = '';
my $timeoffonly = '';
+ my $timeonoffonly = '';
if ( $lenght != 0 ) {
$timeon = substr( $triggertimes[0], 2 );
$timeoff = substr( $triggertimes[1], 3 );
$timeononly = substr( $triggertimes[2], 6 );
$timeoffonly = substr( $triggertimes[3], 7 );
+ $timeonoffonly = substr( $triggertimes[4], 9 );
}
my $ret = '';
@@ -4058,7 +4391,6 @@ sub MSwitch_fhemwebFn($$$$) {
return "$ret" . "$j1";
}
- #readingsSingleUpdate( $hash, ".wrong_version", $1, 0 );
if ( ReadingsVal( $Name, '.wrong_version', 'undef' ) ne "undef" ) {
$ret .= "
@@ -4138,6 +4470,13 @@ sub MSwitch_fhemwebFn($$$$) {
if ( $globalon ne 'on' ) {
$visible = 'collapse';
}
+
+ my $visible1 = 'visible';
+ if ( $globalon1 ne 'on' ) {
+ $visible1 = 'collapse';
+ }
+
+
$ret =
$ret
. "
";
$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 :";
@@ -4206,7 +4549,7 @@ sub MSwitch_fhemwebFn($$$$) {
-
+
switch MSwitch off + execute 'cmd2' at :
+
+
" . $inhalt1 . "
+
+
+
+
+
" . $inhalt6 . "
+
";
+
+
+
my $triggerinhalt = "Trigger condition (events only): ";
if ( AttrVal( $Name, 'MSwitch_Condition_Time', "0" ) eq '1' ) {
@@ -4256,6 +4611,7 @@ sub MSwitch_fhemwebFn($$$$) {
####################
# triggerdetails
my $selectedcheck3 = "";
+ my $SELF = $Name;
my $testlog = ReadingsVal( $Name, 'Trigger_log', 'on' );
if ( $testlog eq 'on' ) {
$selectedcheck3 = "checked=\"checked\"";
@@ -4276,12 +4632,24 @@ sub MSwitch_fhemwebFn($$$$) {
";
$ret .= "
@@ -4654,7 +5052,16 @@ sub MSwitch_fhemwebFn($$$$) {
globallock =' this device is locked !';
[ \"aw_dev\",\"aw_det\",\"aw_trig\",\"aw_md\",\"aw_md1\",\"aw_md2\",\"aw_addevent\"].forEach (lock,);
randomdev.forEach (lock);"
- if ( ReadingsVal( $Name, '.lock', 'undef' ) ne "undef" );
+ if ( ReadingsVal( $Name, '.lock', 'undef' ) eq "1" );
+
+
+ $j1 .= "
+ globallock =' only trigger is changeable';
+ [ \"aw_dev\",\"aw_det\",\"aw_md\",\"aw_md1\",\"aw_md2\",\"aw_addevent\"].forEach (lock,);
+ randomdev.forEach (lock);"
+ if ( ReadingsVal( $Name, '.lock', 'undef' ) eq "2" );
+
+
$j1 .= "
sel1.onchange = function()
@@ -4783,7 +5190,7 @@ sub MSwitch_fhemwebFn($$$$) {
if ( AttrVal( $Name, 'MSwitch_Help', "0" ) eq '1' ) {
- $j1 .= "
+ my $j1raw .= "
function info(from){
text='Help: ' + from +'
';
@@ -4794,17 +5201,50 @@ sub MSwitch_fhemwebFn($$$$) {
if (from == 'timer'){
text = text + 'Hier kann entweder eine direkte Angabe einer Verzögerungszeit (delay with Cond_check) angegeben werden, oder es kann eine Ausführungszeit (at with Cond-check) für den Befehl angegeben werden Bei der Angabe einer Ausführungszeit wird der Schaltbefehl beim nächsten erreichen der angegebenen Zeit ausgeführt. Ist die Zeit am aktuellen Tag bereits überschritten , wird der angegebene Zeitpunkt am Folgetag gesetzt. Die Auswahl \"with Conf-check\" oder \"without Conf-check\" legt fest, ob unmittelbar vor Befehlsausführung nochmals die Condition für den Befehl geprüft wird oder nicht. [NAME.reading] des Devices ->z.B. [dummy.state] Das Reading muss in folgendem Format vorliegen: hh:mm:ss ';}
- if (from == 'trigger'){
- text = text + 'Trigger ist das Gerät, oder die Zeit, auf die das Modul reagiert, um andere devices anzusprechen. Das Gerät kann aus der angebotenen Liste ausgewählt werden, sobald dieses ausgewählt ist werden weitere Optionen angeboten. Soll auf mehrereGerät gleichzeitig getriggert werden , so ist dieses ebenfalls möglich. Hierzu muss das Attribut \"MSwitch_Expert\" auf 1 gesetzt sein und als Auswahl \"GLOBAL\" erfolgen.
Zeitangaben können ebenso als Trigger genutzt werden, das Format muss wie folgt lauten:
[STUNDEN:MINUTEN|TAGE] - Tage werden von 1-7 gezählt, wobei 1 für Montag steht, 7 für Sonntag.
Die Variable \$we ist anstatt der Tagesangabe verwendbar [STUNDEN:MINUTEN|\$we] - Schaltvorgang nur an Wochenenden. [STUNDEN:MINUTEN|!\$we] - Schaltvorgang nur an Werktagen.
Mehrere Zeitvorgaben können aneinandergereiht werden. [17:00|1][18:30|23] würde den Trigger Montags um 17 Uhr auslösen und Dienstags,Mittwochs um 18 Uhr 30.
Sunset - Zeitangaben können mit folgender Sytax eingebunden werden: z.B [{sunset()}] , [{sunrise(+1800)}].
Es ist eine gleichzeitige Nutzung für Trigger durch Zeitangaben und Trigger durch Deviceevents möglich.
Sonderformate: [?20:00-21:00|5] - Zufälliger Schaltvorgang zwischen 20 Uhr und 21 Uhr am Freitag [00:02*04:10-06:30] - Schaltvorgang alle 2 Minuten zwischen 4.10 Uhr und 6.30 Uhr';}
+if (from == 'trigger')
+{
+ text = text + '
+Trigger ist das Gerät, oder die Zeit, auf die das Modul reagiert, um andere Devices anzusprechen. Das Gerät kann aus der angebotenen Liste ausgewählt werden, sobald dieses ausgewählt ist werden weitere Optionen angeboten. Soll auf mehrereGerät gleichzeitig getriggert werden , so ist dieses ebenfalls möglich. Hierzu muss das Attribut \"MSwitch_Expert\" auf 1 gesetzt sein und als Auswahl \"GLOBAL\" erfolgen.
Zeitangaben können ebenso als Trigger genutzt werden, das Format muss wie folgt lauten:
+Hierfür stehen folgende Optionen zur Verfügung:
+
+1. switch MSwitch on + execute \\'cmd1\\' at
+das komplette Device wird auf \"on\" geschaltet. Der Zweig \"cmd1\" wird in
+allen \"device actions\" ausgeführt.
+
+2. switch MSwitch off + execute \\'cmd2\\' at
+das komplette Device wird auf \"off\" geschaltet. Der Zweig \"cmd2\" wird in
+allen \"device actions\" ausgeführt.
+
+3. execute \\'cmd1\\' only at
+es werden alle \"cmd1\" Zweige aller \"device actions\" ausgeführt
+
+4. execute \\'cmd2\\' only at
+es werden alle \"cmd2\" Zweige aller \"device actions\" ausgeführt
+
+5. execute \\'cmd1+cmd2\\' only at
+es werden alle \"cmd1\" und \"cmd2\" Zweige aller \"device actions\" ausgeführt
+
+Die Syntax muss wie folgt lauten: [STUNDEN:MINUTEN|TAGE|IDx,y]
+Tage werden von 1-7 gezählt, wobei 1 für Montag steht, 7 für Sonntag.
+Die Angabe der ID ist optional. Wenn eine ID angegeben ist , werden nur
+\\'cmds\\' ausgeführt, denen eine ID zugewiesen ist. Ist keine ID angegeben ,
+werden nur alle \\'cmds\\' ausgeführt , denen keine ID zugewiesen ist .
+Diese Option ist nur in den Feldern \"execute cmd1 only at :\" , \"execute cmd2 only at :\"
+und \"execute \\'cmd1+cmd2\\' only at:\" möglich.
Die Variable \$we ist anstatt der Tagesangabe verwendbar [STUNDEN:MINUTEN|\$we] - Schaltvorgang nur an Wochenenden. [STUNDEN:MINUTEN|!\$we] - Schaltvorgang nur an Werktagen.
Mehrere Zeitvorgaben können aneinandergereiht werden. [17:00|1][18:30|23] würde den Trigger Montags um 17 Uhr auslösen und Dienstags,Mittwochs um 18 Uhr 30.
Sunset - Zeitangaben können mit folgender Sytax eingebunden werden: z.B:
+ [{sunset()}] , [{sunrise(+1800)}].
Es ist eine gleichzeitige Nutzung für Trigger durch Zeitangaben und Trigger durch Deviceevents möglich.
+Sonderformate: [?20:00-21:00|5] - Zufälliger Schaltvorgang zwischen 20 Uhr und 21 Uhr am Freitag [00:02*04:10-06:30] - Schaltvorgang alle 2 Minuten zwischen 4.10 Uhr und 6.30 Uhr
+
+ '
+;}
if (from == 'triggercondition'){
- text = text + 'Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfuellt sein müssen. Diese Bedingunge sind eng an DOIF- Bedingungen angelehnt . Zeitabhängigkeit: [19.10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum Readingabhängige Trigger [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq \"x\" - Trigger des Devicec erfolgt nur bei erfüllter Bedingung. Achtung ! Bei der Abfrage von Readings nach Strings ( on,off,etc. ) ist statt \"=\" \"eq\" zu nutzen und der String muss in \"\" gesetzt werden! Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich. [19.10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein [19.10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein. Es ist auf korrekte Eingabe der Leerzeichen zu achten.
sunset - Bedingungen werden mit zusätzlichen {} eingefügt z.B. : [{ sunset() }-23:00].
Variable \$we: Die globlae Variable \$we ist nutzbar und muss in {} gesetzt werden . { !\$we } löst den Schaltvorgang nur Werktagen an aus { \$we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangsbe gemacht werden und durch z.B. |135 ergänzt werden. [10:00-11:00|13] würde den Schaltvorgang z.B nur Montag und Mitwoch zwischen 10 uhr und 11 uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag. Achtung: Bei Anwendung der geschweiften Klammern zur einletung eines Perlasdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten ! Überschreitet die Zeitangabe die Tagesgrenze (24.00 Uhr ), so gelten die angegebenen Tage noch bis zum ende der angegebenen Schaltzeit, d.H. es würde auch am Mitwoch noch der schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde.
Wird in diesem Feld keine Angabe gemacht , so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.
Achtung: Conditions gelten nur für auslösende Trigger eines Devices und habe keinen Einfluss auf zeitgesteuerte Auslöser. Um Zeitgesteuerte Auslösr ebenfalls an Bedingungen zu Knüpfen muss dieses in den Attributen aktiviert werden.';}
+ text = text + 'Hier kann die Angabe von Bedingungen erfolgen, die zusätzlich zu dem triggernden Device erfuellt sein müssen. Diese Bedingunge sind eng an DOIF- Bedingungen angelehnt . Zeitabhängigkeit: [19:10-23:00] - Trigger des Devices erfolgt nur in angegebenem Zeitraum Readingabhängige Trigger [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq \"x\" - Trigger des Devicec erfolgt nur bei erfüllter Bedingung. Achtung ! Bei der Abfrage von Readings nach Strings ( on,off,etc. ) ist statt \"=\" \"eq\" zu nutzen und der String muss in \"\" gesetzt werden! Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich. [19.10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein [19.10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein. Es ist auf korrekte Eingabe der Leerzeichen zu achten.
sunset - Bedingungen werden mit zusätzlichen {} eingefügt z.B. : [{ sunset() }-23:00].
Variable \$we: Die globlae Variable \$we ist nutzbar und muss in {} gesetzt werden . { !\$we } löst den Schaltvorgang nur Werktagen an aus { \$we } löst den Schaltvorgang nur an Wochenenden, Feiertagen aus
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangsbe gemacht werden und durch z.B. |135 ergänzt werden. [10:00-11:00|13] würde den Schaltvorgang z.B nur Montag und Mitwoch zwischen 10 uhr und 11 uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag. Achtung: Bei Anwendung der geschweiften Klammern zur einletung eines Perlasdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten ! Überschreitet die Zeitangabe die Tagesgrenze (24.00 Uhr ), so gelten die angegebenen Tage noch bis zum ende der angegebenen Schaltzeit, d.H. es würde auch am Mitwoch noch der schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde.
Wird in diesem Feld keine Angabe gemacht , so erfolgt der Schaltvorgang nur durch das triggernde Device ohne weitere Bedingungen.
Achtung: Conditions gelten nur für auslösende Trigger eines Devices und habe keinen Einfluss auf zeitgesteuerte Auslöser. Um Zeitgesteuerte Auslösr ebenfalls an Bedingungen zu Knüpfen muss dieses in den Attributen aktiviert werden.';}
if (from == 'whitelist'){
text = text + 'Bei der Auswahl \\\'GLOBAL\\\' als Triggerevent werde alle von Fhem erzeugten Events an dieses Device weitergeleitet. Dieses kann eine erhöhte Systemlast erzeugen. In dem Feld \\\'Trigger Device Global Whitelist:\\\' kann dieses eingeschränkt werden , indem Devices oder Module benannt werden , deren Events Berücksichtigt werden. Sobald hier ein Eintrag erfolgt , werden nur noch Diese berücksichtigt , gibt es keinen Eintrag , werden alle berücksichtigt ( Whitelist ). Format: Die einzelnen Angaben müssen durch Komma getrennt werden .
Mögliche Angaben : Modultypen: TYPE=CUL_HM Devicenamen: NAME
';}
if (from == 'addevent'){
- text = text + 'Hier können manuell Events zugefügt werden , die in den Auswahllisten verfügbar sein sollen und auf die das Modul reagiert. Grundsätzlich ist zu unterscheiden , ob das Device im Normal-, oder Globalmode betrieben wird Im Normalmode bestehen die Events aus 2 Teilen , dem Reading und dem Wert \"state:on\" Wenn sich das Device im GLOBAL Mode befindet müssen die Events aus 3 Teilen bestehen , dem Devicename, dem Reading und dem Wert \"device:state:on\". Wird hier nur ein \"*\" angegeben , reagiert der entsprechende Zweig auf alle eingehenden Events. Weitherhin sind folgende Syntaxmöglichkeiten vorgesehen : device:state:*, device:*:*, *:state:* , etc. Der Wert kann mehrere Auswahlmöglichkeiten haben , durch folgende Syntax: \"device:state:(on/off)\". In diesem Fal reagiert der Zweig sowohl auf den Wert on, als auch auf off.
Es können mehrere Evebts gleichzeitig angelegt werden . Diese sind durch Komma zu trennen .
Seit V1.7 kann hier die gängige RegEx-Formulierung erfolgen.';}
+ text = text + 'Hier können manuell Events zugefügt werden , die in den Auswahllisten verfügbar sein sollen und auf die das Modul reagiert. Grundsätzlich ist zu unterscheiden , ob das Device im Normal-, oder Globalmode betrieben wird Im Normalmode bestehen die Events aus 2 Teilen , dem Reading und dem Wert \"state:on\" Wenn sich das Device im GLOBAL Mode befindet müssen die Events aus 3 Teilen bestehen , dem Devicename, dem Reading und dem Wert \"device:state:on\". Wird hier nur ein \"*\" angegeben , reagiert der entsprechende Zweig auf alle eingehenden Events. Weitherhin sind folgende Syntaxmöglichkeiten vorgesehen : device:state:*, device:*:*, *:state:* , etc. Der Wert kann mehrere Auswahlmöglichkeiten haben , durch folgende Syntax: \"device:state:(on/off)\". In diesem Fal reagiert der Zweig sowohl auf den Wert on, als auch auf off.
Es können mehrere Evebts gleichzeitig angelegt werden . Diese sind durch Leerzeichen zu trennen .
Seit V1.7 kann hier die gängige RegEx-Formulierung erfolgen.';}
if (from == 'condition'){
text = text + 'Hier kann die Angabe von Bedingungen erfolgen, die erfüllt sein müssen um den Schaltbefehl auszuführen. Diese Bedingunge sind eng an DOIF- Bedingungen angelehnt.
Zeitabhängiges schalten: [19.10-23:00] - Schaltbefehl erfolgt nur in angegebenem Zeitraum Readingabhängiges schalten [Devicename:Reading] =/>/< X oder [Devicename:Reading] eq \"x\" - Schaltbefehl erfolgt nur bei erfüllter Bedingung. Achtung! Bei der Abfrage von Readings nach Strings ( on,off,etc. ) ist statt \"=\" \"eq\" zu nutzen und der String muss in \"x\" gesetzt werden! Die Kombination mehrerer Bedingungen und Zeiten ist durch AND oder OR möglich: [19.10-23:00] AND [Devicename:Reading] = 10 - beide Bedingungen müssen erfüllt sein [19.10-23:00] OR [Devicename:Reading] = 10 - eine der Bedingungen muss erfüllt sein. Es ist auf korrekte Eingabe der Leerzeichen zu achten.
sunset - Bedingungen werden mit zusätzlichen {} eingefügt z.B. : [{ sunset() }-23:00].
Variable \$we: Die globlae Variable \$we ist nutzbar und muss {} gesetzt werden . { !\$we } löst den Schaltvorgang nur Werktagen aus { \$we } löst den Schaltvorgang nur Wochenenden, Feiertagen aus
Soll nur an bestimmten Wochentagen geschaltet werden, muss eine Zeitangsbe gemacht werden und durch z.B. |135 ergänzt werden. [10:00-11:00|13] würde den Schaltvorgang z.B nur Montag und Mitwoch zwischen 10 uhr und 11 uhr auslösen. Hierbei zählen die Wochentage von 1-7 für Montag-Sonntag. Achtung: Bei Anwendung der geschweiften Klammern zur einletung eines Perlasdrucks ist unbedingt auf die Leerzeichen hinter und vor der Klammer zu achten ! Überschreitet die Zeitangabe die Tagesgrenze (24.00 Uhr ), so gelten die angegebenen Tage noch bis zum ende der angegebenen Schaltzeit , d.H. es würde auch am Mitwoch noch der schaltvorgang erfolgen, obwohl als Tagesvorgabe Dienstag gesetzt wurde.
\$EVENT Variable: Die Variable EVENT enthält den auslösenden Trigger, d.H. es kann eine Reaktion in direkter Abhängigkeit zum auslösenden Trigger erfolgen. [\$EVENT] eq \"state:on\" würde den Kommandozweig nur dann ausführen, wenn der auslösende Trigger \"state:on\" war. Wichtig ist dieses, wenn bei den Triggerdetails nicht schon auf ein bestimmtes Event getriggert wird, sondern hier durch die Nutzung eines wildcards (*) auf alle Events getriggert wird, oder auf alle Events eines Readings z.B. (state:*)
Bei eingestellter Delayfunktion werden die Bedingungen je nach Einstellung sofort,verzögert oder sowohl-als-auch überprüft, d.H hiermit sind verzögerte Ein-, und Ausschaltbefehle möglich die z.B Nachlauffunktionen oder verzögerte Einschaltfunktionen ermöglichen, die sich selbst überprüfen. z.B. [wenn Licht im Bad an -> schalte Lüfter 2 Min später an -> nur wenn Licht im Bad noch an ist]