Da ein Bekannter von mir die HomeMatic-Steuerung auf meinem Raspberry-Pi gesehen hat, kam er auf die Idee so etwas für seine Rolladensteuerung zu benutzen. Nachdem ich im Netz etwas gesucht hatte, bin ich schließlich hier bei der "Ultimativen Rolladensteuerung" gelandet. Vom Konzept überzeugt, installierte ich die Geschichte und machte mich dann als Script-Newbie daran die Script-Funktionen zu verstehen (gibt es eigentlich irgendwo eine vollständige Dokumentation sämtlicher Befehle und Optionen?). Absicht war es, eine Rolladen-Öffnen und eine Frühestens-Spätestens-Funktion hinzuzufügen und einige Scriptteile zu verschlanken. Während des Programmierens fiel mir dann auf, dass einige vom Web geholten Zeiten nur 3-Stellig waren, was dem .ToTime() Befehl durchaus Probleme bereitet und angepasst werden musste. Herausgekommen ist unten stehendes Script. Da es auf der Idee von Linuzer basiert, möchte ich es hier zur Verfügung stellen. Wenn jemand noch Fehler findet - bitte posten.
Zur Einrichtung:
Punkt 1 -> 3 wie bei Linuzer
Punkt 4:
Systemvariablen für die Steuerung anlegen:
Rolladen_Zu_Basis (Zeichenkette) Name der obigen Variable, die als Ausgangszeitpunkt für die Rolläden dienen soll. (z.B. "Sonnenuntergang")
Rolladen_Zu_Offset (Zahl 0/100 %) Prozentwert, um den der Rolladenzeitpunkt in Richtung des nächsten Zeitpunkts verschoben werden soll. "100%" ist identisch mit dem nächsten Zeitpunkt.
Beispiel:
Sonnenuntergang = 17:40, EndBuergDaemm = 18:10, Rolladen_Zu_Basis = "Sonnenuntergang", Rolladen_Zu_Offset = 60%
Somit wird auf die Sonnenuntergangszeit (17:40) 60% der Zeitspanne zu EndBuergDaemm (30 Min.) draufgeschlagen, die Rolläden fahren also um 17:58 runter.
Rolladen_Auf_Basis (Zeichenkette) Name der obigen Variable, die als Ausgangszeitpunkt für die Rolläden dienen soll. (z.B. "BeginBuergDaemm")
Rolladen_Auf_Offset (Zahl 0/100 %) Prozentwert, um den der Rolladenzeitpunkt in Richtung des nächsten Zeitpunkts verschoben werden soll. "100%" ist identisch mit dem nächsten Zeitpunkt.
Beispiel:
BeginBuergDaemm = 7:10, Sonnenaufgang = 7:40, Rolladen_Auf_Basis = "BeginBuergDaemm", Rolladen_Auf_Offset = 20%
Somit wird auf die BeginBuergDaemmZeit (7:10) 20% der Zeitspanne zum Sonnenaufgang (30 Min.) draufgeschlagen, die Rolläden fahren also um 7:16 rauf.
RolladenAuf (Zeichenkette) Dynamisch errechneter Öffnen-Zeitpunkt, nur zur Info
RolladenZu (Zeichenkette) Dynamisch errechneter Schließen-Zeitpunkt, nur zur Info
Punkt 5:
Ein "Rolläden schließen" Programm erstellen, das alle Rolläden zum Timer_Event des CUxD.CUX2800001:1-Timers runterfährt. (TriggerRolladen:1)
Ein "Rolläden öffnen" Programm erstellen, das alle Rolläden zum Timer_Event des CUxD.CUX2800001:2-Timers rauffährt. (TriggerRolladen:2)
Punkt 6 wie bei Linuzer
Punkt 7:
HomeMatic-Script "AstroDatenHolen" erstellen und auf tägliche Ausführung um z.B. 01:45 programmieren. Zu diesem Zeitpunkt muss eine Internet-Verbindung bestehen. (Zwangstrennung des I-Net Providers beachten). Am Anfang des Scriptes die persönlichen Einstellungen treffen. Beachte Uhrzeit-Angaben müssen im Format HH:MM vorliegen.
Code: Alles auswählen
! Astro Daten holen - Zeitpunkte setzen V1.05
! -------------------- Schliessen Anpassungen ---------------------
! Sonnenuntergang -> EndBuergDaemm -> EndNautDaemm -> EndAstroDaemm
var Zeit1_Zu = "Sonnenuntergang"; ! (Fruehere Zeit)
var Zeit2_Zu = "EndBuergDaemm"; ! (Spaetere Zeit)
var Offset_Zu = 85.0; ! (0.0 -> 100.0 %)
var Spaet_Zu = "22:00"; ! (Spaetester Schliessenzeitpunkt HH:MM)
! ---------------------- Oeffnen Anpassungen ----------------------
! BeginAstroDaemm -> BeginNautDaemm -> BeginBuergDaemm -> Sonnenaufgang
var Zeit1_Auf = "BeginBuergDaemm"; ! (Fruehere Zeit)
var Zeit2_Auf = "Sonnenaufgang"; ! (Spaetere Zeit)
var Offset_Auf = 15.0; ! (0.0 -> 100.0 %)
var Frueh_Auf = "06:30"; ! (Fruehester Oeffnenzeitpunkt HH:MM)
! ------------------------ Ende Anpassung -------------------------
var Grad;
var Min;
var Sek;
var Rest;
var Long;
var Lat;
var cmd;
var Return;
string Zeitpunkte;
integer Zaehler;
string Wert;
string Tmp;
var val;
var Rolladen_Zu;
var Rolladen_Auf;
! Aktuelles Datum im Format JJJJ-MM-TT
var System_Datum = system.Date("%F");
! Laengengrad auslesen und von Dezimal nach Grad:Min:Sek.Hdstl wandeln
Grad = 1 * system.Longitude();
Rest = (system.Longitude() - Grad) + 0.0000001;
Min = 1 * Rest * 60;
Rest = (Rest * 60) - Min;
Sek = Rest * 60;
Long = Grad # ":" # Min # ":" # Sek.ToString(2);
! Breitengrad auslesen und von Dezimal nach Grad:Min:Sek.Hdstl wandeln
Grad = 1 * system.Latitude();
Rest = (system.Latitude() - Grad) + 0.0000001;
Min = 1 * Rest * 60;
Rest = (Rest * 60) - Min;
Sek = Rest * 60;
Lat = Grad # ":" # Min # ":" # Sek.ToString(2);
! Befehl zusammenbauen
cmd = "/usr/local/GetAstroDates.sh " # Long # " " # Lat;
! Befehl ausfuehren: Werte von Website holen
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
Return = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
! Werte um Steuerzeichen kuerzen
Return = Return.Substr(0, Return.Length() - 1);
! Werte auslesen und in Systemvariablen schreiben
Zeitpunkte = "Sonnenaufgang,Sonnenuntergang,BeginBuergDaemm,EndBuergDaemm,BeginNautDaemm,EndNautDaemm,Tageslaenge,BeginAstroDaemm,EndAstroDaemm";
Zaehler = 0;
foreach(Wert, Zeitpunkte.Split(",")) {;
Tmp = Return.StrValueByIndex(";", Zaehler).StrValueByIndex("-", 1);
val = 100 + Tmp.StrValueByIndex(".", 1).ToInteger() * 6;
Tmp = Tmp.StrValueByIndex(".", 0) # ":" # val.ToString().Substr(1, 2);
dom.GetObject(Wert).State(Tmp);
Zaehler = Zaehler + 1;}
! Schreibe Rolladen-Konfiguration in Systemvariablen
dom.GetObject("Rolladen_Zu_Basis").State(Zeit1_Zu);
dom.GetObject("Rolladen_Zu_Offset").State(Offset_Zu);
dom.GetObject("Rolladen_Auf_Basis").State(Zeit1_Auf);
dom.GetObject("Rolladen_Auf_Offset").State(Offset_Auf);
! Schliessen - Zeiten einlesen
Zeit1_Zu = dom.GetObject(Zeit1_Zu).Variable();
Zeit2_Zu = dom.GetObject(Zeit2_Zu).Variable();
! Schliessen - Datum und Zeiten in Ganzzahl wandeln
Zeit1_Zu = System_Datum # " " # Zeit1_Zu;
Zeit1_Zu = Zeit1_Zu.ToTime().ToInteger();
Zeit2_Zu = System_Datum # " " # Zeit2_Zu;
Zeit2_Zu = Zeit2_Zu.ToTime().ToInteger();
Spaet_Zu = System_Datum # " " # Spaet_Zu;
Spaet_Zu = Spaet_Zu.ToTime().ToInteger();
! Schliessen - Zeit berechnen und mit Spaet_Zu vergleichen
Rolladen_Zu = Zeit1_Zu + (0.0 + Zeit2_Zu - Zeit1_Zu) * Offset_Zu / 100.0;
if (Rolladen_Zu > Spaet_Zu) {Rolladen_Zu = Spaet_Zu;}
! Schliessen - Zeit von Ganzzahl nach HH:MM:SS wandeln
Rolladen_Zu = Rolladen_Zu.ToTime().Format("%T");
! Oeffnen - Zeiten einlesen
Zeit1_Auf = dom.GetObject(Zeit1_Auf).Variable();
Zeit2_Auf = dom.GetObject(Zeit2_Auf).Variable();
! Oeffnen - Datum und Zeiten in Ganzzahl wandeln
Zeit1_Auf = System_Datum # " " # Zeit1_Auf;
Zeit1_Auf = Zeit1_Auf.ToTime().ToInteger();
Zeit2_Auf = System_Datum # " " # Zeit2_Auf;
Zeit2_Auf = Zeit2_Auf.ToTime().ToInteger();
Frueh_Auf = System_Datum # " " # Frueh_Auf;
Frueh_Auf = Frueh_Auf.ToTime().ToInteger();
! Oeffnen - Zeit berechnen und mit Frueh_Auf vergleichen
Rolladen_Auf = Zeit1_Auf + (0.0 + Zeit2_Auf - Zeit1_Auf) * Offset_Auf / 100.0;
if (Rolladen_Auf < Frueh_Auf) {Rolladen_Auf = Frueh_Auf;}
!Oeffnen - Zeit von Ganzzahl nach HH:MM:SS wandeln
Rolladen_Auf = Rolladen_Auf.ToTime().Format("%T");
! Schliessen und Oeffnen Zeiten speichern und Timer setzen
dom.GetObject("RolladenZu").State(Rolladen_Zu);
dom.GetObject("CUxD.CUX2800001:1.TIMER_SET").State(Rolladen_Zu);
dom.GetObject("RolladenAuf").State(Rolladen_Auf);
dom.GetObject("CUxD.CUX2800001:2.TIMER_SET").State(Rolladen_Auf);
Update 28.02.16 V1.02: Antwort-String um Steuerzeichen gekürzt
Update 03.03.16 V1.03: Kleinere Korrekturen
Update 02.05.16 V1.05: Fehler in der Umrechnung der Geodaten behoben
Punkt 8 hoffentlich auch wie bei Linuzer
@ Linuzer
Beim Studieren Deines Script sind mir zwei kleine "Fehler" aufgefallen:
Zeile 045: ! Befehl ausführen: -> hier müsste das ü gegen ue ersetzt werden
Zeile 128: RollZeit2 = "Sonnenuntergang,EndBuergDaemm,EndNautDaemm,EndAtroDaemm,BeginAtroDaemm -> hier fehlt jeweils das "s" bei Astro
Gruß
Luckysnooze