es geht um 21 Uhr aus aber wenn sich der Dämmerungswert wieder ändert gleich wieder an.
Alos muß man es doch bis zum nächsten Hell werden wieder sperren?
Oder....
Rule für Dämmerung
-
- Beiträge: 1173
- Registriert: 4. Nov 2019 22:08
Re: Rule für Dämmerung
Jain, sperren wäre sehr hart. Ich würde dann eher über ein Proxy-Item arbeiten.
Dieses sollte dann bei unterschreiten einer Helligkeit z.B. auf ON gehen und wenn es hell wird wieder OFF.
Auf diesem könntest Du dann triggern und schalten.
Ich nuzte dafür ein "Switch Night" bei mir, welches von einem Dämmerungsschalter auf ON oder OFF gesetzt und in diversen Rules genutzt wird.
Dieses sollte dann bei unterschreiten einer Helligkeit z.B. auf ON gehen und wenn es hell wird wieder OFF.
Auf diesem könntest Du dann triggern und schalten.
Ich nuzte dafür ein "Switch Night" bei mir, welches von einem Dämmerungsschalter auf ON oder OFF gesetzt und in diversen Rules genutzt wird.
openHAB 4.1.0 Release mit openHABian in einem Debian Bookworm (LXC) unter Proxmox 8.1.3
-
- Beiträge: 68
- Registriert: 13. Jan 2018 19:43
Re: Rule für Dämmerung
Hallo,
ich habe es mal mit dem Google Kalender versucht...
Ist das so zu umständlich?
Item
Rule
ich habe es mal mit dem Google Kalender versucht...
Ist das so zu umständlich?
Item
Code: Alles auswählen
Number Daemmerungswerteinstellen_sd03 "Dämmerungswert einstellen [%s]" <sun_clouds>
Switch automatik_sd03_hauptschalter "Steckdose Fenster Automatik Hauptschalter"
Switch automatik_sd03_kalender
Switch automatik_sd03
Code: Alles auswählen
rule "Kalender auslesen"
when
Item automatik_sd03_kalender changed //BEGIN:automatik_sd03_kalender:ON oder END:automatik_sd03_kalender:OFF
then
if(automatik_sd03_kalender.state == ON)
{
automatik_sd03.sendCommand(ON)
}
else
{
automatik_sd03.sendCommand(OFF)
Sd_03_EZ01_2OG.sendCommand(OFF)
}
end
rule "Dämmerungsschalter Fenster Esszimmer"
when
Item Daemmerungswert received update or //wenn eins von beiden ausgelöst
Item automatik_sd03_hauptschalter received update or
Item automatik_sd03_kalender received update
then
if ((automatik_sd03_hauptschalter.state == ON) && (Sd_03_EZ01_2OG.state == OFF) && (automatik_sd03.state == ON)) { //wenn der Schalter auf ein steht und die Steckdose noch aus ist und der Kalender ON sendet
if (Daemmerungswert.state <= Daemmerungswerteinstellen_sd03.state as Number) { //wenn der Daemmerungswert kleiner ist als Daemmerungswerteinstellen_sd03
Sd_03_EZ01_2OG.sendCommand(ON) //dann Steckdose ein
}
else
{Sd_03_EZ01_2OG.sendCommand(OFF)
}
}
end
- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Rule für Dämmerung
Ich klemme mich mal dazu... Ich denke, Du machst Dir Dein Leben zu kompliziert.
Du hast ursprünglich ein Item uhrzeit_schalten_sd03, welches als Ausschaltzeitpunkt dienen soll. Dann bräuchtest Du aber auch zwingend ein zweites Item mit einem Eionschaltzeitpunkt. Nein, ich meine jetzt nicht, dass dann eingeschaltet wird. Stattdessen ist das Ganze ja ein dreistufiges Enable/Disable.
1. Stufe: Automatik aktiv
2. Stufe: Zeitfenster aktiv
3. Stufe Helligkeit passt.
Ich erkläre mal, wie ich das umsetzen würde (ohne Google Calendar):
Die Rule triggert also bei etlichen Itemänderungen, eben alle, die Einfluss auf den Sollzustand des Aktors haben.
Der erste Schritt ist, zu überprüfen, ob die Automatik eingeschaltet ist. Und da kommt schon eine Frage auf... Was soll passieren, wenn der Aktor aktiv ist, und von Automatikmodus nach Manuell gewechselt wird? Meine Regel tut dann einfach gar nichts, man könnte dann aber auch gezielt abschalten, dann müsste halt zusätzlich der Wechsel des Modus in die Trigger und ein paar zusätzliche Zeilen Code in den ersten if-Block rein.
Nach dem ersten if-Block ist klar, dass der Automatik Modus aktiv ist. Nun werden also alle Werte abgeholt, die für die Betrachtung relevant sind. Da jedes der Items auch NULL enthalten kann, müssen Vorkehrungen getroffen werden, hier der Einfachheit halber über lokale Variablen.
Nun folgt eine Grenzwertbetrachtung, zum einen, befinden wir uns im festgelegten Zeitfenster? Und zum anderen, wurde der eingestellte Grenzwert unterschritten? Anhand der Defaultwerte kannst Du erkennen, dass bei fehlenden Werten der Sollzustand OFF sein wird. Fehlen nur die Zeitwerte, so reagiert die Rule auf die Helligkeitswerte, die Zeitgrenzen sind also inaktiv.
Sind alle Bedingungen erfüllt, so wird lediglich der Sollwert geändert, sonst nichts.
Zum Schluss prüft die Rule, ob der Sollwert vom Istwert abweicht. Nur wenn das der Fall ist, wird auch ein Schaltbefehl abgesetzt. Damit werden unnötige Schaltbefehle vermieden, die nur das log vollmüllen.
Du hast ursprünglich ein Item uhrzeit_schalten_sd03, welches als Ausschaltzeitpunkt dienen soll. Dann bräuchtest Du aber auch zwingend ein zweites Item mit einem Eionschaltzeitpunkt. Nein, ich meine jetzt nicht, dass dann eingeschaltet wird. Stattdessen ist das Ganze ja ein dreistufiges Enable/Disable.
1. Stufe: Automatik aktiv
2. Stufe: Zeitfenster aktiv
3. Stufe Helligkeit passt.
Ich erkläre mal, wie ich das umsetzen würde (ohne Google Calendar):
Code: Alles auswählen
Number time_enable_sd03 // in Minuten nach Mitternacht
Number time_disable_sd03 // in Minuten nach Mitternacht
Number setLevel_sd03
Number Daemmerungswert
Switch automatik_sd03
Switch Sd_03_EZ01_2OG
Code: Alles auswählen
rule "Auto Switch SD03"
when
Item time_enable_sd03 changed or
Item time_disable_sd03 changed or
Item setLevel_sd03 changed or
Item Daemmerungswert changed
then
if(automatik_sd03.state != ON) { // Automatik aus?
return; // dann Abbruch!
}
var Number nEnable = 0 // Defaultwert, falls noch nichts eingestellt ist
var Number nDisable = 60*24 // Defaultwert, falls noch nichts eingestellt ist
var Number nSetLevel = 100 // Defaultwert, falls noch nichts eingestellt ist
var Number nLevel = 200 // Defaultwert, falls noch kein Messwert kommt
var sSoll = OFF // Soll Schaltstellung
val Number mNow = now.getMinuteOfDay // Minute des Tages
if(time_enable_sd03.state instanceof Number) nEnable = time_enable_sd03.state as Number // Wert lesen
if(time_disable_sd03.state instanceof Number) nDisable = time_disable_sd03.state as Number // Wert lesen
if(setLevel_sd03.state instanceof Number) nDisable = setLevel_sd03.state as Number // Wert lesen
if(Daemmerungswert.state instanceof Number) nDisable = Daemmerungswert.state as Number // Wert lesen
if(mNow >= nEnable && mNow < nDisable && nLevel <= nSetLevel) { // Im Zeitfenster und Wert unterschritten?
sSoll = ON // Dann Solltustand ändern
}
if(Sd_03_EZ01_2OG.state != sSoll) // Falls aktueller Status von Sollzustand abweicht
Sd_03_EZ01_2OG.sendCommand(sSoll.toString) // umsteuern
end
Der erste Schritt ist, zu überprüfen, ob die Automatik eingeschaltet ist. Und da kommt schon eine Frage auf... Was soll passieren, wenn der Aktor aktiv ist, und von Automatikmodus nach Manuell gewechselt wird? Meine Regel tut dann einfach gar nichts, man könnte dann aber auch gezielt abschalten, dann müsste halt zusätzlich der Wechsel des Modus in die Trigger und ein paar zusätzliche Zeilen Code in den ersten if-Block rein.
Nach dem ersten if-Block ist klar, dass der Automatik Modus aktiv ist. Nun werden also alle Werte abgeholt, die für die Betrachtung relevant sind. Da jedes der Items auch NULL enthalten kann, müssen Vorkehrungen getroffen werden, hier der Einfachheit halber über lokale Variablen.
Nun folgt eine Grenzwertbetrachtung, zum einen, befinden wir uns im festgelegten Zeitfenster? Und zum anderen, wurde der eingestellte Grenzwert unterschritten? Anhand der Defaultwerte kannst Du erkennen, dass bei fehlenden Werten der Sollzustand OFF sein wird. Fehlen nur die Zeitwerte, so reagiert die Rule auf die Helligkeitswerte, die Zeitgrenzen sind also inaktiv.
Sind alle Bedingungen erfüllt, so wird lediglich der Sollwert geändert, sonst nichts.
Zum Schluss prüft die Rule, ob der Sollwert vom Istwert abweicht. Nur wenn das der Fall ist, wird auch ein Schaltbefehl abgesetzt. Damit werden unnötige Schaltbefehle vermieden, die nur das log vollmüllen.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet