gelöst: Teil eines Wertes von STATE eines Dummies mittels Regex extrahieren

Begonnen von StefanD, 30 Dezember 2014, 15:02:53

Vorheriges Thema - Nächstes Thema

StefanD

Hallo zusammen,

ich stehe seit gut 2 Stunden so was von auf dem Schlauch und finde weder hier im Forum noch über Google was, das mir weiterhilft...  :(

Für eine Dummy zum Vorgeben der Abwesenheitsdauer habe ich über setList die Möglichkeit unterschiedliche Werte zuzuweisen:
define dmy_Abwesenheitsdauer dummy
attr dmy_Abwesenheitsdauer icon control_building_empty
attr dmy_Abwesenheitsdauer room _Test
attr dmy_Abwesenheitsdauer setList state:anwesend,weg,lange_weg,1h,2h,3h,4h,5h,6h,7h,8h,9h,10h,12h,18h,24h,2d,3d,4d,5d,6d,1w
attr dmy_Abwesenheitsdauer webCmd state


Über ein DOIF möchte ich je nach Wert des STATE unterschiedlich agieren. Für die Werte anwesend,weg und lange_weg funktioniert das tadellos, ebenso der Sprung zu den jeweiligen Zeiteinheiten.
Hier z.B. für die Stunden:
DOELSEIF ([dmy_Abwesenheitsdauer]=~m/\d*h/) (...)

Mein aktuell nicht lösbares Problem besteht darin, dass ich bei den Werten, die mit einer Zahl beginnen nur die Zahl mittels einer Regex extrahieren möchte, da ich die zum Weiterrechnen benötige. Alle meine Versuche liefern immer nur den Wert 1 zurück...
Beispiel: Ist der STATE auf den Wert 24h gesetzt,  bekomme ich mit { Value("dmy_Abwesenheitsdauer")=~/\d+/ } immer eine 1 zurück.

Vermutlich nur eine Kleinigkeit, wenn man weiß, wie's geht...  ;)

Viele Grüße
Stefan
HW: Intel NUC8i5 mit ESXi7 mit Ubuntu Server 18.04 LTS und FHEM als DockerContainer

der-Lolo

Hast Du dir mal das Residents Modul angeschaut? Es macht genau was Du möchtest und löst notwendige Events aus...

StefanD

Danke für den Hinweis. Das Modul habe ich mir schon angesehen, aber das tut es meinem Verständnis nach nicht, denn dort fehlt mir eine Vorgabe für die Dauer der Abwesenheit.

Letztlich ist das aber für mein Problem aber auch unerheblich, da das Extrahieren eines Teilstrings aus dem STATE oder Readings eines Dummies auch in anderen Konstellationen vorkommen kann.

Viele Grüße
Stefan
HW: Intel NUC8i5 mit ESXi7 mit Ubuntu Server 18.04 LTS und FHEM als DockerContainer

TomWest

Ich bin zwar absoluter Perl Neuling, aber macht { Value("dmy_Abwesenheitsdauer")=~/\d+/ } nicht einfach einen logischen Vergleich, ob der Inhalt von dmy_Abwesenheitsdauer zum regex passt und gibt dann 0 - Nein oder 1 - Ja aus?
Kann man nicht mit substr den String reduzieren und dann damit weiterarbeiten, wenn es zum obigen Regex passt?
FHEM on R-π - HM-TC-IT-WM-W-EU - HM-LC-Sw1-FM - HM-SCI-3-FM - HM-CC-RT-DN

Icinger

{ Value("dmy_Abwesenheitsdauer")=~/\d+/ }

Damit bekommst du wirklich nur  das Ergebnis des logischen Vergleichs, wie TomWest schon sagte.

Du kannst es aber so machen:
{ Value("dmy_Abwesenheitsdauer")=~/(\d+)/ ;Log 3,"Wert: $1"}
Damit bildest du eine Gruppe über die Zahlen und hast danach in $1 den richtigen Wert stehn.

Alternativ auch:
{ my $Wert=Value("dmy_Abwesenheitsdauer")=~/\d+/ }

lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

StefanD

Das mit dem Vergleich ist mir auch schon in den Sinn gekommen...
Ein
{ Value("dmy_Abwesenheitsdauer")=~s/\D*//g }
zum Ersetzen mit nichts von Nichtzahlen liefert
Can't modify non-lvalue subroutine call in substitution (s///) at (eval 19573) line 1, at EOF
HW: Intel NUC8i5 mit ESXi7 mit Ubuntu Server 18.04 LTS und FHEM als DockerContainer

StefanD

Wenn ich den Code über das Webinterface ausführe:
Zitat von: Icinger am 30 Dezember 2014, 15:36:40
{ Value("dmy_Abwesenheitsdauer")=~/(\d+)/ ;Log 3,"Wert: $1"}
Bekomme ich folgenden Fehler zurück:
Unknown command {, try help.
Unknown command Log, try help.


Zitat von: Icinger am 30 Dezember 2014, 15:36:40Alternativ auch:
{ my $Wert=Value("dmy_Abwesenheitsdauer")=~/\d+/ }

Bedeutet meinem Verständnis nach, dass das, was auf den Vergleich matched, in die Variable $Wert geschrieben wird. Korrekt?

Viele Grüße
Stefan
HW: Intel NUC8i5 mit ESXi7 mit Ubuntu Server 18.04 LTS und FHEM als DockerContainer

Icinger

Stimmt, wird nach $Wert geschrieben.
Auch diese Version funktioniert im Webinterface nicht.
Beide funktionieren aber zB innerhalb einer Sub in der myutils, bzw. auch in Perl-Abfragen zB im DOIF oder sonstigem.

lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

StefanD

Danke, jetzt ist der Groschen gefallen!  :)

Viele Grüße
Stefan
HW: Intel NUC8i5 mit ESXi7 mit Ubuntu Server 18.04 LTS und FHEM als DockerContainer