[Modul] Obis Counter zur Integration der Infrarotschnittstelle von Haushaltszählern

Hi Jürgen,

habe für mich mit KI schnell was gebaut zum testen.

Uli

cool, wenn du etwas funktionierendes hast, das ich für die Allgemeinheit übernehmen soll, lass es mich wissen.
Grüße
Jürgen

Kann ich so nicht bestätigen. Habe inzwischen den dritten eHZ (EMH, ZPA, LGZ) und musste bisher noch bei keinem die PIN nach einem Stromausfall neu eingeben. Entweder konnte man das Verhalten gezielt einstellen oder man musste die PIN explizit wieder aktivieren. Was sich jedoch stark unterscheidet, sind die Daten, die die Hersteller per SML mit erweitertem Datensatz ausgeben. Der eine liefert nur die Momentanleistung und die Zählerstände, mehr nicht. Der andere liefert alles, was das Herz begehrt (Frequenz, Spannung, Phasenwinkel, einzelne Phasen etc.). Leider ist mein aktueller wieder einer, der nur das Minimalset liefert.

@michaz Bin jetzt wieder zuhause. Brauchst du Hilfe oder ist das Problem inzwischen behoben?

@all Gibt es Interesse an einer Wattwächter-Integration? Habe mir die Doku eben mal angeguckt. Sollte eigentlich nicht schwer sein. Brächte aber mal Probedaten von euch, da ich selbst keinen Wattwächter besitze.

Grüße
Jürgen

Bei mir gab es ein Problem mit den Baudraten und irgendwelchen Paritätsbits. Zähler und Wattwächter haben wohl unterschiedliche Verbindungseinstellungen. Dadurch kam der Datensalat an. Ich habe die KI bemüht und nun ein Script, dass die Daten direkt aus dem Zähler in passenden Variablen schreibt. Funktioniert bisher tadellos. Kann ich bei Interesse gerne teilen.

Schön, dass du die Lösung gefunden hast. An dem Script und einem typischen Datensatz hätte ich Interesse.
Grüße
Jürgen

Hier der Code. Ich weiß aber nicht, in welcher Form ich dir einen Datensatz schicken soll.

<?php

// Nur ausführen, wenn Daten von der RegisterVariable kommen
if ($_IPS['SENDER'] == "RegisterVariable") {
    
    // 1. Rohdaten mit Zeichensalat abgreifen
    $raw_data = $_IPS['VALUE'];
    
    // 2. Zeichensalat filtern (Paritätsbit für 7E1 entfernen)
    $clear_text = "";
    for ($i = 0; $i < strlen($raw_data); $i++) {
        $clear_text .= chr(ord($raw_data[$i]) & 127);
    }
    
    // 3. Buffer nutzen (RegVar-Funktionen statt Property)
    $buffer = RegVar_GetBuffer($_IPS['INSTANCE']);
    $buffer .= $clear_text;
    
    // Daten in einzelne Zeilen zerlegen
    $lines = explode("\n", $buffer);
    
    // Letzte unvollständige Zeile für den nächsten Durchlauf sichern
    $buffer = array_pop($lines);
    RegVar_SetBuffer($_IPS['INSTANCE'], $buffer);
    
    // 4. Alle Werte auswerten und in IDs schreiben
    foreach ($lines as $line) {
        $line = trim($line);
        
        // 1.8.0 - Bezug (E_in) -> Float
        if (preg_match('/1-0:1\.8\.0.*?\((.*?)\*kWh\)/', $line, $matches)) {
            SetValueFloat(59612, floatval($matches[1]));
        }
        
        // 2.8.0 - Einspeisung (E_out) -> Float
        if (preg_match('/1-0:2\.8\.0.*?\((.*?)\*kWh\)/', $line, $matches)) {
            SetValueFloat(12830, floatval($matches[1]));
        }
        
        // 16.7.0 - Aktuelle Leistung (Power) -> Integer
        if (preg_match('/1-0:16\.7\.0.*?\((.*?)\*W\)/', $line, $matches)) {
            SetValueInteger(14817, intval($matches[1]));
        }
        
        // 36.7.0 - Leistung Phase 1 (36_7_0) -> Integer
        if (preg_match('/1-0:36\.7\.0.*?\((.*?)\*W\)/', $line, $matches)) {
            SetValueInteger(37691, intval($matches[1]));
        }
        
        // 56.7.0 - Leistung Phase 2 (56_7_0) -> Integer
        if (preg_match('/1-0:56\.7\.0.*?\((.*?)\*W\)/', $line, $matches)) {
            SetValueInteger(54555, intval($matches[1]));
        }
        
        // 76.7.0 - Leistung Phase 3 (76_7_0) -> Integer
        if (preg_match('/1-0:76\.7\.0.*?\((.*?)\*W\)/', $line, $matches)) {
            SetValueInteger(21443, intval($matches[1]));
        }
        
        // 96.1.0 - Zählernummer (96_1_0) -> String
        if (preg_match('/1-0:96\.1\.0.*?\((.*?)\)/', $line, $matches)) {
            SetValueString(26692, trim($matches[1]));
        }
    }
}

Danke für den Code. Das Skript hast du hinter einem Server-Socket laufen? Und die MQTT-Daten sendest Du an diesen Server-Socket? Habe ich das richtig verstanden?
Wenn ja, dann wäre es cool, wenn du mir mal eine „dump.txt“ vom Debug der
RegisterVariable-Instanz schicken kannst. Gerne auch per PN.

Grüße
Jürgen

Mein Wattwächter ist direkt über einen “Serial Port” verbunden. Ich benutze die MQTT-Verbindung gar nicht. Das Script bekommt die Rohdaten über die Registervariable.

alles klar, danke. Dann muss ich mir einen anderen Weg suchen.

Grüße
Jürgen