2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-04 05:16:45 +00:00

98_Weekdaytimer, 98_Heating_Control: implemented changes to allow switchingtimes of the form: So-Sa|{fhem("get Tageslicht ss_weather")}|on - the time now can contain spaces. Verbose 4,5 now logs detailed information of the parsing process.

git-svn-id: https://svn.fhem.de/fhem/trunk@10392 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
dietmar63 2016-01-06 21:19:15 +00:00
parent a27ca82007
commit 4a5306d13c

View File

@ -141,7 +141,11 @@ sub WeekdayTimer_Define($$) {
WeekdayTimer_GlobalDaylistSpec ($hash, \@a); WeekdayTimer_GlobalDaylistSpec ($hash, \@a);
my @switchingtimes = WeekdayTimer_gatherSwitchingTimes (\@a); $hash->{TYPE} = $type;
$hash->{NAME} = $name;
$hash->{DEVICE} = $device;
my @switchingtimes = WeekdayTimer_gatherSwitchingTimes ($hash, \@a);
my $conditionOrCommand = join (" ", @a); my $conditionOrCommand = join (" ", @a);
# test if device is defined # test if device is defined
@ -150,9 +154,6 @@ sub WeekdayTimer_Define($$) {
# wenn keine switchintime angegeben ist, dann Fehler # wenn keine switchintime angegeben ist, dann Fehler
Log3 ($hash, 3, "[$name] no valid Switchingtime found in <$conditionOrCommand>, check first parameter") if (@switchingtimes == 0); Log3 ($hash, 3, "[$name] no valid Switchingtime found in <$conditionOrCommand>, check first parameter") if (@switchingtimes == 0);
$hash->{TYPE} = $type;
$hash->{NAME} = $name;
$hash->{DEVICE} = $device;
$hash->{STILLDONETIME} = 0; $hash->{STILLDONETIME} = 0;
$hash->{SWITCHINGTIMES} = \@switchingtimes; $hash->{SWITCHINGTIMES} = \@switchingtimes;
$attr{$name}{verbose} = 5 if (!defined $attr{$name}{verbose} && $name =~ m/^tst.*/ ); $attr{$name}{verbose} = 5 if (!defined $attr{$name}{verbose} && $name =~ m/^tst.*/ );
@ -160,6 +161,7 @@ sub WeekdayTimer_Define($$) {
$modules{$hash->{TYPE}}{defptr}{$hash->{NAME}} = $hash; $modules{$hash->{TYPE}}{defptr}{$hash->{NAME}} = $hash;
$hash->{CONDITION} = ""; $hash->{COMMAND} = "";
if($conditionOrCommand =~ m/^\(.*\)$/g) { #condition (*) if($conditionOrCommand =~ m/^\(.*\)$/g) { #condition (*)
$hash->{CONDITION} = $conditionOrCommand; $hash->{CONDITION} = $conditionOrCommand;
} elsif(length($conditionOrCommand) > 0 ) { } elsif(length($conditionOrCommand) > 0 ) {
@ -402,8 +404,10 @@ sub WeekdayTimer_zeitErmitteln ($$$$$) {
} }
################################################################################ ################################################################################
sub WeekdayTimer_gatherSwitchingTimes { sub WeekdayTimer_gatherSwitchingTimes {
my $hash = shift;
my $a = shift; my $a = shift;
my $name = $hash->{NAME};
my @switchingtimes = (); my @switchingtimes = ();
my $conditionOrCommand; my $conditionOrCommand;
@ -411,13 +415,46 @@ sub WeekdayTimer_gatherSwitchingTimes {
while (@$a > 0) { while (@$a > 0) {
#pruefen auf Angabe eines Schaltpunktes #pruefen auf Angabe eines Schaltpunktes
my $element = shift @$a; my $element = "";
my @restoreElemets = ();
E: while (@$a > 0) {
my $actualElement = shift @$a;
push @restoreElemets, $actualElement;
$element = $element . $actualElement . " ";
Log3 $hash, 5, "[$name] $element - trying to accept as a switchtime";
# prüfen ob Anführungszeichen paarig sind
my @quotes = ('"', "'" );
foreach my $quote (@quotes){
my $balancedSign = eval "((\$element =~ tr/$quote//))";
if ($balancedSign % 2) { # ungerade Anzahl quotes, dann verlängern
Log3 $hash, 5, "[$name] $element - unbalanced quotes: $balancedSign $quote found";
next E;
}
}
# prüfen ob öffnende/schliessende Klammern paarig sind
my %signs = ('('=>')', '{'=>'}');
foreach my $signOpened (keys(%signs)) {
my $signClosed = $signs{$signOpened};
my $balancedSign = eval "((\$element =~ tr/$signOpened//) - (\$element =~ tr/$signClosed//))";
if ($balancedSign) { # öffnende/schließende Klammern nicht gleich, dann verlängern
Log3 $hash, 5, "[$name] $element - unbalanced brackets $signOpened$signClosed:$balancedSign";
next E;
}
}
last;
}
my @t = split(/\|/, $element); my @t = split(/\|/, $element);
my $anzahl = @t; my $anzahl = @t;
if ( $anzahl >= 2 && $anzahl <= 3) { if ( $anzahl >= 2 && $anzahl <= 3) {
Log3 $hash, 4, "[$name] $element - accepted";
push(@switchingtimes, $element); push(@switchingtimes, $element);
} else { } else {
unshift @$a, $element; Log3 $hash, 4, "[$name] $element - NOT accepted, must be command or condition";
unshift @$a, @restoreElemets;
last; last;
} }
} }
@ -550,6 +587,8 @@ sub WeekdayTimer_SetTimer($) {
readingsSingleUpdate ($hash, "nextUpdate", FmtDateTime($nextTime), 1); readingsSingleUpdate ($hash, "nextUpdate", FmtDateTime($nextTime), 1);
readingsSingleUpdate ($hash, "nextValue", $nextParameter, 1); readingsSingleUpdate ($hash, "nextValue", $nextParameter, 1);
readingsSingleUpdate ($hash, "currValue", $aktParameter, 1); # HB
if ($switchInThePast) { if ($switchInThePast) {
# Fensterkontakte abfragen - wenn einer im Status closed, dann Schaltung um 60 Sekunden verzögern # Fensterkontakte abfragen - wenn einer im Status closed, dann Schaltung um 60 Sekunden verzögern
@ -559,7 +598,7 @@ sub WeekdayTimer_SetTimer($) {
myInternalTimer ("$aktIdx", $aktTime, "$hash->{TYPE}_Update", $hash, 0); myInternalTimer ("$aktIdx", $aktTime, "$hash->{TYPE}_Update", $hash, 0);
my $active = 1; my $active = 1;
if (defined $hash->{CONDITION}) { if ($hash->{CONDITION} gt "") {
$active = AnalyzeCommandChain(undef, "{".$hash->{CONDITION}."}"); $active = AnalyzeCommandChain(undef, "{".$hash->{CONDITION}."}");
} }
readingsSingleUpdate ($hash, "state", $aktParameter, 1) if ($active); readingsSingleUpdate ($hash, "state", $aktParameter, 1) if ($active);
@ -677,6 +716,7 @@ sub WeekdayTimer_Update($) {
readingsBeginUpdate($hash); readingsBeginUpdate($hash);
readingsBulkUpdate ($hash, "nextUpdate", FmtDateTime($nextTime)); readingsBulkUpdate ($hash, "nextUpdate", FmtDateTime($nextTime));
readingsBulkUpdate ($hash, "nextValue", $nextParameter); readingsBulkUpdate ($hash, "nextValue", $nextParameter);
readingsBulkUpdate ($hash, "currValue", $aktParameter); # HB
readingsBulkUpdate ($hash, "state", $newParam ) if($activeTimer); readingsBulkUpdate ($hash, "state", $newParam ) if($activeTimer);
readingsEndUpdate ($hash, defined($hash->{LOCAL} ? 0 : 1)); readingsEndUpdate ($hash, defined($hash->{LOCAL} ? 0 : 1));
@ -758,12 +798,12 @@ sub WeekdayTimer_FensterOffen ($$$) {
'%WEEKDAYTIMER' => $hash->{NAME}, '%WEEKDAYTIMER' => $hash->{NAME},
'%NAME' => $hash->{DEVICE}, '%NAME' => $hash->{DEVICE},
'%EVENT' => $event, '%EVENT' => $event,
'%TIME' => $time, '%TIME' => $hash->{profil}{$time}{TIME},
'$HEATING_CONTROL' => $hash->{NAME}, '$HEATING_CONTROL' => $hash->{NAME},
'$WEEKDAYTIMER' => $hash->{NAME}, '$WEEKDAYTIMER' => $hash->{NAME},
'$NAME' => $hash->{DEVICE}, '$NAME' => $hash->{DEVICE},
'$EVENT' => $event, '$EVENT' => $event,
'$TIME' => $time, '$TIME' => $hash->{profil}{$time}{TIME},
); );
my $verzoegerteAusfuehrungCond = AttrVal($hash->{NAME}, "delayedExecutionCond", "0"); my $verzoegerteAusfuehrungCond = AttrVal($hash->{NAME}, "delayedExecutionCond", "0");
@ -861,7 +901,7 @@ sub WeekdayTimer_Device_Schalten($$$) {
my $setModifier = WeekdayTimer_isHeizung($hash); my $setModifier = WeekdayTimer_isHeizung($hash);
$command = 'set $NAME ' . $setModifier . ' $EVENT'; $command = 'set $NAME ' . $setModifier . ' $EVENT';
$command = $hash->{COMMAND} if (defined $hash->{COMMAND}); $command = $hash->{COMMAND} if ($hash->{COMMAND} gt "");
my $activeTimer = 1; my $activeTimer = 1;
@ -902,7 +942,7 @@ sub WeekdayTimer_Condition($$) {
my ($hash, $tage) = @_; my ($hash, $tage) = @_;
my $condition = "( "; my $condition = "( ";
$condition .= (defined $hash->{CONDITION}) ? $hash->{CONDITION} : 1 ; $condition .= ($hash->{CONDITION} gt "") ? $hash->{CONDITION} : 1 ;
$condition .= " && " . WeekdayTimer_TageAsCondition($tage); $condition .= " && " . WeekdayTimer_TageAsCondition($tage);
$condition .= ")"; $condition .= ")";