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
Bau um das readingsNum ein split
"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
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 .
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.
Würde das mal noch in die Waagschale werfen:
my $result = $data =~ /.(\d\d)s/ ? $1 : 0;
Damit auch Fehler abgefangen werden.
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
Ich nahm die Empfehlung als "Versprecher" ;) - das es bei ReadingsNum() nix zu splitten gibt, hattest Du ja schon gesagt.
Stimmt, ich meinte es auch andersrum. Also erst splitten und dann readingsNum.
So sollte es gehen.