DOIF mit Sunrise

Begonnen von abc2006, 10 März 2020, 12:44:29

Vorheriges Thema - Nächstes Thema

abc2006

Hallo zusammen,
ich möchte gerne ein DOIF haben, welches mir in einem bestimmten Zeitraum den Rolladen herunterfährt, rechtzeitig vor dem Sonnenaufgang. Wenn der Sonnenaufgang allerdings nach etwa 7 Uhr ist, dann kann das Rollo gleich oben bleiben und braucht nicht herunterfahren.

Dazu habe ich folgendes DOIF gebaut:

Internals:
   DEF        ([{sunset("HORIZON=-9.0",0,"21:00","23:59")}])
(
set Rolladen_Schlafzimmer open
)
DOELSEIF([{sunrise("HORIZON=-9.0",0,"12:35","12:36")}] && $hour <=12 && $min <=55)
(
##set Rolladen_Schlafzimmer closed,
set alarmbot message DF_Rolladen_Schlafzimmer cmd_2
)
DOELSEIF([$SELF:steuern] eq "long" && [?Rolladen_Schlafzimmer:pct] == 0)
(
set Rolladen_Schlafzimmer open
)
DOELSEIF([$SELF:steuern] eq "long" && [?Rolladen_Schlafzimmer:pct] != 0)
(
set Rolladen_Schlafzimmer closed
)
   FUUID      5d7ab959-f33f-4040-95aa-a8a8daab93c3df7a
   MODEL      FHEM
   NAME       DF_Rolladen_Schlafzimmer
   NOTIFYDEV  global,DF_Rolladen_Schlafzimmer
   NR         535
   NTFY_ORDER 50-DF_Rolladen_Schlafzimmer
   STATE      cmd_2
   TYPE       DOIF
   VERSION    21224 2020-02-18 18:45:49
   READINGS:
     2020-03-10 12:35:00   cmd             2
     2020-03-10 12:35:00   cmd_event       timer_2
     2020-03-10 12:35:00   cmd_nr          2
     2020-03-10 12:33:54   mode            enabled
     2020-03-10 12:35:00   state           cmd_2
     2020-03-10 06:18:10   steuern         long
     2020-03-10 12:33:54   timer_01_c01    10.03.2020 21:00:00
     2020-03-10 12:35:00   timer_02_c02    11.03.2020 12:35:00
   Regex:
     accu:
     cond:
       DF_Rolladen_Schlafzimmer:
         2:
           steuern    ^DF_Rolladen_Schlafzimmer$:^steuern:
         3:
           steuern    ^DF_Rolladen_Schlafzimmer$:^steuern:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)
     1          ::DOIF_time_once($hash,1,$wday) && $hour <=12 && $min <=55
     2          ::ReadingValDoIf($hash,'DF_Rolladen_Schlafzimmer','steuern') eq "long" && ::ReadingValDoIf($hash,'Rolladen_Schlafzimmer','pct') == 0
     3          ::ReadingValDoIf($hash,'DF_Rolladen_Schlafzimmer','steuern') eq "long" && ::ReadingValDoIf($hash,'Rolladen_Schlafzimmer','pct') != 0
   days:
   do:
     0:
       0           set Rolladen_Schlafzimmer open
     1:
       0            set alarmbot message DF_Rolladen_Schlafzimmer cmd_2
     2:
       0           set Rolladen_Schlafzimmer open
     3:
       0           set Rolladen_Schlafzimmer closed
     4:
   helper:
     DEVFILTER  ^global$|^DF_Rolladen_Schlafzimmer$
     NOTIFYDEV  global|DF_Rolladen_Schlafzimmer
     event      timer_2
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   
     timerevent timer_2
     triggerDev
     timerevents:
       timer_2
     timereventsState:
       timer_2
     triggerEvents:
       timer_2
     triggerEventsState:
       timer_2
   interval:
   intervalfunc:
   localtime:
     0          1583870400
     1          1583926500
   readings:
     all         DF_Rolladen_Schlafzimmer:steuern
   realtime:
     0          21:00:00
     1          12:35:00
   time:
     0          {sunset("HORIZON=-9.0",0,"21:00","23:59")}
     1          {sunrise("HORIZON=-9.0",0,"12:35","12:36")}
   timeCond:
     0          0
     1          1
   timer:
     0          0
     1          0
   timers:
     0           0
     1           1
   triggertime:
     1583870400:
       localtime  1583870400
       hash:
     1583926500:
       localtime  1583926500
       hash:
   uiState:
   uiTable:
Attributes:
   do         always
   room       Rolladen,Solar_PV,_doif


Konkret geht es um die Bedingung


DOELSEIF([{sunrise("HORIZON=-9.0",0,"12:35","12:36")}] && $hour <=12 && $min <=55)


