Flexible Zeitsteuerung am Beispiel Bewässerung

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
Benutzeravatar
shk
Beiträge: 18
Registriert: 02.02.2018, 08:55
Wohnort: Austria
Danksagung erhalten: 1 Mal
Kontaktdaten:

Flexible Zeitsteuerung am Beispiel Bewässerung

Beitrag von shk » 05.02.2018, 10:03

Hi!

Für viele Anwendungen ist es ja brauchbar, wenn man eine Zeitsteuerung hat, die über eine einfache Oberfläche einstellbar ist. Etwa für:
  • Rollläden
  • Bewässerung
  • Wecker
  • etc.
Dafür sollte nicht über die WebUI mit dem Zeitmodul, sondern über eine einfache Oberfläche (zB eine App oder WebMatic o.ä.) eine Zeit eingestellt werden können, bei der dann etwas passiert. Zu diesem Zweck möchte ich zwei Skripte vorstellen, mit denen das einfach und bequem geht.

Skript 1 wird periodisch aufgerufen und prüft, ob eine eingestellte Zeit mit der tatsächlichen Systemzeit übereinstimmt. Die eingestellte Zeit wird dabei über zwei Wertelisten-Variablen gesetzt, je eine für Stunde und Minute. Falls es eine Übereinstimmung gibt, dann wird eine Trigger-Variable gesetzt.
Skript 2 wird aufgerufen, wenn die Trigger-Variable gesetzt wird und führt die gewünschten Aktionen aus.


In meinem Beispiel:
Zeitgesteuerte Bewässerung mit Magnetventilen
Dafür wird zum gewünschten Bewässerungszeitpunkt die Beregnung gestartet. Die Beregnungsdauer kann ebenfalls in einer Werteliste-Variable flexibel vorgegeben werden.



Folgende Variablen sind dafür notwendig:
  • Variable für die Stunde vom Typ Werteliste, Einträge von 0 - 24.
  • Variable für die Minute vom Typ Werteliste, Einträge von 0 - 59 bzw. in 5-, 10- oder 15-Minuten-Schritten, je nach Anwendung.
  • Variale für die Einschaltdauer vom Typ Werteliste, Einträge sind Zahlenwerte in Minuten
  • Trigger-Variable vom Typ Boolean, zum Auslösen der Aktionen.

Sieht bei mir z.B. so aus:
Bild



Skript 1 - Trigger setzen
Das erste Skript wird periodisch ausgeführt. Zu jener Zeit, wo Stunde und Minute aus den oben genannten Variablen übereinstimmt, wird der Trigger gesetzt. Dieser Teil ist eben sehr universell für alle Arten von Zeitsteuerungen einsetzbar. Es müssen noch die selber definierten Variablen-Namen eingesetzt werden. In einem Programm sollte das Skript zyklisch aufgerufen werden. Hat man in der Minuten-Variable alle Minuten von 0-59 drin, dann eben 1x pro Minute. Sonst eben je nach Anforderung, beir mir reicht eben alle 5 Minuten (siehe Beispiel im Screenshot oben).
Es können auch in einem einzigen Programm, das über das Zeitmodul zyklisch aufgerufen wird mehrere Zeitprüfungen durchgeführt werden, etwa für mehrere Bewässerungsventile. Dazu kann im "dann"-Zweig das gleiche Skript mehrmals verwendet werden, nur die Variablennamen müssen richtig eingesetzt werden. Ev. die Skripte zeitlich hintereinander verzögern durch Verwendung von "verzögert um".
Das Skript macht übringens nichts, wenn eine Zeit von "00:00" (also Mitternacht) eingestellt ist. So kann die Zeitschaltung auch deaktiviert werden.

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
!# ######################################################


!# Name der Stundenvariable vom Typ Werteliste:
string VARSTUNDE = "Ventil 1 Stunde";

!# Name der Minutenvariable vom Typ Werteliste:
string VARMINUTE = "Ventil 1 Minute";

!# Name der Trigger-Variable vom Typ Boolean:
string VARTRIGGER = "Ventil 1 Trigger";



!######### AB HIER MUSS NICHTS GEÄNDERT WERDEN #########

!# Variablen-Deklarationen
string hstr;
integer hint;
string zeit_sec;
integer diff;

!# 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();

if (hint.ToInteger() < 10) {
	hstr = "0" + hint.ToString() + ":";
} else {
	hstr = hint.ToString() + ":";
}

hint = web.webGetValueFromList(dom.GetObject(VARMINUTE).ValueList(), dom.GetObject(VARMINUTE).Variable().ToInteger()).ToInteger();

if (hint.ToInteger() < 10){
	hstr = hstr + "0" + hint.ToString();
} else {
	hstr = hstr + hint.ToString();
}


!# Nur Ausführen, wenn die Zeit nicht auf 00:00 eingestellt ist:
if (hstr == "00:00") { quit; }


!# 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);
}


Skript 2 - Aktion ausführen (z.B. Bewässerung starten)
Das zweite Skript wird in einem Programm aufgerufen das durch den Trigger ausgelöst wird. Dann kommt es zur Ausführung. In meinem Beispiel wird dann das Ventil zum Bewässern geöffnet für die Dauer (in Minuten) die in der Werteliste eingestellt ist.
Screenshot zur Programm-Auslösung:
Bild

Und hier das Skript:

Code: Alles auswählen

!##########################################
!# Wenn Trigger, dann bewässern.
!# Skript wird in Programm, das auf eine Trigger-Variable (oder Zeitmodul) reagiert aufgerufen.
!#
!# Aus der Werteliste für die Dauer wird der aktuell eingestellte Wert entnommen
!# und mit 60 multipliziert. Ergibt Einschaltdauer in Sekunden. Diese wird
!# für das Ventil mit dem Datenpunkt "ON_TIME" gesetzt.
!# Dann wird einschaltet.
!#
!# Erstellt am 07.07.2017 von A.Kos
!##########################################


!# Kanalname des Aktors für das entsprechende Ventil:
string ventil = "Ventil 1";

!# Name der Variable vom Typ Werteliste mit der Beregnungsdauer in Minuten:
string dauer = "Ventil 1 Dauer";


!######### AB HIER MUSS NICHTS GEÄNDERT WERDEN #########

!# Einschaltdauer setzen:
integer hint = web.webGetValueFromList(dom.GetObject(dauer).ValueList(), dom.GetObject(dauer).Variable().ToInteger());
dom.GetObject(ventil).DPByHssDP("ON_TIME").State(hint.ToFloat() * 60.0);

!# Einschalten:
dom.GetObject(ventil).DPByHssDP("STATE").State(1);

!# Rücksetzen des Triggers
dom.GetObject(ventil + " Trigger").State(0);


Soweit so gut. Ich hoffe diese Zeilen sind brauchbar für eigene Anwendungen.

LG
Andreas



EDIT am 03.04.2018:
Habe gerade einen Fehler im Skript entdeckt, weil ich es selbst wieder einmal einsetzten wollte. Sorry: Die Variable "diff" war im Skript nicht definiert. Ein "integer diff;" hat in den Variablendeklarationen gefehlt. Ohne das wird das Skript gar nicht ausgeführt! Habe ich soeben ergänzt! ;-)
Zuletzt geändert von Roland M. am 14.02.2018, 22:19, insgesamt 1-mal geändert.
Grund: Thema verschoben
Smart Home System Integrator Smart Home Kos http://www.smarthomekos.at

Garbsen
Beiträge: 295
Registriert: 12.07.2017, 21:08
Hat sich bedankt: 1 Mal
Danksagung erhalten: 14 Mal

Re: Flexible Zeitsteuerung am Beispiel Bewässerung

Beitrag von Garbsen » 09.01.2019, 10:06

Moin

Zunächst Danke, genauso etwas habe ich gesucht.
Aber leider läuft es nicht rund, dh. Manchmal wird der trigger gesetzt meist nicht.

Hier mein Script, ich meine ich habe alles so wie es soll übernommen, die notwendigen Variablen sind formuliert.

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
!# ######################################################


!# Name der Stundenvariable vom Typ Werteliste:
string VARSTUNDE = "Zeit1Stunde";

!# Name der Minutenvariable vom Typ Werteliste:
string VARMINUTE = "Zeit1Minute";

!# Name der Trigger-Variable vom Typ Boolean:
string VARTRIGGER = "Zeit1Trigger";



!######### AB HIER MUSS NICHTS GEÄNDERT WERDEN #########

!# Variablen-Deklarationen
string hstr;
integer hint;
string zeit_sec;
integer diff;

!# 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();

if (hint.ToInteger() < 10) {
	hstr = "0" + hint.ToString() + ":";
} else {
	hstr = hint.ToString() + ":";
}

hint = web.webGetValueFromList(dom.GetObject(VARMINUTE).ValueList(), dom.GetObject(VARMINUTE).Variable().ToInteger()).ToInteger();

if (hint.ToInteger() < 10){
	hstr = hstr + "0" + hint.ToString();
} else {
	hstr = hstr + hint.ToString();
}


!# Nur Ausführen, wenn die Zeit nicht auf 00:00 eingestellt ist:
if (hstr == "00:00") { quit; }


!# 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 <= 140){
  !# Trigger setzen
  dom.GetObject(VARTRIGGER).State(1);
}
/[code]

[code]
Nun sind meine Programmierkenntnisse sehr beschränkt, daher übersehe ich eventuell etwas.
Noch ein Wunsch: kannst du Zeilen ergänzen, um die Auslösezeit in eine Variable zu schreiben, die man dann auf der Oberfläche anzeigen kann?
512 Kanäle in 101 Geräten und 145 CUxD-Kanäle in 19 CUxD-Geräten:
--------------------------------------------
http://www.eq-3.de/service/downloads.html
Tips und Tricks für Anfänger: viewtopic.php?t=22801
Programmlogik: viewtopic.php?f=31&t=4251
Webui-Handbuch: https://www.eq-3.de/Downloads/eq3/downl ... h_eQ-3.pdf
Script und Linksammlung: viewtopic.php?f=26&t=27907

Garbsen
Beiträge: 295
Registriert: 12.07.2017, 21:08
Hat sich bedankt: 1 Mal
Danksagung erhalten: 14 Mal

Re: Flexible Zeitsteuerung am Beispiel Bewässerung

Beitrag von Garbsen » 09.01.2019, 14:31

Sorry, das Problem saß mal wieder vor dem Bildschirm.
Ich habe den (meinen) Fehler gefunden. Du ergänzt im Script die Stunden 0-9 um eine führende 0, ich hatte in der Variablen die Stunden 0 - 9 jeweils schon „ganz schlau“ um eine 0 ergänzt (nicht 9 sondern 09). Dachte mir das sieht beim Schieberegler in der Oberfläche zum Einstellen besser aus.
Dadurch wurde dadurch dann natürlich 009 und damit keine Übereinstimmung mehr.
Dadurch funktionierte es immer, wenn ich es nachmittags /abends beim Basteln ausprobiert habe, weil die Stunden ja schon immer zweistellig waren.
Habe jetzt das Script einfach entsprechend geändert, dass es nicht mehr eine 0 ergänzt.
Denke jetzt sollten morgen früh die Rollos hochfahren ;-)
512 Kanäle in 101 Geräten und 145 CUxD-Kanäle in 19 CUxD-Geräten:
--------------------------------------------
http://www.eq-3.de/service/downloads.html
Tips und Tricks für Anfänger: viewtopic.php?t=22801
Programmlogik: viewtopic.php?f=31&t=4251
Webui-Handbuch: https://www.eq-3.de/Downloads/eq3/downl ... h_eQ-3.pdf
Script und Linksammlung: viewtopic.php?f=26&t=27907

Garbsen
Beiträge: 295
Registriert: 12.07.2017, 21:08
Hat sich bedankt: 1 Mal
Danksagung erhalten: 14 Mal

Re: Flexible Zeitsteuerung am Beispiel Bewässerung

Beitrag von Garbsen » 20.02.2019, 02:59

Ich nutze dieses Script mehrfach, die Möglichkeit, die Auslösezeiten über die Oberfläche (bei mir Mediola Neo Creator) einzugeben ist ideal.

Mich hat gestört, dass ich für jeden Trigger ein eigenes Programm anlegen musste.
Ich habe es daher mit einer foreach Schleife abgeändert, so kann das Prog jetzt bei jedem Start mehrere Trigger prüfen und Auslösen.

Code: Alles auswählen

!#Script 1 Zeittrigger prüfen und setzen in foreach Schleife

!# ######################################################
!# 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 Zeile kann bei Bedarf zum debug aktiviert werden  
!WriteLine(hstr);
}
}


Weitere Änderungen:

Die Prüfung ob 00:00 eingestellt ist und keine Auslösung erfolgt, musste ich in eine if Abfrage packen, da quit das Script beendet, ohne dass alle foreach Elemente abgearbeitet sind.
Die Prüfung ob ein Wert ohne führende 0 eingegeben wurde uns diese dann ergänzt wird habe ich rausgenommen.
Daher ist es bei diesem Script zwingend notwendig die Minuten und Stunden in die Variablenliste wenn einstellig, dann immer mit führender 0 einzurichten sind (nicht 1 sondern 01)

Nochmals Danke an shk für die grundlegende Arbeit
512 Kanäle in 101 Geräten und 145 CUxD-Kanäle in 19 CUxD-Geräten:
--------------------------------------------
http://www.eq-3.de/service/downloads.html
Tips und Tricks für Anfänger: viewtopic.php?t=22801
Programmlogik: viewtopic.php?f=31&t=4251
Webui-Handbuch: https://www.eq-3.de/Downloads/eq3/downl ... h_eQ-3.pdf
Script und Linksammlung: viewtopic.php?f=26&t=27907

Benutzeravatar
schnurzel59
Beiträge: 25
Registriert: 03.01.2019, 00:08

Re: Flexible Zeitsteuerung am Beispiel Bewässerung

Beitrag von schnurzel59 » 28.02.2021, 18:04

Hallo,
auch wenn das schon ein älterer Thread ist, ab und zu landet ja doch mal einer hier, eine kurze Ergänzung.
Nachdem ich auch diverse Möglichkeiten getestet habe ist mir vor längerer Zeit eine einfache App (Android) untergekommen.
Die mach genau das, was sie machen soll. Script auf der CCU wird automatisch eingerichtet. Eine Schaltuhr zum vollumfänglichen testen bzw. Dauernutzen ist kostenlos. Beliebig viele Schaltuhren kosten allerdings ein paar ct. 2 Coffee To Go weglassen und mat hat eine einfache Alternative mit einfacher aber vollkommen ausreichender Bnutzeroberfläche.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“