Beregnung Timer

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Beregnung Timer

Beitrag von Pepe1907 »

udo1toni hat geschrieben: 17. Jun 2020 23:34 Kann es sein, dass ich das mal in einem anderen Thread erläutert habe? Die Timer in dieser Form zu verwenden ist Mist.
Wenn Du mit zwei Timern arbeiten willst, ist das ok (obwohl unnötig), aber zumindest solltest Du die Kontrolle über die Timer behalten:

Code: Alles auswählen

var Timer tEins = null
var Timer tZwei = null

rule "Beregnung"
when 
    Time cron "0 0 21 * * ?"
then
    logInfo("watering","Es ist 21 Uhr. Zeit für Bewässrung.")
    if (beregnung.state != ON) {
        logInfo("watering","Aber Beregnungsautomatik abgeschaltet.")
        return;
    }
    if (LocalWeatherAndForecast_ForecastHours24_MaximaleTemperatur.state < 15 | °C ){
        logInfo("watering","Aber zu kalt.")
        return;
    }
    if (rainYesterday.state > 10 | mm){
        logInfo("watering","Aber es hat ausreichend geregnet.")
        return;
    }
    channel1.sendCommand(ON)
    channel2.sendCommand(ON)
    channel3.sendCommand(ON)
    channel5.sendCommand(OFF)
    teich.sendCommand(OFF)
    tEins?.cancel
    tEins = createTimer(now.plusMinutes(1), [|
        channel1.sendCommand(OFF)
        channel3.sendCommand(OFF)
        tEins = null
    ])
    tZwei?.cancel
    tZwei = createTimer(now.plusMinutes(1), [| 
        channel2.sendCommand(OFF)
        tZwei = null
    ])
end
Die Rule macht weitgehend das gleiche, nur ein wenig anders ;) Natürlich kannst Du alle Bedingungen in ein if-Statement schreiben, aber Du sieht hoffentlich den Vorteil des Codes, nämlich, dass es immer genau definierte Umstände gibt, warum die Rule etwas tut (oder nicht). Ob Du die logMeldungen ausgeben lässt, ist natürlich ebenso Geschmacksache. Durch den Abbruch mittels return; bleibst Du im Code aber in der ersten Ebene, was einfach übersichtlicher ist.

Die Schreibweise des Timers, so wie hier gezeigt, verdeutlicht, dass das Lambda (der Teil zwischen [ und ]) Teil der Funktion ist. Die andere Schreibweise funktioniert ohne Frage auch, aber der Zusammenhang kann verloren gehen.
Die Zuweisung des Timers zu einer Variablen hat nun den Vorteil, dass Du den Timer abbrechen kannst (habe ich hier jeweils vor dem Timer-Aufruf implementiert; falls der Timer existiert, wird er gecancelt)
Das Canceln kannst Du auch aus beliebigen anderen Rules heraus erledigen, vorausgesetzt, sie sind in der gleichen Datei gespeichert (wegen der globalen Definition der Variablen)
Genauso kannst Du einen Timer, der so definiert ist, auch erneut zur Ausführung bringen, um z.B. im ersten Durchlauf zwei Regner abzuschalten und den dritten Regner erst im zweiten Durchlauf. dazu braucht es dann aber einen Zähler :) zum Abfragen.
Danke für diese wiedermal ausführliche und einleuchtende Antwort.
Es tut mir leid dass ich nicht alles auf Anhieb verstehe versuche mich aber so gut es geht rein zu denken.
Ich bin von Beruf Schlosser und habe keinerlei Vorerfahrungen.
Das die beiden Timer dieselbe Dauer laufen war nur für Testzwecke ob die Regel "anspringt".

Code: Alles auswählen

var Timer tEins = null
var Timer tZwei = null

rule "Beregnung"
when 
    Time cron "0 0 21 * * ?"
then
    logInfo("watering","Es ist 21 Uhr. Zeit für Bewässrung.")
    if (beregnung.state != ON) {
        logInfo("watering","Aber Beregnungsautomatik abgeschaltet.")
        return;
    }
    if (LocalWeatherAndForecast_ForecastHours24_MaximaleTemperatur.state < 15 | °C ){
        logInfo("watering","Aber zu kalt.")
        return;
    }
    if (rainYesterday.state > 10 | mm){
        logInfo("watering","Aber es hat ausreichend geregnet.")
        return;
    }
    channel1.sendCommand(ON)
    channel2.sendCommand(ON)
    channel3.sendCommand(ON)
    channel5.sendCommand(OFF)
    teich.sendCommand(OFF)
    tEins?.cancel
    tEins = createTimer(now.plusMinutes(60), [|
        channel1.sendCommand(OFF)
        channel3.sendCommand(OFF)
        tEins = null
    ])
    tZwei?.cancel
    tZwei = createTimer(now.plusMinutes(45), [| 
        channel2.sendCommand(OFF)
        tZwei = null
    ])
end
Da sich diese Rule mit der teichbefüllung.rules beißt. In dieser Rule wird die Brunnenpumpe ( die auch die Sprinkler versorgt) und das Magnetventil für den Teich für 10min eingeschaltet und danach ausgeschaltet.
Wenn ich also die Teichbefüllung um 20:55 starte schaltet die Regel die Pumpe um 21:05 aus, heißt der Rasen wird nicht mehr bewässert.

Code: Alles auswählen

rule "Teichbefülung"
when item teich received update
then if (teich.state == ON){
                    channel3.sendCommand(OFF)
                    channel5.sendCommand(OFF)
                    logInfo("FILE", "Teichbefüülung für 10 Minuten gestartet")
                    createTimer(now.plusMinutes(10)) [| 
                    		channel3.sendCommand(OFF); 
                    		channel5.sendCommand(OFF)]
                    }
end
So wie ich es verstanden habe muss ich beide Regeln in einer Datei speichern.
TeichUndRasen.rules

Code: Alles auswählen

var Timer tDrei = null

rule "Teichbefülung"
when item teich received update
then if (teich.state == ON){
                    channel3.sendCommand(OFF)
                    channel5.sendCommand(OFF)
                    logInfo("FILE", "Teichbefüllung für 10 Minuten gestartet")
                    tDrei?.cancel
    		    tDrei = createTimer(now.plusMinutes(10), [| 
                    		channel3.sendCommand(OFF); 
                    		channel5.sendCommand(OFF)]
                     logInfo("FILE", "Teichbefüllung erfolgreich abgeschlossen")
                    }
end
var Timer tEins = null
var Timer tZwei = null

rule "Beregnung"
when 
    Time cron "0 0 21 * * ?"
then
    logInfo("watering","Es ist 21 Uhr. Zeit für Bewässrung.")
    if (beregnung.state != ON) {
        logInfo("watering","Aber Beregnungsautomatik abgeschaltet.")
        return;
    }
    if (LocalWeatherAndForecast_ForecastHours24_MaximaleTemperatur.state < 15 | °C ){
        logInfo("watering","Aber zu kalt.")
        return;
    }
    if (rainYesterday.state > 10 | mm){
        logInfo("watering","Aber es hat ausreichend geregnet.")
        return;
    }
    tDrei?.cancel
    channel1.sendCommand(ON)
    channel2.sendCommand(ON)
    channel3.sendCommand(ON)
    channel5.sendCommand(OFF)
    teich.sendCommand(OFF)
    tEins?.cancel
    tEins = createTimer(now.plusMinutes(60), [|
        channel1.sendCommand(OFF)
        channel3.sendCommand(OFF)
        tEins = null
    ])
    tZwei?.cancel
    tZwei = createTimer(now.plusMinutes(45), [| 
        channel2.sendCommand(OFF)
        tZwei = null
    ])
end
Wenn ich alles richtig verstanden habe würde es so klappen?

Benutzeravatar
udo1toni
Beiträge: 15241
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Beregnung Timer

Beitrag von udo1toni »

Es tut mir leid dass ich nicht alles auf Anhieb verstehe versuche mich aber so gut es geht rein zu denken.
Ich bin von Beruf Schlosser und habe keinerlei Vorerfahrungen.
Das macht gar nichts :) Hut ab, ich bin immer fasziniert, wenn ich mir Videos anschaue, wo Leute tolle Geräte selbst bauen und dabei schweißen, drehen usw. Meine handwerklichen Fähigkeiten reichen gerade mal so für Holz, und da läuft es auch mehr darauf hinaus, dass man nachher nicht auf dne ersten Blick sieht, wie stümperhaft alles ist... ;)

