Elektronische Haushalts Zähler [eHZ] auslesen

Was meinst Du mit Request, Klartext.

Schon mal DTR auf true gesetzt ob er dann gesprächig wird.

Also hier die verwendeten Einstellungen.

Baud: 300
Data: 7
Stop: 1
Parity: Even
Send „CR-LF“

wie auf volkszähler.org beschrieben.

Ich sende in HEX " 2F 3F 21 0D 0A "

Also antwort erhalte ich nur die Zähler Hersteller/ZählerID.

Verwendete Software: HTerm

Grüße

Oli

Das dürfte das Protokoll sein: LIAN 98(de) : Protokoll IEC 62056-21 / IEC 61107, Telegrammstruktur

Also ich erhalte immer nur:

/LGZ4ZMF100AC.M25

Hallo Oli,

hast du mal dieses Programm versucht: http://www.meter-test-equipment.com/download/pdf/en/Test1107pack.exe ?

Auf dieser Seite wird das Protokoll auch recht gut beschrieben:
Home Automation Domotica Forum Europe, Bwired Forum • View topic - Reading the IR port of an IEC 62056-21 Smart Meter

>Sende ich einen Request /?! bekomme ich nur einen klartext Zählerkennung und nicht mehr.<
Du musst innerhalb von 1,5sek die Antwort des Zählers bestätigen.

Gruß
Udo

Hallo Udo,

vielen Dank.

mit diesem Programm ist es nun OK.

Ich denke mein ACK war nicht schnell genug.

Gibt es die möglichkeit dem Zähler zusagen, das er im Intervall senden soll?

Ohje jedesmal eine Anfrage zusenden?

Vielen Dank.

Grüße
Oli

Also ich würde gerne eine Anfrage senden, um den Zählerstand nach Bedarf zu erfragen. Mein Hager ballert mich in 2ms Abständen zu und ich muss, damit IPS nicht nur damit beschäftigt ist, drumherum arbeiten…

@ Axel: Du hast SML … anderes Protokoll

@ Oli:

hier was ich mal in Perl programmiert habe: SourceForge.net Repository - [openautomation] Log of /tools/d0-IEC62056-meter/iec62056-meter.pl

%channels -> Gruppenadresse einfach leer lassen und Zeile 115 ( &knx_write ($ga,$value):wink: mit # auskommentieren.
Der Rest sollte im Script eigentlich gut erklärt werden.
Welche der Werte der Zähler ausspuckt sagt Dir ja die verlinkte testxxx.exe

Das ganze läuft bei mir schon ein paar Monate als cronjob alle 2 Minuten.

Keine Chance. Der Hager reagiert nicht auf Anfragen. Da bleibt dir nur über ein Script die Schnittstelle zu deinen gewollten Zeitpunkten abzufragen.

Gruß
Udo

Hallo Leute,

ich brauche dringend eure Hilfe da ich einfach nicht weiter komme.

Ich habe einen elektronischen Zähler bekommen „easymeter Q3D“.
Q3D» EasyMeter GmbH

Hierzu habe ich mir einen optischen Ablesekopf gekauft:
EMH BKE-Datenschnittstelle - co.met webShop

Dieser hat allerdings diesen RJ9 Stecker. Lt. Beschreibung soll die Belegung wie folgt sein:
pos. Betriebsspannung Pin 1
Bezugspotential Pin 2
Empfangsdaten Pin 3
Sendedaten Pin 4

Habe jetzt diesen RJ9 Stecker abgekniffen und mir einen weiblichen RS232 angelötet.
Folgende Belegung am RS232 Stecker:
pos. Betriebsspannung vom Ablesekopf an Pin 4
Bezugspotential vom Ablesekopf an Pin 5
Empfangsdaten RxD vom Ablesekopf an Pin2
Sendedaten TxD vom Ablesekopf an Pin 3

Das sollte meiner Meinung nach korrekt sein. Bevor ich jetzt versuche, Daten in IPS einzulesen kämpfe ich damit, überhaupt Daten in ein Terminalprogramm zu bekommen. Habe hterm an meinem alten Lappi mit RS232 Schnittstelle probiert, aber es kommen keine Daten an. Evtl. hab ich auch vergessen eine Option zu aktivieren nur ich kriege es nicht hin.
Lt. einer anderen Internetseite sollen folgende Einstellungen in hterm gewählt werden:
9600Baut; 7Bit; gerade(even) Parität; 1 Stop Bit

Wie bekomme ich das ganze ans Laufen. Weiß echt nicht weiter. Kann mir hier evtl. jemand Schritt für Schritt helfen!

DTR auf true gesetzt?

Danke für eure Tipps, ich mußte nur RxD und TxD tauschen und schon lief alles. Skript von Rainer läuft auch wunderbar.

Hi,

ich habe leider noch ein kleines Problem mit dem Skript vom Anfangspost. Ich nutze es und es funktioniert bis auf ein paar Fehlermeldungen korrekt, es liest auch alle Werte aus und ordnet sie korrekt zu, allerdings bekomme ich ums Verrecken nicht die Fehlermeldungen weg.

Hier die Fehlermeldungen:


Notice:  Undefined offset: 0 in D:\IP-Symcon\scripts\36254.ips.php on line 36

Notice:  Undefined offset: 0 in D:\IP-Symcon\scripts\36254.ips.php on line 40

Notice:  Undefined offset: 0 in D:\IP-Symcon\scripts\36254.ips.php on line 40

Notice:  Undefined offset: 0 in D:\IP-Symcon\scripts\36254.ips.php on line 40

Notice:  Undefined offset: 0 in D:\IP-Symcon\scripts\36254.ips.php on line 49

Warning:  Variable #0 existiert nicht in D:\IP-Symcon\scripts\36254.ips.php on line 49


Hier das Skript:


<?
$eHZdata = array("1-0:0.0.0*255"    => 16819, //Zählernummer
                 "1-0:1.8.0*255"    => 36176, //Bezugszähler
                 "1-0:2.8.0*255"  	=> 24156, //Lieferzähler
                 "1-0:96.5.5*255"   => 25862, //Statusinformation
                 "0-0:96.1.255*255"   => 22777, //Fabriknummer
                 "1-0:1.7.255*255" 	=> 15756, // Gesamtleistung
                 "1-0:21.7.255*255" => 41562, // Wirkleistung L1
                 "1-0:41.7.255*255" => 35236, // Wirkleistung L2
                 "1-0:61.7.255*255" => 19770  // Wirkleistung L3
                 );

$Netzperiodendauer = 39833 /*[Stromzähler\Netzperiodendauer]*/; // VariablenID der Obis Kennzahl der Netzperiodendauer
$var1 = 16819 /*[Stromzähler\Zählernummer]*/; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var2 = 25862 /*[Stromzähler\Status]*/; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var3 = 22777 /*[Stromzähler\Fabriknummer]*/; // 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);
    }
}
?>

Hoffe ihr könnt mir helfen.

if(preg_match('/[A-F]/', $data))
        {
           SetValue($eHZdata[$id], (string)$data);
        }
        else
        {
            SetValue($eHZdata[$id], (float)$data);
        }

Danke Rainer,

nur kannst du mir sagen wie das fertige Skript auszusehen hat, oder mir die Stelle sagen wo ich dein Codeschnipsel einfügen muss. Hab jetzt schon ein paar Stelle probiert aber bekomme immer noch Fehlermeldungen. :confused:

Ich würd im Post 19 mal nachsehen. Da steht sowas drinnen und in anderen Threads auch.

Wo du Recht hast, hast du Recht. Wie war das noch mit dem Wald vor lauter Bäumen :rolleyes:

Danke Reiner…funktioniert :wink:

EDIT:

So, gestern von der Arbeit gekommen und was sehe ich im IPS Logger. Es laufen schon wieder Fehler von dem Script auf.

Was ist denn das schon wieder

Fehlermeldung:

Notice: Undefined offset: 0 in D:\IP-Symcon\scripts\36254.ips.php on line 36

Notice: Undefined offset: 0 in D:\IP-Symcon\scripts\36254.ips.php on line 40

Notice: Undefined offset: 0 in D:\IP-Symcon\scripts\36254.ips.php on line 40

Notice: Undefined offset: 0 in D:\IP-Symcon\scripts\36254.ips.php on line 40

Notice: Undefined offset: 0 in D:\IP-Symcon\scripts\36254.ips.php on line 56

Warning: Variable #0 existiert nicht in D:\IP-Symcon\scripts\36254.ips.php on line 56

Hier mein Script


<?
$eHZdata = array("1-0:0.0.0*255"    => 16819, //Zählernummer
                 "1-0:1.8.0*255"    => 36176, //Bezugszähler
                 "1-0:2.8.0*255"      => 24156, //Lieferzähler
                 "1-0:96.5.5*255"   => 55488, //Statusinformation
                 "0-0:96.1.255*255"   => 22777, //Fabriknummer
                 "1-0:1.7.255*255"     => 15756, // Gesamtleistung
                 "1-0:21.7.255*255" => 41562, // Wirkleistung L1
                 "1-0:41.7.255*255" => 35236, // Wirkleistung L2
                 "1-0:61.7.255*255" => 19770  // Wirkleistung L3
                 );

$Netzperiodendauer = 39833 /*[Stromzähler\Netzperiodendauer]*/; // VariablenID der Obis Kennzahl der Netzperiodendauer
$var1 = 16819 /*[Stromzähler\Zählernummer]*/; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var2 = 55488 /*[Stromzähler\Status]*/; // VariablenID der Obis Kennzahl der Daten welche nicht umgerechnet werden
$var3 = 22777 /*[Stromzähler\Fabriknummer]*/; // 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
            }
        }
                 //echo $data."
";
        if(preg_match('/[A-F]/', $data))
        {
           SetValue($eHZdata[$id], (string)$data);
        }
        else
        {
            SetValue($eHZdata[$id], (float)$data);
        }
    }
}
?>

Rainer weißt du noch einen Rat?

Wann treten denn die Meldungen auf, immer, sporadisch… Den Meldungen nach, sind doch dann die Daten nicht vorhanden.

Habe jetzt gerade noch mal geschaut. Es ist wirklich sporadisch. Um 14:40Uhr waren die Meldungen da, dann wieder um 15:02Uhr und 15:03Uhr. Danach wieder alles i.O…

Gesendet von meinem S2 mit Tapatalk