Hauptmenü

Zeitberechnung läuft auf Fehler

Begonnen von FHEMGerd, 10 August 2020, 23:02:42

Vorheriges Thema - Nächstes Thema

FHEMGerd

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

amenomade

Zitat([{sunset_abs("REAL")}]+(($SELF:Zeitdelta)*60))
Das ist falsch. Siehe CommandRef https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

FHEMGerd

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 ...

amenomade

#3
($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)] )
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

FHEMGerd

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






Otto123

#6
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

amenomade

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
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

FHEMGerd

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

Damian

#9
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

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF