ReadingsNum erweitern

Begonnen von Wolle02, 26 April 2026, 11:46:26

Vorheriges Thema - Nächstes Thema

Wolle02

Hallo zusammen, laut CommandRef gibt ReadingsNum die erste Zahl aus dem Readingswert zurück. Wäre es möglich die Funktion um einen Parameter zu erweitern, um die Stelle der Zahl zu definieren, die zurückgegeben werden soll?

Beispiel:
Reading: 0d 0h 0m 19s -> ReadingsNum(<devicename>,<reading>,<defaultvalue>,<round>,3) -> Rückgabewert: 19

CoolTux

#1
Bau um das readingsNum ein split
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Guybrush

"0d 0h 0m 19s" liefert doch bestimmt bereits nur die 19 oder garnix, weils nen string ist? aber das was cooltux schon schrieb ist wenn dann der weg. sowas in die funktion einzubauen halte ich für wenig sinnvoll

betateilchen

Zitat von: CoolTux am 26 April 2026, 13:19:41Bau um das readingsNum ein split

Nur mal interessehalber: was hat man denn zum Splitten, wenn ReadingsNum() bereits nur eine einzige Zahl zurückliefert?

Ich würde das mit einer regex lösen und die entsprechende group verwenden:

/(\d+)d.(\d+)h.(\d+)m.(\d+)s/
liefert vier Werte $1 $2 $3 $4 .
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Otto123

#4
Zitat von: CoolTux am 26 April 2026, 13:19:41Bau um das readingsNum ein split
Als Demo für die FHEM Kommandozeile:
{ 0 + ( split ' ',ReadingsVal('name','reading','0d 0h 0m 19s') )[3] }
Klar viel aufwändiger als ein regex - aber damit kann ja nicht jeder :)

Perl extrahiert Zahlen vom linken Rand bis zum ersten ungültigen Zeichen eines Strings. Also man kann den Split direkt in der arithmetischen Operation verwenden, den dummy mit 0+ oder 1* braucht man nicht extra.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle

aktives Mitglied des FHEM e.V. (Technik)

JoWiemann

Würde das mal noch in die Waagschale werfen:
my $result = $data =~ /.(\d\d)s/ ? $1 : 0;
Damit auch Fehler abgefangen werden.
Jörg Wiemann

RPi 4 B mit 4 GByte bookworm, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM; zigbee2mqtt

ioBroker als Datenlieferant für z.B. Anker, Samsung

betateilchen

Zitat von: Otto123 am 27 April 2026, 09:07:28Als Demo für die FHEM Kommandozeile:
{ 0 + ( split ' ',ReadingsVal('name','reading','0d 0h 0m 19s') )[3] }

Die Frage war aber nach ReadingsNum() nicht nach ReadingsVal().

Zitat von: CoolTux am 26 April 2026, 13:19:41Bau um das readingsNum ein split
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Otto123

Ich nahm die Empfehlung als "Versprecher" ;) - das es bei ReadingsNum() nix zu splitten gibt, hattest Du ja schon gesagt.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle

aktives Mitglied des FHEM e.V. (Technik)

CoolTux

Stimmt, ich meinte es auch andersrum. Also erst splitten und dann readingsNum.
So sollte es gehen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net