Zeitgesteuert Licht Dimmen

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Zeitgesteuert Licht Dimmen

Beitrag von udo1toni »

Ja, natürlich kannst Du Rules über das Event changed triggern lassen. Allerdings gibt es dabei etwas zu beachten:

Du änderst über die Rule selbst die Werte. Damit wird die andere Rule jedesmal getriggert, wenn die Sonnenaufgang/Sonnenuntergang Rule angestoßen wurde (bzw. jedesmal, wenn der Timer die Werte ändert). Es wäre also wichtig, eine globale Variable zu definieren, die anzeigt, ob gerade eine Änderung durch die Rule vorgenommen wurde. Die kannst Du dann in der zweiten Rule abfragen. Alternativ kannst Du auch versuchen, ob es reicht, den Zustand des Timers abzufragen:

Code: Alles auswählen

if(tAquaLicht === null){}
Was dann in den geschweiften Klammern steht, wird nur ausgeführt, wenn gerade kein Timer gesetzt ist. Dazu musst Du dann innerhalb des Timers für die 2. Bedingung (if nAquaCount < 201) noch einen else Block erstellen, der den Timer gezielt löscht:

Code: Alles auswählen

if(nAquaCount < 201){
...
} else
    tAquaLicht = null
Dieser Befehl war bisher nicht notwendig, da wir nie auf tAquaLicht === null geprüft haben.
Übrigens sind die drei = an dieser Stelle korrekt.

Was das Problem des Stromausfalls während des Dimmvorgangs betrifft: Um mit diesem Problem umzugehen, müsste man die Rule etwas ausbauen:
  • ein Item Number definieren, in welchem Du speicherst, ob gerade gedimmt wird. Dazu gehört dann natürlich die Information, in welche Richtung gedimmt wird (deshalb Number Item), z.B. 0 -> manuell bzw. keine aktive Steuerung durch eine Rule, 1 -> Sonnenaufgang, 2 -> Sonnenuntergang.
  • Das Item wird mit mapDB und den Startegien everyChange, restoreOnStartup persistiert.
  • Dieses Item setzt Du auf den entsprechenden Wert, bevor der Dimmvorgang startet.
  • Wenn der Dimmvorgang beendet ist, setzt Du das Item wieder auf 0.
  • eine weitere Rule (mit System started als Trigger) prüft zuerst, ob das Item eine gültige Zahl beinhaltet. Sollte das nicht der Fall sein, wurde der Status noch nicht wiederhergestellt und die Rule muss eine kleine Pause einlegen und nochmals prüfen. Anschließend prüft die Rule, ob der Wert 0 ist. Ist das nicht der Fall, muss sie den entsprechenden Dimmvorgang beenden, wobei sie die aktuellen Dimmpositionen als Ausgangswert nutzen muss. Die Richtung ist durch das Item vorgegeben.
  • Allerdings müsste diese Rule im Zweifel noch prüfen, ob die Zeit passt und ansonsten in die andere Richtung dimmen.
Insgesamt wird das vermutlich eher eklig viel Aufwand. Die Frage ist also: Wie oft hast Du einen Stromausfall? Lohnt sich der Aufwand, oder ist es nicht eher so, dass Du ohnehin nach einem Stromausfall manuell eingreifen musst?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

burliHB
Beiträge: 45
Registriert: 6. Apr 2019 14:37

Re: Zeitgesteuert Licht Dimmen

Beitrag von burliHB »

Ein Stromausfall in dem Sinn ist extrem selten, aber es kann schonmal vorkommen, dass ich die Sicherung raus mache, wenn ich an der Elektrik etwas machen will oder das ich am Server etwas mache und neu starten muss. Wenn das gerade während der Dimmer Phase passiert ist das natürlich doof. Dann bleibt das Licht, falls ich es nicht bemerke oder nicht daran denke bis zum nächsten Timer Event in dem Zustand.

Ich werde das sowieso etwas anders programmieren. Ich möchte nicht von einem festen Wert aus dimmen sondern vom aktuellen Wert.

Wegen dem Event muss ich mir dann was überlegen. Ich nehme an, du meinst die Event-based Triggers

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

Re: Zeitgesteuert Licht Dimmen

Beitrag von udo1toni »

Alle Trigger in openHAB sind event basiert. :)
Natürlich kann man immer die aktuelle Helligkeit eines Kreises als erste Stufe verwenden und dann von dort aus auf eine andere Stufe hoch oder runter dimmen. Ein möglicher Ansatz, das etwas sicherer zu gestalten:

Code: Alles auswählen

DateTime sunrise {channel="astro..."}
DateTime sunset {channel="astro..."}
String Aquasoll
Switch myRetrigger { expire="10s,state=OFF" }

Code: Alles auswählen

rule "soll Aquarium Licht setzen"
when
    System started or
    Channel 'astro:sun:home:rise#event' triggered START or
    Channel 'astro:sun:home:set#event' triggered START or
    Item myRetrigger changed to OFF
then
    if(sunrise.state == NULL || sunset.state == NULL) {
        myRetrigger.postUpdate(ON)
        return;
    }
    val mySunrise = new DateTime(sunrise.state.toString)
    val mySunset  = new DateTime(sunset.state.toString)
    if(now.isAfter(mySunrise) && now.isBefore(mySunset)) 
        Aquasoll.postUpdate("Tag")
    else 
        Aquasoll.postUpdate("Nacht")
end

rule "Aquarium Licht setzen"
when
    Item Aquasoll changed
then
    if(Aquasoll.state.toString == "Tag") {
        // auf Tag dimmen
    }
    if(Aquasoll.state.toString == "Nacht") {
        // auf Nacht dimmen
    }
end
Die erste Rule triggert unterschiedlich, durch den Systemstart, Durch Sonnenaufgang, Sonnenuntergang oder die Änderung eines Items of OFF.
Der erste Teil prüft, ob eines der beiden Items sunrise, sunset nicht gesetzt ist. Ist das der Fall, wird das ITem myRetrigger auf ON gesetzt und die Rule beendet.
Das Item myRetrigger ist mit dem expire Binding verknüpft (welches natürlich installiert sein muss) und wird automatisch nach 10 Sekunden auf OFF gesetzt. Dadurch wird die Rule wieder getriggert.
Das Spiel wiederholt sich so lange, bis beide Items einen gültigen Wert haben.
Anschließend prüft die Rule, ob wir uns gerade in der Tag- oder Nachtphase befinden und setzt ein weiteres Item entsprechend.

Die zweite Rule triggert auf Änderung dieses Items und kümmert sich nur um das Dimmen, wobei Du hier die alte Rule verwenden kannst, evtl. mit Ergänzung wegen dimmen von eingestellter Helligkeit. Dabei musst Du über den Status der beiden Dimmer entscheiden, ob Du beide Dimmer einbeziehst oder nur einen. Das macht die Rule natürlich nicht einfacher ;) Dafür kannst Du nun aber auch andere Zeitpunkte definieren, zu denen Du bestimmte Lichtstimmungen aufrufen willst. Du musst nur in der ersten Rule einen zusätzlichen Trigger einbauen und die Entscheidung mit integrieren, die überprüft, in welchem Zeitfenster wir uns befinden. Anschließend setzt Du den gewünschten Wert.
In der zweiten Rule wertest Du den Trigger entsprechend zusätzlich aus und lässt eine andere bestimmte Konstellation andimmen.

Wenn Du nun openHAB neu startest, wird die erste Rule so lange aufgerufen, bis die beiden DateTime Items einen gültigen Status haben (also Astro einmal gerechnet hat). Anschließend steuert openHAB die Sollstufe an, falls der Dimmer noch nicht dem Soll entspricht.

Natürlich habe ich nun den spannenden Teil ausgelassen, nämlich wie entscheidet die Rule, welche Dimmkurve sie verwendet? Das Problem hierbei sind natürlich die Randbedingungen, darüber müsste man noch nachdenken. Soll der Wechsel von dunkel über warm zu kalt nur zu bestimmten Uhrzeiten erfolgen? soll der Wechsel bei Unterschreiten bestimmter Dimmwerte erfolgen? Gleiches gilt natürlich für die Gegenrichtung...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten