Ich hab mir die Version von Luckysnooze auf meine Bedürfnisse angepasst und stelle meine Version hier mal zur Verfügung. Ist noch nicht ganz schön, aber funktioniert und vor allem braucht man kein SSH, es läuft alles als Homematic Script.
Da ich im Script noch prüfe ob Wochenende oder Feiertag ist, ist die Systemvariablen Feiertag_heute notwendig. Das passende Feiertags-Script von Peter Beck findet man auch hier im Forum.
Zudem habe ich die Systemvariablen an meine Bedürfnisse angepasst (umbenannt mit S_, bzw. auch entfernt), wer das nicht mag kann es ja wieder ändern.
Es ist auch ein Backup implementiert, falls der REST Service einen Fehler zurück gibt, dann werden die Spätestens- und Frühestens-Zeiten genutzt.
Da ich das Script für meine Anwesenheitssimulation nutze, habe ich in v3 jetzt ein Zufallselement eingebaut, welches entweder den Offset zufällig setzt und bei den Frühestens- und Spätestens-Zeiten eine Varianz von 30 min hinzufügt.
Für die Daten nutze ich die den REST Service von sunrise-sunset.org. Die API ist hier zu finden:
http://sunrise-sunset.org/api.
Für den Zufallswert wird die Webseite
https://www.random.org genutzt.
Hier nochmal die Kurzanleitung:
1. Systemvariablen anlegen
2. CUxD Timer und Exec einrichten
3. Script per Programm täglich laufen lassen, möglichst nach 3 Uhr und vor dem Sonnenaufgang
Code: Alles auswählen
!# Astro Daten holen - Zeitpunkte setzen V1.05.3
!# folgende Variablen werden benötigt: S_Sonnenaufgang
!# S_Sonnenuntergang
!# S_Sonnenhochstand
!# S_Tageslaenge
!# S_BeginBuergDaemm
!# S_EndBuergDaemm
!# S_BeginNautDaemm
!# S_EndNautDaemm
!# S_BeginAstroDaemm
!# S_EndAstroDaemm
!# S_RolladenZu
!# S_RolladenAuf
!# Feiertag_heute
! -------------------- Schliessen Anpassungen ---------------------
! S_Sonnenuntergang -> S_EndBuergDaemm -> S_EndNautDaemm -> S_EndAstroDaemm
var Zeit1_Zu = "S_Sonnenuntergang"; ! (Fruehere Zeit)
var Zeit2_Zu = "S_EndBuergDaemm"; ! (Spaetere Zeit)
var Offset_Zu = 85.0; ! (0.0 -> 100.0 %)
boolean random_Zu = true; !Offset_Zu als Zufallszahl und Spaet_Zu mit 30 min Varianz nach unten, sonst Festwert Offset_Zu
var Spaet_Zu = "21:00"; ! (Spaetester Schliessenzeitpunkt HH:MM)
var Spaet_Zu_frei = "22:00"; ! (Spaetester Schliessenzeitpunkt an Wochenenden/Feiertagen HH:MM)
! ---------------------- Oeffnen Anpassungen ----------------------
! S_BeginAstroDaemm -> S_BeginNautDaemm -> S_BeginBuergDaemm -> S_Sonnenaufgang
var Zeit1_Auf = "S_BeginBuergDaemm"; ! (Fruehere Zeit)
var Zeit2_Auf = "S_Sonnenaufgang"; ! (Spaetere Zeit)
var Offset_Auf = 15.0; ! (0.0 -> 100.0 %)
boolean random_auf = true; ! Offset_Auf als Zufallszahl und Frueh_Auf mit 30 min Varianz nach oben, sonst Festwert Offset_Auf
var Frueh_Auf = "06:30"; ! (Fruehester Oeffnenzeitpunkt HH:MM)
var Frueh_Auf_frei = "07:30"; ! (Fruehester Oeffnenzeitpunkt an Wochenende/Feiertagen HH:MM)
! ------------------------ Ende Anpassung -------------------------
string sunsetUrl;
string Zeitpunkte;
string ReturnClean = "";
string ReturnList;
string Tmp;
string okStatus = "\"status\":\"OK\"";
string quoteSign = "\""; !"
integer Zaehler;
string Wert;
var cmd;
var Return;
var Rolladen_Zu;
var Rolladen_Auf;
! Befehl zusammenbauen
sunsetUrl = "http://api.sunrise-sunset.org/json?lat=" # system.Latitude() # "&lng=" # system.Longitude() # "&formatted=0&date=" # system.Date("%F");
cmd = "wget -q -O - '" # sunsetUrl # "'";
! Befehl ausfuehren: Werte von Website holen
dom.GetObject("CUxD.CUX2801001:7.CMD_SETS").State(cmd);
dom.GetObject("CUxD.CUX2801001:7.CMD_QUERY_RET").State(1);
Return = dom.GetObject("CUxD.CUX2801001:7.CMD_RETS").State();
! Ergebnis des Aufrufs prüfen
if (Return.Find(okStatus) > 1) {
! Anführungszeichen entfernen
foreach(Wert, Return.Split(quoteSign)) {
ReturnClean = ReturnClean # Wert;
};
! Liste erzeugen
ReturnList = ReturnClean.Substr(10,ReturnClean.Length()-22); ! 10 + 12 vorne und hinten JSon abschneiden
! Werte auslesen und in Systemvariablen schreiben
Zeitpunkte = "S_Sonnenaufgang,S_Sonnenuntergang,S_Sonnenhochstand,S_Tageslaenge,S_BeginBuergDaemm,S_EndBuergDaemm,S_BeginNautDaemm,S_EndNautDaemm,S_BeginAstroDaemm,S_EndAstroDaemm";
Zaehler = 0;
foreach(Wert, Zeitpunkte.Split(",")) {
Tmp = ReturnList.StrValueByIndex(",", Zaehler);
Tmp = Tmp.Substr(Tmp.Find(":") + 1);
if (Wert != "S_Tageslaenge") {
! Umrechnung auf aktuelle Zeitzone
Tmp = Tmp.StrValueByIndex("T", 0) # " " # Tmp.StrValueByIndex("T", 1).StrValueByIndex("+", 0);
var uhrzeit = Tmp.ToTime().ToInteger();
var zeitzone = (system.Date("%z").Substr(1,2).ToInteger())*3600 + system.Date("%z").Substr(3,2).ToInteger();
var lokaleUhrzeit;
if (system.Date("%z").Substr(0,1) == "+") {
lokaleUhrzeit = uhrzeit + zeitzone;
} else {
lokaleUhrzeit = uhrzeit - zeitzone;
}
Tmp = lokaleUhrzeit.ToTime();
} else {
! Umrechnung in hh:mm:ss
var tageslaenge = 0.0 + Tmp.ToInteger();
var stunden = 1 * tageslaenge / 3600;
var minuten = 1 * (((tageslaenge / 3600) - stunden) *60) ;
var sekunden = 1 * ((((tageslaenge / 3600) - stunden) *60) - minuten) * 60;
Tmp = stunden # ":" # minuten # ":" # sekunden;
}
dom.GetObject(Wert).State(Tmp);
Zaehler = Zaehler + 1;
WriteLine(Wert # ": " # Tmp);
}
! Prüfung ob Wochenende oder Feiertag
if ((dom.GetObject("Feiertag_heute").Variable() == true) ||
(system.Date("%w").ToInteger() == 6) ||
(system.Date("%w").ToInteger() == 0)) {
Frueh_Auf = Frueh_Auf_frei;
Spaet_Zu = Spaet_Zu_frei;
}
!Zufallssteuerung für Zu
if (random_Zu) {
string randomNumURL = "https://www.random.org/decimal-fractions/?num=1&dec=2&col=2&format=plain&rnd=new";
string randCmdSSL = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -k -L '" # randomNumURL # "'";
! Befehl ausfuehren: Werte von Website holen
dom.GetObject("CUxD.CUX2801001:5.CMD_SETS").State(randCmdSSL);
dom.GetObject("CUxD.CUX2801001:5.CMD_QUERY_RET").State(1);
var randomNum = 0.0 + dom.GetObject("CUxD.CUX2801001:5.CMD_RETS").State();
if ((randomNum >= 0) && (randomNum <= 1)) {
Offset_Zu = 0.0 + randomNum * 100;
integer offsetMinutes = 0 + randomNum * 30;
if (offsetMinutes < 10) {
offsetMinutes = "0" # offsetMinutes;
}
WriteLine("Random Offset Zu: " # Offset_Zu);
Spaet_Zu = (((("2000-01-01 " # Spaet_Zu # ":00").ToTime() - (("1970-01-01 00:" # offsetMinutes # ":00").ToTime() + 3600))).Format("%H:%M"));
}
}
!Zufallssteuerung für auf
if (random_auf) {
string randomNumURL = "https://www.random.org/decimal-fractions/?num=1&dec=2&col=2&format=plain&rnd=new";
string randCmdSSL = "LD_LIBRARY_PATH=/usr/local/addons/cuxd /usr/local/addons/cuxd/curl -s -k -L '" # randomNumURL # "'";
! Befehl ausfuehren: Werte von Website holen
dom.GetObject("CUxD.CUX2801001:5.CMD_SETS").State(randCmdSSL);
dom.GetObject("CUxD.CUX2801001:5.CMD_QUERY_RET").State(1);
var randomNum = 0.0 + dom.GetObject("CUxD.CUX2801001:5.CMD_RETS").State();
if ((randomNum >= 0) && (randomNum <= 1)) {
Offset_Auf = 0.0 + randomNum * 100;
integer offsetMinutes = 0 + randomNum * 30;
if (offsetMinutes < 10) {
offsetMinutes = "0" # offsetMinutes;
}
WriteLine("Random Offset Auf: " # Offset_Auf);
Frueh_Auf = (((("2000-01-01 " # Frueh_Auf # ":00").ToTime() + (("1970-01-01 00:" # offsetMinutes # ":00").ToTime() + 3600))).Format("%H:%M"));
}
}
! 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 = Zeit1_Zu.ToTime().ToInteger();
Zeit2_Zu = Zeit2_Zu.ToTime().ToInteger();
Spaet_Zu = system.Date("%F") # " " # 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;
}
! Oeffnen - Zeit berechnen und mit Frueh_Auf vergleichen
Zeit1_Auf = dom.GetObject(Zeit1_Auf).Variable();
Zeit2_Auf = dom.GetObject(Zeit2_Auf).Variable();
! Oeffnen - Datum und Zeiten in Ganzzahl wandeln
Zeit1_Auf = Zeit1_Auf.ToTime().ToInteger();
Zeit2_Auf = Zeit2_Auf.ToTime().ToInteger();
Frueh_Auf = system.Date("%F") # " " # 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;
}
} else {
! Backup-Lösung falls REST_Service Fehler zurück gibt
Spaet_Zu = system.Date("%F") # " " # Spaet_Zu;
Spaet_Zu = Spaet_Zu.ToTime().ToInteger();
Rolladen_Zu = Spaet_Zu;
Frueh_Auf = system.Date("%F") # " " # Frueh_Auf;
Frueh_Auf = Frueh_Auf.ToTime().ToInteger();
Rolladen_Auf = Frueh_Auf;
system.Exec("logger -t script -p user.debug Rollosteuerung konnte keine neuen Werte lesen Backup Werte werden verwendet");
}
! Schliessen - Zeit von Ganzzahl nach HH:MM:SS wandeln
Rolladen_Zu = Rolladen_Zu.ToTime().Format("%T");
!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("S_RolladenZu").State(Rolladen_Zu);
dom.GetObject("CUxD.CUX2800001:1.TIMER_SET").State(Rolladen_Zu);
WriteLine(Rolladen_Zu);
dom.GetObject("S_RolladenAuf").State(Rolladen_Auf);
dom.GetObject("CUxD.CUX2800001:2.TIMER_SET").State(Rolladen_Auf);
WriteLine(Rolladen_Auf);
P.S.: Wer einen schöneren Weg kennt um JSON/XML zu parsen, immer raus damit!
Edit 1: Klammern gesetzt, da Wochenendabfrage nicht funktioniert hat.
Edit 2: Zufallswerte hinzugefügt.
Edit 3: Script sollte nach 3 Uhr laufen, damit die Zeitumstellung berücksichtigt wird.