Zum testen habe ich die Zeiten mal an aktuelle gegebenheiten angepasst.

Die Bedingung
DOELSEIF([{sunrise("HORIZON=-9.0",0,"12:35","12:36")}] )

funktioniert einwandfrei.
Auch die Variablen $hour und $min geben den erwarteten Wert aus.
Wenn ich allerdings die Abfrage dazu schreibe, dann wird der entsprechende Zweig nicht mehr ausgeführt.
Die Anweisung mit dem Rolladen habe ich bewusst auskommentiert, damit dieser beim testen nicht dauernd hoch und runter fährt.
Was mache ich falsch?
Im Bedingungsteil kann ich doch perl verwenden, also gehe ich davon aus, dass die verwendung der Variablen $hour und $min nicht falsch ist.
Wenn ich die Variablen in ein Reading schreiben lasse, geben sie die erwarteten Zahlen aus.
Wenn ich das DOIF initialisiere, mit sunrise()-Zeiten in der Zukunft, dann werden auch die Trigger entsprechend gesetzt.
Zum entsprechenden Zeitpunkt findet aber keine Aktion statt.

Danke für eure Ideen, und viele Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

teufelchen

Hallo,

hast Du Dir mal das Modul AutoShuttersControl angesehen?

Da kannst Du sehr vieles einstellen.
Raspberry Pi 3
CUL433: V 1.26.05 a-culfw Build: 311 (2018-12-09_19-12-53) CUL433 (F-Band: 433MHz)
freq:433.920MHz bWidth:325KHz rAmpl:42dB sens:4dB
Debmatic mit RPI-RF-MOD

amenomade

Was soll "&& $hour <=12 && $min <=55" bringen, wenn Du sowieso frühestens um 12:35 Uhr und spätestens um 12:36 Uhr triggerst?
Um wieviel Uhr hat est nicht funktioniert, und was hat ein "list" des DOIFs dabei gezeigt?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

abc2006

Hi,

Danke für eure Antworten. AutoShutterControl ist ein bisschen mit Spatzen auf Kanonen geworfen. Aber evtl eine Option.
Wobei mein Wunsch für mich gar nicht so kompliziert klingt.

@amenomade:
ZitatWas soll "&& $hour <=12 && $min <=55" bringen, wenn Du sowieso frühestens um 12:35 Uhr und spätestens um 12:36 Uhr triggerst?
Nichts. Eben deshalb wundert es mich ja, dass es nicht ausgeführt wird.
ZitatZum testen habe ich die Zeiten mal an aktuelle gegebenheiten angepasst.
Der Sinn dahinter ist folgender:
Ich möchte, dass der Rolladen zwischen (im test-Beispiel) 12:35 und 12:36 abhängig vom Sonnenstand herunterfährt, aber *nicht* mehr, wenn die Zeit nach 12:55 ist. Im Beispielfall *kann* dieser Fall nicht eintreten, deshalb müsste das DOIF jedes mal auslösen -> was es nicht tut.

In der Produktivversion ist die config wie folgt:
DOELSEIF([{sunrise("HORIZON=-9.0",0,"04:00","07:01")}] && $hour <=6 && $min <=59)

ZitatUm wieviel Uhr hat est nicht funktioniert, und was hat ein "list" des DOIFs dabei gezeigt?
um 12:36, list siehe mein erster Post.

Danke für deine Mühe,

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

xenos1984

#4
Zitat von: abc2006 am 10 März 2020, 18:58:16DOELSEIF([{sunrise("HORIZON=-9.0",0,"04:00","07:01")}] && $hour <=6 && $min <=59)
Die Minuten dürften immer kleiner oder gleich 59 sein. Der letzte Teil der Bedingung ist also immer wahr und damit überflüssig.

Ansonsten würde ich es wie hier im Beispiel versuchen:
http://fhem.de/commandref_DE.html#DOIF_Kombination_von_Ereignis_und_Zeitsteuerung_mit_logischen_Abfragen

amenomade

Sorry, das "list" hatte ich übersehen.

Also, der hat aber doch um 12:35 getriggert
     2020-03-10 12:35:00   cmd             2
     2020-03-10 12:35:00   cmd_event       timer_2
     2020-03-10 12:35:00   cmd_nr          2
     2020-03-10 12:33:54   mode            enabled
     2020-03-10 12:35:00   state           cmd_2


Ich glaube aber nicht, dass man an der Stelle ## haben darf. Entferne einfach komplett den nicht gewünschten Befehl.
##set Rolladen_Schlafzimmer closed,
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

abc2006

#6
Zitat von: amenomade am 10 März 2020, 19:23:47
Also, der hat aber doch um 12:35 getriggert
     2020-03-10 12:35:00   cmd             2
     2020-03-10 12:35:00   cmd_event       timer_2
     2020-03-10 12:35:00   cmd_nr          2
     2020-03-10 12:33:54   mode            enabled
     2020-03-10 12:35:00   state           cmd_2

