3 Tages Mittel zur Heizungssteuerung

Begonnen von berndp, 20 April 2016, 20:36:26

Vorheriges Thema - Nächstes Thema

berndp

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

JayP

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
FHEM 5.7 auf ODROID C2, CUL868, MaxCube mit culfw auf 433Mhz, Jeelink 868Mhz, 4x HM-CC-RT-DN, 1x HM-LC-Bl1-FM, 7x IT-Steckdosen, 5x LaCrosse Sensoren, 3x Revolt NC-5462, 1x SD_WS07, 2x G-Tag, Logitech Media Server auf Zyxel, ASUS TF300t mit Android 6 und TabletUI, u.v.m.

meddie

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

firebal301

#3
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

CQuadrat

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
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), KM271 (per ser2net), SONOS (div. Gimmicks), OneWire, Hue

pnewman

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
Raspberry Pi3B+ / Nano-Cul 868 - MAX!=Heizung, HM-Lan - Rollo+Licht, JeeLink-Clone 868 - LaCrosse, JeeLink-Clone 868 - PCA301, CUL 434 - IT-Steckdosen+Fernbedienung