zurück zur Startseite

zurück zur Übersicht der Heimautomatisierung

17. Die Rollladensteuerung (Stand 06.09.2018)

Der Rollladenaktor ist eigentlich ganz einfach einzubauen. Er passt in die ganz normale Unterputz-Dose. Bei mir war auch der N-Leiter vorhanden, also ganz schnell ausgetauscht!? Leider nein: ein Standard-Rollladenschalter hat eine 2-teilige Wippe, der HomeMatic-Aktor aber eine einteilige. Somit passt das leider nicht zusammen  - und ohne Wippe kann man den HomeMatic-Aktor nicht bedienen. Zum Glück hatte ich noch eine einteilige Schalterabdeckung. Aber bevor ich weitere Rollladen-Aktoren tausche, sollte ich mir erst die passenden Teile von Gira besorgen.

Angelernt ist das Teil auch gleich. Nach der Eingabe in FHEM

set hmusb hmPairForSec 60

Die 60 Sekunden ermöglichen mir ein bequemes Gehen vom PC im Obergeschoss zum Aktor im Erdgeschoss, wo noch kurz ein Taster mit einem spitzen Gegenstand gedrückt werden muss. Nach dem Anlernen habe ich meinen Rollladen "or_blind" genannt. Leider wird der Rollladen standardmäßig als Lampe angezeigt, aber das kann man später noch ändern. Ist der Rollladen oben, hat man Licht im Zimmer (also Lampe an), ist er unten, ist es dunkel (also Lampe aus) – das kann man sich übergangsweise gut merken.

Neben komplett Auf- und Zufahren kann man über FHEM auch anderer Stellungen bekommen:

set or_blind 66

zum Beispiel öffnet den Rollladen 66%, sprich das oberste Drittel wird abgedeckt, die unteren zwei Drittel bleibt das Fenster frei. Alle anderen Werte von 0 bis 100 funktionieren auch, wobei 0 eben ganz zu ist und 100 ganz auf. Daneben gibt es noch

set or_blind down 10

(oder auch up), was den Rollladen um 10% tiefer (oder auch höher) fährt.

Doch wo kommen die Positionen her? Haben wir ein Messsystem dafür? Die Antwortet ist einfach: es gibt eine Fahrzeit für den Rollladen nach unten und eine weitere Fahrzeit nach oben. Die halbe Zeit bewirkt dann eben die halbe Bewegung. Das ist zwar nicht exakt (spiralförmiger Wickel und Temperaturgänge verfälschen das deutlich), aber für das Erste genügt es.

Jetzt muss man nur noch mit einer Stoppuhr die beiden Fahrzeiten ermitteln und die Defaultwerte damit überschreiben.

set or_blind regSet driveUp 65
set or_blind regSet driveDown 60

