Heizungssteuerung
Temperaturmessung mit Linux DS9490R
Retroshare auf dem Raspberry Pi
BeagleBoard Digitalen Ausgang
Umstellung der Website von 960gs Grid auf Fluid 960 Grid
Temperaturmessung mit Linux
Pegelwandler 3,3Volt => 5Volt
Pegelwandler 1,8Volt => 5Volt
Diagramme mittels rrdtool
Ubuntu auf dem BeagleBoard
Continous Integration Ampel
Tamiya TT-01

Heizungssteuerung

Heizungssteuerung mit Linux - Raspberry PI

Eine in die Jahre gekommene, mittels eines PIC AT89 implementierte Heizungssteuerung soll nach einem Jahrzehnt durch eine neue Variante ersetzt werden. Da die Hardware, sowie die Programmierung in Assembler recht aufwändig war, möchte ich auf etwas einfacheres zurückgreifen.

Da ich viel mit Linux Arbeite, bietet es sich an die Heizungssteuerung direkt unter Linux zu implementieren, und auf die Vorteile eines kompletten Betriebs­systems zurückgreifen zu können. Hierzu gehören der einfache Netzwerk­an­schluss für Wartung, die Möglich­keit Daten­banken für Temperatur­werte zu verwenden, sowie ein Touch­screen als Interface anzu­schliessen. Früher aufwändige arbeiten, wie das anschließen eines DCF Empfängers (Funkuhr) sind unötig, da einfach NTP zur Zeitsyncronisierung übers Netzwerk verwendet werden kann.

Die Kosten für einen kompletten PC sind mittlerweile recht gering, besonders wenn es sich um SingleBoard PCs handelt. Der Aufbau auf Standard PC Hardware ermöglicht, diese noch Lange in Betrieb zu halten, und auch in 10 Jahren noch auf entsprechende Hardware zurückgreifen zu können.

Fertiges Image

Auf Wunsch wird zukünfig ein Komplett fertiges Image zu Download zur Verfügung stehen. Alle nachfolgenden Texte beschreiben die komplette Installation. Wer es einfach mag, oder Linux oder PHP Anfänger ist, sollte das Image verwenden.
Das Image ist verfügbar unter:
http://sourceforge.net/projects/heatingcontrol/files/heating_control_2014_02_09_upload.img.bz2/download
Der SSH Login ist wie unten im Artikel beschrieben für das fertige Image "pi" mit dem Password "raspheat".

#Installation des kompletimmages (4GB Speicherkarte nötig)

# Wichtig! /dev/sdX durch die Laufwerksbezeichnung Ihrer Speicherkarte ersetzen 
# (Liste kann man ermitteln mit "cat /proc/partitions")
# Der Vorgang dauert einige Minuten und erzeugt erst eine Ausgabe, wenn er fertig ist
sudo su -
cat /proc/partitions
bunzip2 -dc dateiname_des_heruntergeladenen_images.img.bz2 | dd bs=1M of=/dev/sdX

Falls eine Meldung kommt ähnlich zu dieser "dd: »/dev/sdd“ wird geschrieben: Auf dem Gerät ist kein Speicherplatz mehr verfügbar", müsst ihr eine andere Speicherkarte verweden, anscheinend sind nicht alle 4GB Speicherkarten gleich groß, oder Ihr nehmt direkt eine z.B. 8GB Karte.

Userinterface

Für die Heizung wird ein 8-10Zoll großes Touchscreen verwendet werden. Um die Bedieunung zu vereinfachen basiert das UI auf Basis von jQuery Mobile. Die Menüführung hat folgenden Aufbau

  • Statistiken
    • Temperaturverlauf/Verbrauch für diesen Tag
    • Temperaturverlauf/Verbrauch für diese Woche
    • Temperaturverlauf/Verbrauch für diesen Monats
    • Temperaturverlauf/Verbrauch für dieses Jahr
  • Systekonfiguration
    • Sollwertkurve Rücklauf
    • Pumpenkonfiguration
    • Nachtabsenkung
    • Temperaturfühler
Auf jeder Seite werden in einer Fußzeile die aktuellen Informationen angezeigt.

Grundlagen

Hardwaresteuerung

Bei der Hardware handelt es sich um die externe Beschaltung, welche die Schnittstelle zwischen dem Raspberry Pi und der Heizung darstellt. Ich habe mir die Platine zwei mal fertigen lassen für unter 20€ (info@platinenbelichter.de). Um sich die Platine herstellen zu lassen, senden sie die layout.brd - Datei für den Ätzservice an einen Platinenbelichter ihrer Wahl.

