Bewegungsmelder spielt in der Zeit von 19:15- bis 22:15 Uhr nicht mit

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
isostar1101
Beiträge: 55
Registriert: 18. Sep 2018 17:43

Bewegungsmelder spielt in der Zeit von 19:15- bis 22:15 Uhr nicht mit

Beitrag von isostar1101 »

Guten Abend, ich benötige eine kleine Erweiterung der ug. Regel. Ich kann die FF_Flur_Steckdoseoben über einen Schalter einschalten und der wird gegen 23:15 automatisch wieder ausgeschalte, ab da geht das Licht im Flur nur noch via Bewegungsmelder an! Da die kleine gegen 19:30 ins Bett geht und wenn dann einer dann durch den Flurbewegungsmelder läuft, wir das Licht im Flur abgeschaltet. Ich möchte aber das Licht im Flur, wenn die Bedingung Elevation.state <-0 in der Zeit zwischen 19:15 und 22:15 Uhr eingetroffen ist immer das Licht anhaben, es soll keine Rolle spielen ob jemand durch den Bewegungsmelder läuft!

Danke für Eure Hilfe Isostar1101

Code: Alles auswählen





rule "Bewegungsmelder Flur hat Bewegung erkannt und es ist Dunkel"




when
        Item FF_Flur_Bewegungsmelder  received update ON
then

if
        (FF_Flur_Bewegungsmelder.state == ON && Elevation.state  <-0|° && tFlurobenMotion === null) {
        FF_Flur_Steckdoseoben.sendCommand(ON)
        tFlurobenMotion = createTimer(now.plusMinutes(3)) [|
        FF_Flur_Steckdoseoben.sendCommand(OFF)
        
        tFlurobenMotion = null
]}
else if 
        (FF_Flur_Steckdoseoben.state == ON) {
        tFlurobenMotion.reschedule(now.plusMinutes(3))
}
end

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

Re: Bewegungsmelder spielt in der Zeit von 19:15- bis 22:15 Uhr nicht mit

Beitrag von udo1toni »

Da müssen wir erst mal klären...

Du schaltest die Steckdose über einen Schalter. Zusätzlich wirkt die Rule, sobald die Sonne unter dem Horizont steht.
Nun soll das Licht zwischen 19:15 und 22:15 dauerhaft an sein. Aber gilt das auch, wenn das Licht nicht über den Schalter eingeschaltet wurde?

Vermutlich wäre die einfachste Variante diese:
1. Der Schalter kommt als eigenes Item in openHAB an. (Ich hoffe mal, der Schalter ist ein Taster...)
2. Der Schalter schaltet das Licht über eine Rule an. (kann es sein, dass der Schalter das Licht auch ausschalten können soll?)
3. Die Bewegungsmelder Rule fragt die Schaltstellung ab.
4. Die Zeitsteuerung setzt den Schalter in die OFF-Position zurück.

Sieht so aus:

Code: Alles auswählen

Switch MeinTaster "Taster Steckdose Flur oben 1.OG" {...}
Switch FF_Flur_Steckdoseoben "Steckdose Flur oben 1.OG" {...}

Code: Alles auswählen

//Globale Variablen zu Beginn der Datei definieren!
var Timer tFlurobenMotion = null

rule "Schalter Steckdose Flur 1.OG"
when
    Item MeinTaster received command
then
    if(receivedCommand == ON) {
        FF_Flur_Steckdoseoben.sendCommand(ON)
    } else {
        FF_Flur_Steckdoseoben.sendCommand(OFF)
    }
end

rule "Bewegungsmelder Flur hat Bewegung erkannt und es ist Dunkel"
when
    Item FF_Flur_Bewegungsmelder received update ON
then
    if((Elevation.state as Number).floatValue < 0 && MeinTaster.state != ON) {
        tFlurobenMotion?.cancel
        FF_Flur_Steckdoseoben.sendCommand(ON)
        tFlurobenMotion = createTimer(now.plusMinutes(3), [|
            FF_Flur_Steckdoseoben.sendCommand(OFF)
            tFlurobenMotion = null
        ])
    }
end

rule "Steckdose Flur 1.OG automatisch aus"
when
    Time cron "0 15 23 * * ?" // Täglich 23:15:00 Uhr
then
    if(MeinTaster.state != OFF)
        MeinTaster.postUpdate(OFF)
    if(FF_Flur_Steckdoseoben.state != OFF)
        FF_Flur_Steckdoseoben.sendCommand(OFF)
end
Der Code für den Bewegungsmelder ist ein leicht anderer.
Zum einen hat FF_Flur_Bewegungsmelder die Rule mit ON getriggert, also ist es sinnlos, diesen Status zu prüfen, er wird immer ON sein.
Zum zweiten mag ich persönlich lieber normale Zahlen, als solche mit Einheiten. -0 gibt es übrigens nicht, auch wenn die Rule eventuell trotzdem funktioniert.
Zum dritten mag ich auch eine klare Zuordnung, dass das definierte Lambda ein Parameter der Funktion createTimer ist, deshalb das Komma und die schließende Klammer erst nach dem Lambda.
Zum vierten ist die Rule (ein wenig) kürzer, wenn der Timer einfach verworfen und neu angelegt wird.

Die Punkte 2 bis 4 sind dabei natürlich eher Geschmacksache...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

isostar1101
Beiträge: 55
Registriert: 18. Sep 2018 17:43

Re: Bewegungsmelder spielt in der Zeit von 19:15- bis 22:15 Uhr nicht mit

Beitrag von isostar1101 »

Hallo Udo1Toni,

"Nun soll das Licht zwischen 19:15 und 22:15 dauerhaft an sein. Aber gilt das auch, wenn das Licht nicht über den Schalter eingeschaltet wurde?"

Ja Richtig das soll auch gelten wenn das Licht nicht über den Schalter eingeschaltet wurde! der Schalter ist ein Taster Xiaomi Aqura via Wlan angebunden und das Ausschalten ist eigentlich unwichtig, es wird ja eh immer um 23:15 Uhr abgeschaltet.

Danke dir vG. Isostar1101

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

Re: Bewegungsmelder spielt in der Zeit von 19:15- bis 22:15 Uhr nicht mit

Beitrag von udo1toni »

Da wäre es ja das Einfachste, das Licht mittels Zeitschaltung ein- und auszuschalten.

Code: Alles auswählen

//Globale Variablen zu Beginn der Datei definieren!
var Timer tFlurobenMotion = null
var Boolean bFlurobenOn = false

rule "Steckdose Flur 1.OG automatisch an"
when
    Time cron "0 15 19 * * ?" // Täglich 19:15:00 Uhr
then
    if(FF_Flur_Steckdoseoben.state != ON)
        FF_Flur_Steckdoseoben.sendCommand(ON)
    bFlurobenOn = true
    tFlurobenMotion?.cancel
end

rule "Steckdose Flur 1.OG automatisch aus"
when
    Time cron "0 15 23 * * ?" // Täglich 23:15:00 Uhr
then
    if(FF_Flur_Steckdoseoben.state != OFF)
        FF_Flur_Steckdoseoben.sendCommand(OFF)
    bFlurobenOn = false
end

rule "Bewegungsmelder Flur hat Bewegung erkannt und es ist Dunkel"
when
    Item FF_Flur_Bewegungsmelder received update ON
then
    if((Elevation.state as Number).floatValue < 0 && !bFlurobenOn) {
        tFlurobenMotion?.cancel
        FF_Flur_Steckdoseoben.sendCommand(ON)
        tFlurobenMotion = createTimer(now.plusMinutes(3), [|
            FF_Flur_Steckdoseoben.sendCommand(OFF)
            tFlurobenMotion = null
        ])
    }
end
Die Variable bFlurobenOn speichert, ob das Licht über die Zeitschaltung eingeschaltet wurde. Eine Alternative: Nur eine einzige Rule.

Code: Alles auswählen

//Globale Variablen zu Beginn der Datei definieren!
var Timer tFlurobenMotion = null
var Boolean bFlurobenOn = false

rule "Bewegungsmelder Flur hat Bewegung erkannt und es ist Dunkel"
when
    Item FF_Flur_Bewegungsmelder received update ON or
    Time cron "0 15 19 * * ?"                                           // Täglich 19:15:00 Uhr
then
    var Number nTimer = 0
    if(triggeringItem === null) {                                       // es gibt kein Trigger Item -> Time cron hat getriggert
        bFlurobenOn = true                                              // also Zeitautomatik aktivieren
        nTimer = 240                                                    // und Licht nach 4 Stunden abschalten
    }
    else if((Elevation.state as Number).floatValue < 0 && !bFlurobenOn) // ansonsten, falls Zeitautomatik nicht aktiv und Sonne unter Horizont
        nTimer = 3                                                      // Licht nach 3Minuten abschalten
    if(nTimer > 0) {                                                    //nTimer wurde gesetzt
        tFlurobenMotion?.cancel
        FF_Flur_Steckdoseoben.sendCommand(ON)
        tFlurobenMotion = createTimer(now.plusMinutes(nTimer.intValue), [|
            FF_Flur_Steckdoseoben.sendCommand(OFF)
            bFlurobenOn = false
            tFlurobenMotion = null
        ])
    }
end
Die Rule erkennt also, wodurch sie getriggert wurde und verhält sich entsprechend unterschiedlich. Die zusätzliche Variable nTimer gibt die Einschaltzeit an, zusätzlich wird sie verwendet, um Coderedundanz zu vermeiden.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

isostar1101
Beiträge: 55
Registriert: 18. Sep 2018 17:43

Re: Bewegungsmelder spielt in der Zeit von 19:15- bis 22:15 Uhr nicht mit

Beitrag von isostar1101 »

Udo Toni,

vielen Dank für die Hilfe, läuft bisher sehr gut und wie ich dich kenne, auch für längere Zeit, Danke vG. Isostar1101

Antworten