Hi.
Ich bekomme via
attr WLKuG reading10Name Abfahrtszeit0201
einen UTC Wert alá
2016-12-17T22:21:00.000+0000
Nun habe ich versucht
attr WLKuG reading07Regex ([\d]+:[\d]+)
an die Zeit zu kommen. Fehlanzeige. Da bekomme ich nur die Zeit zu der der Wert ausgelesen wurde.
1. Wie muss mein Regex aussehen, damit ich die Uhrzeit herausbekomme?
Weiters weis ich nicht ob readingOExpr auch mit Urzeiten umgehen kann, um die UTC Zeit in CET/CEST umzurechen.
2. Kann das mittels readingOExpr funktionieren, oder brauche ich eine Routine in myUtils?
Danke im Voraus,
Tbone
Du schon wieder ;)
Hinweis: Wenn es um dasselbe HTTPMOD von vorher gehtn, dann geht es doch dabei um JSON-Daten oder?
Sollte das stimmen, dann bist Du mit dem Regex eigentlich hier falsch - denn Du willst ja JSON-Readings erzeugen
Alternativ: Wenn nicht JSON sondern Regexp, dann gibt Dein Regexp eine sehr generische Vorgabe, die vermutlich bereits im http-Header einen Wert findet. Für Regexp ist es wichtig eine Einschränkung zu definieren, so dass der richtige Teil der Serverantwort matcht und nicht jede Ziffenkombo, die auf Deinen Ausdruck passt
Achso und zur anderen Frage:
Zitat von: Tbone am 17 Dezember 2016, 23:25:14
2. Kann das mittels readingOExpr funktionieren, oder brauche ich eine Routine in myUtils?
reading..OExpr nimmt einen perl-Ausdruck entgegen. Damit kannst DU fast alles machen, was auch in myUtils geht.
Generell ist die Umwandlung von Zeiten zwischen Zeitzonen ja nicht so aufwändig, aber erstmal muss aus dem String etwas werden, was perl als Zeit interpretieren kann. Dazu gibt es eine Menge Hinweise und Beispielcode im Netz
Servus.
Du hast Recht, ich schon wieder.
Ja, der Wert kommt von einem JSON Reading
attr WLKuG reading01JSON data_monitors_01_lines_01_departures_departure_01_departureTime_timePlanned
attr WLKuG reading01Name Abfahrtszeit0101
Der Wert im Reading ist "2016-12-17T22:57:00.000+0000". Ist das nun ein String, den ich erst konvertieren muss, oder wie komme ich von dieser Datum/Zeit-Kombination in UTC zu Zeit@CET(z.B. via localtime) alá "23:57"?
Danke,
Tbone
Nun ja, das kommt darauf an, worauf Du Dich verlassen willst/kannst:
Also angenommen die Zeitangabe ist immer in GMT und Dich interessiert wirklich nur die Uhrzeit mit Stunde und Minut, dann ist es immer noch ein wenig Code nötig:
Ansatz (nicht sehr generisch):
- Mit einem Regexp hh und mm matchen
- Stunde und Minute in Variablen packen
- Differenz zu GMT ermitteln
- Differenz aufaddieren
- fertig
sub calcTimefromGMTimestamp( $ ) {
my ($t) = @_;
if ( $t =~ /T(\d\d):(\d\d):/ ) {
my $hr = $1;
my $mn = $2;
my $off = fhemTzOffset(time()) / 3600;
$hr += $off;
$hr = $hr % 24;
return "$hr:$mn";
}
return "<unknown>";
}
Also ab damit in myutils
Vorab ein herzliches Dankeschön, aber ...
Der kleine Maxi stellt sich nun vor, diese Funktion direkt aus der Definition heraus aufrufen zu können, was aber fehlschlägt.
attr WLKuG reading01OExpr calcTimefromGMTimestamp{WLKuG:Abfahrtszeit0101};
Wie rufe ich Deine tolle Funktion also auf?
- aus dem Reading?
- via einer Dummy Variable? (Das wird dann aber echt viel bei meinen Abfahrtszeiten)
- ganz anders?
Idee: wenn aus dem reading01JSON mittels eines Regex mehrere Reading Groups entstehen würden (reading01-1,reading01-2), könnte man das dann für die Group "Stunde" nicht gleich in reading01OExpr hineinpacken? (oder bin ich naiv?)
Danke,
Tbone
Inwiefern schlägt es fehl - Gibt es eine Meldung?
Allerdings ist das was Du da definierst auch nicht wirklich perl , versuche doch mal einen richtigen FUnktionsaufruf wie auch
attr WLKuG reading01OExpr calcTimefromGMTimestamp( $val )
So,
jetzt funktioniert der Aufruf der Subroutine, aber
2016-12-17T20:51:00.000+0000 wird in der Variable $t zu "HASH(0x11edf30)" was zu <unknown> führt.
Als Perllaie bin ich wieder voll aufgeschmissen. Welcher Teil betreibt hier ungewollt Typenkonvertierung?
-Tbone
Ich glaube, Du musst mal das Device hier als list reinkopieren (bitte in code tags), wenn in $val ein hash steht, dann muss ich wissen, wie es zu dem reading kommt
Servus.
Es wäre mir nicht bewusst, dazwischen noch eine Typenmanipulation zu machen.
define WLKuG HTTPMOD http://www.wienerlinien.at/qando-fpa/monitor?aD=1&aflT=1&diva=60200726 3600
[...]
attr WLKuG reading04JSON data_monitors_01_lines_01_departures_departure_01_departureTime_timePlanned
attr WLKuG reading04Name Abfahrtszeit0101
attr WLKuG reading04OExpr calcTimefromGMTimestamp{ $val }
[...]
#Ausgabe
define WLabfahrtsmonitorKuG readingsGroup <Haltestelle>,<Linie>,<Richtung>,<Abfahrt>,<Countdown>\
WLKuG:Haltestellenname01,Linie0101,Richtung0101,Abfahrtszeit0101,Countdown0101\
[...]
Ich hoffe es hilft.
-Tbone
Zitat von: Tbone am 18 Dezember 2016, 21:30:27
So,
jetzt funktioniert der Aufruf der Subroutine, aber
2016-12-17T20:51:00.000+0000 wird in der Variable $t zu "HASH(0x11edf30)" was zu <unknown> führt.
Als Perllaie bin ich wieder voll aufgeschmissen. Welcher Teil betreibt hier ungewollt Typenkonvertierung?
-Tbone
Was heisst das, das der String zu dem hash wird? Wie hast Du das festgestellt?
Ahhhh - Jetzt sehe ich es erst - Funktionsaufrufe in perl werden mit runden Klammern gemacht, wenn du geschweifte Klammern verwendest wundert mich das mit dem Hash nicht mehr. Ich hatte es doch extra komplett oben vordefiniert.
Bitte probiere es also mit runden Klammern aus
Asche auf mein Haupt.
Klar sollten dort runde Klammern stehen.
DANKE!
-Tbone
Ich habe ein ähnliches Problem. Ich möchte einen Unix Timestamp in ein lesbares Datumformat in httpmod konvertieren. Ich habe es versucht mit:
attr dev get04OExpr strftime("%d.%m %H:%M",$val)
attr dev get04OExpr sprintf("%s.%s %s:%s",localtime($val)[5],localtime($val)[4],localtime($val)[3],localtime($val)[2])
bekomme aber immer eine Fehlermeldung wie
Invalid Expression strftime('%d.%m %H:%M',$val)
Jemand eine Idee, was das Problem sein könnte?