Fensterlüftung Rule

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Sigi
Beiträge: 15
Registriert: 4. Jan 2020 23:50
Answers: 0

Fensterlüftung Rule

Beitrag von Sigi »

Ihr Lieben,

ich habe ein Problem mit meiner Fenstersteuerung:

Gedacht ist, dass mit dem Dummy-Item VE_FE_St angegeben wird, wie lange das Fenster geöffnet bleibt, bevor es automatisch wieder schließt.
Zudem soll es bei 0 schließen und bei 1 öffen, ohne dann wieder zu schließen.
Ab 2 soll das Fenster dann so viele Minuten aufbleiben, wie das Dummy-Item VE_FE_St angibt.

Code: Alles auswählen

//Shelly_VE_25_Pos		Item für Antrieb
//VE_FE_St			Dummy-Item zur Ansteuerung

var Timer t_FeAu = null

rule "Fenster"

when
    Item VE_FE_St changed                                       

then
    val Number Fenster_a = VE_FE_St.state as DecimalType

    if (Fenster_a == 0){
        t_FeAu?.cancel
        Shelly_VE_25_Pos.sendCommand (0)                        
    }
    else if (Fenster_a == 1){
        t_FeAu?.cancel
        Shelly_VE_25_Pos.sendCommand (80)
    }
    else if (Fenster_a > 1){
        t_FeAu?.cancel
        Shelly_VE_25_Pos.sendCommand (80)
        t_FeAu = createTimer(now.plusMinutes(Fenster_a), [|
            VE_FE_St.sendCommand (0)
        ])
    }
end
Öffene und schließen lässt sich das Fenster, jedoch klappt das automatische schließen leider nicht.

Eventuell kann mir jemand helfen, den Fehler zu beheben.

Danke im Voraus,
Sigi

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

Re: Fensterlüftung Rule

Beitrag von udo1toni »

Das liegt vermutlich am Datentyp :)

Die Rule schreit nach Optimierung...

Code: Alles auswählen

//Shelly_VE_25_Pos		Item für Antrieb
//VE_FE_St			Dummy-Item zur Ansteuerung

var Timer t_FeAu = null

rule "Fenster"
when
    Item VE_FE_St received update
then
    if(!(VE_FE_St.state instanceof Number))                     // falls kein gültiger Wert geliefert wird
        return;                                                 // Abbruch

    val Integer Fenster_a = (VE_FE_St.state as Number).intValue // Wert als Integer speichern
    if(Fenster_a < 0)                                           // falls illegaler Wert
        return;                                                 // Abbruch

    t_FeAu?.cancel                                              // Timer abbrechen, falls existent
    var nSoll = 80                                              // Default öffnen auf 80
    switch(Fenster_a) {                                         // fallweise mit beliebig vielen Fällen
        case  0: nSoll = 0                                      // falls 0 -> Sollwert auf 0
        case  1: {}                                             // falls 1 -> bleibe beim Default (80)
        default: {                                              // in allen anderen Fällen
            t_FeAu = createTimer(now.plusMinutes(Fenster_a), [| // Timer anlegen (plusMinutes erwartet Integer)
                VE_FE_St.sendCommand (0)                        // Fenster zu
            ])                                                  // Ende Timer
        }                                                       // Ende default
    }                                                           // Ende switch-case
    if(Shelly_VE_25_Pos.state != nSoll)                         // Falls Soll von Ist abweicht
        Shelly_VE_25_Pos.sendCommand (nSoll)                    // Fenster auf Soll fahren
end
Die leere case-Anweisung liegt an der "zu hohen" Optimierung :) man könnte natürlich auch nSoll in jedem Zweig setzen, aber warum sollte man...
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Sigi
Beiträge: 15
Registriert: 4. Jan 2020 23:50
Answers: 0

Re: Fensterlüftung Rule

Beitrag von Sigi »

Vielen lieben Dank,

dein Code funktioniert hervorragend.

Werde wohl noch eine Weile brauchen, um so was selbst so schön hinzukommen.

Danke nochmals

Antworten