From 2a4431eb097d00a6e15dc28b10a52017cca46ac9 Mon Sep 17 00:00:00 2001 From: immiimmi <> Date: Mon, 23 Feb 2015 21:53:10 +0000 Subject: [PATCH] 00_THZ.pm: heatcurve updated git-svn-id: https://svn.fhem.de/fhem/trunk@8078 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_THZ.pm | 77 +++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/fhem/FHEM/00_THZ.pm b/fhem/FHEM/00_THZ.pm index 409327e1e..880bf87f2 100644 --- a/fhem/FHEM/00_THZ.pm +++ b/fhem/FHEM/00_THZ.pm @@ -2,7 +2,7 @@ # 00_THZ # $Id$ # by immi 02/2015 -my $thzversion = "0.136"; +my $thzversion = "0.137"; # this code is based on the hard work of Robert; I just tried to port it # http://robert.penz.name/heat-pump-lwz/ ######################################################################################## @@ -767,7 +767,7 @@ sub THZ_Ready($) my ($hash) = @_; if($hash->{STATE} eq "disconnected") { THZ_RemoveInternalTimer("THZ_GetRefresh"); - select(undef, undef, undef, 0.1); #equivalent to sleep 100ms + select(undef, undef, undef, 0.25); #equivalent to sleep 1000ms return DevIo_OpenDev($hash, 1, "THZ_Refresh_all_gets") } # This is relevant for windows/USB only @@ -944,13 +944,15 @@ sub THZ_Get($@){ my ($seconds, $microseconds) = gettimeofday(); $seconds= abs($seconds - time_str2num(ReadingsTimestamp($name, $parent, "1970-01-01 01:00:00"))); my $risultato=ReadingsVal($name, $parent, 0); - $risultato=THZ_Get($hash, $name, $parent) if ($seconds > 15 ); #update of the parent: if under 20sec use the current value + $risultato=THZ_Get($hash, $name, $parent) if ($seconds > 20 ); #update of the parent: if under 20sec use the current value + #$risultato=THZ_Parse1($hash,"B81700C800BE00A001C20190006402010000E601D602"); my $parenthash=$gets{$parent}; my $parsingrule = $parsinghash{$parenthash->{type}}; my $i=0; for (@$parsingrule) { last if ((@$parsingrule[$i]->[0]) =~ m/$cmd/); $i++;} $msg2=(split ' ', $risultato)[$i*2+1]; + Log3 $hash->{NAME}, 5, "THZ_split: $msg2 --- $risultato"; } else { my $cmdHex2 = $cmdhash->{cmd2}; @@ -1531,25 +1533,31 @@ sub THZ_RemoveInternalTimer($){ sub function_heatSetTemp($$) { my ($start, $stop) = @_; - my ($heatSetTemp, $roomSetTemp, $insideTemp) =(split ' ',ReadingsVal("Mythz","sHC1",0))[11,21,27]; - $roomSetTemp ="1" if ($roomSetTemp == 0); #division by 0 is bad - my $p13GradientHC1 = ReadingsVal("Mythz","p13GradientHC1",0.4); - my $p15RoomInfluenceHC1 = (split ' ',ReadingsVal("Mythz","p15RoomInfluenceHC1",0))[0]; + my ($p13GradientHC1, $p14LowEndHC1, $p15RoomInfluenceHC1); + if ((AttrVal("Mythz", "firmware" , "4.39") eq "2.06") or (AttrVal("Mythz", "firmware" , "4.39") eq "2.14")) { + ($p13GradientHC1, $p14LowEndHC1, $p15RoomInfluenceHC1) = (split ' ',ReadingsVal("Mythz","pHeat1",0))[1,2,3]; + } + else { + $p13GradientHC1 = ReadingsVal("Mythz","p13GradientHC1",0.4); + $p15RoomInfluenceHC1 = (split ' ',ReadingsVal("Mythz","p15RoomInfluenceHC1",0))[0]; + $p14LowEndHC1 = (split ' ',ReadingsVal("Mythz","p14LowEndHC1",0))[0]; + } + my ($heatSetTemp, $roomSetTemp, $insideTemp) = (split ' ',ReadingsVal("Mythz","sHC1",0))[11,21,27]; my $outside_tempFiltered =(split ' ',ReadingsVal("Mythz","sGlobal",0))[65]; - my $p14LowEndHC1 =(split ' ',ReadingsVal("Mythz","p14LowEndHC1",0))[0]; - my $p99RoomThermCorrection =(split ' ',ReadingsVal("Mythz","p99RoomThermCorrection",0))[0]; - #########$insideTemp=23.8 ; $roomSetTemp = 20.5; $p13GradientHC1 = 0.31; $heatSetTemp = 25.4; $p15RoomInfluenceHC1 = 80; $outside_tempFiltered = 4.9; $p14LowEndHC1 =1.5; $p99RoomThermCorrection = -2.8; + $roomSetTemp ="1" if ($roomSetTemp == 0); #division by 0 is bad + #########$insideTemp=23.8 ; $roomSetTemp = 20.5; $p13GradientHC1 = 0.31; $heatSetTemp = 25.4; $p15RoomInfluenceHC1 = 80; #$outside_tempFiltered = 4.9; $p14LowEndHC1 =1.5; $p99RoomThermCorrection = -2.8; - my $a= 1 + ($roomSetTemp * (1 + $p13GradientHC1 * 0.87)) + $p14LowEndHC1 + ($p15RoomInfluenceHC1 * $p13GradientHC1 * ($roomSetTemp - $insideTemp) /10); + my $a= 0.83 + ($roomSetTemp * (1 + $p13GradientHC1 * 0.87)) + $p14LowEndHC1 + ($p15RoomInfluenceHC1 * $p13GradientHC1 * ($roomSetTemp - $insideTemp) /10); + my $a1= 0.83 + ($roomSetTemp * (1 + $p13GradientHC1 * 0.87)) + $p14LowEndHC1; my $b= -14 * $p13GradientHC1 / $roomSetTemp; my $c= -1 * $p13GradientHC1 /75; - my $Simul_heatSetTemp; - my @ret; + my $Simul_heatSetTemp; my $Simul_heatSetTemp_simplified; my @ret; foreach my $i ($start..$stop) { - $Simul_heatSetTemp = sprintf("%.1f", ($i * $i * $c + $i * $b + $a)); - push(@ret, [$i, $Simul_heatSetTemp]); + $Simul_heatSetTemp = sprintf("%.1f", ($i * $i * $c + $i * $b + $a)); + $Simul_heatSetTemp_simplified = sprintf("%.1f", ($i * $i * $c + $i * $b + $a1)); + push(@ret, [$i, $Simul_heatSetTemp, $Simul_heatSetTemp_simplified]); } - my $titlestring = 'roomSetTemp=' . $roomSetTemp . ' p13GradientHC1=' . $p13GradientHC1 . ' p14LowEndHC1=' . $p14LowEndHC1 . ' p15RoomInfluenceHC1=' . $p15RoomInfluenceHC1 . " insideTemp=" . $insideTemp ; + my $titlestring = 'roomSetTemp=' . $roomSetTemp . '°C p13GradientHC1=' . $p13GradientHC1 . ' p14LowEndHC1=' . $p14LowEndHC1 . 'K p15RoomInfluenceHC1=' . $p15RoomInfluenceHC1 . "% insideTemp=" . $insideTemp .'°C' ; return (\@ret, $titlestring, $heatSetTemp, $outside_tempFiltered); } @@ -1562,7 +1570,7 @@ sub function_heatSetTemp($$) { ##################################### sub THZ_PrintcurveSVG { -my ($ycurvevalues, $titlestring, $heatSetTemp, $outside_tempFiltered) = function_heatSetTemp(-15,21); +my ($ycurvevalues, $titlestring, $heatSetTemp, $outside_tempFiltered) = function_heatSetTemp(-15,20); my $vstep= 5; $vstep= 10 if (($ycurvevalues->[0][1])>36); #change scale if out of scale my$v0min= 15; @@ -1581,6 +1589,7 @@ polyline { stroke:black; fill:none; } .pasted { stroke:black; stroke-dasharray:1,1; } .l0 { stroke:red; } text.l0 { stroke:none; fill:red; } .l1 { stroke:green; } text.l1 { stroke:none; fill:green; } +.l3 { stroke:blue; } text.l3 { stroke:none; fill:blue; } .l0dot { stroke:red; stroke-dasharray:2,4; } text.ldot { stroke:none; fill:red; } ]]> @@ -1612,12 +1621,13 @@ polyline { stroke:black; fill:none; } HC1 heat SetTemp °C outside temperature filtered °C -15 --9 --3 -3 -9 -15 -21 +-10 +-5 +0 +5 +10 +15 +20 END @@ -1636,9 +1646,10 @@ $ret .= ''; #labels ###################### -$ret .= ' --- heat curve' ; -$ret .= ' --- working point: '; -$ret .= 'outside_tempFiltered=' . $outside_tempFiltered . ' heatSetTemp=' . $heatSetTemp . ''; +$ret .= ' --- heat curve with insideTemp correction' ; +$ret .= ' --- heat curve simplified' ; +$ret .= ' --- working point: '; +$ret .= 'outside_tempFiltered=' . $outside_tempFiltered . '°C heatSetTemp=' . $heatSetTemp . '°C '; #title ###################### $ret .= ''; @@ -1646,15 +1657,21 @@ $ret .= $titlestring .' ' . "\n"; #point ###################### $ret .='' . "\n"; -#curve ###################### -$ret .='[0]+15)*(750-49)/(15+21)+49) ). "," . sprintf("%.1f", (($_->[1]-$v4)*(140-19)/($v0min-$v4)+19)) ." "; +$ret.= (sprintf("%.1f", ($_->[0]+15)*(750-49)/(15+20)+49) ). "," . sprintf("%.1f", (($_->[1]-$v4)*(140-19)/($v0min-$v4)+19)) ." "; } +$ret .= '"/> ' . "\n"; +#curve without inside temperature correction ###################### +$ret .='[0]+15)*(750-49)/(15+20)+49) ). "," . sprintf("%.1f", (($_->[2]-$v4)*(140-19)/($v0min-$v4)+19)) ." "; +} $ret .= '"/> ' . "\n"; $ret .= '';