Offene Fenster nie wieder vergessen…

Wer kennt es nicht? Fenster aufgemacht, Anruf angenommen, dann klingelt es noch an der Türe, im Kopf ist man noch ganz woanders und dann denkt man nicht mehr daran, dass im Dachgeschoß noch das Fenster total offen ist… Gerade im Winter ärgerlich, wenn deswegen die Räume herunterkühlen. Da ich mir vor einiger Zeit an alle Fenster einen Sensor (Homematic Fenstergriff-Sensor) rangebaut habe, der den Status offen, gekippt oder geschlossen weitergeben kann, wollte ich dafür gleich einen neuen Anwendungszweck schaffen.

Zurück zu den offenen Fenstern: Damit das nicht mehr auftritt, kann openHAB helfen. Hier hilft eine Regel, die alle 1 Minute prüft, ob ein Fenster offen ist, wenn ja, dann gibt’s eine Meldung per Alexa-Text-To-Speech sowie via telegram auf’s Handy. Die Meldung via Bot / Telegram soll aber nur erfolgen, wenn bereits einmal nur per Alexa Text-To-Speech darauf hingewiesen wurde. Aber das Ganze soll natürlich noch konfigurierbar sein (An/Aus) sowie Temperaturabhängig (erst unter 15 Grad z.B.) und zuletzt soll auch die Dauer, ab wann gewarnt wird, einstellbar sein (z.B. 15 Minuten).

Voraussetzungen hierfür

  • Weather-Binding, um die Außentemperatur berücksichtigen zu können (bei mir ist das das item wetter_temperatur)
  • Persistence (bei mit mapdb), damit man weiß, wann der letzte Update eines Status eines items war (sonst wird die Rule viel komplizierter…)
  • Benennung der Fenster-Items im Format <Stockwerk>_FENSTER_<Bezeichnung>, also z.B. DG_FENSTER_SCHLAFZIMMER (wird dann automatisch in spechbares Umgewandelt, unterstütze Stockwerke KG=Keller, EG=Erdgeschoß, OG=Obergeschoß, DG=Dachgeschoß. Im Replace auf den Text einfach ggf. entspr. anpassen.

Dann kanns losgehen:

Items-File

Grundsätzlich müssen die Fensterkontakte, die später auf einen möglichen Status OPEN geprüft werden, in einer Gruppe gruppeFensterAlle stecken.

// Fenster-Offen-Warnung-Items
Switch fensterOffenWarnungAnAus         "Warnung wenn Fenster offen"    <switch>
Number fensterOffenWarnungTemperatur    "Warnen wenn Temperatur unter x Grad [%d]" <window>
Number fensterOffenWarnungMinuten       "Warnung wenn länger offen als x Minuten [%d]" <window>

Rules-File

var String logPrefix = 'Fensterüberwachung: '
var boolean log = true
rule "Fenster geöffnet"
when    Time cron "0 0/1 * * * ?" // Alle 1 Minute
then
    // Check ob Variablen passen, ansonsten defaultwert setzen
    if ((fensterOffenWarnungAnAus.state != OFF) && (fensterOffenWarnungAnAus.state != ON)) {
        fensterOffenWarnungAnAus.sendCommand(OFF)
        logInfo('rules', logPrefix + 'Setze Default-Wert für fensterOffenWarnungAnAus=Aus')
    }
    if (fensterOffenWarnungTemperatur.state == NULL) {
        fensterOffenWarnungTemperatur.postUpdate(15)
        logInfo('rules', logPrefix + 'Setze Default-Wert für fensterOffenWarnungTemperatur=15')
    }
    if (fensterOffenWarnungMinuten.state == NULL) {
        fensterOffenWarnungMinuten.postUpdate(15)
        logInfo('rules', logPrefix + 'Setze Default-Wert für fensterOffenWarnungMinuten=15')
    }
    // botmeldung nur ab zweiter Meldung
    var boolean useBot = false
    // Ist Automatik an?
    if (fensterOffenWarnungAnAus.state == ON) {
        // Ist es kalt genug?
        if (wetter_temperatur.state <= (fensterOffenWarnungTemperatur.state as DecimalType)) {
            var String meldeText = '' 
            // zuerst schauen wir, ob Fenster noch in die Liste rein müssen, wenn noch nicht enthalten
            gruppeFensterAlle.members.filter[ i | i.state.toString() == 'OPEN'].forEach[i|
                var lastUpdate = i.lastUpdate("mapdb").toDateTime;
                // Ermitteln, wie lange in Sekunden das Fenster nun offen ist
                var long offenInMinuten = (now.getMillis() - lastUpdate.getMillis())/(1000*60);
                if (log) logInfo('rules', 'letztes Update von ' + i.name + ' (Status: ' + i.state.toString() + '): ' + lastUpdate + ' - offen in Minuten: ' + offenInMinuten.toString())
                if (offenInMinuten >= (fensterOffenWarnungMinuten.state as DecimalType)) {
                    meldeText+=i.name.toString() + ' seit ' + offenInMinuten + ' Minuten, '
                }
                if (offenInMinuten > (fensterOffenWarnungMinuten.state as DecimalType)) {
                    // Nun auch per Telegram warnen - TTS ist in dem Fall bereits erfolgt
                    useBot = true
                }
            ]
            if (meldeText != '') {
                // Besser les- und hörbar machen
                meldeText = 'Achtung - es sind Fenster seit einiger Zeit komplett offen: ' + meldeText.replaceAll('KG_','Kellergeschoß_').replaceAll('EG_','Erdgeschoß ').replaceAll('OG_','Obergeschoß ').replaceAll('DG_','Dachgeschoß ').replaceAll('_',' ') + ' bitte schließen!'

                if (log) logInfo('rules', logPrefix + 'Meldung über offene Fenster wird erfolgen...')
                // Text per Telegram und Alexa rausschicken...
                ALEXA_EG_WOHNEN_TTS.sendCommand(meldeText)
                if (useBot) {
                    sendTelegram("bot1", meldeText)
                    sendTelegram("bot2", meldeText)
                }
            }

        } else {
            if (log) logInfo('rules', logPrefix + 'Es ist nicht kalt genug. Temperatur ist ' + wetter_temperatur.state.toString() + ' Schwellwert: ' + fensterOffenWarnungTemperatur.state.toString())
        }
    }
end 

Das Rule-File ist so gestrickt, dass Werte, falls sie nicht vorhanden sind, mit einem Default-Wert initialisiert werden (Automatik inaktiv, 15 Grad, 15 Minuten).

Sitemap-File

(...)
Text label="Fensterwarnung" icon=window{
     Frame label="Konfiguration Fenster" {
         Switch item=fensterOffenWarnungAnAus
         Setpoint item=fensterOffenWarnungTemperatur minValue=-30 maxValue=23 step=1
         Setpoint item=fensterOffenWarnungMinuten minValue=5 maxValue=60 step=1
     }
 }
(...)

Das Ergebnis

Wenn nun es kälter gleich 15 Grad ist, ein Fenster über 15 Minuten offen ist, dann erfolgt eine Warnung per Telegram sowie eine Textansage via Amasons Alexa.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.