Hallo Marcus,
ich habe Deine PN erhalten und möchte gerne „öffentlich“ antworten damit vielleicht auch andere User einen Nutzen davon haben.
Der Udo von volkszaehler.org hat Recht, ich habe zwei IR-Leseköpfe an meinen neuen Stromzählern und lese die Daten über IPS aus.
Wie bin ich vorgegangen:
Zunächst die Hardware aufbauen und sicherstellen, dass die Leseköpfe richtig sitzen und vor allem die Verkabelung zum YPORT passt. Dann über einen Browser eine Verbindung zum YPORT aufbauen und eine IP-Adresse passend zum eigenen Netzwerk vergeben. Im Browser meldet sich dann an dieser IP die „Ethersex Welcome Seite“ des YPORT.
Nachdem das alles funktioniert geht es erst in IPSymcon los. Da ich zwei Leseköpfe habe, gibt es bei mir den YPORT und den ZPORT, der Einfachheit halber beschreibe ich nur die Tätigkeiten für den YPORT.
[ul]
[li]Zunächst braucht es einen Client-Socket mit der IP-Adresse des YPORT und den Port 7970 (ZPORT hat Port 7980).[/li][li]Danach eine Cutter-Instanz die sich darauf bezieht. Hier als linke Trennzeichen „01 01 01 01“ HEX und als rechte Trennzeichen „1B 1B 1B 1B“ HEX setzen.[/li][li]Jetzt eine neue RegisterVariable mit diesem Cutter als übergeordnete Instanz.[/li][li]Die RegVar benötigt ein Script zur Auswertung der Daten: „SML Auswertung YPORT“[/li][/ul]
Hier mein (gekürztes) Script:
<?
// Auswertung der SML-Daten am YPORT des YNODE
// das Skript nur alle 5 Minuten und innerhalb der ersten 2 Sekunden ausführen lassen, sonst abbrechen
$time = time();
$akt_min = (int)strftime("%M", $time);
$akt_sec = (int)strftime("%S", $time);
$alle_5_minuten = ($akt_min % 5);
if (($alle_5_minuten<>0) || ($akt_sec>2)) { return; }
// nur auf Änderungen der RegisterVariablen reagieren
if($_IPS['SENDER'] == "RegisterVariable") {
// aktuelle Uhrzeit merken
$datum_uhrzeit = strftime('%d.%m.%y %H:%M', $time);
SetValueString(40765, $datum_uhrzeit);
// Hersteller Obiskennung:129-129.199.130.3*255 Hex:81 81 C7 82 03 FF
if(strpos($_IPS['VALUE'], chr(0x81).chr(0x81).chr(0xC7).chr(0x82).chr(0x03).chr(0xFF)) !== false) {
$wert = explode(chr(0x81).chr(0x81).chr(0xC7).chr(0x82).chr(0x03).chr(0xFF), $_IPS['VALUE']);
$hersteller = substr($wert[1], 5, 3);
SetValueString(55351, $hersteller); // z.B. EMH
}
// actSensorTime
if(strpos($_IPS['VALUE'], chr(0x72).chr(0x62).chr(0x01).chr(0x65)) !== false) {
$wert = explode(chr(0x72).chr(0x62).chr(0x01).chr(0x65), $_IPS['VALUE']);
SetValueString(59522, strftime('%d.%m.%Y %H:%M:%S', mktime(9, 52, 24, 7, 6, 12) + hexdec(Str2Hex(substr($wert[1], 0, 4)))));
}
// Zählerstand (Wirk-Energie Total Bezug) Obiskennung:1-0.1.8.0*255 Hex:01 00 01 08 00 FF
if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x00).chr(0xFF)) !== false) {
$wert = explode(chr(0x01).chr(0x00).chr(0x01).chr(0x08).chr(0x00).chr(0xFF), $_IPS['VALUE']);
SetValueFloat(48566, SML_Zaehlerstand($wert[1]));
}
// Zählerstand (Wirk-Energie Total Lieferung) Obiskennung:1-0.2.8.0*255 Hex:01 00 02 08 00 FF
if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x02).chr(0x08).chr(0x00).chr(0xFF)) !== false) {
$wert = explode(chr(0x01).chr(0x00).chr(0x02).chr(0x08).chr(0x00).chr(0xFF), $_IPS['VALUE']);
SetValueFloat(28850, SML_Zaehlerstand($wert[1]));
}
// Wirkleistung (Wirk-Leistung Total) Obiskennung:1-0.15.7.0*255 Hex:01 00 0F 07 00 FF
if(strpos($_IPS['VALUE'], chr(0x01).chr(0x00).chr(0x0F).chr(0x07).chr(0x00).chr(0xFF)) !== false) {
$wert = explode(chr(0x01).chr(0x00).chr(0x0F).chr(0x07).chr(0x00).chr(0xFF), $_IPS['VALUE']);
$verbrauch = SML_Zaehlerstand($wert[1]) - GetValueFloat(48447); // 48447 = Wirkleistung ZPORT
SetValueFloat(34801, $verbrauch);
}
}
return;
function SML_Zaehlerstand($hexstring) {
$pos1 = strpos($hexstring, chr(0x52).chr(0xFF)) + 3;
$pos2 = strpos($hexstring, chr(0x01).chr(0x77).chr(0x07));
$laenge = $pos2 - $pos1;
if(($laenge > 0) && ($laenge < 6)) {
$value = substr($hexstring, $pos1 - 1, 1);
switch ($value) {
case 'U' : $teiler = 10; break; // 55h
case 'V' : $teiler = 10000; break; // 56h
default : $teiler = 1; break;
}
$ergebnis = hexdec(Str2Hex(substr($hexstring, $pos1, $laenge)))/$teiler;
return $ergebnis;
} else {
return;
}
}
?>
Natürlich müssen die verwendenten Variablen-IDs angepasst werden. Ich habe folgende Variablen unterhalb der RegVar angelegt:
55351 Hersteller - STRING
48566 Zählerstand 1.8.0 - FLOAT
28850 Zählerstand 2.8.0 - FLOAT
34801 Wirkleistung - FLOAT
59522 Datum Uhrzeit - STRING
40765 letzte Messung - STRING
Auf jeden Fall würde ich empfehlen, sich zunächst auf einen Wert z.B. die Herstellerkennung (die ist fix und eindeutig) zu konzentrieren und bei den einzelnen Instanzen über die Debug-Funktion die HEX-Werte anschauen. Wenn das klappt, dann nach und nach die weiteren Werte aus dem Datenstrom rausziehen und in passende Variablen speichern. 
Ich hoffe das hilft weiter, ansonsten bleibt nur das was ich auch gemacht habe: Forumsbeträge zum Thema lesen, Doku studieren, Skript testen und am Ende freuen wenn es funktioniert.
Die Grundlagen zum Script stammen auch aus dem Forum hier - danke an die „Vordenker“.
Viele Grüße aus dem Unterallgäu
Harry