Rollosteuerung für große Installationen

Begonnen von hugomckinley, 02 Dezember 2016, 20:12:47

Vorheriges Thema - Nächstes Thema

hugomckinley

Nachdem ich schon seit Monaten von eurem Wissen sehr stark profitiert habe, möchte ich mich mit dem heutigen Beitrag etwas revanchieren.

Ich habe die letzten Monate damit verbracht unsere Rollos zu automatisieren. Wobei ich gleich vorwegschicken möchte, dass ich beim Thema Hausautomatisierung dem Wortteil "Automatisierung" die größte Rolle zuweise. Ich möchte gerade nicht eine App oder einen Browser, wo ich alles beobachten, steuern, oder beeinflussen kann, sondern es soll so viel wie möglich laut den Wünschen der Bewohner automatisch arbeiten. Bei meiner Lösung steckt sehr viel Probieren und Testen der Parameter dahinter, aber mittlerweile läuft das Ding wirklich so, dass man es (fast)nicht mehr anfassen muss.

Hier ein paar Details zu meiner Installation:

  • 4 bewohnte Stockwerke (4 Erwachsene, 1 Jugendlicher, 2 Kinder) in drei Wohnungen (EG,KG, OG&DG)
  • 27 Rollos auf drei beschatteten Seiten
Das ist auch der Grund warum alles per Mausklick einstellbar sein soll/muss

Homematic-Hardware:

  • 27 Stk. HM-LC-Bl1PBU-FM
  • 3 Stk. HM-Sen-MDIR-O-2 (Helligkeitswerte Ost, Süd, West)
  • 1 Stk. HM-WDS100-C6-O (Aussentemperatur)
  • 1 Stk. HM-SEC-RHS (Stellung des Türgriffs der Balkontüre)

Folgende Eckpunkte haben sich entweder von Anfang an oder im Laufe der Zeit als Anforderungen herausgestellt:

  • Jede Wohneinheit muss seperat eingestellt werden können
  • Konfigurationsänderungen sollen per Klick ohne IT-Wissen vorgenommen werden können. (längerfristig Floorplan auf Touchscreen, ausser es läuft wirklich alles so autmatisch, dass dies nicht nötig wird)

Um dieses mittlerweile doch schon etwas komplexe System zu erklären, gibt es zuerst einen Überblick der Oberfläche:

Eine Readingsgroup dient zur Einstellung der Paramater (siehe Anhang)

Erklärung/Zweck der Parameter:


  • Automatik: komplettes Ein-/Ausschalten der Automatik
  • Verdunkelung: Automatische Verdunkelung Ein/Aus
  • Zeitzone: Es gibt verschiedene Timer, die unterschiedliche Dämmerungszustände oder Randbedingungen berücksichtigen (Details bei den Timern)
  • Offen-Pos.: Wie weit das Rollo geöffnet wird (Verdunkelung aus/ Beschattung aus). Es gibt z.B. Rollos die als Sichtschutz morgens nicht ganz aufmachen sollen.
  • Geschlossen-Pos.: Wie weit das Rollo bei der Verdunkelung geschlossen wird. In manchen Räumen (Schlafzimmer; Hauswirtschaftsraum) sollen ein paar Schlitze des Rollos offen bleiben (auch)in der Nacht. (damit man nicht so abgeschottet ist von der Aussenwelt; um den Trockner etwas kühle Luft zu vergönnen)
  • Beschattung: Beschattungsautomatik Ein/Aus
  • Sonnentoleranz: Wie stark "Sonnenintensität" (Details beim Sonnenlevel Dummy) sein muss, um die Beschattung zu aktivieren. Es gibt Räume die sehr aggressiv beschattet werden, da es dort egal ist, wenn es viel dunkel ist (Hauswirtschaftsraum, Level 1). Manche Rollos müssen aufgrund von viel Fläche bzw. ungünstige Lage des Lichtsensors früher beschattet werden. (Balkontüre OG, Level 2)
  • Beschattungs-Pos.: Welche Position die Beschattungsautomatik anfährt. Teilweise bleiben einige Schlitze offen um etwas Restlicht zu erhalten, teilweise gibt es Objekte im Freien, die es erlauben das Rollo nicht ganz schließen zu müssen.
  • Zwangsbelichtung: Sollte in einem Schlafraum (siehe nächster Punkt) vergessen worden sein das Rollo zu öffnen, wird zu einem fixen -sehr späten- Zeitpunkt das Rollo geöffnet. Sollte die Beschattung gerade aktiv sein, dann natürlich nicht, sondern erst am Ende der Besschattung. Dient dazu, zu verhindern, dass Rollos den ganzen Tag geschlossen bleiben. (z.B. Pflanzen im Schlafzimmer, Jugendliche die das Zimmer ständig mit geschlossenen Rollos verlassen)
  • Schlafraum: Ein/Aus. Schlafraum wird nicht automatisch geöffnet, aber automatisch verdunkelt. Die Automatik kann nicht wissen wann man aufsteht (Krankenstand, ZA, Urlaub, usw.)

Definition der Readingsgroup:

define rg_Rollos readingsGroup <Gerät>,<Position>,<Standort>,<Automatik>,<Verdunkelung>,<Zeitzone>,<Offen-Pos.>,<Geschlossen-Pos.>,<Beschattung>,<Sonnentol.>,<Beschattungs-Pos.>,<Zwangsbelichtung>,<Schlafraum> subType&blindActuator:state,?group,?automatic,?darkening,?timezone,?openedlevel,?closedlevel,?shadow,?sunlevel,?shadowposition,?forced_unshadow,?sleeping\

attr rg_Rollos alias Readingsgroup Rollos
attr rg_Rollos commands {'automatic.on' => 'attr $DEVICE automatic off', 'automatic.off' => 'attr $DEVICE automatic on',\
'darkening.on' => 'attr $DEVICE darkening off', 'darkening.off' => 'attr $DEVICE darkening on',\
'shadow.on' => 'attr $DEVICE shadow off', 'shadow.off' => 'attr $DEVICE shadow on',\
'sleeping.no' => 'attr $DEVICE sleeping yes', 'sleeping.yes' => 'attr $DEVICE sleeping no',\
'timezone' => 'timezone:EG1,EG2,EG3,OG1,OG2,OG3,KG1,KG2,KG3',\
'openedlevel' => 'openedlevel:50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,89,90,91,92,93,94,95,96,97,98,99,100',\
'closedlevel' => 'closedlevel:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50',\
'sunlevel' => 'sunlevel:1,2,3,4',\
'shadowposition' => 'shadowposition:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50',\
'forced_unshadow' => 'forced_unshadow:no,yes'\
}
attr rg_Rollos group Beschattung
attr rg_Rollos icon fts_shutter_automatic@blue
attr rg_Rollos room Automatik
attr rg_Rollos valueIcon {state => '%devStateIcon',\
'automatic.on'=>'fts_shutter_automatic@green', 'automatic.off'=>'fts_shutter_automatic@grey', \
'darkening.off'=>'scene_sleeping@grey', 'darkening.on'=>'scene_sleeping@green',\
'shadow.off'=>'fts_window_roof@grey', 'shadow.on'=>'fts_window_roof_shutter@green',\
'sleeping.no'=>'scene_sleeping_alternat@grey', 'sleeping.yes'=>'scene_sleeping_alternat@green'\
}
attr rg_Rollos valueStyle style="text-align:center"


