Automatischer Dimmer (sunrise)

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Automatischer Dimmer (sunrise)

Beitrag von udo1toni »

atk69 hat geschrieben: 17. Jun 2021 07:50 Ich dachte eben, dass sich das im Zuge von OH3 als DSL-Baustein einbauen lässt.
In gewisser Weise stimmt das sogar. Das Problem ist aber die Variable, die den Timer hält, die muss global definiert sein. Man kann auch in der UI eine Variable definieren, die erhalten bleibt, aber die ist nur im Kontext der Rule gültig (und die Definition ist... umständlich, weil die Variable deklariert werden muss, und falls sie schon vorhanden ist, muss sie mit "sich selbst" befüllt werden. Irgendwo meine ich, auch mal ein Codesnippet dazu gesehen zu haben, aber es geht halt viel einfacher und sehr sauber über die Textdatei.

Mit JavaScript ginge das Ganze ebenfalls, aber gleiches Problem. Sobald Variablen global verfügbar sein müssen, wird es über die UI umständlich.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Automatischer Dimmer (sunrise)

Beitrag von atk69 »

Jetzt muss ich mich doch nochmal melden. Bin anscheinend zu doof, die funktionierende rule auf ein anderes "when"-Item zu legen :roll:

die angepasste rule soll einfach unterhalb eines bestimmten LUX-Wertes den "Sunrise-Dimmer" starten. Im Idealfall auch nur innerhalb eines Zeitfensters (auskommentiert zum testen):

Code: Alles auswählen

var Timer tSunset = null

rule "GZ_Licht an TEST DSL"

when

	Item sonoff0002ASwitchGarten_LichtwertGarten changed

then
	logInfo ("GZ_Licht an TEST DSL", "LX_State is:" + sonoff0002ASwitchGarten_LichtwertGarten.state)
	var LX_State = sonoff0002ASwitchGarten_LichtwertGarten.state as DecimalType
//  if (now.toLocalTime.getHour > 18 && now.toLocalTime.getHour < 22)   //17:00 - 21:59 Uhr
	if (LX_State <= 2)	
		

    tSunset?.cancel	
    tSunset = createTimer(now.plusSeconds(1), [|
        var nBright = GZL_Helligkeit.state as Number
        if(nBright < 10) {
            GZL_Helligkeit.sendCommand(nBright + 1)
			
            tSunset.reschedule(now.plusSeconds(1))
			
        }
	logInfo ("GZ_Licht an TEST DSL", "rule ausgelöst:" + sonoff0002ASwitchGarten_LichtwertGarten.state) 	
	])
   
	 
end
Im Log:

Code: Alles auswählen

2021-06-21 12:08:45.610 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'WZ_SL_ON_OFF_Test.rules'
2021-06-21 12:08:53.952 [INFO ] [re.model.script.GZ_Licht an TEST DSL] - LX_State is:5
2021-06-21 12:08:54.967 [INFO ] [re.model.script.GZ_Licht an TEST DSL] - rule ausgelöst:5
2021-06-21 12:08:55.968 [INFO ] [re.model.script.GZ_Licht an TEST DSL] - rule ausgelöst:5
2021-06-21 12:08:56.970 [INFO ] [re.model.script.GZ_Licht an TEST DSL] - rule ausgelöst:5
2021-06-21 12:08:57.971 [INFO ] [re.model.script.GZ_Licht an TEST DSL] - rule ausgelöst:5
2021-06-21 12:08:58.971 [INFO ] [re.model.script.GZ_Licht an TEST DSL] - rule ausgelöst:5
2021-06-21 12:08:59.973 [INFO ] [re.model.script.GZ_Licht an TEST DSL] - rule ausgelöst:5
2021-06-21 12:09:00.974 [INFO ] [re.model.script.GZ_Licht an TEST DSL] - rule ausgelöst:5
2021-06-21 12:09:01.975 [INFO ] [re.model.script.GZ_Licht an TEST DSL] - rule ausgelöst:5
2021-06-21 12:09:02.976 [INFO ] [re.model.script.GZ_Licht an TEST DSL] - rule ausgelöst:5
2021-06-21 12:09:03.977 [INFO ] [re.model.script.GZ_Licht an TEST DSL] - rule ausgelöst:5
2021-06-21 12:09:04.978 [INFO ] [re.model.script.GZ_Licht an TEST DSL] - rule ausgelöst:5
2021-06-21 12:09:05.978 [INFO ] [re.model.script.GZ_Licht an TEST DSL] - rule ausgelöst:5
Der LUX-Wert ist also oberhalb des eingestellten Wertes von "2". trotzdem läuft die rule :shock:
Was ich hier gelernt habe, ist die variablen immer am Anfang der rule zu definieren. Mache ich das mit "LX_State" kommt ein Error:

Code: Alles auswählen

Cannot reference the field 'sonoff0002ASwitchGarten_LichtwertGarten' before it is defined
Ich verstehe es nicht mehr :(
and IT works ;)

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Automatischer Dimmer (sunrise)

Beitrag von atk69 »

Nach langem Suchen und testen habe ich nun folgende Rule hinbekommen. Das Problem war im Nachhinein recht einfach: Klammerproblem!

Code: Alles auswählen

var Timer tSunset = null

rule "WZ_Licht an DSL"

when

Item sonoff0002ASwitchGarten_LichtwertGarten changed

then
var State = sonoff0002ASwitchGarten_LichtwertGarten.state as DecimalType 

	if (State <= 230){
		if (now.toLocalTime.getHour > 18 && now.toLocalTime.getHour < 22)){  //17:00 - 21:59 Uhr
		if(Wohnzimmer1000lm1_Helligkeit.state == ON) return;
    tSunset?.cancel
    tSunset = createTimer(now.plusSeconds(1), [|
        var nBright = Wohnzimmer1000lm1_Helligkeit.state as Number
        if(nBright < 60) {
            Wohnzimmer1000lm1_Helligkeit.sendCommand(nBright + 2)
			Wohnzimmer1000lm2_Helligkeit.sendCommand(nBright + 2)
            tSunset.reschedule(now.plusSeconds(1))
			
        }		
   ])
   }
   }
   
end
Also wenn der Lichtwert unter 230 sinkt, es zwischen 17:00 und 21:58 Uhr ist und die "Wohnzimmer1000lm1" nicht aktiv ist, dann startet der Dimmer bis zum eingestellten Wert 60%.

Gruss
atk69
and IT works ;)

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

Re: Automatischer Dimmer (sunrise)

Beitrag von udo1toni »

So ist es. Es fehlte die Klammer nach dem if()

Eine bedingte Verzweigung wirkt immer exakt auf den nächsten Befehl (wenn die Bedingung nicht erfüllt ist, wird dieser eine Befehl übersprungen). Will man mehr als einen Befehl bedingt ausführen, so muss man die Befehle mittels geschweifter Klammern gruppieren.
Im vorliegenden Fall wäre eine andere Möglichkeit, die Rule anders zu formulieren:

Code: Alles auswählen

var Timer tSunset = null

rule "WZ_Licht an DSL"
when
    Item sonoff0002ASwitchGarten_LichtwertGarten changed
then
    if(!(sonoff0002ASwitchGarten_LichtwertGarten.state instanceof Number)) {   // keine gültige Helligkeit
        logWarn("lightOn","Helligkeitssensor liefert keine gültige Zahl!")
        return;
    }
    if((sonoff0002ASwitchGarten_LichtwertGarten.state as Number) > 230) {      // heller als 230
        logInfo("lightOn","Es ist noch zu hell")
        return;
    }
    if(now.toLocalTime.getHour < 18 || now.toLocalTime.getHour > 21) {        // außerhalb 17:00:00 - 21:59:59 Uhr
        logInfo("lightOn","falsches Zeitfenster")
        return;
    }
    if(Wohnzimmer1000lm1_Helligkeit.state == ON) {                             // Licht bereits an
        logInfo("lightOn","Licht ist schon an")
        return;
    }
    // Alle Bedingungen sind erfüllt, also los!
    tSunset?.cancel
    tSunset = createTimer(now.plusSeconds(1), [|
        var nBright = Wohnzimmer1000lm1_Helligkeit.state as Number
        if(nBright < 60) {
            Wohnzimmer1000lm1_Helligkeit.sendCommand(nBright + 2)
            Wohnzimmer1000lm2_Helligkeit.sendCommand(nBright + 2)
            tSunset.reschedule(now.plusSeconds(1))
        }
   ])
end
Diese Form hat den einen oder anderen Vorteil, insbesondere bleibt die Schachtelungstiefe gering; außerdem ist der Code sehr strukturiert und man bekommt auf Wunsch (ansonsten kann man das Logging auch reduzieren) Informationen, warum die Rule nicht ihre Arbeit tut.

EDIT: Überzählige Klammer im Code entfernt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Automatischer Dimmer (sunrise)

Beitrag von atk69 »

Danke udo1toni für die "Schönheitskur" ;)
Da ich diese rule noch an einigen anderen Stellen (mit anderen ifs) einsetze, ist eine ordendliche Stuktur wichtig.
Einen kleinen Fehler habe ich aber noch gefunden:

Code: Alles auswählen

if(now.toLocalTime.getHour < 18 || now.toLocalTime.getHour > 21)) {        // außerhalb 17:00:00 - 21:59:59 Uhr
Hier ist eine Klammer - nach der 21- zuviel.

Gruss
atk69
and IT works ;)

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

Re: Automatischer Dimmer (sunrise)

Beitrag von udo1toni »

Ja, man sollte so spät nicht mehr...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Automatischer Dimmer (sunrise)

Beitrag von atk69 »

Hallo udo1toni
habe die obige rule ja schon eine Weile erfolgreich im Einsatz.
Nach dem update auf OH3.2 bringt er mir aber eine Fehlermeldung:

Code: Alles auswählen

[WARN ] [ore.internal.scheduler.SchedulerImpl] - Scheduled job failed and stopped
Kann es sein, das der timer so nicht mehr funktioniert ?

Gruss
atk69
and IT works ;)

int5749
Beiträge: 1161
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Automatischer Dimmer (sunrise)

Beitrag von int5749 »

atk69 hat geschrieben: 16. Jan 2022 19:17 Kann es sein, das der timer so nicht mehr funktioniert ?
Und der Code hat vorher funktioniert??
Ich glaube, da war eine Klammer noch falsch gesetzt. beim Timer.

Ersetze die folgenden Zeilen einmal im Code

Code: Alles auswählen

    // Alle Bedingungen sind erfüllt, also los!
    tSunset?.cancel
    tSunset = createTimer(now.plusSeconds(1)), [|
        var nBright = Wohnzimmer1000lm1_Helligkeit.state as Number
        if(nBright < 60) {
            Wohnzimmer1000lm1_Helligkeit.sendCommand(nBright + 2)
            Wohnzimmer1000lm2_Helligkeit.sendCommand(nBright + 2)
            tSunset.reschedule(now.plusSeconds(1))
        }
   ]
end
VG
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

atk69
Beiträge: 95
Registriert: 15. Jan 2019 19:07
Answers: 1
Wohnort: Weil am Rhein

Re: Automatischer Dimmer (sunrise)

Beitrag von atk69 »

Hallo int5749
Ja, bisher hat die Rule funktioniert :-)
habe die Änderung mal angewand:
im log:

Code: Alles auswählen

[WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'WZ_SL_ON_OFF.rules' has errors, therefore ignoring it: [26,46]: mismatched input ',' expecting 'end'
Zeile 26 ist genau diese

Code: Alles auswählen

tSunset = createTimer(now.plusSeconds(1)), [|
Zur Sicherheit nochmal die komplette Rule mit aktivem log. Die Items haben sich etwas vom Namen her geändert. Sind aber die gleichen Geräte.

Code: Alles auswählen

var Timer tSunset = null

rule "WZ_Licht an DSL"
when
    Item SonoffBasic_SonoffTAS15Lux changed
then
    if(!(SonoffBasic_SonoffTAS15Lux.state instanceof Number)) {   // keine gültige Helligkeit
        logWarn("lightOn","Helligkeitssensor liefert keine gültige Zahl!")
        return;
    }
    if((SonoffBasic_SonoffTAS15Lux.state as Number) > 200) {      // heller als 150
         logInfo("lightOn","Es ist noch zu hell")
        return;
    }
    if(now.toLocalTime.getHour < 16 || now.toLocalTime.getHour > 21) {        // außerhalb 17:00:00 - 21:59:59 Uhr
           logInfo("lightOn","falsches Zeitfenster")
        return;
    }
    if(WohnzimmerSLo_Helligkeit == ON) {                             // Licht bereits an
        logInfo("lightOn","Licht ist schon an")
        return;
    }
																			// Alle Bedingungen sind erfüllt, also los!
    tSunset?.cancel
    tSunset?.cancel
    tSunset = createTimer(now.plusSeconds(1)), [|
        var nBright = WohnzimmerSLo_Helligkeit.state as Number
        if(nBright < 60) {
            WohnzimmerSLo_Helligkeit.sendCommand(nBright + 2)
            WohnzimmerSLu_Helligkeit.sendCommand(nBright + 2)
            tSunset.reschedule(now.plusSeconds(1))
        }
   ]
end
Gruss
atk69
and IT works ;)

int5749
Beiträge: 1161
Registriert: 4. Nov 2019 22:08
Answers: 9

Re: Automatischer Dimmer (sunrise)

Beitrag von int5749 »

atk69 hat geschrieben: 17. Jan 2022 08:08 Hallo int5749
Ja, bisher hat die Rule funktioniert :-)
Verwunderlich ;-)
atk69 hat geschrieben: 17. Jan 2022 08:08

Code: Alles auswählen

tSunset = createTimer(now.plusSeconds(1)), [|
Zeile 26 ist genau diese
Da liegt der Hase im Pfeffer ;-) Denn es ich ein Komma zu viel.

Code: Alles auswählen

tSunset = createTimer(now.plusSeconds(1)) [|
VG
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3

Antworten