Stromzähler mit RS485 Schnittstelle im Pull-Modus einlesen

Hallo Zusammen,

nachdem meine beiden Logarex Stromzähler zuverlässig per optischer Schnittstelle funktionierten (siehe: Stromzähler mit optischer Schnittstelle einlesen), dachte ich mir ich müsste mal wieder etwas verbessern… :stuck_out_tongue:

Ich habe die RS485 Schnittstelle der beiden Stromzähler nach außen geführt und mit einem Moxa verbunden. Leider kommen keine Daten an.

Daraufhin habe ich nochmals durch die Anleitung (Logarex LK13BE8030x9 - Gebrauchsanleitung.pdf) des Stromzählers geblättert und folgendes gefunden:
„Datenausgabe an der RS485 Schnittstelle ist im „PULL“-Modus
Datenausgabe an der optischen Schnittstelle ist im „PUSH“-Modus.“

Ich folgere hieraus, dass man bei der optischen Schnittstelle in einem nicht beeinflussbarem Intervall die Daten erhält, hingegen muss man bei RS485 die Daten anfragen, sobald man diese erhalten möchte. Das würde auch mein Problem erklären.

Die Frage ist jetzt: Wie kann ich die Daten abrufen?

Gruß

Jürgen

Hallo Zusammen,

kann mir niemand für RS485 einen Tipp geben?

Habe beim Googeln etwas bzgl. Widerstand gefunden. Benötige ich einen Widerstand irgendwo in der Leitung von einem Moxa NPort 5232 zu einem RS485 Gerät?

Ich befürchte du musst dich eingehend mit dem Protokoll beschäftigen: https://www.din.de/de/mitwirken/normenausschuesse/dke/normen/wdc-beuth:din21:59515021

Die ganzen EHZ hier im Forum werden alle bisher im PUSH Betrieb ausgewertet. Ich glaube du bist der erste der sich um den PULL Betrieb kümmern will.

paresy

Hallo paresy,

denke, dann wird mich vermutlich eine Analyse dieses Codes weiterbringen:
j62056 Overview – IEC 62056-21 – OpenMUC

Wie sende ich per Client-Socket etwas an den Zähler?

Egal welchen IO, benutze einfach RegVar_SendText um die Daten an die RegisterVariable zu senden.
Der ist das egal ob dann dahinter ein ClientSocket oder ein SerialPort ist.
Michael

Hallo Zusammen,

bin schon einen Schritt weiter.
Der Zähler antwortet auf eine Anfrage! :cool:

Wenn ich folgendes sende:

RegVar_SendText($registerVariable, "/?!
");

Erhalte ich folgende Identification Message zurück:

/LOG5LK13BE803049<CR><LF>

/ = start character
LOG = manufacturers identification (bspw. Logarex)
5 = 9600 Bd → Handelt es sich jedoch um Protocol Mode C or E???
LK13BE803049 = Identification (=Typenbezeichnung des Zählers)
= Completion character

Befinde ich mich nun im Protokoll Mode C oder E?

Sowohl im Protokoll Mode C oder E muss man ein ACK senden, gefolgt von der Baudrate zwischen zwei Nullen (=5):

RegVar_SendText($registerVariable, chr(0x06)."050
");

Und schon erhält man eine vordefinierte Standardantwort. Diese ist identisch mit der Ausgabe per optischer Schnittstelle. :smiley:

Hallo Jürgen,
ich würde mit meinen beiden Logarex-Zählern gerne das gleiche machen.
Ich hatte vorher Itron Zähler die mit Volkszähler-Hardware über IR abgefragt wurden. Jetzt hat sich die Baudrate geändert und es scheint keinen zu geben, der mir bei „Volkszähler“ gegen Bezahlung die Firmware neuer Erstellt/flasht.

Welchen Converter von Moxa benutzt du denn und bist du schon weiter mit der Auswertung der Daten?

Hallo Marcus,

ich nutze den Moxa NPort 5232 mit 2 Anschlüssen für RS485, da ich einen Hoch-/Niedertarifzähler und einen PV-Zähler habe.
Du kannst jeden x-beliebigen Moxa für RS485 verwenden. Es gibt auch welche, die mit RS232 und RS485 verwendet werden können, somit wärst du für die Zukunft flexibel, jedoch kosten diese auch mehr…

Die Auswertung funktioniert identisch zur IR-Schnittstelle.
Du musst sozusagen nur die Datenquelle in IPS umstellen. In meinem Fall war es von 2x Moxa NPort 5110 für RS232 mit IR-Lesekopf auf 1x Moxa NPort 5232 mit 2 Anschlüssen für RS485. Das Auswerteskript kannst du 1:1 wiederverwenden, da der Rückgabestring identisch ist.

Danke für den Gerätetip … leider auch kein JOE.

Beim Auswerteskript muss ich aber wahrscheinlich doch was ändern, da ich von Itron auf Logarex gewechselt habe.
Kannst du mir dein Skript mal zur Verfügung stellen. Ich denke das antriggern machst du über ein Zeitplan?

Meinte POE:rolleyes:

Hallo Jürgen,
kann ich davon ausgehen, dass du die Daten noch nicht auswertest?

Hallo,

ich verstehe jetzt nicht, was hier schwer ist.
Du erhältst einen String und diesen durchsuchst du nach den möglichen Register-Variablen deines Zählers, welche du idealerweise in einem Array ablegst:

foreach($registerArray AS $register)
{
if(0 === strpos($string, $register[0]))
{
// --> RegisterVariable gefunden und die dazugehörige Variable in IPS mit dem erhaltenen Wert setzen
}
}

An welcher Stelle benötigst du Hilfe?

:oMag sein das es für dich nicht schwer ist … für mich schon.
Entschuldigung wenn ich zum Thema PHP wie ein Anfänger wirke aber das liegt daran, dass ich einer bin.
Meine Stärken liegen in der Elektrotechnik, KNX, LCN, Bier brauen:D

Mein vorheriges Script mit den Itron-Zählern hatte ich mir auch zusammen gebastelt ohne in der tiefe zu verstehen was da passiert.
Ich gehe davon aus das ich bei den Logarex-Zähler das Script ändern muss und bat dich um teilen deiner Lösung.

Wenn du dein Script nicht teilen möchtest oder du noch keine Auswertung machst ist das ja OK …

Hallo,

per Copy-Paste wird mein Skript bei dir nicht funktionieren, da ich viele Funktionen ausgelagert habe und zudem eine zentrale Config-Datei nutze.

Ich versuche dir den Ablauf nochmals zu erläutern.

Du erhältst den String des Zählers in einem Rutsch von deinem Client-Socket + RegisterVariable in IPS. Auszulesen ist dieser String im „Target-Skript“ der Registervariable per:

$_IPS['VALUE']

Anschließend kannst du den String im „Target-Skript“ in die einzelnen Zeilen für die weitere Auswertung splitten per:

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

Jetzt gibt es natürlich wie so oft verschiedene Wege nach Rom, aber ich erläutere dir meinen.
Nun machst du zwei geschachtelte FOR-Schleifen. Einmal um die einzelnen Zeilen des Strings (nun im Array $parts gespeichert) zu durchlaufen und einmal um nach der richtigen RegisterVariable des Zählers (im Array $registerArray gespeichert) zu suchen. Die Zeile kann einer RegisterVariable des Zählers für die weitere Auswertung eindeutig anhand der ID, wie bspw. 1-0:96.1.0*255, zugeordnet werden:

// Teile des Strings durchsuchen
foreach($parts AS $part)
{
  $part = trim($part);
  // Mögliche RegisterVariablen des Zählers durchlaufen und prüfen, welche in dieser Zeile enthalten ist
  foreach($registerArray AS $register)
  {
    if(0 === strpos($part, $register[0]))
    {
      //--> RegisterVariable des Zählers gefunden
    }
  }
}

Hoffe das hilft dir weiter.

:slight_smile: OK … im groben glaube ich zu wissen wie du es meinst. Vielen Dank

:rolleyes: Wenn ich meine Brainboxes RS-413 bekomme, lege ich los und werde berichten.

So ich bin nun fertig und es hat alles gut geklappt. Da ich nicht der PHP-Guru bin, bin ich über Verbesserungsvorschläge dankbar.

Also folgende Hardware ist vorhanden:
Logarex Elektrozähler Gebrauchsanleitung_LK13BE8030x9.pdf (1.63 MB)

RS485-Ethernet Konverter: Brainboxes ES-413

Baumansicht IPS:

ClientSocket:

Cutter:

RegVar:

Die Initialisierung (PullModus) des Zählers:

<?

RegVar_SendText(43427 /*[Zähler\eHZ\RegVar eHZ]*/, "/?!
");
IPS_Sleep(1000);
RegVar_SendText(43427 /*[Zähler\eHZ\RegVar eHZ]*/, chr(0x06)."050
");

?>

Auswertungsskript der Daten aus der RegVar:

<?

// Auswertung der eHZ-Daten am RS485 Port A

    // Zählernummer Obiskennung:1-0:96.1.0*255 Hex:31 2d 30 3a 39 36 2e 31 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x39).chr(0x36).chr(0x2e).chr(0x31).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x39).chr(0x36).chr(0x2e).chr(0x31).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $hersteller = substr($wert[1], 1, 16);
        SetValueString(25110 /*[Zähler\eHZ\RegVar eHZ\Hersteller]*/, $hersteller);
    }
    // Import Obiskennung:1-0:1.8.0*255 Hex:31 2d 30 3a 31 2e 38 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $import = substr($wert[1], 1, 11);
        SetValue(14055 /*[Zähler\eHZ\RegVar eHZ\1.8.0 Import EVU]*/, $import);
    }
    // Export Obiskennung:1-0:2.8.0*255 Hex:31 2d 30 3a 32 2e 38 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x32).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x32).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $export = substr($wert[1], 1, 11);
        SetValue(10193 /*[Zähler\eHZ\RegVar eHZ\2.8.0 Export EVU]*/, $export);
    }
    // Export Obiskennung:1-0:16.7.0*255 Hex:31 2d 30 3a 31 36 2e 37 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x36).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x36).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $stromeff = substr($wert[1], 1, 7);
        SetValue(10335 /*[Zähler\eHZ\RegVar eHZ\Stromeffektivwert]*/, $stromeff);
    }
    // Export Obiskennung:1-0:32.7.0*255 Hex:31 2d 30 3a 33 32 2e 37 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x33).chr(0x32).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x33).chr(0x32).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $spannungL1 = substr($wert[1], 1, 5);
        SetValue(22834 /*[Zähler\eHZ\RegVar eHZ\Spannung L1]*/, $spannungL1);
    }
    // Export Obiskennung:1-0:52.7.0*255 Hex:31 2d 30 3a 35 32 2e 37 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x35).chr(0x32).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x35).chr(0x32).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $spannungL2 = substr($wert[1], 1, 5);
        SetValue(22377 /*[Zähler\eHZ\RegVar eHZ\Spannung L2]*/, $spannungL2);
    }
    // Export Obiskennung:1-0:72.7.0*255 Hex:31 2d 30 3a 37 32 2e 37 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x37).chr(0x32).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x37).chr(0x32).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $spannungL3 = substr($wert[1], 1, 5);
        SetValue(28019 /*[Zähler\eHZ\RegVar eHZ\Spannung L3]*/, $spannungL3);
    }
    // Export Obiskennung:1-0:31.7.0*255 Hex:31 2d 30 3a 33 31 2e 37 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x33).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x33).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $stromL1 = substr($wert[1], 1, 6);
        SetValue(15011 /*[Zähler\eHZ\RegVar eHZ\Strom L1]*/, $stromL1);
    }
    // Export Obiskennung:1-0:51.7.0*255 Hex:31 2d 30 3a 35 31 2e 37 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x35).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x35).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $stromL2 = substr($wert[1], 1, 6);
        SetValue(29366 /*[Zähler\eHZ\RegVar eHZ\Strom L2]*/, $stromL2);
    }
    // Export Obiskennung:1-0:71.7.0*255 Hex:31 2d 30 3a 37 31 2e 37 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x37).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x37).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $stromL3 = substr($wert[1], 1, 6);
        SetValue(15642 /*[Zähler\eHZ\RegVar eHZ\Strom L3]*/, $stromL3);
    }
    // Export Obiskennung:1-0:81.7.1*255 Hex:31 2d 30 3a 38 31 2e 37 2e 31 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x38).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x31).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x38).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x31).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $winkelUL2UL1 = substr($wert[1], 1, 3);
        SetValue(30399 /*[Zähler\eHZ\RegVar eHZ\Phasenwinkel UL2 : UL1]*/, $winkelUL2UL1);
    }
    // Export Obiskennung:1-0:81.7.2*255 Hex:31 2d 30 3a 38 31 2e 37 2e 32 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x38).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x32).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x38).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x32).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $winkelUL3UL1 = substr($wert[1], 1, 3);
        SetValue(43442 /*[Zähler\eHZ\RegVar eHZ\Phasenwinkel UL3 : UL1]*/, $winkelUL3UL1);
    }
    // Export Obiskennung:1-0:81.7.4*255 Hex:31 2d 30 3a 38 31 2e 37 2e 34 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x38).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x34).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x38).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x34).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $winkelIL1UL1 = substr($wert[1], 1, 3);
        SetValue(30582 /*[Zähler\eHZ\RegVar eHZ\Phasenwinkel IL1 : UL1]*/, $winkelIL1UL1);
    }
    // Export Obiskennung:1-0:81.7.15*255 Hex:31 2d 30 3a 38 31 2e 37 2e 31 35 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x38).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x31).chr(0x35).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x38).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x31).chr(0x35).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $winkelIL2UL2 = substr($wert[1], 1, 3);
        SetValue(25119 /*[Zähler\eHZ\RegVar eHZ\Phasenwinkel IL2 : UL2]*/, $winkelIL2UL2);
    }
    // Export Obiskennung:1-0:81.7.26*255 Hex:31 2d 30 3a 38 31 2e 37 2e 32 36 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x38).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x32).chr(0x36).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x38).chr(0x31).chr(0x2e).chr(0x37).chr(0x2e).chr(0x32).chr(0x36).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $winkelIL3UL3 = substr($wert[1], 1, 3);
        SetValue(15654 /*[Zähler\eHZ\RegVar eHZ\Phasenwinkel IL3 : UL3]*/, $winkelIL3UL3);
    }
    // Export Obiskennung:1-0:14.7.0*255 Hex:31 2d 30 3a 31 34 2e 37 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x34).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x34).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $netzfrequenz = substr($wert[1], 1, 4);
        SetValue(14058 /*[Zähler\eHZ\RegVar eHZ\Netz Frequenz]*/, $netzfrequenz);
    }
    // Export Obiskennung:1-0:1.8.0*96 Hex:31 2d 30 3a 31 2e 38 2e 30 2a 39 36
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x39).chr(0x36)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x39).chr(0x36), $_IPS['VALUE']);
        $energie1d = substr($wert[1], 1, 7);
        SetValue(32468 /*[Zähler\eHZ\RegVar eHZ\Energieverbrauch letzter Tag]*/, $energie1d);
    }
    // Export Obiskennung:1-0:1.8.0*97 Hex:31 2d 30 3a 31 2e 38 2e 30 2a 39 37
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x39).chr(0x37)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x39).chr(0x37), $_IPS['VALUE']);
        $energie7d = substr($wert[1], 1, 7);
        SetValue(10194 /*[Zähler\eHZ\RegVar eHZ\Energieverbrauch letzte Woche]*/, $energie7d);
    }
    // Export Obiskennung:1-0:1.8.0*98 Hex:31 2d 30 3a 31 2e 38 2e 30 2a 39 38
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x39).chr(0x38)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x39).chr(0x38), $_IPS['VALUE']);
        $energie30d = substr($wert[1], 1, 7);
        SetValue(25295 /*[Zähler\eHZ\RegVar eHZ\Energieverbrauch letzter Monat]*/, $energie30d);
    }
    // Export Obiskennung:1-0:1.8.0*99 Hex:31 2d 30 3a 31 2e 38 2e 30 2a 39 39
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x39).chr(0x39)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x39).chr(0x39), $_IPS['VALUE']);
        $energie365d = substr($wert[1], 1, 7);
        SetValue(10337 /*[Zähler\eHZ\RegVar eHZ\Energieverbrauch letztes Jahr]*/, $energie365d);
    }
    // Export Obiskennung:1-0:1.8.0*100 Hex:31 2d 30 3a 31 2e 38 2e 30 2a 31 30 30
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x31).chr(0x30).chr(0x30)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x2e).chr(0x38).chr(0x2e).chr(0x30).chr(0x2a).chr(0x31).chr(0x30).chr(0x30), $_IPS['VALUE']);
        $energierueck = substr($wert[1], 1, 7);
        SetValue(21961 /*[Zähler\eHZ\RegVar eHZ\Energieverbrauch seit letzter Rückstellung]*/, $energierueck);
    }
    // Export Obiskennung:1-0:0.2.0*255 Hex:31 2d 30 3a 30 2e 32 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x30).chr(0x2e).chr(0x32).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x30).chr(0x2e).chr(0x32).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $firmware = substr($wert[1], 1, 20);
        SetValueString(22843 /*[Zähler\eHZ\RegVar eHZ\Firmware Version]*/, $firmware);
    }
    // Export Obiskennung:1-0:96.90.2*255 Hex:31 2d 30 3a 39 36 2e 39 30 2e 32 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x39).chr(0x36).chr(0x2e).chr(0x39).chr(0x30).chr(0x2e).chr(0x32).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x39).chr(0x36).chr(0x2e).chr(0x39).chr(0x30).chr(0x2e).chr(0x32).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $pruefsumme = substr($wert[1], 1, 4);
        SetValueString(11964 /*[Zähler\eHZ\RegVar eHZ\Prüfsumme]*/, $pruefsumme);
    }
    // Export Obiskennung:1-0:97.97.0*255 Hex:31 2d 30 3a 39 37 2e 39 37 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x39).chr(0x37).chr(0x2e).chr(0x39).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x39).chr(0x37).chr(0x2e).chr(0x39).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $statusreg = substr($wert[1], 1, 8);
        SetValue(28032 /*[Zähler\eHZ\RegVar eHZ\Status Register]*/, $statusreg);
    }

