ich habe mich mit meinen Rollos beschäftigt.
Was möchte ich: Zeitgesteuert hoch bzw. runterfahren. Aber nicht vor oder nach einer bestimmten Zeit.
Ich habe dafür ein kleines Skript entwickelt:
Man kann zu einer exakten Zeit einen Timer auslösen, zu Sonnenaufgang oder Untergang.
Oder aber auch zum Maximum oder Minimum aus Zeit oder Sonnenaufgang/Untergang.
Zusätzlich kann man im gleichen Schritt auch noch einen Offset zum Sonnenuntergang oder Aufgang Hinzufügen.
Beispiel: Ich möchte mein Rolo 45 Minuten nach Sonnenaufgang aber nicht vor 7:30 aufgehen lassen:
1%07:30:00/SA=+45/MAX
Nutze Timer 1
Berechne den Sonnenaufgang, addiere 45 Minuten hinzu.
Ist die Summe < 7:30 nimm 7:30 sonst die Summe.
Code: Alles auswählen
! Zeitskript
! TimerNummer:Uhrzeit
! Timernummer:Uhrzeit/Sonnenzeit/Operator
! Timernummer: 1-16 Kanal vom CuxD-Timer
! Uhreit: hh:mm:ss
! Sonnenzeit: SA=+30 Sonnenaufgang+30Minuten (nach Sonnenuntergang) SU=-20 Sonennuntergang-20Minuten (vor Sonnenuntergang)
! Operator: MIN/MAX/SUN/TIM MIN = Minimum der Zeiten, MAX = Maximium der Zeiten, SUN = Sonnenzeit, TIM = Uhrzeit (alternativ Schreibweise 1
string timer = "1%08:00:00/SA=+0/SUN;2%18:00:00/SU=+0/SUN;"#
"3%07:30:00/SA=-60/MAX;4%08:00:00/SA=-30/MAX;"#
"5%18:30:00/SU=+30/MAX;6%19:30:00/SU=+60/MAX";
string cuxtm = "CUxD.CUX2800001";
! ################################################################
! keine Aenderungen notwendig
! ################################################################
integer sa=system.SunriseTime("%F %H:%M:%S").ToTime().ToInteger();
integer su=system.SunsetTime("%F %H:%M:%S").ToTime().ToInteger();
WriteLine("Aufgang: "#sa.ToTime());
WriteLine("Untergang: "#su.ToTime());
string tim;
foreach(tim,timer.Split(";")) {
string timNr=tim.StrValueByIndex("%", 0);
string timVal=tim.StrValueByIndex("%", 1);
string valTime=timVal.StrValueByIndex("/", 0);
string valSau=timVal.StrValueByIndex("/", 1);
string sauP1=valSau.StrValueByIndex("=", 0);
integer offset=valSau.StrValueByIndex("=", 1).ToInteger();
string valFunk=timVal.StrValueByIndex("/", 2);
string result=valTime;
integer refTime=su;
if (sauP1 == "SA") {
refTime=sa;
}
refTime=refTime+offset*60;
if (valFunk == "SUN") { ! SONNE-Zeit
result=refTime.ToTime().Format("%H:%M:%S");
}
if (valFunk == "TIM") { ! Exakte-Zeit
result=valTime;
}
if (valFunk == "MAX") { ! Maximun aus Zeit
integer abstime=(system.SunsetTime("%F ")#valTime).ToTime().ToInteger();
if (abstime<refTime) {
result=refTime.ToTime().Format("%H:%M:%S");
} else {
result=valTime;
}
}
if (valFunk == "MIN") { ! Minimum aus Zeit
integer abstime=(system.SunsetTime("%F ")#valTime).ToTime().ToInteger();
if (abstime>refTime) {
result=refTime.ToTime().Format("%H:%M:%S");
} else {
result=valTime;
}
}
WriteLine(tim # "-> "# result);
string obj=cuxtm#":"#timNr#".TIMER_SET";
dom.GetObject(obj).State(result);
}
Ich hab es auf 12:00 Mittage gelegt. Warum: Wenn ich morgens erst später die Timer per Hand stellen möchte so kann ich das ab 12:00 machen. Anschließend laufen die am nächsten morgen wie eingestellt. Die Timer am Abend kann ich ab 12:00 ändern. passt für mich auch.
Ein Beispiel eines Rollos - besser in zwei einzelne Skripte auslagern! So sieht der Timer aus So sieht meine Oberfläche dazu aus: