Da ich in der letzten Zeit sehr oft bezüglich der Erstellung einer Webseite zur Darstellung der Sensordaten (Heizung, Strom, Wasser, Gas, …) angesprochen wurde, habe ich mich entschlossen eine abgespeckte Variante meiner internen Webseite zu veröffentlichen. Die Webseite nutzt eine ältere Version der Metro UI-Oberfläche als „Framework“ zur Darstellung der HTML-Seiten, sowie pChart zum Zeichnen der Graphen in den Detailansichten.
Meine Implementierung ist schon etwas älter und auch mit der Zeit gewachsen. Da es sich bei dieser Webseite um ein recht überschaubares Projekt handelt und ich mit dem Ergebnis zufrieden bin, habe ich mir nie die Mühe gemacht die Seite generischer zu gestalten. Daher muss bei nötigen Anpassungen der Code direkt geändert werden und es gibt auch keine Trennung von HTML und PHP, keine durchgehende allumfassende Fehlerbehandlung, evtl. „unschönes“ HTML usw.
Der Code soll als Anregung und Grundlage für eine eigene Seite dienen…nicht mehr, nicht weniger. Wem´s ausreicht kann es natürlich auch 1:1 übernehmen. Positiv an meiner Lösung finde ich immer noch die Flexibilität in den Auswertungen die direkt auf der Datenbank mittels SQL ausgeführt werden können.
Die Startseite
Die Startseite wird mittels „Meta-Refresh“ alle 180 Sekunden neu geladen und dient der Übersicht der wichtigsten Sensordaten. Mit Klick auf die (verlinkten) Boxen gelangt man jeweils zu einer detaillierteren Übersicht der Sensordaten. In der Übersicht werden keine komplizierten Datenbankauswertungen gemacht. Hier werden die Snapshot-Tabellen mit den aktuellen Werten ausgelesen und einige SQL-Aggregat-Funktionen genutzt. Das ging auch auf einem alten Raspi einigermaßen schnell. Das hängt natürlich von den Tabellengrößen in den Datenbanken ab. Da bei mir einige Tabellen mit den Jahren relativ groß geworden sind (~500k Zeilen), bin ich irgendwann auf einen Odroid umgestiegen.
Übersicht der Außentemperaturen
Die Übersicht der Außentemperatur wird aus den Daten des Außenfühlers der Viessmann-Heizung generiert. Die Übersichten für anderen Sensoren sehen analog dieser Ansicht aus.
Die Übersicht der Heizungsdaten
Die Übersicht der Heizungsdaten stellt verschiedene Daten dar die mittels openv aus der Heizung ausgelesen werden. Aktuell lese ich mit openv nur aus und setze keine Werte (z.B. Sommer-/Winterumschaltung).
Voraussetzung und Grundlagen
Details zum Auslesen der verschiedenen Sensordaten findet ihr in vorangegangenen Artikeln hier im Blog:
- Viessmann Heizung mittels openv auslesen
- M-Bus Wasserzähler auslesen
- Gaszähler mit Reed auslesen
- Stromzähler mit optischem Lesekopf auslesen
Die Webseite liest die Datenbanken des Wasserzähler, des Gaszählers, der Heizung und des Stromzählers aus. Folgend nochmal eine Übersicht der Tabellenstrukturen welche auch in den Artikel oben zu finden sind. In MySQL (bzw. MariaDB) habe ich zwei Datenbanken angelegt (vito, haus) mit verschiedenen Tabellen.
Die Tabellen der Datenbank „vito“:
CREATE TABLE `brenner` ( `timestamp` datetime NOT NULL, `brennerstarts` float NOT NULL, `brennerstunden` float NOT NULL, `brennerstatus` int(11) NOT NULL, KEY `timestamp` (`timestamp`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `snapshot` ( `timestamp` datetime NOT NULL, `brennerstatus` float NOT NULL, `brennerstarts` float NOT NULL, `brennerstunden` float NOT NULL, `solarstunden` float NOT NULL, `solarleistung` float NOT NULL, `aussentemperatur` float NOT NULL, `warmwasser` float NOT NULL, `speicher_unten` float NOT NULL, `kollektor` float NOT NULL, `kesseltemperatur` float NOT NULL, `vorlauftemperaturM2` float NOT NULL, `vorlaufsolltemperaturM2` float NOT NULL, `raumsolltemperaturM1` float NOT NULL, `raumsolltemperaturM2` float NOT NULL, `raumsolltemperaturredM1` float NOT NULL, `raumsolltemperaturredM2` float NOT NULL, `warmwassersoll` float NOT NULL, `kesseltemperatursoll` float NOT NULL, `pumpestatusM1` float NOT NULL, `pumpestatusSP` float NOT NULL, `pumpestatussolar` float NOT NULL, `statusstoerung` varchar(100) CHARACTER SET latin1 COLLATE latin1_german1_ci NOT NULL, `systemzeit` varchar(100) CHARACTER SET latin1 COLLATE latin1_german1_ci NOT NULL, `error0` varchar(500) CHARACTER SET latin1 COLLATE latin1_german1_ci NOT NULL, `BetriebArt` varchar(20) NOT NULL, `BetriebArtM2` varchar(20) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `solar` ( `timestamp` datetime NOT NULL, `solarstunden` float NOT NULL, `solarleistung` float NOT NULL, `solarpumpe` int(11) NOT NULL, KEY `timestamp` (`timestamp`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `temperaturen` ( `timestamp` datetime NOT NULL, `aussentemperatur` float NOT NULL, `warmwasser` float NOT NULL, `speicher_unten` float NOT NULL, `kollektor` float NOT NULL, `vorlaufsolltemperaturM2` float NOT NULL, KEY `timestamp` (`timestamp`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
Die Tabellen der Datenbank „haus“:
CREATE TABLE `gaszaehler` ( `timestamp` datetime NOT NULL, `zaehlerstand` float NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `stromzaehler` ( `timestamp` datetime NOT NULL, `public_key` varchar(100) NOT NULL, `zaehlerstand` float DEFAULT NULL, `active_power` float NOT NULL, KEY `strom_index` (`timestamp`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `strom_snapshot` ( `zeitstempel` date NOT NULL, `zaehlerstand` float NOT NULL, `wirkleistung` float NOT NULL, `aktuelles_jahr` float NOT NULL, `aktueller_monat` float NOT NULL, `aktueller_tag` float NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `wasserzaehler` ( `timestamp` datetime NOT NULL, `zaehlerid` int(11) NOT NULL, `zaehlerstand` float NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `wasser_snapshot` ( `timestamp` date NOT NULL, `zaehlerstand` float NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1
„Installation“
Einen funktionierenden Webserver (z.B. Apache) mit PHP und eine MySQL oder MariaDB vorausgesetzt, muss das unten verlinkte tar.gz in ein beliebiges Verzeichnis im www-Verzeichnis des Webservers entpackt werden.
Das funktioniert mit
tar -xvzf webseite_sensordaten.tar.gz
Konfiguration
In der Datei config.inc müssen ein paar wenige Einstellungen vorgenommen werden. Folgende Einstellungen werden für die Verbindung zur Datenbank benötigt:
$mysqlhost="<hostname>"; $mysqluser="<username>"; $mysqlpwd="<passwort>"; $mysqldbvito="<name_der_db_mit_den_vito_tabellen>"; $mysqldbhaus="<name_der_db_mit_den_haus_tabellen>";
Die folgenden Werte dienen der Auswertung des Gaszählers. Da dieser per Reed-Kontakt ausgelesen keinen Gesamtstand ausgibt und nur die einzelnen Impulse zählt, kann hier ein Startwert definiert. Auch die Werte zur Umrechnung von m³ in KW werden hier eingetragen. Diese Informationen gibt es beim Gaslieferanten.
Zudem kann noch definiert werden wie viel Tage in der Übersicht angezeigt werden sollen. Entsprechender Werte gibt es auch für den Wasserzähler und den Stromzähler.
$gas_startwert="2311650"; $brennwert_gas=10.097; $zustandszahl_gas=0.9309; $anz_tage_gas=7; $anz_tage_wasser=7; $anz_tage_strom=7;
Wichtiger und letzter Schritt: Das Verzeichnis „tmp“ muss schreibbar für den Webserver sein. Dort werden die generierten Graphen als PNG gespeichert. Das war es schon!
Fehlt nur noch das Paket mit den PHP-Seiten: webseite_sensordaten.tar.gz
Viel Spaß mit
Chris