Autor Thema: DOIF mit Sunrise  (Gelesen 433 mal)

Offline abc2006

  • Sr. Member
  • ****
  • Beiträge: 905
DOIF mit Sunrise
« am: 10 März 2020, 12:44:29 »
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

Offline teufelchen

  • Full Member
  • ***
  • Beiträge: 104
Antw:DOIF mit Sunrise
« Antwort #1 am: 10 März 2020, 12:48:26 »
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

Offline amenomade

  • Developer
  • Hero Member
  • ****
  • Beiträge: 5599
Antw:DOIF mit Sunrise
« Antwort #2 am: 10 März 2020, 18:35:29 »
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?
FHEM 5.9 Pi 3, EchoDot, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Offline abc2006

  • Sr. Member
  • ****
  • Beiträge: 905
Antw:DOIF mit Sunrise
« Antwort #3 am: 10 März 2020, 18:58:16 »
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:
Zitat
Was 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.
Zitat
Zum 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)
Zitat
Um 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

Offline xenos1984

  • Full Member
  • ***
  • Beiträge: 145
Antw:DOIF mit Sunrise
« Antwort #4 am: 10 März 2020, 19:12:14 »
DOELSEIF([{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
« Letzte Änderung: 10 März 2020, 19:14:08 von xenos1984 »

Offline amenomade

  • Developer
  • Hero Member
  • ****
  • Beiträge: 5599
Antw:DOIF mit Sunrise
« Antwort #5 am: 10 März 2020, 19:23:47 »
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,
FHEM 5.9 Pi 3, EchoDot, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Offline abc2006

  • Sr. Member
  • ****
  • Beiträge: 905
Antw:DOIF mit Sunrise
« Antwort #6 am: 11 März 2020, 14:10:20 »
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
« Letzte Änderung: 11 März 2020, 14:12:26 von abc2006 »
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Offline abc2006

  • Sr. Member
  • ****
  • Beiträge: 905
Antw:DOIF mit Sunrise
« Antwort #7 am: 11 März 2020, 14:15:31 »
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!

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

Offline Otto123

  • Hero Member
  • *****
  • Beiträge: 15690
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:DOIF mit Sunrise
« Antwort #8 am: 11 März 2020, 14:23:18 »
Hallo Stephan,

ob Du schon den Perlmodus und normalen Modus verstanden hast - bin ich nicht sicher:
Zitat
Das 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
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266

Offline abc2006

  • Sr. Member
  • ****
  • Beiträge: 905
Antw:DOIF mit Sunrise
« Antwort #9 am: 11 März 2020, 15:17:54 »
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

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 7252
Antw:DOIF mit Sunrise
« Antwort #10 am: 11 März 2020, 17:17:04 »
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-Web, THRESHOLD, FHEM-Befehl: IF

Offline abc2006

  • Sr. Member
  • ****
  • Beiträge: 905
Antw:DOIF mit Sunrise
« Antwort #11 am: 11 März 2020, 17:25:34 »
Hi Damian,

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

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

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 7252
Antw:DOIF mit Sunrise
« Antwort #12 am: 11 März 2020, 17:54:39 »
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-Web, THRESHOLD, FHEM-Befehl: IF

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 7252
Antw:DOIF mit Sunrise
« Antwort #13 am: 11 März 2020, 19:41:00 »
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-Web, THRESHOLD, FHEM-Befehl: IF