Da ich die Heizung automatisch auf Sommer/Winterbetrieb umstellen möchte (Ja, man könnte einen Schalter dafür nehmen...) habe ich ein kleines quick&dirty Schnipsel zur Erfassung des 3-Tages-Temperaturmittelwert gebastelt.
Ich summiere die Temperatur eines KNX Außenfühlers zu jeder Stunde dem Reading eines Dummys auf und um 0 Uhr findet die Durchschnitts und 3-Tages Berechnung statt.
Das ganze hab ich erstmal in ein AT geschrieben, damit es hier einfacher zu posten ist.
Die ersten 3 Tage ist es natürlich noch ungenau, aber man kann ja geschätzte Temperaturen vorab eintragen.
define DreiTagesMittel dummy
define Tagesmittel at+*01:00:00 { # Stuendlich ausfuehren
my $SummerWinterTreshold = 14; # Schwellwert für Sommerbetrieb
my $ThreeDayAVG;
my $day0;
my $day1;
my $day2;
my $temp = Value("Temperatur");
my $avgTemp = ReadingsVal("DreiTagesMittel", "TagesmittelTemperatur", 0);
$avgTemp = $avgTemp + $temp;
fhem("setreading DreiTagesMittel TagesmittelTemperatur ".$avgTemp);
($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time);
if($hour == 0) {
$avgTemp = $avgTemp/24;
my $actDay =ReadingsVal("DreiTagesMittel", "Day", 0);
fhem("setreading DreiTagesMittel DayTemp".$actDay." ".$avgTemp);
$actDay = $actDay+1;
if($actDay>2) {
$actDay=0;
}
fhem("setreading DreiTagesMittel Day ".$actDay);
$day0 = ReadingsVal("DreiTagesMittel", "DayTemp0", 0);
$day1 = ReadingsVal("DreiTagesMittel", "DayTemp1", 0);
$day2 = ReadingsVal("DreiTagesMittel", "DayTemp2", 0);
$ThreeDayAVG = ($day0+$day1+$day2) / 3;
fhem("set DreiTagesMittel ".$ThreeDayAVG);
if($ThreeDayAVG>$SummerWinterTreshold) {
fhem("set SommerWinter on");
}
else {
fhem("set SommerWinter off");
}
}
}
Edit: Bugfix
Hallo Bernd,
wirklich toll. Aber da ich von dem Thema sinnvolle Heizungssteuerung keine Ahnung habe, fände ich es super, wenn du erklären könntest, was man mit dem ermittelten Wert jetzt anfängt.
Gruß
Jay
Hey Jay,
ist eigentlich ganz einfach, der Bernd ermittelt einen Durchschnittswert der Außentemperatur der letzten drei Tage. Ist diese mehr als 14 Grad dann ist Sommer, wenn weniger dann Winter. Dazu setzt er die Variable SommerWinter auf on bzw auf off.
Entsprechend kannst Du ein DOIF anlegen, dass wenn die Variable SommrWinter on ist die Heizung abgeschaltet wird, und wenn die Variable auf off geht, dann hat es ja 3 Tage lang durchschnittlich unter 14 Grad gehabt und die Heizung wird eingeschaltet.
Gruß Eddie
coole und einfache Idee.
ich habe noch eine Zeile zum Zurücksetzen der aufsummierten Werte um 00:00 eingefügt, denn sonst wird es von Tag zu Tag immer wärmer :-)
if($hour == 0) {
fhem("setreading DreiTagesMittel TagesmittelTemperatur ".$temp);
Am besten im ersten Post ergänzen.
Gruß
Kai
Hallo Zusammen,
ich habe dazu eine kleine Perl-Routine, die anhand der Logdaten (nutze DbLog) den Mittelwert berechnet:
myAverage($$$)
{
my ($offset,$logfile,$cspec) = @_;
my $period_s = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime(time-$offset);
my $period_e = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime;
my $oll = $attr{global}{verbose};
$attr{global}{verbose} = 0;
my @logdata = split("\n", fhem("get $logfile - - $period_s $period_e $cspec"));
$attr{global}{verbose} = $oll;
my ($cnt, $cum, $avg) = (0)x3;
foreach (@logdata){
my @line = split(" ", $_);
if(defined $line[1] && "$line[1]" ne ""){
$cnt += 1;
$cum += $line[1];
}
}
if("$cnt" > 0){$avg = sprintf("%0.1f", $cum/$cnt)};
Log 4, ("myAverage: File: $logfile, Field: $cspec, Period: $period_s bis $period_e, Count: $cnt, Cum: $cum, Average: $avg");
return $avg;
}
Darauf kann man dann z.B. mit einem userReading zugreifen:
attr <dev> userReadings avtemp { myAverage("259200", "myDbLog", "Garten_Temp:temperature::") }
Viele Grüße
Christoph
Hallo berndP,
ich bekomme das at nicht zum laufen.
Fehlermeldung aus dem Logfile:
2016.11.03 23:26:16 1: PERL WARNING: Argument "" isn't numeric in addition (+) at (eval 994529) line 1.
2016.11.03 23:26:16 3: eval: {my $SummerWinterTreshold = 14; my $ThreeDayAVG; my $day0; my $day1; my $day2; my $temp = Value("Temperatur"); my $avgTemp = ReadingsVal("DreiTagesMittel", "TagesmittelTemperatur", 0); $avgTemp = $avgTemp + $temp; fhem("setreading DreiTagesMittel TagesmittelTemperatur ".$avgTemp); ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time); if($hour == 0) {$avgTemp = $avgTemp/24; my $actDay =ReadingsVal("DreiTagesMittel", "Day", 0); fhem("setreading DreiTagesMittel DayTemp".$actDay." ".$avgTemp); $actDay = $actDay+1; if($actDay>2) {$actDay=0; } fhem("setreading DreiTagesMittel Day ".$actDay); $day0 = ReadingsVal("DreiTagesMittel", "DayTemp0", 0); $day1 = ReadingsVal("DreiTagesMittel", "DayTemp1", 0); $day2 = ReadingsVal("DreiTagesMittel", "DayTemp2", 0); $ThreeDayAVG = ($day0+$day1+$day2) / 3; fhem("set DreiTagesMittel ".$ThreeDayAVG); if($ThreeDayAVG>$SummerWinterTreshold) {fhem("set SommerWinter on"); } else {fhem("set SommerWinter off"); } } }
Und, wo trage ich meinen Temperatursensor ein?
Gruß
Ralf