Ankündigung

Einklappen
Keine Ankündigung bisher.

variable Nachlaufsteuerung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    variable Nachlaufsteuerung

    Der nächste Berg, derselbe Ochse...

    Für den Lüfter im Badezimmer schwebt mir folgendes vor:

    Licht an-> nach 30 sec. geht der Lüfter an. Wenn vorher das Licht ausgeschaltet wird, passiert nichts. (Das bekomme ich anhand des demos hin, denke ich).
    Wenn das Licht wieder ausgeht, soll der Lüfter noch eine Zeit weiterlaufen, abhängig davon, wie lange das Licht an war (aka ob es ein kleines oder großes Geschäft war, oder ob jemand geduscht hat). Da könnte ich mit einigen Stufen leben, aber vielleicht gibt es ja eine elegantere Lösung.
    Das nächste Problem tritt auf, wenn kurze Zeit nach dem Abschalten wieder jemand ins Bad geht. Dann sollte der Lüfter sich nach dem längsten Nachlauf richten, also z.b . nach dem Duschen wäscht sich jemand die Hände, dann sollte der Lüfter eben trotzdem volle 12 Minuten weiterlaufen, auch wenn das Licht zwischendrin nur 40 sec. an war...

    #2
    Nach ein bisschen Rumgeschreibsel bin ich schon etwas weiter (siehe Code unten).
    Wenn das Licht eingschaltet wird, startet nach 10 Sekunden der Lüfter (falls er nicht ohnehin schon lief).
    Wenn das Licht ausgeschaltet wird, wird die Nachlaufzeit anhand der Einschaltzeit berechnet und in vier Stufen geschaltet.
    Weiterhin kann der Lüfter über die UI manuell gestartet werden (mit den vier Nachlaufzeiten).

    Code:
    var long StartTime_Bath = 0 
    var long runtime_Bath = 0
    var Timer VentiTimeOn = null
    var Timer VentiTimeOff = null
    
    rule "Ventilator Bad"
    when
        Item Light_GF_Bath received update
    then
        if(Light_GF_Bath.state==ON && VentiTimeOn==null ) {
    // first ON command, so create a timer to turn the light off again
            StartTime_Bath = now.millis
            logDebug("daheim.rules","StartTime_Bath = "+ StartTime_Bath)
            VentiTimeOn = createTimer(now.plusSeconds(10)) [|
                sendCommand(Motor_GF_Bath, ON)
                ]
        } else if(Light_GF_Bath.state==OFF) {
            // remove any previously scheduled timer
            if(VentiTimeOn!=null) {
                logInfo("daheim.rules","StopTime_Bath = "+ now.millis)
                VentiTimeOn.cancel
                VentiTimeOn = null
            }    
            logInfo("daheim.rules","Motor_GF_Bath = " + Motor_GF_Bath.state)
            if(Motor_GF_Bath.state==ON) {
                runtime_Bath = (now.millis - StartTime_Bath)
                logInfo("daheim.rules","runtime_Bath = "+ runtime_Bath)
                if (runtime_Bath > 900000)
                    Motor_GF_Bath_afterrun.postUpdate(900)
                else if (runtime_Bath > 300000)
                    Motor_GF_Bath_afterrun.postUpdate(300)
                else if (runtime_Bath > 60000)
                    Motor_GF_Bath_afterrun.postUpdate(120)
                else 
                    Motor_GF_Bath_afterrun.postUpdate(0)
                
            }
        }
    end
    
    rule Nachlauf
    when
        Item Motor_GF_Bath_afterrun received update
    then {
            logInfo("rules.afterrun","Nachlaufzeit = " + Motor_GF_Bath_afterrun.state.toString + " sec")
            sendCommand(Motor_GF_Bath, ON)
            if (VentiTimeOff!=null) {
                VentiTimeOff.cancel
                VentiTimeOff = null
                }
            VentiTimeOff = createTimer(now.plusSeconds((Motor_GF_Bath_afterrun.state as DecimalType).intValue)) [|
                sendCommand(Motor_GF_Bath, OFF)
                ]
        }
    end
    Aber wie finde ich raus, bis wann der Timer läuft (Um die alte Sollzeit mit der neuen Sollzeit abzugleichen)?

    Kommentar

    Lädt...
    X