[gelöst] userreadings mit "Split" bilden

Begonnen von Thomas41587, 31 März 2022, 15:15:44

Vorheriges Thema - Nächstes Thema

Thomas41587

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?

Beta-User

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]}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Thomas41587

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]}

Beta-User

#4
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...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Thomas41587

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!