openHAB: Bewegungsmelder mit variabel gedimmtem Licht

Mit Bewegungssensoren und Schaltaktoren kann man ganz gut Lichter nur dann schalten, wenn auch jemand sich bewegt und das Licht gebraucht wird. Hierzu gibt es grundsätztlich zwar die Möglichkeit, in homematic den Bewegungsmelder direkt mit einem Licht zu verknüpfen, aber das bietet sich tatsächlich dann doch nicht immer an.

Als problematisch erwiesen sich hier bei mir folgende Aspekte:

  • Der Helligkeitswert des Sensors verfälscht sich, denn wenn das Licht an ist, dann ist es ja hell und irgendwann ist die Helligkeit ja dann auch der Auslöser, das Licht wieder abzuschalten. Es ist zwar möglich die Helligkeitswerte als Mittelwert der letzten 1-8 Messungen übertragen zu lassen, aber irgendwann passt der Wert einfach nicht mehr
  • Gerade bei kurzen Schaltzeiten ist es wichtig, nicht nach z.B. 15 Sekunden zu prüfen, ob die Bewegung aus ist und dann gleich das Licht aus zu machen, vielmehr wünsche ich mir hier einen Timer, der nochmal z.B. 10 Sekunden wartet und erst wenn dann in dem Wartezeitraum wirklich keine Bewegung mehr statt fand, das Licht ausschaltet
  • In einem Flur vor den Kinderzimmern soll das Licht nicht nur an und aus gehen, je nach Tageszeit (und damit Schlafzeit der Kinder) soll der Aktor (in diesem Fall ein Dimmer) verschiedene Helligkeitswerte schalten. Tags heller (z.B. 70%) und nachts dunkler (z.B. 17%). So dient das Flurlicht nachts als Nachlicht-on-demand und leuchtet gerade so den Weg zum Bad für die Kleinen aus und macht sie nicht zu wach.
  • Wurde das Licht manuell angeschalten (100%) oder Heller als der Tageswert gedreht, soll es so lange anbleiben, bis es auch manuell wieder ausgeschalten wird.

Dies ergibt somit folgende Anforderungen:

  • Der unverwässerte Helligkeitswert (Licht ist aus) muss mitgespeichert werden, um zu wissen, ob überhaupt das Licht an oder aus geschalten werden soll
  • Wir brauchen einen Timer, der den Nachlauf erledigt
  • Wir brauchen einen Abgleich der Tageszeiten, damit es nachts, wenn es draußen dunkel ist, auch drinnen nicht zu hell wird.

Zur Berücksichtigung der Zeiten für Sonnenauf- und -untergang wird auf das Astro-Binding von openHAB zurückgegriffen, damit bekommen wir Sonnenuntergangs- und Sonnenaufgangswerte einfach bereitgestellt.

Items-Datei:

Switch    og_pir_flur_motion            "Bewegungsmelder OG Flur"                (debug)        {homematic="address=xxx, channel=3, parameter=MOTION"}
Number og_pir_flur_helligkeit        "Helligkeit OG Flur [%d]"                 (debug)        {homematic="address=xxx, channel=3, parameter=BRIGHTNESS"}
Number og_pir_flur_helligkeit_vorLicht    "Helligkeit Flur vor Licht an [%d]"     (debug)

Rules-Datei:

import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.*
import java.util.*
import org.joda.time.*

import java.util.TimeZone
import java.util.Date
import java.util.Calendar

var Integer einschaltschwelle = 150 //Nur wenn Helligkeit vor Licht an < Wert/255 ist soll überhaupt Licht angschalten werden - für PIR-Sensoren

rule "Licht durch Bewegungsmelder: OG Flur"
    when
        Item og_pir_flur_motion changed
    then 
        // Berechnung der gewünschten Helligkeit
        var DateTime datumSonnenaufgang = new DateTime((astro_Sonnenaufgang.state as DateTimeType).calendar.timeInMillis)
        var DateTime datumSonnenuntergang = new DateTime((astro_Sonnenuntergang.state as DateTimeType).calendar.timeInMillis)
        val boolean istDunkel = datumSonnenaufgang.afterNow || datumSonnenuntergang.beforeNow
        var Integer dummyInt = 17 //Helligkeit für Nacht-Modus
        if (!istDunkel) dummyInt = 80 //Helligkeit für Tag-Modus
        val helligkeit = dummyInt 
        if ((og_pir_flur_motion.state == OFF) && (og_licht_flur.state  <= helligkeit) && (og_licht_flur.state > 0)) { // Keine Bewegung (mehr), nicht absichtlich heller geschalten und grundsätzlich an, dann mit Timer abschalten
            createTimer(now.plusSeconds(10)) [| 
                // Obige Bedingungen treffen noch zu? Dann Licht aus!
                if ((og_pir_flur_motion.state == OFF) && (og_licht_flur.state  <= helligkeit) && (og_licht_flur.state > 0)) {
                    sendCommand(og_licht_flur, 0)
                    }
            ]
        } else if ((og_pir_flur_motion.state == ON) && (og_licht_flur.state <= helligkeit) && (og_pir_flur_helligkeit_vorLicht.state < einschaltschwelle)) { // Bewegung registriert, Licht ist aus oder dunkler als gewünschte Helligkeit und Einschaltschwelle grundsätzlich unterschritten? Licht an!
            sendCommand(og_licht_flur, helligkeit)
        }
    end

Streng genommen gibt es wohl noch ein Lücke. Wenn die Sonne untergeht und in dem Moment gerade das Licht durch Bewegung an war, dann wird es nicht mehr ausgeschalten, weil das System davon ausgeht, dass das Licht absichtlich heller gedreht wurde.

Aber dann muss man eben einmal auf den Schalter drücken 😉

Schreibe einen Kommentar

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