Hallo,
ich habe so viel Hilfe beim Auslesen meines neuen Zählers bekommen, deshalb hier wie versprochen mein How-to.
Aufgabe: Auslesen des Zählerstand und aktueller Leistung eines Hager EHZ361W5 (Anleitung).
Benötigte bzw. benutzte Hardware: co.met COM-IR (siehe hier).
COM-IR anschliessen, dann Terminalprogramm (z.B. hterm oder Putty) nach SML-Spezifikation einstellen: 9600 Baud, No parity, 8 Datenbits, 1 Stopbit.
Jetzt sieht man schon ne Menge Zeichensalat, aber immerhin kann man Hager und Zählernummer im Klartext lesen.
In IPS ein Serial Port anlegen und mit obigen Einstellungen versehen. Mein Hager sendet vor und nach den gesuchten Werten dankenswerterweise immer die gleiche Zeichenabfolge (Hex-Werte), deshalb legt man je ein Cutter für Zählerstand und Leistung an und trägt die Trennzeichen entsprechend Screenshot ein. Hier gilt mein Dank mr_cg, der mich auf das verwendete SML-Protokoll hingewiesen und mir die Trennzeichen durchgegeben hat. Ich weis nicht, ob das bei allen gleich ist. Den Cuttern müssen natürlich noch als übergeordnete Instanz der Serial Port zugewiesen werden. Die Cutter liefern somit nur noch den gewünschten Wert.
Am besten eine eigene Kategorie mit Namen Stromzähler erstellen, darunter zwei Registervariablen („eHZ Register Leistung“ und „eHZ Register Zähler“). Registervariablen mit den entsprechenden Cuttern verbinden und darunter jeweils ein Skript anlegen (siehe Screenshot).
Mein Code für „eHZ Register Zähler“ sieht so aus:
<?
$var = 38752 /*[Keller\Stromzähler\Zählerstand]*/;
$wert = (hexdec(strtohex($IPS_VALUE))/10000);
// 10000 passt für mein Hager, andere mussten durch 10 teilen. Bitte ausprobieren!
$oldvalue = GetValue($var);
// If ($wert < ($oldvalue + 50) and $wert > ($oldvalue + 0.01)) {
SetValue ($var, $wert);
// }
function strtohex($x) {
$s='';
foreach(str_split($x) as $c) $s.=sprintf("%02X",ord($c));
return($s);
}
?>
Je eine Variable Zählerstand und Leistung anlegen (Typ Float), Profil anpassen und im Skript ganz oben $var entsprechend anpassen.
Jetzt ist alles in IPS vorbereitet. Bevor jedoch echte Werte geliefert werden, muß der Serial Port noch auf Empfang geschaltet werden. Die Hager Zähler senden ein Datensatz alle 2 Millisekunden, IPS hätte Probleme das zu verarbeiten! Deshalb schalte ich mit einem Skript „Zähler Lesen“ jede Minute kurz auf Empfang:
<?
COMPort_SetDTR(34485 /*[eHZ Serial Port]*/, true);
IPS_Sleep(2100);
COMPort_SetDTR(34485 /*[eHZ Serial Port]*/ , false);
?>
Im Skript ist die ID des Serial Ports entsprechend anzupassen.
In das Skript hinter den Registervariablen habe ich durch den if-Part noch ein wenig Logik eingebaut um Ausreisser abzufangen und mir durch minimale Veränderungen nicht IPS zuzuspammen. Nach der Erstverwendung wird empfohlen, den if-Part wieder zu aktivieren.
Hier noch mein Skript für die „eHZ Register Leistung“:
<?
$var = 49509 /*[Keller\Stromzähler\Leistung]*/;
$wert = (hexdec(strtohex($IPS_VALUE))/10000);
$oldvalue = GetValue ($var);
// IPS_LogMessage("Leistung: ",$wert.", Oldvalue: ".$oldvalue);
If ($wert < ($oldvalue + 8000) and ($wert > ($oldvalue + 2) or $wert < ($oldvalue - 2))) {
SetValue ($var, $wert);
}
function strtohex($x) {
$s='';
foreach(str_split($x) as $c) $s.=sprintf("%02X",ord($c));
return($s);
}
?>
Ich hoffe die Anleitung ist hilfreich und verständlich.
Danke & Gruß,
Axel