Aufbau der externen Beschaltung am GPIO Port

Layout der Platine

Raspberry Pi mit über GPIO geschalteten LEDs

Software

Als Basissystem habe ich Raspbian auf dem Raspberry Pi installiert und einen Apache Webserver aufgesetzt. Verwendet habe ich eine 4GB große SD Karte.

Basissystem

    wget "http://downloads.raspberrypi.org/raspbian_latest"
    unzip raspbian_latest
    # Ergebnis ist ein Image, bei mir: 2014-01-07-wheezy-raspbian.img
    # Wichtig! /dev/sdX durch die Laufwerksbezeichnung Ihrer Speicherkarte ersetzen 
    # (Liste kann man ermitteln mit "cat /proc/partitions")
    # Der Vorgang dauert einige Minuten und erzeugt erst eine Ausgabe, wenn er fertig ist
    sudo dd bs=1024k if=2014-01-07-wheezy-raspbian.img of=/dev/sdX

Die erstellt SD Karte in den Raspberry, ihn ins Netzwerk hängen und booten lassen. Er besorgt sich dann über DHCP z.B. von der FritzBox eine IP. Der Netzwerkname ist "raspberrypi". Das initial Passwort von rasbian ist "raspberry", der SSH Benutzer ist "pi".

    # Auf den Raspberry via Netzwerk verbinden 
    ssh -lpi raspberrypi
    sudo raspi-config
    # Einmal "Expand Filesystem" aufrufen und einmal "Internationalisation Options", dort unter "Change Locale" de_DE.UTF-8 UTF-8 
    # stellen. Danach nochmal "Internationalisation Options" und dann "Change Timezone" auf "Europe/Berlin"  stellen.
    # Danach das Passwort ändern "Change User Password" ('raspheat' im Image). Dann im Hauptmenü Advanced Options - Hostname
    # den Namen des Systems auf "heating" setzen.
    # 
    # Danach "Finish" und den Raspberry einmal neustarten lassen.
    # Auf den Raspberry via Netzwerk verbinden 
    ssh -lpi heating
    sudo rpi-update
    
    sudo apt-get update; sudo apt-get upgrade
    sudo apt-get install mc rrdtool owfs-fuse
    # Mit der Mysql Installation wird das mysql root passwort vergeben ('raspheat' habe ich genommen, bei mir im Image)
    sudo apt-get install mysql-server-5.5 
    # als server für phpmyadmin den apache2 wählen. konfiguration phpmyadmin mit dbconfig-common
    # Im Image wurde erneut das Passwort raspheat vergeben
    sudo apt-get install htop apache2 libapache2-mod-php5 phpmyadmin php-pear php-apc secure-delete
    # Ist riesengroß und wird nicht gebraucht
    sudo apt-get purge wolfram-engine

Der Apache Webserver und phpmyadmin sollten nun schon laufen. Zugangsdaten für phpmyadmin sind root und raspheat. http://heating/ http://heating/phpmyadmin/

Sensoren vorbereiten

Die Sensoren werden mittels owfs ausgelsen, siehe dazu Artikel Temperaturmessung mit Linux mittels DS9490R-USB. Der USB-Adapter und der Temperaturfühler ist vorab anzuschließen.