?>

Den Eigenverbrauch der PV-Leistung habe ich dann aus Erzeugung-Export errechnet.

:stuck_out_tongue: Übrigens hat paresy #3 nicht ganz Recht … ich habe meinen Itron schon vor 6 Jahren im Pullmodus betrieben.
https://www.symcon.de/forum/threads/20880-Elektroz%C3%A4hler-Gas-und-Wasseruhr-an-IP-Symcon

Würde mich freuen wenn Feedback kommt.:loveips:

Moin,

erst mal ein großes Lob an Marcus für dieses Script und die detailierten Grafiken. Ich konnte bei meinem Logarex Zähler, bis auf das Anpassen der ObjektID´s, das Auswertungsscript 1 zu 1 übernehmen. Eine Ergänzung möchte ich aber loswerden. Da mein Zähler nicht über RS-485, sondern über die optische Schnittstelle ausgelesen wird, brauche ich kein Initialisierungsscript. Die Schnittstelle läuft im PUSH-Modus. Der Datensatz der beiden Schnittstellen scheint nicht ganz gleich zu sein. Die Cuttereinstellung mit dem vorgegebenen linken Trennzeichen (02) führt bei mir zu einem Überlauf des Puffer > 8kb. Als Lösung erwies sich die Eingabe der Zählerseriennummer.

