FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: FHEMGerd am 10 August 2020, 23:02:42

Titel: Zeitberechnung läuft auf Fehler
Beitrag von: FHEMGerd am 10 August 2020, 23:02:42
Hallo,
ich beschreibe mal die Aufgabe bzw. mein neuestes Problem: Ein DOIF soll meine Jalousien (hängen an einer Logo) zum Sonnenuntergang runterfahren, sofern über dummy TimerJalEG die Zeitsteuerung eingeschaltet ist. Ich möchte im WEB UI eine Zeitspanne in Minuten einstellen können, die auf den Sonnenuntergang draufaddiert wird, diese Zeitspanne kann auch negativ sein. Ich habe die Commandref und auch die Beispiele Kurzzeitwecker angeschaut. Mein DOIF wird auch akzeptiert, aber zum Ausführungszeitpunkt kommt die Fehlermeldung "condition c01: syntax error, line 1, near "di_tmrEGab:"

defmod di_tmrEGab DOIF ( (([TimerJalEG] eq "ab") or ([TimerJalEG] eq "aufab"))  and ([{sunset_abs("REAL")}]+(($SELF:Zeitdelta)*60)) ) (set dyAktor ab) DOELSEIF ([00:00])
attr di_tmrEGab readingList Zeitdelta
attr di_tmrEGab setList Zeitdelta:slider,-60,5,120
attr di_tmrEGab stateFormat {(ReadingsVal("di_tmrEGab","timer_01_c01",""))}
attr di_tmrEGab webCmd Zeitdelta


Eine Idee war, das Zeitdelta der Funktion Sunset mitzugeben, aber das führt gleich zum Fehler.

In der Commandref steht ja, das Zeitberechnungen möglich sind, absolute Zeiten im Schema hh:mm stehen in eckigen Klammern, Zeitspannen in runden.

Kleiner kosmetischer Einwand: eigentlich sollte die Zeile

attr di_tmrEGab stateFormat {(ReadingsVal("di_tmrEGab","timer_01_c01",""))}

den nächsten Schaltzeitpunkt einschließlich der Zeitspanne anzeigen. Ich bin aber der Meinung, dass da nur der Zeitpunkt des Sonnenuntergangs drin steht.

Randinfo: Habe das DOIF Version 19786 2019-07-05 21:47:08

Jemand eine Idee ? Schönen Dank schon mal !
Gerd
Titel: Antw:Zeitberechnung läuft auf Fehler
Beitrag von: amenomade am 10 August 2020, 23:12:15
Zitat([{sunset_abs("REAL")}]+(($SELF:Zeitdelta)*60))
Das ist falsch. Siehe CommandRef https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung
Titel: Antw:Zeitberechnung läuft auf Fehler
Beitrag von: FHEMGerd am 10 August 2020, 23:25:11
ZitatDas ist falsch. Siehe CommandRef
Ok, aber wie wäre es denn richtig ?
Commandref: "Zeitberechnungen werden innerhalb der eckigen Klammern zusätzlich in runde Klammern gesetzt."

Wenn ich das versuche, z. B. so:
([{sunset_abs("REAL")}+(($SELF:Zeitdelta)*60)])
dann bekomme ich gleich einen Fehler ...
Titel: Antw:Zeitberechnung läuft auf Fehler
Beitrag von: amenomade am 10 August 2020, 23:35:28
($SELF:Zeitdelta) ist noch falsch => [$SELF:Zeitdelta]

EDIT: und das was Du gelesen hast, musst Du auch einsetzen:
ZitatZeitberechnungen werden innerhalb der eckigen Klammern zusätzlich in runde Klammern gesetzt.
DOIF (blabla and blabla and [(Zeitberechnung)] )
Titel: Antw:Zeitberechnung läuft auf Fehler
Beitrag von: Otto123 am 11 August 2020, 11:23:45
Hi,

mMn ist es besser die Funktion dazu direkt zu nutzen. Auszug Commandref SUNRISE_EL
Zitatoffset
Offset in Sekunden, der zu dem Rückgabewert der Funktion addiert wird.
Solches Gewurschtel mit der Zeit führt doch nur zu undurchsichtigen Situationen. Es macht auch Sinn die Funktionen zu nutzen wie sie vorgesehen sind, es gibt einen Grund das es sunset gibt :)
Man merkt solche Feinheiten dann immer beim Wechsel Winter/Sommer/Winter ;)

Ja beim DOIF ist es alles nochmal anders ... Da darf man unterschiedliche Zeitformate einfach mit einander verrechnen ohne sich Gedanken darüber zu machen.

Gruß Otto
Titel: Antw:Zeitberechnung läuft auf Fehler
Beitrag von: FHEMGerd am 11 August 2020, 23:39:21
Hallo amenomade,

danke für die Tips, aber irgendwo ist dann vermutlich bei mir noch ein Denkfehler.
Also, wenn ich das wie folgt formuliere (hab's mit einer fixen Uhrzeit + Zeitdelta ausprobiert, weil ich sonst immer auf Sonnenuntergang warten müßte, zum Testen. Sunset liefert ja nach meinem Verständnis auch nur eine Uhrzeit):
defmod di_tmrTest DOIF (([23:27]+[($SELF:Zeitdelta)*60])) (set dyAktor ab) DOELSEIF ([00:00])
und Zeitdelta auf 1 (also 1 Minute) steht, dann hätte ich erwartet, dass das DOIF um 23:28 schaltet. Es schaltet aber um 23:27  :(
Die Berechnung funktioniert also zumindest nicht wie gewüncht.

Hallo Otto,

Deine Idee hatte ich auch schon. Hab's so formulieren wollen:
defmod di_tmrEGab DOIF ( (([TimerJalEG] eq "ab") or ([TimerJalEG] eq "aufab"))  and ([{sunset_abs("REAL",(($SELF:Zeitdelta)*60))}] )) (set dyAktor ab) DOELSEIF ([00:00])
Das läuft dann direkt auf diesen Fehler:
error: the function "sunset_abs("REAL",((di_tmrEGab:Zeitdelta)*60))" must return a timespec and not syntax error at (eval 29133) line 1, near "di_tmrEGab:"
Wie hast Du es Dir vorgestellt ?

Grüße, Gerd





Titel: Antw:Zeitberechnung läuft auf Fehler
Beitrag von: Otto123 am 11 August 2020, 23:53:36
Hallo Gerd,

sunset ist eine Perlfunktion, also konsequenterweise in Perl:
{sunset("REAL",ReadingsNum('di_tmrEGab','Zeitdelta',0)*60)}

Und das hier ist immer noch Quark: (([23:27]+[($SELF:Zeitdelta)*60])) siehe #3

Gruß Otto
Titel: Antw:Zeitberechnung läuft auf Fehler
Beitrag von: amenomade am 12 August 2020, 00:52:43
Ja, DOIF (([23:27]+[($SELF:Zeitdelta)*60])) ist auch falsch. Wie schon gesagt, das muss so ausehen:
ZitatDOIF ([(Zeitkalkulation, also hier innerhalb der runden blauen Klammern ZeitX + ZeitY)])

ZeitX = {sunset(blabla)}
ZeitY = Reading Zeitdelta * 60, also [$SELF:Zeitdelta]*60
Titel: Antw:Zeitberechnung läuft auf Fehler
Beitrag von: FHEMGerd am 12 August 2020, 20:23:55
Hallo,
danke für Eure Geduld, hab's hingekriegt, und zwar so:
defmod di_tmrEGab DOIF ( (([TimerJalEG] eq "ab") or ([TimerJalEG] eq "aufab"))  and [([{sunset_abs("REAL")}]+[$SELF:Zeitdelta]*60 )]) (set dyAktor ab) DOELSEIF ([00:00])
Wenn ich den Slider bewege wird der Schaltzeitpunkt im state auch sofort aktualisiert:
attr di_tmrEGab stateFormat {(ReadingsVal("di_tmrEGab","timer_01_c01",""))}
Schon vertrackt, mit den Klammern. Ich dachte, innerhalb der eckigen Klammern darf nur eine Uhrzeit stehen, sowas wie hh:mm. Und wenn man-wie hier-Minuten dazuaddiert, dann müßten die in runde Klammern.
Grüße, Gerd
Titel: Antw:Zeitberechnung läuft auf Fehler
Beitrag von: Damian am 12 August 2020, 20:41:35
es tut´s schon:

[({sunset_abs("REAL")}+[$SELF:Zeitdelta,1]*60 )]
|||                    |
|||                    bedeutet ein Reading mit Rückgabe HH:MM:SS oder Zahl in Sekunden
|||
||bedeutet Perlfunktion mit Rückgabe HH:MM:SS oder Zahl in Sekunden
|bedeutet Rechnung für Timer
bedeutet ein Trigger