Seite 1 von 1

Bewegungsmelder+Nachtlicht 2 Regeln Zeitsteuerung

Verfasst: 5. Apr 2021 23:08
von LDG
Guten Abend an alle,
ich hatte das schon in einem anderen Thread gepostet aber ich denke hier passt das besser hin..
Da ich in Openhab noch relativ neu bin bräuchte ich eure Hilfe.
Durchszusammensuchen und viel rumprobieren habe ich meine erste Rule soweit das sie so funktioniert wie sie soll. Aber ich bin mit dem Ergbenis noch nicht so ganz zufrieden daher meine Fragen:

Habt ihr eine Idee wie ich die beiden Regeln BZ_Tagzeit und BZ_Nachtzeit in eine zsm fassen kann?
damit ich nicht einmal Bz_Zeit einmal hin und herschalten muss?
Muss ich den BZ_Zeit vorher auf null setzen?

Ziel war es das in der Nacht zwischen 22 Uhr abend und 6 Uhr morgens nur eine von 2 Lampen im Badezimmer angeht.

Code: Alles auswählen

rule"BZ_Tagzeit"
when
        Time cron "0 0/15 6-21 ? * * *"
then
        BZ_Zeit.sendCommand(1)
end

rule"BZ_Nachtzeit"
when
        Time cron "0 0/15 22-5 ? * * *"
then
        BZ_Zeit.sendCommand(0)
end

Code: Alles auswählen

if((BZLightS_Beleuchtungsstarke.state as Number).floatValue() <= 52  )
{
	if(BZ_Zeit.state == 1 )
	{	
		tBewegung?.cancel
		if(BZBM_Bewegung.state == ON) 
		{
			if(BZ_Licht.state != ON)
			{
				BZ_Licht.sendCommand(ON)
			}
		}
		else
		{
		tBewegung = createTimer(now.plusSeconds(120), [|
			if(BZ_Licht.state != OFF)
				BZ_Licht.sendCommand(OFF)
			])
		}
	}
	else
	{
		tBewegung?.cancel
		if(BZBM_Bewegung.state == ON)
		{
			if(BZ_LampeHeizung.state != ON)
			{
			BZ_LampeHeizung.sendCommand(ON)
			}			
		}
		else
		{
		tBewegung = createTimer(now.plusSeconds(120), [|
			if(BZ_LampeHeizung.state !=OFF)
				BZ_LampeHeizung.sendCommand(OFF)
			])
		}
	}
}
Vielen Dank im Vorraus
LDG

Re: Bewegungsmelder+Nachtlicht 2 Regeln Zeitsteuerung

Verfasst: 6. Apr 2021 10:14
von udo1toni
Warum so kompliziert? Erst mal könntest Du ein Item erstellen, welches exakt zu zwei Zeitpunkten geschaltet wird, nämlich um 6 und um 22 Uhr, aber nicht zwischendrin. Natürlich brauchst Du dann noch eine Rule, welche sich beim Start des Systems darum kümmert, das Item auf den korrekten Status zu setzen.

Alternativ kannst Du auch einfach innerhalb der Rule abfragen, wie spät es ist, also ganz auf das Item verzichten.

Die dritte von Dir gepostete Rule ist unvollständig, da müsstest Du vielleicht noch mal schauen. Rein zum Licht schalten erscheint sie mir aber unnötig komplex. :)


Gesendet von iPad mit Tapatalk

Re: Bewegungsmelder+Nachtlicht 2 Regeln Zeitsteuerung

Verfasst: 6. Apr 2021 21:20
von LDG
Hallo Udo,

Eine andere Lösung ist mir leider nicht eingefallen, weil ich hiermit noch nicht so vertraut bin. Dazukommt das ich die ganze Programmiersprache zusätzlich zu C in der Schuel auch noch lernen muss.
Die Alternative mit der Zeitabfrage in der Rule hatte ich vorher schon ausprobiert und hatte dann Fehler im Log die ich nicht wegbekommen habe.

Du könntest recht haben das sie sehr lang und komplex ist, aber ich wollte so 2 unterschiedliche Scenen Schalten. Wenn du eine alternative Idee hast bin ich auch hier offen.
So nun einmal der komplette Code der Rule zum Schalten der beiden Sachen:
BZ_Licht ist ein Item mit 2 Lampen welches als Switch konfiguriert ist (BZ_LampeHeizung & BZ_LampeDusche)
BZ_LampeHeizung ist nur die eine Lampe

Code: Alles auswählen

var Timer tBewegung = null

rule"BZBM+Timeout"
when
        Item BZBM_Bewegung changed