sudo mkdir /media/1-wire
sudo owfs --allow_other -u /media/1-wire
ls -lah /media/1-wire/
cat /media/1-wire/*/temperature

Dabei sollte folgende Ausgabe kommen (Hier ist nur ein Sensor angeschlossen 28.875°, der zweite Wert kommt von einem Sensor der anscheinend eingebaut ist, und immer andere Werte liefert):
Ausgabe des Temperaturfühlers

SVN Repository Auschecken

sudo apt-get install subversion
cd ~
mkdir heating
cd heating

# Wenn ihr nur lesend am Project heatingcontrol beteiligt seid
svn checkout svn://svn.code.sf.net/p/heatingcontrol/code/trunk heatingcontrol-code

# Wenn Ihr auch mitentwicklen wollt (Sourceforge Account vorausgesetzt)
svn checkout --username=euer_sourceforge_name svn+ssh://notdefine@svn.code.sf.net/p/heatingcontrol/code/trunk heatingcontrol-code

Bis jetzt sollte euer Basteltisch so aussehen (Raspi mit Temperaturfühler via DS9490R): Raspi mit Temperaturfühler via DS9490R

Apache konfiguration

cat /etc/apache2/sites-available/default
<VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /home/pi/heating/www
    <Directory />
            Options FollowSymLinks
            AllowOverride None
    </Directory>
    <Directory /home/pi/heating/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
            AllowOverride None
            Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
            Order allow,deny
            Allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Schreibrechte für Apache setzen

cd ~/heating/www/common/temp
chmod 777 * -R .

Datenbank und Tabellen einrichten

Mit Mysql Datenbank als root verbinden, und Benutzer, Datenbank und Tabellen anlegen.

mysql --user=root mysql --password
CREATE DATABASE `heating` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER 'pi'@'localhost' IDENTIFIED BY 'raspheat';

GRANT SELECT , INSERT , UPDATE , DELETE , CREATE , DROP , FILE ,
INDEX , ALTER , CREATE TEMPORARY TABLES , CREATE VIEW , EVENT,
TRIGGER, SHOW VIEW , CREATE ROUTINE, ALTER ROUTINE,
EXECUTE ON * . * TO 'pi'@'localhost' IDENTIFIED BY 'raspheat' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

GRANT ALL PRIVILEGES ON `pi\_%` . * TO 'pi'@'localhost';

USE heating;

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

CREATE TABLE IF NOT EXISTS `desired_values` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `outside_temp` int(11) NOT NULL,
  `return_flow_temp` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `outside_temp` (`outside_temp`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Ruecklauftemperatur in abhaengigkeit der aussentemperatur.' AUTO_INCREMENT=61 ;

INSERT INTO `desired_values` (`id`, `outside_temp`, `return_flow_temp`) VALUES
(1, -35, 36), (2, -34, 36), (3, -33, 36), (4, -32, 36), (5, -31, 36), (6, -30, 36), (7, -29, 36), (8, -28, 36), (9, -27, 36), (10, -26, 36), (11, -25, 36), 
(12, -24, 36), (13, -23, 36), (14, -22, 36), (15, -21, 36), (16, -20, 36), (17, -19, 36), (18, -18, 36), (19, -17, 36), (20, -16, 36), (21, -15, 36), (22, -14, 36), 
(23, -13, 36), (24, -12, 36), (25, -11, 36), (26, -10, 36), (27, -9, 36), (28, -8, 36), (29, -7, 36), (30, -6, 36), (31, -5, 36), (32, -4, 36), (33, -3, 35), 
(34, -2, 34), (35, -1, 32), (36, 0, 32), (37, 1, 32), (38, 2, 32), (39, 3, 32), (40, 4, 32), (41, 5, 31), (42, 6, 30), (43, 7, 30), (44, 8, 29), (45, 9, 29), 
(46, 10, 28), (47, 11, 28), (48, 12, 27), (49, 13, 27), (50, 14, 26), (51, 15, 26), (52, 16, 26), (53, 17, 25), (54, 18, 25), (55, 19, 25), (56, 20, 25), 
(57, 21, 11), (58, 22, 11), (59, 23, 11), (60, 24, 11);


CREATE TABLE IF NOT EXISTS `sensor_values` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8_bin NOT NULL,
  `value` float NOT NULL,
  `unit` varchar(100) COLLATE utf8_bin NOT NULL,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `name` (`name`),
  KEY `timestamp` (`timestamp`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=2657335 ;

CREATE TABLE IF NOT EXISTS `settings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_bin NOT NULL,
  `unit` varchar(255) COLLATE utf8_bin NOT NULL,
  `value` text COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=6 ;

INSERT INTO `settings` (`id`, `name`, `unit`, `value`) VALUES
(1, 'heater', 'bool', '1'),
(2, 'pump_follow_up_time', 'minutes', '45'), (3, 'slider_nighly_temperature_sink_substract', 'celsius', '13'),
(4, 'slider_nighly_temperature_sink_to', 'hour', '23'), (5, 'slider_nighly_temperature_sink_from', 'hour', '6');

quit

Cronjobs konfigurieren

Die Cronjobs des Benutzer pi kann man mit folgendem Befehl anzeigen lassen 'crontab -l', bearbeitet werden diese mit 'crontab -e'. Zu sehen sind hier die Cronjobgs mit folgenden Aufgaben. Deren Funktion können Sie sich im SVN Quellcode ansehen

  • Watchdog - Prüft ob die Steuerung noch Werte ermitteln kann, und startet das System im Fehlerfall neu.
  • Cleanup - Beschränkt die in der Datenbank abgelegten gemessenen Werte und löscht Altdaten.
  • Temperatur eintragen - Mißt aktuelle Temperaturwerte und trägt diese in die Datenbank ein.
  • Graphen erstellen - Erstellt mittels RRDTool die verschiedenen Temperaturgraphen (Für den aktuellen Tag, für die Woche, usw.).
Folgende Einträge müssen ergänzt werden:

#*/2 * * * * cd /home/pi && ./heating/watchdog.sh   --> Inaktiv bis # entfernt wird, dass sollte gemacht werden, wenn alles komplett eingerichtet ist
0   2 * * *  cd /home/pi && ./heating/cleanup.sh

