Rule zum Zeit- und Lichtabhängigem schalten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Hoggle
Beiträge: 221
Registriert: 16. Dez 2017 10:49
Answers: 0

Rule zum Zeit- und Lichtabhängigem schalten

Beitrag von Hoggle »

Kurze Frage in die Runde bezüglich meiner "Zeit- Lichtschalt- Steckdose"

Ich habe eine schaltbare Steckdose, an der eine kleine Lampe angeschlossen ist, die bei Unterschreitung eines LUX-Wertes meines Lichtwertgebers meine Flurlampe anschaltet und in der Woche um 23.00 Uhr und am Wochenende um 01.00 Uhr ausschaltet.

Eigentlich geht die Rule auch ganz gut, denn ich sehe, das die Schaltpunkte kommen und die Lampe angeschaltet wird, wenn ein DUMMY-Switch auf ON geht.
Mit dem ausschalten habe ich aber so meine Probleme. Kann sich das vielleicht jemand anschauen, ob die Lösung, die ich mir ausgedacht habe, das Ding der Dinge ist, oder gibt es da eine bessere Lösung?

In dem unten stehenden Code-Schnipsel definiere ich für einige rules ein paar lichtabhängige dummys.
Da ist zum Beispiel die Frage, ob ich die 2. IF-Abfrage benötige, also:

Code: Alles auswählen

if (LUX_K1LUX.state < 200) //Es ist Dunkel
             {
				if (LUX_Wert_Dunkel.state.toString =="OFF")
				 {
			         LUX_Wert_Dunkel.sendCommand(ON)
				 }
			 }
Wenn ich die 2. IF-Abfrage nicht mache, dann wird doch bei jedem Werte-Update, also bei allen Änderungen unterhalb von 200 Lux ein ON an "LUX_Wert_Dunkel gesendet, oder?
Das hat nämlich zur Folge, das beim nächsten Update die Lampe Nachts wieder eingeschaltet wird.

Gibt es dafür eine bessere Lösung?

In dem Zusammenhang noch eine weitere Frage zu "IF":
Wie frage ich denn ab, ob es z. B. innerhalb der Woche später als 23.00 Uhr ist, so das ich auf jeden Fall weitere ON-Befehle nach 23.00 Uhr verhindern kann
RPI4/8GB RAM mit openhabian (bullseye) - Kernel Linux 6.1.21-v8+ - openhab 4.0.2 - Release Build - HM-CCU3 - ZWave UZB-USB Stick - Wifi-LED-Stripes - Logitech Harmony Hub - AVM Fritzbox - Enigma2-Box - Gardena HUB - Fronius-Binding - Miele@Home

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

Re: Rule zum Zeit- und Lichtabhängigem schalten

Beitrag von udo1toni »

Besser wäre es gewesen, Deine gesamte Rule (bzw. vermutlich deren zwei) zu posten.

Außerdem reicht es nicht, die Abschaltzeit zu nennen, Du musst auch einen Zeitpunkt benennen, ab dem das Licht wieder eingeschaltet werden darf.
Ein Ansatz sähe z.B. so aus: (angenommener Startpunkt ist 20 Uhr)

Code: Alles auswählen

rule "Nachtlicht an"
when
    Item LUX_K1LUX changed
then
    if((LUX_K1LUX.state as Number) > 210) // heller als 210 -> Licht aus
        Licht.sendCommand(OFF)
    else 
        if((LUX_K1LUX.state as Number) < 200) // dunkler als 200...
            if((now.getDayOfWeek > 5 && now.minusHours(1).getHourOfDay > 18) || (now.plusDays(1).getDayOfWeek < 6 && now.plusHours(1).getHourOfDay > 20))
                Licht.sendCommand(ON)
end

rule "Nachtlicht aus"
when
    Time cron "0 0 23 ? * 1-4,7" or // Montag-Donnerstag, Sonntag 23 Uhr
    Time cron "0 0 1 ? * 6,7" // Samstag, Sonntag 1 Uhr
then
    Licht.sendCommand(OFF)
end
Die erste Rule schaltet das Licht aus, sofern die Helligkeit überschritten wird.
Die Schwelle ist etwas höher als die Einschaltschwelle, damit es nicht zum Flattern kommt.
Falls die Helligkeit unterschritten wird, prüft die nächste etwas komplere Bedingung den korrekten Zeitraum. Der Trick ist hier, das Datum und die Zeit so zu verschieben, dass nicht diverse zusätzliche Prüfengen fällig werden.
Samstags und sonntags (Tag der Woche > 5) wird von der aktuellen Zeit eine Stunde abgezogen. Um 00:59:59 Uhr wäre die Uhrzeit also 23:59:59 Uhr. Um 20:00:00 Uhr wäre die Uhrzeit dann 19:00:00 Uhr. Damit müsste die Stunde dann größer als 18 sein, wenn die Untergrenze 20 Uhr wäre.

Die zweite Teilbedingung ist nochmals verschwurbelter. Sonntags bis Donnerstags (das ergibt sich daraus, dass Sonntag +1 Montag ist, Und Donnerstag + 1 Freitag ist, somit ist getDayOfWeek dann 1-5, also kleiner 6) wird geprüft, ob die Uhrzeit + eine Stunde größer als 20 ist (aus 22:59:59 wird 23:59:59, aus 20:00:00 Uhr wird 21:00:00 Uhr).

Damit wird das Licht nur dann eingeschaltet, wenn die Helligkeit unter den festgelegten Wert sinkt und es nach 20 Uhr ist, Sonntag bis Donnerstag vor 23 Uhr bzw. Freitag und Samstag vor 1 Uhr ABENDS (also "25 Uhr")

Die zweite Rule schaltet zu den gesetzten Zeitpunkten das Licht aus.

Eine andere Alternative wäre, ein Item LichtEnable zu definieren, dieses wird durch zwei Rules ein- und ausgeschaltet, das Einschalten passiert immer um 20 Uhr, das Ausschalten genauso wie oben, zusätzlich zum Licht.
Dann reduziert sich der Test in der ersten Rule auf den Zustand von LichtEnable, dafür braucht es halt noch die dritte Rule für das Enable um 20 Uhr.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Hoggle
Beiträge: 221
Registriert: 16. Dez 2017 10:49
Answers: 0

Re: Rule zum Zeit- und Lichtabhängigem schalten

Beitrag von Hoggle »

Ja, das ich da noch etwas vergessen hatte zu posten ist mir heute Nacht im Bett eingefallen (Oh Mann, wie weit ist es gekommen :? )

Code: Alles auswählen

rule "Dummys bei Helligkeitänderungen setzen für Rules"
when
	Item LUX_K1LUX changed 
then
		if (LUX_K1LUX.state < 200) //Es ist Dunkel
             {
				 if (LUX_Wert_Dunkel.state.toString =="OFF")
				 	{
			         		LUX_Wert_Dunkel.sendCommand(ON)
				 	}
			 }
		if (LUX_K1LUX.state > 500) //Es ist hell
                         {
				if (LUX_Wert_Dunkel.state.toString =="ON")
					{
             					LUX_Wert_Dunkel.sendCommand(OFF)
		         		}
			 }
end

rule "Schaltbare Steckdose an wenn dunkel"
when
	Item LUX_Wert_Dunkel changed from OFF to ON
then
        ZWaveZeitschaltuhr_SwitchBinary.sendCommand(ON)
end


rule "Schaltbare Steckdose aus wenn Hell"
when
	Item LUX_Wert_Dunkel changed from ON to OFF
then
        ZWaveZeitschaltuhr_SwitchBinary.sendCommand(OFF)
end

rule "Licht im Flur in der Woche ausschalten"
    when
        Time cron "0 0 23 ? * 1-5"
    then
        ZWaveZeitschaltuhr_SwitchBinary.sendCommand(OFF)
	end

rule "Licht im Flur am Wochenende ausschalten"
    when
        Time cron "0 59 0 ? * 6-7"
    then
        ZWaveZeitschaltuhr_SwitchBinary.sendCommand(OFF)
	end
Ich könnte die rule "Schaltbare Steckdose aus wenn Hell" vielleicht auch weg lassen, aber ich hab mir so gedacht, wenn es durch schlechtes Wetter mal vorkommen sollte, das es am Tag mal dunkel wird (Gewitter, o.ä.), dann kann die Lampe ruhig angeschaltet werden, besonders da der Lichtsensor nach Süden schaut und der Flur auf der Nordseite mit nur einem kleinen Fenster ist.

Wenn die Wolken dann weg sind, dann kann die Lampe ja auch wieder ausgehen.
Um das "flimmern" zu verhindern habe ich die Differenz sogar noch größer gewählt.
Dunkel ist es erst bei 200 LUX und hell ist es erst bei 500 LUX.

Die Rules funktionieren wohl so auch. Ich hatte halt nur überlegt, ob so etwas zu optimieren ist. Ich bin kein Programmierer und dementsprechend könnte ich mir vorstellen, das es entweder eine "Quick and dirty" Variante ähnlich meiner gibt und vielleicht eine "sauber strukturiertere" Lösung die eher einem Standard entspricht.
Wie gesagt, bin eben kein Programmierer ;)
RPI4/8GB RAM mit openhabian (bullseye) - Kernel Linux 6.1.21-v8+ - openhab 4.0.2 - Release Build - HM-CCU3 - ZWave UZB-USB Stick - Wifi-LED-Stripes - Logitech Harmony Hub - AVM Fritzbox - Enigma2-Box - Gardena HUB - Fronius-Binding - Miele@Home

Caddy
Beiträge: 117
Registriert: 16. Nov 2018 08:21
Answers: 0

Re: Rule zum Zeit- und Lichtabhängigem schalten

Beitrag von Caddy »

Hallo Hoggle,

ich habe vor Kurzem mit udo1toni diese Rule für mich entwickelt. Macht in etwa das selbe nur mit einem anderen Ansatz
Vielleicht kannst du ja was draus brauchen:

Code: Alles auswählen

rule "Automatische Aussenbeleuchtung"
when
    System started or
    Time cron "1 0 6 * * ?" or
    Time cron "1 0 23 * * ?" or
    Channel 'astro:sun:home:civilDawn#event' triggered START or
    Channel 'astro:sun:home:civilDusk#event' triggered START
then
	var mySwitch = OFF
	var Number hour = now.getHourOfDay
	var cDusk = now.withTimeAtStartOfDay.plusHours(20).millis
	var cDawn = now.withTimeAtStartOfDay.plusHours(7).millis
	if(CivilDusk_StartTime.state != NULL) { 
	  cDusk = (CivilDusk_StartTime.state as DateTimeType).calendar.timeInMillis }
	if(CivilDawn_StartDate.state != NULL) {
		cDawn = (CivilDawn_StartDate.state as DateTimeType).calendar.timeInMillis }
	if(hour<6 || hour>22) {
		mySwitch = OFF}
    else if (now.isAfter(cDawn) && now.isBefore(cDusk)) {	
		mySwitch = OFF}
    else {
		mySwitch = ON}
    gNachtLicht.sendCommand(mySwitch)
    logInfo("Rule.autoABeleuchtung","autoABeleuchtung {}",mySwitch)	
	sendTelegram("bot1", "autoABeleuchtung %s",mySwitch)	
end
Ich wollte bei Dämmerung einschalten
Um 23 Uhr ausschalten
Um 6 Uhr einschalten
Bei Morgendämmerung wieder aus.

Vielen Dank noch mal an udo1toni :-)

Gruß Caddy

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

Re: Rule zum Zeit- und Lichtabhängigem schalten

Beitrag von udo1toni »

Naja, sauber strukturiert ist halt relativ.

Wie erwähnt hast Du bei der Wochenendschaltung einen kleinen Denkfehler :)
Du möchtest Sonntags um 23 Uhr ausschalten, da Du Montag wieder früh aufstehen musst. ;)
Momentan schaltest Du Sonntags gar nicht aus (nur um 1 Uhr, das ist das Ende vom Samstag, und dan wieder Montag um 23 Uhr)
Dagegen kannst Du Freitags erst am Samstag Morgen abschalten.
Momentan schaltest Du dort gleich zweimal aus, nämlich um 23 Uhr und um 1 Uhr.
Der Time cron Ausdruck für Montag bis Freitag muss also Sonntag und Montag bis Donnerstag auslösen, nicht Montag bis Freitag.

Wie von Dir befürchtet wird im Zweifel eine Helligkeitsänderung nach 23 Uhr oder nach 1 Uhr (je nach Wochentag) das Licht unmittelbar wieder einschalten, da Du keine Mindestuhrzeit als Bedingung nutzt.

Das Setzen und Löschen des Dunkel-Items kannst Du Dir aber sparen, es sei denn, Du nutzt es noch in anderen Rules, und selbst dann ist die Auswertung der aktuellen Helligkeit sinnvoller.
Geschweifte Klammern kann man nutzen, sie sind aber nur dann zwingend notwendig, wenn mehr als ein Befehl an die Bedingung geknüpft ist, oder wenn nicht eindeutig ist, auf welches if sich ein else bezieht.
In Deiner Rule erhöhen sie auch nicht die Übersichtlichkeit ;)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten