[gelöst] Probleme mit mehreren Bedingungen im DOIF (Rollosteuerung)

Begonnen von DonJuan, 18 Juni 2019, 22:52:10

Vorheriges Thema - Nächstes Thema

DonJuan

Moin Zusammen,

ich versuche grade meine Rollos (Siro) zu automatisieren.
Sie sollen zwischen Sonnenaufgang und Sonnenuntergang aufgehen, wenn die Sonnen nicht zwischen 80° und 200° steht und nicht in einer Höhe über 20°.

([{sunrise(0,"04:00","09:00")}]-[{sunset(0,"16:00","22:00")}]) -> funktioniert
([twilight:azimuth] < 80 and [twilight:azimuth] > 200) -> funktioniert auch
([twilight:elevation] > 20) -> funktioniert auch.

Aber wenn ich es dann kombiniere, funktioniert es nur teilweise oder gar nicht.

(([{sunrise(0,"04:00","09:00)}]-[{sunset(0,"16:00","22:00")}])
&& ([twilight:azimuth] < 80 or [twilight:azimuth] > 200)
&& ([twilight:elevation] < 20))
(set Rollos open)
DOELSE
(set Rollos close)

Funktionierte bisher am ehesten. Die Rollos gingen auf, bis die Sonne ihre Position erreicht hatte. Aber Nachmittags, wenn die Sonne über 200° steht, fuhren die Rollos nicht hoch, da ja [twilight:elevation] > 20 war.

Ich habe dann versucht, mit verschiedenen Klammersetzungen und Zusammenstellungen mehr Erfolg zu haben, aber das brachte mich alles nicht weiter.
Auch das Auslagern in die myUtils brachte mich nicht vorran, weil ich nicht weiss, wie man dort sunset/sunrise abfragt.

Vielleicht bin ich ja auch mit dem DOIF völlig Falsch unterwegs.

Wenn jemand da eine Idee hat, gerne her damit.

Gruss Dennis

Edit: Schreibfehler behoben

amenomade

Zitat[twilight:azimuth] < 80 and [twilight:azimuth] > 200
Wie soll das selbe Reading gleichzeitig kleiner als 80 und auch grösser als 200 sein??

Das "nicht zwischen 80 und 200" heisst
Zitat[twilight:azimuth] < 80 or [twilight:azimuth] > 200
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

CoolTux

Zitat von: DonJuan am 18 Juni 2019, 22:52:10
Moin Zusammen,

ich versuche grade meine Rollos (Siro) zu automatisieren.
Sie sollen zwischen Sonnenaufgang und Sonnenuntergang aufgehen, wenn die Sonnen nicht zwischen 80° und 200° steht und nicht in einer Höhe über 20°.

([{sunrise(0,"04:00","09:00)}]-[{sunset(0,"16:00","22:00")}]) -> funktioniert
([twilight:azimuth] < 80 and [twilight:azimuth] > 200) -> funktioniert auch
([twilight:elevation] > 20) -> funktioniert auch.

Aber wenn ich es dann kombiniere, funktioniert es nur teilweise oder gar nicht.

(([{sunrise(0,"04:00","09:00)}]-[{sunset(0,"16:00","22:00")}])
&& ([twilight:azimuth] < 80 and [twilight:azimuth] > 200)
&& ([twilight:elevation] < 20))
(set Rollos open)
DOELSE
(set Rollos close)

Funktionierte bisher am ehesten. Die Rollos gingen auf, bis die Sonne ihre Position erreicht hatte. Aber Nachmittags, wenn die Sonne über 200° steht, fuhren die Rollos nicht hoch, da ja [twilight:elevation] > 200 war.

Ich habe dann versucht, mit verschiedenen Klammersetzungen und Zusammenstellungen mehr Erfolg zu haben, aber das brachte mich alles nicht weiter.
Auch das Auslagern in die myUtils brachte mich nicht vorran, weil ich nicht weiss, wie man dort sunset/sunrise abfragt.

Vielleicht bin ich ja auch mit dem DOIF völlig Falsch unterwegs.

Wenn jemand da eine Idee hat, gerne her damit.

Gruss Dennis

Du kannst das AutoShuttersControl Modul dafür verwenden. Habe auch Siros bei mir in Verwendung.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

DonJuan

Zitat von: amenomade am 18 Juni 2019, 23:03:22
Wie soll das selbe Reading gleichzeitig kleiner als 80 und auch grösser als 200 sein??

Das "nicht zwischen 80 und 200" heisst

Da hab ich vertippt. Das "or" ist im Original-Text drin.

Danke

DonJuan

Zitat von: CoolTux am 18 Juni 2019, 23:07:10
Du kannst das AutoShuttersControl Modul dafür verwenden. Habe auch Siros bei mir in Verwendung.


Grüße

Das AutoShuttersControl habe ich mir angeguckt und auch versucht zu nutzen. Aber das will mir einfach zu viele Dinge haben, die ich nicht nutze. So muss ich z. B. ein Device haben, welches mir einen Helligkeitswert liefert.
Jedenfalls habe ich es nicht zum Laufen bekommen.

Gruss Dennis

CoolTux

Hallo Dennis,

Wenn Du Beschattung haben willst benötigst Du in der Tat einen Helligkeitssensor.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

amenomade

#6
Zitat von: DonJuan am 19 Juni 2019, 06:36:22
Da hab ich vertippt. Das "or" ist im Original-Text drin.

Danke
Deswegen wäre es besser, ein vollständiges "list" vom DOIF zu posten. Am besten, wenn er im deiner Meinung nach falschen Zustand ist.

Zitatda ja [twilight:elevation] > 200 war.

Wie kann denn die Elevation grösser als 200 sein???
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

DonJuan

Zitat von: amenomade am 19 Juni 2019, 08:15:01
Deswegen wäre es besser, ein vollständiges "list" vom DOIF zu posten. Am besten, wenn er im deiner Meinung nach falschen Zustand ist.

Wie kann denn die Elevation grösser als 200 sein???

Das war wieder ein Schreibfehler. Sollte eine 20 sein. Manchmal sind die kleinen Fingerchen aber auch einfach zu schnell.

DonJuan

So, hier das List von meinem DOIF (ich hoffe, dass ist so richtig)

Das Rollo sollte jetzt aufgehen, da ja [twilight:azimuth] > 200 (wirklich 200) ist. Macht es aber nicht, weil [twilight:elevation] nicht kleiner 20 ist.

Elevation ist für mich halt wichtig, damit das Rollo morgens ein paar Stunden offen ist und nur zufährt, wenn die Sonne tatsächlich über die Bäume in mein Zimmer guckt.

Gruss Dennis

Internals:
   CFGFN     
   DEF        (([{sunrise(0,"04:00","09:00")}]-[{sunset(0,"16:00","22:00")}])
&& ([twilight:azimuth] < 80 or [twilight:azimuth] > 200)
&& ([twilight:elevation] < 20))
(set Rollo_2 open)
DOELSE
(set Rollo_2 close)
   FUUID      5d0888e4-f33f-74de-5952-fb5272985599bb02
   MODEL      FHEM
   NAME       RolloSteuerung
   NR         380
   NTFY_ORDER 50-RolloSteuerung
   STATE      cmd_2
   TYPE       DOIF
   VERSION    19303 2019-05-01 08:47:16
   Helper:
     DBLOG:
       cmd:
         logdb:
           TIME       1560948213.58072
           VALUE      2
       cmd_event:
         logdb:
           TIME       1560948213.58072
           VALUE      RolloSteuerung
       cmd_nr:
         logdb:
           TIME       1560948213.58072
           VALUE      2
       cmd_seqnr:
         logdb:
           TIME       1560909603.35533
           VALUE      3
       mode:
         logdb:
           TIME       1560948210.2295
           VALUE      enabled
       state:
         logdb:
           TIME       1560948213.58072
           VALUE      cmd_2
   READINGS:
     2019-06-19 14:43:33   cmd             2
     2019-06-19 14:43:33   cmd_event       RolloSteuerung
     2019-06-19 14:43:33   cmd_nr          2
     2019-06-19 14:43:30   mode            enabled
     2019-06-19 14:43:33   state           cmd_2
     2019-06-19 14:43:30   timer_01_c01    20.06.2019 04:00:00
     2019-06-19 14:43:30   timer_02_c01    19.06.2019 22:00:00
   Regex:
     accu:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          (::DOIF_time_once($hash,0,$wday)-::DOIF_time_once($hash,1,$wday)) && (::ReadingValDoIf($hash,'twilight','azimuth') < 80 or ::ReadingValDoIf($hash,'twilight','azimuth') > 200) && (::ReadingValDoIf($hash,'twilight','elevation') < 20)
   days:
   devices:
     0           twilight
     all         twilight
   do:
     0:
       0          set Rollo_2 open
     1:
       0          set Rollo_2 close
   helper:
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   
     timerevent
     timerevents
     timereventsState
     triggerDev
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: RolloSteuerung
       state: cmd_2
   internals:
   intervalfunc:
   itimer:
   localtime:
     0          1560996000
     1          1560974400
   readings:
     0           twilight:azimuth twilight:elevation
     all         twilight:azimuth twilight:elevation
   realtime:
     0          04:00:00
     1          22:00:00
   time:
     0          {sunrise(0,"04:00","09:00")}
     1          {sunset(0,"16:00","22:00")}
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   triggertime:
     1560974400:
       localtime  1560974400
       hash:
     1560996000:
       localtime  1560996000
       hash:
   uiState:
   uiTable:
Attributes:
   room       Beschattung

amenomade

#9
Also.... Mir ist nicht ganz klar, was Du erreichen willst, und was nicht funktioniert, da Du dich von einem Satz zum anderen "vertippst"

So wie dein DOIF aussieht:
- wenn zwischen sunrise und sunset, und azimuth nicht zwischen 80 und 200, und elevation < 20 ist er auf
- in allen anderen Fälle ist er zu

Im Moment, elevation > 20, dann geht er nicht auf. Was ist denn das Problem?

Wenn ich versuche zu verstehen, was Du gesagt hast: Du möchtest, dass es morgens aufgeht, dann wenn die Elevation >20 wieder zugeht, dann wenn azimuth >200  wieder aufgeht, unabhängig von der Elevation? Ist das richtig ?

Wenn ja, dann musst Du es in mehrere DOIF/DOELSEIF Zweigen verteilen


(
[{sunrise(0,"04:00","09:00")}]-[{sunset(0,"16:00","22:00")}]                       #Beschattung wenn Sonne hoch und direkt im Fenster
and [twilight:elevation] > 20                                                      #Da könnte man sich wahrscheinlich die Zeit Bedingung sparen
and [twilight:azimuth] > 80 and [twilight:azimuth] < 200
)   
     (set Rollo_2 60%)
DOELSEIF (
[{sunrise(0,"04:00","09:00")}]-[{sunset(0,"16:00","22:00")}]                       #Open wenn am Tag Sonne niedrig oder nicht im Fenster
and ([twilight:elevation] < 20 or [twilight:azimuth] < 80 or [twilight:azimuth] > 200
)
    (set Rollo_2 open)
DOELSE                                                                             # Nachts zu
    (set Rollo_2 close)


Da deine Position für "Beschattung" eigentlich "zu" ist, kann man das kürzen:
([{sunrise(0,"04:00","09:00")}]-[{sunset(0,"16:00","22:00")}] and
  (
  [twilight:elevation] < 20
  or [twilight:azimuth] < 80
  or [twilight:azimuth] > 200
  )
)
  (set Rollo_2 open)
DOELSE
  (set Rollo_2 close)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

DonJuan

Zitat von: amenomade am 19 Juni 2019, 18:42:08
Also.... Mir ist nicht ganz klar, was Du erreichen willst, und was nicht funktioniert, da Du dich von einem Satz zum anderen "vertippst"

So wie dein DOIF aussieht:
- wenn zwischen sunrise und sunset, und azimuth nicht zwischen 80 und 200, und elevation < 20 ist er auf
- in allen anderen Fälle ist er zu

Im Moment, elevation > 20, dann geht er nicht auf. Was ist denn das Problem?

Wenn ich versuche zu verstehen, was Du gesagt hast: Du möchtest, dass es morgens aufgeht, dann wenn die Elevation >20 wieder zugeht, dann wenn azimuth >200  wieder aufgeht, unabhängig von der Elevation? Ist das richtig ?

Wenn ja, dann musst Du es in mehrere DOIF/DOELSEIF Zweigen verteilen


(
[{sunrise(0,"04:00","09:00")}]-[{sunset(0,"16:00","22:00")}]                       #Beschattung wenn Sonne hoch und direkt im Fenster
and [twilight:elevation] > 20                                                      #Da könnte man sich wahrscheinlich die Zeit Bedingung sparen
and [twilight:azimuth] > 80 and [twilight:azimuth] < 200
)   
     (set Rollo_2 60%)
DOELSEIF (
[{sunrise(0,"04:00","09:00")}]-[{sunset(0,"16:00","22:00")}]                       #Open wenn am Tag Sonne niedrig oder nicht im Fenster
and ([twilight:elevation] < 20 or [twilight:azimuth] < 80 or [twilight:azimuth] > 200
)
    (set Rollo_2 open)
DOELSE                                                                             # Nachts zu
    (set Rollo_2 close)


Da deine Position für "Beschattung" eigentlich "zu" ist, kann man das kürzen:
([{sunrise(0,"04:00","09:00")}]-[{sunset(0,"16:00","22:00")}] and
  (
  [twilight:elevation] < 20
  or [twilight:azimuth] < 80
  or [twilight:azimuth] > 200
  )
)
  (set Rollo_2 open)
DOELSE
  (set Rollo_2 close)

Ja, bitte entschuldige, dass ich mich gelegentlich vertippe.

Aber im großen und ganzen hast du es richtig verstanden. Danke dafür.

Ich versuche es nochmal verständlich zu Formulieren. Aber dein Ansatz gefällt mir soweit.

Zwischen Sonnenaufgang und Sonnenuntergang und Azimuth zwischen 80 und 200 und Elevation > 20 soll das Rollo geschlossen sein.
Wenn nun Azimuth > 200 ist, soll egal welchen wert Elevation hat, das Rollo auffahren.
Zum Sonnenuntergang soll es wieder zu fahren.

Und ich entdecke meinen nächsten Fehler: Mit beschatten meinte ich halt, dass das Rollo auf oder zu ist. Nicht Prozentweise schliesst und öffnet.

Ich werden deinen Zweiten Vorschlag mal testen. So hatte ich das noch nicht versucht.

Gruss Dennis

DonJuan

Guten Morgen,

einmal hat der Code von amenomade richtig funktioniert. Danach irgendwie nicht mehr. Heute morgen z. B. müsste das Rollo eigentlich offen sein. Es ist aber geschlossen geblieben. Leider sehe ich nicht warum.

Gruss Dennis


Internals:
   CFGFN     
   DEF        ([{sunrise(0,"04:00","09:00")}]-[{sunset(0,"16:00","22:00")}]
and ([twilight:elevation] < 20
or [twilight:azimuth] < 80   
or [twilight:azimuth] > 200))   
(set Rollo_2 open) (set Rollo_3 open) (set Rollo_4 open)
DOELSE
(set Rollo_2 close) (set Rollo_3 close) (set Rollo_4 close)
   FUUID      5d0a7b11-f33f-74de-98dc-967c966d7bdc5f08
   MODEL      FHEM
   NAME       RolloTest
   NR         1184
   NTFY_ORDER 50-RolloTest
   STATE      cmd_2
   TYPE       DOIF
   VERSION    19303 2019-05-01 08:47:16
   Helper:
     DBLOG:
       cmd:
         logdb:
           TIME       1561088367.67067
           VALUE      2.3
       cmd_event:
         logdb:
           TIME       1561088367.67067
           VALUE      twilight
       cmd_nr:
         logdb:
           TIME       1561088367.67067
           VALUE      2
       cmd_seqnr:
         logdb:
           TIME       1561088367.67067
           VALUE      3
       error:
         logdb:
           TIME       1561025109.78502
           VALUE      condition c01
       last_cmd:
         logdb:
           TIME       1561029447.84528
           VALUE      cmd_2
       mode:
         logdb:
           TIME       1561088140.23801
           VALUE      enabled
       state:
         logdb:
           TIME       1561088367.67067
           VALUE      cmd_2
   READINGS:
     2019-06-21 05:49:27   Device          twilight
     2019-06-21 05:39:27   cmd             2.3
     2019-06-21 05:39:27   cmd_event       twilight
     2019-06-21 05:39:27   cmd_nr          2
     2019-06-21 05:39:27   cmd_seqnr       3
     2019-06-21 05:49:27   e_twilight_azimuth 57.62
     2019-06-21 05:49:27   e_twilight_elevation 5.67
     2019-06-21 05:35:40   mode            enabled
     2019-06-21 05:39:27   state           cmd_2
     2019-06-21 05:35:40   timer_01_c01    22.06.2019 04:00:00
     2019-06-21 05:35:40   timer_02_c01    21.06.2019 22:00:00
   Regex:
     accu:
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday)-::DOIF_time_once($hash,1,$wday)  and (::ReadingValDoIf($hash,'twilight','elevation') < 20  or ::ReadingValDoIf($hash,'twilight','azimuth') < 80    or ::ReadingValDoIf($hash,'twilight','azimuth') > 200)
   days:
   devices:
     0           twilight
     all         twilight
   do:
     0:
       0          set Rollo_2 open
       1          set Rollo_3 open
       2          set Rollo_4 open
     1:
       0          set Rollo_2 close
       1          set Rollo_3 close
       2          set Rollo_4 close
   helper:
     event      azimuth: 57.62,elevation: 5.67,twilight: 98.1,twilight_weather: 79.1,compasspoint: northeast
     globalinit 1
     last_timer 2
     sleeptimer -1
     timerdev   twilight
     timerevent azimuth: 57.62,elevation: 5.67,twilight: 98.1,twilight_weather: 79.1,compasspoint: northeast
     triggerDev twilight
     DOIF_eventas:
       cmd_nr: 2
       cmd_seqnr: 3
       cmd_event: twilight
       state: cmd_2
     timerevents:
       azimuth: 57.62
       elevation: 5.67
       twilight: 98.1
       twilight_weather: 79.1
       compasspoint: northeast
     timereventsState:
       azimuth: 57.62
       elevation: 5.67
       twilight: 98.1
       twilight_weather: 79.1
       compasspoint: northeast
     triggerEvents:
       azimuth: 57.62
       elevation: 5.67
       twilight: 98.1
       twilight_weather: 79.1
       compasspoint: northeast
     triggerEventsState:
       azimuth: 57.62
       elevation: 5.67
       twilight: 98.1
       twilight_weather: 79.1
       compasspoint: northeast
   internals:
   intervalfunc:
   itimer:
   localtime:
     0          1561168800
     1          1561147200
   readings:
     0           twilight:elevation twilight:azimuth
     all         twilight:elevation twilight:azimuth
   realtime:
     0          04:00:00
     1          22:00:00
   time:
     0          {sunrise(0,"04:00","09:00")}
     1          {sunset(0,"16:00","22:00")}
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   trigger:
   triggertime:
     1561147200:
       localtime  1561147200
       hash:
     1561168800:
       localtime  1561168800
       hash:
   uiState:
   uiTable:
Attributes:
   room       Beschattung

amenomade

Dein DOIF ist ok. Man sieht nicht mehr, was um 05:39:27 geschaltet hat. Hast Du eine Log ?

Ausserdem hast Du den irgendwann disabled / enabled ?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Damian

Das Zeitintervall ist falsch angegeben:

([{sunrise(0,"04:00","09:00")}]-[{sunset(0,"16:00","22:00")}]

hier wurden zwei einzelne Zeittrigger definiert,die voneinander abgezogen werden ;)


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

amenomade

Yes!
Das hatte ich mitten unten allen möglichen Klammern übersehen!
Damian ist der beste ;)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus