Events

:

:

Elektronik | Funk | Software

Der Technik-Blog

  • Social Media

    YouTube

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden

    Der Technik-Blog

    HomematicIP CCU3 PHP Smartmeter Dashboard

    PHP Dashboard für HmIP Smartmeter

    Alex @ AEQ-WEB

    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!


    Voraussetzungen

    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.

    Rohdaten auslesen via Homematic Script

    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:

    Werbung:

    PHP-Skript zum Datenempfang

    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.";
    }
    ?>
    

    Homematic Skript für eine HTTP-Verbindung

    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:

    • debug:
      Während Verbindungstests durchgeführt werden, sollte die Variable auf "true" gestellt sein. Dadurch werden Fehlermeldungen und weitere Details beim manuellen Aufruf dieses Skripts angezeigt. Nach erfolgreicher Einrichtung sollte debug auf "false" gestellt werden.
    • deviceid:
      Das ist die Seriennummer vom auszulesenden Zwischenstecker. Die Variable beginnt immer mit HmIP-RF.SERIENNUMMER
    • server:
      Hinter der Variable server befindet sich die vollständige URL zum PHP-Skript. Nach dem letzten Slash wird automatisch noch die Datei receiver.php weiter unten im Code angefügt.

    ! 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 + "&current=" + 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:

    Werbung:

    Textdatei überprüfen

    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
    

    Programm auf der CCU3 einrichten

    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:

    PHP Dashboard einrichten

    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!


    Setup ausführen

    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.
    

    Werbung:

    Hinweis: Die Datei setup.php sollte nach erfolgreicher Einrichtung unbedingt vom Webserver gelöscht werden!

    Dashboard aufrufen

    Ü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.


    122X122

    Über den Autor

    Alex, der Gründer von AEQ-WEB. Seit über 10 Jahren beschäftigt er sich mit Computern und elektronischen Bauteilen aller Art. Neben den Hardware-Projekten entwickelt er auch Webseiten, Apps und Software für Computer.

    Top Artikel in dieser Kategorie:

    Arduino PT100 Temperature Sensor Converter

    PT100 Arduino Sketch

    • Video
    • DE/EN

    Beispielcode für den PT100 Temperatursensor an einem Arduino

    Weiterlesen
    STM32 Nucleo 64 Arduino IDE Installation

    STM Boards im Arduino IDE

    • Video

    STM Boards programmieren mit dem Arduino IDE - Alle Infos zur Einrichtung und Installation der Boards, Treiber und Bibliotheken

    Weiterlesen

    Social Media

    YouTube

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden