Rule erstellen
-
- Beiträge: 238
- Registriert: 29. Jul 2020 12:40
Re: Rule erstellen
Guten Morgen.
Wie wären denn hier die Zeiten zu ändern ? var Integer nRuehrwerkOn = 1 und var Integer nRuehrwerkOff = 2 ???
Wie muss ich bedienen ?
Automatikswitch aus und Dauer an ?
Schön wäre, den Switch Automatik an lassen zu können und den Switch Dauer bei bedarf auch anzuschalten.
Grüße !
Wie wären denn hier die Zeiten zu ändern ? var Integer nRuehrwerkOn = 1 und var Integer nRuehrwerkOff = 2 ???
Wie muss ich bedienen ?
Automatikswitch aus und Dauer an ?
Schön wäre, den Switch Automatik an lassen zu können und den Switch Dauer bei bedarf auch anzuschalten.
Grüße !
Openhab 2 auf RaspberryPi 4
- udo1toni
- Beiträge: 15157
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Rule erstellen
Na, die Rule legt den Timer an, sobald die Automatik eingeschaltet wird. Die Rule schaltet den Timer ab, sobald die Automatik abgeschaltet wird.
Ändert man über die UI (wo man naturgemäß passende Widgets für die beiden Items RuehrwerkZeitAn und RuehrwerkZeitAus vorsehen muss) die Zeiten (Länge der An-Phase, Länge der Aus-Phase, jeweils in vollen Minuten), so wird der Timer das beim nächsten Start übernehmen (die Rule läuft ja nur ein einziges Mal, wenn die Automatik eingeschaltet wird). Schaltet man den Dauerbetrieb ein, so schaltet der Timer das Rührwerk nicht ab. Wenn der Dauerbetrieb abgeschaltet wird, beginnt der Timer wieder mit dem Zyklus OFF-ON-OFF...
Die Steuerung ließe sich auch auf Sekunden umstellen (.plusSeconds() statt .plusMinutes()) und man könnte die Zeiteinstellung dann über die UI sekundengenau einstellen, auch verschiedene Vorgabewerte (65 Sekunden, 128 Sekunden, 4711 Sekunden...) wären über ein DropDown Menü oder einzelne Schaltflächen möglich, genau wie das Ändern der Zeit in Minuten UND Sekundenschritten, ist alles nur eine Frage der Gestaltung in der UI.
Ohne die beiden Extra Items kannst Du die Intervalle nur im Code selbst ändern, also über die beiden Variablen nRuehrwerkOn bzw. nRuehrwerkOff, das ist vor allem eine Frage des Komforts, aber beim Ändern einer *.rules Datei werden immer alle enthaltenen Rules neu eingelesen. laufende Timer werden dabei nicht abgebrochen, aber die Zeiger werden neu initialisiert, womit es dann beim Ablaufen des Timers a) zu einer NullPointerException kommt und b) der Timer nicht mehr neu eingeplant werden kann - es fehlt ja der Bezug auf den Timer.
Ändert man über die UI (wo man naturgemäß passende Widgets für die beiden Items RuehrwerkZeitAn und RuehrwerkZeitAus vorsehen muss) die Zeiten (Länge der An-Phase, Länge der Aus-Phase, jeweils in vollen Minuten), so wird der Timer das beim nächsten Start übernehmen (die Rule läuft ja nur ein einziges Mal, wenn die Automatik eingeschaltet wird). Schaltet man den Dauerbetrieb ein, so schaltet der Timer das Rührwerk nicht ab. Wenn der Dauerbetrieb abgeschaltet wird, beginnt der Timer wieder mit dem Zyklus OFF-ON-OFF...
Die Steuerung ließe sich auch auf Sekunden umstellen (.plusSeconds() statt .plusMinutes()) und man könnte die Zeiteinstellung dann über die UI sekundengenau einstellen, auch verschiedene Vorgabewerte (65 Sekunden, 128 Sekunden, 4711 Sekunden...) wären über ein DropDown Menü oder einzelne Schaltflächen möglich, genau wie das Ändern der Zeit in Minuten UND Sekundenschritten, ist alles nur eine Frage der Gestaltung in der UI.
Ohne die beiden Extra Items kannst Du die Intervalle nur im Code selbst ändern, also über die beiden Variablen nRuehrwerkOn bzw. nRuehrwerkOff, das ist vor allem eine Frage des Komforts, aber beim Ändern einer *.rules Datei werden immer alle enthaltenen Rules neu eingelesen. laufende Timer werden dabei nicht abgebrochen, aber die Zeiger werden neu initialisiert, womit es dann beim Ablaufen des Timers a) zu einer NullPointerException kommt und b) der Timer nicht mehr neu eingeplant werden kann - es fehlt ja der Bezug auf den Timer.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.4, LXC), mit openHABian eingerichtet
-
- Beiträge: 238
- Registriert: 29. Jul 2020 12:40
Re: Rule erstellen
Vielen Dank hier einmal für deine schnellen, ausführlichen Antworten und deine Geduld.
Was passiert mit dem Rührwerk, wenn ich die Automatik während "an" abschalte?
Timer wird abgeschaltet, ok. Aber läuft das Ding dann weiter?
In die UI möchte ich mich nicht begeben. Mir reicht das ändern im Code. Das wird vermutlich ein bis zwei mal der Fall sein, bis optimale Laufzeiten gegeben sind. Dann bleibt es.
Grüße.
Was passiert mit dem Rührwerk, wenn ich die Automatik während "an" abschalte?
Timer wird abgeschaltet, ok. Aber läuft das Ding dann weiter?
In die UI möchte ich mich nicht begeben. Mir reicht das ändern im Code. Das wird vermutlich ein bis zwei mal der Fall sein, bis optimale Laufzeiten gegeben sind. Dann bleibt es.
Grüße.
Openhab 2 auf RaspberryPi 4
- udo1toni
- Beiträge: 15157
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Rule erstellen
Ich zitiere aus dem Code:
Falls der Dauerbetrieb nicht aktiv ist und die Automatik abgeschaltet wird, wird auch das Rührwerk direkt abgeschaltet.
Code: Alles auswählen
if(newState == OFF && Ruehrwerkdauerbetrieb.state != ON) {
SpsDgk1RelayOutput.sendCommand(OFF)
// weitere Aufgaben beim Abschalten der Automatik
return;
}
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.4, LXC), mit openHABian eingerichtet
-
- Beiträge: 238
- Registriert: 29. Jul 2020 12:40
Re: Rule erstellen
Perfekt, danke. Das habe ich übersehen.
Rule funktioniert soweit.
Schalte ich Automatik ein wird wie geplant zwischen an und aus geschaltet.
Schalte ich während automatik ein, Relais aus auf Dauerbetrieb, passiert nichts.
Sind beide Switches an, Rührwerk aus und ich schalte Automatik aus, geht das Relais auf an.
Rule funktioniert soweit.
Schalte ich Automatik ein wird wie geplant zwischen an und aus geschaltet.
Schalte ich während automatik ein, Relais aus auf Dauerbetrieb, passiert nichts.
Sind beide Switches an, Rührwerk aus und ich schalte Automatik aus, geht das Relais auf an.
Openhab 2 auf RaspberryPi 4
-
- Beiträge: 238
- Registriert: 29. Jul 2020 12:40
- udo1toni
- Beiträge: 15157
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Rule erstellen
Wenn Du in der OFF-Phase des Automatik Betriebs auf Dauerbetrieb wechselst, wird das Rührwerk erst mit Erreichen der nächsten ON-Phase wieder gestartet, dann aber nicht mehr abgeschaltet.
Der andere Fall (Automatikbetrieb wird beendet während Dauerbetrieb aktiv ist), ist eigentlich logisch korrekt, Dauerbetrieb ist aktiv -> also Rührwerk an.
Ist aber natürlich dennoch ein fehlerhaftes Verhalten, weil durch die Art der Abfrage der Timer dann neu angelegt wird...
Ich denke, wir müssen noch mal einen Schritt zurück gehen und die exakte (gewünschte) Funktionsweise der Schalter definieren:
Dauerbetrieb: Schaltet mit Vorrang ein, unabhängig von der Position des Schalters Automatik.
Alternativ: Dauerbetrieb schaltet nur während des Automatik Betriebs das Rührwerk dauerhaft ein, ist Automatik aus, bleibt auch das Rührwerk aus.
Dann wäre der Automatik Schalter eher ein "Hauptschalter" für das Rührwerk, und der Schalter Dauerbetrieb würde lediglich zwischen Dauer-Ein und Automatik wechseln.
Als Korrektur der Funktion fehlt eigentlich nur eine Zeile, allerdings muss dadurch eine weitere Zeile angepasst werden
Deshalb noch mal die vollständige Rule, mit ausführlicher Dokumentation:
Die Rule wird nun jedes Mal gestartet, wenn einer der beiden Schalter betätigt wird. Dadurch muss nun leider statt newState der Status der beiden Items direkt verwendet werden.
Falls der Automatik Schalter als Hauptschalter dienen soll, müsstest Du den Teil && Ruehrwerkdauerbetrieb.state != ON entfernen (ich habe das im Code durch die auskommentierte zusätzliche Zeile dokumentiert)
Es gäbe übrigens noch eine weitere Möglichkeit, nämlich nur ein Item für den Schalter zu verwenden (Typ z.B. String, es ginge aber auch Number). In der UI bekommst Du dann drei Schaltflächen, Aus, An, Auto. Die Rule wird dadurch sogar etwas einfacher:
Du brauchst als Ersatz für die beiden alten Items ein neues Item RuehrwerkSteuerung, welches (hier so umgesetzt) vom Typ String ist. In der UI definierst Du Schaltflächen für die drei Betriebsmodi AUS, AN und AUTO, z.B. In einer Sitemap:
In der Main UI geht das auch mit verschiedenen Widgets, dort sieht die Konfiguration natürlich etwas anders aus.
Der andere Fall (Automatikbetrieb wird beendet während Dauerbetrieb aktiv ist), ist eigentlich logisch korrekt, Dauerbetrieb ist aktiv -> also Rührwerk an.
Ist aber natürlich dennoch ein fehlerhaftes Verhalten, weil durch die Art der Abfrage der Timer dann neu angelegt wird...
Ich denke, wir müssen noch mal einen Schritt zurück gehen und die exakte (gewünschte) Funktionsweise der Schalter definieren:
Dauerbetrieb: Schaltet mit Vorrang ein, unabhängig von der Position des Schalters Automatik.
Alternativ: Dauerbetrieb schaltet nur während des Automatik Betriebs das Rührwerk dauerhaft ein, ist Automatik aus, bleibt auch das Rührwerk aus.
Dann wäre der Automatik Schalter eher ein "Hauptschalter" für das Rührwerk, und der Schalter Dauerbetrieb würde lediglich zwischen Dauer-Ein und Automatik wechseln.
Als Korrektur der Funktion fehlt eigentlich nur eine Zeile, allerdings muss dadurch eine weitere Zeile angepasst werden

