Hallo,
Nach gut einem Tag und dank der Beiträge von zapp läuft sie nun. Allerdings gab es doch so einige Fallstricke.
- Cam mit USB adapter und ECWin Software wie beschrieben installiert und serielles Protokoll aus wmbus, nicht MODbus konfiguriert. Modus T2
- als USB wmbus Dongle verwende ich den, der auch in der Energy CAM Anleitung erwähnt ist. MitECWin auf Modus T2 gestellt. Hier habe ich aber das Gefühl, dass der sich Dongle, wenn man ihn abzieht und wieder ansteckt, auf Modus S2 zurückstellt. Zumindest hatte ich einmal das Problem und bekam keine Daten
- mit ECCollectorwin erste Übertragungstests gemacht. Ging mäßig bis garnicht, solange die CAM nicht installiert war. Selbst nach der Installation habe ich mit dieser Software nur einmal Daten von der CAM bekommen.
- IP Symcon nach der Anleitung von zapp konfiguriert (Registervariable ünd Script als Target). Nun kamen zwar wie von mir gewünscht, alle 5 Minuten Daten, aber müllig (wie bei Gerald im DEBUG Bild). Ursache: Ich hatte den seriellen Port in IP Symcon auf 115200. Nach Umstellen 57600,8,N,1 kamen nun sinnvolle Daten, das Script von zapp schrieb endlich etwas in die Variablen.
- nächstes Problem: die Daten, die das Script extrahierte, führten nicht zu sinnvollen Zählerwerten. Nach intensiver mehrstündiger Recherche und Studie des Protokollformats stellte ich fest, dass meine CAM bzw. der Dongle, die Zählerdaten an anderer Position liefert (wmbus OMS Spec. siehe auch Datei EnergyCam-white-paper-wMBus.pdf von Fast Forward (Warum steht das in einem White Paper:mad:?).
- Script von zapp angepasst und nun läufts:D
- noch bestehendes Problem: die Strom Cam liest die Nachkommastelle nicht, obwohl konfiguriert
Hier mein Script zur Auswertung (auf Basis von zapps Script, nochmals vielen Dank, hat mir, auch wenns nicht ganz gepasst hat, viel Zeit erspart) mit Vorbereitung für Gas und Wasser(ist aber noch nicht getestet):
<?
// Empfangsdaten holen
$recv = bin2hex($_IPS['VALUE']);
IPS_LogMessage($IPS_SENDER,"EnergyCAM RX!");
// Länge des Payloads und Payload
$length = hexdec(substr($recv,6,2));
$payload = substr($recv, 8,(2*$length));
IPS_LogMessage($IPS_SENDER,$length);
IPS_LogMessage($IPS_SENDER,$payload); // wmBus OMS Nachricht
// HCI Frame RSSI ermitteln
// TODO: die Umrechnung ist eine Vermutung!
$RSSIreadingHex = substr($recv, 66, 2);
$RSSIreadingDec = -110.0 + (hexdec($RSSIreadingHex)*2*0.1);
// HCI Frame Timestamp ermitteln
// TODO: Umrechnung nicht klar
$TSreadingHex = substr($recv, 64, 2).substr($recv, 62, 2).substr($recv, 60, 2).substr($recv, 58, 2);
$TSreadingDec = hexdec($TSreadingHex);
// CAMID ermitteln
$CAMIDreadingHex = substr($payload, (2*$length)-38, 2).substr($payload, (2*$length)-40, 2).substr($payload, (2*$length)-42, 2).substr($payload, (2*$length)-44, 2);
IPS_LogMessage($IPS_SENDER,$CAMIDreadingHex);
// Counter Value ermitteln
$CValreadingHex = substr($payload, (2*$length)-12, 2).substr($payload, (2*$length)-14, 2).substr($payload, (2*$length)-16, 2).substr($payload, (2*$length)-18, 2);
// Meter Type ermitteln
// (Meter type: Electricity =0x02 , Gas = 0x03, Water=0x07)
$MeterTypereadingHex = substr($payload, (2*$length)-34, 2);
$MeterTypereadingDec = hexdec($MeterTypereadingHex);
switch ($MeterTypereadingDec)
{
//Strom
case 2:
{
IPS_LogMessage($IPS_SENDER,"EC Strom");
// RSSI einstellen
SetValueFloat(????? /*[EnergyCams\Strom\RSSI]*/,floatval($RSSIreadingDec));
// TimeStamp einstellen
SetValueInteger(????? /*[EnergyCams\Strom\TimeStamp (Dongle)]*/,intval($TSreadingDec));
// CAMId
SetValueString(????? /*[EnergyCams\Strom\ECId]*/,$CAMIDreadingHex );
// Counter Value ermitteln
// bei Strom Faktor berücksichtigen
$CValreadingDec = hexdec($CValreadingHex)*0.1;
SetValueFloat(????? /*[EnergyCams\Strom\KWh]*/,floatval($CValreadingDec));
break;
}
//Gas
case 3:
{
IPS_LogMessage($IPS_SENDER,"EC Gas");
// RSSI einstellen
SetValueFloat(????? /*[EnergyCams\Gas\RSSI]*/,floatval($RSSIreadingDec));
// TimeStamp einstellen
SetValueInteger(????? /*[EnergyCams\Gas\TimeStamp (Dongle)]*/,intval($TSreadingDec));
// CAMID ermitteln
SetValueString(????? /*[EnergyCams\Gas\ECId]*/,$CAMIDreadingHex );
// Counter Value ermitteln
// TODO: ggf. Wertanpassung erforderlich
$CValreadingDec = hexdec($CValreadingHex);
SetValueFloat(????? /*[EnergyCams\Gas\Kubikmeter]*/,floatval($CValreadingDec));
break;
}
//Wasser
case 7:
{
IPS_LogMessage($IPS_SENDER,"EC Wasser");
// RSSI einstellen
SetValueFloat(????? /*[EnergyCams\Wasser\RSSI]*/,floatval($RSSIreadingDec));
// TimeStamp einstellen
SetValueInteger(????? /*[EnergyCams\Wasser\TimeStamp (Dongle)]*/,intval($TSreadingDec));
// CAMID ermitteln
SetValueString(????? /*[EnergyCams\Wasser\ECId]*/,$CAMIDreadingHex );
// Counter Value ermitteln
// TODO: ggf. Wertanpassung erforderlich
$CValreadingDec = hexdec($CValreadingHex);
SetValueFloat(????? /*[EnergyCams\Wasser\Kubikmeter]*/,floatval($CValreadingDec));
break;
}
default:break;
}
IPS_LogMessage($IPS_SENDER,$CValreadingDec);
?>
Kalle Wirsch