Seite 1 von 4

Bewegungsmelder oder dauer an

Verfasst: 5. Jul 2020 02:24
von SIDE22
Hallo liebe community,
ich habe lange im großen internet gesucht bis ich mal eine rule gefunden habe die so ziemlich das macht was ich will
nach dem ich diese etwas verändert habe.
Mein ziel ist es in unserem Treppenhaus bewegungsmelder zu verwenden aktuell nur 1ner der zweite kommt aber noch
aufjedenfall soll das ganze ja über bewegungs melder laufen soll aber auch dauerhaft eingeschaltet werden können

Wenn der Bewegungsmelder meldet sollen die Lampen gedimmt angehen aktuell 60% und sollen nach einer zeit wieder ausgehen
und wenn man schaltet sollen die Lampen auf 100% gehen

Mein problem war erst das wenn man Licht einschaltet und dann durch das Treppenhaus geht das die lampen runtergedimmt hatten auf 60% was ja nicht sein sollte nun habe ich die rule fertig und wollte mal die fragen die sich besser mit openhab auskennen was ihr davon haltet

Code: Alles auswählen

rule "Bewegungsmelder Treppenhaus"
when
    Item Treppenhaus_Bewegungsmelder_Motion received update ON
then
    if (Treppenhaus_Bewegungsmelder_Motion.state == ON && Treppenhaus_schalter.state == OFF && timer2 === null) {
        if (IKEA_Treppenhauslampe_tisch_Brightness.state == (0) || IKEA_Treppenhauslampe_mitte_Brightness.state == (0)) {
            logInfo ("LichtAutomatik", "Licht an")
            IKEA_Treppenhauslampe_tisch_Brightness.sendCommand(60)
            IKEA_Treppenhauslampe_mitte_Brightness.sendCommand(60)
        }
        if (timer1 !== null) {
            timer1.cancel
            timer1 = null
        }
        timer1 = createTimer(now.plusSeconds(45), [|
            timer2 = createTimer(now.plusMillis(750), [|
                timer2 = null
                logInfo("LichtAutomatik", "Totzeit Ende")
            ])
            IKEA_Treppenhauslampe_tisch_Brightness.sendCommand(0)
            IKEA_Treppenhauslampe_mitte_Brightness.sendCommand(0)
            logInfo("LichtAutomatik", "Licht aus")
            timer1 = null
        ])
    }
end

//
rule "Bewegungsmelder Treppenhaus Überbrücken"
when
    Item Treppenhaus_schalter changed
then
    if (Treppenhaus_schalter.state == ON) {
        logInfo ("LichtAutomatik", "Licht dauer an")
        IKEA_Treppenhauslampe_tisch_Brightness.sendCommand(100)
        IKEA_Treppenhauslampe_mitte_Brightness.sendCommand(100)
    }
    else if (Treppenhaus_schalter.state == OFF) {
        logInfo ("LichtAutomatik", "Licht dauer an wieder aus")
        IKEA_Treppenhauslampe_tisch_Brightness.sendCommand(0)
        IKEA_Treppenhauslampe_mitte_Brightness.sendCommand(0)
    }
end
lg
Florian

Re: Bewegungsmelder oder dauer an

Verfasst: 5. Jul 2020 08:06
von Steinspiel
Moin,
SIDE22 hat geschrieben: 5. Jul 2020 02:24 [...]
was ihr davon haltet
Du könntest das hochdimmen auf 100% in der zweiten Rule auch direkt vor dem Ausschalten in der ersten Rule setzen. Noch einen zusätlichen Time dazwischen damit die Lampen Zeit haben zu dimmen vor dem Ausschalten, ist IMO auch sinnvoll. So sparst Du eine Rule...

Vorausgesetzt natürlich Dein AN/AUS Item heißt ***POWER

Code: Alles auswählen

---CUT---

	IKEA_Treppenhauslampe_tisch_Brightness.sendCommand(100)			// auf 100% dimmen
	IKEA_Treppenhauslampe_mitte_Brightness.sendCommand(100)
	
	verzoegerung?.cancel							// evtl. laufenden Timer abbrechen
	verzoegerung = createTimer(now.plusSeconds(2), [|			// Timer vor AUS schalten auf 2 sec setzen
		
		IKEA_Treppenhauslampe_tisch_POWER.sendCommand(OFF)		// AUS schalten
		IKEA_Treppenhauslampe_mitte_POWER.sendCommand(OFF)

	verzoegerung = null  
	]
	)

end	

Re: Bewegungsmelder oder dauer an

Verfasst: 5. Jul 2020 13:09
von SIDE22
Ok danke
Ich werd das nachher mal abändern und testen

Habe im Flur eine ähnliche Funktion nur das da dann noch eine zeitsteuerung mit drin sein sollte weiß aber nicht wie ich die rule demnach ändern müsste

Sprich zb. Zu meiner oben genannten rule noch eine Zeit Steuerung wo eine Lampe von 20uhr bis 1 Uhr an ist

Lg
Florian

Re: Bewegungsmelder oder dauer an

Verfasst: 5. Jul 2020 14:24
von Steinspiel
SIDE22 hat geschrieben: 5. Jul 2020 13:09 weiß aber nicht wie ich die rule demnach ändern müsste
[...]
Ein IMO einfacher Weg für eine Zeitsteuerung wäre ein "Dummy Item" welches Du per CronJob an und aus schaltest.

*.itmes

Code: Alles auswählen

Switch UHR_abend        "UHR Abends"
*.rules

Code: Alles auswählen

rule "einschaltzeit"
when
        Time cron "0 0 19 ? * * *"                                      // taeglich 19:00 EIN
then
        UHR_abend.sendCommand(ON)
end

rule "ausschaltzeit"

when
        Time cron "0 0 23 ? * * *"                                      // taeglich 23:00 AUS
    
then
        UHR_abend.sendCommand(OFF)
    
end
Und danach schaltest Du dann Dein Licht ein bzw. wieder aus. Probier vielleicht ein bischen damit rum und dann integierst Du den Code angepasst in Deine Rule.

Code: Alles auswählen

rule "zeitschaltung_EIN"

when   
        Item UHR_abend changed to ON                               //es ist 19:00

then
        myitem.sendCommand(ON)		            		//Licht AN

end	

Re: Bewegungsmelder oder dauer an

Verfasst: 5. Jul 2020 14:40
von SIDE22
ok danke dir
werde es laufe der woche mal probieren :)

Lg
Florian

Re: Bewegungsmelder oder dauer an

Verfasst: 5. Jul 2020 16:45
von udo1toni
Da scheint mir noch einiges an Verbesserungspotential enthalten zu sein. :)

Erstmal die Frage: werden die Lampen voneinander unabhängig genutzt? Falls nein: verwende eine Gruppe.
Zweitens: Was hat es mit der Totzeit auf sich? Erkennt der Bewegungsmelder am Ende das Ausschalten als Bewegung?

Re: Bewegungsmelder oder dauer an

Verfasst: 5. Jul 2020 17:40
von SIDE22
Die beiden Lampen die aktuell genutzt werden dienen erstmal nur als test da die anderen die nachher darüber laufen sollen noch nicht da sind

Was es genau mit der totzeit auf sich hat weiß ich leider nicht habe die rule im Internet gefunden

Bin noch nicht solange bei openhab und mein System ist ja noch in der bauphase ^^

Also wenn du bessere rule hättest wäre ich dafür dankbar

Die rule wie oben steht soll für das Treppenhaus sein und soll später 4 Lampen schalten diese werden dann auch in eine Gruppe gepackt
Mein Ziel für Treppenhaus
Bewegung 60% mit timer 45 bis 60 sek
Schalter 100%

Der Schalter soll die Lampen dauerhaft schalten egal ob der bewegungsmelder ein oder aus ist also quasi überbrücken

Im Flur wiederum kommen 6 Lampen
Allerdings soll Bewegung nur gehen wenn es Dunkel ist und 1 Lampe soll davon von 15uhr bis 1uhr ansein bei 30%

Wenn es dunkel ist soll Bewegung 60% (auch 45 bis 60 sek) sein bei allen Lampen und beim schalten auch 100% bei allen

Das schalten soll aber immer möglich sein.

Bin zwar wohl auf guten Wege allerdings denke ich das ich die rule zu kompliziert gestalte.

Wäre also für jede Hilfe dankbar

Lg
Florian

Re: Bewegungsmelder oder dauer an

Verfasst: 5. Jul 2020 20:42
von udo1toni
Also die Totzeit solltest Du weg lassen, falls sich nicht herausstellt, dass Du sie unbedingt brauchst (wie erwähnt gibt es Bewegungsmelder, die plötzliche Lichtänderung fälschlicherweise als Bewegung erkennen... die sollte man aber eher durch was sinnvolleres ersetzen, als das in einer Rule abzufangen)

Items:

Code: Alles auswählen

Group gMelder
Group gSwitches
Group gLichter 
Group gLichtFlur (gLichter)
Group gLichtTreppe (gLichter)
Switch Flur_Melder1 (gMelder)
Switch Flur_Melder2 (gMelder)
Switch Treppe_Melder1 (gMelder)
Switch Treppe _Melder2 (gMelder)
Switch Flur_Switch (gSwitches)
Switch Treppe_Switch (gSwitches)
Dimmer Flur_LichtNacht (gLichtFlur)
Dimmer Flur_Licht2 (gLichtFlur)
Dimmer Flur_Licht3 (gLichtFlur)
Dimmer Flur_Licht4 (gLichtFlur)
Dimmer Flur_Licht5 (gLichtFlur)
Dimmer Flur_Licht6 (gLichtFlur)
Dimmer Treppe_Licht1 (gLichtTreppe)
Dimmer Treppe_Licht2 (gLichtTreppe)
rules:

Code: Alles auswählen

var Timer tFlur = null
var Timer tTreppe = null
val Integer iZeit = 45

rule "Bewegung erkennen"
when
    Member of gMelder received update ON
then
    val licht = triggeringItem.name.split("_").get(0)                       // "Flur" oder "Treppe"
    val Licht = gLichter.members.filter[i|i.name.contains(licht)].head      // gLichtFlur oder gLichtTreppe
    if(Licht.state != 100) {                                                // Licht nicht in Dauerbetrieb
        if(licht == "Treppe") {                                             // falls Treppe, Treppentimer
            gLichtTreppe.sendCommand(60)                                    // entsprechendes Licht auf 60%
            tTreppe?.cancel                                                 // Timer abbrechen
            tTreppe = createTimer(now.plusSeconds(iZeit),[|                 // Timer anlegen
                gLichtTreppe.sendCommand(0)                                 // Licht aus
            ])
        } else if(dunkel.state == ON) {                                     // falls nicht Treppe und dunkel
            gLichtFlur.sendCommand(60)                                      // entsprechendes Licht auf 60%
            tFlur?.cancel                                                   // Timer abbrechen
            tFlur = createTimer(now.plusSeconds(iZeit),[|                   // Timer anlegen
                gLichtFlur.members.forEach[i|                               // Für jedes Licht
                    i.sendCommand(if(                                       // Sende Befehl
                        i.name.contains("1") &&                             // Falls der Name "1" enthält
                        (now.getHourOfDay > 14 || now.getHourOfDay < 1)     // und Zeitbedingung erfüllt
                    )30 else 0)                                             // 30, ansonsten 0
                ]
            ])
        }
    }
end


rule "Dauerbetrieb"
when
    Member of gSwitches changed
then
    val licht = triggeringItem.name.split("_")get(0)
    val Licht = gLichter.members.filter[i|i.name.contains(licht)].head
    if(licht == "Flur") tFlur?.cancel
    if(licht == "Treppe") tTreppe?.cancel
    Licht.sendCommand(triggeringItem.state)
    if((now.getHourOfDay < 1 || now.getHourOfDay > 14) && triggeringItem.state == OFF && licht = "Flur") 
        Flur_LichtNacht.sendCommand(30)
end

rule "Nachtlicht an"
when
    Time cron "0 0 15 * * ?"
then
    if(Flur_Licht1.state == 0) Flur_Licht1.sendCommand(30)
end

rule "Nachtlicht an"
when
    Time cron "0 0 1 * * ?"
then
    if(Flur_LichtNacht.state == 30) Flur_LichtNacht.sendCommand(0)
