Rule erstellen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Innocent
Beiträge: 238
Registriert: 29. Jul 2020 12:40
Answers: 0

Rule erstellen

Beitrag von Innocent »

Guten Morgen zusammen.

Ich bin Hobbybrauer und bald steht ein neuer Sud an.
Zuletzt habe ich mir ein Rührwerk zum Maischen gebaut.
Nun würde ich gerne per Openhab und einer Shelly Plug S das Rührwerk automatisieren.
Gerne hätte ich das das Rührwerk alle x Minuten für y Minuten läuft, wenn ich einen Switch aktiviere und auch wieder aus schaltet wenn der Switch aus geschaltet wird.
Dies habe ich soweit hinbekommen, möchte aber nun, daß in der Zeit wo aufgeheizt wird, per zweiten Switch das Rührwerk ständig läuft. Wie stelle ich das an?

Ich hoffe, ich habe verständlich ausgedrückt, worum es mir geht.

Guten Start in die Woche. 😊
Openhab 2 auf RaspberryPi 4

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

Re: Rule erstellen

Beitrag von PeterA »

Och ja so ein schönes Craft Bier ist schon was feines🍺

Poste doch mal bitte die Rule.
- OpenHab 2.4
#PWRUP

Innocent
Beiträge: 238
Registriert: 29. Jul 2020 12:40
Answers: 0

Re: Rule erstellen

Beitrag von Innocent »

Mache ich, wenn ich wieder zu Hause bin.

Bzw hier als Screenshot.
IMG_20250209_184555_edit_722893021605839.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Openhab 2 auf RaspberryPi 4

Innocent
Beiträge: 238
Registriert: 29. Jul 2020 12:40
Answers: 0

Re: Rule erstellen

Beitrag von Innocent »

Hier als Text

Code: Alles auswählen


rule "Rührwerk Automatik"

when  
    Time cron"0 0/3 * * * ?"               // an alle 3 Minuten
then
    if(Ruehrwerkautomatik.state != ON &&
       Ruehrwerkdauerbetrieb.state == ON)
        return;    
    SpsDgk1RelayOutput.sendCommand(ON)     // Shelly Plug S 1
        createTimer(now.plusMinutes(1)) [| SpsDgk1RelayOutput.sendCommand(OFF)]   // aus nach 1 Minute

    
end
Openhab 2 auf RaspberryPi 4

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

Re: Rule erstellen

Beitrag von udo1toni »

Also, eventuell könnte man das noch etwas optimieren :) aber als erster Ansatz:

Code: Alles auswählen

// Switch SpsDgk1RelayOutput    -> Rührwerk
// Switch SpsDgk2RelayOutput    -> Heizung?
// Switch Ruehrwerkautomatik    -> Automatikbetrieb
// Switch Ruehrwerkdauerbetrieb -> Dauerbetrieb
// Number RuehrwerkZeitAn       -> Einschaltzeit
// Number RuehrwerkZeitAus      -> Ausschaltzeit

// globale Variablen
var Timer  tRuehrwerk    = null // 
var Number nRuehrwerkOn  = 1
var Number nRuehrwerkOff = 2

rule "Rührwerk Automatik"
when
    Item Ruehrwerkautomatik changed
then
    tRuehrwerk?.cancel
    if(newState == OFF && Ruehrwerkdauerbetrieb.state != ON) {
        SpsDgk1RelayOutput.sendCommand(OFF)
        // weitere Aufgaben beim Abschalten der Automatik
        return;
    }
    nRuehrwerkOn  = if(RuehrwerkZeitAn.state  instanceof Number) (RuehrwerkZeitAn.state as Number).intValue else 1
    nRuehrwerkOff = if(RuehrwerkZeitAus.state instanceof Number) (RuehrwerkZeitAus.state as Number).intValue else 2
    tRuehrwerk = createTimer(now,[|
        var soll = OFF
        if(SpsDgk1RelayOutput.state != ON)    soll = ON
        if(Ruehrwerkdauerbetrieb.state == ON) soll = ON
        val zeit = if(soll == ON) nRuehrwerkOn else nRuehrwerkOff
        if(SpsDgk1RelayOutput.state != soll)
            SpsDgk1RelayOutput.sendCommand(soll.toString)
        tRuehrwerk.reschedule(now.plusMinutes(zeit))
    ])
end
Die Rule wird jedes Mal ausgeführt, wenn der Automatik-Schalter seinen Status wechselt.
Als erstes wird ein eventuell vorhandener Timer gelöscht.
Anschließend prüft die Rule, ob das Rührwerk abgeschaltet werden muss (Dauerbetrieb ist aus und Automatikbetrieb ist aus). Ist das der Fall, so schaltet die Rule das Rührwerk ab und beendet sich danach selbst (weitere Aufgaben können hier auch noch eingebaut werden).
Ist der Neue Status hingegen ON oder Dauerbetrieb ist ON, so holt sich die Rule die eingestellten Zeiten für Rühren und Pause aus den beiden Items, wobei als Default Wert 1 Minute Rühren und 2 Minuten Pause genommen werden, falls die Items keinen gültigen Wert liefern.
Anschließend wird der Timer angelegt und unmittelbar ausgeführt.

Innerhalb des Timers wird der Sollszustand auf OFF festgelegt. Anschließend prüft der Code, ob der Motor aus ist, dann muss der Sollzustand auf ON gewechselt werden. Das gleiche gilt, falls Dauerbetrieb aktiv ist.
Nun wird abhängig vom Sollzustand die Dauer bis zur nächsten Ausführung des Timers festgelegt. Anschließend wird das Relais auf den Sollzustand geschaltet und der Timer für die erneute Ausführung eingeplant.

Unschön: Ob der Dauerbetrieb beendet wurde, wird nur überprüft, wenn der Timer ausgeführt wird, es kommt also darauf an, welche An-Zeit eingestellt ist. Bei einer Minute sollte das aber unkritisch sein :)
Ansonsten wechselt der Timer immer zwischen ON und OFF hin und her, mit den beiden Zeiten nRuehrwerkOn und nRuehrwerkOff.

Frage zum Vorgang: Kannst Du nicht direkt auswerten, ob die Heizung aktiv ist? Dann könntest Du Dir evtl. den Schalter für den Dauerbetrieb sparen?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Innocent
Beiträge: 238
Registriert: 29. Jul 2020 12:40
Answers: 0

Re: Rule erstellen

Beitrag von Innocent »

Guten Morgen und vielen lieben Dank.

Zu deiner Frage, leider kann ich aktuell nicht auswerten ob die Heizung aktiv ist.
Eventuell werde ich zukünftig eine Shelly an die Heizung nehmen, dann wäre das möglich.
Habe aber aktuell kein Problem damit, den Schalter für Dauerbetrieb zu drücken.

VSC meckert etwas rum. Dazu der Screenshot.

Code: Alles auswählen

// Switch SpsDgk1RelayOutput    -> Rührwerk
// Switch SpsDgk2RelayOutput    -> Heizung?
// Switch Ruehrwerkautomatik    -> Automatikbetrieb
// Switch Ruehrwerkdauerbetrieb -> Dauerbetrieb
// Number RuehrwerkZeitAn       -> Einschaltzeit
// Number RuehrwerkZeitAus      -> Ausschaltzeit

// globale Variablen
var Timer  tRuehrwerk    = null // 
var Number nRuehrwerkOn  = 1
var Number nRuehrwerkOff = 2

rule "Rührwerk Automatik"
when
    Item Ruehrwerkautomatik changed
then
    tRuehrwerk?.cancel
    if(newState == OFF && Ruehrwerkdauerbetrieb.state != ON) {
        SpsDgk1RelayOutput.sendCommand(OFF)                         // eventuelle weitere Aufgaben beim Abschalten der Automatik
        return;
    }
    nRuehrwerkOn  = if(nRuehrwerkOn.state  instanceof Number) (nRuehrwerkOn.state as Number).intValue else 1
    nRuehrwerkOff = if(nRuehrwerkOff.state instanceof Number) (nRuehrwerkOff.state as Number).intValue else 2
    tRuehrwerk = createTimer(now,[|
        var soll = OFF
        if(SpsDgk1RelayOutput.state != ON)    soll = ON
        if(Ruehrwerkdauerbetrieb.state == ON) soll = ON
        val zeit = if(soll == ON) nRuehrwerkOn else nRuehrwerkOff
        if(SpsDgk1RelayOutput.state != soll)
            SpsDgk1RelayOutput.sendCommand(soll.toString)
        tRuehrwerk.reschedule(now.plusMinutes(zeit))
    ])
    end
    

VSC.jpg
Ich konnte zwei andere Fehler selbst finden und hoffe ich habe richtig korrigiert.

Die Variablen waren unterschiedlich benannt. Stimmt das?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Openhab 2 auf RaspberryPi 4

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

Re: Rule erstellen

Beitrag von udo1toni »

Nö, Du hast da am Script rumgedoktert :)

Die Ausdrücke nRuehrwerkOn.state und nRuehrwerkOff.state müssen RuehrwerkZeitAn.state und RuehrwerkZeitAus.state heißen (das wären die beiden Number Items, um die beiden Zeiten bequem über die UI einstellen zu können).
Der Fehler mit der lokalen Konstanten zeit sollte sich dann von selbst erledigen, weil nRuehrwerkOn bzw. nRuehrwerkOff ja Integer liefern.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Innocent
Beiträge: 238
Registriert: 29. Jul 2020 12:40
Answers: 0

Re: Rule erstellen

Beitrag von Innocent »

udo1toni hat geschrieben: 11. Feb 2025 18:48 Nö, Du hast da am Script rumgedoktert :)

Die Ausdrücke nRuehrwerkOn.state und nRuehrwerkOff.state müssen RuehrwerkZeitAn.state und RuehrwerkZeitAus.state heißen (das wären die beiden Number Items, um die beiden Zeiten bequem über die UI einstellen zu können).
Der Fehler mit der lokalen Konstanten zeit sollte sich dann von selbst erledigen, weil nRuehrwerkOn bzw. nRuehrwerkOff ja Integer liefern.
Ok. Rumgedoktert habe ich tatsächlich, weil VSC gemeckert hat.

Werde es nochmal vin dir 1 zu 1 übernehmen und das Gemecker posten.

Grüße 😃

Was mögt ihr so für Biere? 🤔
Openhab 2 auf RaspberryPi 4

Innocent
Beiträge: 238
Registriert: 29. Jul 2020 12:40
Answers: 0

Re: Rule erstellen

Beitrag von Innocent »

So ist es 1:1 im VSC :shock: ,,
VSC.jpg
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Openhab 2 auf RaspberryPi 4

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

Re: Rule erstellen

Beitrag von udo1toni »

Wie im Code vermerkt fehlen Items.

Code: Alles auswählen

// Number RuehrwerkZeitAn       -> Einschaltzeit
// Number RuehrwerkZeitAus      -> Ausschaltzeit
Ansonsten fehlte da tatsächlich eine schließende Klammer, und zwar unmittelbar vor dem Wort end

Falls Du die Zeit nicht frei wählen können willst :) kannst Du die Rule auch etwas entschlacken:

Code: Alles auswählen

// globale Variablen
var Timer  tRuehrwerk    = null // 
var Integer nRuehrwerkOn  = 1
var Integer nRuehrwerkOff = 2

rule "Rührwerk Automatik"
when
    Item Ruehrwerkautomatik changed
then
    tRuehrwerk?.cancel
    if(newState == OFF && Ruehrwerkdauerbetrieb.state != ON) {
        SpsDgk1RelayOutput.sendCommand(OFF)
        // weitere Aufgaben beim Abschalten der Automatik
        return;
    }
    tRuehrwerk = createTimer(now, [|
        var soll = OFF
        if(SpsDgk1RelayOutput.state != ON)    soll = ON
        if(Ruehrwerkdauerbetrieb.state == ON) soll = ON
        val zeit = if(soll == ON) nRuehrwerkOn else nRuehrwerkOff
        if(SpsDgk1RelayOutput.state != soll)
            SpsDgk1RelayOutput.sendCommand(soll.toString)
        tRuehrwerk.reschedule(now.plusMinutes(zeit))
    ])
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten