Webseite zur Darstellung der Sensordaten

Webseite zur Darstellung der Sensordaten

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

Übersicht Webseite Sensordaten

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.

Mehr lesen

Gaszähler auslesen – Darstellung der Daten

Gaszähler auslesen – Darstellung der Daten

Jedes Jahr im Januar ist es wieder soweit – die Daten des Gaszähler müssen an den Lieferanten übermittelt werden. Dabei ist mir aufgefallen, das meine Darstellung der Daten aus der MySQL-Datenbank noch verbesserungswürdig sind. So hatte ich z.B. nur den Verbrauch der letzten 7 Tage wie im Artikel http://blog.bubux.de/gaszaehler-auslesen/ beschrieben ausgewertet. Da fehlt doch noch eine monatliche und jährliche Übersicht!

Nochmal zur Erinnerung: Ich speichere jede gezählte Umdrehung des Gaszählers als separate Zeile in einer MySQL-Datenbank.

Gaszaehler mySQL Datenbank

Daher müssen die einzelnen Zeilen nach den jeweiligen Kriterien gruppiert und dann das Ergebnis der Spalte “zaehlerstand” summiert werden. Beim Stromzähler wird hingegen immer der aktuelle Gesamtverbrauch in die Datenbank geschrieben und aus den Datenbankeinträgen für die Tages-, Monats- und Jahresverbräuche die Differenz gebildet um entsprechende Auswertungen zu erzeugen.

Auswertung der letzten 12 Monate

Folgendes SQL-Statement ermittelt aus den einzelnen Datenbankeinträgen die Summe gruppiert nach Jahr und Monat. Dabei werden die letzten 12 Monate mittels “INTERVAL” betrachtet.

SELECT
     CASE DATE_FORMAT(timestamp,'%m')
          WHEN 1 THEN 'Jan'
          WHEN 2 THEN 'Feb'
          WHEN 3 THEN 'Mär'
          WHEN 4 THEN 'Apr'
          WHEN 5 THEN 'Mai'
          WHEN 6 THEN 'Jun'
          WHEN 7 THEN 'Jul'
          WHEN 8 THEN 'Aug'
          WHEN 9 THEN 'Sep'
          WHEN 10 THEN 'Okt'
          WHEN 11 THEN 'Nov'
          WHEN 12 THEN 'Dez'
     ELSE 'fehler' END as Monat,
     year(timestamp), sum(zaehlerstand)
FROM gaszaehler WHERE year(timestamp) >= YEAR(CURRENT_DATE - INTERVAL 12 MONTH) AND  month(timestamp) >= month(CURRENT_DATE - INTERVAL 12 MONTH)
GROUP BY month(timestamp), year(timestamp) ORDER BY timestamp;

Auswertung der Jahresverbräuche

Fehlt noch der jährliche Verbrauch. Das SQL-Statement ist einfacher aufgebaut als vorheriges und summiert den Verbrauch pro Jahr für alle in der Datenbank enthaltenen Daten an.

SELECT 
     year(timestamp), sum(zaehlerstand) 
FROM gaszaehler
GROUP BY year(timestamp) ORDER BY timestamp;

Im Ergebnis sieht das Ganze dann wie folgt aus. Die Grafik zur Anzeige der Daten der letzten 12 Monate erstelle ich wie in diesem Artikel beschrieben

Gaszaehler Uebersicht

Viel Spaß bei der Kontrolle des Gasverbrauchs 🙂

Gruß

Chris

Snippet – FHEM mit PHP über Telnet abfragen

Für alle die den Status Ihrer Homemmatic-Geräte anstelle der FHEM-Webseite in einer eigenen Webseite darstellen wollen, gibt es diesmal einen einfachen Schnippsel PHP-Code um den Status eines Homematic-Fensterkontaktes hm-sec-sc per Telnet abzufragen.
Hierfür bietet sich das list-Kommando von FHEM an. Die Syntax ist sehr einfach:

list [devspec] [value]

Wobei [devspec] der Name des Homematic-Gerätes ist, wie es in der FHEM-Einstellungen konfiguriert ist. Für [value] wird STATE als eines der Attribute des Fensterkontaktes abgefragt. STATE gibt neben dem Gerätenamen den aktuellen Zustand closed oder open aus.

Folgendes Script setzt ein entsprechendes Telnet-Kommando ab und parst das Ergebnis:

[cclN_php]
//Hostname und Telnet-Port des FHEM-Servers
$fhemhost = “localhost”;
$fhemport = 7072;

//Socket öffnen
$fhemsock = fsockopen($fhemhost, $fhemport, $errno, $errstr, 30);
//FHEM Kommando definieren (Name des Homematic-Gerätes eintragen)
$fhemcmd = “list STATE\r\nquit\r\n”;
fwrite($fhemsock, $fhemcmd);
while(!feof($fhemsock)) {
$ergebnis=fgets($fhemsock, 128);
$zustand=explode(‘ ‘,$ergebnis);
switch (trim($zustand[1])) {
case “closed”:
$zustand=”geschlossen”;
break;
case “open”:
$zustand=”offen”;
break;
default:
$zustand=$ergebnis[1];
break;
}
if ($ergebnis[1]!=””) {
print “:”.$zustand;
}
}
[/cclN_php]

In einer Webseite kann das dann z.B. folgendermaßen implementiert werden:

fenstersensoren

Ich lasse dann auch jeden Abend um 21 Uhr per Cron-Script prüfen ob alle Fenster geschlossen sind. Wenn nicht, wird eine Mail versendet.

Viel Spaß mit den Schnippsel
Chris