Deshalb noch mal die vollständige Rule, mit ausführlicher Dokumentation:
Code: Alles auswählen
// globale Variablen müssen zu Beginn der Datei definiert werden!
var Timer tRuehrwerk = null // Zeiger auf Timer
var Integer nRuehrwerkOn = 1 // Länge der Einschaltphase in Minuten
var Integer nRuehrwerkOff = 2 // Länge der Ausschaltphase in Minuten
rule "Rührwerk Automatik"
when
Item Ruehrwerkautomatik changed or // Automatik wurde ein- oder ausgeschaltet
Item Ruehrwerkdauerbetrieb changed // Dauerbetrieb wurde ein- oder ausgeschaltet
then
tRuehrwerk?.cancel // Timer canceln
// if(Ruehrwerkautomatik.state == OFF) { // Falls Automatik aus (Automatik = Hauptschalter)
if(Ruehrwerkautomatik.state == OFF && Ruehrwerkdauerbetrieb.state != ON) { // Falls Automatik aus und Dauer nicht an (Dauerbetrieb unabhängig von Automatik)
SpsDgk1RelayOutput.sendCommand(OFF) // schalte Rührwerk aus
return; // und beende die Rule
}
tRuehrwerk = createTimer(now, [| // Timer anlegen und sofort ausführen
var soll = OFF // definiere Fariable für Sollzustand, default OFF
if(SpsDgk1RelayOutput.state != ON) soll = ON // Falls Motor aus, soll = ON
if(Ruehrwerkdauerbetrieb.state == ON) soll = ON // Falls Dauerbetrieb, soll = ON
val zeit = if(soll == ON) nRuehrwerkOn else nRuehrwerkOff // setze Zeit abhängig von soll
if(SpsDgk1RelayOutput.state != soll) // Falls Motorzustand von soll abweicht
SpsDgk1RelayOutput.sendCommand(soll.toString) // Schalte Motor auf Sollzustand
tRuehrwerk.reschedule(now.plusMinutes(zeit)) // Plane Timerausführung erneut
])
end
Falls der Automatik Schalter als Hauptschalter dienen soll, müsstest Du den Teil && Ruehrwerkdauerbetrieb.state != ON entfernen (ich habe das im Code durch die auskommentierte zusätzliche Zeile dokumentiert)
Es gäbe übrigens noch eine weitere Möglichkeit, nämlich nur ein Item für den Schalter zu verwenden (Typ z.B. String, es ginge aber auch Number). In der UI bekommst Du dann drei Schaltflächen, Aus, An, Auto. Die Rule wird dadurch sogar etwas einfacher:
Code: Alles auswählen
// globale Variablen müssen zu Beginn der Datei definiert werden!
var Timer tRuehrwerk = null // Zeiger auf Timer
var Integer nRuehrwerkOn = 1 // Länge der Einschaltphase in Minuten
var Integer nRuehrwerkOff = 2 // Länge der Ausschaltphase in Minuten
rule "Rührwerk Steuerung"
when
Item RuehrwerkSteuerung changed
then
tRuehrwerk?.cancel // Timer canceln
switch(newState.toString) { // Item liefert State
case "AUS" : { // Zustand ist Aus
if(SpsDgk1RelayOutput.state != OFF) // falls nicht aus
SpsDgk1RelayOutput.sendCommand(OFF) // ausschalten
}
case "AN" : { // Zustand ist An
if(SpsDgk1RelayOutput.state != ON) // falls nicht an
SpsDgk1RelayOutput.sendCommand(ON) // anschalten
}
case "AUTO" : { // Zustand ist Auto
tRuehrwerk = createTimer(now, [| // timer anlegen und sofort ausführen
if(SpsDgk1RelayOutput.state != ON) { // falls nicht an
SpsDgk1RelayOutput.sendCommand(ON) // anschalten und
tRuehrwerk.reschedule(now.plusMinutes(nRuehrwerkOn)) // Timer nach An-Phase erneut ausführen
} else { // ansonsten
SpsDgk1RelayOutput.sendCommand(OFF) // ausschalten und
tRuehrwerk.reschedule(now.plusMinutes(nRuehrwerkOff)) // Timer nach Aus-Phase erneut ausführen
}
])
}
}
end
Code: Alles auswählen
Switch item=RuehrwerkSteuerung label="Rührwerk[]" mappings=["AUS"="Aus","AN"="An","AUTO"="Auto"]
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.4, LXC), mit openHABian eingerichtet
-
- Beiträge: 238
- Registriert: 29. Jul 2020 12:40
Re: Rule erstellen
So wäre mein Wunsch.
Dann muss ich wie von dir beschreiben abändern und gut?
Die schlankere Version natürlich ist auch sehr interessant.
Werde ich ausprobieren.
Openhab 2 auf RaspberryPi 4
-
- Beiträge: 238
- Registriert: 29. Jul 2020 12:40
Re: Rule erstellen
Rule funktioniert nun so, wie gewollt... Vielen Dank.
Schlankere Version scheitert.
Da wird aber beim Item gemeckert.
Missing EOF bei = glaube war es...
Schlankere Version scheitert.
Da wird aber beim Item gemeckert.
Missing EOF bei = glaube war es...
Openhab 2 auf RaspberryPi 4
- udo1toni
- Beiträge: 15157
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Rule erstellen
An welcher Stelle?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.4, LXC), mit openHABian eingerichtet