Gasheizung.
Ein Raspberry Pi Projekt.
Python & Flask & Jinja.
Mit nur wenigen Browser-Klicks hast du die Kontrolle über deinen Gasverbrauch und Gaskosten.
Du musst nicht mehr in den Keller laufen und den Gaszählerstand ablesen. An den Vorlauf- und
Rücklaufrohren für die Heizung und auch für das Warmwasser sind Temperaturfühler montiert. Eine
Analyse für den Gasverbrauch steht nichts mehr im Weg. Zum Beispiel, reduziert eine steile- oder
flache Heizkurve den Gasverbrauch?
Weder an der Gasheizung, Wärmetauscher für Warmwasser und schon gar nicht am Gaszähler wurde
eingegriffen.
Der Raspberry Pi 2 mit externem USB-WiFi-Interface übernimmt die komplette Steuerung. Alle
Messdaten werden in CSV-Dateien und oder in JSON-Files gespeichert. Eine Datenbank gibt es nicht.
Einzige bittere Pille: „twenty-four/seven electric power“. Wenn alles weiterhin so gut läuft, ziehen wir
den Stecker vom Fernseher raus! Punkt. Ende.
Der Raspberry Pi Webserver stellt zwei Webseiten zur Verfügung: Ein Formular zur Eingabe der
Gasparameter und zur Visualisierung der Gaskosten eine Tabelle.
Viele Gaszähler besitzen an der letzten Zählstelle einen Magneten. Positioniert man einen Reedkontakt,
so erhält man bei jeder Rotation am Nulldurchgang einen Impuls. Wenn du so ein Projekt umsetzen willst,
lese zuerst das Kapitel
„Gaszähler und Reedkontakt“
Achtung!
Momentan ist der Webserver noch ein unsicherer Kantonist! Er läuft zwar im hauseigenen Netz und
wird niemals eine Bridge zur Außenwelt (Internet) bekommen, jedoch die Experten warnen eindringlich vor
so einer Nutzung! Leider habe ich die Sicherheitsvorkehrungen wie „WSGI“ im Zusammenhang mit „APACHE“
noch nicht hinbekommen! Es hakelt noch! Ich arbeite dran.
Die hier gezeigte Dokumentation behandelt nur den Part Webserver! Die Auswertung der vier Temperaturen
im Zusammenspiel mit einer Verbrauchsanalyse werden hier nicht gezeigt. Da alle Daten im CSV- oder
JSON-Format vorliegen, transportiere ich diese Dateien mit
FileZilla zum PC und dort ist eine PyQT6-Applikation, die eine Analyse mit Grafiken usw. behandelt.
Das Bild oben zeigt die Installation. In einem Feuchtraum Schaltkasten ist der Raspberry Pi verbaut.
Vier Temperaturfühler (DS18B20) und einen Reedkontakt vom Gaszähler verwaltet er. Ein Display dient
als optische Kontrolle. Es wechselt im 15 Sekundentakt zwischen Kubikmeter Gasverbrauch und
Temperaturanzeige hin und her. Datum und Uhrzeit werden immer visualisiert. Aus Sicht der Software
verrichten sechs Python Parallelprogramme (Threads) ihre Arbeit.
Aus Sicht des Anwenders sind nur die beiden oberen Zeilen und die Tabellenzeile 11 interessant.
Ist der Eurobetrag in Tabellenzeile 11 negativ, bedeutet das eine Nachzahlung. Findest du nicht
auch, dass man schon einen enormen Aufwand in die Hard- und Software stecken muss, um so ein paar
Auswertungen zu erhalten?
Fehler treten auf, wenn Verzeichnisse oder Dateien fehlen, json-Datenformate nicht korrekt
sind oder das Datum nicht mit Punkt getrennt wurde.
Alle Module, die ich in verschiedenen Projekten verwende, sind steckbar aufgebaut. Die beiden
oberen Bilder zeigen den Raspberry Pi 2, dieser stammt aus einem Roboterprojekt HaBuRo1.
Die zwei Bilder unten zeigen den Deckel des Feuchtraum Schalkastens: In der Mitte des Schaltkastens
sind das Display, Taster und eine Leuchtdiode installiert. Betätigt man den Taster für drei Sekunden
werden alle Python Programme beendet. Die rote Leuchtdiode signalisiert das korrekte Abtasten des
Reedkontakts.
Das Projekt hat 58 Euro gekostet. Gekauft wurden das Installationsmaterial, wie Feuchtraumkabel,
Feuchtraum Schaltkasten und Steckdose, PVC-Rohre und Schellen. Der Rest stammt aus der Bastelkiste.
Der Schaltplan. Für die vier DS18B20-Temperatursensoren
wird nur ein 4,7 Kiloohm Pull Up Widerstand, in der Nähe des Raspberry Pis, eingesetzt.
Weiterhin ist nur der Pin 7 für diese vier Sensoren vorgesehen.
gasKosten.html, Speicherort: ../templates/
Das Besondere an der obigen HTML-Datei sind die Zeilen mit:
{{wert.yxyxyxyxyxyx}}. Das ist eine Jinja-Template-Syntax (Platzhalter),
die von Python Flask mit Daten gefüllt werden. Python Flask rendert diese Seite nicht nur, es
werden auch im Methodenrumpf Daten übergeben.
error_gasKosten.html, Speicherort: ../templates/
Auch hier liefert der Server Daten. Siehe Zeile 30.
gasKosten.css, Speicherort: ../static/css/
Python-Flask!
Zeile 13: In Abhängigkeit der Gasparameter werden Berechnungen durchgeführt. Siehe
weiter unten in diesem Kapitel unter „tools.py“. Kehrt diese Funktion ohne Fehlermeldung
zurück, geht es in Zeile 15 weiter. Hier wird die Webseite „gasKosten.html“ angezeigt
(gerendert) wobei im Methodenrumpf die Daten als Python-Dictionaries mitgegeben werden.
Der Mechanismus Flask und Jinja Framework zeigen diese Daten im entsprechenden Platzhalter
an. Im Fehlerfall springt das Programm zur Zeile 17.
Zeile 22 bis 25: Der Server kann mit /shutdown in der URL-Zeile des Browsers beendet werden.
Mehr Details hierüber siehe Menüpunkt Html-Formular.
Erweiterung von „tools.py“,
siehe Python.
Zeile 10 bis 19, Funktion: Berechnung Anzahl der Tage zwischen zwei
Datumsangaben.
Zeile 24 bis 30, Funktion: Prüft, ob das
Datumsformat mit Punkt getrennt wurde.
Zeile 35 bis 104, Funktion:
Berechnet die Gaskosten in Abhängigkeit der Gasparameter, die der Anwender vorher im Webseitenformular
eingegeben hat. Zuerst wird die Datei „gasParam.json“ geöffnet und ein Python-Dictionary mit
Gasparameterdaten gefüllt, Zeile 57 bis 59.
Zeile 61 bis 68: Dem Dictionary wird die Anzahl der Tage hinzugefügt.
Zeile 69 bis 74: Gasverbrauch in m³ und kWh werden berechnet und dem
Dictionary übergeben. Zeile 75 bis 87: Übergabe Bruttopreis,
Arbeitspreis und Summe zum Dictionary. Zeile 88 bis 101: Das Dictionary
erhält die Vorauszahlungen und Differenzbetrag in Euro, bezogen auf die Gasverbrauchskosten.
Zeile 102 bis 104: Die Datei „gasParam.json“ wird mit dem ergänzten
Dictionary neu gespeichert. Im Fehlerfall kehrt die Funktion mit einem Fehlerstring zurück.
Was Python liefert, Zeile 1 bis 108, kannst du hier kontrollieren!
Für die globalen Variablen wurde ein separates Python Modul erstellt. Siehe auch Menüpunkt
Python, Listing „variablen.py“.
Zeile 61: List-Element für die „gasParam.json“-Datei, siehe
weiter unten in dieser Beschreibung. In der Liste gasParam[]
sind alle Daten für die Ermittlung des Gaspreises als Dictionary enthalten.
Zeilen 62 und 63: Pfade für Dateien.
Name: gasParam.json. Speicherort:
..\static\json\
Der Raspberry Pi Flask Server stellt
ein HTML Eingabeformular
zur Verfügung. Parameter für Erdgas können dort eingegeben werden. Mit Betätigung der
Sendetaste werden diese Werte in die gasParam.json Datei geschrieben, siehe oben Zeile
3 bis 9 und 11 . Die Zeilen
10 und 12 werden stündlich aktualisiert. Details findest
du im Menü Python Tools,
Zeile 90 und die Zeilen 150 bis 159.
Mit dem Browser-Aufruf
der Webseite [IP-Adresse Raspberry Pi:Port 6055] generiert
die Software die Werte für die Zeilen 13 bis 22.
Name: gasAbschlagZahlung.json. Speicherort:
..\static\json\
Für diese Datei gibt es kein Eingabeformular! Sie muss im Editor bearbeitet / verändert
werden. Ändert dein Gaslieferant die monatlichen Abschlagszahlungen, so muss die Datei
editiert werden. Achtung! Dezimalzahl mit Punkt trennen.
Dezimalzahl mit Kommatrennung und oder Veränderungen des JSON-Schlüssels (Monat)
hat zur Folge, dass die Webseite Fehlermeldung aufgerufen wird. Siehe auch oben
Python-Tools Zeile 88 bis 94.