Zu Deinen Regeln: Du musst an dieser Stelle anders vorgehen. Mein Vorschlag dazu: Bilde eine Gruppe, in der alle Ventile (nicht aber die Pumpe selbst) enthalten sind. Die Gruppe legst Du als Group:Switch:OR(ON,OFF) an, das heißt, solange eines der Items, welches in der Gruppe Mitglied ist, den Status ON hat, hat auch die Gruppe als ganzes den Status ON.
Nun schreibst Du eine kleine Rule, welche auf Änderung der Gruppe triggert (changed). Sobald die Gruppe auf ON wechselt, schaltet sie die Pumpe ein, wenn die Gruppe auf OFF wechselt, startet sie einen Timer, der die Pumpe ausschaltet. Beim Einschalten wird außerdem der Ausschalttimer gecancelt.
Somit schaltet die Pumpe automatisch an und aus, wird aber, wenn Du alle Ventile schließt und Sekunden später andere öffnest, nicht aus- und eingeschaltet. In Deinen anderen Rules kümmerst Du Dich nun gar nicht mehr um die Pumpe, sondern steuerst einfach nur die Ventile auf und zu. Wie lang Du den Ausschalttimer setzt, musst Du natürlich von Deiner Ventilsteuerung abhängig machen.

Die Sache mit verschiedenen Stufen, also z.B. erst alle Regner an, dann Regner 1 und 2 aus, nach einer weiteren Wartezeit Regner 3 aus: Das geht tatsächlich mit einem (1) Timer. Du musst nur einen Zähler nutzen, damit der Timer weiß, der wievielte Durchlauf es gerade ist, dann kannst Du im Timer jeweils unterschiedliche Sachen machen. Um einen Timer erneut auszuführen (aus dem Code heraus, der innerhalb des Timers läuft), nutzt Du tMyTimer.reschedule(startzeit) für den Timer tMyTimer. dabei ist startzeit genauso wie bei createTimer, also z.B. now.plusMinutes(10). Das Ganze ist dann ein Sequencer (früher sprach man mal von einer Ablaufsteuerung...), ähnlich wie die Schaltwerke in einer Waschmaschine (die mechanischen, nicht die Mikroprozessorvariante) - es geht ja nur darum, zu einer festgelegten Zeit etwas zu tun, dann eine bestimmte Zeit zu warten, etwas anders zu tun, und so weiter...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Beregnung Timer

Beitrag von Pepe1907 »

udo1toni hat geschrieben: 19. Jun 2020 11:07
Es tut mir leid dass ich nicht alles auf Anhieb verstehe versuche mich aber so gut es geht rein zu denken.
Ich bin von Beruf Schlosser und habe keinerlei Vorerfahrungen.
Das macht gar nichts :) Hut ab, ich bin immer fasziniert, wenn ich mir Videos anschaue, wo Leute tolle Geräte selbst bauen und dabei schweißen, drehen usw. Meine handwerklichen Fähigkeiten reichen gerade mal so für Holz, und da läuft es auch mehr darauf hinaus, dass man nachher nicht auf dne ersten Blick sieht, wie stümperhaft alles ist... ;)

Zu Deinen Regeln: Du musst an dieser Stelle anders vorgehen. Mein Vorschlag dazu: Bilde eine Gruppe, in der alle Ventile (nicht aber die Pumpe selbst) enthalten sind. Die Gruppe legst Du als Group:Switch:OR(ON,OFF) an, das heißt, solange eines der Items, welches in der Gruppe Mitglied ist, den Status ON hat, hat auch die Gruppe als ganzes den Status ON.
Nun schreibst Du eine kleine Rule, welche auf Änderung der Gruppe triggert (changed). Sobald die Gruppe auf ON wechselt, schaltet sie die Pumpe ein, wenn die Gruppe auf OFF wechselt, startet sie einen Timer, der die Pumpe ausschaltet. Beim Einschalten wird außerdem der Ausschalttimer gecancelt.
Somit schaltet die Pumpe automatisch an und aus, wird aber, wenn Du alle Ventile schließt und Sekunden später andere öffnest, nicht aus- und eingeschaltet. In Deinen anderen Rules kümmerst Du Dich nun gar nicht mehr um die Pumpe, sondern steuerst einfach nur die Ventile auf und zu. Wie lang Du den Ausschalttimer setzt, musst Du natürlich von Deiner Ventilsteuerung abhängig machen.

Die Sache mit verschiedenen Stufen, also z.B. erst alle Regner an, dann Regner 1 und 2 aus, nach einer weiteren Wartezeit Regner 3 aus: Das geht tatsächlich mit einem (1) Timer. Du musst nur einen Zähler nutzen, damit der Timer weiß, der wievielte Durchlauf es gerade ist, dann kannst Du im Timer jeweils unterschiedliche Sachen machen. Um einen Timer erneut auszuführen (aus dem Code heraus, der innerhalb des Timers läuft), nutzt Du tMyTimer.reschedule(startzeit) für den Timer tMyTimer. dabei ist startzeit genauso wie bei createTimer, also z.B. now.plusMinutes(10). Das Ganze ist dann ein Sequencer (früher sprach man mal von einer Ablaufsteuerung...), ähnlich wie die Schaltwerke in einer Waschmaschine (die mechanischen, nicht die Mikroprozessorvariante) - es geht ja nur darum, zu einer festgelegten Zeit etwas zu tun, dann eine bestimmte Zeit zu warten, etwas anders zu tun, und so weiter...
Vielen Dank für diesen Respekt. Aber ich finde echt bewundernswert welches Wissen ihr besitzt, und wie ihr es teilt. Wie öfters schon erwähnt würde ich gerne etwas zurückgeben. Vielen Dank für das Wissen und die Zeit die Sie sich nehmen.
Die Idee mit den Gruppen ist so Simpel aber auch so genial, dass sie mein Problem ohne große Kenntnisse realisieren lässt.
Ich werde es die Tage bei meinen Eltern einfach mal ausprobieren.
Außerdem finde ich das mit den Logs, das sie jede Grundvorraussetzung fürs Beregnen in den Logs niederschreibt zu genial.
Ich bin schon ganz voller Vorfreude es auszuprobieren.

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Beregnung Timer

Beitrag von Pepe1907 »

Habe es jetzt mal versucht umzusetzen leider bekomme ich es nicht hin meine Items einer Gruppe zuzuordnen.
Egal wo ich in home.items (gVentil) hinzufüge es kommt im Log:

Code: Alles auswählen

2020-06-20 17:37:09.303 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'home.items' has errors, therefore ignoring it: [5,54]: missing EOF at '<'

home.items

Code: Alles auswählen

//Datum
DateTime Date  "Date [%1$tA, %1$td.%1$tm.%1$tY %1$tH:%1$tM]"  { channel="ntp:ntp:demo:dateTime" }
//Ventile
Group:Switch:OR(ON,OFF) gVentil
Switch channel1 "Rasensprenger Terrasse"        	(gVentil)       	<lawnmower>      	["Lighting"]  { gpio="pin:22 activelow:yes initialValue:high" }
Switch channel2 "Rasensprenger hinten"          	(gVentil)       	<lawnmower>      	["Lighting"]  { gpio="pin:5 activelow:yes initialValue:high" }
Switch channel5 "Teichbefüllung"                	(gVentil)       	<lawnmower>      	["Lighting"]  { gpio="pin:27 activelow:yes initialValue:high" }
//Brunnenpumpe
Switch channel3 "Brunnenpumpe"                           		     	<pump>          		["Lighting"]  { gpio="pin:26 activelow:yes initialValue:high" }
//Teich
Switch teich    "Teichbefüllung 10min"                  			<water>         		["Lighting"]

//Raspberry
Switch channel4 "Ventilator"                             				<fan_ceiling>   		["Lighting"]  { gpio="pin:17 activelow:yes initialValue:high"  }
//Regen
Number   RainToday              "Rain_today [%.2f mm]"
Number   RainYesterday          "Rain_lastday [%.2f mm]"
//Beregnung
Switch beregnung "Automatische Beregnung"                		<rain>
//Dummy Alexa
Switch alexa "Beregnung Sprachbefehl" 									["Lighting"]



Bin am verzweifeln