end
Die erste Rule ist etwas komplizierter. Der Punkt ist aber, dass diese 4 Rules alles erschlagen sollten. Es ist unerheblich, wie viele Leuchten gesteuert werden, es ist unerheblich, wie viele Bewegungsmelder oder Schalter verwendet werden.
Ich gehe die Rules von hinten nach vorne durch :)

Die letzte Rule schaltet die Lampe Flur_Licht1 aus, falls sie gerade auf 30% ist.

Die dritte Rule schaltet die Lampe Flur_Licht1 auf 30%, falls sie gerade aus ist (dabei wird nicht auf Helligkeit geachtet).

Die zweite Rule kümmert sich darum, das Licht auf 100% oder auf 0% zu schalten. Wird das Licht angeschaltet, so muss der passende Timer abgebrochen werden, damit das Licht nicht ausgeschaltet wird.
Beim Ausschalten muss noch berücksichtigt werden, dass zwischen 15 Uhr und 1 Uhr die Leuchte Flur_Licht1 auf 30% geschaltet werden muss, falls gerade ausgeschaltet wird. Man könnte das (so wie beim Flur-Timer, siehe erste Rule) beim Ausschalten erledigen. Ich bin hier etwas faul und schalte das Licht wieder an, falls es gerade ausgeschaltet wurde.

Nun zur wichtigsten Rule. :)
Löst einer der Bewegungsmelder aus, so wird anhand des Itemnamens bestimmt, welcher der Bereiche beleuchtet werden soll (der erste Teil des Itemnamens, vor dem _).
Entsprechend wird die zu schaltende Gruppe herausgesucht. Nun wird geprüft, ob die Gruppe auf 100% ist. Ist das der Fall, ist der entsprechende Lichtkreis gerade dauerhaft ON.
Falls nicht, müssen zwei unterschiedliche Timer verwendet werden, die sich auch noch unterschiedlich verhalten. Nun wird also abhängig vom Kreis entweder die Gruppe gLichtTreppe auf 60% geschaltet und der entsprechende Timer angelegt, oder das Ganze passiert für gLichtFlur, dort allerdings nur, falls das Item dunkel den Status ON hat. Zusätzlich muss hier noch beim Ausschalten der Fall berücksichtigt werden, dass das Licht Flur_Licht1 auf 30% geschaltet wird.

Wie gesagt, reichen diese 4 Rules für beide Lichtkreise und alle Bedingungen. Durch die zusätzlichen Bedingungen ist ein Teil des Codes für die Kreise unterschiedlich, was sich aber fast ausschließlich in der ersten Rule niederschlägt.
Sollten weitere bewegungsgesteuerte Kreise dazu kommen, muss nur dieses Teilstück ergänzt werden, und das streng genommen auch nur, weil es das unterschiedliche Verhalten für das Nachtlicht zu berücksichtigen gilt. Die unterschiedlichen Timer könnte man auch über eine HashMap erstellen, aber hier, bei den unterschiedlichen Bedingungen, ist das eher kontraproduktiv. Man kann beliebig viele Lampen bzw. beliebig viele Melder oder auch Switches hinzufügen, solange die Namenskonvention eingehalten wird.
Über iZeit wird die Zeitspanne gesetzt, falls diese für die beiden Kreise unterschiedlich sein soll, kann man hier natürlich auch unterschiedliche Werte nutzen.
Das Item Dunkel hab ich hier mal außen vor gelassen und einfach als Schalter definiert. Den Zustand ob zwischen 15 und 1 Uhr oder zwischen 1 und 15 Uhr könnte man ebenfalls über ein Item lösen, oder auch über eine Variable (die definiert man global und setzt sie in der entsprechenden Time cron Rule)

Re: Bewegungsmelder oder dauer an

Verfasst: 5. Jul 2020 21:16
von SIDE22
Ich danke dir
werde es dann mal auf meine items anpassen und es testen.

Den was ich mir da zusammen gebastelt habe mjt den timer und so geht nur zur Hälfte habe ich festgestellt :D

Re: Bewegungsmelder oder dauer an

Verfasst: 6. Jul 2020 00:35
von SIDE22
So bin grade dabei die rule anzupassen
Nur muss ich das ganze 2mal anlegen das es 2 getrennte Räume sind die auch weiter von einander weg sind