Rolladensteuerung mit Eingabemöglichkeiten

Aus FHEMWiki

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.

Dashboard01.png


Über diese Einstellungsseite können diverse Parameter der Steuerung gesetzt werden.

Dashboard02.png

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

Für beide ATs muss SUNRISE_EL konfiguriert sein.

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