Seite 1 von 1

Fensterlüftung Rule

Verfasst: 12. Jun 2021 15:50
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

Re: Fensterlüftung Rule

Verfasst: 12. Jun 2021 19:46
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...

Re: Fensterlüftung Rule

Verfasst: 12. Jun 2021 23:04
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