Ich versuche meine Homematic Steuerung mittels Mediola Creator so einzurichten / darzustellen, dass möglichst viel über die Oberfläche einstellbar und veränderbar ist und möglichst selten bis (im Idealfall) nie ein Eingriff in die Programme und scripte erforderlich ist.
Dazu wollte ich z.B. die Zeiten zu denen Rolläden hoch/runterfahren sowie zu denen die Bewässerung startet über die Oberfläche eingeben können. Denn diese Zeiten sind nicht unbedingt auf immer fix, sondern sollen manchmal geändert werden.
Bei der Suche nach einer Lösung bin ich auf ein Script von shk zu Bewässerungssteuerung gestoßen
viewtopic.php?f=31&t=41980
Hier werden zwei Variablen ( eine für die Stunde, eine für die Minute) zusammengeführt und mit der aktuellen Zeit verglichen, bei Übereinstimmung, wird ein Trigger auf wahr gesetzt, der dann in einem anderen Programm als Auslöser dienen kann.
Die Variablen lassen sich gut als Slider in Neo Creator abbilden und befüllen.
Ich habe das Script noch für meine Bedürnisse angepasst, um mehrere Trigger setzen und überprüfen zu können.
Erforderliche Variablen:
Zeit 1 Minute , Werteliste, 00;;;;;05;;;;;10;;;,;;15;;;,;;20;;;,;;25;;;;,;30;;;,;;35;;;,;;40;;;;,;45;;;,;;50;;;;,;55
Zeit 1 Stunde, Werteliste, 00;01;02;03;04;05;06;07;08;09;10;11;12;13;14;15;16;17;18;19;20;21;22;23
Zeit 1 Trigger, Logik, true false
Die Variablen für Minute und Stunde werden in der Neo Oberfläche entsprechend Slidern zugeordnet und dort befüllt.
Dafür ist die Minuten Variable mit Leerfeldern gefüllt. In den erweiterten Option der Slider Einstellungen ist als Intervall 0 bis 55 und ein Intervall von 5 anzugeben. Dann erhält man einen Slider, mit dem man jeweils 5 Minuten Abschnitte auswählen kann.
Für mich reicht sowohl dieses Intervall, wie auch die Tatsache, dass das Script nicht zwingend sekundengenau auslöst, sondern einen 65 Sekunden-Spielraum hat.
Für den Stundenslider 0 bis 23 und Intervall 1 einstellen.
Diese Variablen müssen entsprechend mehrfach angelegt werden, jeweils pro gewünschten Trigger.
Im Script werden dann alle Variablengruppen in die variablenliste eingetragen.
Code: Alles auswählen
!# ######################################################
!# Trigger-Variable wird gesetzt, wenn die Zeit durch Stunden- und Minutenvariable erreicht ist.
!# Daher periodisches Prüfen der Zeitvariablen nötig, dieses Skript dazu periodisch ausführen.
!#
!# Hinweis: Der Trigger wird NICHT gesetzt, wenn die Zeit auf "00:00" eingestellt ist!
!#
!# Auf die Trigger-Variable kann in anderen Programmen reagiert werden und Aktionen ausgeführt werden.
!#
!# Erstellt von A. Kos am 04.07.2017
!# erweitert von garbsen am 19.2.2019
!# erweiterung auf mehrere Trigger in einem Programm mithilfe von foreach Schleife
!# ######################################################
!# string vListe = "Name der 1. Stundenvariable vom Typ Werteliste;Name der 1. Minutenvariable vom Typ Werteliste;Name der 1.Trigger-Variable vom Typ Boolean|Name der 2. Stundenvariable vom Typ Werteliste;Name der 2. Minutenvariable vom Typ Werteliste;Name der 2.Trigger-Variable vom Typ Boolean";
!# bei mehr als 2 Triggern entsprechend erweitern und immer mit | trennen
!# default: Liste mit 6 Triggern, 3 Ventile mit jeweils 2 Schaltzeitpunkten
string vListe = "Ventil 1 Stunde 1;Ventil 1 Minute 1;Ventil 1 Trigger 1|Ventil 1 Stunde 2;Ventil 1 Minute 2;Ventil 1 Trigger 2|Ventil 2 Stunde 1;Ventil 2 Minute 1;Ventil 2 Trigger 1|Ventil 2 Stunde 2;Ventil 2 Minute 2;Ventil 2 Trigger 2|Ventil 3 Stunde 1;Ventil 3 Minute 1;Ventil 3 Trigger 1|Ventil 3 Stunde 2;Ventil 3 Minute 2;Ventil 3 Trigger 2";
!######### AB HIER MUSS NICHTS GEÄNDERT WERDEN #########
!# Variablen-Deklarationen
string hstr;
integer hint;
string zeit_sec;
integer diff;
string vTemp;
string VARSTUNDE;
string VARMINUTE;
string VARTRIGGER;
foreach(vTemp, vListe.Split("|")){
VARSTUNDE=vTemp.StrValueByIndex(";",0);
VARMINUTE=vTemp.StrValueByIndex(";",1);
VARTRIGGER=vTemp.StrValueByIndex(";",2);
!# Die beiden Variablen für Stunde und Minute auf das richtige Format bringen und in hstr schreiben
hint = web.webGetValueFromList(dom.GetObject(VARSTUNDE).ValueList(), dom.GetObject(VARSTUNDE).Variable().ToInteger()).ToInteger();
hstr = hint.ToString() + ":";
hint = web.webGetValueFromList(dom.GetObject(VARMINUTE).ValueList(), dom.GetObject(VARMINUTE).Variable().ToInteger()).ToInteger();
hstr = hstr + hint.ToString();
!# Nur Ausführen, wenn die Zeit nicht auf 00:00 eingestellt ist:
if (hstr != "00:00") {
!# Prüfen, ob die aktuelle Zeit gleich der zentral eingestellten Zeit ist. Für die Übereinstimmung darf die Differenz zwischen eingestellter und aktueller Uhrzeit nicht mehr als 65 Sekunden betragen.
zeit_sec = system.Date("%F") + " " + hstr + ":00";
diff = system.Date("%F %T").ToTime().ToInteger() - zeit_sec.ToTime().ToInteger();
if (diff < 0 ) { diff = -1 * diff; }
if (diff <= 65){
!# Trigger setzen
dom.GetObject(VARTRIGGER).State(1);
}
else
{!# Trigger setzen
dom.GetObject(VARTRIGGER).State(0);}
! nachfolgende WriteLine Zeilen können bei Bedarf zum debug aktiviert werden
!WriteLine(hstr);
}
}
!WriteLine("Hallo Welt!");
Je Trigger ist dann noch ein separates Programm erforderlich, dass beim Auslösen des Trigger (true) abgearbeitet wird. In diesem Programm muss der Trigger dann auch wieder auf false gesetzt werden, damit das Prog beim nächsten Auslösen (bei Änderung) auslöst.
Vielleicht kann jemand diese Lösung gebrauchen.
Hinweise für Verbesserungen sind natürlich gerne gesehen.