Fensterkontakt in Rolladensteuerung integrieren?

Begonnen von MichaelO, 30 Oktober 2015, 15:40:44

Vorheriges Thema - Nächstes Thema

MichaelO

Moin,

ich bräuchte bitte einen Denkanstoß bzgl. der Integration eines Fensterkontakts in eine bestehende Rolladensteuerung zwecks Lüftung.

Derzeit läuft über ein etwas größeres DOIF - DOELSEIF meine Rolladensteuerung an einem Fenster (die Position wird jeweils absolut angegeben als Zahl). Das funktioniert. Ich habe nun an diesem Fenster einen optischen Fensterkontakt installiert. Dieser funktioniert ebenfalls. Eine einfache Reaktion "Fenster auf" - "Rollo rauf" und umgekehrt bekomme ich auch hin (bis auf, dass es immer runter fährt, wenn das Fenster zu geht).

Ich möchte folgendes erreichen, habe aber keine Idee, wie ich das umsetzen soll. Wenn ich das Fenster öffne (im Regelfall zum Lüften), dann soll das Rollo ganz rauf (position 0). Mache ich das Fenster wieder zu, soll das Rollo dahin fahren, wo es vor dem Öffnen stand ... und jetzt klemmt es:

Wäre jedoch zwischenzeitlich (während Fenster offen) das Rollo durch die Automatik in eine andere Position gefahren worden, dann soll es auch genau dahin, wenn ich das Fenster wieder schließe.

Für jeden Hinweis bin ich dankbar,
Gruß

Michael

rapster

#1

define ntfy_rollo notify ntfy_rollo:\d+|meinFenster:(open|close) {
  if ($NAME eq 'ntfy_rollo') {
     if (ReadingsVal("meinFenster",'state','') eq 'open') {
        fhem("setreading $SELF lastPct $EVENT");
     } else {
        fhem("set meinRollo $EVENT");
     }
  } elsif ($NAME eq 'meinFenster') {
     if ($EVENT eq 'open') {
        fhem("setreading $SELF lastPct ".ReadingsVal("meinRollo",'pct',0));
        fhem("set meinRollo 0");
     } elsif  ($EVENT eq 'close') {
        fhem("set meinRollo ".ReadingsVal($SELF,'lastPct',0));
     }
  }
}


Jetz nurnoch immer "trigger ntfy_rollo <zahl>" machen um das rolle zu bewegen statt direkt mit dem rollo zu sprechen,
allerdings ein schnellschuss zum Denkanstoß und ungetestet ;)

Gruß
  Claudiu

MichaelO

Oha, vielen Dank! Da werde ich mal drüber grübeln.

War schon froh, nach den paar Wochen Fhem das DOIF hinbekommen zu haben. Die Syntax braucht noch. Aber es ist ja Wochenende, da kann viel gelesen werden.

Nochmal danke
Michael

locodriver

fhem 6.0 auf Rpi3 Bookworm
HM-LAN-CFG (FW 0.965), HM-MOD-UART, 2x HM-TC-IT-WM-W-EU, 4x HM-Sec-RHS und 3x HM-CC-RT-DN, 6x HM-LC-Bl1-FM mit je 1x Somfy-Motor,
2x HM-LC-SW2-FM für Licht und Lüfter, 2x HM-PB-6-WM55, Alexa, Jeelinkcross, CUL, CUNO2, IR-Blaster

MichaelO

Ja, das scheint die passende Inspiration zu sein. Das versuche ich mal so anzupassen, dass "im Hintergrund" die Rolladenautomatik weiter läuft.

Dieses DOIF automatisiert ja den teil des Öffnens/Schließens, wobei der Rollo beim Schließen wieder dahin fährt, wo er vorher stand. Ich hätte aber gerne, dass er beim Schließen dahin fährt, wo ihn die Rolladenautomatik hingefahren hätte, wäre das Fenster nicht geöffnet worden.

Bsp: Rollo ist auf, ich öffne Fenster. Nun wird es dunkel, Rollo würde auf "position 100" gehen, tut es aber erst, nachdem das Fenster geschlossen wird (obwohl es beim Öffnen auf "position 0" stand).

Da denke ich noch was drauf rum.

Mein erster Gedanke war, den Rolladen nicht mehr direkt durch die Automatik fahren zu lassen, sondern die Wunschposition in ein Dummy zu schreiben. Dann ein notify auf das Dummy setzen und die gespeicherte Position anfahren. Mache ich das Fenster auf, stelle ich das notify auf disabled und fahre das Rollo hoch. Beim Schließen des Fensters nehme ich das disabled aus dem notify raus und triggere es.

Ich muss mir das die Tage mal in Ruhe anschauen. Wenn ich die Rolladenautomatik durch Spielerei verhunze, gibt's Ärger zu Hause :-)

Gruß
Michael

locodriver

Du kannst ja das Userreading auch mit dem Wert aus deiner Automatik befüllen.

Hier mal meine komplette Def (ist aus dem cfg-file direkt kopiert):
define WZ_Rolare_move DOIF ([[uptime]] and [Rolaautomatik] eq "Ein" and [WZ_Rolare] ne "Auf")(set WZ_Rolare Auf)\
DOELSEIF\
([{sunset(60,"17:00","22:00")}] and [Rolaautomatik] eq "Ein" and ($month<5 or $month>9) and [WZ_Rolare] eq "Auf" and (ReadingsVal("Wetter_Borsdorf","fc1_low_c",0)<5) and [WZ_Balkon] eq "geschlossen")(set WZ_Rolare Zu)\
DOELSEIF\
([10:01] and [Rolaautomatik] eq "Ein" and ($month> 4) and ($month< 10) and (ReadingsVal("Wetter_Borsdorf","fc1_high_c",0)>23) and [WZ_Balkon] eq "geschlossen")(set WZ_Rolare SoSchu)\
DOELSEIF\
([16:00] and [WZ_Rolali] ne "Auf" and (ReadingsVal("Wetter_Borsdorf","temperature",0)<23))(set WZ_Rolare Auf)\
DOELSEIF\
([18:00] and [WZ_Rolare] ne "Auf" and ($month> 4) and ($month< 10))(set WZ_Rolare Auf)\
DOELSEIF\
([WZ_Balkon] eq "offen" and [?WZ_Rolare] ne "Auf")(setreading WZ_Rolare last_state [WZ_Rolare:pct], set WZ_Rolare Auf)\
DOELSEIF\
([WZ_Balkon] eq "geschlossen" and [?WZ_Rolare] eq "Auf")(set WZ_Rolare [WZ_Rolare:last_state],setreading WZ_Rolare last_state 100)

attr WZ_Rolare_move cmdState hoch|runter|SoSchu|16 Uhr|18 Uhr|auto auf|auto ab
attr WZ_Rolare_move cmdpause 0:0:0:0:25
attr WZ_Rolare_move disable 0
attr WZ_Rolare_move do always
attr WZ_Rolare_move room 001Wohnzimmer


Uptime und Rolaauto sind zwei Dummies, uptime kann ich mit einer Zeit belegen und Rolaauto mit ein/aus.
fhem 6.0 auf Rpi3 Bookworm
HM-LAN-CFG (FW 0.965), HM-MOD-UART, 2x HM-TC-IT-WM-W-EU, 4x HM-Sec-RHS und 3x HM-CC-RT-DN, 6x HM-LC-Bl1-FM mit je 1x Somfy-Motor,
2x HM-LC-SW2-FM für Licht und Lüfter, 2x HM-PB-6-WM55, Alexa, Jeelinkcross, CUL, CUNO2, IR-Blaster

MichaelO

Zitat von: locodriver am 02 November 2015, 16:10:13
Du kannst ja das Userreading auch mit dem Wert aus deiner Automatik befüllen.

Bin noch nicht zum Testen gekommen (Wochenende!), aber wenn ich Dein DOIF richtig verstehe, dann kann es passieren, dass durch ein geöffnetes Fenster Deine Positionen nicht immer angefahren und Zweige der Bedingung übersprungen werden, oder?

Wenn Du z.B. das Fenster um 10:00 öffnest und um 10:02 wieder schließt, geht Dir die Fahrt um 10:01 auf die Position SoSchu verloren, da die Bedingung ja nicht mehr getrigert wird, auch wenn Du dann das Fenster schließt ([10:01] kann ja nicht mehr wahr werden)!?

Gruß
Michael

MichaelO

Sorry, aber ich muss nochmal fragen, da es irgendwie noch zu komplex erscheint (oder ich mich zu blöd anstelle)

Ich habe in meinem DOIF "RolloVorneAutomatik" mit

setreading RolloVorneAutomatik GZ_desired_pos 0

und analog WZ_desired_pos zwei Readings erzeugt (Gästezimmer und Wohnzimmer). Die wurden in fhem auch mit Wert 0 angezeigt. Dann wollte ich das DOIF so anpassen, dass nicht mehr der Rolladen direkt angefahren wird, sondern die Readings entsprechend gesetzt und habe das DEF geändert.

Ich wollte dann später mit einem weiteren DOIF auf diese Readings triggern und in Verbindung mit dem offenen/geschlossenen Fenster den Rolladen fahren oder eben nicht.

Hier ein Auszug aus der DEF meines Steuer-DOIF "RolloVorneAutomatik":

## gewünschte Position der Rollos bestimmen:
##
## morgens bei Sonnenaufgang oder zu best. Zeit
([{sunrise("REAL",0,"07:30","08:30")}|7] or [{sunrise("REAL",0,"05:00","05:30")}|8])

     ## Wohnzimmer rauf
     (set WZ_desired_pos 0)
     ## und wenn kein Schlafbesuch dann auch Gästezimmer rauf
     (IF ([Schlafbesuch] eq "nein") (set GZ_desired_pos 0))

## wenn Schlafbesuch und entspr. Zeit,
DOELSEIF
([Schlafbesuch] eq "ja" and [09:00])

     ##dann Gästezimmer
     (set GZ_desired_pos 0)


Nachdem ich dann alles umgeschrieben hatte, so dass die Readings statt die Rolläden angesprochen werden, hab ich auf Save config gedrückt, und da waren die zuvor erzeugten Readings weg.

Könnte man mir bitte nochmal helfen, da ich die Zusammenhänge innerhalb von fhem wohl noch nicht ganz verstanden hab. Was genau muss ich machen, um die Werte in eigene Readings zu bekommen? Ist das der korrekte Ansatz (ich würde gerne beim DOIF bleiben), oder muss ich einen anderen Weg gehen? Brauche ich überhaupt 2 DOIF, oder bekomme ich das auch alles in eines?

Vielen Dank schonmal
Michael

locodriver

ZitatWenn Du z.B. das Fenster um 10:00 öffnest und um 10:02 wieder schließt, geht Dir die Fahrt um 10:01 auf die Position SoSchu verloren, da die Bedingung ja nicht mehr getrigert wird, auch wenn Du dann das Fenster schließt ([10:01] kann ja nicht mehr wahr werden)!?

Das stimmt, aber du kannst ja um 10:01 das userreading auf "SoSchu" setzten unter der Bedingung, dass das Fenster offen ist, dann wird beim Schließen des Fensters dieser Wert geschrieben. Man müsste das userreading evtl. in mehreren DOELEIF-Zweigen noch einbauen bzw. dafür einen extra DOELEIF-Fall einbauen.
Ich kann mit meiner Lösung bis jetzt sehr gut leben ;-).
fhem 6.0 auf Rpi3 Bookworm
HM-LAN-CFG (FW 0.965), HM-MOD-UART, 2x HM-TC-IT-WM-W-EU, 4x HM-Sec-RHS und 3x HM-CC-RT-DN, 6x HM-LC-Bl1-FM mit je 1x Somfy-Motor,
2x HM-LC-SW2-FM für Licht und Lüfter, 2x HM-PB-6-WM55, Alexa, Jeelinkcross, CUL, CUNO2, IR-Blaster

MichaelO

Es hat etwas gedauert, aber "grob" läuft es nun danke der vielen Hinweise.

Ich habe in jedem DOIF-Zweig zunächst mit

setreading RolloAutomatik desired_pos abc

die gewünschte Rolladenposition in ein Reading geschrieben. Dann im selben Zweig mit einer IF-Abfrage geschaut, ob das Fenster zu ist, wenn ja, die Position direkt angefahren.

Am Ende aller DOELSEIFs habe ich dann zwei weitere angefügt. Das erste wird getriggert, wenn das Fenster auf geht. Dann fährt das Rollo rauf. Alle weiteren "Automatik"-Bedingungen schreiben jetzt ja fleißig weiter in das Reading "desired_pos", gefahren wird das Rollo aber nicht. Das letzte DOELSEIF wird dann getriggert, wenn das Fenster zu geht. Jetzt fährt das Rollo auf die Position des Readings "desired_pos".

Ein "Problem" konnte ich aber noch nicht lösen und bräuchte da bitte nochmal einen Hinweis.

Wenn das Modul frisch initialisiert wird (z.B. Neustart fhem oder Änderung der DEF) fehlt das Reading "desired_pos". Es scheint immer gelöscht und erst dann angelegt zu werden, wenn man erstmalig einen Wert zuweist. Ändere ich jetzt die DEF und öffne/schließe dann das Fenster, fehlt ja das Reading und beim Schließen gibt es im Log eine Fehlermeldung. Wie bekomme ich bereits bei Initialisierung des DOIF das Reading angelegt?