Es böte sich an, für die Farben ein paar Konstanten zu definieren. Dann kann die entsprechende Funktion jeweils einfach die entsprechende Farbe aufrufen.
Ich habe selbst keine Hue Lampen, wie verhält sich denn die Lampe bei LSELECT? Vermutlich wechselt sie dann zwischen Aus und der angewählten Farbe?
So sähe das meiner Meinung nach aus:
Code: Alles auswählen
// globale Konstanten und Variablen zu Beginn der Datei definieren!
val hsbGreen = new HSBType(120,100,100)
val hsbRed = new HSBType(0,100,100)
val hsbWhite = new HSBType(35,50,20)
val hsbBlack = new HSBType(35,50,0)
rule "Hausnummer Licht an"
when
Channel 'astro:sun:local:civilDusk#event' triggered START
then
Licht_Hausnummer_col.sendCommand(hsbWhite)
Licht_Hausnummer_aktiv.postUpdate(ON)
end
rule "Hausnummer Licht aus"
when
Channel 'astro:sun:local:morningNight#event' triggered START
then
Licht_Hausnummer_col.sendCommand(hsbBlack)
Licht_Hausnummer_aktiv.postUpdate(OFF)
end
rule "Garagentor fährt"
when
Item Garagentor received command
then
if(receivedCommand == ON) {
Licht_Hausnummer_col.sendCommand(hsbGreen)
Licht_Hausnummer_alert.sendCommand("LSELECT")
} else {
Licht_Hausnummer_alert.sendCommand("NONE")
Licht_Hausnummer_col.sendCommand(if(Licht_Hausnummer_aktiv.state == ON) hsbWhite else hsbBlack)
}
end
Das Item Licht_Hausnummer_aktiv ist ein ungebundenes Item, welches den Soll-Zustand der Leuchte hält, damit die Leuchte nach Beenden des Alarms auf den passenden Modus zurück schalten kann.
Der Punkt ist aber, dass die Farbe sicherlich zunächst ausgewählt werden muss.
Noch ein paar Gedanken dazu:
- Was passiert, wenn der Übergang Licht An/Aus während des Alarms erfolgt?
- Was passiert, wenn während eines "rot"-Alarms ein "grün"-Alarm auftritt? (und andersrum)
- Was passiert, wenn Licht_Hausnummer_alert auf LSELCT gesetzt wurde, und die Farbe geändert wird (vor allem auf einen Helligkeitswert 0)?
Das sind so die Stellen, die man vermutlich in den jeweiligen Rules berücksichtigen muss. Entsprechend wäre vermutlich eine statemachine das Mittel der Wahl. Der Sollzustand für die Hausnummernbeleuchtung wird dann von Astro gesteuert, die Beleuchtung selbst aber von der State Machine, welche als Trigger den Sollzustand und die beiden Alarme bekommt. Wenn einer der Trigger aufläuft, wertet die State Machine anhand der Zustände der Items aus, was die Lampe gerade machen soll und sorgt für den passenden Zustand. Also so:
Code: Alles auswählen
rule "Abend"
when
Channel 'astro:sun:local:civilDusk#event' triggered START
then
Dunkel.postUpdate(ON)
end
rule "Morgen"
when
Channel 'astro:sun:local:morningNight#event' triggered START
then
Dunkel.postUpdate(OFF)
end
rule "Hausnummer Licht"
when
Item Dunkel changed or
Item Garage changed or
Item Alarm changed
then
val hsbGreen = new HSBType(120,100,100)
val hsbRed = new HSBType(0,100,100)
val hsbWhite = new HSBType(35,50,20)
val hsbBlack = new HSBType(35,50,0)
if(Alarm.state == ON) {
Licht_Hausnummer_col.sendCommand(hsbRed)
Licht_Hausnummer_alert.sendCommand("LSELECT")
} else if(Garage.state == ON) {
Licht_Hausnummer_col.sendCommand(hsbGreen)
Licht_Hausnummer_alert.sendCommand("LSELECT")
} else if(Dunkel.state == ON) {
Licht_Hausnummer_alert.sendCommand("NONE")
Licht_Hausnummer_col.sendCommand(hsbWhite)
} else {
Licht_Hausnummer_alert.sendCommand("NONE")
Licht_Hausnummer_col.sendCommand(hsbBlack)
}
end
Dabei ist zu bemerken, dass die Konstanten nun bequem innerhalb der Rule definiert werden können, da wir nur eine Rule für die Lampe brauchen.
Das Item Dunkel wird durch Astro ein- und ausgeschaltet, das Item Garage ist ON wenn das Tor fährt, das Item Alarm ist ON wenn ein Alarm auftritt. Es sollte klar sein, dass der Alarm die höchste Priorität genießt und die "Tor fährt" Anzeige dann nicht zum Zug kommt.
Man könnte noch den aktuellen Zustand der beiden Items auswerten, um unnötige Steuerbefehle zu unterdrücken (Während der Alarm aktiv ist, wechselt Garage oder Dunkel den Zustand oder während Garage aktiv ist, wechselt Dunkel den Zustand)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet