LÖSUNG:
Die Doku zu DOIF habe ich in den letzten Monaten gefühlt 20 Mal durchgelesen. Dass die Lösung zu meinem Problem ausgerechnet explizit da drin steht, ist mir etwas peinlich.
http://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen (http://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen)
Für meinen konkreten Fall sähe das so aus
[device:state:"\d\d\:(\d\d)\:\d\d"]
Ganz einfach...
Vielen Dank noch mal für die Hilfe. Das Thema hat mich auf jeden Fall schon mal dazu gebracht, mich mit Regex eingehender zu beschäftigen.
Oli
PROBLEM:
Ich frage per httpmod meine aktuelle Fahrzeit über eine Google-Maps API ab. Dabei erhalte ich einen Zeitstring im Format HH:MM:SS.
Ich möchte nun lediglich die Minuten weiterverarbeiten. Ich weiß, dass ich den String über den regex
"\d\d\:(\d\d)\:\d\d"
entsprechend formatieren kann.
In FTUI funktioniert das über
data-part="\d\d\:(\d\d)\:\d\d"
zur Anzeige der Minuten auch gut. Ich weiß allerdings nicht, über welche Syntax ich den Befehl per stateFormat in ein DOIF oder dummy einbinde.
{("\d\d\:(\d\d)\:\d\d",[device:reading])}
wirft leider einen Syntax-Error aus. Wäre jemand so nett, mich mal in die richtige Richtung zu drehen. Losmarschieren würde ich dann selbst.
Oli
Hallo,
um eine RegEx auszuführen muss Perl auch erkennen, dass Du das tun möchtest. Bei data-part ist es so, dass die RegEx hinterlegt wird, aber dann vom Modul entsprechend ausgeführt wird. Dein Code:
{("\d\d\:(\d\d)\:\d\d",[device:reading])}
ist allerdings für Perl nichts sagend, da weder eine Perl- noch eine Fhem-Funktion angesprochen wird.
Eine Lösungsmöglichkeit ist z.B.
{(split(':',[device:reading]))[1]}
Die Perl-Funktion split sucht nach einem Trenner, hier ":" und füllt die einzelnen Zeichen zwischen dem Trenner in ein Array. In deinem Fall: HH ins Element[0], MM ins Element[1] und SS ins Element[2].
Der gezeigte Aufruf gibt nun als Ergebnis das Element[1], also die Minuten, zurück.
Was auch gehen sollte ist:
{ [device:reading] =~ m/\d\d\:(\d\d)\:\d\d/g; return $1}
Hier wird durch den Operator "=~" angezeigt, dass ein RegEx durchzuführen ist. Das Ergebnis wird in $1 abgelegt und durch das return an stateFormat zurück geben.
Grüße Jörg
Hallo Jörg,
danke für die Erklärungen. Das war sehr hilfreich. Ich werde mich in den nächsten Tagen mal mit der split-Funktion beschäftigen und versuchen heraus zu bekommen, wie ich das in mein DOIF einbaue. Ich habe Deine Beispiele in einigen Varianten bereits als State und stateFormat Attribut ausprobiert, bekomme aber noch Syntax-Fehler. Aber das soll nicht Dein Problem sein.
Vielen Dank.
Oli