Seite 1 von 1

Bewegungsmelder + Dauer Ein

Verfasst: 18. Jan 2020 21:26
von esali
Hallo,

Nutze seit 3 Jahren Openhab und hatte bis jetzt keine probleme, nun will ich mein Gang und Stiegenhauslicht über Bewegungsmelder Zeitlich (nach 2 min aus) gesteuert haben und einen dauer ein Taster und habe keinen plan wie ich die Rule dafür realisieren soll, bin für jeden Tipp dankbar.

Gang-Stiegenhaus Licht ist an Shelly 1 (Tasmota) angeschlossen genau so die Taster, jetzt habe ich Ikea Bewegungsmelder gekauft und über Deconz eingebunden.

Habe 2 Items für das gleiche Licht

Stiegenhaus (wird über Taster geschaltet)
Stiegenhaus_AutoOFF (wird über BWM geschaltet)

Rule Für Bewegungsmelder:

Code: Alles auswählen

var Timer Stiegenhaus_Timer = null

rule "Bewegungsmelder Stiegenhaus"
when 
    Item BWM_Stiegenhaus received update ON 
then	
    Stiegenhaus_AutoOFF.sendCommand(ON)
    Stiegenhaus_Timer?.cancel
    Stiegenhaus_Timer = createTimer(now.plusMinutes(2), [|
        Stiegenhaus_AutoOFF.sendCommand(OFF) 
    ])
end
Funktioniert Super aber ich will es so haben dass wenn Item "Stiegenhaus" mit Taster auf ON geschaltet wird der Bewegungsmelder und Timer nicht das Licht nach 2 min Ausschalten also nur wenn "Stiegenhaus" OFF dann BWM und Timer. :roll:

Re: Bewegungsmelder + Dauer Ein

Verfasst: 19. Jan 2020 10:08
von udo1toni
Ist kein Problem, Du musst ja nur abhängig von der Schaltstellung unterschiedlich agieren:

Code: Alles auswählen

var Timer Stiegenhaus_Timer = null

rule "Bewegungsmelder Stiegenhaus"
when
    Item BWM_Stiegenhaus received update ON 
then
    if(Stiegenhaus.state != ON) {
        Stiegenhaus_AutoOFF.sendCommand(ON)
        Stiegenhaus_Timer?.cancel
        Stiegenhaus_Timer = createTimer(now.plusMinutes(2), [|
            Stiegenhaus_AutoOFF.sendCommand(OFF)
        ])
    }
end
Allerdings wäre meine Empfehlung, nur ein Item für den Taster, ein Item für den Bewegungsmelder und ein Item für das Licht zu nutzen.

Code: Alles auswählen

var Timer tStiegenhaus = null

rule "Bewegungsmelder Stiegenhaus"
when
    Item BWM_Stiegenhaus received update ON or
    Item Taster_Stiegenhaus received command
then
    var Soll = ON
    tStiegenhaus?.cancel
    switch(receivedCommand) {
        case OFF: 
            Soll = OFF
        case null: 
            tStiegenhaus = createTimer(now.plusMinutes(2), [|
                if(Licht_Stiegenhaus.state != OFF) Licht_Stiegenhaus.sendCommand(OFF)
            ])
    }
    if(Licht_Stiegenhaus.state != Soll) Licht_Stiegenhaus.sendCommand(Soll)
end
Der (vom Licht unabhängige Taster) schaltet das Licht dauerhaft ein, oder (falls das Licht gerade an ist) ganz normal aus. falls das Licht aus ist, wird bei Bewegung das Licht für zwei Minuten eingeschaltet. Bei jeder neu erkannten Bewegung wird der Timer neu gestartet, falls man bei eingeschaltetem Licht auf die Idee kommt, auf Dauer-Ein zu gehen, wird der Timer abgebrochen. Die Rule hat zwei unterschiedliche Trigger, aber es gibt nur drei Möglichkeiten, entweder der Switch hat geschaltet, dann gibt es exakt zwei Optionen (receivedCommand is ON oder OFF), oder der BWM hat Bewegung erkannt, dann ist receivedCommand === null.

Default Verhalten ist, das Licht einzuschalten (zwei von drei Fälle). In jedem der drei Fälle soll ein laufender Timer abgebrochen werden, das kann also gleich zu Beginn erledigt werden.
Im Fall OFF wird der Sollzustand auf OFF geändert, im Fall null wird der Abschalttimer angelegt.
Zum Schluss wird das Licht auf den Sollwert gebracht (ON oder OFF)

Vielleicht gibt es auch noch eine effizientere Methode, abeer so erscheint es mir schon durchaus optimiert.

Re: Bewegungsmelder + Dauer Ein

Verfasst: 19. Jan 2020 11:46
von esali
Habe es gestern selber noch geschafft nur das meine Rule viel komplizierter war :lol:

Hab jetzt die 2te Rule im Einsatz funktioniert soweit nur problem ist ja der Taster (Mehrere) die sofort nach dem drücken wieder auf OFF gehen,
hab noch ein "Dauer Ein" Item erstellt und der wird mit Taster ON ON/OFF geschaltet je nach Zustand.

Code: Alles auswählen

var Timer tStiegenhaus = null

rule "Bewegungsmelder Stiegenhaus"
when
    Item Stiegenhaus_BWM received update ON or
    Item Stiegenhaus_DauerEin received command
then
    var Soll = ON
    tStiegenhaus?.cancel
    switch(receivedCommand) {
        case OFF: 
            Soll = OFF
        case null: 
            tStiegenhaus = createTimer(now.plusMinutes(1), [|
                if(Stiegenhaus_Licht.state != OFF) Stiegenhaus_Licht.sendCommand(OFF)
            ])
    }
    if(Stiegenhaus_Licht.state != Soll) Stiegenhaus_Licht.sendCommand(Soll)
end

rule "Dauer Ein Stiegenhaus"
when 
    Item Stiegenhaus_Taster received update ON 
then
    if(Stiegenhaus_DauerEin.state == OFF)	
    Stiegenhaus_DauerEin.sendCommand(ON)
    else
    if(Stiegenhaus_DauerEin.state == ON)	
    Stiegenhaus_DauerEin.sendCommand(OFF)
end
Danke nochmal :)

Re: Bewegungsmelder + Dauer Ein

Verfasst: 19. Jan 2020 12:01
von violine21
Gang und Stiegenhauslicht über Bewegungsmelder Zeitlich (nach 2 min aus) gesteuert haben und einen dauer ein Taster und habe keinen plan wie ich die Rule dafür realisieren soll, bin für jeden Tipp dankbar.

Gang-Stiegenhaus Licht ist an Shelly 1 (Tasmota) angeschlossen genau so die Taster, jetzt habe ich Ikea Bewegungsmelder gekauft und über Deconz eingebunden.
Ich habe meinen Shelly dafür so angeschlossen:
https://www.shelly-support.eu/lexikon/i ... -shelly-1/
Allerdings entfällt der Anschluss des Bewegungsmelders, da das ja OpenHAB übernimmt.
Das hat folgenden Vorteil: Sollte OpenHAB oder das WLAN mal ausfallen (hatte ich schon einmal) dann kannst du immer noch das Licht mit dem Schalter einschalten und stehst nicht im Dunkeln.

Re: Bewegungsmelder + Dauer Ein

Verfasst: 19. Jan 2020 21:44
von udo1toni
Wenn Du mehrere Taster hast, die beim Drücken ON und beim Loslassen OFF senden (und diese alle zum Schalten verwenden willst) legst Du ein Proxy Item an (Schalter_Stiegenhaus) und packst alle Taster in eine Gruppe. dazu gibt es dann eine Rule, die die Umsetzung erledigt:

Code: Alles auswählen

rule "Schalter Toggle"
when
    Member of gTaster changed to ON
then
    Schalter_Stiegenhaus.sendCommand(if(Schalter_Stiegenhaus.state != ON) ON else OFF)
end
Jedes Mal, wenn einer der Taster, die in der Gruppe gTaster enthalten sind, auf ON wechselt, wechselt der Zustand von Schalter_Stiegenhaus.