FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Thomas41587 am 31 März 2022, 15:15:44

Titel: [gelöst] userreadings mit "Split" bilden
Beitrag von: Thomas41587 am 31 März 2022, 15:15:44
Hallo zusammen,
meine Wallbox liefert mir im Reading "energyArray_U_I_P_pf" diverse Werte, die mit Komma getrennt sind. Beispiel:
[227,227,227,0,15.1,15.2,15.1,3300,3400,3300,0,10180,98,98,98,4]
Um das schön darzustellen, hätte ich die Werte gerne in einzelnen Readings. Habe mich schon mittels RegEx versucht, aber da stehe ich absolut auf Kriegsfuß. Über das Forum bin ich über die Funktion "split" gestolpert und das klingt eigentlich vielversprechend.
Mein bisheriger Versuch:
attr MQTT_DEVICE_wallbox userReadings my $Strom1=(split(",",ReadingsVal("$name","energyArray_U_I_P_pf","")))[0];;
Macht aber einfach absolut nichts. Kann mir jemand einen "schupser" in die richtige Richtung geben?
Titel: Antw:userreadings mit "Split" bilden
Beitrag von: Beta-User am 31 März 2022, 15:48:44
attr MQTT_DEVICE_wallbox userReadings Strom1:energyArray_U_I_P_pf.* {my $val=ReadingsVal($name,'energyArray_U_I_P_pf','');; $val=~ s{\A.([0-9.]+).*\z}{$1};; $val},\
Strom2:energyArray_U_I_P_pf.* {my $val=ReadingsVal($name,'energyArray_U_I_P_pf','');; $val=~ s{\A.(.*).\z}{$1};; my @arr = split m/,/x, $val;; $arr[0]}
Titel: Antw:userreadings mit "Split" bilden
Beitrag von: betateilchen am 31 März 2022, 17:20:22
gehts nicht noch komplizierter ???


my @values = ( ReadingsVal($name,'energyArray_U_I_P_pf','') =~ /([\d.]+)/g );


Danach stehen alle Werte in einem array und können nach Belieben vewendet werden.
Titel: Antw:userreadings mit "Split" bilden
Beitrag von: Thomas41587 am 01 April 2022, 10:07:39
Erst einmal danke für die schnelle Hilfe!
Die erste Zeile von Beta-User funktioniert. Die zweite liefert leider keine Werte. Allerdings komme ich auch mit der Syntax nicht ganz klar und verstehe nicht wirklich was passiert. Gebe ich den RegEx bei regex101 ein, erhalte ich als erste Erklärung "s{ matches the characters s{ literally (case sensitive)", was ich nicht nachvollziehen kann (wo soll da ein "s" im String sein?).
Den RegEx von betateilchen habe ich so ziemlich verstanden. Hier ist mir nur nicht ganz klar, wieso der RegEx sowohl bei Ganzzahlen als auch bei Zahlen mit "." funktioniert. Ich sehe hier kein "oder" (wie gesagt, RegEx und ich stehen absolut auf Kriegsfuß, hier bin ich leider noch ganz am Anfang).
Habe hier mal versucht das userReading zu bauen, aber bekomme keine Werte. vermutlich übersehe ich noch etwas?
Strom3:energyArray_U_I_P_pf.* {my @values=( ReadingsVal($name,'energyArray_U_I_P_pf','') =~ /([\d.]+)/g );; $values[2]}
Titel: Antw:userreadings mit "Split" bilden
Beitrag von: Beta-User am 01 April 2022, 10:24:56
Weiß ja nicht, wie und wo du das eingegeben hast. Das hier ist für das "grüne Plus" und funktioniert mit dem Reading-Wert, den du gezeigt hattest:
attr MQTT_DEVICE_wallbox userReadings Strom3:energyArray_U_I_P_pf.* {my @values=( ReadingsVal($name,'energyArray_U_I_P_pf','') =~ /([\d.]+)/g );; $values[4]},\
Strom1:energyArray_U_I_P_pf.* {my $val=ReadingsVal($name,'energyArray_U_I_P_pf','');; $val=~ s{\A.([0-9.]+).*\z}{$1};; $val},\
Strom2:energyArray_U_I_P_pf.* {my $val=ReadingsVal($name,'energyArray_U_I_P_pf','');; $val=~ s{\A.(.*).\z}{$1};; my @arr = split m/,/x, $val;; $arr[0]}


Anmerkungen:
- betateilchen's Code ist der universellste, funktioniert aber "nur" mit reinen Zahlen-Arrays (einschl. des Dezimal-Punktes und chinesischen Zahlensymbolen, da "\d")
- "Strom1+2" machen erst eine "substituion", wobei Strom1 sich eben die Zeichen 2-x krallt, sofern diese eine arabische Ziffer oder ein Punkt sind, und die Strom2 erst die eckigen Klammern weghaut und den Rest als Array aufteilt.

Nachtrag noch: Das sieht mir insgesamt nach einem "verkorksten Ergebnis" aus einem JSON-Payload aus. Eventuell versuchst du es mal mit MQTT2_DEVICE, das packt das ggf. direkt anders aus...
Titel: Antw:userreadings mit "Split" bilden
Beitrag von: Thomas41587 am 01 April 2022, 10:41:29
Zitat von: Beta-User am 01 April 2022, 10:24:56
Weiß ja nicht, wie und wo du das eingegeben hast. Das hier ist für das "grüne Plus" und funktioniert mit dem Reading-Wert, den du gezeigt hattest:
Danke, das war der entscheidende Hinweis. Jetzt funktionieren beide Lösungen. Vielen Dank!
Und auch danke für die Erklärungen, das hilft mir bei den nächsten RegEx Aufgaben ungemein weiter!