SML Protokoll auslesen

Moin zusammen,

ich habe einen Stromzähler eHZ Generation N, welchen ich über IR auslesen kann. An der IR Schnittstelle liegt das SML Protokoll an. Dieses möchte ich in IPS auswerten.

Dazu habe ich einen Serial Port, einen Cutter und eine RegVar erstellt. Das Zielscript wird jedoch nur ausgelöst, wenn ich die RegVar direkt mit dem SerialPort verbinde. Wenn ich den Cutter dazwischenhänge, wird das Zielscript nicht ausgelöst und der Debug der RegVar bleibt leer.

Beim Cutter habe ich folgende Einstellungen:

  • feste Schnitte
  • Eingabelänge 332
  • Sync-Zeichen: 31 42 31 42 31 42 31 42 HEX
  • Timeout 200ms

Im Debug des Cutters sehe ich „BUFFER“ und „RECEIVED“ Meldungen.

Irgendwo scheint da noch der Wurm drin zu sein. Kann mir diesbezüglich jemand weiterhelfen?

Gruß,
Christoph

Kommen die Sync Zeichen denn korrekt? Siehst du die im Datenstrom? Im Prinzip gibt es hier im Forum schon ein paar Skripte zu ehz.

paresy

Ich nehme alles zurück und behaupte das Gegenteil.

Den Cut muss ich bei der Sequenz „1B 1B 1B 1B“ machen. Also dachte ich, ich wandel das mal schön in Hex um und daraus wird „31 42 31 42 31 42 31 42“. Einmal zu viel gehext …

Ich probiere dann mal, den String vernünftig zu zerlegen.

Grüße,
Christoph

Hallo zusammen,

mittlerweile bin ich völig verwirrt und würde mich über einen Wink in die richige Richtung freuen.

Hier ein Screenshot vom Cutter und dem Debug des Cutters:

Die Sync Zeichen „1B 1B 1B 1B“ habe ich in Hex eingegeben. Wie man im Debug sieht, kommen die Zeichen, der Cutter sendet jedoch nicht.

Kann mir jemand helfen, den Knoten im Kopf zu entknoten?

Gruß,
Christoph

Hallo Cristoph,
was hast du den für einen Zähler? (Fabrikat/Typ/…)

Moin,

es ist ein EMH eHZ-IW8E2A5L0EK2P.

Über den seriellen Port kommt SML, das kommt auch in IPS an wie man sieht, aber irgendwie mag der Cutter nicht so, wie ich mir das vorstelle.

Gruß,
Christoph

Weshalb hast du das „1B“ in „31 42“ umgewandelt? Wenn der Cutter 1B erkennen soll musst du auch 1B angeben! So hast du aus 4byte ja 8 Byte gemacht und als ASCII. Gruß Tommy

Ich habe es nicht umgewandelt. Wenn ich den Cutter neu anlege und als Synczeichen „1B1B1B1B“ eingebe (ohne Haken bei HEX) und auf „Setzen“ und übernehmen klicke, dann erscheint beim nächsten Öffnen der Einstellungen „31 42 31 42 31 42 31 42“ mit dem Haken bei HEX.

Du musst 1B bei gesetzten Haken eintragen.
Oder einfacher:
Im Debug und im Cutter müssen die Haken für Hex übereinstimmen, sonst passt es nie.
Michael

Okay, das habe ich verstanden. Vielen Dank.

Weiter gehts. Ich habe im Script aus diesem Thread abgeguckt.

Der Wert „Wirkenergie Tarif 1“ steht nach dem Vorkommen von 01 00 01 08 00 FF.


<?
if($_IPS['SENDER'] == "RegisterVariable"){
  // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
  $data  = RegVar_GetBuffer($_IPS['INSTANCE']);
  // neu empfangene Daten an $data anhängen
  $data .= $_IPS['VALUE'];

  // Wirkenergie - Tarif 1 - Obiskennung: 1-0.1.8.1*255 HEX:01 00 01 08 01 FF
  $temp = strpos($data, chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x31).chr(0x30).chr(0x38).chr(0x30).chr(0x31).chr(0x46).chr(0x46));
  IPS_LogMessage("STROM", $temp);
}
?>

$temp ist bei mir jedoch immer false.

Um es zu vereinfachen, dachte ich mir, ich suche einfach mal nach „76“:

<?
if($_IPS['SENDER'] == "RegisterVariable"){
  // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
  $data  = RegVar_GetBuffer($_IPS['INSTANCE']);
  // neu empfangene Daten an $data anhängen
  $data .= $_IPS['VALUE'];

  // Wirkenergie - Tarif 1 - Obiskennung: 1-0.1.8.1*255 HEX:01 00 01 08 01 FF
  $temp = strpos($data, chr(0x37).chr(0x36));
  IPS_LogMessage("STROM", $temp);
}
?>

Der String 76 kommt immer, wie hier zu sehen ist:

SML.PNG

Auch hier ist $temp immer false.

Was mache ich falsch? Würde mich noch mal über Hilfe freuen.

Danke und Gruß,
Christoph

Wenn da steht HEX im Kommentar vom Code, Warum sendest du dann diese Zahlen als Ascii-Zeichen ?
Michael

Wenn ich die Zeile ändere in

$data2 = strpos($data, "76");

bzw.

$data2 = strpos($data, "0100010801FF");

wird immer false ausgegeben.

Vielleicht kannst Du mir sagen, was ich dort eingeben müsste, damit die funktion strpos mal nicht false liefert?

„76“ ist ein String aus zwei Byte; den Bytes 0x37 und 0x36.

Du möchtest aber ein Zeichen mit dem Byte 0x76 suchen.

Dann musst du auch chr(0x76) schreiben oder „\x76“ oder einfach „v“. Das ist alles identisch und entspricht einen String mit einem Byte welches das Zeichen ‚v‘ == 0x76 enthält.

Michael

Vielen Dank für die kleine Nachhilfestunde. Da hab ich wohl damals in der Schule nicht aufgepasst :wink: Nun liefert der Zähler sinnvolle Werte.

Gruß,
Christoph