Rolladensteuerung mit Eingabemöglichkeiten

Aus FHEMWiki

In diesem Artikel beschreibe ich, wie ich meine Rollläden steuere.

Grundsätzliche Beschreibung

Meine Rollläden im Haus sind allesamt mit HM Aktoren versehen, welche ich nachträglich UP gelegt habe. Vorher waren die Rolläden manuell bedienbar gewesen.

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.

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 start:
Ab dieser Zeit fahren die Rolläden bei Erreichen des Helligkeitswertes runter. Sofern eventuelle Tür-/Fensterkontakte den Status "closed" aufweisen. Während des Zeitraums gehen diese Rolläden hoch und auch wieder runter, sofern eine Tür/ein Fenster geöffnet bzw geschlossen wird.
Zeit runter ende:
Dies ist das Ende des Zeitraums. Wenn bis dahin die Helligkeit nicht unterschritten wurde, fahren die Rolläden nun spätestens runter.

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, wenn es mehrere Aktoren in einem Zimmer gibt.

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 start:
NAME       du_Rollo_Zeit_ru_start 
TYPE       dummy 

Attributes: 
alias      Zeit runter start: 
devStateIcon .*:rc_BLANK 
group      Rollos_Settings 
icon       icoUhr 
room       LichtRollo 
setList    state:time 
sortby     21 
webCmd     state
Zeit runter ende:
NAME       du_Rollo_Zeit_ru_ende 
TYPE       dummy 

Attributes: 
alias      Zeit runter ende: 
devStateIcon .*:rc_BLANK 
group      Rollos_Settings 
icon       icoUhr 
room       LichtRollo 
setList    state:time 
sortby     22 
webCmd     state

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.

([du_Rollo_Master] eq "an" and ([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru] and [du_Rollo_Art] ne "Weihnachten" and [{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "22:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}]) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}]) 
  (set EG_ku_RO_StrasseLinks off) 
DOELSEIF ([du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "10:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "10:00:00")}|7])) 
  (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.

([du_Rollo_Master] eq "an" and [EG_ku_TK_Strasse] eq "closed" and ([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru:state] and [{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "22:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}]) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}]) 
  (set EG_ku_RO_StrasseRechts off) 
DOELSEIF ([du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "10:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "10:00:00")}|7]) or ([EG_ku_TK_Strasse:state] eq "open")) 
  (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.

([du_Rollo_Master] eq "an" and [EG_wz_TK_Terrasse] eq "closed" and (([EG_dr_TS_Terrasse:luminosity] < [du_Rollo_Luminosity_ru:state] and [{ReadingsVal("du_Rollo_Zeit_ru_start", "state", "22:00:00")}-{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}]) or [{ReadingsVal("du_Rollo_Zeit_ru_ende", "state", "22:00:00")}])) 
  (set EG_wz_RO_TerrasseLinks off)
DOELSEIF ([du_Rollo_Master] eq "an" and ([{ReadingsVal("du_Rollo_Zeit_ho", "state", "10:00:00")}|8] or [{ReadingsVal("du_Rollo_Zeit_ho_WE", "state", "10:00:00")}|7]) or ([EG_wz_TK_Terrasse] eq "open"))
  (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)

Hier folgt nun das mMn wichtigste DOIF. Sofern manuelle Änderungen in den Text- bzw Zeitdummys durchgeführt werden, aktualisiert dieses DOIF die Definitionen der Rollo-DOIFs. Dadurch werden die neuen Werte aus den Dummys für die Timer der DOIFs aktualisiert.

Auch aktualisiert dieses DOIF bei einem Neustart von FHEM die DOIFs. Andernfalls würden die Defaultwerte der ReadingsVal(...) in den Definitionen die Defaultwerte zurückliefern.

di_Rollo_SetTime

([global:?INITIALIZED] or [du_Rollo_Zeit_ho:?] or [du_Rollo_Zeit_ho_WE:?] or [du_Rollo_Luminosity_ru:?] or [du_Rollo_Zeit_ru_start:?] or [du_Rollo_Zeit_ru_ende:?]) (modify di_EG_ku_RO_StrasseLinks [di_EG_ku_RO_StrasseLinks:&DEF], modify di_EG_ku_RO_StrasseRechts [di_EG_ku_RO_StrasseRechts:&DEF], modify di_EG_wz_RO_Carport [di_EG_wz_RO_Carport:&DEF], modify di_EG_wz_RO_TerrasseLinks [di_EG_wz_RO_TerrasseLinks:&DEF], modify di_EG_wz_RO_TerrasseRechts [di_EG_wz_RO_TerrasseRechts:&DEF], modify di_OG_elt_RO_Strasse [di_OG_elt_RO_Strasse:&DEF], modify di_OG_ki1_RO_Carport [di_OG_ki1_RO_Carport:&DEF], modify di_OG_ki1_RO_Garten [di_OG_ki1_RO_Garten:&DEF], modify di_OG_ki2_RO_Garten [di_OG_ki2_RO_Garten:&DEF])

ReadingsGroup

Hier seien noch die beiden ReadingsGroup aufgeführt, welche im Dashboard dargestellt werden.

Folgende Funktionen sind in der myRollosUtils 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