FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Frini am 15 September 2016, 12:37:12

Titel: Hilfe bei Verständnis einzelner DOIF-States. Rolladensteuerung
Beitrag von: Frini am 15 September 2016, 12:37:12
Hallo,
ich bräuchte einmal Eure Hilfe und Eure Meinung zu einem logischen Aufbau eines DOIF.
Ich habe wie in dem anderen Thread ja schon mal vorgestellt meine Rolladensteuerung mit automatischem Öffnen des Rollos bei Türöffnung vorgestellt.
Das ganze hat so lange gut funktioniert, bis meine Frau den Wunsch geäußert hat das Rollo bei geöffneter Tür runterzufahren. Dieses wurde dann immer bei schließen der Tür wieder hochgefahren, da letztes gespeichertes Reading ja up war.
Frage hier. Gibt es eine Möglichkeit hold als Reading zu setzen.
Nach dem ganzen herumprobieren bin ich mir mittlerweile nicht mehr ganz sicher ob ich auf dem richtigen Lösungsweg bin.
Ich hab mir damals überlegt alles in Readings zu packen und nicht mit Dummies zu arbeiten. Was ist die sinnvollere Variante?

Es wäre sehr nett, wenn mal jemand von den DOIF-Profis und andere natürlich auch. Sich einmal meine beiden DOIFs für das Rolle anschauen könnten. Irgendwo hakt es. Ich glaube das Zusammenspiel der einzelnen Stände im Komfort DOIF sind nicht konsistent.

DOIF für Türöffnung mit HM-Drehgriffsensor

define doi.eg.wz.Terrassekomfort DOIF
(([rol.eg.wz.RolladeGartenRechts] ne "up" and [rol.eg.wz.RolladeGartenRechts] >20) and [sen.eg.wz.TerrassentuerRechts] eq "open")
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts up)
DOELSEIF
(([rol.eg.wz.RolladeGartenRechts] eq "down" or [rol.eg.wz.RolladeGartenRechts] >70) and [sen.eg.wz.TerrassentuerRechts] eq "tilted")
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts 70)
DOELSEIF
(([rol.eg.wz.RolladeGartenRechts] ne "up" or [rol.eg.wz.RolladeGartenRechts] ne "0") and ([rol.eg.wz.RolladeGartenRechts:speicher] eq "up" or [rol.eg.wz.RolladeGartenRechts:speicher] eq "0") and [sen.eg.wz.TerrassentuerRechts] eq "closed")
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts])
DOELSEIF
(([rol.eg.wz.RolladeGartenRechs] ne "down" or [rol.eg.wz.RolladeGartenRechts] ne "100") and ([rol.eg.wz.RolladeGartenRechts:speicher] ne "up" or [rol.eg.wz.RolladeGartenRechts:speicher] ne "0") and  [sen.eg.wz.TerrassentuerRechts] eq "closed")
(set rol.eg.wz.RolladeGartenRechts [rol.eg.wz.RolladeGartenRechts:speicher])
DOELSEIF
(([rol.eg.wz.RolladeGartenRechts] eq "up" or [rol.eg.wz.RolladeGartenRechts] eq "0") and [sen.eg.wz.TerrassentuerRechts] eq "open")
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts])
attr doi.eg.wz.Terrassekomfort do allways


Und das DOIF steuert das generelle fahren der Rollos

