Uhrzeit aus Tablet UI per timepicker an DOIF mit Berechnung übergeben

Begonnen von Loctite, 06 Januar 2020, 22:02:33

Vorheriges Thema - Nächstes Thema

Loctite

Hallo !

Ich möchte gerne Zeiten eines DOIF über das TabletUI verändern können.
Zur Zeit habe ich zwei (größere) Probleme:

1. Ich habe wie gesagt diesen timepicker in die Oberfläche eingebaut, das dummy hat aber immer Datum und Uhrzeit. Ich hab nun einiges mit setList oder stateFormat gelesen und versucht, aber nichts hat funktioniert. Gibt es hier eine einfache Möglichkeit das Format des dummys so zu ändern das nur eine echte Uhrzeit im state erscheint ? Wenn nicht, mache ich es per split über ein weiteres dummy, das sollte gehen.

2. Diese Uhrzeit hätte ich gerne in einem DOIF eingebaut, mit festen Berechnungen.
So ist es jetzt (DEF meines DOIF):
([05:00-06:05] and !$we and [frueh] eq "ja") (set Sh_Wohnzimmer...

Nun möchte ich die erste Uhrzeit aus dem dummy und die zweite Uhrzeit als Beispiel dummy +1:05h
Ich habe es mit Value(dummy) versucht, aber ich denke da muss einiges an Klammern und vielleicht ein {fhem(... dazu ?

Oder gibt es hier generell eine bessere Lösung für solche Sachen ?
Bedanke mich !

KernSani

Hi,

die timepicker-Frage ist vermutlich im TabletUI-Forum besser aufgehoben (und was genau du da für einen dummy hast, wäre vermutlich auch hilfreich).
Beim DOIF verstehe ich die Frage nicht ganz... Wie du eine Zeit aus einem Dummy liest und im DOIF nutzt, ist in der DOIF Commandref mit Beispiel beschrieben.

Beim zweiten Mal Lesen habe ich es doch verstanden: Das ist aber auch in der Commandref beschrieben. Du könntest die zweite Zeit (also die "bis"-Zeit) z.B. in einem userreading in deinem Dummy berechnen und dann im DOIF verwenden.
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Damian

Du kannst auch mit Ausgabeformatierung https://fhem.de/commandref_DE.html#DOIF_Filtern_nach_Zahlen direkt den Dummy im DOIF als Zeit verwenden.

Beispiele: https://wiki.fhem.de/wiki/DOIF/Zeitspanne_zwischen_zwei_Terminen_schalten
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Loctite

Das hilft mir so nicht so richtig weiter.
Mit dieser Ausgabeformatierung wird mir zu kompliziert wird, deshalb hatte ich einen einfacheren Weg versucht, mit userReadings einen zweiten Wert (bzw. alle) errechnen lassen.

Nur noch mal kurz zur Erklärung, hatte das so nicht dazu geschrieben:
Ich möchte eine Uhrzeit per timepicker erfassen (das funktioniert). Nun wird diese Startuhrzeit in einigen DOIF verwendet, aber es wird immer was anderes damit angestellt.
Einmal werden von dieser Zeit 15 Minuten abgezogen, dann wird in einem anderen DOIF diese Zeit +15 Minuten benutzt. Und dazu kommen noch verschiedene Endezeiten im DOIF.
Wenn sich nun diese eine Zeit ändern soll, müsste ich jedes mal mehrere DOIF ändern.
Die berechneten Zeiten bzw. Zeitabstände wie +15 Minuten / -15Minuten sind fest, ich will nur die "Stammzeit" verändern können.

Zeitübergabe aus dem timepicker ist so :  2020-01-08 14:30
Nun wollte ich wie hier beschrieben, Zeit berechnen: https://wiki.fhem.de/wiki/Zeitangaben,_rechnen_mit
Nun fangen die Ersten Probleme schon an. Es wird ein Reading verwendet, anstelle von "motion" hier einfach "state" einzutragen funktionierte leider nicht

Beispiel aus der Hilfe (Gerät BM1, reading "motion" es sollen 2h und 12 Minuten addiert werden):
{POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp("BM1","motion","2000-01-01 00:00:00"))+2*60*60+12*60))}
Also war mein erster Umweg per userReadings ein Reading mit der gleichen Zahl+Datum zu erzeugen...ja ich weiß, bestimmt unnötig, aber ich wusste es leider nicht besser.
Das funktioniert...prinzipiell !

Zweites Problem: Zeitstempel ist anders als im Beispiel ! Es fehlen die Sekunden !
Also habe ich in der Zeile von 2001-01-01 00:00:00 auf 2001-01-01 00:00 geändert, was aber nicht funktioniert hat.
Die Berechnung habe ich immer wieder verändert, aber es ist nie das raus gekommen was ich gerne hätte, oder es funktioniert gar nichts und das neue Reading verändert sich gar nicht mehr.
Ich bin nun schon die ganze Zeit am suchen, aber Beispiele haben immer auch Sekunden... >:(

Wenn ich weiß wie die Berechnung aussieht, werde ich diese Berechnungen in separate Readings des dummys einfügen lassen.
Danach kann ich diese dann in meine DOIF einbauen.
Vielleicht etwas umständlicher, aber ich muss das auch auch selber verstehen (mehr oder weniger).

Was mir (hoffentlich) nur fehlt ist Berechnung von Zeit wenn es keine Sekunden gibt...kann mir das jemand zeigen ?

EDIT:
Es geht in dem Beispiel um "ReadingsTimestamp" um die Uhrzeit des readings, nicht um den Inhalt des Readings.
Deshalb kann das ja gar nicht funktionieren.
Ich habe aber ein dummy welches als "state" die Zahlenreihe 2020-01-08 16:10 hat.


Damian

Dann hast du vielleicht dir die Filterfunktionen nicht genauer angeschaut.

Bsp.

in Dummy time steht: 2020-01-08 16:10

Dann reicht die Angabe im DOIF für einen Zeittrigger um 16:10 Uhr:

DOIF ([[time:state:" (\d\d:\d\d)"]])...

oder für ein Zeitintervall von 16:10 bis 16:40:

DOIF ([[time:state:" (\d\d:\d\d)"]-([time:state:" (\d\d:\d\d)"]+[00:30])])...

Das Schöne an der Sache ist auch, dass eine Änderung des Zeitstempels im Dummy time automatisch zu einer Neuberechnung der Triggerzeit bzw. des Zeitintervalls führt ;)

Wenn du dir ein DOIF_Reading mit der obigen Filter-Syntax definierst, dann kannst du dieses noch einfacher für die Zeitdefinitionen nutzen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Loctite

Ja das stimmt, ich habe es mir nicht richtig angeschaut, weil ich damit total überfordert war  ???

Ich habe nun deine Beispiele eingebaut und zusätzlich bei der ersten Uhrzeit des DOIF auch noch mal eine Berechnung mit -[00:15] eingefügt.
So viele Klammern habe ich noch nie gesetzt !
Zum Glück hab ich FHEM so eingestellt, das mir die Klammernzugehörigkeit (keine Ahnung wie man das nennt) im DEF Editor angezeigt wird.
Das ist nun schon extrem kompliziert. Aber ok, hat man es einmal, versteht man es auch (mehr oder weniger).

Vielen Dank für das Beispiel !!!

Wenn jemand was zu der Zeitberechnung sagen könnte, also aus einem Reading im 00:00 oder 00:00:00 Format, würde ich mich trotzdem noch darüber freuen.

Damian

Naja, dein Beispiel hat aber auch schon fünf Klammerebenen ;)

Freu dich, dass es Klammern überhaupt gibt, FHEM selbst kennt keine Klammern: daher viel Spaß beim Zählen von duplizierten Semikolons

Du kannst dir das Leben aber auch einfacher machen:

mit
attr DOIF_Readings time: [time:state:" (\d\d:\d\d)"]
brauchst du in der Bedingung nur noch das Reading als indirekte Zeit anzugeben:
[code]DOIF ([[$SELF:time]])...

Wie man im DOIF mit Zeiten rechnen kann, hast du bereits am Beispiel gesehen, den Rest kannst du in der Commandref zu DOIF nachlesen.

Wenn du unbedingt in Perl mit Zeiten rechnen willst, dann hast du bereits den richtigen Ansatz gefunden - viel einfacher wird es nicht werden ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF