Hauptmenü

DOIF Syntax Uhrzeit

Begonnen von Feinfinger, 10 Februar 2021, 15:37:56

Vorheriges Thema - Nächstes Thema

Feinfinger

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?
Proxmox VM - MAPLE-CUL - SIGNALDINO

Otto123

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

Damian

#2
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!
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Feinfinger

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.


Proxmox VM - MAPLE-CUL - SIGNALDINO

Ellert

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

rabehd

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
Auch funktionierende Lösungen kann man hinterfragen.

Otto123

#6
@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]) ()
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

rabehd

Einverstanden.
Ich habe es auch nur als Anregung auf einem meiner DOIF rauskopiert, da hängen noch ein paar Bedingungen dran (Anwesenheit, Party, Alarm...).
Auch funktionierende Lösungen kann man hinterfragen.

Feinfinger

Danke für die Hilfe.

Damit kann man als ,,Normalo" auch was anfangen!
Proxmox VM - MAPLE-CUL - SIGNALDINO

Feinfinger

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?
Proxmox VM - MAPLE-CUL - SIGNALDINO

Otto123

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

Ellert

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.

Feinfinger

#12
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?
Proxmox VM - MAPLE-CUL - SIGNALDINO

rabehd

#13
Zitatden zweiten set Befehl per Zufallstimer innerhalb von 30 Sekunden auszuführen.
Das sollte mit dem wait-Attribut gehen.
Siehe Beispiel in der comandref.
Auch funktionierende Lösungen kann man hinterfragen.

Otto123

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