98_WeekdayTimer, 98_Heating_Control:

a new version to get correct "state" "nextValue" "nextUpdate"

git-svn-id: https://svn.fhem.de/fhem/trunk@8490 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
dietmar63 2015-04-27 19:38:31 +00:00
parent 50a38842ea
commit d6f1fa9276
2 changed files with 89 additions and 54 deletions

View File

@ -90,16 +90,10 @@ sub Heating_Control_SetTimerOfDay($) {
return WeekdayTimer_SetTimerOfDay($hash);
}
########################################################################
sub Heating_Control_Attr($$$) {
sub Heating_Control_Attr($$$$) {
my ($cmd, $name, $attrName, $attrVal) = @_;
my $hash = $defs{$name};
if( $attrName eq "disable" ) {
readingsSingleUpdate ($hash, "disabled", $attrVal, 1);
} elsif ( $attrName eq "switchInThePast" ) {
$attr{$name}{$attrName} = $attrVal;
Heating_Control_SetTimerOfDay({ HASH => $hash});
}
WeekdayTimer_Attr($cmd, $name, $attrName, $attrVal);
return undef;
}
########################################################################

View File

@ -155,6 +155,7 @@ sub WeekdayTimer_Define($$) {
$hash->{DEVICE} = $device;
$hash->{SWITCHINGTIMES} = \@switchingtimes;
$attr{$name}{verbose} = 4 if ($name =~ m/^tst.*/ );
#$attr{$name}{verbose} = 4;
$modules{$hash->{TYPE}}{defptr}{$hash->{NAME}} = $hash;
@ -227,6 +228,7 @@ sub WeekdayTimer_Profile($) {
Log3 $hash, 4, "[$hash->{NAME}] $profiltext ($profilKey)";
}
# Log 3, $hash->{NAME} ."--->\n". Dumper $hash->{profile};
# für logProxy umhaengen
$hash->{helper}{SWITCHINGTIME} = $hash->{profile};
delete $hash->{profile};
@ -449,20 +451,19 @@ sub WeekdayTimer_SetTimerOfDay($) {
WeekdayTimer_SetTimerForMidnightUpdate( { HASH => $hash} );
}
################################################################################
sub WeekdayTimer_SetTimer($) {
my $hash = shift;
my $name = $hash->{NAME};
my $now = time();
my $switchedInThePast = 0;
my $switchInThePast = AttrVal($name, "switchInThePast", 0);
my $isHeating = WeekdayTimer_isHeizung($hash);
my $grenzSeconds = $isHeating || $switchInThePast ? -24*3600 : -5;
my $switchInThePast = AttrVal($name, "switchInThePast", 0);
Log3 $hash, 4, "[$name] Heating recognized - switch in the past activated" if ($isHeating);
Log3 $hash, 4, "[$name] no switch in the yesterdays because of the devices type($hash->{DEVICE} is not recognized as heating) - use attr switchInThePast" if (!($isHeating || $switchInThePast));
$switchInThePast = $switchInThePast || $isHeating;
my @switches = sort keys %{$hash->{profil}};
if ($#switches < 0) {
@ -470,42 +471,80 @@ sub WeekdayTimer_SetTimer($) {
return;
}
my $nextSwitch = $switches[0];
my $nextPara = $hash->{profil}{$switches[0]}{PARA};
readingsSingleUpdate ($hash, "state", "inactive", 1);
my @reverseSwitches = ((reverse @switches), $switches[$#switches]);
for(my $i=0; $i<=$#reverseSwitches; $i++) {
my $time = $reverseSwitches[$i];
$hash->{profil}{$time}{NEXTPARA} = $nextPara;
$hash->{profil}{$time}{NEXTSWITCH} = $nextSwitch;
for(my $i=0; $i<=$#switches; $i++) {
my $time = $switches[$i];
my $timToSwitch = $hash->{profil}{$time}{TIM};
my $tage = $hash->{profil}{$time}{TAGE};
$nextPara = $hash->{profil}{$time}{PARA};
$nextSwitch = $time;
my $para = $hash->{profil}{$time}{PARA};
my $switch = $time;
$timToSwitch -= 24*3600 if ($i == $#reverseSwitches);
my $secondsToSwitch = $timToSwitch - $now;
my $isActiveTimer = WeekdayTimer_isAnActiveTimer ($hash, $tage, $nextPara);
if ($secondsToSwitch>$grenzSeconds && !$switchedInThePast) {
if ($secondsToSwitch>0 || $isActiveTimer) {
Log3 $hash, 4, "[$name]:setTimer - timer seems to be active today: ".join("",@$tage)."|$time|$nextPara" if($isActiveTimer);
myInternalTimer ("$time", $timToSwitch, "$hash->{TYPE}_Update", $hash, 0);
my ($stunde, $minute, $sekunde) = split (":",$nextSwitch);
my $epoch = WeekdayTimer_zeitErmitteln ($now, $stunde, $minute, $sekunde, 0);
readingsSingleUpdate ($hash, "nextUpdate", FmtDateTime($epoch), 1);
readingsSingleUpdate ($hash, "nextValue", $nextPara, 1);
my $isActiveTimer = WeekdayTimer_isAnActiveTimer ($hash, $tage, $para);
readingsSingleUpdate ($hash, "state", "active", 1) if ($isActiveTimer);
};
$switchedInThePast = ($secondsToSwitch<0 && $isActiveTimer) ;
if ($secondsToSwitch>-5) {
Log3 $hash, 4, "[$name]:setTimer - timer seems to be active today: ".join("",@$tage)."|$time|$para" if($isActiveTimer);
myInternalTimer ("$time", $timToSwitch, "$hash->{TYPE}_Update", $hash, 0);
}
}
my ($aktTime,$aktParameter,$nextTime,$nextParameter) = WeekdayTimer_searchAktNext($hash, time()+5);
readingsSingleUpdate ($hash, "nextUpdate", FmtDateTime($nextTime), 1);
readingsSingleUpdate ($hash, "nextValue", $nextParameter, 1);
if ($switchInThePast) {
WeekdayTimer_Device_Schalten($hash, $aktParameter, [7,8]);
my $active = 1;
if (defined $hash->{CONDITION}) {
$active = AnalyzeCommandChain(undef, "{".$hash->{CONDITION}."}");
}
readingsSingleUpdate ($hash, "state", $aktParameter, 1) if ($active);
}
}
################################################################################
sub WeekdayTimer_searchAktNext($$) {
my ($hash, $now) = @_;
my $name = $hash->{NAME};
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($now);
#Log3 $hash, 3, "[$name] such--->".FmtDateTime($now);
my ($nextTag, $nextTime, $nextParameter);
my ($aktTag, $aktTime, $aktParameter);
my @realativeWdays = ($wday..6,0..$wday-1,$wday..6,0..6);
#Log3 $hash, 3, "[$name] wdays @realativeWdays";
for (my $i=0;$i<=$#realativeWdays;$i++) {
my $relativeDay = $i-7;
my $relWday = $realativeWdays[$i];
#Log3 $hash, 3, "[$name] $i relWday $relWday $relativeDay";
foreach my $time (sort keys %{$hash->{helper}{SWITCHINGTIME}{$relWday}}) {
my ($stunde, $minute, $sekunde) = split (":",$time);
my $epoch = WeekdayTimer_zeitErmitteln ($now, $stunde, $minute, $sekunde, $relativeDay);
#Log3 $hash, 3, "[$name] $time $time---->".FmtDateTime($epoch);
if ($epoch >= $now) {
$nextTag = $relWday;
$nextTime = $epoch;
$nextParameter = $hash->{helper}{SWITCHINGTIME}{$relWday}{$time};
Log3 $hash, 4, "[$name] $aktTag aktTime, aktParameter ".FmtDateTime($aktTime) . " -->> $aktParameter";
Log3 $hash, 4, "[$name] $nextTag nextTime, nextParameter ".FmtDateTime($nextTime). " -->> $nextParameter";
return ($aktTime, $aktParameter, $nextTime, $nextParameter);
}
$aktTag = $relWday;
$aktTime = $epoch;
$aktParameter = $hash->{helper}{SWITCHINGTIME}{$relWday}{$time};
}
}
return (undef,undef,undef,undef);
}
################################################################################
sub WeekdayTimer_DeleteTimer($) {
@ -525,8 +564,6 @@ sub WeekdayTimer_Update($) {
# Schaltparameter ermitteln
my $tage = $hash->{profil}{$time}{TAGE};
my $newParam = $hash->{profil}{$time}{PARA};
my $nextSwitch = $hash->{profil}{$time}{NEXTSWITCH};
my $nextParam = $hash->{profil}{$time}{NEXTPARA};
# Fenserkontakte abfragen - wenn einer im Status closed, dann Schaltung um 60 Sekunden verzögern
if (WeekdayTimer_FensterOffen($hash, $newParam, $time)) {
@ -534,18 +571,19 @@ sub WeekdayTimer_Update($) {
}
my $active = 1;
$active = WeekdayTimer_isAnActiveTimer ($hash, $tage, $newParam);
Log3 $hash, 4, "[$name]:Update - timer seems to be active today: ".join("",@$tage)."|$time|$newParam" if($active);
if (defined $hash->{CONDITION}) {
$active = AnalyzeCommandChain(undef, "{".$hash->{CONDITION}."}");
}
# ggf. Device schalten
WeekdayTimer_Device_Schalten($hash, $newParam, $tage);
my ($stunde, $minute, $sekunde) = split (":",$nextSwitch);
my $epoch = WeekdayTimer_zeitErmitteln ($now, $stunde, $minute, $sekunde, 0);
my ($aktTime, $aktParameter, $nextTime, $nextParameter) =
WeekdayTimer_searchAktNext($hash, time()+5);
readingsBeginUpdate($hash);
readingsBulkUpdate ($hash, "nextUpdate", FmtDateTime($epoch));
readingsBulkUpdate ($hash, "nextValue", $nextParam);
readingsBulkUpdate ($hash, "nextUpdate", FmtDateTime($nextTime));
readingsBulkUpdate ($hash, "nextValue", $nextParameter);
readingsBulkUpdate ($hash, "state", $active ? $newParam : "inactive" );
readingsEndUpdate ($hash, defined($hash->{LOCAL} ? 0 : 1));
@ -779,14 +817,17 @@ sub WeekdayTimer_TageAsCondition ($) {
}
################################################################################
sub WeekdayTimer_Attr($$$) {
sub WeekdayTimer_Attr($$$$) {
my ($cmd, $name, $attrName, $attrVal) = @_;
$attrVal = 0 if(!defined $attrVal);
my $hash = $defs{$name};
if( $attrName eq "disable" ) {
readingsSingleUpdate ($hash, "disabled", $attrVal, 1);
} elsif ( $attrName eq "switchInThePast" ) {
$attr{$name}{$attrName} = $attrVal;
####$hash->{TYPE}_SetTimerOfDay({ HASH => $hash});
WeekdayTimer_SetTimerOfDay({ HASH => $hash});
}
return undef;