Holt jau fuchtig Markus

Hallo,
siehe: Stromzähler mit optischer Schnittstelle einlesen

Dieses Thema ist für RS485.

Der Wert bei der unten genannten Obiskennzahl (Stromeffektivwert) liefert ganze Zahlen aber je nach Sonne auch negative Werte. Jetzt kommt es dazu das keine feste Anzahl an Ziffern vorhanden sind.
Stelle ich 7 Stellen ein liefert er richtige negativ aber falsche positive Werte
Stelle ich 6 Stellen ein liefert er richtige positive aber falsche negative Werte

Er fängt bei diesem Skript von links an zu zählen.

Ich komme hier nicht weiter, wer kann helfen.

 }
    // Export Obiskennung:1-0:16.7.0*255 Hex:31 2d 30 3a 31 36 2e 37 2e 30 2a 32 35 35
    if(strpos($_IPS['VALUE'], chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x36).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35)) !== false) {
        $wert =        explode(chr(0x31).chr(0x2d).chr(0x30).chr(0x3a).chr(0x31).chr(0x36).chr(0x2e).chr(0x37).chr(0x2e).chr(0x30).chr(0x2a).chr(0x32).chr(0x35).chr(0x35), $_IPS['VALUE']);
        $stromeff = substr($wert[1], 1, 7);
        SetValue(10335 /*[Zähler\eHZ\RegVar eHZ\Stromeffektivwert]*/, $stromeff);
    }

Hallo,

warum machst du das eigentlich so kompliziert?
Du musst überhaupt nicht mit HEX-Werten arbeiten.

Suche doch einfach die öffnende Klammer und die schließende Klammer. Anschließend kannst du alles dazwischen verwenden:

// Alles vor Klammer wegschneiden
$part = substr($part, strpos($part, "(")+1);

// Alles nach der Klammer wegschneiden
$part = substr($part, 0, strpos($part, ")"));