Die Zeit wird in ganzen Sekunden angegeben (hier meine Werte für den ersten Rollladen im Orientzimmer bei 9°C Außentemperatur und 19°C Raumtemperatur.

Für Jalousien gibt es noch einen weiteren Parameter DriveTurn, der bei Rollläden immer 0,5 Sekunden (kleinstmöglicher Wert um den Motor zu schützen) ist, weil da keine Lamellen verdreht werden müssen.

Man könnte nun den Rollladen mit einem Schieberegler bewegen. Wenn 10%-Schritte genügen, dann definiert man in FHEM einen Dummy:

define or_slider dummy

und gibt ihm ein Attribut:

attr or_slider setList state:slider,0,10,100

Hierbei sind meine Angaben
     0 = der kleinste Wert, den der Dummy annehmen kann
     10 = die Schrittweite und
     100 = der größte Wert.

Ergänzend braucht man noch ein notify, dessen Definition wie folgt aussieht:

or_slider {
  fhem("set or_blind $EVENT")
  }

Wird der Schieberegler nun bewegt, nimmt er einen neuen Wert an. Dieser wird in $EVENT repräsentiert. Das notify steuert für die Werte 0, 10, 20, ..., 100 den Rollladenaktor direkt an.

Nun fehlt nur noch eine bessere grafische Darstellung anstelle der Lampe. Ich habe dafür 11 verschiedene Bildchen erstellt und lasse diese in Abhängigkeit der Position darstellen. Dazu muss man nur das Attribut "devStateIcon" setzen. Da es aber 201 Positionen gibt (0 bis 100 in 0,5er Schritten) wird das Attribut ziehmlich komplex und mit den sogenannten "regular expressions" von perl muss man sich auch auseinander setzen. Die gesamte Definition des Rollladenaktors lautet:

define or_blind CUL_HM 2D3EBC
   attr or_blind IODev hmusb
   attr or_blind IOgrp vccu
   attr or_blind autoReadReg 4_reqStatus
   attr or_blind devStateIcon on:20_for0 off:20_for100 (100):20_for0 (9[5-9])(\.)5|(9[5-9]):20_for0 (9[0-4]|8[7-9])(\.)5|(9[0-4]|8[7-9]):20_for10 (8[0-6])(\.)5|(8[0-6]):20_for20 (7[3-9])(\.)5|(7[3-9]):20_for30 (6[5-9]|7[0-2])(\.)5|(6[5-9]|7[0-2]):20_for40 (5[6-9]|6[0-4])(\.)5|(5[6-9]|6[0-4]):20_for50 (4[5-9]|5[0-5])(\.)5|(4[5-9]|5[0-5]):20_for60 (3[5-9]|4[0-4])(\.)5|(3[5-9]|4[0-4]):20_for70 (2[1-9]|3[0-4])(\.)5|(2[1-9]|3[0-4]):20_for80 ([6-9]|1[0-9]|20)(\.)5|([6-9]|1[0-9]|20):20_for90 ([0-5])(\.)5|([0-5]):20_for100
   attr or_blind event-on-change-reading .*
   attr or_blind expert 2_full
   attr or_blind firmware 2.3
   attr or_blind fp_zw_orientzimmer 300,600,0
   attr or_blind model HM-LC-Bl1PBU-FM
   attr or_blind peerIDs 00000000,
   attr or_blind room Orientzimmer
   attr or_blind serialNr LEQ0610056
   attr or_blind subType blindActuator
   attr or_blind webCmd stop:on:off:90:82:76:68:60:49:39:29:10

Bei halb geöffnetem Rollladen wird das entsprechende Icon angezeigt.

Ich habe oben geschrieben "Man könnte nun den Rollladen mit einem Schieberegler bewegen", da möchte ich aber nicht. Meine Anforderungen an eine Rolladensteuerung sind:

Ich habe nun die entsprechenden Definitionen aus der fhem.cfg kopiert und ergänzend kommentiert.

# Rollladensteuerung **********************************************************
# or_blind - ist der Aktor für den Rollladen
#
# or_blindmode - gibt an, ob manuelle oder automatische Steuerung
#   bei manueller Steuerung kann auch mit dem Taster an der Wand bedient werden
#   bei automatischer Steuerung erfolgt alle 13 Minuten eine Aktualisierung

define or_blindmode dummy
   attr or_blindmode devStateIcon automatic:20_k_auto0:manual manual:20_k_manuell0:automatic
   attr or_blindmode fp_zw_orientzimmer 300,400,0
   attr or_blindmode room Orientzimmer

# or_blindset - wird durch die "Tasten" auf der Bedienoberfläche gesetzt: +10, -10, +100, -100

define or_blindset dummy
   attr or_blindset room Orientzimmer

# or_rollohell - "Taster" für Rollladen ganz hochziehen
# or_rollodunkel - "Taster" für Rollladen ganz zumachen
# or_rolloplus - "Taster" für Rollladen etwas hoch fahren
# or_rollominus - "Taster" für Rollladen etwas hinunter fahren

define or_rollohell dummy
   attr or_rollohell devStateIcon 0:20_k_ganzhinauf0:1
   attr or_rollohell fp_zw_orientzimmer 100,600,0
   attr or_rollohell room Orientzimmer

define or_rollodunkel dummy
   attr or_rollodunkel devStateIcon 0:20_k_ganzhinunter0:1
   attr or_rollodunkel fp_zw_orientzimmer 500,600,0
   attr or_rollodunkel room Orientzimmer

define or_rolloplus dummy
   attr or_rolloplus devStateIcon 0:20_k_hinauf0:1
   attr or_rolloplus fp_zw_orientzimmer 100,800,0
   attr or_rolloplus room Orientzimmer

define or_rollominus dummy
   attr or_rollominus devStateIcon 0:20_k_hinunter0:1
   attr or_rollominus fp_zw_orientzimmer 500,800,0
   attr or_rollominus room Orientzimmer

define or_n_dunkel notify or_rollodunkel:1 set or_blindset -100;; set or_rollodunkel 0
   attr or_n_dunkel room Orientzimmer

define or_n_hell notify or_rollohell:1 set or_blindset 100;; set or_rollohell 0
   attr or_n_hell room Orientzimmer

define or_n_minus notify or_rollominus:1 set or_blindset -10;; set or_rollominus 0
   attr or_n_minus room Orientzimmer

define or_n_plus notify or_rolloplus:1 set or_blindset 10;; set or_rolloplus 0
   attr or_n_plus room Orientzimmer

# or_blindsetman - errechnet den neuen manuellen Sollwert

define or_blindsetman notify or_blindset {\
   my $or_blindpos = Value("or_blind_lin");;\
   if (Value("or_blindmode") eq "manual") {\
      $or_blindpos += Value("or_blindset");;\
      if ($or_blindpos >100) {$or_blindpos = 100}\
      if ($or_blindpos <0) {$or_blindpos = 0}\
      fhem("set or_blind_lin $or_blindpos")\
   }\
   fhem("set or_blindset 0")\
}
   attr or_blindsetman room Orientzimmer

# or_blind_lin - ist der Sollwert des Rollladens, leider ist das Ganze nichtlinear
#   Angabe in "Prozent offen", 0 ist somit dunkel im Zimmer :-)

define or_blind_lin dummy
   attr or_blind_lin room Orientzimmer

# or_rollolin - rechnet den gewünschten Wert in den tatsächlichen Wert um

define or_rollolin notify or_blind_lin {\
   if ($EVENT == 0) {\
   fhem("set or_blind 0")\
   } elsif ($EVENT == 10) {\
   fhem("set or_blind 10")\
   } elsif ($EVENT == 20) {\
   fhem("set or_blind 29")\
   } elsif ($EVENT == 30) {\
   fhem("set or_blind 39")\
   } elsif ($EVENT == 40) {\
   fhem("set or_blind 49")\
   } elsif ($EVENT == 50) {\
   fhem("set or_blind 60")\
   } elsif ($EVENT == 60) {\
   fhem("set or_blind 68")\
   } elsif ($EVENT == 70) {\
   fhem("set or_blind 76")\
   } elsif ($EVENT == 80) {\
   fhem("set or_blind 82")\
   } elsif ($EVENT == 90) {\
   fhem("set or_blind 90")\
   } elsif ($EVENT == 100) {\
   fhem("set or_blind 100")\
   } else {\
   fhem("set or_blind $EVENT")\
   }\
}
   attr or_rollolin room Orientzimmer

# or_rollopos - aktualisiert alle 13 Minuten

define or_rollopos at +*00:13 {\
my $x = Value("or_blind_lin");;\
   if (Value("or_blindmode") eq "automatic") {\
   shuttercontrol("$x", "or_blind_lin");;\
   }\
}
   attr or_rollopos room Orientzimmer

# Ende Rollladensteuerung *****************************************************

Bis auf die letzte Funktion "or_rollopos" dürfte soweit alles schon erklärt sein, da auch schon die Attribute "fp_zw_orientzimmer" gesetzt sind, bekommen wir auch gleich eine Anzeige.

Die Funktion "or_rollopos" dokumentiere ich erst im übernächsten Kapitel, zuvor soll noch beschrieben werden, wie ich den Einfluss des Sonnenstands realisiere.

weiter zu: 18. Der Sonnenstand