define doi.eg.wz.RolladeGartenRechts DOIF
([{sunrise("CIVIL",0,"06:00","07:00")}|8])
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="up" up)
DOELSEIF
([{sunset(+600)}|8] and [sen.eg.wz.TerrassentuerRechts:state] eq "closed")
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="down" down)
DOELSEIF
([{sunset(+600)}|8] and [sen.eg.wz.TerrassentuerRechts:state] eq "tilted")
(set rol.eg.wz.RolladeGartenRechts 30, setreading rol.eg.wz.RolladeGartenRechts speicher down)
DOELSEIF
([{sunset(+600)}|8] and [sen.eg.wz.TerrassentuerRechts:state] eq "open")
(setreading rol.eg.wz.RolladeGartenRechts speicher down)
DOELSEIF
([{sunrise("CIVIL",0,"08:00","09:00")}|7])
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="up" up)
DOELSEIF
([{sunset(+1800)}|7] and [sen.eg.wz.TerrassentuerRechts:state] eq "closed")
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="down" down)
DOELSEIF
([{sunset(+1800)}|7] and [sen.eg.wz.TerrassentuerRechts:state] eq "tilted")
(set rol.eg.wz.RolladeGartenRechts 30, setreading rol.eg.wz.RolladeGartenRechts speicher down)
DOELSEIF
([{sunset(+1800)}|7] and [sen.eg.wz.TerrassentuerRechts:state] eq "open")
(setreading rol.eg.wz.RolladeGartenRechts speicher down)
attr doi.eg.wz.RolladeGartenRechts do allways


Es wäre super wenn ich noch einmal ein zwei Meinungen bekommen könnte.

Grüße Matthias
Titel: Antw:Hilfe bei Verständnis einzelner DOIF-States. Rolladensteuerung
Beitrag von: Ellert am 15 September 2016, 19:05:03
Du kannst der Inkonsistenz auf die Spur kommen, in dem Du Dir ein FileLog erstellst und alle beteiligten DOIF und Geräte mit ihren Readings logst.

Wenn Du darauf den unerwünschten Fall nachstellst, kannst Du im Logfile den Auslöser finden und ihn anschliessend unterbinden.

Ausgehend von Deiner Feststellung
ZitatDieses wurde dann immer bei schließen der Tür wieder hochgefahren, da letztes gespeichertes Reading ja up war.
, würde ich sagen Du müsstest das Reading nachziehen, wenn Deine Frau den Rolladen bei geöffneter Tür schliesst.
Das Öffnen des Rolladen beim Schliessen der Tür zu verhindern, wäre eine andere Möglichkeit.
Titel: Antw:Hilfe bei Verständnis einzelner DOIF-States. Rolladensteuerung
Beitrag von: Frini am 28 September 2016, 14:00:40
Ich bin meiner Inkonsequenz schon eine ganze Ecke näher gekommen.
Mir ging es bei meiner Frage eigentlich auch um die logische herangehensweise von DOIFs mit Bezug auf meine beiden DOIFs.
Macht es Sinn Teile in Readings zwischenzuspeichern oder doch lieber in Dummy:States.

Hier mal meine aktuellen DOIFs, welche tatsächlich besser arbeiten als die vorher geschriebenen. Tatsächlich hatte ich auch Fehler bei den Zuständen der Aktoren down = 0, up = 100.

Rollo fahren bei Türöffnung. Mit Berücksichtigung des fahrens des manuellen fahrens der geöffneten Tür.
define doi.eg.wz.RolladeGartenRechtsKomfort DOIF
([sen.eg.wz.TerrassentuerRechts] eq "open" and ([?rol.eg.wz.RolladeGartenRechts] eq "up" or [?rol.eg.wz.RolladeGartenRechts] > 81))
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts])
DOELSEIF
([sen.eg.wz.TerrassentuerRechts] eq "open" and ([?rol.eg.wz.RolladeGartenRechts] eq "down" or [?rol.eg.wz.RolladeGartenRechts] < 80))
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts up, set dum.eg.wz.RolladeGartenRechtsPos up)
DOELSEIF
([sen.eg.wz.TerrassentuerRechts] eq "tilted" and ([?rol.eg.wz.RolladeGartenRechts] eq "down" or [?rol.eg.wz.RolladeGartenRechts] < 30))
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts 30, set dum.eg.wz.RolladeGartenRechtsPos 30)
DOELSEIF
([sen.eg.wz.TerrassentuerRechts] eq "tilted" and ([?rol.eg.wz.RolladeGartenRechts] eq "up" or [?rol.eg.wz.RolladeGartenRechts] > 31))
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts])
DOELSEIF
([sen.eg.wz.TerrassentuerRechts] eq "closed" and ([?rol.eg.wz.RolladeGartenRechts] eq "up" or [?rol.eg.wz.RolladeGartenRechts] eq "100") and [?rol.eg.wz.RolladeGartenRechts:speicher] ne "up")
(set rol.eg.wz.RolladeGartenRechts [rol.eg.wz.RolladeGartenRechts:speicher], set dum.eg.wz.RolladeGartenRechtsPos [rol.eg.wz.RolladeGartenRechts:speicher])
DOELSEIF
([sen.eg.wz.TerrassentuerRechts] eq "closed" and ([?rol.eg.wz.RolladeGartenRechts] ne "up" or [?rol.eg.wz.RolladeGartenRechts] ne "100" or [?rol.eg.wz.RolladeGartenRechts] ne "30" or [?rol.eg.wz.RolladeGartenRechts] ne "80") and ([?rol.eg.wz.RolladeGartenRechts:speicher] eq "up" or [?rol.eg.wz.RolladeGartenRechts:speicher] eq "100"))
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts])

attr doi.eg.wz.RolladeGartenRechtsKomfort do allways


Generelles Fahren der Rollos.

define doi.eg.wz.RolladeGartenRechtsAstro DOIF
([{sunrise("CIVIL",0,"06:00","07:00")}|8])
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="up" up, set dum.RolloZustand Tag, set dum.eg.wz.RolladeGartenRechtsPos up)
DOELSEIF
([{sunset(+600)}|8] and [sen.eg.wz.TerrassentuerRechts:state] eq "closed")
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="down" down, set dum.RolloZustand Nacht, set dum.eg.wz.RolladeGartenRechtsPos down)
DOELSEIF
([{sunset(+600)}|8] and [sen.eg.wz.TerrassentuerRechts:state] eq "tilted")
(set rol.eg.wz.RolladeGartenRechts 30, setreading rol.eg.wz.RolladeGartenRechts speicher down, set dum.RolloZustand Nacht, set dum.eg.wz.RolladeGartenRechtsPos 30)
DOELSEIF
([{sunset(+600)}|8] and [sen.eg.wz.TerrassentuerRechts:state] eq "open")
(setreading rol.eg.wz.RolladeGartenRechts speicher down, set dum.RolloZustand Nacht)
DOELSEIF
([{sunrise("CIVIL",0,"08:00","09:00")}|7])
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="up" up, set dum.RolloZustand Tag, set dum.eg.wz.RolladeGartenRechtsPos up)
DOELSEIF
([{sunset(+1800)}|7] and [sen.eg.wz.TerrassentuerRechts:state] eq "closed")
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="down" down, set dum.RolloZustand Nacht, set dum.eg.wz.RolladeGartenRechtsPos down)
DOELSEIF
([{sunset(+1800)}|7] and [sen.eg.wz.TerrassentuerRechts:state] eq "tilted")
(set rol.eg.wz.RolladeGartenRechts 30, setreading rol.eg.wz.RolladeGartenRechts speicher down, set dum.RolloZustand Nacht, set dum.eg.wz.RolladeGartenRechtsPos 30)
DOELSEIF
([{sunset(+1800)}|7] and [sen.eg.wz.TerrassentuerRechts:state] eq "open")
(setreading rol.eg.wz.RolladeGartenRechts speicher down, set dum.RolloZustand Nacht)

attr doi.eg.wz.RolladeGartenRechtsAstro do allways


Hier meine Hilfsmodelle:

define doi.eg.wz.RolloAutomatik DOIF
([rol.eg.wz.RolladeGartenRechts:state] ne [?dum.eg.wz.RolladeGartenRechtsPos:state])
set dum.eg.wz.RolloAutomatik Manuell)
DOELSE
(set dum.eg.wz.RolloAutomatik Automatik)


Abfrage ob Tag oder Nacht. Notwendig für Sonnenschutzsteuerung

define dum.RolloZustand dummy
attr webcmd Nacht:Tag




