Elektronische Haushalts Zähler [eHZ] auslesen

Hallo Rainer

ok, verstanden, ist kein SML … dachte ich, weil der Zähler ja „neu“ ist …

Was ich irgendwie nicht verstehe ist das mit dem Cutter.

Links: Die SN die sich immer wiederholt
Rechts ???
Wie kann ich denn prüfen ob der Cutter richtig läuft? Im Debug Fenster? Oder muss ich dazu erstmal die Variablen füllen und dann schauen ob das passt?

Danke

Schaust Du dir auch Bilder an.

Dann schau dir die Regvar. im Debug an was ankommt.

Gesendet von iPad mit Tapatalk

Hi Rainer

bin ein gutes Stück weiter gekommen.

Reg-Var zeigt im Debug nun folgendes an:

12/30/2018, 4:58:30 PM | RECEIVED | <CR><LF><CR><LF>1-0:96.1.0255(001LOG0065076593)<CR><LF>1-0:1.8.0255(000444.9580kWh)<CR><LF>1-0:2.8.0255(000000.0000kWh)<CR><LF>1-0:0.2.0255(ver.03,432F,20170504)<CR><LF>1-0:96.90.2255(0F66)<CR><LF>1-0:97.97.0255(00000000)<CR><LF>

12/30/2018, 4:58:30 PM | PROCESSED | <CR><LF><CR><LF>1-0:96.1.0255(001LOG0065076593)<CR><LF>1-0:1.8.0255(000444.9580kWh)<CR><LF>1-0:2.8.0255(000000.0000kWh)<CR><LF>1-0:0.2.0255(ver.03,432F,20170504)<CR><LF>1-0:96.90.2255(0F66)<CR><LF>1-0:97.97.0255(00000000)<CR><LF>

passt soweit (denke ich)

Variablen habe ich entsprechend angelegt:

Script entsprechend angepasst:

<?
$eHZdata = array("1-0:96.1.0*255"    => 53432,
                 "1-0:1.8.0*255"    => 22469,
                 "1-0:2.8.0*255"  => 15138,
                 "1-0:0.2.0*255"   => 55537,
                 "1-0:96.90.2*255" => 35134, 
                 "1-0:97.97.0*255" => 18052
                 );



$Netzperiodendauer = 0; // VariablenID der Obis Kennzahl der Netzperiodendauer
$var1 = 0; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var2 = 0; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var3 = 0; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden

