FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Feinfinger am 10 Februar 2021, 15:37:56

Titel: DOIF Syntax Uhrzeit
Beitrag von: Feinfinger am 10 Februar 2021, 15:37:56
Hallo zusammen,


Mein DOIF funktioniert seit dem lezten Update nicht mehr korrekt, genauer gesagt, es schaltet, aber der Log wird mit PERL-Error Meldungen vollgeballert.

Das DOIF sieht wie folgt aus:

DOIF ([([{max("16:30","[Balve:ss_weather]")}]+int(rand(30)))] and [?16:30-21:45]) (set Gosund2 on) DOELSEIF ([23:00]) (set Gosund2 off)

So wie es ausschaut, hat DOIF seit neustem Probleme mit der max-Funktion.

Wie muss das DOIF denn nun aussehen, wenn die Beleuchtung zum Sonnenutergang schalten soll, jedoch frühestens um 16:30 Uhr?
Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: Otto123 am 10 Februar 2021, 15:54:58
Zitat von: Feinfinger am 10 Februar 2021, 15:37:56
wenn die Beleuchtung zum Sonnenutergang schalten soll, jedoch frühestens um 16:30 Uhr?
Die Frage kann ich beantworten, den Rest leider nicht. ;)
[{sunset("REAL",0,"16:30")}] https://fhem.de/commandref_DE.html#SUNRISE_EL
Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: Damian am 10 Februar 2021, 16:01:02
Wie ich dir schon geschrieben habe, liegt es an deiner max Funktion, wenn es nicht funktioniert und nicht am DOIF:

Internals:
   CFGFN     
   DEF        ([([{max("16:30","[test:ss_weather]")}]+int(rand(30)))] and [?16:30-21:45]) (set Gosund2 on) DOELSEIF ([23:00]) (set Gosund2 off)
   FUUID      6023f37b-f33f-30f6-ce89-d969fb62cdd8b1f6
   MODEL      FHEM
   NAME       di_max
   NOTIFYDEV  global,test
   NR         130014
   NTFY_ORDER 50-di_max
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2021-02-10 15:55:13   cmd             0
     2021-02-10 15:55:13   mode            enabled
     2021-02-10 15:55:13   state           initialized
     2021-02-10 15:55:49   timer_01_c01    10.02.2021 17:40:14
     2021-02-10 15:55:13   timer_02_c01    10.02.2021 16:30:00
     2021-02-10 15:55:13   timer_03_c01    10.02.2021 21:45:00
     2021-02-10 15:55:13   timer_04_c02    10.02.2021 23:00:00


und

Internals:
   FUUID      5dea4680-f33f-63f4-1b84-51156c05376e279a
   NAME       test
   NR         561
   STATE      ???
   TYPE       dummy
   READINGS:
     2021-02-10 15:55:49   ss_weather      17:40


und es gibt keine Warnungen bei mir im Log!
Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: Feinfinger am 10 Februar 2021, 16:25:22
Zitat von: Damian am 10 Februar 2021, 16:01:02
Wie ich dir schon geschrieben habe, liegt es an deiner max Funktion, wenn es nicht funktioniert und nicht am DOIF:

Ich nutze aber keine selbst erstellte max-Routine, vielleicht habe ich mich da falsch ausgedrückt.

Wie gesagt, bis zum update gestern lief es ja ohne die Fehler.

Wenn ich die Routine "versehentlich" oder "nicht bewusst" von jemandem aus dem Forum übernommen haben sollte, wo müsste ich denn danach suchen?

In der myUtils ist nichts zu finden.


Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: Ellert am 10 Februar 2021, 17:58:03
In der 99_Utils.pm.

Es ist auch möglich, dass ein von Dir verwendetes Modul use List::Util::max exportiert und damit die max-Funktion aus der 99_Utils.pm überschreibt.
Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: rabehd am 10 Februar 2021, 19:04:59
Statt
[([{max("16:30","[Balve:ss_weather]")}]+int(rand(30)))] and [?16:30-21:45]
würde ich
[{sunset_abs("REAL", 300, "16:30","21:30")}-[21:45]]
nehmen
Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: Otto123 am 10 Februar 2021, 19:16:24
@rabehd Da stimmen ein paar Klammern nicht. Und mit seinem Zufalls Plus würde ich es so machen. Wobei ich jetzt nicht weiß woher die 21:30 kommt ;)
Da diese Forderung nicht stand, würde ich die Grenze nach oben weglassen:
defmod d_test DOIF ([{sunset("REAL", int(rand(30)), "16:30")}-21:45]) ()
Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: rabehd am 10 Februar 2021, 19:19:54
Einverstanden.
Ich habe es auch nur als Anregung auf einem meiner DOIF rauskopiert, da hängen noch ein paar Bedingungen dran (Anwesenheit, Party, Alarm...).
Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: Feinfinger am 10 Februar 2021, 19:50:37
Danke für die Hilfe.

Damit kann man als ,,Normalo" auch was anfangen!
Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: Feinfinger am 10 Februar 2021, 19:52:17
Zitat von: Ellert am 10 Februar 2021, 17:58:03
Es ist auch möglich, dass ein von Dir verwendetes Modul use List::Util::max exportiert und damit die max-Funktion aus der 99_Utils.pm überschreibt.

Gibt es einen Weg das herauszufinden?
Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: Otto123 am 10 Februar 2021, 22:24:54
Ich bin mir wegen int(rand(30)) nicht sicher, ob es den gleichen Einfluss hat wie ursprünglich gedacht. Hier ist es ein Offset in Sekunden.
Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: Ellert am 11 Februar 2021, 00:07:22
Zitat von: Feinfinger am 10 Februar 2021, 19:52:17
Gibt es einen Weg das herauszufinden?
In den von Dir verwendeten Modulen, die auch im Update enthalten waren, suchen.
Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: Feinfinger am 11 Februar 2021, 07:39:37
Zitat von: Otto123 am 10 Februar 2021, 22:24:54
Ich bin mir wegen int(rand(30)) nicht sicher, ob es den gleichen Einfluss hat wie ursprünglich gedacht. Hier ist es ein Offset in Sekunden.

Diese 30 Sekunden rühren daher, das ich mit einem zweiten DOIF zur mit dem gleichen Reading (twilight:ss_indoor) eine zweite Lampe schalte. Damit die nicht immer gleichzeitig angehen habe ich mir damit eine "Anwesenheitssimulation-light" gebastelt.

Habe aber nun deinen Lösungsansatz genommen und für mich angepasst.

Damit ich mir jetzt auch noch das zweite DOIF spare, muss ich nur noch ne Möglichkeit finden, den zweiten set Befehl per Zufallstimer innerhalb von 30 Sekunden auszuführen.

defmod d_test DOIF ([{sunset("HORIZON=2.0", "16:30")}-21:45]) (set Lampe1 on) DOELSEIF ([{sunset("HORIZON=2.0", int(rand(30)), "16:30")}-21:45]) (set Lampe2 on) DOELSEIF ([23:00]) (set Lampe1 off,set Lampe2 off) DOELSE

Sollte doch so passen, oder kann man das verschönern?
Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: rabehd am 11 Februar 2021, 08:24:33
Zitatden zweiten set Befehl per Zufallstimer innerhalb von 30 Sekunden auszuführen.
Das sollte mit dem wait-Attribut gehen.
Siehe Beispiel in der comandref.
Titel: Antw:DOIF Syntax Uhrzeit
Beitrag von: Otto123 am 11 Februar 2021, 08:49:37
Moin,

ich weiß nicht wie tolerant sunrise_el mit seinen Parametern ist. Aber ich würde schon wegen der Übersichtlichkeit und dem späterem Verständnis die Verzögerung nicht komplett weglassen sondern auf null setzen:
sunset("HORIZON=2.0",0,"16:30")
Ich habe es zumindest nie probiert den 2. Parameter einfach wegzulassen.

Gruß Otto