Benutzeravatar
udo1toni
Beiträge: 15241
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Beregnung Timer

Beitrag von udo1toni »

Du hast die Reihenfolge vertauscht. Die Reihenfolge der einzelnen Paramter in der Items-Datei ist genau festgelegt:
https://www.openhab.org/docs/configuration/items.html hat geschrieben:

Code: Alles auswählen

itemtype itemname "labeltext [stateformat]" <iconname> (group1, group2, ...) ["tag1", "tag2", ...] {bindingconfig}
Auch wenn ein Teil der Parameter durch die Art der Klammern eindeutig zuordenbar ist, besteht openHAB auf die exakte Reihenfolge. Also

Code: Alles auswählen

//Datum
DateTime Date        "Date [%1$tA, %1$td.%1$tm.%1$tY %1$tH:%1$tM]"                 { channel="ntp:ntp:demo:dateTime" }
//Ventile
Group:Switch:OR(ON,OFF) gVentil
Switch channel1      "Rasensprenger Terrasse" <lawnmower> (gVentil)  ["Lighting"]  { gpio="pin:22 activelow:yes initialValue:high" }
Switch channel2      "Rasensprenger hinten"   <lawnmower> (gVentil)  ["Lighting"]  { gpio="pin:5  activelow:yes initialValue:high" }
Switch channel5      "Teichbefüllung"         <lawnmower> (gVentil)  ["Lighting"]  { gpio="pin:27 activelow:yes initialValue:high" }
//Brunnenpumpe
Switch channel3      "Brunnenpumpe"           <pump>                 ["Lighting"]  { gpio="pin:26 activelow:yes initialValue:high" }
//Teich
Switch teich         "Teichbefüllung 10min"   <water>                ["Lighting"]

//Raspberry
Switch channel4      "Ventilator"             <fan_ceiling>          ["Lighting"]  { gpio="pin:17 activelow:yes initialValue:high"  }
//Regen
Number RainToday     "Rain_today [%.2f mm]"
Number RainYesterday "Rain_lastday [%.2f mm]"
//Beregnung
Switch beregnung     "Automatische Beregnung" <rain>
//Dummy Alexa
Switch alexa         "Beregnung Sprachbefehl"                        ["Lighting"]
Allerdings hast Du Glück, dass Date kein Schlüsselwort ist ;)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Beregnung Timer

Beitrag von Pepe1907 »

udo1toni hat geschrieben: 19. Jun 2020 11:07
Zu deinen Regeln: Du musst an dieser Stelle anders vorgehen. Mein Vorschlag dazu: Bilde eine Gruppe, in der alle Ventile (nicht aber die Pumpe selbst) enthalten sind. Die Gruppe legst Du als Group:Switch:OR(ON,OFF) an, das heißt, solange eines der Items, welches in der Gruppe Mitglied ist, den Status ON hat, hat auch die Gruppe als ganzes den Status ON.
Nun schreibst Du eine kleine Rule, welche auf Änderung der Gruppe triggert (changed). Sobald die Gruppe auf ON wechselt, schaltet sie die Pumpe ein, wenn die Gruppe auf OFF wechselt, startet sie einen Timer, der die Pumpe ausschaltet. Beim Einschalten wird außerdem der Ausschalttimer gecancelt.
Somit schaltet die Pumpe automatisch an und aus, wird aber, wenn Du alle Ventile schließt und Sekunden später andere öffnest, nicht aus- und eingeschaltet. In Deinen anderen Rules kümmerst Du Dich nun gar nicht mehr um die Pumpe, sondern steuerst einfach nur die Ventile auf und zu. Wie lang Du den Ausschalttimer setzt, musst Du natürlich von Deiner Ventilsteuerung abhängig machen.
Pumpe.rules

Code: Alles auswählen

rule "Pumpensteuerung"
when item gVentil changed
then 
    if (gVentil.state == ON){
        channel3.sendCommand(ON)
        logInfo("File", "Brunnenpumpe eingeschaltet, da ein oder mehrere Ventile geöffnet wurden")
    }
    
    if (gVentil.state == OFF){
        createTimer(now.plusMinutes(2))[|
        logInfo("File", "Brunnenpumpe wurde aufgrund geschlossener Ventile ausgeschaltet")
        channel3.sendCommand(OFF)]
    }
