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

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

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

Beitrag von udo1toni »

Romel hat geschrieben: 29. Mai 2020 06:12
Du hast 13 Kreise. Meine Frage dazu: Wenn die Beregnung startet, werden alle Kreise verwendet, oder sollen Kreise wahlweise außen vor gelassen werden? Es wäre an dieser Stelle im Zweifel sinnvoller, die Umschaltung der Kreise einer Statemachine zu überlassen. Selbst wenn bestimme Regnerkreise länger und andere Regnerkreise kürzer gegenüber anderen Kreisen laufen sollen, ist das keine große Sache.
Bin für alles offen. ;)

Aus Sicht eines Könners wird das Problem relativ einfach zu lösen sein. Aber meine Wissen ist zu minder.
Ich lebe nur von Versuche und das ist mühsam und Fehler sind da schnell gemacht.
Hier noch das "openhab.log"

openhab.txt

Vielen Dank
Roman
Das log sagt leider erst mal nichts Auffälliges, zumindest, was die Datei beregnung.rules betrifft. Ich gehe mal davon aus, dass alle Rules sich in dieser Datei befinden. ein paar andere Probleme hast Du aber ;)

Was die Rules betrifft (bzw. deren Optimierung) so ist halt die Frage, wie genau die Regner gesteuert werden sollen. Grundsätzlich sollte eine kleine Rule mit einem (!) Timer ausreichen, diese macht dann immer einen Kreis an, wartet, macht den Kreis aus, wartet, macht den nächsten Kreis an... und so weiter. Dabei sind alle Wartezeiten grundsätzlich variabel gestaltbar. Die Ausschaltpause (also die Zeit vom Schließen des einen Kreises zum Öffnen des nächsten Kreises) wird aber vermutlich im Sekundenbereich liegen dürfen, unabhängig vom Regner. Sollen Regner übersprungen werden, muss die Rule das natürlich berücksichtigen (dafür müsste man dann separate Schalter vorsehen). Mein Vorschlag sähe ungefähr so aus:

Eine Gruppe gRegner mit Items für Dauer, Deaktivierung und den Regnern selbst. Pro Regner ein passendes Item (bei Dauer Number, die anderen beiden als Switch). Zueinander gehörende Items bekommen den gleichen Namen. Alle Items einer Funktion bekommen einen Zusatz im Namen, also z.B. Regner_Dauer_01, Regner_Sperre_01 und Regner_Power_01 für den ersten Regner, der zweite Regner hat dann jeweils die 02 hinten dran usw.
Nun kann man innerhalb der Rule diese Gruppe verwenden, um auf ein bestimmtes Item zuzugreifen. Es fehlt dann nur noch ein bisschen was drum herum, um den Ablauf zu steuern. Wahlweise kann man auch drei Untergruppen für die einzelnen Typen machen, also eine Gruppe für die Regner, eine Gruppe für die Sperre und eine Gruppe für die Dauer. Der Trick besteht jedenfalls darin, dass alle Items eines Regners über denselben Namensteil verfügen und alle Items einer Funktion eebenfalls über denselben Namensteil verfügen. Dann kann die Rule für jeden Regner den benötigten Namen "ausrechnen".
Über die Dauer würde man hier natürlich ein Verhältnis zwischen den einzelnen Regnern angeben, da es ja einen wetterabhängigen Korrekturfaktor gibt, der würde sich aber auf alle Regner gleichmäßig auswirken.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

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

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

Beitrag von udo1toni »

Ich versuche mich mal an einem Skelett:

Code: Alles auswählen

var Timer tRegner = null
var int iRegner = 0

rule "Beregnung"
when
    Item Beregnung received command ON
then
    logInfo("watering","Beregnung gestartet.")
    if(tRegner !== null) {
        logInfo("watering","Regner scheint noch zu laufen! Abbruch")
        return;
    }
    iRegner = 0
    Sperre.postUpdate(ON)
    tRegner = createTimer(now.plusMillis(10),[|
        iRegner++                                // nächsten Regener anwählen
        gRegner.members.filter[i|i.name.contains("Power")].filter[j| j.state != OFF].forEach[r|r.sendCommand(OFF)] // alle Regner abschalten
        maxRegner = gRegner.members.filter[i|i.name.contains("Sperre")].filter[j| j.state == OFF].size             // wieviele Regner sollen insgesamt beregnen?
        if(iRegner > maxRegner) {                // letzten Regner schon erreicht?
            tRegner = null                       // Dann Schluss!
            Sperre.postUpdate(OFF)
            return;
        }
        Thread::sleep(500)                       // kleine(!) 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
        gRegner.members.filter[i|i.name.contains("Power") && i.name.contains(strRegner)].head.sendCommand(ON)  // Regner einschalten
        tRegner.reschedule(now.plusMinutes((gRegner.members.filter[i|i.name.contains("Dauer") && i.name.contains(strRegner)].head.state as Number).intValue)) // Nächste Ausführung planen
    ])
end
Die Rule ist natürlich noch nicht fertig ;) aber so zum ausprobieren...

Hinweis an dieser Stelle: Es ist egal, ob damit 2 oder 1000 Regner gesteuert werden, an der Rule ändert sich exakt nichts. (!)

Funktionsweise der Rule:
Wenn die Rule getriggert wird, prüft sie zunächst, ob der Timer bereits läuft. Ist das der Fall bricht sie sofort ab. (Das ist potenziell ein Schwachpunkt, aber man kann eine zweite Rule schreiben, die den Timer gezielt löscht, falls sich openHAB mal verschluckt haben sollte...)

Ist der Timer noch leer, wird die Zählvariable iRegner mit 0 initialisiert und der Timer erzeugt. Danach ist die Rule beendet(!)



Der Timer (hier passiert die eigentliche Arbeit) zündet nach 10 Millisekunden das erste Mal. Die 10 ms dienen nur der Sicherheit, dass der Timer schon komplett angelegt und initialisiert wurde.

Zunächst wird iRegner um eins erhöht, anschließend werden alle eingeschalteten Regner abgeschaltet.
Nun wird geprüft, wieviele Regner überhaupt beregnen sollen (die Menge [.size] der Items, deren Name das Wort "Sperre" enthält und deren Status OFF ist)
Falls die Menge der zu verwendenden Regner kleiner als der Zähler iRegner ist, hat der letzte Regner schon seine Arbeit getan,der Timer deinitialisiert sich (tRegner = null) und bricht ab (return;).

Andernfalls wartet die Rule einen kleinen Moment (500 Millisekunden; das ist für Thread::sleep() noch gut vertretbar) und berechnet anschließend den Namen des Regners, der nun an der Reihe ist. Dabei wird die Liste der Regner alphabetisch sortiert. Es wird nur der regnerspezifische Teil des Namens ermittelt. All das passiert in einer Zeile, die vielleicht auf den ersten Blick eher komplex ist... deshalb nehme ich die Zeile mal auseinander:

Code: Alles auswählen

gRegner             // die Gruppe gRegner
.members            // die Mitglieder der Gruppe, als Liste
.filter[i|          // filtere die Liste und nutze dabei i als Platzhalter für jedes Item der Liste
i                   // prüfe für jedes Item i
.name               // ob dessen Name
.contains("Sperre") // den Teilstring "Sperre" enthält
]                   // dies ist nun eine Liste aller Sperritems
.filter[j|          // filtere das Ergebnis und nutze dabei j als Platzhalter für jedes Item der Liste
j                   // prüfe für jedes Item j
.state == OFF       // ob dessen Status OFF ist
]                   // dies ist nun eine Liste aller Sperritems, die den Status OFF haben
.sortBy[name]       // Sortiere die Liste alphabetisch
.get(iRegner-1)     // nimm das n-te Element der Liste (0-indiziert, deshalb -1)
.name               // nimm den Namen des Elements
.split("_")         // teile den String am Zeichen _ auf und erzeuge eine Liste der Teilstrings (das Zeichen _ wird dabei entfernt)
.get(2)             // nimm den 3. Teilstring (die Liste ist 0-indiziert)
Dieser Teilstring wird nun der Konstanten strRegner zugewiesen.

Nun kann zum einen der Regner mit diesem Namen eingeschaltet werden, zum anderen kann die hinterlegte Beregnungsdauer aus dem passenden Item geladen werden.

Die Items kommen alle in die Gruppe gRegner, alle Items folgen der Beschriftungsform Regner_xxx_nnn, wobei xxx jeweils pro nnn einmal Power, einmal Sperre und einmal Dauer enthält (Itemtypen passend als Switch bzw. bei Dauer als Number). nnn ist je Regner einmalig, es muss nicht zwingend eine Zahl sein, aber die Zeichenfolge muss für alle Items eines Regners identisch sein und für jeden Regner eindeutig, also z.B. so:

Code: Alles auswählen

Switch Sperre // nur für visibility...
Group gRegner "Alle Regneritems"
Switch Regner_Power_001      "Regner hinten [%s]" (gRegner) {... Verknüpfung auf das Magnetventil }
Switch Regner_Power_002      "Regner vorne  [%s]" (gRegner) {... Verknüpfung auf das Magnetventil }
Switch Regner_Power_strasze  "Regner Straße [%s]" (gRegner) {... Verknüpfung auf das Magnetventil }

Switch Regner_Sperre_001     "Regner hinten [MAP(enable.map):%s]" (gRegner) // ungebundenes Item
Switch Regner_Sperre_002     "Regner vorne  [MAP(enable.map):%s]" (gRegner) // ungebundenes Item
Switch Regner_Sperre_strasze "Regner Straße [MAP(enable.map):%s]" (gRegner) // ungebundenes Item

Number Regner_Dauer_001      "Regner hinten [%d min]" <time> (gRegner) // ungebundenes Item
Number Regner_Dauer_002      "Regner vorne  [%d min]" <time> (gRegner) // ungebundenes Item
Number Regner_Dauer_strasze  "Regner Straße [%d min]" <time> (gRegner) // ungebundenes Item
Und das Mapping (transform/enable.map):

Code: Alles auswählen

ON=disabled
OFF=enabled
-=-
Wie oben erwähnt, ist die Anzahl der Regner nun vollkommen irrelevant, die Rule ermittelt alles dynamisch.
Mögliche Fallen: Ist der Beregnungszyklus gestartet, dürfen die Items nicht mehr verändert werden, also weder die Dauer noch die Sperre. Man könnte dafür ein Item anlegen, welches beim Start des Timers auf ON geschaltet wird und zum Ende auf OFF geschaltet wird. Dieses kann man dann in der Sitemap zum Ausblenden der Items nutzen, bzw. eine andere Darstellung einblenden, so z.B.:

Code: Alles auswählen

Frame label="Regner" {
    Switch item=Regner_Sperre_001 visibility=[Sperre==OFF]
    Text   item=Regner_Sperre_001 visibility=[Sperre==ON]
    Setpoint item=Regner_Dauer_001 visibility=[Sperre==OFF]
    Text     item=Regner_Dauer_001 visibility=[Sperre==ON]
    Switch item=Regner_Sperre_002 visibility=[Sperre==OFF]
    Text   item=Regner_Sperre_002 visibility=[Sperre==ON]
    Setpoint item=Regner_Dauer_002 visibility=[Sperre==OFF]
    Text     item=Regner_Dauer_002 visibility=[Sperre==ON]
}
Ein etwaiger Korrekturfaktor für die Beregnungsdauer könnte im Reschedule berrücksichtigt werden, wobei es sich dann natürlich anbietet, das vorher in einer Konstanten zu berechnen (dann selbstverständlich sekundengenau).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

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

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

Beitrag von Romel »

Hallo

Was soll ich sagen (schreiben) ?
Einfach super !

Ich mach mich gleich an die Arbeit.
Items schreiben und alles nochmal in Ruhe lesen.

Danke,Danke,Danke.
Grüße
Roman

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

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

Beitrag von Pepe1907 »

Ich habe mir alles jetzt mehrmals durchgelesen.
Jedoch ist das alles noch zu kompliziert für mich und ich möchte mich langsam rantasten und euch mal meine Items und Regeln vorstellen.

Code: Alles auswählen

Switch channel1 "Channel 1" { gpio="pin:26 activelow:yes initialValue:high" }
Switch channel2 "Channel 2" { gpio="pin:19 activelow:yes initialValue:low" }
Switch channel3 "Channel 3" { gpio="pin:13 activelow:yes"}

Code: Alles auswählen

rule "Beregnung"
when
    Time cron "00 00 21 ? * * *" //21:00:00
then
    if (localCurrentRainVolume > 4mm                                    // heutiger regen weniger als 4mm
        localDailyForecastTomorrowRainVolume >4mm )            // Regen morgen weniger als 4mm
    {
     channel1.sendCommand(ON)
     channel2.sendCommand(ON)
     channel3.sendCommand(ON)
    }
end
Channel 1 & 2 sind meine Magnetventile bzw damit werden die Magnetventile freigeschaltet.
Channel 3 ist meine Brunnenpumpe die ich gerne auch über Openhab schalten möchte.
Jeden Tag um 21:00:00 sollen alle 3 Relais geschaltetet werden, wenn der localCurrentRainVolume und der localDailyForecastTomorrowRainVolume weniger als 4mm beträgt.
Würde dann natürlich auch noch eine Regel zum ausschalten erstellen.

Code: Alles auswählen

rule "Beregnung Kreis 2 aus"
when
    Time cron "00 45 21 ? * * *" //21:45:00
then
    if (channel2.receivedcommand(ON)
    {
     channel2.sendCommand(OFF)
    }
end

Code: Alles auswählen

rule "Beregnung Kreis 1 aus"
when
    Time cron "00 00 22 ? * * *" //22:00:00
then
    if (channel1.receivedcommand(ON)
        channel3.receivedcommand(ON)
    {
     channel1.sendCommand(OFF)
     channel3.sendCommand(OFF)
    }
end
So habe ich mir das vorgestellt.
Natürlich ist es falsch was ich dort geschrieben habe bekomme es aber leider nicht besser hin.
Im Vorraus vielen Dank für eure Unterstützung und die Zeit die ihr investiert

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

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

Beitrag von udo1toni »

Es gibt kein Item.receivedcommand :)
Innerhalb einer Rule, die mittels received command triggert, gibt es die impliziete Variable receivedCommand, welche das Kommnado enthält, welches die Rule getriggert hat.
Eine Rule, die per Time cron triggert, kennt außerdem kein receivedCommand, weil ja gar kein Kommando empfangen wurde.

Das Item hält nur seinen Status (Item.state).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

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

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

Beitrag von udo1toni »

Neue Version der Rule (mit Logging)

Code: Alles auswählen

// globale Variablen immer zu Beginn der Datei definieren!

var Timer tRegner = null
var int iRegner = 0

rule "Beregnung"
when
    Item Beregnung received command ON
then
    logInfo("watering","Beregnung gestartet.")
    if(tRegner !== null) {
        logInfo("watering","Regner scheint noch zu laufen! Abbruch")
        return;
    }
    iRegner = 0
    Sperre.postUpdate(ON)
    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!")
            tRegner = null                       // Dann Schluss!
            Sperre.postUpdate(OFF)
            return;
        }
        Thread::sleep(500)                       // kleine(!) 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.")
        tRegner.reschedule(now.plusMinutes(Dauer)) // Nächste Ausführung planen
    ])
end
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

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

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

Beitrag von Pepe1907 »

udo1toni hat geschrieben: 1. Jun 2020 23:09 Neue Version der Rule (mit Logging)

Code: Alles auswählen

// globale Variablen immer zu Beginn der Datei definieren!

var Timer tRegner = null
var int iRegner = 0

rule "Beregnung"
when
    Item Beregnung received command ON
then
    logInfo("watering","Beregnung gestartet.")
    if(tRegner !== null) {
        logInfo("watering","Regner scheint noch zu laufen! Abbruch")
        return;
    }
    iRegner = 0
    Sperre.postUpdate(ON)
    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!")
            tRegner = null                       // Dann Schluss!
            Sperre.postUpdate(OFF)
            return;
        }
        Thread::sleep(500)                       // kleine(!) 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.")
        tRegner.reschedule(now.plusMinutes(Dauer)) // Nächste Ausführung planen
    ])
end
Vielen Dank für die schnelle und hilfreiche Antwort.
Wie trage ich denn jetzt die Zeiten ein? In den items <timer> oder in der rule?
Sie haben ja gesagt es ist egal wieviele regner bzw wieviele Regnerkreise darüber laufen.
Ich habe bisher 2 regnerkreise laufen und würde diese aufgrund der Fläche nicht beide gleich lange laufen lassen.
Wie bekomme ich meine Pumpe in der rule implementiert?

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

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

Beitrag von udo1toni »

Die Zeile

Code: Alles auswählen

logInfo("regner","Regenr wird nach {} Minuten wieder abgeschaltet.")
muss natürlich

Code: Alles auswählen

logInfo("regner","Regner wird nach {} Minuten wieder abgeschaltet.",Dauer)
lauten.

Gesendet von meinem SM-G973F mit Tapatalk

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

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

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

Beitrag von Romel »

Hallo

Ich hab jetzt fürs Ausschalten diese Rule geschrieben:

Code: Alles auswählen

rule "Beregnung AUS"
when 
    Item Beregnung received command OFF
then
    if(tRegner !== null) {
        logInfo("watering","Beregnung wird abgebrochen !")
        gRegner.members.filter[i|i.name.contains("Power")].filter[j| j.state != OFF].forEach[r|r.sendCommand(OFF)] // alle Regner abschalten
        Sperre.postUpdate(OFF)
    }    
end
Das ist die Log Datei:

Code: Alles auswählen

2020-06-02 14:11:55.524 [ome.event.ItemCommandEvent] - Item 'Beregnung' received command ON

2020-06-02 14:11:55.538 [vent.ItemStateChangedEvent] - Beregnung changed from OFF to ON

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

2020-06-02 14:11:56.241 [INFO ] [ipse.smarthome.model.script.watering] - Beregnung gestartet.

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

2020-06-02 14:11:56.248 [vent.ItemStateChangedEvent] - Sperre changed from OFF to ON

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

2020-06-02 14:11:56.257 [INFO ] [clipse.smarthome.model.script.regner] - 1. Durchlauf

2020-06-02 14:11:56.311 [INFO ] [clipse.smarthome.model.script.regner] - 1. Durchlauf von 3 Durchläufen.

2020-06-02 14:11:56.832 [INFO ] [clipse.smarthome.model.script.regner] - Nächster Regner: 001

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

2020-06-02 14:11:56.837 [ome.event.ItemCommandEvent] - Item 'Regner_Power_001' received command ON

2020-06-02 14:11:56.846 [vent.ItemStateChangedEvent] - Regner_Power_001 changed from OFF to ON

2020-06-02 14:11:56.851 [GroupItemStateChangedEvent] - Power changed from OFF to ON through Regner_Power_001

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

2020-06-02 14:11:56.858 [INFO ] [clipse.smarthome.model.script.regner] - Regenr wird nach 1 Minuten wieder abgeschaltet.

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

2020-06-02 14:12:14.083 [ome.event.ItemCommandEvent] - Item 'Beregnung' received command OFF

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

2020-06-02 14:12:14.085 [INFO ] [ipse.smarthome.model.script.watering] - Beregnung wird abgebrochen !

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

2020-06-02 14:12:14.097 [vent.ItemStateChangedEvent] - Beregnung changed from ON to OFF

2020-06-02 14:12:14.104 [ome.event.ItemCommandEvent] - Item 'Regner_Power_001' received command OFF

2020-06-02 14:12:14.125 [GroupItemStateChangedEvent] - Power changed from ON to OFF through Regner_Power_001

2020-06-02 14:12:14.128 [vent.ItemStateChangedEvent] - Regner_Power_001 changed from ON to OFF

2020-06-02 14:12:14.162 [vent.ItemStateChangedEvent] - Sperre changed from ON to OFF

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

2020-06-02 14:12:56.864 [INFO ] [clipse.smarthome.model.script.regner] - 2. Durchlauf

2020-06-02 14:12:56.937 [INFO ] [clipse.smarthome.model.script.regner] - 2. Durchlauf von 3 Durchläufen.

2020-06-02 14:12:57.459 [INFO ] [clipse.smarthome.model.script.regner] - Nächster Regner: 003

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

2020-06-02 14:12:57.467 [ome.event.ItemCommandEvent] - Item 'Regner_Power_003' received command ON

2020-06-02 14:12:57.482 [GroupItemStateChangedEvent] - Power changed from OFF to ON through Regner_Power_003

2020-06-02 14:12:57.485 [vent.ItemStateChangedEvent] - Regner_Power_003 changed from OFF to ON

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

2020-06-02 14:12:57.490 [INFO ] [clipse.smarthome.model.script.regner] - Regenr wird nach 1 Minuten wieder abgeschaltet.

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

2020-06-02 14:13:05.445 [vent.ItemStateChangedEvent] - WetterAktuellZeit changed from 2020-06-02T14:03:04.000+0200 to 2020-06-02T14:13:05.000+0200

2020-06-02 14:13:05.499 [vent.ItemStateChangedEvent] - WetterAktuellTemp changed from 21.79 °C to 21.0 °C

2020-06-02 14:13:05.604 [vent.ItemStateChangedEvent] - Wetter3hTemp changed from 20.57 °C to 20.16 °C

2020-06-02 14:13:05.630 [vent.ItemStateChangedEvent] - Wetter3hTempMax changed from 20.57 °C to 20.16 °C

2020-06-02 14:13:05.685 [vent.ItemStateChangedEvent] - Wetter6hTemp changed from 16.98 °C to 16.81 °C

2020-06-02 14:13:05.696 [vent.ItemStateChangedEvent] - Wetter6hTempMax changed from 16.98 °C to 16.81 °C

2020-06-02 14:13:05.751 [vent.ItemStateChangedEvent] - Wetter12hTemp changed from 13.58 °C to 13.57 °C

2020-06-02 14:13:05.752 [vent.ItemStateChangedEvent] - Wetter12hTempMax changed from 13.58 °C to 13.57 °C

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

2020-06-02 14:13:57.496 [INFO ] [clipse.smarthome.model.script.regner] - 3. Durchlauf

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

2020-06-02 14:13:57.513 [ome.event.ItemCommandEvent] - Item 'Regner_Power_003' received command OFF

2020-06-02 14:13:57.534 [vent.ItemStateChangedEvent] - Regner_Power_003 changed from ON to OFF

2020-06-02 14:13:57.536 [GroupItemStateChangedEvent] - Power changed from ON to OFF through Regner_Power_003

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

2020-06-02 14:13:57.580 [INFO ] [clipse.smarthome.model.script.regner] - 3. Durchlauf von 3 Durchläufen.

2020-06-02 14:13:58.126 [INFO ] [clipse.smarthome.model.script.regner] - Nächster Regner: 005

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

2020-06-02 14:13:58.141 [ome.event.ItemCommandEvent] - Item 'Regner_Power_005' received command ON

2020-06-02 14:13:58.154 [GroupItemStateChangedEvent] - Power changed from OFF to ON through Regner_Power_005

2020-06-02 14:13:58.157 [vent.ItemStateChangedEvent] - Regner_Power_005 changed from OFF to ON

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

2020-06-02 14:13:58.172 [INFO ] [clipse.smarthome.model.script.regner] - Regenr wird nach 1 Minuten wieder abgeschaltet.

2020-06-02 14:14:58.176 [INFO ] [clipse.smarthome.model.script.regner] - 4. Durchlauf

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

2020-06-02 14:14:58.192 [ome.event.ItemCommandEvent] - Item 'Regner_Power_005' received command OFF

2020-06-02 14:14:58.206 [vent.ItemStateChangedEvent] - Regner_Power_005 changed from ON to OFF

2020-06-02 14:14:58.212 [GroupItemStateChangedEvent] - Power changed from ON to OFF through Regner_Power_005

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

2020-06-02 14:14:58.267 [INFO ] [clipse.smarthome.model.script.regner] - 4. Durchlauf von 3 Durchläufen.

2020-06-02 14:14:58.271 [INFO ] [clipse.smarthome.model.script.regner] - Alle Regner sind schon gelaufen!
Anscheinend startet die Beregnung wieder.
Wo ist mein Fehler ??

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

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

Beitrag von udo1toni »

Du musst natürlich auch den Timer stoppen. So:

Code: Alles auswählen

rule "Beregnung AUS"
when 
    Item Beregnung received command OFF
then
    logInfo("watering","Beregnung wird abgebrochen!")
    tRegner?.cancel
    tRegner = null
    gRegner.members.filter[i|i.name.contains("Power")].filter[j| j.state != OFF].forEach[r|r.sendCommand(OFF)] // alle Regner abschalten
    Sperre.postUpdate(OFF)
end
Vorteil dieser Variante ist, dass auch eine verwurschtelte Regel wieder gerade gerückt wird, da es keine weiteren Bedingungen gibt.
  • Es spielt keine Rolle, ob ein Timer läuft oder nicht, er wird sicher abgebrochen und die Variable wird mit null initialisiert.
  • Es spielt keine Rolle, ob ein Regner nun ON ist oder einen ungültigen Status hat, nach der Zeile mit mit den Members sind alle Regnerventile auf Status OFF.
  • Es spielt keine Rolle, ob die Sperre nun aktiv ist oder nicht, nach dem Ausschalten ist die Sperre aus.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

Gesperrt