Rule erstellen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Rule erstellen

Beitrag von Innocent »

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 !
Openhab 2 auf RaspberryPi 4

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

Re: Rule erstellen

Beitrag von udo1toni »

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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.4, LXC), mit openHABian eingerichtet

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

Re: Rule erstellen

Beitrag von Innocent »

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.
Openhab 2 auf RaspberryPi 4

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

Re: Rule erstellen

Beitrag von udo1toni »

Ich zitiere aus dem Code:

Code: Alles auswählen

    if(newState == OFF && Ruehrwerkdauerbetrieb.state != ON) {
        SpsDgk1RelayOutput.sendCommand(OFF)
        // weitere Aufgaben beim Abschalten der Automatik
        return;
    }
Falls der Dauerbetrieb nicht aktiv ist und die Automatik abgeschaltet wird, wird auch das Rührwerk direkt abgeschaltet.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.4, LXC), mit openHABian eingerichtet

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

Re: Rule erstellen

Beitrag von Innocent »

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.
Openhab 2 auf RaspberryPi 4

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

Re: Rule erstellen

Beitrag von Innocent »

Das stimmt doch was nicht, oder?
Openhab 2 auf RaspberryPi 4

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

Re: Rule erstellen

Beitrag von udo1toni »

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:

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
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:

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
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:

Code: Alles auswählen

Switch item=RuehrwerkSteuerung label="Rührwerk[]" mappings=["AUS"="Aus","AN"="An","AUTO"="Auto"]
In der Main UI geht das auch mit verschiedenen Widgets, dort sieht die Konfiguration natürlich etwas anders aus.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.4, 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: 14. Feb 2025 12:28
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.

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

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

Re: Rule erstellen

Beitrag von Innocent »

Rule funktioniert nun so, wie gewollt... Vielen Dank.
Schlankere Version scheitert.
Da wird aber beim Item gemeckert.
Missing EOF bei = glaube war es...
Openhab 2 auf RaspberryPi 4

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

Re: Rule erstellen

Beitrag von udo1toni »

Innocent hat geschrieben: 15. Feb 2025 11:22 Rule funktioniert nun so, wie gewollt... Vielen Dank.
Schlankere Version scheitert.
Da wird aber beim Item gemeckert.
Missing EOF bei = glaube war es...
An welcher Stelle?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.4, LXC), mit openHABian eingerichtet

Antworten