Rollladensteuerung: Alternativen zu DOIF

Begonnen von spi3845, 27 März 2017, 13:28:59

Vorheriges Thema - Nächstes Thema

spi3845

Zitat von: Beta-User am 27 März 2017, 17:43:50
Und ich bin ziemlich sicher, dass daran anknüpfender guter perl-Code auch in 20 Jahren noch zuverlässig seinen Dienst tun wird und nicht das Nachpflegen irgendwelcher attr brauchen wird.
Bin schon am Testen von notify statt DOIF...
Zitat von: Beta-User am 27 März 2017, 17:43:50
Ich habe HM-Hardware (Tri-State Fenstersensoren, UP-Rolladen)...
Bei Interesse kann ich gerne meine Gendanken mal zu Papier bringen, was an Elementen m.E. so zweckmäßig wäre, aber wie gesagt: Eigentlich habe ich keine Ahnung, wie man "sowas" angeht.
So geht's mir auch. Und was daraus geworden ist, ist das Code-Beispiel oben...

Zitat von: Beta-User am 27 März 2017, 17:43:50
Mach' das nicht zu oft, es macht keinen Sinn, die Leute hier gegeneinander aufzubringen!
Dar war nicht mein Ziel, Leute gegeneinander aufzubringen. Nur zu verstehen, welche Vor- und Nachteile unterschiedliche Vorgehensweisen haben. Sollte ich jemandem auf die Füße getreten sein - mea culpa. Und danke allen für das Teilen ihrer Ideen...

spi3845

Zitat von: Beta-User am 27 März 2017, 16:36:05
Bei Gelegenheit wollte ich mal eine Userreading-basierte Rolladenautomatik angehen, da gibt es leider bislang wohl nur halbgare Ansätze. Kann ich da irgendwo im Forum was finden, was mir hilft, mein (vermutlich (!) nach der commandref gebasteltes) DOIF-Konstrukt loszuwerden?
Kennst Du das? https://wiki.fhem.de/wiki/ROLLO

betateilchen

Zitat von: Beta-User am 27 März 2017, 16:36:05
@betateilchen:
Bei Gelegenheit wollte ich mal eine Userreading-basierte Rolladenautomatik angehen,

userreadings kommen in der Grusligkeits-Hitliste bei mir direkt nach DOIF & Consorten.

In meiner FHEM Installation gibt es keine userreadings - mir ist einfach noch keine sinnvolle Anwendungsmöglichkeit (geschweige denn Notwendigkeit) begegnet.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

vbs

Zitat von: betateilchen am 27 März 2017, 18:45:24
In meiner FHEM Installation gibt es keine userreadings - mir ist einfach noch keine sinnvolle Anwendungsmöglichkeit (geschweige denn Notwendigkeit) begegnet.
Gaszähler liefert Daten in m³, du möchtest jedoch lieber Readings als kWh. Wie machst du das?

betateilchen

Zitat von: vbs am 27 März 2017, 18:53:24
Gaszähler liefert Daten in m³, du möchtest jedoch lieber Readings als kWh. Wie machst du das?

Ich würde die Umrechnung vermutlich bereits in dem Modul vornehmen, von dem die readings erzeugt werden.
Falls das nicht geht, würde ich die Werte genau zu dem Zeitpunkt umrechnen, zu dem ich sie benötige. Mache ich auch bisher schon in verschiedenen Anwendungsszenarien.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

Zitat von: betateilchen am 27 März 2017, 18:45:24
In meiner FHEM Installation gibt es keine userreadings - mir ist einfach noch keine sinnvolle Anwendungsmöglichkeit (geschweige denn Notwendigkeit) begegnet.
Hast Du mir ein Stichwort, wie man "sowas" sonst zweckmäßigerweise angeht?
Irgendwie/irgendwo muß ja z.B. stehen, wann ein Rolladen aufzumachen ist. (Ja, at und weekdaytimer kenne ich, aber ich will ja nicht jedesmal das at ändern, wenn ich einen bestimmten Rolladen einer anderen Gruppe zuordnen will. Structure würde dieses Problem m.E. auch nur verlagern). Mit readings ließe sich die grafische Darstellung via readingsgroup (für die wenigen Änderungen, die erfahrungsgemäß halt hin und wieder notwendig sind) recht einfach erledigen. Aber wie bereits mehrfach betont: Ich bin perl-mäßig sowas von unbeleckt...

@spi3845:
ROLLO kenne ich, aber das scheint von einer sehr speziellen HW-Voraussetzung auszugehen und dann schwerpunktmäßig den Umgang damit abzudecken. Aber vielleicht habe ich was übersehen...
Wenn Dein Projekt jetzt eher kein DOIF mehr ist, verschiebe doch bitte den Beitrag unter anderer Bezeichnung (z.B.: Rolladensteuerung: Alternativen zu DOIF) nach Automatisierung.

Was die Userreadings angeht vielleicht noch zur Erläuterung, an was ich auf die Schnelle gedacht hätte (lasse mich aber gerne belehren, wie das alles besser geht):

Reading   Werte   Bemerkungen
AutoMode   Manual, AutoSingle, Group1, Group2, Group3   
AutoSingle7upStart      
AutoSingle8upStart      
AutoSingle7upEnd      
AutoSingle8upEnd      
      
WindowContactAssociated      
WindowContactOpenMaxClosed      
WindowContactOnHoldState   on, off   für notify bei Schließen: automatisch vollends schließen (oder öffnen?)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

betateilchen

wir sind hier langsam ziemlich offtopic
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

spi3845

Zitat von: Beta-User am 27 März 2017, 19:04:37
Was die Userreadings angeht vielleicht noch zur Erläuterung, an was ich auf die Schnelle gedacht hätte (lasse mich aber gerne belehren, wie das alles besser geht):

Reading   Werte   Bemerkungen
AutoMode   Manual, AutoSingle, Group1, Group2, Group3   
AutoSingle7upStart      
AutoSingle8upStart      
AutoSingle7upEnd      
AutoSingle8upEnd      
      
WindowContactAssociated      
WindowContactOpenMaxClosed      
WindowContactOnHoldState   on, off   für notify bei Schließen: automatisch vollends schließen (oder öffnen?)
Kannst Du kurz erläutern, welche Zustände diese userreadings darstellen sollen? Wenn ich nach AutoSingle7upEnd google, kommt als einziger Fund "Bildhübsche Polinnen". Hm.

KernSani

Vielleicht ganz kurz zum ROLLO Modul. Dem Teil gibt man die Befehle für hoch/runter und ggf. stop mit. Damit dürfte sich so ziemlich jeder Rollladen steuern lassen. Zusätzlich kann man einen ROLLO blocken - mache ich z.B. wenn Türe offen. Wenn man die Gesamtlaufzeit mitgibt berechnet ROLLO näherungsweise 10% Schritte, ich kann also z.B. auf 30% stellen. Bei mir hängen die ROLLOs in verschiedenen Structures, so kann ich einzelne Zimmer, Himmelsrichtungen oder Etagen gemeinsam schalten.
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

spi3845

Auf die schnelle eine kleine Grafik, was ich mir unter einer einfachen Rollladensteuerung vorstelle.

Aus Vereinfachungsgründen habe ich Zustände wie "Rollo fährt runter" weggelassen, genauso an vielen Stellen "manuell hoch/runter" sowie "an irgendeiner Position gestoppt (!=0%|10%|30%|100%).

Bin gespannt, was ihr für Ideen habt, um was das noch ergänz werden könnte (Wärme-/Windschutz etc.). Mein Codebeispiel am Anfang gibt das als DOIF einigermaßen wieder, aber wie gesagt, halte ich das als DOIF auf Dauer für zu komplex.

Wenn man das wiederverwendbar codieren möchte, wird man je Tür/Fenster einige Parameter speichern müssen (z.B. bei offener Tür Rollo hoch-/runterfahren ja/nein, Lüftungspositionen, zugeordnete Fensterkontakte etc.).

KernSani

Das Bild macht es recht anschaulich, was du erreichen willst... (Ich hab mir deinen DOIF Code nie wirklich genau angesehen)... Die Komplexität liegt darin, dass du einer grundsätzlich anderen Lüft-Philosophie folgst als ich ;-) Bei mir gibt es Lüften - dann ist alles auf und zwar richtig, oder nicht lüften - dann ist alles zu. Aber davon mal abgesehen:

Im Grunde hast du drei Zustände, die du auswerten musst und die bekannt sind:
* der Staus des Rollladens (den sollte der Rollladen kennen)
* den Status der Tür (den kennt die Tür)
* den Status des Timers (den kennt der Timer)

und du hast Events:
* Ein Zeitpunkt ist eingetreten (at oder DOIF)
* Der Rolladen wird manuell geschaltet (notify oder DOIF)
* Der Zustand der Tür wird geändert (notify oder DOIF)

Die Statusübergänge hast du ja schön dargestellt, also kannst du jetzt bei jedem Event deine 3 Zustände ermitteln und den entsprechenden Statusübergang anstoßen. Ob du das per at/notify oder DOIF machst und ob du ein oder viele DOIFs nutzt oder ob du eine Perl-Sub aufrufst oder ein python script, bleibt letztendlich dir überlassen.

Ich persönlich würde:
* die 3 Events getrennt behandeln (beim Event "die Sonne geht unter" willst du vielleicht noch ein Licht anschalten)
* die Verarbeitung in eine perl sub auslagern
Ich bin jetzt nicht der Perl_Profi, aber mit einem multidimensionalem Hash liesse sich dann irgendwie sowas bauen:
my %ctrl ;
$ctrl{"Rollo"}{100}{tilted}{true}{close} = "set $name 30pct";

zu lesen als: Ein event auf "Rollo", Rollo ist auf 100%, Tür ist "tilted", Timer hat die Rolläden schon runtergefahren, aktuelles Kommando ist "close", also setzte Rollo auf 30%.

nur so ein Gedanke...




RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

Beta-User

@spi3845
Zu Deinem Bild: Für Deine Rollandesteuerung könntest Du bei HM auch mein "Lasse die Jalousie oberhalb eines bestimmten Levels, wenn die Tür geöffnet ist/wird" etwas erweitern (weitere Eingangsbedingung, eine weitere Abfrage wg. des Ziellevels).
defmod Automatik_Terrassentuer_Jalousie notify Jalousie_Mitte:leve.*|Terrassentuer_EZ:ope.* IF ( [Jalousie_Mitte:level] < 55) and [Terrassentuer_EZ:state] eq "open") (set Jalousie_Mitte 60)
attr Automatik_Terrassentuer_Jalousie group Türen und Fenster
attr Automatik_Terrassentuer_Jalousie icon fts_shutter_automatic
attr Automatik_Terrassentuer_Jalousie room Esszimmer


Zu meinen Userreadings:
Hatte weniger an hübsche Osteuropäerinnen gedacht 8), sondern an eine Unterscheidung zwischen WE/Ferien ("7") und unter der Woche ("8"). Gemeint ist also z.B. "früheste Zeit am WE" und "späteste Zeit am WE", dazwischen wird über einen Helligkeitswert entschieden, wann genau der Rollanden hoch soll (bzw. dann wieder runter).
Dabei würden diese Werte nur herangezogen, wenn das "Grundreading" "AutoMode" auf Single steht, ansonsten wäre das analog aus der Gruppenzugehörigkeit abzuleiten.
Die WindowContact-Angaben hätte ich für eine generische Ablösung der obigen notify-Struktur genommen (habe aktuell 2 davon, aber eben nur für die beiden Türen mit Jalousien, nicht für alle Fenster).

@KernSani
Die HM-Teile sollte man auch entsprechend konfigurieren, die Parameter sind "driveDown", "driveTurn" und "driveUp", dann kann man da auch die %-Öffnung usw. problemlos einstellen (die Parameter werden auf dem Aktor gespeichert). Das Modul bringt also nur dann Vorteile, wenn es darüber hinaus eine Funktionalität hat (?).
Was das Coding angeht, hatte ich mir das so ähnlich vorgestellt, nur, dass eben der set-Befehl (bzw. die %-Angabe) aus den Userreadings vorher hergeleitet wird. Hoffe, das ist jetzt halbwegs nachvollziehbar dargestellt.

Ansonsten hätte ich dann noch über ein Dauer-at (alle 5 Minuten oder so) alle Rolläden durchgegangen und geprüft, ob etwas zu tun ist (Anfangszeit überschritten, Helligkeitswert über- bzw. unterschritten, späteste Zeit erreicht/überschritten).

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

lenoxef

Ich habe meine Rolloautomatik auch per DOIF geschrieben. Die Automatik greift am Ende auf das ROLLO Modul zu und wird über mehrere Dummies über eine ReadingsGroup mit den entsprechenden Parametern versorgt.

Anbei mal ein Screenshot von der ReadingsGroup. Ich hätte gern noch anstelle der Dropdowns für EIN/AUS bzw. Hand/Auto entsprechende "klickbare" Icons in der ReadingsGroup, hab es aber aktuell noch nicht hin bekommen.

Aktueller Stand: Test über die Dummys... die Reale Hardware ist noch nicht gekoppelt.. das mache ich mal an einem Wochenende.

Bei Fragen bzw. Verbesserungsvorschlägen einfach schreiben.. Danke.


Beta-User

@lenoxef:
Die ReadingsGroup sieht nicht übel aus, mir schwebt was ähnliches vor.

Dabei würde ich die 3 Gruppen, von denen ich oben gesprochen hatte (Group1, Group2, Group3) ggf. noch mit aufnehmen zur Parametrierung. Tendenz wäre jeweils als structure (Problem dabei ist, dass jeder Rollanden ausschließlich in einer der Gruppen sein sollte, muß mal checken, ob ich das (für mich praktikabel) gelöst bekomme).