define dum.eg.wz.RolloAutomatik dummy
attr dum.eg.wz.RolloAutomatik webcmd Automatik:Manuell



define dum.eg.wz.RolladeGartenRechtsPos dummy


Und zu guter letz meine Sonnenschutzsteuerung:

define doi.eg.SonnenschutzBack
([MeinWetter:temp_c] > 19 and [?myTwilight:azimuth] > 220 and [?myTwilight:azimuth] < 290 and [?sen.eg.wz.TerrassentuerRechts] eq "closed" and ([?rol.eg.wz.RolladeGartenRechts] eq "up" or [?rol.eg.wz.RolladeGartenRechts] > 71))
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="70" 70, set dum.eg.wz.RolladeGartenRechtsPos 70, set rol.eg.wz.RolladeGartenLinks:FILTER=STATE!="70" 70)

DOELSEIF
([MeinWetter:temp_c] > 19 and [?myTwilight:azimuth] > 220 and [?myTwilight:azimuth] < 290 and [?sen.eg.wz.TerrassentuerRechts] eq "tilted" and ([?rol.eg.wz.RolladeGartenRechts] eq "up" or [?rol.eg.wz.RolladeGartenRechts] > 71))
(setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts], set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="70" 70, set dum.eg.wz.RolladeGartenRechtsPos 70,  set rol.eg.wz.RolladeGartenLinks:FILTER=STATE!="70" 70)

DOELSEIF
([MeinWetter:temp_c] > 19 and [?myTwilight:azimuth] > 220 and [?myTwilight:azimuth] < 290 and [?sen.eg.wz.TerrassentuerRechts] eq "open" and ([?rol.eg.wz.RolladeGartenRechts] eq "up" or [?rol.eg.wz.RolladeGartenRechts] > 81))
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="80" 80, setreading rol.eg.wz.RolladeGartenRechts speicher [rol.eg.wz.RolladeGartenRechts], set dum.eg.wz.RolladeGartenRechtsPos 80,  set rol.eg.wz.RolladeGartenLinks:FILTER=STATE!="80" 80)

DOELSEIF
([MeinWetter:temp_c] < 19 and [?myTwilight:azimuth] > 220 or [?myTwilight:azimuth] < 290 and [?sen.eg.wz.TerrassentuerRechts] ne "aa" and [?dum.eg.wz.RolloAutomatik] eq "Automatik")
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="up" up, set dum.eg.wz.RolladeGartenRechtsPos up,  set rol.eg.wz.RolladeGartenLinks:FILTER=STATE!="up" up)

DOELSEIF
([MeinWetter:temp_c] < 19 and [?sen.eg.wz.TerrassentuerRechts] ne "aa" and [?rol.eg.wz.RolladeGartenRechts] > 69 and d[?dum.RolloZustand] eq "Tag" and [?dum.eg.wz.RolloAutomatik] eq "Automatik")
(set rol.eg.wz.RolladeGartenRechts:FILTER=STATE!="up" up, set dum.eg.wz.RolladeGartenRechtsPos up,  set rol.eg.wz.RolladeGartenLinks:FILTER=STATE!="up" up)

attr doi.eg.wz.Sonnenschutz do allways

Titel: Antw:Hilfe bei Verständnis einzelner DOIF-States. Rolladensteuerung
Beitrag von: Ellert am 28 September 2016, 15:10:56
ZitatMacht es Sinn Teile in Readings zwischenzuspeichern oder doch lieber in Dummy:States.

Wenn Du die Readings in Readings eines Dummys oder im Rolladengerät speicherst, dann bleiben Sie bei der Änderung des DOIF und beim Neustart von FHEM erhalten.
Wenn Du die Readings in Readings des DOIF speicherst, gehen sie beim Ändern und Neustart verloren.

Solange das Zwischenspeichern der Readings im Rolladengerät nicht zu unerwünschtem Auslösen führt, das nicht mit CheckReadingsEvent und/oder addStateEvent zu beheben ist, halte ich es für Geschmackssache.