Stromzähler Pafal 20EC3gr auslesen

Hallo,
mit der Installation einer PV-Anlage haben wir auch einen neuen Zähler erhalten.
Dieser ist vom Typ Pafal 20EC3gr. Angezeigt werden die Werte Bezug und Einspeisung.
Da der Netzbetreiber die Schnittstellen verplombt hat bleibt nur das Auslesen der Daten über die IR-Schnittstelle.
Hier eine kurze Anleitung und Beschreibung wie ich die Daten auslese und in IP-Symcon anzeige.

Zunächst erstellte ich einen Serial Port mit 300,7,1,Even, dann einen Cutter und eine Register Variable (siehe Anhänge).

Entgegen, wie viele ähnliche Zähler, sendet dieser nicht alle 2 sec Daten aus. Er wartet auf eine Anforderung um dann den Typ auszusenden,
und innerhalb von 2 sec auf eine zweite Anforderung,der dann als Ausgabe die eigentlichen Zählerwerte folgen.
Hierfür nutze ich 2 Scipte, das erste das in regelmäßigen Abständen( nach Bedarf ) die Anforderungen aussendet,
das zweite getriggert durch die Registervariable, das die Daten aufbereitet.

<?

// Dieses Script triggert die IR-Zählerschnittstelle damit Daten ausgegeben werden
// der Port arbeitet mit 300 Baud 71E
// wichtig ist die Wartezeit von ca 2 sec

COMPort_SendText(12992 /*[Serial Port eHZ ]*/, chr(0x2f).chr(0x3f).chr(0x21).chr(0x0d).chr(0x0a)); // ersten String an IR schnittstelle senden
IPS_Sleep(2000);       // sollte > 1000 und < 3400 sein
COMPort_SendText(12992 /*[Serial Port eHZ ]*/, chr(0x06).chr(0x30).chr(0x30).chr(0x30).chr(0x0d).chr(0x0a)); // zweiten String an IR schnittstelle senden

?>
<?
// für Pafal-Zähler 20EC3gr

	$WertRegVar = $IPS_VALUE;
// RegVar Handler result: 1.8.0*00(003145.25)2.8.0*00(000737.48)

// string aufteilen in Bezug und Einspeisung
	$subBezug = substr($WertRegVar,9,9);
	$subEinspeisung = substr($WertRegVar,30,9);

// string in float umwandeln
	$Bezug = floatval($subBezug);
	$Einspeisung = floatval($subEinspeisung);

	SetValueFloat (59675 /*[eHZ\Bezug 1.8.0]*/,$Bezug);
	SetValueFloat (14347 /*[eHZ\Einspeisung 2.8.0]*/,$Einspeisung);

?>

[/ATTACH]

RegVar.JPG

Volker

Hallo Volker,

welche HW benutzt du zum Auslesen?
Habe den gleichen Zähler seit 2013 und habe das damals wie folgt umgesetzt:

Hardware => TTL Lesekopf: IR-Schreib-Lesekopf, USB-Interface [wiki.volkszaehler.org] und YPORT: YPORT + [wiki.volkszaehler.org]
Auslesen mit IPS via Client Socket YPORT und Registervariable.

Ich lese alle 60 Sekunden um einigermaßen aktuell anzuzeigen ob gerade eigenproduzierter Strom übrig ist oder nicht.
Das Auslesen klappt leider nicht immer zuverlässig, knapp 30% der Anfragen gehen daneben.

Gruß, Michael

Hallo Michael,

ich habe einen USB-IR Schreib-Lesekopf im Einsatz, Artikelnummer 00027 ( einfach mal suchen, 30 € ).
Der hat einen Magnet und sitzt komfortabel am Zähler.
Angeschlossen ist er über einen USB-Hub am 24/7 Rechner, auf dem auch IPS läuft.
Als I/O Instanz habe ich einen Seriell-Port mit 300 bd eingestellt.
In der Testphase kamen die Daten trotz kurzer Abfragezyklen ohne Probleme. Zur Zeit reicht mir eine Aktualisierung jedoch einmal pro Stunde.

Gruß
Volker

Hallo,

auch wenn dieser post schon etwas älter ist, hoffe ich ihr könnt mir helfen.
Ich habe den Ir Lesekopf von weidmann als USb ausführung.
Über die Datenabfrage gem. Weidmann Howto auf Rasberry klappt.

Wenn ich jetzt das erste script ausführe bekomme ich folgende fehler:

Fatal error: Uncaught Error: Call to undefined function COMPort_SendText() in /var/lib/symcon/scripts/24327.ips.php:7
Stack trace:
#0 {main}
thrown in /var/lib/symcon/scripts/24327.ips.php on line 7
er scheint den Befehl comportsent nicht zu kennen. Was kann ich da ändern?

Danke im vorraus

lg

Rob

Hallo,

habe es wie folgt angepasst.

jetzt gibt das script keine fehler mehr aus.

<?

// Dieses Script triggert die IR-Zählerschnittstelle damit Daten ausgegeben werden
// der Port arbeitet mit 300 Baud 71E
// wichtig ist die Wartezeit von ca 2 sec

SPRT_SendText(48143 /*[Serial Port eHZ ]*/, chr(0x2f).chr(0x3f).chr(0x21).chr(0x0d).chr(0x0a)); // ersten String an IR schnittstelle senden
IPS_Sleep(2000);       // sollte > 1000 und < 3400 sein
SPRT_SendText(48143 /*[Serial Port eHZ ]*/, chr(0x06).chr(0x30).chr(0x30).chr(0x30).chr(0x0d).chr(0x0a)); // zweiten String an IR schnittstelle senden

?>

Aber ab hier stockt es . wie mache ich weiter??

danke lg

Rob

Nachtrag:

wenn ich das erste script ausführe, sehe ich paralell in der Rasberyy Konsole das dort Werte vom IR Kopf zurückkommen und geschrieben werden. Die Schreibanforderung vom ersten script funktioniert also.
Aber ich verstehe das mit der Register Variablen und dem Cutter nicht.

Sehe ich das richtig, das der Cutter die Serielle Schnittstelle mitliest und werte „rausschneidet“ ?

Bitte um eure hilfe.

Danke LG

rob