Ansonsten wäre evtl. interessant, wie das/die DOIF und Dummies im Detail aussehen, und wo (außer der möglicherweise etwas hübscheren Darstellung) der Vorteil z.B. zu weekdaytimer liegt (siehe https://forum.fhem.de/index.php/topic,23655.msg206907.html#msg206907 und https://forum.fhem.de/index.php/topic,27247.0.html)?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

lenoxef

...das Ganze sieht so aus.. Wenn jemand eine Idee hat wie das Codesparender gemacht werden kann, immer her damit.

# ToDo: Rollo nicht runter fahren wenn entsprechendes Fenster geöfnet ist (Ein/Ausschaltbar)
# ToDo: Testen Testen Testen
# Todo: Funktion von der SPS nach FHEM verlagern

################################################################################################################################################
####################################################### Rollo 1 ################################################################################
################################################################################################################################################

# Rollo Dummy runter
define Rollo_Dummy_1_runter dummy
attr Rollo_Dummy_1_runter alias Rollo Dummy 1 runter
attr Rollo_Dummy_1_runter event-on-change-reading state
attr Rollo_Dummy_1_runter room Rollo

# Rollo Dummy hoch
define Rollo_Dummy_1_hoch dummy
attr Rollo_Dummy_1_hoch alias Rollo Dummy 1 hoch
attr Rollo_Dummy_1_hoch event-on-change-reading state
attr Rollo_Dummy_1_hoch room Rollo

define Rollo_Dummy_1 ROLLO
attr Rollo_Dummy_1 automatic-enabled on
attr Rollo_Dummy_1 devStateIcon offen:fts_shutter_10:geschlossen geschlossen:fts_shutter_100:offen schlitz:fts_shutter_80:geschlossen drive-up:fts_shutter_up@red:stop drive-down:fts_shutter_down@red:stop position-100:fts_shutter_100:offen position-90:fts_shutter_80:geschlossen position-80:fts_shutter_80:geschlossen position-70:fts_shutter_70:geschlossen position-60:fts_shutter_60:geschlossen position-50:fts_shutter_50:geschlossen position-40:fts_shutter_40:offen position-30:fts_shutter_30:offen position-20:fts_shutter_20:offen position-10:fts_shutter_10:offen position-0:fts_shutter_10:geschlossen
attr Rollo_Dummy_1 device 1
attr Rollo_Dummy_1 drive-down-time-to-100 5
attr Rollo_Dummy_1 drive-up-time-to-100 7
attr Rollo_Dummy_1 funktionsweise Typ2
attr Rollo_Dummy_1 genericDeviceType blind
attr Rollo_Dummy_1 homebridgeMapping CurrentPosition=invert=1 TargetPosition=invert=1
attr Rollo_Dummy_1 kanal1 Rollo_Dummy_1_hoch
attr Rollo_Dummy_1 kanal2 Rollo_Dummy_1_runter
attr Rollo_Dummy_1 room Rollo
attr Rollo_Dummy_1 webCmd offen:geschlossen:schlitz:position

# Schalter für die Automatik generell -> Als Bedingung über alles
define Rollo_Dummy_1_Automatik_Schalter dummy
attr Rollo_Dummy_1_Automatik_Schalter alias Rollo 1
attr Rollo_Dummy_1_Automatik_Schalter devStateIcon Auto:fts_shutter_automatic Hand:fts_shutter_manual
attr Rollo_Dummy_1_Automatik_Schalter room Rollo
attr Rollo_Dummy_1_Automatik_Schalter setList state:Auto,Hand
attr Rollo_Dummy_1_Automatik_Schalter webCmd Auto:Hand

# Zeit, wann das Rollo Mo-Fr hoch fahren soll
define Rollo_Dummy_1_Werktags_hoch_Zeit dummy
attr Rollo_Dummy_1_Werktags_hoch_Zeit room Rollo
attr Rollo_Dummy_1_Werktags_hoch_Zeit setList state:05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:35,06:40,06:45,06:50,06:55,07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45

# Zeit, wann das Rollo Mo-Fr runter fahren soll -> wenn "Rollo_Dummy_1_Daemmerung_Schalter" eq "off" -> sonst per Dämmerungssensor
define Rollo_Dummy_1_Werktags_runter_Zeit dummy
attr Rollo_Dummy_1_Werktags_runter_Zeit room Rollo
attr Rollo_Dummy_1_Werktags_runter_Zeit setList state:05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:35,06:40,06:45,06:50,06:55,07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45

#Position auf die das Rollo Mo-Fr runter fahren soll -> wenn "Rollo_Dummy_1_Daemmerung_Schalter" eq "off" -> sonst auf die Position "Rollo_Dummy_1_Daemmerung_Position"
define Rollo_Dummy_1_Werktags_runter_Position dummy
attr Rollo_Dummy_1_Werktags_runter_Position room Rollo
attr Rollo_Dummy_1_Werktags_runter_Position setList state:0,10,20,30,40,50,60,70,80,90,100

# Zeit, wann das Rollo in Sa+So hoch fahren soll
define Rollo_Dummy_1_Wochenende_hoch_Zeit dummy
attr Rollo_Dummy_1_Wochenende_hoch_Zeit room Rollo
attr Rollo_Dummy_1_Wochenende_hoch_Zeit setList state:05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:35,06:40,06:45,06:50,06:55,07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45

# Zeit, wann das Rollo in Sa+So runter fahren soll -> wenn "Rollo_Dummy_1_Daemmerung_Schalter" eq "off" -> sonst per Dämmerungssensor
define Rollo_Dummy_1_Wochenende_runter_Zeit dummy
attr Rollo_Dummy_1_Wochenende_runter_Zeit room Rollo
attr Rollo_Dummy_1_Wochenende_runter_Zeit setList state:05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:35,06:40,06:45,06:50,06:55,07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45

#Position auf die das Rollo Sa+So runter fahren soll -> wenn "Rollo_Dummy_1_Daemmerung_Schalter" eq "off" -> sonst auf die Position "Rollo_Dummy_1_Daemmerung_Position"
define Rollo_Dummy_1_Wochenende_runter_Position dummy
attr Rollo_Dummy_1_Wochenende_runter_Position room Rollo
attr Rollo_Dummy_1_Wochenende_runter_Position setList state:0,10,20,30,40,50,60,70,80,90,100

# Schalter für die Sonnenschutzfunktion
define Rollo_Dummy_1_Sonnenschutz_Schalter dummy
attr Rollo_Dummy_1_Sonnenschutz_Schalter room Rollo
attr Rollo_Dummy_1_Sonnenschutz_Schalter setList state:Ein,Aus
attr Rollo_Dummy_1_Sonnenschutz_Schalter webCmd Ein:Aus

# Zeit, wann das Rollo wieder hoch fahren soll
define Rollo_Dummy_1_Sonnenschutz_hoch_Zeit dummy
attr Rollo_Dummy_1_Sonnenschutz_hoch_Zeit room Rollo
attr Rollo_Dummy_1_Sonnenschutz_hoch_Zeit setList state:05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:35,06:40,06:45,06:50,06:55,07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45

# Zeit, wann das Rollo zum Sonnenschutz runterfahren soll
define Rollo_Dummy_1_Sonnenschutz_runter_Zeit dummy
attr Rollo_Dummy_1_Sonnenschutz_runter_Zeit room Rollo
attr Rollo_Dummy_1_Sonnenschutz_runter_Zeit setList state:05:00,05:15,05:30,05:45,06:00,06:15,06:30,06:35,06:40,06:45,06:50,06:55,07:00,07:05,07:10,07:15,07:20,07:25,07:30,07:45,08:00,08:15,08:30,08:45,09:00,09:15,09:30,09:45,10:00,10:15,10:30,10:45,11:00,11:15,11:30,11:45,12:00,12:15,12:30,12:45,13:00,13:15,13:30,13:45,14:00,14:15,14:30,14:45,15:00,15:15,15:30,15:45,16:00,16:15,16:30,16:45,17:00,17:15,17:30,17:45,18:00,18:15,18:30,18:45,19:00,19:15,19:30,19:45,20:00,20:15,20:30,20:45,21:00,21:15,21:30,21:45,22:00,22:15,22:30,22:45,23:00,23:15,23:30,23:45,00:00,00:15,00:30,00:45,01:00,01:15,01:30,01:45,02:00,02:15,02:30,02:45,03:00,03:15,03:30,03:45,04:00,04:15,04:30,04:45

# Position für Sonnenschutz zB 70%
define Rollo_Dummy_1_Sonnenschutz_Position dummy
attr Rollo_Dummy_1_Sonnenschutz_Position room Rollo
attr Rollo_Dummy_1_Sonnenschutz_Position setList state:0,10,20,30,40,50,60,70,80,90,100

# Schalter legt fest, ob das Rollo anstelle der in "Rollo_Dummy_1_????_runter_Zeit" eingestellten Zeit runterfahren soll wenn der Daemmerungssensor ausloest
define Rollo_Dummy_1_Daemmerung_Schalter dummy
attr Rollo_Dummy_1_Daemmerung_Schalter room Rollo
attr Rollo_Dummy_1_Daemmerung_Schalter setList state:Ein,Aus
attr Rollo_Dummy_1_Daemmerung_Schalter webCmd Ein:Aus

# Zeit, um die nach ausloesen des Daemmerungssensors verzoegert wird um das Rollo runter zu fahren
define Rollo_Dummy_1_Daemmerung_Verzoegerung_Zeit dummy
attr Rollo_Dummy_1_Daemmerung_Verzoegerung_Zeit room Rollo
attr Rollo_Dummy_1_Daemmerung_Verzoegerung_Zeit setList state:0,10,20,30,40,50,60,70,80,90,100,110,120

# Position auf die das Rollo bei Daemmerung fahren soll
define Rollo_Dummy_1_Daemmerung_Position dummy
attr Rollo_Dummy_1_Daemmerung_Position room Rollo
attr Rollo_Dummy_1_Daemmerung_Position setList state:0,10,20,30,40,50,60,70,80,90,100

# Die eigentliche Automatik...(Zeitgesteuertes Hoch und Runterfahren, Daemmerungsautomatik, Beschattungsautomatik,...)

define DOIF_Rollo_Dummy_1 DOIF ([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [([Rollo_Dummy_1_Werktags_hoch_Zeit]+[00:00])-([Rollo_Dummy_1_Werktags_hoch_Zeit]-[00:01])|0123456]) (set Rollo_Dummy_1 position 0)\
DOELSEIF\
([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [([Rollo_Dummy_1_Wochenende_hoch_Zeit]+[00:00])-([Rollo_Dummy_1_Wochenende_hoch_Zeit]-[00:01])|78]) (set Rollo_Dummy_1 position 0)\
DOELSEIF\
([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [Rollo_Dummy_1_Daemmerung_Schalter] eq "Aus" and [([Rollo_Dummy_1_Werktags_runter_Zeit]+[00:00])-([Rollo_Dummy_1_Werktags_runter_Zeit]-[00:01])]) (set Rollo_Dummy_1 position [Rollo_Dummy_1_Werktags_runter_Position])\
DOELSEIF\
([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [Rollo_Dummy_1_Daemmerung_Schalter] eq "Aus" and [([Rollo_Dummy_1_Wochenende_runter_Zeit]+[00:00])-([Rollo_Dummy_1_Wochenende_runter_Zeit]-[00:01])]) (set Rollo_Dummy_1 position [Rollo_Dummy_1_Wochenende_runter_Position])\
DOELSEIF\
([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [Rollo_Dummy_1_Daemmerung_Schalter] eq "Ein" and [Daemmerungssensor] eq "on") (set Rollo_Dummy_1 position [Rollo_Dummy_1_Daemmerung_Position])\
DOELSEIF\
([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [Rollo_Dummy_1_Sonnenschutz_Schalter] eq "Ein" and [([Rollo_Dummy_1_Sonnenschutz_runter_Zeit]+[00:00])-([Rollo_Dummy_1_Sonnenschutz_runter_Zeit]-[00:01])]) (set Rollo_Dummy_1 position [Rollo_Dummy_1_Sonnenschutz_Position])\
DOELSEIF\
([Rollo_Dummy_1_Automatik_Schalter] eq "Auto" and [Rollo_Dummy_1_Sonnenschutz_Schalter] eq "Ein" and [([Rollo_Dummy_1_Sonnenschutz_hoch_Zeit]+[00:00])-([Rollo_Dummy_1_Sonnenschutz_hoch_Zeit]-[00:01])]) (set Rollo_Dummy_1 position 0)\

attr DOIF_Rollo_Dummy_1 room Rollo
attr DOIF_Rollo_Dummy_1 wait 0:0:0:0:[Rollo_Dummy_1_Daemmerung_Verzoegerung_Zeit]:0:0
#Verzoegert den 5. Teil des DOIFs um die Zeit "Rollo_Dummy_1_Daemmerung_Verzoegerung_Zeit"