Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Benutzeravatar
Romel
Beiträge: 42
Registriert: 21. Mai 2020 15:32

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von Romel »

Hallo an alle !

Ich brauch wieder eure Hilfe.
Ich möchte einen "Schönheitsfehler" "reparieren".

Bei der Startzeit wird bei den Minuten unter 10 nur z.B.: 22:1 angezeigt.
Es fehlt die 0. (22:01)

Hab schon gesucht aber nix gefunden.
Das ist vermutlich die Stelle um die es geht:

Code: Alles auswählen

var int minutes = 0                                                                                     // Initialwert für Minuten definieren
    if(Startzeit_Minuten.state instanceof Number) {                                                         // Falls das Item eine gültige Zahl enthält
        minutes = (Startzeit_Minuten.state as Number).intValue                                                         // Setze minutes auf diese Zahl
        if(minutes > 59) minutes = 0                                                                       // Falls Obergrenze überschritten setze auf 0
        if(minutes < 0) minutes = 59                                                                             // Falls Untergrente unterschritten setze auf 59
    }
    Startzeit_Minuten.postUpdate(minutes)                                                                   // Schreibe Wert in das Item
    var int hours = 0                                                                                       // Initialwert für Sunden definieren
    if(Startzeit_Stunden.state instanceof Number) {                                                        // Falls das Item eine gültige Zahl enthält
        hours = (Startzeit_Stunden.state as Number).intValue                                                          // Setze hours auf diese Zahl
        if(hours > 23) hours = 0                                                                            // Falls Obergrenze überschritten setze auf 0
        if(hours < 0) hours = 23  
Danke für eure Hilfe.

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

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von udo1toni »

Nein, an der Stelle im Code geht es ja nur um das Über/Unterschreiten der Limits.
welches Item lässt Du anzeigen? Wo werden Stunde und Minute in das Item übernommen?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Romel
Beiträge: 42
Registriert: 21. Mai 2020 15:32

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von Romel »

Guten Morgen !

Das Item "Info" zeigt die Zeit an.
Das ist der Code:

Code: Alles auswählen

var Timer tRegner = null
var int iRegner = 0
var Timer tStartRegner = null


rule "Startzeit einstellen"
when
    Member of gWeekdays changed or                                                                                         // Wochentag geändert
    Item Startzeit_Minuten changed or                                                                                      // Minuten geändert
    Item Startzeit_Stunden changed or                                                                                      // Stunden geändert
    Time cron "1 0 0 * * ?"                                                                                                // täglich um 00:00:01 Uhr
then
    // Alle Wochentag-Items müssen in der Gruppe gWeekdays zusammengefasst sein, damit der Trigger oben funktioniert
    var dayOfWeekSetting = newArrayList(
        Monday.state, 
        Tuesday.state, 
        Wednesday.state, 
        Thursday.state, 
        Friday.state, 
        Saturday.state, 
        Sunday.state
    )
    var int minutes = 0                                                                                     // Initialwert für Minuten definieren
    if(Startzeit_Minuten.state instanceof Number) {                                                         // Falls das Item eine gültige Zahl enthält
        minutes = (Startzeit_Minuten.state as Number).intValue                                                         // Setze minutes auf diese Zahl
        if(minutes > 59) minutes = 0                                                                       // Falls Obergrenze überschritten setze auf 0
        if(minutes < 0) minutes = 59                                                                             // Falls Untergrente unterschritten setze auf 59
    }
    Startzeit_Minuten.postUpdate(minutes)                                                                   // Schreibe Wert in das Item
    var int hours = 0                                                                                       // Initialwert für Sunden definieren
    if(Startzeit_Stunden.state instanceof Number) {                                                        // Falls das Item eine gültige Zahl enthält
        hours = (Startzeit_Stunden.state as Number).intValue                                                          // Setze hours auf diese Zahl
        if(hours > 23) hours = 0                                                                            // Falls Obergrenze überschritten setze auf 0
        if(hours < 0) hours = 23                                                                               // Falls Untergrente unterschritten setze auf 23
    }
    Startzeit_Stunden.postUpdate(hours)                                                                     // Schreibe Wert in das Item
    val int startMinutes = hours * 60 + minutes                                                           // Zeit in Minuten
    tStartRegner?.cancel
    logInfo("watering","Kontrolliere Wochentag")                                                                                 // geplante Beregnung canceln
    if(dayOfWeekSetting.get(now.getDayOfWeek-1) == ON) {                                                    // Falls heute Beregnung gewünscht
        if(now.getMinuteOfDay < startMinutes) {
            logInfo("watering","Warte auf Startzeit")
            Info.sendCommand("Starte Beregnung um " + (Startzeit_Stunden.state as Number) + ":" + (Startzeit_Minuten.state as Number))                                                            
            tStartRegner = createTimer(now.withTimeAtStartOfDay.plusMinutes(startMinutes),[|                // Setze einen Timer auf gewünschte Startzeit
            WetterPrognose.sendCommand(ON)                                                                   // Starte zur gewünschten Zeit
            ])
        }
    }
    else logInfo("watering","Wochentag ist Ausgeschaltet")
end


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

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von udo1toni »

Frage: Warum schreibst Du den fixen Teil des Labels mit hinein?
Am einfachsten bekommst Du die führende 0 mittels String::format() rein, aber Du kannst natürlich auch in den String ein

Code: Alles auswählen

+if((Startzeit_Minuten.state as Number) < 10)"0" else ""+
einbauen (an der richtigen Stelle, hinter dem Doppelpunkt).

Gesendet von meinem SM-G973F mit Tapatalk


openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
Romel
Beiträge: 42
Registriert: 21. Mai 2020 15:32

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von Romel »

Ok. Danke

JoergB
Beiträge: 3
Registriert: 16. Jan 2019 08:32

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von JoergB »

Hallo zusammen,

ich habe nun auch meine Gartenbewässerung erfolgreich unter die Erde gebracht und versuche alles mit openhab zu automatisieren. In dem Zuge bin ich auf diesen Thread gestoßen und habe ein paar Fragen dazu, bei denen Ihr mir hoffentlich helfen könnt.

Ein wichtigen Punkt bei der Automatisierung macht der Scale Factor aus. Zur Berechnung werden neben Luftfeuchtigkeit und Temperatur vor allem der Regen des Vortages und des aktuellen Tages herangezogen. Dabei wird in RainToday alle Stunde der Regen der letzten Stunde fortlaufend aufaddiert, während der Regen des Vortages um 23.59 Uhr in RainYesterday geschrieben wird. Dazu verwendet Cyrelian die Persistenz, wie er schreibt...
Meine Frage jetzt ist: warum? Der Wert von RainYesterday wird doch nur einmal um 23:59 Uhr am Tag geschrieben und ändert sich erst wieder 24h später. D.h. für die Berechnung des Rain Scale Factors könnte ich doch einfach den Wert von RainToday und RainYesterday nehmen und brauche gar keine Persistenz...

Und was ich auch nicht verstehe: wo wird der Wert von RainToday wieder auf 0 gesetzt? Müsste das nicht mit dem Schreiben von RainYesterday um 23:59 Uhr erfolgen?

Viele Grüße,
Jörg

Benutzeravatar
Romel
Beiträge: 42
Registriert: 21. Mai 2020 15:32

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von Romel »

Guten Morgen !

Meine Beregnung ist installiert und läuft jetzt seit ein paar Tagen.
Es funktioniert alles ganz gut, bis auf ein Problem:

Die Beregnung startet nicht am nächsten Tag von selbst. Wenn ich aber Manuel eine Startzeit eingebe die am gleichen Tag ist funktioniert alles. Ist die Zeit aber erst am nächsten Tag, wird nicht ausgelöst.

Noch eine Info: Jeden Tag um 1 Uhr wird ein Backup erstellt und neu gestartet.

Danke für eure Hilfe !

Hier eine Log mit einen Fehler:

Code: Alles auswählen

2020-07-08 05:13:19.743 [vent.ItemStateChangedEvent] - Schalter3rssi changed from -49.00 to -50.00

2020-07-08 05:13:30.760 [vent.ItemStateChangedEvent] - Schalter1rssi changed from -70.00 to -71.00

==> /var/log/openhab2/openhab.log <==

2020-07-08 05:14:03.381 [INFO ] [ipse.smarthome.model.script.watering] - Kontrolliere Wochentag

2020-07-08 05:14:03.386 [INFO ] [ipse.smarthome.model.script.watering] - Warte auf Startzeit

==> /var/log/openhab2/events.log <==

2020-07-08 05:14:03.392 [ome.event.ItemCommandEvent] - Item 'Info' received command Starte Beregnung um 5:16

2020-07-08 05:14:03.396 [ome.event.ItemCommandEvent] - Item 'bInfo' received command ON

2020-07-08 05:14:03.404 [vent.ItemStateChangedEvent] - Info changed from  to Starte Beregnung um 5:16

2020-07-08 05:14:03.405 [vent.ItemStateChangedEvent] - bInfo changed from OFF to ON

2020-07-08 05:14:09.815 [vent.ItemStateChangedEvent] - Schalter5volt changed from 3.29 to 3.27

2020-07-08 05:14:10.674 [vent.ItemStateChangedEvent] - ext3000_Pingzeit changed from 2.0 to 1.0

2020-07-08 05:14:13.815 [vent.ItemStateChangedEvent] - Schalter4volt changed from 3.01 to 3.02

2020-07-08 05:14:15.814 [vent.ItemStateChangedEvent] - Schalter2rssi changed from -69.00 to -70.00

2020-07-08 05:14:19.820 [vent.ItemStateChangedEvent] - Schalter3rssi changed from -50.00 to -49.00

2020-07-08 05:14:24.837 [vent.ItemStateChangedEvent] - Schalter7rssi changed from -74.00 to -75.00

2020-07-08 05:15:09.884 [vent.ItemStateChangedEvent] - Schalter6volt changed from 3.20 to 3.21

2020-07-08 05:15:09.899 [vent.ItemStateChangedEvent] - Schalter5volt changed from 3.27 to 3.25

2020-07-08 05:15:13.906 [vent.ItemStateChangedEvent] - Schalter4volt changed from 3.02 to 3.01

2020-07-08 05:16:00.014 [ome.event.ItemCommandEvent] - Item 'WetterPrognose' received command ON

==> /var/log/openhab2/openhab.log <==

2020-07-08 05:16:00.011 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.Timer 9 2020-07-08T05:16:00.000+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  <XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)

} ] threw an unhandled Exception: 

java.lang.NullPointerException: null

	at org.eclipse.smarthome.model.script.engine.ScriptError.<init>(ScriptError.java:65) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:140) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:991) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:954) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:235) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1205) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1135) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1081) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:861) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:231) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

	at com.sun.proxy.$Proxy464.apply(Unknown Source) ~[?:?]

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]

	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [bundleFile:?]

	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]

2020-07-08 05:16:00.057 [INFO ] [ipse.smarthome.model.script.watering] - RegenPrognose_24: 0.0

2020-07-08 05:16:00.051 [ERROR] [org.quartz.core.ErrorLogger         ] - Job (DEFAULT.Timer 9 2020-07-08T05:16:00.000+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  <XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)

} ] threw an exception.

org.quartz.SchedulerException: Job threw an unhandled exception.

	at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [bundleFile:?]

	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]

Caused by: java.lang.NullPointerException

	at org.eclipse.smarthome.model.script.engine.ScriptError.<init>(ScriptError.java:65) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:140) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:991) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:954) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:235) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1205) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1135) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1081) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:861) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:231) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

	at com.sun.proxy.$Proxy464.apply(Unknown Source) ~[?:?]

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]

	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]

	... 1 more

==> /var/log/openhab2/events.log <==

2020-07-08 05:16:00.088 [ome.event.ItemCommandEvent] - Item 'Beregnung' received command ON

2020-07-08 05:16:00.107 [vent.ItemStateChangedEvent] - Beregnung changed from OFF to ON

==> /var/log/openhab2/openhab.log <==

2020-07-08 05:16:00.113 [INFO ] [clipse.smarthome.model.script.regner] - 1. Durchlauf

==> /var/log/openhab2/events.log <==

2020-07-08 05:16:00.118 [vent.ItemStateChangedEvent] - Sperre changed from OFF to ON

2020-07-08 05:16:00.123 [vent.ItemStateChangedEvent] - Info changed from Starte Beregnung um 5:16 to Beregnung gestartet !
Hier die Rule:

Code: Alles auswählen

rule "Startzeit einstellen"
when
    Member of gWeekdays changed or                                                                                         // Wochentag geändert
    Item Startzeit_Minuten changed or                                                                                      // Minuten geändert
    Item Startzeit_Stunden changed or                                                                                    // Stunden geändert
    Time cron "1 0 0 * * ?"                                                                                                // täglich um 00:00:01 Uhr
then
    // Alle Wochentag-Items müssen in der Gruppe gWeekdays zusammengefasst sein, damit der Trigger oben funktioniert
    var dayOfWeekSetting = newArrayList(
        Monday.state, 
        Tuesday.state, 
        Wednesday.state, 
        Thursday.state, 
        Friday.state, 
        Saturday.state, 
        Sunday.state
    )
    var int minutes = 0                                                                                     // Initialwert für Minuten definieren
    if(Startzeit_Minuten.state instanceof Number) {                                                         // Falls das Item eine gültige Zahl enthält
        minutes = (Startzeit_Minuten.state as Number).intValue                                                         // Setze minutes auf diese Zahl
        if(minutes > 59) minutes = 0                                                                       // Falls Obergrenze überschritten setze auf 0
        if(minutes < 0) minutes = 59                                                                             // Falls Untergrente unterschritten setze auf 59
    }
    Startzeit_Minuten.postUpdate(minutes)                                                                   // Schreibe Wert in das Item
    var int hours = 0                                                                                       // Initialwert für Sunden definieren
    if(Startzeit_Stunden.state instanceof Number) {                                                        // Falls das Item eine gültige Zahl enthält
        hours = (Startzeit_Stunden.state as Number).intValue                                                          // Setze hours auf diese Zahl
        if(hours > 23) hours = 0                                                                            // Falls Obergrenze überschritten setze auf 0
        if(hours < 0) hours = 23                                                                               // Falls Untergrente unterschritten setze auf 23
    }
    Startzeit_Stunden.postUpdate(hours)                                                                     // Schreibe Wert in das Item
    val int startMinutes = hours * 60 + minutes                                                           // Zeit in Minuten
    tStartRegner?.cancel
    logInfo("watering","Kontrolliere Wochentag")                                                                                 // geplante Beregnung canceln
    if(dayOfWeekSetting.get(now.getDayOfWeek-1) == ON) {                                                   // Falls heute Beregnung gewünscht
        if(now.getMinuteOfDay < startMinutes) {
            logInfo("watering","Warte auf Startzeit")
            Info.sendCommand("Starte Beregnung um " + (Startzeit_Stunden.state as Number) + ":" + if((Startzeit_Minuten.state as Number) < 10)"0" + (Startzeit_Minuten.state as Number) else (Startzeit_Minuten.state as Number) )
            bInfo.sendCommand(ON)                                                             // Falls Startzeit noch nicht erreicht
            tStartRegner = createTimer(now.withTimeAtStartOfDay.plusMinutes(startMinutes),[|                // Setze einen Timer auf gewünschte Startzeit
            WetterPrognose.sendCommand(ON)                                                                   // Starte zur gewünschten Zeit
            ])
        }
    }
    else logInfo("watering","Wochentag ist Ausgeschaltet")
end

rule "Wetter und Feuchtigkeit einbinden"
when
    Item WetterPrognose received command
then

//Wind

    var wind = 0
    if(WetterAktuellWindgesch.state instanceof Number){
        wind = ((WetterAktuellWindgesch.state as Number).floatValue).intValue
    var maxwind = 0
    if(maxWind.state instanceof Number)
        maxwind = ((maxWind.state as Number).floatValue).intValue
    if(wind >= maxwind){                                                                           
        Beregnung.sendCommand(OFF)
        logWarn("watering","Derzeit ist es zu windig! {} km/h: Abbruch!", wind)
        Info.sendCommand("Windgeschwidigkeit zu hoch: Abbruch!")
        bInfo.sendCommand(ON)
    }

//Regen

    if(WetterAktuellRegen.state instanceof Number && Wetter3hRegen.state instanceof Number && Wetter6hRegen.state instanceof Number && Wetter12hRegen.state instanceof Number && Wetter24hRegen.state instanceof Number && Wetter72hRegen.state instanceof Number){
        RegenPrognose_24.postUpdate(((WetterAktuellRegen.state as Number + Wetter3hRegen.state as Number + Wetter6hRegen.state as Number + Wetter12hRegen.state as Number + Wetter24hRegen.state as Number) * 1000) * 2)
        logInfo("watering","RegenPrognose_24: " + RegenPrognose_24.state)

    if((RegenPrognose_24.state as Number) >= (minRegen.state as Number)){
        logWarn("watering","Es wird genug Regnen! {} mm/m²: Abbruch !", RegenPrognose_24.state)
        Info.sendCommand("Es wird genug Regnen: Abbruch!")
        Beregnung.postUpdate(OFF)
    }

//Feuchtigkeit

    if(gFeuchtDurchschnitt.state <= 300) {
        logWarn("watering","Feuchtigkeit ist {} : Abbruch !", gFeuchtDurchschnitt.state)
        //Info.postUpdate("Feuchtigkeit ist {} : Abbruch !", gFeuchtDurchschnitt.state)
        Beregnung.postUpdate(OFF)
    }
    else
    {
        Beregnung.sendCommand(ON)
    }
    }
    }
end       

rule "Beregnung EIN"
when
    Item Beregnung received command
then
    if(receivedCommand == OFF) {
        logWarn("watering","Beregnung wird abgebrochen!")
        sendBroadcastNotification("Beregnung wird abgebrochen!")                                                                                                //Nachricht an openhab APP
        postUpdate(Info, "Beregnung abgebrochen !")
        bInfo.sendCommand(ON)                       // Info Bestätigung einschalten
        tRegner?.cancel                                                                                                                                         // Timer stoppen
        tRegner = null                                                                                                                                          // Variable leeren
        gRegner.members.filter[i|i.name.contains("Power")].filter[j| j.state != OFF].forEach[r|r.sendCommand(OFF)]                                              // alle Regner abschalten
        //Pumpe.sendCommand(OFF)                                                                                                                                  // Pumpe abschalten
        Sperre.postUpdate(OFF)                                                                                                                                  // Bediensperre aufheben
    }
    else 
    {
    if(tRegner !== null) {
        logWarn("watering","Regner scheint noch zu laufen! Abbruch")
        return;
    }
    iRegner = 0
    Sperre.postUpdate(ON)
    //Pumpe.sendCommand(ON)
    postUpdate(Info, "Beregnung gestartet !")
    sendBroadcastNotification("Beregnung gestartet !")
    tRegner = createTimer(now.plusMillis(10),[|
        iRegner++                                // nächsten Regener anwählen
        logInfo("regner","{}. Durchlauf",iRegner)
        gRegner.members.filter[i|i.name.contains("Power")].filter[j| j.state != OFF].forEach[r|r.sendCommand(OFF)] // alle Regner abschalten
        val maxRegner = gRegner.members.filter[i|i.name.contains("Sperre")].filter[j| j.state == OFF].size             // wieviele Regner sollen insgesamt beregnen?
        logInfo("regner","{}. Durchlauf von {} Durchläufen.",iRegner,maxRegner)
        if(iRegner > maxRegner) {                // letzten Regner schon erreicht?
            logInfo("regner","Alle Regner sind schon gelaufen!")
            sendBroadcastNotification("Beregnung Fertig !")
            postUpdate(Info, "Beregnung Fertig !")
            bInfo.sendCommand(ON)                       // Info Bestätigung einschalten
            tRegner = null                       // Dann Schluss!
            Sperre.postUpdate(OFF)
            Beregnung.postUpdate(OFF)                                                                                                                       // Item zurücksetzen
            //Pumpe.sendCommand(OFF)  
            return;
        }
        Thread::sleep(15000)                       // kleine(15 sec) Pause einlegen
        val strRegner = gRegner.members.filter[i|i.name.contains("Sperre")].filter[j| j.state == OFF].sortBy[name].get(iRegner-1).name.split("_").get(2) //Namen des Regner ermitteln
        logInfo("regner","Nächster Regner: {}",strRegner)
        gRegner.members.filter[i|i.name.contains("Power") && i.name.contains(strRegner)].head.sendCommand(ON)  // Regner einschalten
        val Dauer =(gRegner.members.filter[i|i.name.contains("Dauer") && i.name.contains(strRegner)].head.state as Number).intValue
        logInfo("regner","Regenr wird nach {} Minuten wieder abgeschaltet.",Dauer)
        tRegner.reschedule(now.plusMinutes(Dauer)) // Nächste Ausführung planen
    ])
    }
end

Benutzeravatar
PeterA
Beiträge: 1052
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von PeterA »

Eventuell fehlt hier ein

"System started" im when Teil der Rule
- OpenHab 2.4
#PWRUP

Benutzeravatar
Romel
Beiträge: 42
Registriert: 21. Mai 2020 15:32

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von Romel »

Hab ich mir auch schon gedacht.
Schon dazu geschrieben.

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

Re: Automatisch Gartenbewässerung / Beregnung mit openHAB und Sonoff

Beitrag von udo1toni »

Nur so als Hinweis: openHAB muss für ein Backup nicht angehalten werden.
Und es wird zwar in einigen Beiträgen beschrieben, wie man openHAB neu automatisch neu startet, das ist aber nicht erstrebenswert.
Wenn openHAB nicht ohne ständige Neustarts stabil läuft, dann liegt ein Fehler in der Konfiguration vor und sollte beseitigt werden.
Regelhafte Neustarts verdecken nur ein Problem, man sollte keine Symptome bekämpfen, sondern deren Ursache(n).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Gesperrt