Bedingung (als Schalter) in Rule einbauen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
ElBombo1
Beiträge: 39
Registriert: 15. Jul 2019 11:17
Answers: 0
Wohnort: Münster in Hessen

Bedingung (als Schalter) in Rule einbauen

Beitrag von ElBombo1 »

Hallo zusammen,

ich habe bereits die SuFu damit beauftragt aber irgendwie, haben mich die Treffer nicht wirklich weiter gebracht. Aus diesem Grund versuche ich es nun mit einem neuen Thread.

Als Einführung:

Ich betreibe Openhab V2.5 auf einem Raspberry PI 3 B+. Läuft alles stabil und da ich schon einmal Schiffbruch oder vielmehr "SD" Karten Bruch erlitten habe alles noch auf eine SSD gepackt und die SD Karte benötigt man lediglich noch zum Booten. Habe das alles unter bzw. mit "sudo openhabian-config'" erstellt. Das passt alles und läuft schon seit geraumer Zeit äußerst zufriedenstellend ohne irgendwelche Hänger.

Ich habe mir eine Rule gebaut mit der 3x am Tag unsere "Pool Pumpe" angefeuert wird und eine zweite Rule, die 3x am Tag die Pumpe wieder ausschaltet. Das Ganze läuft über Cron. Diese zwei Rules "Einschalten und Ausschalten" funktionieren auch soweit. Ich habe sie in eine Rule Datei gepackt.
Nachfolgend der Code:

Code: Alles auswählen

rule "Pumpe Pool START MO-SO "		// Start der Pumpe an 3 verschiedenen Uhrzeiten von MO - SO und Bedingung  ist, dass die Pumpe nicht bereits läuft
 
        when
                Time cron "0 0 9 ? * MON-SUN" or
                Time cron "0 0 16 ? * MON-SUN" or
                Time cron "0 0 20 ? * MON-SUN"   

        then

                if (Aussensteckdose1FRITZDECT210_Steckdose.state == OFF) {
                        Aussensteckdose1FRITZDECT210_Steckdose.sendCommand(ON)
                }
end



rule "Pumpe Pool STOP MO-SO "		// Stop der Pumpe an 3 verschiedenen Uhrzeiten von MO - SO und Bedingung  ist, dass die Pumpe bereits läuft
 
when
Time cron "0 30 10 ? * MON-SUN" or
Time cron "0 30 17 ? * MON-SUN" or
Time cron "0 30 21 ? * MON-SUN"
then

                if (Aussensteckdose1FRITZDECT210_Steckdose.state == ON) {
                        Aussensteckdose1FRITZDECT210_Steckdose.sendCommand(OFF)
                }
end
Nun würde ich gerne folgende drei Bedingungen mit rein bringen, was jedoch nicht wirklich klappt. Ich erläutere zuerst.
Ich habe mir über die Paper UI drei Items erstellt (Switch). Diese drei Switche habe ich auf je einen Button in HabPanel gelegt.
Diese drei Buttons sollen im Prinzip die Bedingung darstellen, ob eine Rule angefeuert wird oder nicht und genau das klappt nicht.
Ich hänge nun mal den oben geänderten Code mit an, der nicht funktioniert.

Code: Alles auswählen

rule "Pumpe Pool START MO-SO "		// Start der Pumpe an 3 verschiedenen Uhrzeiten von MO - SO und Bedingung  ist, dass die Pumpe nicht bereits läuft
 
        when
                Time cron "0 0 9 ? * MON-SUN" or
                Time cron "0 0 16 ? * MON-SUN" or
                Time cron "0 0 20 ? * MON-SUN"   


        then

                if (Aussensteckdose1FRITZDECT210_Steckdose.state == OFF && UrlaubsSchalter.state != OFF && AbwesenheitsSchalter.state != OFF && PumpePoolAutomatikSommerBetrieb.state != ON) {
                        Aussensteckdose1FRITZDECT210_Steckdose.sendCommand(ON)
                }
end



rule "Pumpe Pool STOP MO-SO "		// Stop der Pumpe an 3 verschiedenen Uhrzeiten von MO - SO und Bedingung  ist, dass die Pumpe bereits läuft
 
when
Time cron "0 30 10 ? * MON-SUN" or
Time cron "0 30 17 ? * MON-SUN" or
Time cron "0 30 21 ? * MON-SUN"

then

                if (Aussensteckdose1FRITZDECT210_Steckdose.state == ON  && UrlaubsSchalter.state != OFF && AbwesenheitsSchalter.state != OFF && PumpePoolAutomatikSommerBetrieb.state != ON) {
                        Aussensteckdose1FRITZDECT210_Steckdose.sendCommand(OFF)
                }
end
Könntet ihr mir vielleicht einen Tip (oder auch zwei) ;) geben, was ich falsch mache? Habe ich irgendwas vergessen vorher zu definieren oder gar etwas gebaut, was so gar nicht funktioniert? Bin euch auf jeden Fall für jeden Tip dankbar!

Habe auch VSC auf dem Rechner drauf inklusive der openHAB Extension, aber nunja, auch das funktioniert irgendwie nicht obwohl ich schon diverse Themen hierzu durchgeackert und eingestellt habe. Aber gut, das ist ein anderes Thema.

Im voraus schon einmal vielen Dank für Eure Kommentare.

Saludos
Eloy

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

Re: Bedingung (als Schalter) in Rule einbauen

Beitrag von udo1toni »

Die Frage ist ja, was nicht funktioniert. Auf den ersten Blick sehen die Rules gut aus. Um aber eventuelle Fehlfunktionen besser eingrenzen zu können, bietet es sich an, die Bedingungen anders zu formulieren:

Code: Alles auswählen

rule "Pumpe Pool START MO-SO "
when
    Time cron "0 0 9,16,20 * * ?" // täglich um 09:00, 16:00 und 20:00 Uhr
then
    logInfo("pumpe","Pumpe an getriggert")
    if(UrlaubsSchalter.state == OFF) {
        logInfo("pumpe","Urlausschalter OFF, Rule abbrechen!")
        return;
    }
    if(AbwesenheitsSchalter.state == OFF) {
        logInfo("pumpe","Abwesenheitsschalter OFF, Rule abbrechen!")
        return;
    }
    if(PumpePoolAutomatikSommerBetrieb.state == ON) {
        logInfo("pumpe","PumpePoolAutomatikSommerBetrieb ON, Rule abbrechen!")
        return;
    }
    if(Aussensteckdose1FRITZDECT210_Steckdose.state != ON) {
        logInfo("pumpe","Pumpe starten.")
        Aussensteckdose1FRITZDECT210_Steckdose.sendCommand(ON)
    }
end

rule "Pumpe Pool STOP MO-SO "
when
    Time cron "0 30 10,17,21 ? * MON-SUN" // täglich um 10:30, 17:30 und 21:30 Uhr
then
    logInfo("pumpe","Pumpe aus getriggert")
    if(UrlaubsSchalter.state == OFF) {
        logInfo("pumpe","Urlausschalter OFF, Rule abbrechen!")
        return;
    }
    if(AbwesenheitsSchalter.state == OFF) {
        logInfo("pumpe","Abwesenheitsschalter OFF, Rule abbrechen!")
        return;
    }
    if(PumpePoolAutomatikSommerBetrieb.state == ON) {
        logInfo("pumpe","PumpePoolAutomatikSommerBetrieb ON, Rule abbrechen!")
        return;
    }
    if(Aussensteckdose1FRITZDECT210_Steckdose.state != OFF) {
        logInfo("pumpe","Pumpe stoppen.")
        Aussensteckdose1FRITZDECT210_Steckdose.sendCommand(OFF)
    }
end
Die Funktion der beiden Rules ist identisch zu Deiner Rule, allerdings läuft die ganze Sache nun in einzelnen Schritten.
Zunächst wird der 1. Schalter geprüft. Steht dieser auf OFF, so wird die Rule beendet.
Falls die Rule weiter läuft, wird der zweite Schalter geprüft. Ist dieser auf OFF, wird die Rule beendet.
Falls die Rule weiter läuft, wird der dritte Schalter geprüft. Ist dieser auf ON, wird die Rule beendet.
Zum Abschluss wird der Zustand des Außensteckdose geprüft und gegebenenfalls korrigiert.

Vorteil dieser Herangehensweise ist (wie im Code demonstriert), dass man jeweils eine Meldung loggen kann, warum nicht geschaltet wurde.

Zum Verständnis: Bist Du sicher, dass Du die Logik richtig abgebildet hast? Ich würde erwarten, dass der Schalter PumpePoolAutomatikSommerBetrieb ON sein muss, damit die Rule automatisch die Pumpe steuert, also genau anders als in Deiner Logik. Ähnliches gilt auch für die anderen beiden Schalter, wobei da natürlich weitere Fragen auftauchen. Ich habe nun keinen Pool, weshalb ich auch nur mutmaßen kann, warum bei Abwesenheit das Wasser zirkulieren soll, nicht aber, wenn man da ist. Ich würde erwarten, dass das Poolwasser zur Reinigung auf jeden Fall gepumpt werden muss.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

ElBombo1
Beiträge: 39
Registriert: 15. Jul 2019 11:17
Answers: 0
Wohnort: Münster in Hessen

Re: Bedingung (als Schalter) in Rule einbauen

Beitrag von ElBombo1 »

Buenos dias Udo,

oO ich glaube du hast völlig Recht mit Deiner Vermutung, das ich die Logik etwas "vertauscht" habe... Knoten im alten Elektro Hirn... An der Stelle schon einmal vielen Dank an dich!

Die Pumpe soll immer laufen außer, wir schalten die Automatik hierfür aus. Die anderen beiden "Schalter" sind wie der Name bereits zu erkennen gibt, für eine kurze Abwesenheit außer Haus oder halt Urlaub. Wenn einer von beiden Schaltern an sein sollte, soll die "Pumpen Automatik Rule" nicht greifen.

Die umgeschriebene Rule ist natürlich der Knaller! So fein wie du das jetzt gemacht hast, nunja, dafür müsste ich ganz tief in alte Unterlagen schauen. .. Auch an dieser Stelle schon einmal vielen vielen Dank an dich!

Ich werde nun einfach mal deine verbesserte Rule implementieren und berichte dir nochmal kurz dazu.

Muchas gracias Udo!

Saludos

Eloy

P.S: Wie ich soeben festgestellt habe wohnen wir ziemlich nah beieinander :). Wir kommen aus Münster bei Dieburg

ElBombo1
Beiträge: 39
Registriert: 15. Jul 2019 11:17
Answers: 0
Wohnort: Münster in Hessen

Re: Bedingung (als Schalter) in Rule einbauen

Beitrag von ElBombo1 »

Hallo Udo,

Deine Rule funktioniert wunderbar! Das mit den logs ist echt eine feine Sache, konnte genau erkennen wo sie aussteigt. TOP!

Nochmal vielen Dank Udo, hast mir viele Stunden grübeln und nachschlagen erspart.

Muchas gracias!

Saludos

Eloy

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

Re: Bedingung (als Schalter) in Rule einbauen

Beitrag von udo1toni »

Gerne :)

In Münster (Ortsteil Altheim) hatte ich mal eine Freundin :) ist aber schon ein paar Jahrzehnte her...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten