Rolladensteuerung mit Eingabemöglichkeiten
In diesem Artikel beschreibe ich, wie ich meine Rollläden steuere.
Grundsätzliche Beschreibung
Mein erstes große Projekt in Sachen FHEM war es meine Rolläden automatisiert zu steuern, so dass man möglichst wenig manuell eingreifen muss. Da der ein und andere Riemen der manuellen Steuerung den Geist aufgegeben hat, habe ich nach und nach alle Rolläden mit Motoren und HM Aktoren versehen.
Da ich eine Photovoltaikanlage besitze habe ich ein kleines Modul geschrieben, welches mir die Ertragsleistung in FHEM darstellt. Anhand dieser Werte steuere ich Rolläden, welche zur Südseite gerichtet sind. Dadurch wird dann dynamisch die Sonneneinstrahlung und damit die Erwärmung der Zimmer eingestellt. Zwischenzeitlich ist ein Helligkeitssensor installiert worden. Dieser sorgt für das Herunterfahren der Rolläden bei Eintreten der Dunkelheit.
Dieser Wert korreliert zwar mit den Werten der PV Anlage, dies habe ich aber bislang noch nicht aufgelöst.
Komponenten
1. HM Funk-Jalousieaktor HM-LC-Bi1PBU-FM
2. Solarlog-Modul
3. Helligkeitssensor aus diesem Posting
Selbstbau HM_WDS10_TH_O mit Luftdruckmessung
Visualisierung
Hier ist der Status eines jeden Rolladens ersichtlich und dieser ist bedienbar. Die Darstellung habe ich mittels Dashboard umgesetzt.
Über diese Einstellungsseite können diverse Parameter der Steuerung gesetzt werden.
Einstellungen
- Automatik aktiv:
- Hiermit wird die komplette Steuerung der Rolläden ein- bzw ausgeschaltet.
- Sofern der Modus "aus" aktiv ist, werden meine Rolläden lediglich über die Aktoren direkt oder eine HM Fernbedienung gesteuert.
- Art:
- Hier werden derzeit drei Modi unterstützt:
- 1. Normal
- Bei diesem Modus fahren die Rollläden zu den definierten Zeiten hoch. Dabei wird eine Unterscheidung zwischen Wochentagen und Wochenenden berücksichtigt. Ausserdem werden mit Hilfe einer Holiday-Datei auch Feiertage und Urlaube berücksichtigt.
- Abends ist ein Zeitraum und ein Helligkeitswert definiert. Sobald dieser Helligkeitswert in dem Zeitfenster unterschritten wird, fahren die Rolläden runter. Spätestens aber zum Ende des Zeitfensters.
- 2. Weihnachten
- Vom Prinzip arbeitet dieser Modus wie der Modus "Normal". Lediglich ein Rolladen fährt zum Ende des Zeitfensters runter und nicht bei Unterschreitung des Helligkeitswertes, damit die Weihnachtsaussenbeleuchtung auch von innen begutachtet werden kann.
- 3. Urlaub
- Dieser Modus schaltet die Rolläden genauso wie der Modus "Normal". Des Weiteren aktiviere ich noch eine Zufallssteuerung für eine Anwesenheitsbeleuchtung.
- PV:
- Hiermit wird der Ertrag der Photovoltaikanlage mit einbezogen, damit die Rolläden zur Südseite anhand definierter Werte geschaltet werden.
- Zeit hoch:
- Hier wird der Zeitpunkt definiert, wann die Rollläden an Werktagen geöffnet werden sollen.
- Zeit hoch WE:
- Dies definiert die Zeit, wann die Rolläden am Wochenende bzw an Tagen, welche in einer Holiday Datei definiert sind hoch gehen sollen.
- Helligkeit runter:
- Dieser Wert ist der untere Schwellwert des Helligkeitssensors, ab wann die Rolläden in dem definierten Zeitraum geschlossen werden sollen.
- Zeit runter:
- Zu dieser Zeit fahren die Rolläden runter, egal ob der angegebene Hellgleitswert erreicht wurde. Sofern eventuelle Tür-/Fensterkontakte den Status "open" aufweisen, bleiben diese oben.
Codierung
Meine Aktoren haben den folgenden Aufbau, was den Namen angeht:
OG_ki1_RO_Carport
Die ersten zwei Zeichen geben das Geschoss an. Die Zeichen 4-6 beschreiben das Zimmer. Die Zeichen 8 und 9 stellen die Art des Aktors dar. Ab Zeichen 11 wird noch weiter beschrieben wo sich der Aktor befindet bzw was für eine Funktion dieser besitzt.
Dummys
Beginnen möchte ich hier mit den Dummys, welche die Konfiguration der Steuerung darstellen.
- Automatik aktiv:
NAME du_Rollo_Master TYPE dummy Attributes: alias Automatik aktiv: devStateIcon .*:rc_BLANK group Rollos_Settings icon fts_shutter_automatic room LichtRollo setList state:an,aus sortby 01 webCmd state
- Art:
NAME du_Rollo_Art TYPE dummy Attributes: alias Art: devStateIcon .*:rc_BLANK group Rollos_Settings icon fts_shutter_updown room LichtRollo setList state:Normal,Urlaub,Weihnachten sortby 02 webCmd state
- PV:
NAME du_Rollo_PV TYPE dummy Attributes: alias PV: devStateIcon .*:rc_BLANK group Rollos_Settings icon weather_sun room LichtRollo setList state:an,aus sortby 03 webCmd state
- Zeit hoch:
NAME du_Rollo_Zeit_ho TYPE dummy Attributes: alias Zeit hoch: devStateIcon .*:rc_BLANK group Rollos_Settings icon icoUhr room LichtRollo setList state:time sortby 10 webCmd state
- Zeit hoch WE:
NAME du_Rollo_Zeit_ho_WE TYPE dummy Attributes: alias Zeit hoch WE: devStateIcon .*:rc_BLANK group Rollos_Settings icon icoUhr room LichtRollo setList state:time sortby 11 webCmd state
- Helligkeit runter:
NAME du_Rollo_Luminosity_ru TYPE dummy Attributes: alias Helligkeit runter devStateIcon .*:rc_BLANK group Rollos_Settings icon sani_solar room LichtRollo setList state:textField sortby 20 webCmd state
- Zeit runter:
NAME du_Rollo_Zeit_ru TYPE dummy Attributes: alias Zeit runter: devStateIcon .*:rc_BLANK group Rollos_Settings icon icoUhr room LichtRollo setList state:time sortby 21 webCmd state
- Tageslicht:
Dieser Dummy beinhaltet den Wert "hell" oder "dunkel". Diese beiden Werte werden von zwei at's in Abhängigkeit von Sunset/Sunrise gesetzt. Dadurch gehen die Rollos hoch, wenn im Dunkeln eine Tür geöffnet wird. Wird die Tür geschlossen. Geht der Rollo auch wieder runter.
NAME du_Tageslicht TYPE dummy Attributes: alias Tageslicht devStateIcon devStateIcon hell:hell dunkel:nacht@crimson icon sani_solar
ATs
at_LichtRollo_hell
NAME at_LichtRollo_hell DEF *{sunrise(1200)} set du_Tageslicht hell
at_LichtRollo_dunkel
NAME at_LichtRollo_dunkel DEF *{sunset(1200)} set du_Tageslicht dunkel
DOIFs
di_EG_ku_RO_StrasseLinks
Dieses DOIF beachtet den Helligkeitswert und den Modus "Weihnachten". D.h., daß dieser Rollo erst am Ende des definierten Zeitraums herunterfährt.
(([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and [du_Rollo_Art] ne "Weihnachten" and [du_Tageslicht:state] eq "dunkel") or [{ReadingsVal("du_Rollo_Zeit_ru", "state", "22:00:00")}]) ({if (ReadingsVal("EG_ku_RO_StrasseLinks", "state", "---") ne "off") {fhem("set EG_ku_RO_StrasseLinks off")}}) DOELSEIF (([[du_Rollo_Zeit_ho]|8] or [[du_Rollo_Zeit_ho_WE]|7])) ({if (ReadingsVal("EG_ku_RO_StrasseLinks", "state", "---") ne "on") {fhem("set EG_ku_RO_StrasseLinks on")}})
di_EG_ku_RO_StrasseRechts
Hier wird ein Fensterkontakt mit in die Schaltung einbezogen. D.h. während des definierten Zeitraums gehen Rollos hoch, wenn eine Tür oder ein Fenster geöffnet wird. Ebenso wieder runter, sofern der Kontakt wieder geschlossen wird.
([EG_ku_TK_Strasse] eq "closed" and ([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru:state] and [du_Tageslicht:state] eq "dunkel") or [[du_Rollo_Zeit_ru]]) ({if (ReadingsVal("EG_ku_RO_StrasseRechts", "state", "---") ne "off") {fhem("set EG_ku_RO_StrasseRechts off")}}) DOELSEIF (([[du_Rollo_Zeit_ho]|8] or [[du_Rollo_Zeit_ho_WE]|7]) or ([EG_ku_TK_Strasse:state] eq "open") and ([du_Tageslicht:state] eq "dunkel")) ({if (ReadingsVal("EG_ku_RO_StrasseRechts", "state", "---") ne "on") {fhem("set EG_ku_RO_StrasseRechts on")}})
di_EG_wz_RO_TerrasseLinks
Dieses DOIF beachtet einen Fensterkontakt und bezieht die Photovoltaikanlage mit ein. Dieser Rollo geht während des Zeitraums der Dunkelheit rauf und runter, sofern der Türkontakt geöffnet oder geschlossen wird.
([EG_wz_TK_Terrasse:state] eq "closed" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru:state] and [du_Tageslicht:state] eq "dunkel") or [[du_Rollo_Zeit_ru]])) ({if (ReadingsVal("EG_wz_RO_TerrasseLinks", "state", "---") ne "off") {fhem("set EG_wz_RO_TerrasseLinks off")}}) DOELSEIF (([[du_Rollo_Zeit_ho]|8] or [[du_Rollo_Zeit_ho_WE]|7]) or (([EG_wz_TK_Terrasse:state] eq "open") and [du_Tageslicht:state] eq "dunkel")) ({if (ReadingsVal("EG_wz_RO_TerrasseLinks", "state", "---") ne "on") {fhem("set EG_wz_RO_TerrasseLinks on")}}) DOELSEIF ([du_Rollo_PV] eq "an" and [EG_wz_TK_Terrasse] eq "closed" and [mySL:Pac_avg] >= 2100) (set EG_wz_RO_TerrasseLinks 0) DOELSEIF ([du_Rollo_PV] eq "an" and [EG_wz_TK_Terrasse] eq "closed" and [mySL:Pac_avg] >= 1501) (set EG_wz_RO_TerrasseLinks 30) DOELSEIF ([du_Rollo_PV] eq "aus") (set EG_wz_RO_TerrasseLinks on) wait 0:0:300:300:0
Alle anderen Aktoren sind vereinfachte Versionen der genannten DOIFs und werden daher hier nicht genannt.
di_Rollo_Art
Dieses DOIF enabled und disabled einen Randomtimer, welcher ein Zufallslicht schaltet.
([du_Rollo_Art:state] eq "Urlaub") (attr UrlaubTimer disable 0, attr at_Urlaub_DG_hz_SD_Zirkpumpe disable 0) DOELSE ([du_Rollo_Art:state] ne "Urlaub") (attr UrlaubTimer disable 1, attr at_Urlaub_DG_hz_SD_Zirkpumpe disable 1)
ReadingsGroup
Hier seien noch die beiden ReadingsGroup aufgeführt, welche im Dashboard dargestellt werden.
Folgende Funktionen sind in der myRollosUtils.pm gespeichert und dienen der Bedienung ausgehend aus den ReadingsGroups.
############## Rollos hoch/runter in Readingsgroup sub myRollosUtils_RollosUpDown($$) { my($DEVICE,$CMD) = @_; my $icon = $CMD; my $link; if( $CMD eq "up" ) { $icon = "remotecontrol/black_btn_CHUP"; $link = "setreading $DEVICE cmd-new on"; } elsif( $CMD eq "down" ) { $icon = "remotecontrol/black_btn_CHDOWN"; $link = "setreading $DEVICE cmd-new off"; } elsif( $CMD eq "stop" ) { $icon = "remotecontrol/black_btn_STOP"; $link = "setreading $DEVICE cmd-new stop"; } my $notify = "no_RollosUpDown"; if( !defined($defs{$notify}) ) { CommandDefine(undef, "$notify notify .*:cmd-new.* " ."{ myRollos_RollosUpDownNotify(\$NAME,\$EVTPART1); }" ); } my $ret = "%$icon"; $ret .= "%$link" if( $link ); return $ret; } sub myRollosUtils_RollosUpDownNotify($$) { my($DEVICE,$CMD) = @_; return if( $CMD eq "" ); CommandSet(undef, "$DEVICE $CMD"); return undef; } sub myRollosUtils_RollosIcon($) { my($DEVICE) = @_; my $level = ReadingsVal($DEVICE,"level", "0"); my $pct = ReadingsVal($DEVICE, "pct", "0"); my $ret = int((100 - $level)/10)*10; my $icon; if ($ret eq "0") { $icon = "fts_window_2w\@orange"; } else { $icon = "fts_shutter_".$ret."\@orange"; } return $pct." %"; }
EG_rg_Rolllaeden
EG.*_RO_S.*:level,<{myRollosUtils_RollosUpDown($DEVICE,"up")}>,<{myRollosUtils_RollosUpDown($DEVICE,"stop")}>, <{myRollosUtils_RollosUpDown($DEVICE,"down")}> EG.*_RO_C.*:level,<{myRollosUtils_RollosUpDown($DEVICE,"up")}>, <{myRollosUtils_RollosUpDown($DEVICE,"stop")}>,<{myRollosUtils_RollosUpDown($DEVICE,"down")}> EG.*_RO_T.*:level, <{myRollosUtils_RollosUpDown($DEVICE,"up")}>,<{myRollosUtils_RollosUpDown($DEVICE,"stop")}>, <{myRollosUtils_RollosUpDown($DEVICE,"down")}> EG.*_RO_M.*:level,<{myRollosUtils_RollosUpDown($DEVICE,"up")}>, <{myRollosUtils_RollosUpDown($DEVICE,"stop")}>,<{myRollosUtils_RollosUpDown($DEVICE,"down")}> Attributes: group Rollos/Markise_EG mapping %ALIAS valueFormat {pct => "%.1f"} valueIcon %VALUE
Notify
Ein Notify ist für die Bedienung ausgehend aus den ReadingsGroup notwendig.
DEF .*:cmd-new.* { myRollosUtils_RollosUpDownNotify($NAME,$EVTPART1); } NAME no_RollosUpDown TYPE notify Attributes: group notify