Richtig, sieht zumindest im list so aus. Der Befehl wurde aber nicht ausgeführt (keine Meldung im Telegram).
Dieses Verhalten ist in diesem konkreten Fall reproduzierbar.


Zitat
Ich glaube aber nicht, dass man an der Stelle ## haben darf. Entferne einfach komplett den nicht gewünschten Befehl.
##set Rolladen_Schlafzimmer closed,
Zumindest funktioniert es einwandfrei, sobald aus der Bedingung der Teil "&& $min <=55" verschwunden ist, wie xenos1984 vorgeschlagen hat. 
Dann erhalte ich auch die Meldungen im Telegram, egal ob da der Befehl mit ## davor steht oder ob ich ihn raus lösche.
Bleibt die Frage, obs an dem $min liegt. Aber ich hab keine Ahnung, wie ich das testen könnte?

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

abc2006

Zitat von: xenos1984 am 10 März 2020, 19:12:14
Die Minuten dürften immer kleiner oder gleich 59 sein. Der letzte Teil der Bedingung ist also immer wahr und damit überflüssig.
Du hast völlig recht!

Zitat von: xenos1984 am 10 März 2020, 19:12:14
Ansonsten würde ich es wie hier im Beispiel versuchen:
http://fhem.de/commandref_DE.html#DOIF_Kombination_von_Ereignis_und_Zeitsteuerung_mit_logischen_Abfragen
das musste ich dreimal lesen, bis ich es jetzt kapiert habe.
DOELSEIF([{sunrise("HORIZON=-9.0",0,"14:13","14:14")}] && [06:25-15:00])

Macht irgendwie (mehr) Sinn.. Dass ich da nicht drauf gekommen bin...
Unabhängig davon müsste es aber mit $hour und $min auch funktionieren, *gerade weil* minute immer kleiner ist als 59...

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Otto123

Hallo Stephan,

ob Du schon den Perlmodus und normalen Modus verstanden hast - bin ich nicht sicher:
ZitatDas Modul verfügt über zwei Modi: FHEM-Modus und Perl-Modus. Der Modus eines definierten DOIF-Devices wird automatisch aufgrund der Definition vom Modul erkannt (FHEM-Modus beginnt mit einer runden Klammer auf).
https://fhem.de/commandref_DE.html#DOIF_Perl_Modus

Ich habe es jedenfalls nicht verstanden. Aber ich kann mir vorstellen - innerhalb () gehen Perl Variable nicht.
Zitat<Perl-Zeitvariablen>
Variablen für Zeit- und Datumsangaben, $sec, $min, $hour, $mday, $month, $year, $wday, $yday, $isdst, $week, $hms, $hm, $md, $ymd, $we, $twe

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

abc2006

Zitat von: Otto123 am 11 März 2020, 14:23:18
Ich habe es jedenfalls nicht verstanden. Aber ich kann mir vorstellen - innerhalb () gehen Perl Variable nicht.

Moin Otto,
ich würde sagen, innerhalb () geht PERL:

Internals:
   CFGFN     
   DEF       
(ReadingsVal("$SELF","test",99) == 12)
(setreading $SELF test 17)
DOELSE
(setreading $SELF test 88)
   FUUID      5e68f1a4-f33f-4040-8a5d-208ea4925ee2bfec
   MODEL      FHEM
   NAME       DF_test17
   NOTIFYDEV  global
   NR         2586438
   NTFY_ORDER 50-DF_test17
   STATE      cmd_2
   TYPE       DOIF
   VERSION    21224 2020-02-18 18:45:49
   READINGS:
     2020-03-11 15:11:55   cmd             2
     2020-03-11 15:11:55   cmd_event       DF_test17
     2020-03-11 15:11:55   cmd_nr          2
     2020-03-11 15:11:53   mode            enabled
     2020-03-11 15:11:55   state           cmd_2
     2020-03-11 15:11:55   test            88
   Regex:
     accu:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ReadingsVal("DF_test17","test",99) == 12
   do:
     0:
       0          setreading DF_test17 test 17
     1:
       0          setreading DF_test17 test 88
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   
     timerevent
     timerevents
     timereventsState
     triggerDev
     DOIF_eventa:
       cmd_nr: 2
       cmd: 2
       cmd_event: DF_test17
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: DF_test17
       state: cmd_2
   uiState:
   uiTable:
Attributes:


Ich würde sagen, es gehen sogar nicht-fhem-Spezifische Sachen:

Internals:
   CFGFN     
   DEF        (my $var=17; $var == 17)
(setreading $SELF test 17)
DOELSE
(setreading $SELF test 88)
   FUUID      5e68f1a4-f33f-4040-8a5d-208ea4925ee2bfec
   MODEL      FHEM
   NAME       DF_test17
   NOTIFYDEV  global
   NR         2586438
   NTFY_ORDER 50-DF_test17
   STATE      cmd_1
   TYPE       DOIF
   VERSION    21224 2020-02-18 18:45:49
   READINGS:
     2020-03-11 15:13:59   cmd             1
     2020-03-11 15:13:59   cmd_event       DF_test17
     2020-03-11 15:13:59   cmd_nr          1
     2020-03-11 15:13:55   mode            enabled
     2020-03-11 15:13:59   state           cmd_1
     2020-03-11 15:13:59   test            17
   Regex:
     accu:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          my $var=17; $var == 17
   do:
     0:
       0          setreading DF_test17 test 17
     1:
       0          setreading DF_test17 test 88
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   
     timerevent
     timerevents
     timereventsState
     triggerDev
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: DF_test17
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: DF_test17
       state: cmd_1
   uiState:
   uiTable:
Attributes:


Aber: Nein, der Unterschied ist mir nicht klar. Liegt vermutlich daran, dass ich den Perl-Modus noch nicht eingesetzt habe, weil ich keinen Fall habe, von dem ich weiss, dass mir der Perl-Modus einen Vorteil bringt ...
Abgesehen davon funktioniert das DOIF, wenn ich das $min weglasse - das $hour steht dann noch da...

Danke für deinen Hinweis,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Damian

Mal zum Verständnis. Die Bedingung im DOIF FHEM-Modus ist intern auch Perl, da könntest du prinzipiell alles machen, was in Perl geht, da es mit eval ausgewertet wird. Ob es sinnvoll ist, ist eine andere Frage.

Eine Definition:

DOIF (ReadingsVal("$SELF","test",99) == 12) (setreading $SELF test 17)

ist allerdings nicht sinnvoll, da es hier keinen Trigger gibt (Angaben in eckigen Klammern) - setreading würde nie ausgeführt werden.

Der DOIF Perl-Modus kann im Gegensatz zum DOIF FHEM-Modus beliebig viele unabhängige Zweige in einer Definition verwalten, es lassen sich ebenfalls Instanzvariablen nutzen (sie behalten ihren Wert auch bis zum nächsten Trigger) und man kommt weitgehend ohne FHEM-Interpreter aus, der sonst FHEM-Befehle in Perl-Funktionsaufrufe übersetzen muss, was Rechenzeit kostet.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

abc2006

Hi Damian,

danke für deine Aufklärung, da sind tatsächlich interessante features dabei ...

Zitat von: Damian am 11 März 2020, 17:17:04
ist allerdings nicht sinnvoll...

Stimmt. War aber auch nicht die Absicht, mir ist nur nix sinnvolles perliges eingefallen, was ich sonst hätte schreiben können...  Mit checkall wirds geprüft und ausgeführt:)

Hast du eine Idee, warum $min in obiger Konstellation ein Problem verursachen könnte?


Viele Grüße,
Stephan


FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Damian

Zitat von: abc2006 am 11 März 2020, 17:25:34
Hi Damian,

danke für deine Aufklärung, da sind tatsächlich interessante features dabei ...

Stimmt. War aber auch nicht die Absicht, mir ist nur nix sinnvolles perliges eingefallen, was ich sonst hätte schreiben können...  Mit checkall wirds geprüft und ausgeführt:)

Hast du eine Idee, warum $min in obiger Konstellation ein Problem verursachen könnte?


Viele Grüße,
Stephan

Bei mir funktioniert alles wie erwartet:

CFGFN     
   DEF        ([17:53] && $hour <=17 && $min <=55)
   FUUID      5e69161f-f33f-c0d4-6989-689478d16f838566
   MODEL      FHEM
   NAME       time
   NOTIFYDEV  global
   NR         2209
   NTFY_ORDER 50-time
   STATE      cmd_1
   TYPE       DOIF
   VERSION    20929 2020-01-10 09:44:35
   READINGS:
     2020-03-11 17:53:00   cmd             1
     2020-03-11 17:53:00   cmd_event       timer_1
     2020-03-11 17:53:00   cmd_nr          1
     2020-03-11 17:52:35   mode            enabled
     2020-03-11 17:53:00   state           cmd_1
     2020-03-11 17:53:00   timer_01_c01    12.03.2020 17:53:00


sunrise liefert auch nur eine Triggerzeit.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Da fällt mir gerade ein, dass die Abfrage ($hour <=17 && $min <=55) sicherlich nicht das ist, was du erwartest, denn

für z. B. 16:56 ist sie nicht wahr ;)

Nicht umsonst habe ich mir die Zeitintervalle ausgedacht oder die Variable $hm, mit der man sinnvollerweise abfragen kann ($hm lt "17:55"), da ist auch ("16:56" lt "17:55") wahr ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF