Hallo zusammen,
anbei meine Lösung zur Einbindung des Stromzählers ISKRA MT681 per Ethernet.
(Vorab nochmals vielen Dank für das Script von RWN - das als Grundlage gedient hat)
Verwendete Komponenten:
Stromzähler: ISKRA - eHZ-EDL Type MT681-D4A51-K0p
Lesekopf: co.met - COM-IR Datenschnittstelle Infrarot RS232 gem. IEC 1107 bzw. EN61107
Gateway: co.met - Smart Meter LAN/DSL-Gateway für elektronische Stromzähler
Aufbau Hardware
Stromzähler -> IR Datenschnittstelle -> Gateway -> Ethernet
Das Gateway von co.met sucht automatisch über den DHCP Server eine IP Adresse, alternativ lässt sich das Gateway per Java-Tool auch auf eine feste IP Adresse konfigurieren.
Konfiguration IPS
I/O Instanz - Client Socket
Aktiv, IP Adresse Gateway + Port 5000
Splitter Instanz - Cutter
Benutze Zeichen für Schritte
Benutzerdefiniert
Linke Trennzeichen: 30 31 30 31 30 31 30 31 (Haken bei HEX)
Rechte Trennzeichen: 31 42 31 42 31 42 31 42 (Haken bei HEX)
Übergeordnete Instanz: Der zuvor angelegte Client Socket
Variablen
Bitte folgenden Variablen Anlegen
- Wirkenergie, Float, Einheit khW
- Wirkenergie - Tarif 1, Float, Einheit khW
- Wirkenergie - Tarif 2, Float, Einheit khW
- Wirkleistung, Float, Einheit W
- Wirkleistung - L1, Float, Einheit W
- Wirkleistung - L2, Float, Einheit W
- Wirkleistung - L3, Float, Einheit W
- Zähler ID, String, keine Einheit
ggf. entsprechende Profile (W und KhW) für die Variablen anlegen und definieren.
Script
Bitte Script anlegen und die ID der Variablen entsprechen anpassen - mehr ist nicht zu tun.
<?
if($_IPS['SENDER'] == "RegisterVariable")
{
// Wirkenergie - Obiskennung:1-0.1.8.0*255 Hex:01 00 01 08 00 FF
if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x31).chr(0x30).chr(0x38).chr(0x30).chr(0x30).chr(0x46).chr(0x46)) !== false)
{
$wirkenergie = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x31).chr(0x30).chr(0x38).chr(0x30).chr(0x30).chr(0x46).chr(0x46), $_IPS['VALUE']);
SetValue(55203/*[Stromzähler\Allgemeinstrom\Wirkenergie]*/, hexdec(substr($wirkenergie[1], 22, 16))/10000);
}
else
{
LogMessage();
}
// Wirkenergie - Tarif 1 - Obiskennung:1-0.1.8.1*255 Hex:01 00 01 08 01 FF
if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x31).chr(0x30).chr(0x38).chr(0x30).chr(0x31).chr(0x46).chr(0x46)) !== false)
{
$wirkenergieT1 = explode(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['VALUE']);
SetValue(27584/*[Stromzähler\Allgemeinstrom\Positive Wirkenergie - Tarif 1]*/, hexdec(substr($wirkenergieT1[1], 14, 16))/10000);
}
else
{
LogMessage();
}
// Wirkenergie - Tarif 2 - Obiskennung:1-0.1.8.2*255 Hex:01 00 01 08 02 FF
if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x31).chr(0x30).chr(0x38).chr(0x30).chr(0x32).chr(0x46).chr(0x46)) !== false)
{
$wirkenergieT2 = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x31).chr(0x30).chr(0x38).chr(0x30).chr(0x32).chr(0x46).chr(0x46), $_IPS['VALUE']);
SetValue(29688/*[Stromzähler\Allgemeinstrom\Wirkenergie - Tarif 2]*/, hexdec(substr($wirkenergieT2[1], 14, 16))/10000);
}
else
{
LogMessage();
}
// Wirkleistung - Obiskennung:1-0.15.7.0*255 Hex:01 00 0F 07 00 FF
if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x46).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46)) !== false)
{
$wirkleistung = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x46).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46), $_IPS['VALUE']);
SetValue(15667/*[Stromzähler\Allgemeinstrom\Wirkleistung]*/, hexdec(substr($wirkleistung[1], 14, 8)));
}
else
{
LogMessage();
}
// Wirkleistung - L1 - Obiskennung:1-0.21.7.0*255 Hex:01 00 15 07 00 FF
if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x31).chr(0x35).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46)) !== false)
{
$wirkleistungL1 = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x31).chr(0x35).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46), $_IPS['VALUE']);
SetValue(34200/*[Stromzähler\Allgemeinstrom\Wirkleistung - L1]*/, hexdec(substr($wirkleistungL1[1], 14, 8)));
}
else
{
LogMessage();
}
// Wirkleistung - L2 - Obiskennung:1-0.41.7.0*255 Hex:01 00 29 07 00 FF
if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x32).chr(0x39).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46)) !== false)
{
$wirkleistungL2 = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x32).chr(0x39).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46), $_IPS['VALUE']);
SetValue(28949/*[Stromzähler\Allgemeinstrom\Wirkleistung - L2]*/, hexdec(substr($wirkleistungL2[1], 14, 8)));
}
else
{
LogMessage();
}
// Wirkleistung - L3 - Obiskennung:1-0.61.7.0*255 Hex:01 00 3D 07 00 FF
if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x33).chr(0x44).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46)) !== false)
{
$wirkleistungL3 = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x33).chr(0x44).chr(0x30).chr(0x37).chr(0x30).chr(0x30).chr(0x46).chr(0x46), $_IPS['VALUE']);
SetValue(44814/*[Stromzähler\Allgemeinstrom\Wirkleistung - L3]*/, hexdec(substr($wirkleistungL3[1], 14, 8)));
}
else
{
LogMessage();
}
// Zähler-ID):1-0.0.0.9*255 Hex:01 00 00 00 09 FF
if(strpos($_IPS['VALUE'], chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x39).chr(0x46).chr(0x46)) !== false)
{
$ServerID = explode(chr(0x30).chr(0x31).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x30).chr(0x39).chr(0x46).chr(0x46), $_IPS['VALUE']);
SetValue(52463/*[Stromzähler\Allgemeinstrom\Zähler-ID*/, hexdec(substr($ServerID[1], 20, 6)));
}
else
{
LogMessage();
}
}
function Str2Hex($daten)
{
$hex = "";
for($i=0; $i<strlen($daten); $i++)
$hex .= sprintf("%02X ", ord($daten[$i]));
return $hex;
}
function LogMessage()
{
// Fehlermeldung nach logs schreiben
$log = IPS_GetKernelDir()."logs\\Error eHZ_EMH.txt";
$fp = fopen($log, "a");
fwrite($fp, date("H:i:s ")."Datenlaenge: ".strlen($_IPS['VALUE'])." Daten: ".Str2Hex($_IPS['VALUE'])."
");
fclose($fp);
}
?>
Register Variable
Target: Das zuvor angelegte Script
Übergeordnete Instanz: Der zuvor angelegte Cutter
Fertig
Ich hoffe ich kann damit jemanden helfen!
Grüße Micha