then
        if((BZLightS_Beleuchtungsstarke.state as Number).floatValue() <= 52 $
        {
                if(Tagzeit.state == 1 )
                {
                        tBewegung?.cancel
                        if(BZBM_Bewegung.state == ON)
                        {
                                if(BZ_Licht.state != ON)
                                {
                                        BZ_Licht.sendCommand(ON)
                                }
                        }
                        else
                        {
                        tBewegung = createTimer(now.plusSeconds(120), [|
                                if(BZ_Licht.state != OFF)
                                        BZ_Licht.sendCommand(OFF)
                                ])
                        }
                }
                else
                {
                        tBewegung?.cancel
                        if(BZBM_Bewegung.state == ON)
                        {
                                if(BZ_LampeHeizung.state != ON)
                                {
                                BZ_LampeHeizung.sendCommand(ON)
                                }
                        }
                        else
                        {
                        tBewegung = createTimer(now.plusSeconds(180), [|
                                if(BZ_LampeHeizung.state !=OFF)
                                        BZ_LampeHeizung.sendCommand(OFF)
                                ])
                        }
                }
        }
end

Danke das du/die anderen mir so hilfst/helfen bei meinen ersten Schritten in OPENHAB.

Re: Bewegungsmelder+Nachtlicht 2 Regeln Zeitsteuerung

Verfasst: 6. Apr 2021 23:28
von udo1toni
Die Rule wäre so sinnvoller:

Code: Alles auswählen

var Timer tBewegung = null

rule "BZBM + Timeout"
when
    Item BZBM_Bewegung changed
then
    tBewegung?.cancel                                                                       // laufenden Timer stoppen
    if(BZBM_Bewegung.state == ON) {                                                         // Falls Bewegung erkannt
        if((BZLightS_Beleuchtungsstarke.state as Number).floatValue <= 52) {                // falls Helligkeit unter Schwellwert
            if(BZ_LampeHeizung.state != ON)                                                 // Falls Lampe 1 nicht ON
                BZ_LampeHeizung.sendCommand(ON)                                             // Lampe 1 ON
            if(BZ_LampeDusche.state != ON && now.getHourOfDay > 5 && now.getHourOfDay < 22) // Falls Lampe 2 nicht ON und zwischen 6 und 22 Uhr
                BZ_LampeDusche.sendCommand(ON)                                              // Lampe 2 ON
        }
    } else {                                                                                // falls keine Bewegung erkannnt
        tBewegung = createTimer(now.plusSeconds(120), [|                                    // Timer starten
            if(BZ_LampeHeizung.state != OFF)                                                // Falls Lampe 1 nicht OFF
                BZ_LampeHeizung.sendCommand(OFF)                                            // Lampe 1 OFF
            if(BZ_LampeDusche.state != OFF)                                                 // Falls Lampe 2 nicht OFF
                BZ_LampeDusche.sendCommand(OFF)                                             // Lampe 2 OFF
        ])
    }
end
Ein laufender Timer wird immer zunächst beendet, falls er laufen sollte.
Anschließend wird geprüft, ob Bewegung erkannt wurde oder nicht. (vor! der Prüfung auf die Helligkeit) Falls die Helligkeit unterschritten wurde, wird das 1. Licht eingeschaltet (falls es nicht ohnehin an war). Für das 2. Licht wird zusätzlich geprüft, ob die Uhrzeit passt.
Sollte keine Bewegung erkannt worden sein, wird der Timer gestartet. Der Timer schaltet grundsätzlich beide Lampen aus, falls sie eingeschaltet sind.

Die Idee dahinter: Falls eine Lampe eingeschaltet ist, soll sie sicher ausgeschaltet werden, gleich, ob der Zeitraum zum Einschalten überschritten wurde oder gar die Helligkeit gestiegen ist. Natürlich könnte man das Ausschalten auch über die Gruppe erledigen, aber für zwei Items lohnt sich die Gruppe im Grunde nicht. :)

Es kann sein, dass Du now.getHourOfDay durch ZonedDateTime.now.getHour ersetzen musst (wenn Du openHAB3 verwendest)

Re: Bewegungsmelder+Nachtlicht 2 Regeln Zeitsteuerung

Verfasst: 7. Apr 2021 13:12
von LDG
Super vielen Dank.

dann habe ich jetzt wieder was neues gelernt. Die verwendete Sprache ist Javascript oder welche nutzt du?

Re: Bewegungsmelder+Nachtlicht 2 Regeln Zeitsteuerung

Verfasst: 7. Apr 2021 16:09
von udo1toni
Das ist die Rules DSL (DomainSpecificLanguage). Die Rules DSL ist von Anbeginn mit dabei, es gibt ein paar Einschränkungen, aber der Code ist meines erachtens sehr gut lesbar, gerade wenn es solche recht einfachen Rules sind.

Re: Bewegungsmelder+Nachtlicht 2 Regeln Zeitsteuerung

Verfasst: 7. Apr 2021 19:28
von LDG
okay danke und wenn es komplizierter werden sollte?

Sind ja erst die ersten Schritte bei mir. und da ich noch einen Roomba von Irobot habe wird es für mich noch schwieriger alleine das herrausfinden des Passworts.. da steige ich noch nicht so durch... aber erstmal die leichteren Dinge wie das Licht

Re: Bewegungsmelder+Nachtlicht 2 Regeln Zeitsteuerung

Verfasst: 7. Apr 2021 23:44
von udo1toni
Es gibt eine wesentliche Einschränkung der Main UI Rules DSL gegenüber der nativen Rules DSL, das ist die fehlende Möglichkeit, globale Variablen zu verwenden. Zum Beispiel braucht man zwingend globale Variablen, wenn man mit Timern arbeiten (und die Kontrolle darüber behalten) will.
Dann muss man die Rule in einer rules-Datei anlegen (Dateiendung .rules). Die Datei muss im openhab-conf-Verzeichnis liegen, dort im Unterverzeichnis rules/. Das openhab-conf Verzeichnis ist auf dem Raspberry gewöhnlich /etc/openhab/ (solange es sich um eine apt-Installation handelt, openHABian nutzt ebenfalls apt als Grundlage).