DiLi-Tech

Heizungslogger

Bei Pollin habe ich einen interessanten Bausatz gefunden: die Ethernet-Platine "AVR-Net-IO" mit dem AVR-Microcontroller ATMega32 und dem Netzwerkcontroller ENC28J60. Die Platine verfügt über 8 digitale Ausgänge, 4 digitale Eingänge sowie 4 analoge ADC-Eingänge, welche über einen Netzwerkanschluss (10 Mbit/s) abgerufen bzw. geschaltet werden können. Weiterhin gibt es einen RS232-Port und eine Anschlussbuchse für ein optionales LCD-Display.

Bei dem Preis konnte ich nicht nein sagen und habe gleich 2 Bausätze bestellt (die Bauteile sind ja schon fast den Preis wert). Der Aufbau ging völlig problemlos, da ausschließlich Standardbausteile verwendet werden (kein SMD).

Die erste Inbetriebnahme schlug fehl: zuerst musste ein Firmware-Update mittels mitgeliefertem Programm (per serieller Schnittstelle!) durchgeführt werden. Sichern und Zurückspielen der Firmware per ISP-Programmer schlug ebenfalls fehl: anscheinend wird Code verwendet, der sich während der Laufzeit selbst modifiziert. Ein Wiederherstellen geht ausschließlich über die Update-Funktion des mitgelieferten Programmes!

Die LAN-Buchse lässt vermuten, dass ein Web-Interface für die Bedienung existiert. Weit gefehlt: die Karte lässt sich per TCP/IP nur mittels einfacher Socket-Verbindungen steuern. Der Stack (es können max. 2 Verbindungen gleichzeitig bestehen) ist nicht besonders robust: man sollte tunlichst nach jedem Request auch den Response abholen - sonst hängt sich das Teil auf und lässt sich u.U. nur über die Update-Funktion wiederbeleben! Wenn man diese Randbedingungen beachtet fünktioniert alles - bei mir über Monate - zuverlässig.

Jetzt fehlt nur noch ein Anwendungszweck: es sollte ein Logger werden, der die Vorlauf- und Rücklauftemperatur meiner Heizung misst. Ebenfalls soll der Zustand des Brenners (ein-aus) und die Außentemperatur erfasst werden.

Die Hardwareausstattung gestaltete sich erfreulich einfach: es sind neben 3 Temperatursensoren "KTY81-110" und einer passenden Spule mit aureichend vielen Windungen (zur Detektierung des Streufeldes des Magnetventils) nur einige Kleinteile erforderlich: Diode mit Elko zum Gleichrichten der Spulenspannung und 3x 100nF-Kondensatoren, die parallel an den analogen Eingangsbuchsen verschraubt werden. Ein Schaltbild für die Gesamtanordnung erspare ich mir. Noch einen Hinweis zu den KTY81: die Widerstandskurve zur Temperatur ist leider nicht linear. Also habe ich mit Excel ein Bischen herum experimentiert und eine Linearisierung versucht. Hier das Ergebnis: annähernd lineare Verhältnisse ergeben sich, wenn ein passender Vorwiderstand verwendet wird. Ich verwende den in "Reihe 5" genannten Widerstand von 2210 Ohm (E96-Serie). Dabei ergibt sich (auf der analogen Seite) ein max. Fehler von 0,37%.

Auf der digitalen Seite sieht es nicht ganz so rosig aus. Bei den zur Verfügung stehenden Spannungen (bei mir 4,98 Volt) und der extern beschaltenen Uref = 3,42 Volt (vom Ethernet-Chip) ergibt sich eine theoretische Auflösung von ca. 0,4 Grad Celsius. Der 10-Bit-A/D-Wandler wird dabei nur ungenügend "ausgesteuert", aber alles Andere würde den Aufwand in die Höhe treiben. Mit 0,4 Grad könnte man zufrieden sein. Nur leider liegen die Problem ganz wo anders: der A/D-Wandler ist wohl miserabel programmiert... Na jedenfalls springt der Wert ständig um plus/minus 2-3 Digit. Damit ist die Temperaturmessung nicht genauer als 1,5 Grad (ich habe mit den A/D-Wandlerfunktionen der AVR-Controller eigentlich viel bessere Erfahrungen gemacht).

So, warum finden Sie dieses Projekt unter Software? Bei mir steht im Keller ein ständig laufender Rechner; mit Intel G3220-CPU (z.Zt. - Anfang 2014 - der kleinste Haswell DualCore-Prozessor) auf einem Intel DH87RL-Board mit ca.15 Watt Stromverbrauch im Leerlauf. Z.B. protokolliert er täglich meine (dynamische) IP-Adresse, ist Medienserver (für meine 3 Squeezeboxen), holt abends von n-tv mehrere tausend Börsenkurse (siehe Chartmanager), nimmt Radioprogramme auf (vornehmlich Hörspiele per phonostar), hält die Daten meines Terminkalenders, ist Sicherungsserver für unsere PCs, ist Videothek und vieles mehr. Und nun pollt er zusätzlich im Minutentakt das AVR-NET-IO-Board und holt die aktuellen Temperatur- und Brennerdaten. Diese werden in Monats-Dateien (.csv) geschrieben. Mit Excel (und seinen meist unbekannten "Pivot"-Funktionen) lässt sich eine ausführliche Auswertung machen.

Es folgt der Quellcode des Scriptes, dass über den Windows-Taskplaner minütlich aufgerufen wird. Eine objektorientierte Vorgehensweise erachte ich ob der Kürze des Scripts für nicht angebracht.

<?php

/*
    Programm "avr_poll.php" wird jede Minute über "Geplante Tasks" aufgerufen:
    "c:\php\php-win.exe avr_poll.php"

    Parameter:
    Rv=2210 Ohm
    UFühler=4,98V
    Uref=3,42V

    -> Temp=(Digit-401)/2,5

*/

$path=".\\";
$avr_adresse="192.168.0.90";
$avr_port="50290";

function make_filename() {
   global $path;
   $fname=$path.'Heizung_'.date('m_Y').'.csv';
   if (!file_exists($fname)) {
      $hd=fopen($fname,"w");                     // Überschrift, wenn Datei neu
      fwrite($hd,"Datum / Zeit;Taußen;Tvor;Trück;Brenner\r\n");
      fclose($hd);
   }
   return($fname);                               // ".\Heizung_09_2010.csv"
}



// ---------------------- Main() ------------------------



$sock = @fsockopen($avr_adresse, $avr_port, $errno, $errstr, 15);
if ($sock===FALSE)
   exit;                                  // raus, wenn offline (nach 15 Sek.)
fwrite($sock,"initlcd\r\n");              // zu Beginn das LCD initialisieren
fread($sock,128);                         // void: response !immer! abholen!
fclose($sock);

// ------------------------------------------------------

$sock = @fsockopen($avr_adresse, $avr_port, $errno, $errstr, 15);
fwrite($sock,"getadc 1\r\n");
$ret1=trim(fread($sock,128));             // Aussentemperatur
usleep(1000);

fwrite($sock,"getadc 2\r\n");
$ret2=trim(fread($sock,128));             // Vorlauftemperatur
usleep(1000);

fwrite($sock,"getadc 3\r\n");
$ret3=trim(fread($sock,128));             // Rücklauftemperatur
usleep(1000);

fwrite($sock,"getadc 4\r\n");
$ret4=trim(fread($sock,128));             // indiktiver Magnetventil-Sensor

// ------------------------------------------------------

$datetime=date("d.m.Y H:i");
$lcd1="writelcd 1.$datetime\r\n";

$taussen=($ret1-401)/2.50;                // lt. Excel s.o.
$tvor=($ret2-401)/2.50;
$trueck=($ret3-401)/2.50;

if ($ret4>50) {                           // muss Schwelle überschreiten
   $brenner="1";
   $brenner_sternchen="*";
} else {
   $brenner="0";
   $brenner_sternchen=" ";
}

$lcd2="writelcd 2.".sprintf("Ta%3d Tv%2d Tr%2d%1s\r\n",round($taussen),round($tvor),round($trueck),$brenner_sternchen);


fwrite($sock,$lcd1);                      // "13.09.2010 17:46"
fread($sock,128);

fwrite($sock,$lcd2);                      // "Ta-10 Tv55 Tr35*"
fread($sock,128);

fclose($sock);                            // fertig beim AVR-Board

// ------------------------------------------------------

$temps=sprintf("%.1f;%.1f;%.1f",$taussen,$tvor,$trueck);
$temps=str_replace(".",",",$temps);       // deutsches Format: Fließzahl mit ","
$zeile=sprintf("%s;%s;%s\r\n",$datetime,$temps,$brenner);
                                          // "13.09.2010 21:13;5,7;45,3;35,0;1"

$fname=make_filename();                   // Datei ggf. neu anlegen
$hd=fopen($fname,"a");
fwrite($hd,$zeile);                       // Zeile wegschreiben
fclose($hd);


?>

Es folgen einige Bilder von der Hardware:

Fig. 1: Meine gute (!!) alte Gasheizung

Fig. 2: Hinten an der Wand: Logger im staubdichten Gehäuse

Fig. 3: Temperatursensor an der Vorlaufleitung mit Strips und Tape befestigt

Fig. 4: Brenner mit Magnetventil und Zündsteuerung

Fig. 5: Aufgeschraubter induktiver Sensor (galvanische Trennung!)

Fig. 6: Außentemperatursensor

Nachsatz: Nach einer (1) Heizperiode wird dieser Logger wieder abgeschaltet. Dann werden die Daten ausgewertet.
Erste (Teil-) Ergebnisse lassen vermuten, dass eine Nachtabsenkung weniger effizient ist als angenommen. Wirksam ist nur das Absenken der Raumtemperaturen in der Nacht. Ob dabei die Nachtabsenkung aktiv ist, spielt eine untergeordnete Rolle!
Versuche haben ferner ergeben, dass es bei nicht zu geringer Außentemperatur ratsam ist, die Heizung über Nacht abzuschalten. Der größere Wärmebedarf zum Anheizen am Morgen ist geringer als der Wärmebedarf beim nächtlichen Durchheizen.
Nur eine ausgeschaltete Heizung ist eine verbrauchsgünstige Heizung!
Meine Heizung habe ich jetzt so programmiert, dass sie nachts in den Frostschutz-Modus geht, d.h., sie läuft in Nachtabsenkung bei Außentemperaturen unter -1 °C. Sonst bleibt sie nachts aus.
Das Zeitfenster für die Warmwasserbereitung habe ich in die frühen Morgenstunden gelegt. Nach dem Laden des Wasserspeichers geht die Restwärme des Kessels sofort ins Heizungsnetz und sorgt schnell für ein warmes Badezimmer...

nach ganz oben

     Hier Kommentare dazu anschauen bzw. selbst kommentieren!