[GELÖST]: Zeitstring formatieren

Begonnen von OliS., 24 Mai 2016, 10:12:46

Vorheriges Thema - Nächstes Thema

OliS.

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

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
FHEM in Debian VM auf DS720+, HMLAN und HMUARTLGW, RFXTRX, Conbee II, Homebridge, Alexa
Geräte: Homematic, Tradfri, Shelly, IT, ESA2000, VU+, Denon-AVR, Sonos, Fritz!Box, Harmony Hub, IP-Cams, Roborock, Automower

JoWiemann

#1
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
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

OliS.

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
FHEM in Debian VM auf DS720+, HMLAN und HMUARTLGW, RFXTRX, Conbee II, Homebridge, Alexa
Geräte: Homematic, Tradfri, Shelly, IT, ESA2000, VU+, Denon-AVR, Sonos, Fritz!Box, Harmony Hub, IP-Cams, Roborock, Automower