PHP Dashboard für HmIP Smartmeter
09.10.2024
Elektronik | Funk | Software
Der Technik-Blog
In diesem Artikel geht es um das auswerten von Verbrauchsdaten aus der HomematicIP Schalt-Mess-Steckdose am eigenen Webserver. Dazu wird auf der Zentrale ein Skript erstellt, welches die Daten vom Zwischenstecker ausliest und anschließend über das HTTP-Protokoll an einen Webserver überträgt.
Hinweis: Dieses Projekt wurde entwickelt und getestet mit einer HomematicIP CCU3 Zentrale. Einige andere Zentralen wie beispielsweise der HomematicIP Accesspoint unterstützt nicht die Ausführung von Skripts!
Für dieses Projekt wird eine Homematic-IP Schalt-Mess-Steckdose benötigt, welche an einer CCU3 Zentrale angelernt ist. Zusätzlich zu den HomematicIP Produkten wird noch ein Webserver mit MySQL und PHP benötigt.
Zuerst kann man sich mit einem einfachen Skript alle verfügbaren Parameter von einem Gerät anzeigen lassen. So kann mit dem folgenden Skript nicht nur die Parameter von einer Schalt-Mess-Steckdose ermittelt werden, sondern auch Parameter von anderen Geräten wie Temperatursensoren, Rauchmelder, Bewegungsmelder und vielen weiteren Geräten. In der HomematicIP CCU3 Weboberfläche gibt es unter dem Menüpunkt "Programme & Zentralenverknüpfung" einen Button mit "Skript testen", wo folgender Skript eingefügt wird:
! Listet alle Parameter von einem bestimmten HmIP Device auf string device = "0000AAAA0000AA"; ! Seriennummer vom gewünschten Gerät string index; string parameters = dom.GetObject(ID_DATAPOINTS).EnumUsedNames(); foreach (index, parameters) { var sserial = (index.StrValueByIndex(":", 0).StrValueByIndex(".", 1)); if (sserial == device) { Write(index # "\n"); } }
Der String "0000AAAA0000AA" muss durch die Seriennummer vom gewünschten Gerät ersetzt werden. Klickt man auf Ausführen, so sollten alle verfügbaren Parameter aufgelistet werden:
Auf den Webserver wird zuerst ein PHP-Script hochgeladen, welches die empfangenen Daten in eine Textdatei schreibt. Damit kann sehr einfach überprüft werden, ob die HTTP-Verbindung zum Webserver von der CCU aus funktioniert. Folgendes PHP-Skript (receiver.php) wird auf den Webserver geladen:
<?php // Prüfen, ob alle Parameter vorhanden sind if (isset($_GET['power']) && isset($_GET['voltage']) && isset($_GET['current']) && isset ($_GET['energy']) && isset($_GET['frequency'])) { // Parameter auslesen $power = $_GET['power']; $voltage = $_GET['voltage']; $current = $_GET['current']; $energy = $_GET['energy']; $frequency = $_GET['frequency']; // Zeitzone setzen und Datum/Zeit abrufen date_default_timezone_set('Europe/Berlin'); $datetime = date('d-m-Y H:i:s'); // Datenstring erstellen $data = "$datetime: Leistung: $power, Spannung: $voltage, Strom: $current, Verbrauch: $energy, Frequenz: $frequency\n"; // In eine Textdatei schreiben und das Ergebnis überprüfen $file = 'data.txt'; $result = file_put_contents($file, $data, FILE_APPEND); // Überprüfen, ob der Schreibvorgang erfolgreich war if ($result !== false) { echo "[OK]"; } else { echo "[Fehler] Schreibvorgang fehlgeschlagen."; } } else { echo "Fehlende Parameter. Bitte alle Parameter (power, voltage, current, energy & frequency) übergeben."; } ?>
Das folgende Skript wird sowohl für einen Verbindungstest als auch später für die kontinuierliche Datenübermittlung verwendet werden. Dieses Skript holt sich die Daten vom Smartmeter (Schalt-Mess-Steckdose HmIP-PSM-2) und startet via Exec im Betriebssystem auf der Homematic CCU3 einen HTTP-Request und übermittelt die Daten via HTTP-GET. Zu beachten ist, dass folgende Variablen am Anfang vom Codebeispiel entsprechend angepasst sind:
! HomematicIP Script: Geräteparameter auslesen und per HTTP-GET senden | https://www.aeq-web.com boolean debug = true; ! Debug-Modus (im produktiven Betrieb auf "false" stellen) string deviceid = "HmIP-RF.0000AAAAAA0000"; ! Geräte-ID string server = "http://dein-server.de/smartmeter/"; ! Serveradresse var power = dom.GetObject(deviceid + ":6.POWER").Value().ToString(2); var voltage = dom.GetObject(deviceid + ":6.VOLTAGE").Value().ToString(1); var current = dom.GetObject(deviceid + ":6.CURRENT").Value().ToString(0); var energy = dom.GetObject(deviceid + ":6.ENERGY_COUNTER").Value().ToString(1); var frequency = dom.GetObject(deviceid + ":6.FREQUENCY").Value().ToString(2); ! Variablen zur Speicherung der Server-Antwort und Fehlerausgabe: string stdout; string stderr; ! Aufbau der URL mit den GET-Parametern: string httpgetdata = "?power=" + power + "&voltage=" + voltage + "¤t=" + current + "&energy=" + energy +"&frequency=" + frequency; var url = server + "receiver.php" + httpgetdata; ! Debug-Modus: Wenn aktiviert, werden zusätzliche Informationen angezeigt: if (debug) { WriteLine("DEBUG-Modus aktiviert:\n"); WriteLine("Leistung: " # power # " W"); WriteLine("Spannung: " # voltage # " V"); WriteLine("Strom: " # current # " mA"); WriteLine("Energiezähler: " # energy # " Wh"); WriteLine("Frequenz: " # frequency # " Hz\n"); ! Führt den `wget`-Befehl aus und speichert die Server-Antwort in `stdout` und mögliche Fehler in `stderr` system.Exec("wget -O - '" # url # "'", &stdout, &stderr); ! Überprüfen, ob die Server-Antwort exakt [OK] enthält if (stdout == "[OK]") { WriteLine("receiver.php hat die Daten erfolgreich verarbeitet!"); } else { ! Fehlermeldung, wenn die Server-Antwort nicht [OK] entspricht WriteLine("SERVERANTWORT NICHT OK!"); ! Zusätzliche Informationen bei Fehlern WriteLine("Aufgerufene URL: " # url); WriteLine("Server-Antwort (stdout): " # stdout); WriteLine("Fehlerausgabe (stderr): " # stderr); } } else { ! Wenn der Debug-Modus deaktiviert ist, wird der Befehl still ausgeführt (-q für quiet mode) und läuft im Hintergrund (&) system.Exec("wget -q -O - '" # url # "' &", &stdout, &stderr); WriteLine("WGET wurde aufgerufen..."); }
Konnte das Skript eine Verbindung zum Server herstellen und die Daten übertragen, sollte die Ausgabe ungefähr wie folgt aussehen:
Wenn die Variable "debug" auf "true" gesetzt ist, dann wird auch im Fehlerfall (Beispiel fehlerhaften URL) eine entsprechende Ausgabe erzeugt:
Wenn das Homematic-Skript eine Verbindung zum PHP-Skript herstellen konnte, dann sollte am Webserver nun eine Textdatei (data.txt) mit folgendem Inhalt vorhanden sein:
03-10-2024 13:40:02: Leistung: 8.940, Spannung: 242.40, Strom: 73, Verbrauch: 2.50, Frequenz: 49.96 03-10-2024 13:40:31: Leistung: 8.130, Spannung: 241.80, Strom: 73, Verbrauch: 2.80, Frequenz: 49.94 03-10-2024 13:42:44: Leistung: 6.380, Spannung: 240.10, Strom: 57, Verbrauch: 3.10, Frequenz: 49.97 03-10-2024 13:45:47: Leistung: 6.130, Spannung: 239.40, Strom: 55, Verbrauch: 3.40, Frequenz: 49.98
Sobald vom Smartmeter neue Daten eintreffen, sollen diese auch direkt zum Webserver weitergeleitet werden. Dazu muss in der Weboberfläche unter "Programme & Zentralenverknüpfung" ein neues Programm erstellt werden. Als Gerät wird die gewünschte Schalt-Mess-Steckdose ausgewählt und bei einer Frequenz größer 45 Hz soll das Skript aufgerufen werden. Da die Netzfrequenz in der Regel 50 Hz beträgt, wird mit diesem Trick bei jedem Dateneingang das Skript ausgeführt. Die Regel sieht wie folgt aus:
Das Dashboard dient zur detaillierten Aufzeichnung von den Verbrauchsdaten eines Gerätes, welches an das Smartmeter angeschlossen ist. Die Messdaten werden in einer MySQL-Datenbank gespeichert. Zuerst wird der ZIP-Ordner HmIP PHP Dashboard heruntergeladen, extrahiert und die vier PHP-Dateien auf das gewünschte Verzeichnis vom Webserver hochgeladen. In der Datei config.php müssen die Zugangsdaten, der Datenbankname und die Serveradresse zum Datenbankserver angepasst werden. Der Inhalt dieser Datei sieht wie folgt aus:
<?php // MySQL-Zugangsdaten define('DB_SERVER', 'localhost'); // Datenbank-Server define('DB_USERNAME', 'username'); // Benutzername define('DB_PASSWORD', 'password'); // Passwort define('DB_NAME', 'db-name'); // Name der Datenbank $conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME); if ($conn->connect_error) { die("Verbindung zur Datenbank fehlgeschlagen: " . $conn->connect_error); } ?>
Die vier Variablen müssen auf den eigenen MySQL-Datenbankserver angepasst werden!
Nachdem die Datei config.php angepasst wurde, kann die Datei setup.php über den Browser aufgerufen werden. Dieses Skript erstellt am Datenbankserver zwei Tabellen, wo die Aufzeichnungsdaten und Einstellungen gespeichert werden. Wenn die Datenbank korrekt vom PHP-Skript eingerichtet werden konnte, werden folgende Meldungen ausgegeben:
Tabelle "data" erfolgreich erstellt. Tabelle "settings" erfolgreich erstellt. Standardwert in "settings" erfolgreich eingefügt.
Hinweis: Die Datei setup.php sollte nach erfolgreicher Einrichtung unbedingt vom Webserver gelöscht werden!
Über den Browser wird das Dashboard aufgerufen. Wenn noch keine Daten aufgezeichnet wurden, sieht das Dashboard wie folgt aus:
Anschließend wird die Aufzeichnung gestartet und das gewünschte Gerät an das Smartmeter angeschlossen. Nach einigen Minuten kann die Seite aktualisiert werden und es sollten die aufgezeichneten Daten angezeigt werden:
Hinweis: Wird eine neue Aufzeichnung gestartet, werden die Daten von der vorherigen Aufzeichnung gelöscht.
STM Boards programmieren mit dem Arduino IDE - Alle Infos zur Einrichtung und Installation der Boards, Treiber und Bibliotheken
WeiterlesenAEQ-WEB © 2015-2024 All Right Reserved