2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-02-01 07:19:24 +00:00

some improvments to get it more robust

git-svn-id: https://svn.fhem.de/fhem/trunk@4142 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
dietmar63 2013-11-02 21:33:14 +00:00
parent d9461843c3
commit f339760126

View File

@ -140,7 +140,9 @@ sub Heating_Control_Define($$)
}
# jetzt die switchingtimes und Tagesangaben verarbeiten.
Heating_Control_ParseSwitchingProfile($hash, \@switchingtimes, \$shortDays{$language});
if (!Heating_Control_ParseSwitchingProfile($hash, \@switchingtimes, \$shortDays{$language})) {
return;
}
# Profile sortiert aufbauen
for (my $d=0; $d<=6; $d++) {
@ -150,8 +152,8 @@ sub Heating_Control_Define($$)
}
}
RemoveInternalTimer($hash);
my $now = time();
RemoveInternalTimer($hash);
InternalTimer ($now+30, "$hash->{TYPE}_Update", $hash, 0);
if (defined($hash->{TIME_AS_PERL})) {
@ -236,7 +238,8 @@ sub Heating_Control_ParseSwitchingProfile($$$) {
$oldDel = $del;
}
} else{
return "invalid daylist in $name <$daylist> 123... | Sa,So,... | Mo-Di,Do,Fr-Mo | Su-Th,We"
Log3 $hash, 1, "invalid daylist in $name <$daylist> use one of 123...|Sa,So,...|Mo-Di,Do,Fr|Su-Th,We|Lu-Me";
return 0;
}
@days = sort(SortNumber keys %hdays);
@ -252,7 +255,8 @@ sub Heating_Control_ParseSwitchingProfile($$$) {
} elsif ($time =~ m/^[0-2][0-9](:[0-5][0-9]){2,2}$/g) { # HH:MM:SS
; # ok.
} else {
Log3 $hash, 1, "[$name] invalid time in $name <$time> HH:MM[:SS]"
Log3 $hash, 1, "[$name] invalid time in $name <$time> HH:MM[:SS]";
return 0;
}
for (my $d=0; $d<@days; $d++) {
@ -260,6 +264,7 @@ sub Heating_Control_ParseSwitchingProfile($$$) {
$hash->{helper}{SWITCHINGTIME}{$days[$d]}{$time} = $para;
}
}
return 1;
}
################################################################################
sub Heating_Control_Undef($$) {
@ -287,13 +292,16 @@ sub Heating_Control_Update($)
if (Heating_Control_FensterOffen($hash)) {
return;
}
# Schaltparameter ermitteln
my ($nowSwitch,$nextSwitch,$aktParam,$newParam,$nextParam)
my ($nowSwitch,$nextSwitch,$newParam,$nextParam)
= Heating_Control_akt_next_param($now, $hash);
# ggf. Device schalten
if ($nowSwitch gt "" && $aktParam ne $newParam ) {
Heating_Control_Device_Schalten($hash, $now, $nowSwitch, $newParam)
}
Heating_Control_Device_Schalten($hash, $now, $nowSwitch, $newParam);
Log3 $hash, 4, $mod .strftime('Next switch %d.%m.%Y %H:%M:%S',localtime($nextSwitch));
# Timer und Readings setzen.
InternalTimer ($nextSwitch, "$hash->{TYPE}_Update", $hash, 0);
@ -318,9 +326,9 @@ sub Heating_Control_FensterOffen ($) {
"CUL_HM" => { "READING" => "state", "STATUS" => "(open|tilted)", "model" => 1 },
"MAX" => { "READING" => "state", "STATUS" => "(open)" });
my $fensterKontakte = AttrVal($hash->{NAME}, "windowSensor", "nF");
if ($fensterKontakte ne "nF" ) {
Log3 $hash, 5, "$mod list of windowsenors found: '$fensterKontakte'";
my $fensterKontakte = AttrVal($hash->{NAME}, "windowSensor", "");
Log3 $hash, 5, "$mod list of windowsenors found: '$fensterKontakte'";
if ($fensterKontakte ne "" ) {
my @kontakte = split(/ /, $fensterKontakte);
foreach my $fk (@kontakte) {
if(!$defs{$fk}) {
@ -340,8 +348,11 @@ sub Heating_Control_FensterOffen ($) {
Log3 $hash, 5, "$mod windowsensor '$fk' Reading '$reading' is '$windowStatus'";
if ($windowStatus =~ m/^$statusReg$/g) {
Log3 $hash, 3, "$mod switch of $hash->{DEVICE} delayed - windowsensor '$fk' Reading '$reading' is '$windowStatus'";
if (!defined($hash->{VERZOEGRUNG})) {
Log3 $hash, 3, "$mod switch of $hash->{DEVICE} delayed - windowsensor '$fk' Reading '$reading' is '$windowStatus'";
}
InternalTimer (time()+60, "$hash->{TYPE}_Update", $hash, 0);
$hash->{VERZOEGRUNG} = 1;
return 1
}
}
@ -349,6 +360,10 @@ sub Heating_Control_FensterOffen ($) {
}
}
}
if ($hash->{VERZOEGRUNG}) {
Log3 $hash, 3, "$mod delay of switching $hash->{DEVICE} stopped.";
}
delete $hash->{VERZOEGRUNG};
return 0;
}
################################################################################
@ -356,14 +371,9 @@ sub Heating_Control_akt_next_param($$) {
my ($now, $hash) = @_;
my $mod = "[".$hash->{NAME} ."] ";
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($now);
my $aktParam = ReadingsVal($hash->{DEVICE}, $hash->{helper}{DESIRED_TEMP_READING}, 0);
$aktParam = sprintf("%.1f", $aktParam) if ($aktParam =~ m/^[0-9]{1,3}$/i);
my $newParam = $aktParam; #default#
my ($nextParam, $next, $nextSwitch, $nowSwitch) = (0,0,0,0);
my ($nextParam, $next, $nextSwitch, $nowSwitch, $newParam) = (0,0,0,0,0);
# aktuellen und nächsten Schaltzeitpunkt ermitteln.
my $startIdx;
for (my $d=-1; $d>=-7; $d--) {
@ -388,12 +398,12 @@ sub Heating_Control_akt_next_param($$) {
Log3 $hash, 4, $mod."Jetzt:".strftime('%d.%m.%Y %H:%M:%S',localtime($now))." -> Next: ".strftime('%d.%m.%Y %H:%M:%S',localtime($next))." -> Param: $hash->{helper}{SWITCHINGTIME}{$wd}{$st} ".$secondsToSwitch;
}
if ($secondsToSwitch<=0) {
$newParam = $hash->{helper}{SWITCHINGTIME}{$wd}{$st};
$newParam = sprintf("%.1f", $newParam) if ($newParam =~ m/^[0-9]{1,3}$/i);
$newParam = $hash->{helper}{SWITCHINGTIME}{$wd}{$st};
$newParam = sprintf("%.1f", $newParam) if ($newParam =~ m/^[0-9]{1,3}$/i);
$nowSwitch = $next;
} else {
$nextParam = $hash->{helper}{SWITCHINGTIME}{$wd}{$st};
$nextParam = sprintf("%.1f", $nextParam) if ($nextParam =~ m/^[0-9]{1,3}$/i);
$nextParam = sprintf("%.1f", $nextParam) if ($nextParam =~ m/^[0-9]{1,3}$/i);
$nextSwitch = $next;
last;
}
@ -401,9 +411,7 @@ sub Heating_Control_akt_next_param($$) {
}
}
#$nextSwitch += get_SummerTimeOffset($now, $nextSwitch);
Log3 $hash, 4, $mod .strftime('%d.%m.%Y %H:%M:%S',localtime($nowSwitch))." ; aktParam: $aktParam ; newParam: $newParam";
Log3 $hash, 4, $mod .strftime('%d.%m.%Y %H:%M:%S',localtime($nextSwitch));
return ($nowSwitch,$nextSwitch,$aktParam,$newParam,$nextParam);
return ($nowSwitch,$nextSwitch,$newParam,$nextParam);
}
################################################################################
sub Heating_Control_Device_Schalten($$$$) {
@ -413,36 +421,69 @@ sub Heating_Control_Device_Schalten($$$$) {
my $mod = "[".$hash->{NAME} ."] ";
#modifier des Zieldevices auswaehlen
my %modifier = ("MAX"=>"desiredTemperature","FHT"=>"desired-temp","CUL_HM"=>"desired-temp","FS20"=>"");
$hash->{helper}{DESIRED_TEMP_READING} = "";
$hash->{helper}{DESIRED_TEMP_READING} = $modifier{$defs{$hash->{DEVICE}}{TYPE}};
my %modifier = ("MAX"=>"desiredTemperature","FHT"=>"desired-temp","CUL_HM"=>"desired-temp");
my $commandMod = $modifier{$defs{$hash->{DEVICE}}{TYPE}};
$commandMod = "" if (!defined($commandMod));
# Kommando aufbauen
if (defined $hash->{helper}{CONDITION}) {
$command = '{ fhem("set @ '.$hash->{helper}{DESIRED_TEMP_READING}.' %") if' . $hash->{helper}{CONDITION} . '}';
$command = '{ fhem("set @ '. $commandMod .' %") if' . $hash->{helper}{CONDITION} . '}';
} elsif (defined $hash->{helper}{COMMAND}) {
$command = $hash->{helper}{COMMAND};
} else {
$command = '{ fhem("set @ '.$hash->{helper}{DESIRED_TEMP_READING}.' %") }';
$command = '{ fhem("set @ '. $commandMod .' %") }';
}
my $aktParam = ReadingsVal($hash->{DEVICE}, $commandMod, 0);
$aktParam = sprintf("%.1f", $aktParam) if ($aktParam =~ m/^[0-9]{1,3}$/i);
Log3 $hash, 4, $mod .strftime('%d.%m.%Y %H:%M:%S',localtime($nowSwitch))." ; aktParam: $aktParam ; newParam: $newParam";
#Kommando ausführen
my $secondsSinceSwitch = $nowSwitch - $now;
# toDo besser eine Positivliste mit Geraeten, die geschaltet werden sollen
my %vergangenheitNichtSchalten = ("FS20" => 1);
if ($vergangenheitNichtSchalten{$defs{$hash->{DEVICE}}{TYPE}} && $secondsSinceSwitch < -60) {
;
} else {
if ($command && AttrVal($hash->{NAME}, "disable", 0) == 0) {
$newParam =~ s/:/ /g;
$command =~ s/@/$hash->{DEVICE}/g;
$command =~ s/%/$newParam/g;
$command = SemicolonEscape($command);
Log3 $hash, 4, $mod."command: $command";
my $ret = AnalyzeCommandChain(undef, $command);
Log3 ($hash, 3, $ret) if($ret);
if ($nowSwitch gt "" && $aktParam ne $newParam ) {
if (!SwitchInVergangenheit($hash) && $secondsSinceSwitch < -60) {
Log3 $hash, 5, $mod."no switch in the yesterdays because of the devices type.";
} else {
if ($command && AttrVal($hash->{NAME}, "disable", 0) == 0) {
$newParam =~ s/:/ /g;
$command =~ s/@/$hash->{DEVICE}/g;
$command =~ s/%/$newParam/g;
$command = SemicolonEscape($command);
Log3 $hash, 4, $mod."command: $command";
my $ret = AnalyzeCommandChain(undef, $command);
Log3 ($hash, 3, $ret) if($ret);
}
}
}
}
################################################################################
sub SwitchInVergangenheit($) {
my ($hash) = @_;
my %vergangenheitSchalten =
("FHT" => 1,
#"HCS" => 1,
"MAX" => { "mode" => "type", "HeatingThermostatPlus" => 1, "HeatingThermostat" => 1, "WallMountedThermostat" => 1 },
"CUL_HM" => { "mode" => "model", "HM-CC-TC" => 1, "HM-CC-RT-DN" => 1 } );
my $dHash = $defs{$hash->{DEVICE}};
my $dType = $dHash->{TYPE};
my $SwitchInVergangenheit = $vergangenheitSchalten{$dType};
if (ref($SwitchInVergangenheit)) {
my $mode = $vergangenheitSchalten{$dType}{mode};
my $model;
if ($mode eq "model" ) {
$model = AttrVal($hash->{DEVICE}, "model", "nF");
} elsif ($mode eq "type") {
$model = $dHash->{type};
}
$SwitchInVergangenheit = $vergangenheitSchalten{$dType}{$model};
}
return $SwitchInVergangenheit;
}
################################################################################
sub Heating_Control_SetAllTemps() { # {Heating_Control_SetAllTemps()}