Parsing - wo ist der Fehler?

Begonnen von Schorsch, 03 Januar 2013, 15:13:41

Vorheriges Thema - Nächstes Thema

Schorsch

Moin,

ich habe hier folgende Ausgabe von einem eHZ-OBIS/D0-Zähler (beschreibt einen Zählerstand in kWh):

1-0:2.8.0*255(003822.2511)

Die wollte ich parsen und habe mir folgendes zusammengesucht:

# Wirkleistung -A -> 1-0:2.8.0*255(00003822.251100)
    my ($apMinus, $apMinusUnit) = qw(0 kWh);
    if ($rmsg =~ m/^1-0:2.8.0\*255\((\-?\d+\.\d+)\*(\w+)\)\s*$/m) {
        ($apMinus, $apMinusUnit) = ($1, $2);


Nun kommen immer die 0 kWh raus, d.h. das "if" trifft nicht zu. Was wiederum bedeutet, dass meine Parser-Bedingungen falsch sind. Erkennt jemand von Euch den Fehler darin? Würde mir sehr helfen, auch für die anderen Abfragen :-)

Danke + Grüße!
Georg

UliM

Hi,
ich würd den ersten Teil weglassen und das parsen erst mit .*( beginnen.

Je nachdem, ob dieser code in 99_myUtils oder in einem notify steht, müssen ggf weitere Zeichen escaped werden.

Versuch's doch erstmal im regexp-tester:  http://regexp-tester.mediacix.de/exp/regex/

Gruß Uli
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

Schorsch

Hi Uli,

danke für die Antwort!
Weglassen kann ich das leider nicht, denn der erste Teil identifiziert die Art des Wertes und da kommen noch weitere im Block. Ein auszuwertender Block sieht etwa so aus (# Kommentare von mir):


/HAG5eHZ* # Beginn Block, Wert anonymisiert, wird erkannt

1-0:0.0.0*255(nnnnnnnnnn) # EigentumsNr, Wert anonymisiert, Parsen klappt
1-0:2.8.0*255(003822.3203) # Zählerstand, Parsen klappt nicht, s.o.
0-0:96.1.255*255(nnnnnnnnnn) # ZählerNr, Wert anonymisiert, Parsen klappt
... # Spannungs- und Stromwerte pro Phase gelöscht
1-0:21.7.0*255(-00328*W) # PV-Anlage liefert das gerade an Phase 1, Parsen klappt nicht, s.o.
... # andere Phasen und Statusinfos gelöscht, nicht relevant
! # Ende Block, wird erkannt


Ich werde das heute Abend mal über den Checker laufen lassen, den kannte ich noch nicht. Das Problem müsste eigentlich im zweiten Teil sein, denn die Zeilen werden noch korrekt zugeordnet, sonst würden Eigentumsnummer und Zählernummer ja auch nicht funktionieren - die kommen aber sauber in fhem rein.

Die Werte an sich kommen sehr sauber, habe die Leseköpfe über RS232 am Server und tty dann mit ser2net auf einen Port gewrappt. So lassen sie sich mit wenig Last von fhem lesen, tty-Abfragen blockieren fhem ja gerne mal.

Viele Grüße,
Georg

Schorsch

So, ich hab's! Die korrekte Syntax lautet in dem Fall:

# Wirkleistung -A -> 1-0:2.8.0*255(00003822.251100)
    my ($apMinus, $apMinusUnit) = qw(0 kWh);
    if ($rmsg =~ m/^1-0:2.8.0\*255\((\-?\d+\.\d+)\)\s*$/m) {
        ($apMinus) = ($1);


Läuft prima, habe die anderen Register entsprechend ändern können.
Wieder was gelernt :)