//Dateneingang von Registervariable
$string = explode("
", trim($IPS_VALUE));
for($i = 0; $i < count($string); $i++)
{
    $id = strstr($string[$i], "(", true); // split nach Obis Kennzahl
    $value = strstr($string[$i], "("); // split nach Daten
    $check = strpos($value, "*"); // suche nach Daten mit Angaben V-A-W
    if($check !== false) // Daten mit V-A-W ausgeben und formatieren auf 2 Stellen nach dem Komma
    {
       $value = strstr($value, "*", true); // split nach *V-A-W
        $data = substr($value, 1);
        SetValue($eHZdata[$id], number_format((float)$data, 2, ',', ''));
    }
    else // alle anderen Daten ausgeben
    {
        $data = substr(trim($value), 1, -1);
        if(strlen($data) <= 4) // Daten mit bis zu 2 Byte
        {
           if($eHZdata[$id] == $Netzperiodendauer)
            {
               $data = hexdec($data)/100; // Daten umrechnen 1/100 in ms
            }
            elseif(($eHZdata[$id] == $var1) || ($eHZdata[$id] == $var2) || ($eHZdata[$id] == $var3))
            {
               $data = $data; // Daten ohne Umrechnung
            }
            else
            {
               $data = hexdec($data); // Daten von Hex nach Dec umrechnen
            }
        }
        SetValue($eHZdata[$id], (float)$data);
    }
}
?>

Das Script bekommt auch immer ein update alle 1 - 2 Sekunden.
Allerdings verändern sich die angelegten Variablen nicht …

Wo ist mein Denkfehler?

Danke

Eventuell auch mal die Doku lesen.

$_IPS[‚VALUE‘]

Das Script ist über 8 Jahre alt…soviel zu deinem neuen Zähler.[emoji30]

Gesendet von iPad mit Tapatalk

ok, das habe ich jetzt mal geändert in:

$string = explode("
", trim(RegVar_GetBuffer(51475)));

beim manuellen starten bekomme ich:

Notice: Undefined offset: 0 in /var/lib/symcon/scripts/34799.ips.php on line 37

Notice: Undefined offset: 0 in /var/lib/symcon/scripts/34799.ips.php on line 50

Warning: Variable #0 does not exist in /var/lib/symcon/scripts/34799.ips.php on line 50

was jeweils auf die Netzperiodendauer verweist, dich ich derzeit in meinen Daten aber nicht habe, d.h. der Zähler gibt sie mir nicht.
Von daher habe ich einfach mal „0“ drin stehen lassen, was ich so verstanden habe (in der Anleitung: Var ID der Netzperiodendauer eintragen wenn denn vorhanden)

Aktuelles Script:

<?
$eHZdata = array("1-0:96.1.0*255"    => 53432,
                 "1-0:1.8.0*255"    => 22469,
                 "1-0:2.8.0*255"  => 15138,
                 "1-0:0.2.0*255"   => 55537,
                 "1-0:96.90.2*255" => 35134, 
                 "1-0:97.97.0*255" => 18052
                 );



$Netzperiodendauer = 0; // VariablenID der Obis Kennzahl der Netzperiodendauer
$var1 = 53432; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var2 = 55537; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var3 = 35134; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var4 = 18052; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden

//Dateneingang von Registervariable
$string = explode("
", trim(RegVar_GetBuffer(51475)));

for($i = 0; $i < count($string); $i++)
{
    $id = strstr($string[$i], "(", true); // split nach Obis Kennzahl
    $value = strstr($string[$i], "("); // split nach Daten
    $check = strpos($value, "*"); // suche nach Daten mit Angaben V-A-W
    if($check !== false) // Daten mit V-A-W ausgeben und formatieren auf 2 Stellen nach dem Komma
    {
       $value = strstr($value, "*", true); // split nach *V-A-W
        $data = substr($value, 1);
        SetValue($eHZdata[$id], number_format((float)$data, 2, ',', ''));
    }
    else // alle anderen Daten ausgeben
    {
        $data = substr(trim($value), 1, -1);
        if(strlen($data) <= 4) // Daten mit bis zu 2 Byte
        {
           if($eHZdata[$id] == $Netzperiodendauer)
            {
               $data = hexdec($data)/100; // Daten umrechnen 1/100 in ms
            }
            elseif(($eHZdata[$id] == $var1) || ($eHZdata[$id] == $var2) || ($eHZdata[$id] == $var3))
            {
               $data = $data; // Daten ohne Umrechnung
            }
            else
            {
               $data = hexdec($data); // Daten von Hex nach Dec umrechnen
            }
        }
        SetValue($eHZdata[$id], (float)$data);
    }
}
?>

„Doku“, also den Thread habe ich jetzt komplett gelesen bis zu dem Punkt als es nur noch um die PIB Belegung von irgendwelchen COM Ports ging. Und das ist auch immer wieder das Problem mit „Dokus“ zu schippten / Modulen. Solange die nicht in GIT abgelegt werden ist es selten möglich sich dort über 50 Seiten Threads etwas zusammen zu reimen.

Doku IPS: Prima, aber als (erneuter) Neuling ist es nicht immer einfach, vor allem, wenn PHP nicht gerade das Steckenpferd ist, Da ist es manchmal sehr hilfreich über Try and Fail oder funktionierende Beispiele auf Ideen zu kommen, die man dann abändert …

Dennoch, danke für Deine Hilfe bisher. Kannst Du „adhoc“ sehen, wo ich noch ein Problem habe?

Sorry,

mehr wie auf dem Tablett serviert geht ja nicht.

Warum ersetzt Du nicht einfach das was ich gepostet habe?

Zudem vermischst Du hier 2 verschiedene komplett andere Auswertungen.

Bitte im angegebenen Link weiterposten!

Gesendet von iPad mit Tapatalk

Ich hab das jetzt in den richtigen Thread verschoben.

Ersetzte das alte Ips_Value durch das neue…dann sehen wir weiter.

Mache ich …

habe jetzt mal die Zeile

$string = explode("
", trim(RegVar_GetBuffer(51475)));

in

$string = explode("
", trim($_IPS['VALUE']));

geändert, nun werden auch die Variable aktualisiert.
Das mit dem „RegVar_GetBuffer“ stand in einem Deiner Posts an einen anderen User, der (andere) Probleme hatte.
Fehlermeldungen erhalte ich nun immer noch:

Notice: Undefined index: VALUE in /var/lib/symcon/scripts/34799.ips.php on line 20

Notice: Undefined offset: 0 in /var/lib/symcon/scripts/34799.ips.php on line 37

Notice: Undefined variable: Netzperiodendauer in /var/lib/symcon/scripts/34799.ips.php on line 37

Notice: Undefined offset: 0 in /var/lib/symcon/scripts/34799.ips.php on line 57

Warning: Variable #0 does not exist in /var/lib/symcon/scripts/34799.ips.php on line 57

aber das Update der Variablen funktioniert, ausser bei der Seriennummer, da steht immer 1 anstatt „001LOG0065076593“ was ich eigentlich erwarten würde.

Für dich ist relavant die 1.8.0 und die eventuell sofern Einspeisung die 2. Den Rest kannst Du aus dem Script nehmen samt Auswertung. Dann sind auch die Fehlermeldungen weg.

Das ist alles nicht böse gemeint, nur Support für Hardware von vor 8 Jahren und älter…

Obwohl es ja hier nicht viel zu ändern gibt. Auf die neuste Syntax angepasst und funktioniert immer noch.

Ps. Ansonsten, kannst Du ja auch mal diesen passenden Thread durch lesen. Dort gab es auch noch Änderungen je nach Zähler.

werde ich probieren, Danke Rainer.

Ich nehme mal alles ausser 1.8.0 raus, hoffentlich bekomme ich bald die PIN … Dann bekomme ich mehr Daten.

Der Zähler ist „Brandneu“, erst vor einigen Wochen in ein neues EFH eingebaut worden, daher hatte ich erstmal nach dem Thema SML gesucht …
habe hier noch einen zweiten Zähler (der „älter“ aussieht) für die Luft-Wärme Pumpe, der Spuckt aber im Moment noch gar nichts aus, denke mal ich muss die Optik erst einschalten (lassen)

Noch kurze Frage am Ende: Weiss jemand, ob der Energy Forecast von Raketenschnecke auch mit 5.0 läuft?
Auf der Website ist seit 2016 nichts mehr passiert un Kontaktieren kann man ihn auch nicht, da alle Emails links ins Leere laufen …

Nur noch ganz kurz.

Brandneu…für deinen Netzbetreiber vielleicht.[emoji23]

Im Moment läuft die Zertifizierung der Gateways für SML.

Erwarte dir von der PIN nicht allzu viel. Kann, muss aber nicht sein.
Es gab mal Zähler die haben alles ausgegeben…ganz am Anfang…so vor über 8 Jahren. [emoji41]

Den Rest deiner Frage kann ich dir leider nicht beantworten.
Von Andreas hab ich schon ewig nix mehr gehört.

Gesendet von iPad mit Tapatalk

Hallo Rainer

so funktioniert soweit, bis auf eine Kleinigkeit (ja ich weiss, eigentlich brauche ich die Daten nicht, würde aber gerne wissen, warum es nicht funktioniert …

Die Variable „Seriennummer“ ist als String ausgeführt, dennoch wird immer nur „1“ in die Variable eingetragen und nicht die eigentlich ausgelesene Seriennummer.
Ich finde den Fehler irgendwie nicht, denn mit z.B. der Firmware Version klappt es ja auch …

Debug Reg Var:
01/01/2019, 6:23:37 PM | PROCESSED | <CR><LF><CR><LF>1-0:96.1.0255(001LOG0065076593)<CR><LF>1-0:1.8.0255(000465.9092kWh)<CR><LF>1-0:2.8.0255(000000.0000kWh)<CR><LF>1-0:0.2.0255(ver.03,432F,20170504)<CR><LF>1-0:96.90.2255(0F66)<CR><LF>1-0:97.97.0255(00000000)<CR><LF>

ich würde den String 001LOG0065076593 in der Variable erwarten.

Script:

<?

$eHZdata = array("1-0:96.1.0*255"    => 53432,
                 "1-0:1.8.0*255"    => 22469,
                 "1-0:2.8.0*255"  => 15138,
                 "1-0:0.2.0*255"   => 55537,
                 "1-0:96.90.2*255" => 35134, 
                 "1-0:97.97.0*255" => 18052
                 );



$Netzperiodendauer = 0; // VariablenID der Obis Kennzahl der Netzperiodendauer
$var1 = 53432; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var2 = 55537; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var3 = 35134; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var4 = 18052; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden

//Dateneingang von Registervariable
//$string = explode("
", trim(RegVar_GetBuffer(51475)));
$string = explode("
", trim($_IPS['VALUE']));
for($i = 0; $i < count($string); $i++)
{
    $id = strstr($string[$i], "(", true); // split nach Obis Kennzahl
    $value = strstr($string[$i], "("); // split nach Daten
    $check = strpos($value, "*"); // suche nach Daten mit Angaben *V-A-W
    if($check !== false) // Daten mit V-A-W ausgeben und formatieren auf 2 Stellen nach dem Komma
    {
       $value = strstr($value, "*", true); // split nach *V-A-W
        $data = substr($value, 1);
        SetValue($eHZdata[$id], number_format((float)$data, 3, ',', ''));
    }
    else // alle anderen Daten ausgeben
    {
        $data = substr(trim($value), 1, -1);
        if(strlen($data) <= 4) // Daten mit bis zu 2 Byte
        {
           if($eHZdata[$id] == $Netzperiodendauer)
            {
               $data = hexdec($data)/100; // Daten umrechnen 1/100 in ms
            }
            elseif(($eHZdata[$id] == $var1) || ($eHZdata[$id] == $var2) || ($eHZdata[$id] == $var3) || ($eHZdata[$id] == $var4))
            {
               $data = $data; // Daten ohne Umrechnung
            }
            else
            {
               $data = hexdec($data); // Daten von Hex nach Dec umrechnen
            }
          }
         //echo $data."
";
        if(preg_match('/[A-F]/', $data))
        {
           SetValue($eHZdata[$id], (string)$data);
        }
        else
        {
            SetValue($eHZdata[$id], (float)$data);
        }
    }
}
?>

Hallo zusammen,

habe das Script aus Beitrag 1 schon seit Jahren erfolgreich an meinem Windows PC mit RS232 Schnittstelle am Laufen.
Nun wollte ich damit auf meinen Pi umziehen.
Hab daher alle notwendigen Einstellungen am Pi vorgenommen!
Variablen angelegt, Serial port erstellt, Register Variable,Script und cutter angelegt.
So weit so gut. Den SERIAL to USB Konverter hab ich natürlich vorher auch bei Windows getestet.
Den Lesepkopf vom Easymeter hab ich dann mit dem Adapter am Pi angeschlossen und mit

 ls -l /dev/serial/by-id

den passenden USB Port rausgesucht und im Serial Port angelegt.
Mit

pi@raspberrypi3:~ $ cat /dev/ttyUSB1
/ESY5Q3DA1004 V3.02

1-0:0.0.0*255(0926008378)
1-0:1.8.0*255(00039821.4818161*kWh)
1-0:21.7.255*255(000738.72*W)
1-0:41.7.255*255(000365.39*W)
1-0:61.7.255*255(000116.94*W)
1-0:1.7.255*255(001221.05*W)
1-0:96.5.5*255(82)
0-0:96.1.255*255(1ESY0941001678)
!

hab ich kontrolliert das Daten ankommen.

Nun kommen die Daten aber immer nur mit einer Länge von 1 oder 2 Zeichen im Serial port an. Das ist anders als beim Windows PC. Wundert mich da die Daten bei der Kontrolle oben mit dem Befehl

cat /dev/ttyUSB1

ja sauber lesbar angezeigt werden.
Demnach läuft das Script natürlich immer in eine Fehlermeldung da das array anscheinend nicht gefüllt wird.

Für Hilfestellung bei der Einstellung des Serial Ports wäre ich dankbar.

Was kommt denn im Debug der Regvar an.

Sofern der Cutter richtig eingestellt ist, gibt er ja nur den kompletten Datensatz raus.

Mit den Einstellungen am Pi kann ich dir nicht helfen.

Gesendet von iPad mit Tapatalk

Moin Rainer,

anbei einmal das Debug der RegisterVariablen.

Die angelegten Variablen werden nicht gefüllt.

<?
$eHZdata = array("1-0:0.0.0*255"    => 27121 /*[Test\Strom\Zählernummer]*/, //Zählernummer
                 "1-0:1.8.0*255"    => 25396 /*[Test\Strom\Zählerstand]*/, //Zählerstand
                 "1-0:1.7.255*255"  => 15309 /*[Test\Strom\Wirkleistung Summe]*/, //Wirkleistung Summe
                 "1-0:96.5.5*255"   => 48644 /*[Test\Strom\Zählernummer	est1]*/, //test1
                 "0-0:96.1.255*255" => 20099 /*[Test\Strom\Zählernummer	est2]*/, //test2
                 "1-0:21.7.255*255" => 24706 /*[Test\Strom\Wirkleistung L1]*/, // Wirkleistung L1
                 "1-0:41.7.255*255" => 18914 /*[Test\Strom\Wirkleistung L2]*/, // Wirkleistung L2
                 "1-0:61.7.255*255" => 32214 /*[Test\Strom\Wirkleistung L3]*/  // Wirkleistung L3
                 );

$Netzperiodendauer = 56041 /*[Test\Strom\Netzperiodendauer]*/; // VariablenID der Obis Kennzahl der Netzperiodendauer
$var1 = 56041 /*[Test\Strom\Netzperiodendauer]*/; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var2 = 56041 /*[Test\Strom\Netzperiodendauer]*/; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var3 = 56041 /*[Test\Strom\Netzperiodendauer]*/; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden

//Dateneingang von Registervariable
//$string = explode("
", trim(RegVar_GetBuffer(14099)));
$string = explode("
", trim($IPS_VALUE));
for($i = 0; $i < count($string); $i++)
{
    $id = strstr($string[$i], "(", true); // split nach Obis Kennzahl
    $value = strstr($string[$i], "("); // split nach Daten
    $check = strpos($value, "*"); // suche nach Daten mit Angaben V-A-W
    if($check !== false) // Daten mit V-A-W ausgeben und formatieren auf 2 Stellen nach dem Komma
    {
       $value = strstr($value, "*", true); // split nach *V-A-W
        $data = substr($value, 1);
        SetValue($eHZdata[$id], number_format((float)$data, 2, ',', ''));
    }
    else // alle anderen Daten ausgeben
    {
        $data = substr(trim($value), 1, -1);
        if(strlen($data) <= 4) // Daten mit bis zu 2 Byte
        {
           if($eHZdata[$id] == $Netzperiodendauer)
            {
               $data = hexdec($data)/100; // Daten umrechnen 1/100 in ms
            }
            elseif(($eHZdata[$id] == $var1) || ($eHZdata[$id] == $var2) || ($eHZdata[$id] == $var3))
            {
               $data = $data; // Daten ohne Umrechnung
            }
            else
            {
               $data = hexdec($data); // Daten von Hex nach Dec umrechnen
            }
        }
        SetValue($eHZdata[$id], (float)$data);
    }
}
?>

register.txt (18 KB)

Was hast Du den für eine IPS Version laufen?

IPS Value ist nicht mehr uptodate.

$string = explode("
", trim($_IPS['VALUE']));

Gesendet von iPad mit Tapatalk

Moin Rainer,

auf dem Windows Rechner wo alles funktioniert läuft noch eine 4.4 da ich dort noch mit 32bit unterwegs bin.
Auf dem Raspberry läuft IP-Symcon 5.0, Raspberry Pi, 19.06.2018, 4db47b93210d
Oh Mann, das war der entscheidenen Hinweiß:
die entsprechende Zeile im Script von

$string = explode("
", trim($IPS_VALUE));

in

$string = explode("
", trim($_IPS['VALUE']));

geändert und schon werden die Daten aktuallisiert.

:banghead:Da hab ich jetzt zwei Tage lang am falschen Ende (SerialPort) gesucht und dann findest Du das Problem in so kurzer Zeit.:slight_smile:

:loveips:Super und DANKE.

Das steht mit Sicherheit aber auch im Fehlerlog.[emoji6]

Gesendet von iPad mit Tapatalk

:o Ja da steht das, aber das hab ich immer auf eine der Variablen bezogen.
:rolleyes:Bin halt kein Programmierer

Danke nochmal recht herzlich für Deine Hilfe!

Heute wurden meine Zähler getauscht. Vorher hatte ich Itronzähler und heute wurden bei mir Logarexzähler gesetzt.
Da mein Kumpel im Vorfeld auch schon Logarexzähler bekommen habe, wollte ich eigentlich seine Lösung kopieren.
Sein Dump sieht aber trotz gleichen Zähler komplett anders aus. Er sieht die Datensätze laut Beschreibung und meine sehen wie im Anhang aus. Ich komme einfach nicht weiter … kann es sein das dieser Zähler eine andere „Sprache“ spricht??
Wer kann helfen?

dump.txt (47.7 KB)