*   * * * *  cd /home/pi && ./heating/insert_new_temp.sh >> /dev/null
*/5 * * * *  cd /home/pi && ./heating/create_graph_quick.sh >> /dev/null
5 */2 * * *  cd /home/pi && ./heating/create_graph_slow.sh >> /dev/null

Ob die Cronjobs auch aufgerufen werden, seht ihr mittels "tail -f /var/log/syslog"

RRD Tool auf Jahres/Wochen und Tagesstatistiken vorbereiten

Die Datenbank beinhaltet die Werte der letzten zwei Jahre gespeichert. Die Werte werden alle zwei Minuten eingetragen (120*24*365*2=525600 zu speicherenden Werte). Das Skript 'init_rrdtool.sh' legt die daüf nötige RRDTool Datenbank an.

cd heating/jobs
./init_rrdtool_db.sh

Sensoren zuweisen

Eine Liste aller Sensoren bekommt man mit:

cd heating/jobs
./list_sensors.sh

Dies sollte eine Liste wie diese hier anzeigen. Hiermit kann man bestimmen welcher Sensor welche Temperatur misst:

/media/1-wire/05.4AEC29CDBAAB Sensortyp: DS2405
/media/1-wire/10.49EE82020800 Sensortyp: DS18S20 Temperatur:       22.125
/media/1-wire/10.49EE83020800 Sensortyp: DS18S20 Temperatur:       32.125
/media/1-wire/10.49EE83020900 Sensortyp: DS18S20 Temperatur:        4.125
/media/1-wire/10.67C6697351FF Sensortyp: DS18S20 Temperatur:      63.5712
/media/1-wire/81.323132000000 Sensortyp: DS1420

Tests einrichten

Um die Steuerungssoftware zu testen, verwende ich PHPUnit. Dazu wird PHPunit installiert:

sudo apt-get install phpunit

Da ich die xdebug var_dumps nicht mag, habe ich es abgeschaltet, in dem ich in die PHP Serverkonfiguration '/etc/php5/apache2/php.ini' den Eintrag 'xdebug.overload_var_dump=0' hinzugefügt habe. Die Tests (phpunit) können ausgeführt werden via:

cd ~/heating/tests
phpunit

GPIO Ports vorbereiten

Damit ohne Superuserrechte auf die GPIO Ports zugegriffen werden kann (InterfaceGpio.class.php), müssen zwei Schritte gemacht werden:

  • www-data in die Gruppe 'gpio'
  • /etc/rc.local anpassen

sudo usermod -aG gpio www-data

Es muss folgender Code in die /etc/rc.local eingetragen werden:

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

/home/pi/heating/jobs/init_boot.sh

exit 0
NOTIZ DATENBANK FLOAT WERTE

Fertig

Glücklich sein ;)

Notiz: Backup erstellen und wiederherstellen

# Heruntergeladene Pakete löschen
sudo apt-get clean

sudo rm /var/log/*.gz
sudo rm /var/log/*.1
sudo rm /var/log/apache2/*.gz
sudo rm /var/log/apache2/*.1

cd ~
# Freien Speicherplatz mit "0" überscrheiben, dasmit das Image kleiner gepackt werden kann
sfill -ll -f -z .

# Backup erstellen
sudo dd bs=1M if=/dev/sdd of=heating_control_2014_02_09.img
# Backup wieder herstellen
sudo dd bs=1M if=heating_control_2014_02_09.img of=/dev/sdd


Last Change: 16-Mar-2014 12:01

Kontakt: Thomas Eimers