Logdaten

Code: Alles auswählen

Configuration model 'Pumpe.rules' has errors, therefore ignoring it: [2,6]: no viable alternative at input 'item'

[13,5]: mismatched input '<EOF>' expecting 'end'
Die Items habe ich so übernommen wie Du sie mir vorgeschlagen hast, und es hat super Funktioniert.
Sobald ich ein Ventil schalte schaltet auch das Group item. Jetzt brauche ich nur noch die Pumpen rules zu ändern dass es klappt dann bin ich soweit durch.
Wäre super wenn ich du den Fehler beheben könntest bzw mir mitteilst wie ich ihn beheben kann.

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Beregnung Timer

Beitrag von Pepe1907 »

Habe es hinbekommen.

Code: Alles auswählen

rule "Pumpensteuerung"
when 
	Member of gVentil received command
then 
    	if (gVentil.state == ON){
        	channel3.sendCommand(ON)
        	logInfo("File", "Brunnenpumpe eingeschaltet, da ein oder mehrere Ventile geöffnet wurden")
    	}
    
    	if (gVentil.state == OFF){
        	createTimer(now.plusMinutes(2))[|
        		logInfo("File", "Brunnenpumpe wurde aufgrund geschlossener Ventile ausgeschaltet")
        		channel3.sendCommand(OFF)]
    }
end
Vielen Lieben Dank habe es endlich alles erstmal so hinbekommen.
Ich bin derzeit zufrieden wie die Automatisierung läuft.
Anfang nächster Woche kommt noch ein Ultraschallsensor am Teich hin damit der Füllstand nie zu hoch oder zu niedrig ist.
Das habe ich dann vor mit dem execbinding und einer rule zu steuern

Benutzeravatar
udo1toni
Beiträge: 15241
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Beregnung Timer

Beitrag von udo1toni »

Die richtige Triggerquelle ist hier tatsächlich nicht Member of, sondern Item, und der richtige Trigger ist auch nicht received command, sondern changed.

Bis auf eine weitere Kleinigkeit sieht die Rule aber schon gut aus. Das Problem ist, wenn die Gruppe wieder auf ON wechselt, muss der Timer natürlich gestoppt werden, damit die Pumpe nicht abgeschaltet wird, falls innerhalb der 2 Minuten ein anderes Ventil öffnet. Dazu muss der Handle des Timers in einem Objekt gespeichert werden, um Zugriff zu behalten.

Code: Alles auswählen

// globale Variablen immer zu Beginn der Datei definieren!
var Timer tPumpe = null

rule "Pumpensteuerung"
when
    Item gVentil changed
then
    if(newState == ON) {
        channel3.sendCommand(ON)
        tPumpe?.cancel
        logInfo("pumpe", "Brunnenpumpe eingeschaltet, da ein oder mehrere Ventile geöffnet wurden")
    } else {
        tPumpe = createTimer(now.plusMinutes(2), [|
            logInfo("pumpe", "Brunnenpumpe wurde aufgrund geschlossener Ventile ausgeschaltet")
            channel3.sendCommand(OFF)
        ])
    }
end
newState ist eine implizite Variable, die zur Verfügung steht, wenn der Ruletrigger changed ist.
tPumpe?.cancel ist gleichbedeutend mit if(tPumpe !== null) tPumpe.cancel
Die Logbefehle erwarten zwei Strings als Parameter, wobei der erste String den Loggernamen enthält. Mit diesem Loggernamen kann man zur Laufzeit steuern, welche Logbefehle abgearbeitet werden, entsprechend sollte man den Loggernamen sinnvoll an der Aufgabe festmachen (hier z.B. eher "pumpe" als "File").
Da die Gruppe nur ON oder OFF als Status haben kann, braucht es kein zweites if-Statement (das kostet nur unnötig Rechenzeit), else reicht hier völlig.
Man kann das Lambda eines Timers auch nach dem Timer angeben, allerdings ist das Lambda ein Parameter, der übergeben wird. Das wird durch die von mir gewählte Schreibweise deutlicher. (Komma nach der Zeitangabe, Lambda, danach schließende Klammer)

Das sind aber nur kleine Korrekturen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten