[gelöst] HTTPMOD Zeitmanipulation

Begonnen von Tbone, 17 Dezember 2016, 23:25:14

Vorheriges Thema - Nächstes Thema

Tbone

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

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Tbone

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

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Tbone

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

viegener

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 )

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Tbone

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

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Tbone

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

viegener

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?
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

viegener

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
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Tbone

Asche auf mein Haupt.
Klar sollten dort runde Klammern stehen.

DANKE!

-Tbone

FhemPiUser

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?