WeekdayTimer steuern für jede Zeitzone die Verdunkelung (siehe Anhang)

Erklärung:
Hier gibt es für jede Zeitzone einen Weekdaytimer für das Öffnen und einen für das Schließen der Rollos.
Folgende: Randbedingungen wurden erfüllt: späteres Öffen am Wochenende, Wecker für chronische Verschläfer, Ferienprogramm für Jugendliche
Ein Timer ist für die Zwangsbelichtung zuständig.


Definition:

define WT_VerdunkelungEin_EG1 WeekdayTimer dummy Mo-So|{sunset("HORIZON=-4",0,"16:00","21:00")}|on {blindAutomatic("darkening","on","EG1")}
attr WT_VerdunkelungEin_EG1 alias Wochenplan Rollos zu (EG1)
attr WT_VerdunkelungEin_EG1 icon weather_sunset
attr WT_VerdunkelungEin_EG1 room Automatik

define WT_VerdunkelungAus_EG1 WeekdayTimer dummy Mo-Mi|{sunrise("HORIZON=-4",0,"06:00","06:40")}|off Do-So|{sunrise("HORIZON=-4",0,"07:00","08:30")}|off {blindAutomatic("darkening","off","EG1")}
attr WT_VerdunkelungAus_EG1 alias Wochenplan Rollos auf (EG1)
attr WT_VerdunkelungAus_EG1 icon weather_sunrise
attr WT_VerdunkelungAus_EG1 room Automatik

define WT_VerdunkelungEin_KG1 WeekdayTimer dummy Mo-So|{sunset("HORIZON=-4",0,"16:00","21:00")}|on {blindAutomatic("darkening","on","KG1")}
attr WT_VerdunkelungEin_KG1 alias Wochenplan Rollos zu (KG1)
attr WT_VerdunkelungEin_KG1 icon weather_sunset
attr WT_VerdunkelungEin_KG1 room Automatik

define WT_VerdunkelungAus_KG1 WeekdayTimer dummy Mo-Fr|{sunrise("HORIZON=-4",0,"06:00","08:30")}|off Sa-So|{sunrise("HORIZON=-4",0,"07:00","08:30")}|off {blindAutomatic("darkening","off","KG1")}
attr WT_VerdunkelungAus_KG1 alias Wochenplan Rollos auf (KG1)
attr WT_VerdunkelungAus_KG1 icon weather_sunrise
attr WT_VerdunkelungAus_KG1 room Automatik

define WT_VerdunkelungEin_OG1 WeekdayTimer dummy Mo-So|{sunset("HORIZON=-4",0,"16:00","21:45")}|on {blindAutomatic("darkening","on","OG1")}
attr WT_VerdunkelungEin_OG1 alias Wochenplan Rollos zu (OG1)
attr WT_VerdunkelungEin_OG1 icon weather_sunset
attr WT_VerdunkelungEin_OG1 room Automatik

define WT_VerdunkelungAus_OG1 WeekdayTimer dummy Mo-Fr|{sunrise("HORIZON=-4",0,"06:00","08:30")}|off Sa-So|{sunrise("HORIZON=-4",0,"07:00","08:30")}|off {blindAutomatic("darkening","off","OG1")}
attr WT_VerdunkelungAus_OG1 alias Wochenplan Rollos auf (OG1)
attr WT_VerdunkelungAus_OG1 icon weather_sunrise
attr WT_VerdunkelungAus_OG1 room Automatik

define WT_VerdunkelungEin_OG2 WeekdayTimer dummy Mo-So|{sunset("HORIZON=-4",0,"16:00","21:45")}|on {blindAutomatic("darkening","on","OG2")}
attr WT_VerdunkelungEin_OG2 alias Wochenplan Rollos zu (Wecker Kevin)(OG2)
attr WT_VerdunkelungEin_OG2 icon weather_sunset
attr WT_VerdunkelungEin_OG2 room Automatik

define WT_VerdunkelungAus_OG2 WeekdayTimer dummy Mo-Fr|{sunrise("HORIZON=-4",0,"06:00","06:15")}|off Sa-So|{sunrise("HORIZON=-4",0,"10:00","10:30")}|off {blindAutomatic("darkening","off","OG2")}
attr WT_VerdunkelungAus_OG2 alias Wochenplan Rollos auf (Wecker Kevin)(OG2)
attr WT_VerdunkelungAus_OG2 icon weather_sunrise
attr WT_VerdunkelungAus_OG2 room Automatik

define WT_VerdunkelungAus_OG3 WeekdayTimer dummy Mo-So|{sunrise("HORIZON=-4",0,"10:30","11:00")}|off {blindAutomatic("darkening","off","OG3")}
attr WT_VerdunkelungAus_OG3 alias Wochenplan Rollos auf (Kevin Ferien)(OG3)
attr WT_VerdunkelungAus_OG3 icon weather_sunrise
attr WT_VerdunkelungAus_OG3 room Automatik

define WT_VerdunkelungEin_OG3 WeekdayTimer dummy Mo-So|{sunset("HORIZON=-4",0,"16:00","21:45")}|on {blindAutomatic("darkening","on","OG3")}
attr WT_VerdunkelungEin_OG3 alias Wochenplan Rollos zu (Kevin Ferien)(OG3)
attr WT_VerdunkelungEin_OG3 icon weather_sunset
attr WT_VerdunkelungEin_OG3 room Automatik

define WT_forced_unshadow WeekdayTimer dummy Mo-So|11:00|off {blindAutomatic("unshadow")}
attr WT_forced_unshadow alias Zwangsbelichtung
attr WT_forced_unshadow icon weather_sunrise
attr WT_forced_unshadow room Automatik


DOIFs sind für die Beschattung bei den verschiedenen Level zuständig:

Erklärung:
Für jede Zone gibt es für jeden Sonnenlevel ein DOIF. Es gibt eine beliebige Anzahl von Level (bei uns werden 3 benutzt)

Definition:

define shadow_east_l2 DOIF ([BM_Ost:brightness]>[d_sunlevel:shadow_level_east_2]) ({blindAutomatic("shadow","on","dummy","east","2")}) DOELSEIF ([BM_Ost:brightness]<[d_sunlevel:shadow_level_east_2]) ({blindAutomatic("shadow","off","dummy","east","2")})
attr shadow_east_l2 alias Autobeschattung Ost Level 2
attr shadow_east_l2 cmdState Beschattung ein|Beschattung aus
attr shadow_east_l2 icon fts_window_roof_shutter
attr shadow_east_l2 room Automatik
attr shadow_east_l2 wait 420:600

define shadow_east_l3 DOIF ([BM_Ost:brightness]>[d_sunlevel:shadow_level_east_3]) ({blindAutomatic("shadow","on","dummy","east","3")}) DOELSEIF ([BM_Ost:brightness]<[d_sunlevel:shadow_level_east_3]) ({blindAutomatic("shadow","off","dummy","east","3")})
attr shadow_east_l3 alias Autobeschattung Ost Level 3
attr shadow_east_l3 cmdState Beschattung ein|Beschattung aus
attr shadow_east_l3 icon fts_window_roof_shutter
attr shadow_east_l3 room Automatik
attr shadow_east_l3 wait 420:600

define shadow_east_l4 DOIF ([BM_Ost:brightness]>[d_sunlevel:shadow_level_east_4]) ({blindAutomatic("shadow","on","dummy","east","4")}) DOELSEIF ([BM_Ost:brightness]<[d_sunlevel:shadow_level_east_4]) ({blindAutomatic("shadow","off","dummy","east","4")})
attr shadow_east_l4 alias Autobeschattung Ost Level 4
attr shadow_east_l4 cmdState Beschattung ein|Beschattung aus
attr shadow_east_l4 icon fts_window_roof_shutter
attr shadow_east_l4 room Automatik
attr shadow_east_l4 wait 420:600

define shadow_east_l1 DOIF ([BM_Ost:brightness]>[d_sunlevel:shadow_level_east_1]) ({blindAutomatic("shadow","on","dummy","east","1")}) DOELSEIF ([BM_Ost:brightness]<[d_sunlevel:shadow_level_east_1]) ({blindAutomatic("shadow","off","dummy","east","1")})
attr shadow_east_l1 alias Autobeschattung Ost Level 1
attr shadow_east_l1 cmdState Beschattung ein|Beschattung aus
attr shadow_east_l1 icon fts_window_roof_shutter
attr shadow_east_l1 room Automatik
attr shadow_east_l1 wait 420:600

define shadow_west_l2 DOIF ([BM_West:brightness]>[d_sunlevel:shadow_level_west_2]) ({blindAutomatic("shadow","on","dummy","west","2")}) DOELSEIF ([BM_West:brightness]<[d_sunlevel:shadow_level_west_2]) ({blindAutomatic("shadow","off","dummy","west","2")})
attr shadow_west_l2 alias Autobeschattung West Level 2
attr shadow_west_l2 cmdState Beschattung ein|Beschattung aus
attr shadow_west_l2 icon fts_window_roof_shutter
attr shadow_west_l2 room Automatik
attr shadow_west_l2 wait 420:600

define shadow_west_l3 DOIF ([BM_West:brightness]>[d_sunlevel:shadow_level_west_3]) ({blindAutomatic("shadow","on","dummy","west","3")}) DOELSEIF ([BM_West:brightness]<[d_sunlevel:shadow_level_west_3]) ({blindAutomatic("shadow","off","dummy","west","3")})
attr shadow_west_l3 alias Autobeschattung West Level 3
attr shadow_west_l3 cmdState Beschattung ein|Beschattung aus
attr shadow_west_l3 icon fts_window_roof_shutter
attr shadow_west_l3 room Automatik
attr shadow_west_l3 wait 420:600

define shadow_west_l4 DOIF ([BM_West:brightness]>[d_sunlevel:shadow_level_west_4]) ({blindAutomatic("shadow","on","dummy","west","4")}) DOELSEIF ([BM_West:brightness]<[d_sunlevel:shadow_level_west_4]) ({blindAutomatic("shadow","off","dummy","west","4")})
attr shadow_west_l4 alias Autobeschattung West Level 4
attr shadow_west_l4 cmdState Beschattung ein|Beschattung aus
attr shadow_west_l4 icon fts_window_roof_shutter
attr shadow_west_l4 room Automatik
attr shadow_west_l4 wait 420:600

define shadow_west_l1 DOIF ([BM_West:brightness]>[d_sunlevel:shadow_level_west_1]) ({blindAutomatic("shadow","on","dummy","west","1")}) DOELSEIF ([BM_West:brightness]<[d_sunlevel:shadow_level_west_1]) ({blindAutomatic("shadow","off","dummy","west","1")})
attr shadow_west_l1 alias Autobeschattung West Level 1
attr shadow_west_l1 cmdState Beschattung ein|Beschattung aus
attr shadow_west_l1 icon fts_window_roof_shutter
attr shadow_west_l1 room Automatik
attr shadow_west_l1 wait 420:600

define shadow_south_l2 DOIF ([BM_Sued:brightness]>[d_sunlevel:shadow_level_south_2]) ({blindAutomatic("shadow","on","dummy","south","2")}) DOELSEIF ([BM_Sued:brightness]<[d_sunlevel:shadow_level_south_2]) ({blindAutomatic("shadow","off","dummy","south","2")})
attr shadow_south_l2 alias Autobeschattung Süd Level 2
attr shadow_south_l2 cmdState Beschattung ein|Beschattung aus
attr shadow_south_l2 icon fts_window_roof_shutter
attr shadow_south_l2 room Automatik
attr shadow_south_l2 wait 420:600

define shadow_south_l3 DOIF ([BM_Sued:brightness]>[d_sunlevel:shadow_level_south_3]) ({blindAutomatic("shadow","on","dummy","south","3")}) DOELSEIF ([BM_Sued:brightness]<[d_sunlevel:shadow_level_south_3]) ({blindAutomatic("shadow","off","dummy","south","3")})
attr shadow_south_l3 alias Autobeschattung Süd Level 3
attr shadow_south_l3 cmdState Beschattung ein|Beschattung aus
attr shadow_south_l3 icon fts_window_roof_shutter
attr shadow_south_l3 room Automatik
attr shadow_south_l3 wait 420:600

define shadow_south_l4 DOIF ([BM_Sued:brightness]>[d_sunlevel:shadow_level_south_4]) ({blindAutomatic("shadow","on","dummy","south","4")}) DOELSEIF ([BM_Sued:brightness]<[d_sunlevel:shadow_level_south_4]) ({blindAutomatic("shadow","off","dummy","south","4")})
attr shadow_south_l4 alias Autobeschattung Süd Level 4
attr shadow_south_l4 cmdState Beschattung ein|Beschattung aus
attr shadow_south_l4 icon fts_window_roof_shutter
attr shadow_south_l4 room Automatik
attr shadow_south_l4 wait 420:600

define shadow_south_l1 DOIF ([BM_Sued:brightness]>[d_sunlevel:shadow_level_south_1]) ({blindAutomatic("shadow","on","dummy","south","1")}) DOELSEIF ([BM_Sued:brightness]<[d_sunlevel:shadow_level_south_1]) ({blindAutomatic("shadow","off","dummy","south","1")})
attr shadow_south_l1 alias Autobeschattung Süd Level 1
attr shadow_south_l1 cmdState Beschattung ein|Beschattung aus
attr shadow_south_l1 icon fts_window_roof_shutter
attr shadow_south_l1 room Automatik
attr shadow_south_l1 wait 420:600






Das Dachfenster erhält eine eigene "Beschattungszone", da es von zwei Seiten von der Sonne beschienen wird:
(Wenn die Sonne die Südseite erreicht wird es geschlossen und wenn die Sonne die Westseite verlässt wird es wieder geöffnet)


define shadow_roof_l2 DOIF ([BM_Sued:brightness]>[d_sunlevel:shadow_level_south_3] || [BM_West:brightness]>[d_sunlevel:shadow_level_west_3]) ({blindAutomatic("shadow","on","dummy","roof","3")}) DOELSEIF ([BM_West:brightness]<[d_sunlevel:shadow_level_west_3] && [BM_Sued:brightness]<[d_sunlevel:shadow_level_south_3]) ({blindAutomatic("shadow","off","dummy","roof","3")})
attr shadow_roof_l2 alias Autobeschattung Dach Level 3
attr shadow_roof_l2 cmdState Beschattung ein|Beschattung aus
attr shadow_roof_l2 icon fts_window_roof_shutter
attr shadow_roof_l2 room Automatik
attr shadow_roof_l2 wait 420:600



Um die Paramter einzustellen und um die Funktion der dynamischen Parameter zu verstehen sind ein paar Plots nötig (siehe Anhang)
Erklärung:

  • gelb ist der gemessene Helligkeitswert des Bewegungsmelders
  • die Linien sind die errechneten Schwellwerte für die jeweilige Zone


Definition:

define SVG_ShadowLevelEast SVG logdb:SVG_ShadowLevelEast:HISTORY
attr SVG_ShadowLevelEast group Klima
attr SVG_ShadowLevelEast label "Ost 1 $data{currval1}, Ost 2 $data{currval2}, Ost 3 $data{currval3}, Ost 4 $data{currval4} ($data{currdate1})"
attr SVG_ShadowLevelEast room Automatik

define SVG_ShadowLevelSouth SVG logdb:SVG_ShadowLevelSouth:HISTORY
attr SVG_ShadowLevelSouth group Klima
attr SVG_ShadowLevelSouth label "Süd 1 $data{currval1}, Süd 2 $data{currval2}, Süd 3 $data{currval3}, Süd 4 $data{currval4} ($data{currdate1})"
attr SVG_ShadowLevelSouth room Automatik

define SVG_ShadowLevelWest SVG logdb:SVG_ShadowLevelWest:HISTORY
attr SVG_ShadowLevelWest group Klima
attr SVG_ShadowLevelWest label "West 1 $data{currval1}, West 2 $data{currval2}, West 3 $data{currval3}, West 4 $data{currval4} ($data{currdate1})"
attr SVG_ShadowLevelWest room Automatik



zugehörige PlotFiles:

# Created by FHEM/98_SVG.pm, 2016-07-30 22:38:41
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'
set ytics
set y2tics
set grid ytics
set ylabel "Beschattungslevel"
set y2label ""
set yrange [220:255]

#logdb d_sunlevel:shadow_level_east_1
#logdb d_sunlevel:shadow_level_east_2
#logdb d_sunlevel:shadow_level_east_3
#logdb d_sunlevel:shadow_level_east_4
#logdb BM_Ost:brightness

plot "<IN>" using 1:2 axes x1y1 title 'Level Ost 1' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Level Ost 2' ls l1 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Level Ost 3' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Level Ost 4' ls l3 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Sonne Ost' ls l4fill lw 1 with lines


# Created by FHEM/98_SVG.pm, 2016-07-30 22:40:24
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'
set ytics
set y2tics
set grid ytics
set ylabel "Beschattungslevel"
set y2label ""
set yrange [220:250]

#logdb d_sunlevel:shadow_level_south_1
#logdb d_sunlevel:shadow_level_south_2
#logdb d_sunlevel:shadow_level_south_3
#logdb d_sunlevel:shadow_level_south_4
#logdb BM_Sued:brightness

plot "<IN>" using 1:2 axes x1y1 title 'Level Süd 1' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Level Süd 2' ls l1 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Level Süd 3' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Level Süd 4' ls l3 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Sonne Süd' ls l4fill lw 1 with lines


# Created by FHEM/98_SVG.pm, 2016-07-30 22:36:02
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'
set ytics
set y2tics
set grid ytics
set ylabel "Beschattungslevel"
set y2label ""
set yrange [200:240]

#logdb d_sunlevel:shadow_level_west_1
#logdb d_sunlevel:shadow_level_west_2
#logdb d_sunlevel:shadow_level_west_3
#logdb d_sunlevel:shadow_level_west_4
#logdb BM_West:brightness

plot "<IN>" using 1:2 axes x1y1 title 'Level West 1' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Level West 2' ls l1 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Level West 3' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Level West 4' ls l3 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Sonne West' ls l4fill lw 1 with lines


Dummies und Notifys (siehe Anhang):

  • Notifys dienen zum übertragen der Messwerte von verschiedenen Devices auf den Dummy, damit dieser dann die Schwellwerte berechnen kann
  • Im Dummy werden die Messwerte der Helligkeitssensoren und die Aussentemperatur gesammelt und in UserReadings werden die Level für die Beschattung berechnet. Die Aussentemperatur wird verwendet, da diese die subjektive Schwelle für die Beschattung bestimmt (meine Meinung, ich lasse mich gerne etwas besseren belehren). Das führt auch automatisch dazu, wenn es draußen heißer wird, wird auch die Beschattung aggresiver. (Tag/Nacht, heiße Tage/kühle Tage, Sommer/Winter)

Überlegung meinerseits: Innentemperatur ist meiner Meinung nach ungeeigent, da zu starr. Es würde auch die Beschattung den eigenen Schwellwert ändern (die Innentemperatur (eigentlich die Steigung) ändert sich sehr schnell mit dem Aktivieren der Beschattung). Ich habe mir die Messwerte in einem Raum (Wohnzimmer, Ostseite)ein paar Tage im Hochsommer angesehen und hätte nicht gewußt, wie ich diesen Messwert objektiv verwenden könnte.
Die Aussentemperatur führte mit den richtigen Parameterwerten zu einem subjektiv sehr guten Verhalten.

Dummy:

define d_sunlevel dummy
attr d_sunlevel userattr base_east base_south base_west temp_offset_east temp_offset_south temp_offset_west dyn_east dyn_south dyn_west
attr d_sunlevel alias Sonnenintensität
attr d_sunlevel base_east 235
attr d_sunlevel base_south 235
attr d_sunlevel base_west 225
attr d_sunlevel dyn_east 0.9
attr d_sunlevel dyn_south 0.7
attr d_sunlevel dyn_west 1.9
attr d_sunlevel icon weather_sun@yellow
attr d_sunlevel readingList level_east level_south level_west temp_amb light_amb
attr d_sunlevel room Automatik
attr d_sunlevel temp_offset_east 24
attr d_sunlevel temp_offset_south 24
attr d_sunlevel temp_offset_west 24
attr d_sunlevel userReadings shadow_level_east_3 {AttrVal("d_sunlevel","base_east",0) - (ReadingsVal("d_sunlevel","temp_amb",0) - AttrVal("d_sunlevel","temp_offset_east",0))*AttrVal("d_sunlevel","dyn_east",1)*1.5},\
shadow_level_south_3 {AttrVal("d_sunlevel","base_south",0) - (ReadingsVal("d_sunlevel","temp_amb",0) - AttrVal("d_sunlevel","temp_offset_south",0))*AttrVal("d_sunlevel","dyn_south",1)*1.5},\
shadow_level_west_3 {AttrVal("d_sunlevel","base_west",0) - (ReadingsVal("d_sunlevel","temp_amb",0) - AttrVal("d_sunlevel","temp_offset_west",0))*AttrVal("d_sunlevel","dyn_west",1)*1.5},\
shadow_level_east_2 {AttrVal("d_sunlevel","base_east",0) - (ReadingsVal("d_sunlevel","temp_amb",0) - AttrVal("d_sunlevel","temp_offset_east",0)+2)*AttrVal("d_sunlevel","dyn_east",1)*1.0},\
shadow_level_south_2 {AttrVal("d_sunlevel","base_south",0) - (ReadingsVal("d_sunlevel","temp_amb",0) - AttrVal("d_sunlevel","temp_offset_south",0)+2)*AttrVal("d_sunlevel","dyn_south",1)*1.0},\
shadow_level_west_2 {AttrVal("d_sunlevel","base_west",0) - (ReadingsVal("d_sunlevel","temp_amb",0) - AttrVal("d_sunlevel","temp_offset_west",0)+2)*AttrVal("d_sunlevel","dyn_west",1)*1.0},\
shadow_level_east_1 {AttrVal("d_sunlevel","base_east",0) - (ReadingsVal("d_sunlevel","temp_amb",0) - AttrVal("d_sunlevel","temp_offset_east",0)+2)*AttrVal("d_sunlevel","dyn_east",1)*1.5},\
shadow_level_south_1 {AttrVal("d_sunlevel","base_south",0) - (ReadingsVal("d_sunlevel","temp_amb",0) - AttrVal("d_sunlevel","temp_offset_south",0)+2)*AttrVal("d_sunlevel","dyn_south",1)*1.5},\
shadow_level_west_1 {AttrVal("d_sunlevel","base_west",0) - (ReadingsVal("d_sunlevel","temp_amb",0) - AttrVal("d_sunlevel","temp_offset_west",0)+2)*AttrVal("d_sunlevel","dyn_west",1)*1.5},\
shadow_level_east_4 {AttrVal("d_sunlevel","base_east",0) - (ReadingsVal("d_sunlevel","temp_amb",0) - AttrVal("d_sunlevel","temp_offset_east",0))*AttrVal("d_sunlevel","dyn_east",1)*1.0},\
shadow_level_south_4 {AttrVal("d_sunlevel","base_south",0) - (ReadingsVal("d_sunlevel","temp_amb",0) - AttrVal("d_sunlevel","temp_offset_south",0))*AttrVal("d_sunlevel","dyn_south",1)*1.0},\
shadow_level_west_4 {AttrVal("d_sunlevel","base_west",0) - (ReadingsVal("d_sunlevel","temp_amb",0) - AttrVal("d_sunlevel","temp_offset_west",0))*AttrVal("d_sunlevel","dyn_west",1)*1.0},\


Notifys:

define n_sunlevel_east notify BM_Ost:brightness.* setreading d_sunlevel level_east $EVTPART1
attr n_sunlevel_east alias Notify Helligkeit Osten
attr n_sunlevel_east icon weather_sun@orange
attr n_sunlevel_east room Automatik

define n_sunlevel_west notify BM_West:brightness.* setreading d_sunlevel level_west $EVTPART1
attr n_sunlevel_west alias Notify Helligkeit Westen
attr n_sunlevel_west icon weather_sun@orange
attr n_sunlevel_west room Automatik

define n_sunlevel_south notify BM_Sued:brightness.* setreading d_sunlevel level_south $EVTPART1
attr n_sunlevel_south alias Notify Helligkeit Süden
attr n_sunlevel_south icon weather_sun@orange
attr n_sunlevel_south room Automatik

define n_temperature notify Wetterstation:temperature.* setreading d_sunlevel temp_amb $EVTPART1
attr n_temperature alias Notify Aussentemperatur
attr n_temperature icon temp_temperature
attr n_temperature room Automatik

define n_light notify Wetterstation:brightness.* setreading d_sunlevel light_amb $EVTPART1
attr n_light alias Notify Umgebungshelligkeit
attr n_light icon message_light_intensity
attr n_light room Automatik


Probleme
- teilweise gibt es Aktoren bei mir, die nach Tagen/Wochen/Monaten Betrieb plötzlich beim Fahren keinen Status mehr melden und somit weiß das System nicht mehr, wo das Rollo steht. Wirkt sich nur nach dem manuellen Fahren mit dem Taster aus, da fhem nach einem set den Zustand des Rollos pollt und somit der Status nach einigen Sekunden dann wieder stimmt. Abhilfe derzeit: Sicherung raus und wieder rein :-(
(@Martin: Ich war leider bis jetzt zu faul um die Fehlerbehandlung wieder zu entfernen, um die Fehler zu analysieren.)

ToDo
- Problem mit fehlendem Status von oben lösen (eq3 wurde kontaktiert --> Hardwaredefekt lt. eq3; per Software lösen(Neustart des Aktors, wenn möglich))
- Anwesenheitssimulation (!Wechselwirkungen mit Verdunkelung/Beschattung)

Scripts in der 99_myUtils.pm
(Das sind - bis auf einige Kommentare - die "ungeschönten" Scripts)

######## Konfiguration von neuen Rollos #####################
# da bei mir immer ca. 10 Stk. dazukamen, war ich zu faul sie immer händisch zu konfigurieren #
sub ConfigNewBlind
{
foreach my $dev (sort keys %defs) {
    my $devtype=AttrVal($defs{$dev}{NAME},"subType","");
    if($devtype eq "blindActuator"){
      my $blind_userattr = (AttrVal($defs{$dev}{NAME},"userattr",""));
      if($blind_userattr eq ""){
my $blind_name = $defs{$dev}{NAME};
        Log 1, "NeuesRollo: $blind_name";
fhem("attr $blind_name  userattr automatic darkening geoposition security shadow shadowposition sunlevel openedlevel closedlevel sleeping timezone");
fhem("attr $blind_name aesCommReq 1");
fhem("attr $blind_name autoReadReg 4_reqStatus");
fhem("attr $blind_name automatic on");
fhem("attr $blind_name closedlevel 0");
fhem("attr $blind_name darkening on");
fhem("attr $blind_name devStateIcon on:fts_shutter_10\@green off:fts_shutter_100\@black 9\\d+.*:fts_shutter_10 8\\d+.*:fts_shutter_20 7\\d+.*:fts_shutter_30 6\\d+.*:fts_shutter_40 5\\d+.*:fts_shutter_50 4\\d+.*:fts_shutter_60 3\\d+.*:fts_shutter_70 2\\d+.*:fts_shutter_80 1\\d+.*:fts_shutter_90 \\d.*:fts_shutter_100");
fhem("attr $blind_name event-on-change-reading aesCommToDev,aesKeyNbr,deviceMsg,level,motor,pct,powerOn,recentStateType,state,timedOn");
fhem("attr $blind_name expert 2_full");
fhem("attr $blind_name openedlevel 100");
fhem("attr $blind_name security none");
fhem("attr $blind_name shadow off");
fhem("attr $blind_name shadowposition 0");
fhem("attr $blind_name sleeping no");
fhem("attr $blind_name sunlevel 2");
fhem("attr $blind_name timezone 0");
fhem("set $blind_name assignHmKey");
fhem("set $blind_name sign on");
      }
    }
  }
}

######## Umkonfiguration von Rollos #####################
# War notwendig, da beim Entwickeln die Attribute manchmal geändert werden mussten :-) #
# Notwendige Zeilen einkommentueren und passend ändern #
sub ConfigBlind
{
foreach my $dev (sort keys %defs) {
    my $devtype=AttrVal($defs{$dev}{NAME},"subType","");
    if($devtype eq "blindActuator"){
my $blind_name = $defs{$dev}{NAME};
        Log 1, "Konfiguriertes Rollo: $blind_name";
# fhem("deleteattr $blind_name mode");
# fhem("attr $blind_name  userattr automatic darkening geoposition security shadow shadowposition sunlevel openedlevel closedlevel sleeping timezone forced_unshadow");
# fhem("attr $blind_name forced_unshadow no");
# fhem("setreading $blind_name mode undef");
# fhem("setreading $blind_name laststate undef");
# fhem("deleteattr $blind_name laststate");
    }
  }
}


######## Hilfsroutine zum Sicherstellen, dass ein Rolloaktor das set ausgeführt hat ########
# Das Rollo hat den Befehlnicht ausgeführt und ist die gewünschtePosition nicht angefahren.
# Passiert manchmal bei viel Traffic und fehlgechlagener AES-Bestätigung. statusRequest und folgendes set behebt das Problem meistens.
# siehe: https://forum.fhem.de/index.php/topic,52752.msg540399.html#msg540399
sub secureDrive($$){
my ($blind,$level) = @_;
if(index(ReadingsVal($blind,"level",""),"set_") != -1){
   fhem("set $blind statusRequest;sleep 2;set $blind $level");
   Log 1, "set_ Fehler bei: $blind";
}
}

######## Automatische Beschattung und Verdunkelung ###########
sub blindAutomatic{
my ($command,$option,$param,$geoposition,$sunlevel) = @_;
my $autocount=0; #Bei wie vielen Rollos ist die Automatik aktiv?
my $noautocount=0; #Bei wie vielen Rollos ist die Automatik nicht aktiv?
my $darkeningcount=0; #Wie viele Rollos wurden verdunkelt?
my $shadowcount=0; #Wie viele Rollos wurden beschattet?
my $blindcount=0; #Wie viele Rollos wurden verarbeitet?
my $darkened=0;
my $shadowed=0;
my $aes_delay=2.0; #Verzögerung zwischen den Rollos, um ein Überlappen der Funktelegramme zu vermeiden. Die meisten Rollos haben fast die gleiche Laufzeit -->max. Überlappung
my $cmd_delay=rand($aes_delay); #Da mehrere Zeitzonen gleichzeitig aktiv sind (z.B. Verdunkelung am Abend) werden die set-Befehle um einen Zufälligen Wert verschoben.
#vermeidet auch Überlappungenzwischen den Zeitzonen.
my $checkstate_delay=120; #Verzögerung wann kontrollert wird, ob das Rollo die gewünschte Position angefahren ist.

#Logging der Vorgänge. Aus Debugzeiten, aber es ist trotzdem interessant wann was passiert ist und kommt nicht so oft vor
if($command eq "darkening"){
  if($option eq "on"){
  Log 1, "Verdunkelung aktiviert. Zeitzone: $param";
  }elsif($option eq "off"){
  Log 1, "Verdunkelung deaktiviert. Zeitzone: $param";
  }else {Log 1, "Unbekannter Verdunkelungsmodus";}

}elsif($command eq "shadow"){
  if($option eq "on"){
  Log 1, "Beschattung aktiviert: Sonnenlevel: $sunlevel, Position: $geoposition";
  }elsif($option eq "off"){
  Log 1, "Beschattung deaktiviert: Sonnenlevel: $sunlevel, Position: $geoposition";
  }else {Log 1, "Unbekannter Beschattungsmodus";}
}


foreach my $dev (sort keys %defs) { #Alle devs durchlaufen
    my $devtype=AttrVal($defs{$dev}{NAME},"subType","");
    if($devtype eq "blindActuator") { #Alle Rolladenaktoren durchlaufen
      my $auto = AttrVal($defs{$dev}{NAME},"automatic","");
      if($auto eq "on"){ #Nur Rollos die im Automatikmodus sind berücksichtigen
        if($command eq "darkening"){ #Verdunkelungskommando aktiv 
          my $darkening = AttrVal($defs{$dev}{NAME},"darkening",""); #Ist bei diesem Rollo die Verdunkelungsautomatik eingeschaltet?
  my $blind_timezone = AttrVal($defs{$dev}{NAME},"timezone",""); #Zeitzone des Rollos lesen
          if($darkening eq "on" && $blind_timezone eq $param){ #Wenn Verdukelungsautomatik ein und Rollo liegt in der aktiven Zeitzone
            my $clevel = AttrVal($defs{$dev}{NAME},"closedlevel",""); #Wie weit soll das Rollo geschlossen werden bei der Verdunkelung?
            my $olevel = AttrVal($defs{$dev}{NAME},"openedlevel",""); #Wie weit soll es geöffent werden?
    my $blind_name = $defs{$dev}{NAME}; # Wie heißt das Rollo?
    my $blind_sleeping = AttrVal($defs{$dev}{NAME},"sleeping",""); #Handelt es sich um einen Schlafraum? (Schlafräume werden morgens nicht automatisch geöffnet)
    my $blind_level = ReadingsVal($defs{$dev}{NAME},"pct","100"); #Wo steht das Rollo gerade --> Wert wird gespeichert bei der Beschattung um ihn später wieder anzufahren.
    my $blind_security = AttrVal($defs{$dev}{NAME},"security",""); #Gibt es einen Fensterkontakt, um sich nicht auf die Terrasse zu sperren? (none --> selbstredend)
    my $blind_mode = ReadingsVal($defs{$dev}{NAME},"mode",""); #In welcher Betriebsart ist das Rollo gerade?(None, darkened, shadowed) --> davon ist abhängig was "erlaubt" ist.
       #Kein Öffenen der Rollos, wenn die Bechattung schon aktiv ist. --> ostseitige Fenster nach Sonnenaufgang 
            if($option eq "on"){ #Verdunkelung soll aktiviert werden
      my $door_state = "open"; #Sicherheitshalber die Tür als offen markieren
      if($blind_security ne "none"){ #Türe hat keinen Fensterkontakt
$door_state = ReadingsVal($blind_security,"state","open");
Log 1, "blindAutomatic: $defs{$dev}{NAME} $door_state"; #vermerken, dass die Türe offen war --> Rollo nicht schließen!
      }else {$door_state = "none";}
              if($clevel < $blind_level && $door_state ne "open"){ #Rollo muss bewegt werden, da der Level > als der ClosedLevel ist und die Türe zu bzw. gekippt ist
   #Rools werden nur bewegt, wenn der Level zu groß/klein ist, um die Motoren/Relaiskontakte zu schonen und
   #den Funkverkehr zu minimieren --> ist bei großer Anzahl der Rollos sehr wichtig!
fhem( "sleep $cmd_delay; set $defs{$dev}{NAME} $clevel" ); #anonymes at setzen für das Schließen des Rollos. Jeweils um $aes_delay verzögert.
my $checkstate_time = $checkstate_delay+$cmd_delay; #Prüfzeitpunkt für die korrekte Position festlegen
fhem( "sleep $checkstate_time; {secureDrive('$defs{$dev}{NAME}',$clevel)}"); #anonymes at für die Prüfung und evtl. nochmaliges ausführen des set-Befehls
$cmd_delay+=$aes_delay; #Zeitpunkt für das nächste Rollo festlegen
      }
      fhem( "setreading $defs{$dev}{NAME} mode darkened" ); #Mode für dieses Rollo setzen
    }elsif($option eq "off" && $blind_mode ne "shadowed"){ #Verdunkelung aufheben, aber nur wenn die Beschattung für dieses Rollo (noch) nicht aktiv ist
              if($olevel > $blind_level &&  $blind_sleeping eq "no"){ #Nur fahren, wenn es notwendig ist und dieses Rollo in keinem Schlafraum ist
fhem( "sleep $cmd_delay; set $defs{$dev}{NAME} $olevel");
                my $checkstate_time = $checkstate_delay+$cmd_delay;
                fhem( "sleep $checkstate_time; {secureDrive('$defs{$dev}{NAME}',$olevel)}");
                $cmd_delay+=$aes_delay;
      }
      fhem( "setreading $defs{$dev}{NAME} mode none" ); #Rollo ist weder beschattet, noch verdunkelt
    }else{
    } 
          }
        }elsif($command eq "shadow"){ #Beschattungsbefel aktiv
          my $shadow = AttrVal($defs{$dev}{NAME},"shadow","off"); #Beschattungsautomatik des Rolos aktiviert?
          my $blind_sunlevel = AttrVal($defs{$dev}{NAME},"sunlevel",""); #Sonnentoleranz des Rollos auslesen.
          if($shadow eq "on" && $blind_sunlevel eq $sunlevel){ #Beschattungsautomatik aktiv und Rollo soll bei dieser Sonnenintensität beschattet werden.
            my $blind_shadowposition = AttrVal($defs{$dev}{NAME},"shadowposition",""); #Beschattungsposition des Rollos lesen
            my $blind_mode = ReadingsVal($defs{$dev}{NAME},"mode",""); #Mode des Rollos auslesen
            my $blind_laststate = ReadingsVal($defs{$dev}{NAME},"laststate",""); #gespeicherte Position vor der Beschattung auslesen
    my $blind_geoposition = AttrVal($defs{$dev}{NAME},"geoposition",""); #Himmelsrichtung des Rollos auslesen
    my $blind_security = AttrVal($defs{$dev}{NAME},"security",""); #Hat das Rollo einen Fensterkontakt zugewiesen?
            my $level = ReadingsVal($defs{$dev}{NAME},"pct","100"); #Wo steht das Rollo?

            if($option eq "on" && $geoposition eq $blind_geoposition){ #Beschattung soll aktiviert werden und das Rollo ist auf der Seite die beschattet wird.
      fhem( "setreading $defs{$dev}{NAME} laststate $level"); #Speichern der aktuellen Position um später wieder dort hinzufahren
              my $door_state = "open";
              if($blind_security ne "none"){
                $door_state = ReadingsVal($blind_security,"state","open");
                Log 1, "blindAutomatic: $defs{$dev}{NAME} $door_state"; #Türe offen -->nicht schließen!
              }else {$door_state = "none";}
              if($blind_shadowposition < $level && $door_state ne "open"){ #Es ist notwendig zu fahren und die Türe ist nicht offen
fhem( "sleep $cmd_delay; set $defs{$dev}{NAME} $blind_shadowposition" );
                my $checkstate_time = $checkstate_delay+$cmd_delay;
                fhem( "sleep $checkstate_time; {secureDrive('$defs{$dev}{NAME}',$blind_shadowposition)}");
                $cmd_delay+=$aes_delay;
      }
      fhem( "setreading $defs{$dev}{NAME} mode shadowed" ); #Mode setzen -> darf z.B. morgens nicht geöffent werden wenn beschattet
      #Log 1, "blindAutomatic: $defs{$dev}{NAME} shadowed";
            }elsif($option eq "off" && $blind_mode ne "darkened" && $geoposition eq $blind_geoposition){ #Rollo öffnen,wenn nicht schon verdunkelt und die Hausseite stimmt
#Denkbar in Kinderzimmern auf der Westseite die schon (früh) verdunkelt wurden.
              if($level < $blind_laststate){# Rollo muss weiter geöffnet werden
fhem( "sleep $cmd_delay; set $defs{$dev}{NAME} $blind_laststate" );
                my $checkstate_time = $checkstate_delay+$cmd_delay;
                fhem( "sleep $checkstate_time; {secureDrive('$defs{$dev}{NAME}',$blind_laststate)}");
                $cmd_delay+=$aes_delay;
      }
      fhem( "setreading $defs{$dev}{NAME} mode none" ); #Nicht beschattet, nicht verdunkelt
      fhem( "setreading $defs{$dev}{NAME} laststate none" ); #Keine gespeichert Position nötig
      #Log 1, "blindAutomatic: $defs{$dev}{NAME} unshadowed";
            }
          }
        }elsif($command eq "unshadow"){ #Zwangsbelichtung für Schlafräume in denen vergessen wurde,
#das Rollo zu öffnen --> jugendliche Vergesslichkeit kompensieren/den Blumen was gutes tun ;-)
  my $blind_forced_unshadow = AttrVal($defs{$dev}{NAME},"forced_unshadow",""); #Zwangsbelichtung aktiv?
  my $blind_mode = ReadingsVal($defs{$dev}{NAME},"mode","");
  my $olevel = AttrVal($defs{$dev}{NAME},"openedlevel","");
  my $blind_level = ReadingsVal($defs{$dev}{NAME},"pct","");
  if($blind_forced_unshadow eq "yes"){ #Zwangsbelichtung erwünscht
    if($blind_mode eq "shadowed"){ #Wenn beschattet --> nur den gespeicherten(geschlossen) Level mit dem OpendLevel überschreiben, um das Rollo am Ende der Beschattung zu öffnen
      fhem( "setreading $defs{$dev}{NAME} laststate $olevel" );
      Log 1, "blindAutomatic: forced unshadow $defs{$dev}{NAME}: set laststate to $olevel";
    }else{
              if($olevel > $blind_level){ #nicht beschattet, aber Rollo zu --> Rollo öffnen
                fhem( "sleep $cmd_delay; set $defs{$dev}{NAME} $olevel");
Log 1, "blindAutomatic: forced unshadow $defs{$dev}{NAME}: set $olevel from $blind_level";
                my $checkstate_time = $checkstate_delay+$cmd_delay;
                fhem( "sleep $checkstate_time; {secureDrive('$defs{$dev}{NAME}',$olevel)}");
                $cmd_delay+=$aes_delay;
              }
              fhem( "setreading $defs{$dev}{NAME} mode none" ); #nicht verdunkelt, nicht beschattet
    }
  }
}
      }
    }
  }
}



Beispiel eines Rollos:

define OG_Wohnzimmer_Terrasse_Rollo CUL_HM 3FFDF5
attr OG_Wohnzimmer_Terrasse_Rollo userattr automatic darkening geoposition security shadow shadowposition sunlevel openedlevel closedlevel sleeping timezone forced_unshadow
attr OG_Wohnzimmer_Terrasse_Rollo IODev HMLAN1
attr OG_Wohnzimmer_Terrasse_Rollo IOgrp vccu:HMLAN1
attr OG_Wohnzimmer_Terrasse_Rollo aesCommReq 1
attr OG_Wohnzimmer_Terrasse_Rollo alias OG Wohnzimmer Rollo (Terrasse)
attr OG_Wohnzimmer_Terrasse_Rollo autoReadReg 5_readMissing
attr OG_Wohnzimmer_Terrasse_Rollo automatic on
attr OG_Wohnzimmer_Terrasse_Rollo closedlevel 0
attr OG_Wohnzimmer_Terrasse_Rollo darkening on
attr OG_Wohnzimmer_Terrasse_Rollo devStateIcon on:fts_shutter_10@green off:fts_shutter_100@black 9\d+.*:fts_shutter_10 8\d+.*:fts_shutter_20 7\d+.*:fts_shutter_30 6\d+.*:fts_shutter_40 5\d+.*:fts_shutter_50 4\d+.*:fts_shutter_60 3\d+.*:fts_shutter_70 2\d+.*:fts_shutter_80 1\d+.*:fts_shutter_90 \d.*:fts_shutter_100
attr OG_Wohnzimmer_Terrasse_Rollo event-on-change-reading aesCommToDev,aesKeyNbr,deviceMsg,level,motor,pct,powerOn,recentStateType,state,timedOn
attr OG_Wohnzimmer_Terrasse_Rollo expert 2_defReg+raw
attr OG_Wohnzimmer_Terrasse_Rollo firmware 2.8
attr OG_Wohnzimmer_Terrasse_Rollo forced_unshadow no
attr OG_Wohnzimmer_Terrasse_Rollo geoposition east
attr OG_Wohnzimmer_Terrasse_Rollo group Rollos OG
attr OG_Wohnzimmer_Terrasse_Rollo model HM-LC-Bl1PBU-FM
attr OG_Wohnzimmer_Terrasse_Rollo openedlevel 100
attr OG_Wohnzimmer_Terrasse_Rollo peerIDs 00000000,
attr OG_Wohnzimmer_Terrasse_Rollo room OG Wohnzimmer
attr OG_Wohnzimmer_Terrasse_Rollo security OG_Wohnzimmer_Terrasse_SEC
attr OG_Wohnzimmer_Terrasse_Rollo serialNr MEQ1098453
attr OG_Wohnzimmer_Terrasse_Rollo shadow on
attr OG_Wohnzimmer_Terrasse_Rollo shadowposition 0
attr OG_Wohnzimmer_Terrasse_Rollo sleeping no
attr OG_Wohnzimmer_Terrasse_Rollo subType blindActuator
attr OG_Wohnzimmer_Terrasse_Rollo sunlevel 2
attr OG_Wohnzimmer_Terrasse_Rollo timezone OG1
attr OG_Wohnzimmer_Terrasse_Rollo webCmd statusRequest:toggleDir:on:off:up:down:stop



Ich hoffe, dass alles halbwegs verständlich ist und würde mich über konstruktive Kritik freuen.
Dieses System ist seit dem Sommer bei mir im Einsatz und verrichtet nahezu problemlos seinen Dienst.
Sollte sich jemand, der wirklich Perl und vor allem Programmieren kann dieses Scripts annehmen, so könnte man sicher die eine oder andere Unschönheit korrigieren.
Wenn etwas unklar ist, bitte kurz melden, dann kann ich die fehlende Erklärung nachliefern.
Fürs Wiki ist mir die ganze Sache zu "quick and dirty", aber ich hoffe trotzdem dass viele von euch zumindest von einigen Ideen profitieren

Grüße
Hugo
----------------------------------------------------
FHEM in TrueNAS-Jail
HMLGW + HM-Komponenten, alexa-fhem, Modbus/TCP, Modbus/RS485, LG-WebOS, Firmata, 1wire, ESP-RGBWW, DaikinAC per WLAN, Shellys, Denon AVR, Fronius WR, Helios Wohnraumlüftung, ...

spi3845

Sehr schöne Lösung. Danke dafür!

Unter https://forum.fhem.de/index.php/topic,69704.0.html diskutieren wir generell eine Rollladensteuerung, magst Du deine Erfahrungen einbringen?

Gruß
spi