OH3 - Nachlauf Badezimmerlüftung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

OH3 - Nachlauf Badezimmerlüftung

Beitrag von int5749 »

Hallo zusammen,

basierend auf einer Inspiration durch einen anderen Threat
udo1toni hat geschrieben: 9. Jan 2021 00:32 Ich habe bei mir z.B. eine variable Lüfter Nachlaufzeit, abhängig von der Einschaltdauer des Lichts. Beim kleinen Geschäft oder Händewaschen schaltet der Lüfter praktisch sofort wieder aus, beim großen Geschäft läuft er 5 Minuten nach, wenn jemand duscht, läuft er 15 Minuten nach. Das funktioniert eigentlich ganz zuverlässig.
habe ich versucht dies unter OH3 zu realisieren.

Code: Alles auswählen

var long vLampeBadSpiegel_Starttime
var Number vLampeBadSpiegel_Length

var Timer t_BadLuefter = null	//Timer zur Überwachung des Lüfters; getriggert durch Bad

rule "Badezimmer Luefter"
when
    Item Lampe_OG_Bad_Spiegel changed
then
    if (Lampe_OG_Bad_Spiegel.state == ON) {
        vLampeBadSpiegel_Starttime = new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000
            //starte Luefter hier)
        logInfo("TEST", "Badezimmer Lüfter beginnt bei {}:" ,(new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000).toString)
    } else if (Lampe_OG_Bad_Spiegel.state == OFF) {
        vLampeBadSpiegel_Length = (new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000) - vLampeBadSpiegel_Starttime

        if ((t_BadLuefter === null) && (vLampeBadSpiegel_Length <60)){
            t_BadLuefter = createTimer(now.plusSeconds(30))[|
            //abschalten Luefter
            logInfo("TEST", "Badezimmer Lüfter 1 ended bei {}:" ,(new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000).toString)
		    return;
			]        
        } else if ((t_BadLuefter === null) && (vLampeBadSpiegel_Length >60 && vLampeBadSpiegel_Length <300)){
            t_BadLuefter = createTimer(now.plusMinutes(5))[|
            logInfo("TEST", "Badezimmer Lüfter 2 ended bei {}:" ,(new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000).toString)
            //abschalten Luefter
			]        
		return;
        } else if ((t_BadLuefter === null) && (vLampeBadSpiegel_Length >300)){
            t_BadLuefter = createTimer(now.plusMinutes(15))[|
            logInfo("TEST", "Badezimmer Lüfter 3 ended bei {}:" ,(new DateTimeType().zonedDateTime.toInstant.toEpochMilli / 1000).toString)
            //abschalten Luefter
			]
		return;
        }
    }       
end

Ich bin mir nicht ganz sicher mit der Verschachtelung und ischer müsste man nun noch einmal die durchschnittlichen Zeiten der usecases prüfen.

Viele Grüße
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

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

Re: OH3 - Nachlauf Badezimmerlüftung

Beitrag von udo1toni »

Ein bisschen komplizierter ist es schon :)
Zum einen wollte ich gerne einen verzögerten Start des Lüfters haben. Der zweite (wichtigere) Punkt: Wenn jemand ins Bad kommt und der Lüfter läuft schon, sollte die Nachlaufzeit angepast werden. Voraussetzung dafür ist natürlich, dass der neue Stop-Zeitpunkt später liegt als der alte Stopzeitpunkt. Grenzfall für Deine Regel: Jemand hat die Toilette zwischen einer und fünf Minuten genutzt und macht das Licht wieder aus. Damit wird der Ausschalttimer auf 5 Minuten gesetzt. Unmittelbar danach kommt der nächste Gast in die Toilette, macht das Licht an und beendet sein Geschäft kurz vor Ende der alten Stopzeit. Er verlässt das Bad und Sekunden später geht der Lüfter aus.

Deshalb habe ich bei mir für diese Aufgabe zwei Rules:

Code: Alles auswählen

 var Number tStartTime_Bath = null
 var Number tStopTime_Bath = null
 var Timer tVentiTimeOn = null
 var Timer tVentiTimeOff = null

rule "Ventilator Bad"
 when
    Item LichtItem changed                                                    // Licht
 then
    tVentiTimeOn?.cancel                                                       // Einschaltverzögerung abbrechen
    if(LichtItem.state == ON) {
        if (LuefterItem.state == OFF) {                                       // Lüfter
            tStopTime_Bath = null
            tStartTime_Bath = now.millis
            logDebug("Nachlauf","Light ON @ {}", tStartTime_Bath)
            tVentiTimeOn = createTimer(now.plusSeconds(10), [|
                LuefterItem.sendCommand(ON)
            ])
        }
    }  else {
        logDebug("Nachlauf","Light OFF @ {}", now.millis)
        logDebug("Nachlauf","Motor_GF_Bath = {}", LuefterItem.state)
        if(LuefterItem.state == ON) {
            val runtime_Bath = ((now.millis - tStartTime_Bath)/1000).intValue
            logDebug("Nachlauf","runtime_Bath = {} sec", runtime_Bath)
            if (runtime_Bath > 900)                                            // > 15 Minuten
                NachlaufItem.postUpdate(900)
            else if (runtime_Bath > 300)                                       // > 5 Minuten
                NachlaufItem.postUpdate(300)
            else if (runtime_Bath > 120)                                       // > 2 Minuten
                NachlaufItem.postUpdate(120)
            else 
                NachlaufItem.postUpdate(10)
        }
        tStartTime_Bath = null
    }
end

rule "Nachlauf"
 when
    Item NachlaufItem received update                                          // Nachlaufzeit wurde gesetzt
 then 
    logDebug("Nachlauf","Nachlaufzeit = {} sec", NachlaufItem.state)
    LuefterItem.sendCommand(ON)
    var myStop = now.millis + 1000 * (NachlaufItem.state as Number).intValue 
    if (myStop > tStopTime_Bath || (NachlaufItem.state as Number).intValue == 0) {
        logDebug("Nachlauf","neuer Nachlauf länger als alter Nachlauf")
        tVentiTimeOff?.cancel
        tStopTime_Bath = myStop
        tVentiTimeOff = createTimer(now.plusSeconds((NachlaufItem.state as Number).intValue), [|
            if (LichtItem.state == OFF)
                LuefterItem.sendCommand(OFF)
            tStopTime_Bath = null
        ])
    }
    else { 
        logDebug("Nachlauf","alter Nachlauf länger als neuer Nachlauf")
    }
    logDebug("Nachlauf","tStopTime_Bath = {} ; myStop = {}", tStopTime_Bath, myStop)
end
Die erste Rule kümmert sich um die Messung der Einschaltdauer und das Setzen der des Nachlaufs. Hierbei ist zu bemerken, dass die Nachlaufzeit in einem Item gespeichert wird.
Die zweite Rule triggert auf dieses Item und entscheidet, ob der Lüfterstop neu geplant werden muss.

Die Zweiteilung hat noch einen weiteren Aspekt. Ich habe nämlich die Nachlaufzeit als Selection in meiner Sitemap eingebaut. Ich kann so auf Knopfdruck den Lüfter extra einschalten. Soll der Lüfter ausgeschaltet werden, so gibt es dafür extra die 0 als Nachlaufzeit.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

int5749
Beiträge: 1173
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: OH3 - Nachlauf Badezimmerlüftung

Beitrag von int5749 »

udo1toni hat geschrieben: 9. Jan 2021 21:19 Ein bisschen komplizierter ist es schon :)
Puhh, da werde ich erst einmal lesen müssen. Hmm, da war ich etwas kurz gehupft ;-)
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Antworten