Rule Beleuchtung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04

Rule Beleuchtung

Beitrag von Backbe01 »

Hallo,

ich habe Probleme mit einer Rule! Habe openhabian mit OH 2.5 auf einem Raspberry laufen.

Ich würde gerne über das Habpanel mittels mehrerer Push-Buttons unterschiedliche Lichtszenen hinterlegen. Dazu habe ich mehrere Dummy Switch erstellt. Wenn einer aktiviert wird soll eine Rule im Hintergrund laufen. Mit einer anderen Rule soll das Licht komplett ausgeschalten werden. Die Lampen die gesteuert werden soll sind zwei Colour Temperature Stripes.

Mein Problem ist, mit einem Stripe funktioniert die Regel. Ich schaffe es aber nicht den zweiten Stripe mit einzubinden. Hier mal mein Rule inkl. items...

Rule die funktioniert

Code: Alles auswählen

val dimVal = LEDstripe_EG_KuecheDH.state as Number

rule "Nachtlicht"



when 
    Item Szene_Kueche_Nachtlicht received command ON  

then 
    logInfo("Nachtlicht.rules", "Nachtlicht gestartet")
    if  ((LEDstripe_EG_KuecheDH.state as Number) >=2)  {
        LEDstripe_EG_KuecheDH.sendCommand(1)
        LEDstripe_EG_KuecheDF.sendCommand(82)
    }

    if ((LEDstripe_EG_KuecheDH.state as Number) <1)  {
        LEDstripe_EG_KuecheDH.sendCommand(1)
        LEDstripe_EG_KuecheDF.sendCommand(82)
    }

end 
Rule die nicht läuft:

Code: Alles auswählen

val dimVal = LEDstripe_EG_KuecheDH.state as Number
val dimVal = LEDstripe_EG_EsszimmerDH.state as Number


rule "Nachtlicht copy"



when 
    Item Szene_EG_Nachtlicht received command ON  

then 
    logInfo("Nachtlicht.rules", "Nachtlicht gestartet")
    if  ((LEDstripe_EG_KuecheDH.state as Number) >=2)  {
        LEDstripe_EG_KuecheDH.sendCommand(1)
        LEDstripe_EG_KuecheDF.sendCommand(82)
    }

    if ((LEDstripe_EG_KuecheDH.state as Number) <1)  {
        LEDstripe_EG_KuecheDH.sendCommand(1)
        LEDstripe_EG_KuecheDF.sendCommand(82)
    }

    if ((LEDstripe_EG_EsszimmerDH.state as Number) >=2)  {
        LEDstripe_EG_EsszimmerDH.sendCommand(1)
        LEDstripe_EG_EsszimmerDF.sendCommand(82)
    }
    if ((LEDstripe_EG_EsszimmerDH.state as Number) <1)  {
        LEDstripe_EG_EsszimmerDH.sendCommand(1)
        LEDstripe_EG_EsszimmerDF.sendCommand(82)
    }


end 
Items

Code: Alles auswählen

Dimmer  LEDstripe_EG_KuecheDF       "Farbtemperatur Küche"                     (EG_Kueche,gLampen)     [ "Lighting" ]    {channel="hue:0220:001788a519da:24:color_temperature"}
Dimmer  LEDstripe_EG_KuecheDH       "Helligkeit Küche"                         (EG_Kueche,gLampen)     [ "Lighting" ]    {channel="hue:0220:001788a519da:24:brightness"}
Dimmer  LEDstripe_EG_EsszimmerDF    "Farbtemperatur Esszimmer"                 (EG_Esszimmer,gLampen)  [ "Lighting" ]    {channel="hue:0220:001788a519da:17:color_temperature"}
Dimmer  LEDstripe_EG_EsszimmerDH    "Helligkeit Esszimmer"                     (EG_Esszimmer,gLampen)  [ "Lighting" ]    {channel="hue:0220:001788a519da:17:brightness"}
//Licht Scenen
Switch  Szene_Kueche_Nachtlicht            "Szene Nachtlicht"                         (gSzenen)      {autoupdate="false"}                                       
Switch  Szene_EG_Nachtlicht                "Szene Nachtlicht Wohnbereich"            (gSzenen)        {autoupdate="false"}                                                                       
Switch  Szenen_EG_beenden                  "Szenen ausschalten"                      (gSzenen)      {autoupdate="false"}
Das bringt mich zu noch einer weiteren Frage:

Was ist der Unterschied zwischen den Befehlen

sendCommand(TVWand_EG_Wohnzimmer, OFF) und
TVWand_EG_Wohnzimmer.sendCommand(OFF)

Vielen Dank vorab...

Gerhard
OH 4.1.0M2 auf nuc in Docker

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

Re: Rule Beleuchtung

Beitrag von udo1toni »

Warum auch immer Du eine globale Konstante definierst (was im Übrigen so nicht funktioniert ;) ), die darf natürlich nur einmal definiert werden. Ansonsten sieht die zweite Rule syntaktisch korrekt aus. Allerdings ist die rule nicht schön ;)
Auch wenn es sich nur um zwei Lichtquellen handelt, so böte es sich an, hier eine Gruppensteuerung zu verwenden:
Items:

Code: Alles auswählen

Group:Dimmer LEDstripe_EG

Dimmer LEDstripe_EG_KuecheDF    "Farbtemperatur Küche"     (EG_Kueche,gLampen,LEDstripe_EG)     [ "Lighting" ] {channel="hue:0220:001788a519da:24:color_temperature"}
Dimmer LEDstripe_EG_KuecheDH    "Helligkeit Küche"         (EG_Kueche,gLampen,LEDstripe_EG)     [ "Lighting" ] {channel="hue:0220:001788a519da:24:brightness"}
Dimmer LEDstripe_EG_EsszimmerDF "Farbtemperatur Esszimmer" (EG_Esszimmer,gLampen,LEDstripe_EG)  [ "Lighting" ] {channel="hue:0220:001788a519da:17:color_temperature"}
Dimmer LEDstripe_EG_EsszimmerDH "Helligkeit Esszimmer"     (EG_Esszimmer,gLampen,LEDstripe_EG)  [ "Lighting" ] {channel="hue:0220:001788a519da:17:brightness"}
Rule:

Code: Alles auswählen

rule "Nachtlicht"
when 
    Item Szene_EG_Nachtlicht received command ON  
then 
    logInfo("Nachtlicht.rules", "Nachtlicht gestartet")
    LEDstripe_EG.members.forEach[i|
        if(i.name.endsWith("H")) i.sendCommand(1)
        if(i.name.endsWith("F")) i.sendCommand(82)
    ]
end
Die Rule setzt alle Dimmer abhängig von der Endung auf den passenden Wert. Wenn man die Namen der Items etwas geschickter gestaltet, dann kann das auch abhängig von der aktuellen Helligkeit geschehen (wie im Original) Die Rule kann auch hundert Stripes ansteuern ;) und wird nicht eine Zeile länger, Voraussetzung ist nur, dass die Items in der entsprechenden Gruppe sind und die Endung jeweils passt.

Ansonsten kannst Du natürlich auch Deine Rule verwenden, aber besser so:

Code: Alles auswählen

rule "Nachtlicht copy"
when 
    Item Szene_EG_Nachtlicht received command ON  
then 
    logInfo("Nachtlicht.rules", "Nachtlicht gestartet")
    if  ((LEDstripe_EG_KuecheDH.state as Number) != 1)  {
        LEDstripe_EG_KuecheDH.sendCommand(1)
        LEDstripe_EG_KuecheDF.sendCommand(82)
    }
    if ((LEDstripe_EG_EsszimmerDH.state as Number) != 1)  {
        LEDstripe_EG_EsszimmerDH.sendCommand(1)
        LEDstripe_EG_EsszimmerDF.sendCommand(82)
    }
end 
Der Unterschied zwischen der Methode Item.sendCommand(Value) und der Action sendCommand(String,String) ergibt sich aus der Definition. Die Action erwartet zwei Strings als Argumente (openHAB nutzt bei Objekten die Methode .toString, um das übergebene Objekt in String umzuwandeln)
Die Methode ist Bestandteil des Items, was ihr einen Vorteil verschafft (das Item weiß genau, wie es mit unterschiedlichen Inputs umgehen muss.

Erst einmal bemerkt man den Unterschied nicht, wenn man aber Primitives einsetzt, hat openHAB ein Problem, denn Primitives haben keine Methode .toString, können also nicht umgewandelt werden. In der Folge schlägt die Action fehl.
Allgemein ist es besser, die Methode zu verwenden. Nur, wenn man den Namen des Items berechnet, hat die Action ihre Berechtigung, z.B. so:

Code: Alles auswählen

var String myItemName = "LEDstripe" + "_EG" + "Kueche"+"DF"
sendCommand(myItemName,"1")
Allein ist das natürlich witzlos, aber es gibt die Möglichkeit, den Namen eines Items zu ermitteln (siehe oben...) und gezielt nur bestimmte Teile zu extrahieren. Dann kann man daraus andere Itemnamen generieren, die davon abhängen (also im Code oben z.B. den letzten Buchstaben weglassen und durch einen anderen ersetzen). Allerdings kann man ähnliches auch über gezieltes Filtern von Gruppen erreichen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04

Re: Rule Beleuchtung

Beitrag von Backbe01 »

Hallo Udo,

bei Dir hört sich das immer so logisch an!! Für mich sind die rules immer noch ein Buch mit sieben Siegeln.

Was globale Konstanten sind ist mir bis jetzt auch noch nicht klar. Ich habe mir unterschiedliche Rules rausgesucht und diese im try and error Prinzip getestet. Diese ist eben gelaufen!;-)

Dein Vorschlag mit der Gruppe finde ich sehr elegant! Das werde ich heute Abend so umsetzen. Ich frage mich nur... Kann ich diese Zeilen

Code: Alles auswählen

 LEDstripe_EG.members.forEach[i|
        if(i.name.endsWith("H")) i.sendCommand(1)
        if(i.name.endsWith("F")) i.sendCommand(82)
    ]
so einfach übernehmen oder dient das nur zur Veranschaulichung.

Jedenfalls bedanke ich mich sehr für Deine Hilfe...
OH 4.1.0M2 auf nuc in Docker

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

Re: Rule Beleuchtung

Beitrag von udo1toni »

Nein, diese Zeilen sind genau auf Deine Items bezogen.

LEDstripe_EG ist dabei die Gruppe, in der alle Items der beteiligten Leuchten enthalten sind (zumindest, soweit sie gesteuert werden müssen)
.members ist die Methode, um alle unmittelbaren Member dieser Gruppe zu erhalten, und zwar als Liste.
.forEach[] ist die Methode, um für alle Items einer Liste ein Lambda auszuführen. Als Lambda bezeichnet man das zwischen [ und ]
i| jedes mal, wenn das Lambda für ein weiteres Element der Liste ausgeführt wird, wird der Variablen i das Item der Liste zugewiesen.
if() falls erfüllt, den anschließenden Befehl ausführen, ansonsten den anschließenden Befehl auslassen
i.name der Name des Items
.endsWith() prüfe, ob der String mit der angegebenen Zeichenkette endet (es wird Boolean zurück geliefert, also true oder false
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04

Re: Rule Beleuchtung

Beitrag von Backbe01 »

Hallo Udo, sorry für die späte Rückmeldung! War im Black Friday Fieber gefangen!😂

Leider konnte ich deine Eule noch nicht testen. Als ich diese gestern eingespielt habe ist irgendwas total schief gelaufen und nix ging mehr. Durch eine Dummheit von mir ist auch noch meine Sicherung hinüber. Jetzt setze ich alles nochmal neu auf und das wird mit meinen Fähigkeiten etwas dauern. Ich melde mich auf jeden Fall nochmals ob die Rule so läuft.

Jedenfalls schon Mal vielen Dank für die Unterstützung und deine Erläuterungen...
OH 4.1.0M2 auf nuc in Docker

Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04

Re: Rule Beleuchtung

Beitrag von Backbe01 »

Hier die Rückmeldung:

Rule funktioniert, wie erwartet, perfekt! Vielen Dank!

Eine Frage hierzu noch: Gibt es eine Möglichkeit mehrere Items in einem String zusammenzufassen? Somit wären meine Lichtszenen zentral auf einem Item.
OH 4.1.0M2 auf nuc in Docker

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

Re: Rule Beleuchtung

Beitrag von udo1toni »

Ich weiß jetzt nicht, wie Du das meinst. Du kannst Gruppen anlegen und Befehle an diese Gruppen senden. Dabei sollten die beteiligten Items alle vom gleichen Typ sein, damit es nicht zu Problemen kommt. Man kann (z.B. bei Bimmern und Lichtschaltern) auch verschiedene Typen in einer Gruppe zusammenfassen, dann muss man aber entwerder nur mit dem ON/OFF steuern, oder man nutzt die Gruppe von einer Rule aus um gezielt zu steuern. Meist ist es aber einfacher, pro Itemtyp eine Gruppe anzulegen und diese Gruppen gezielt zu steuern.
Man könnnte auch ein Szenenitem definieren, welches mehr als zwei Zustände kennt und darüber eine Rule steuern, die dann je nach Szene unterschiedliche Lichtstimmungen aufruft.#Aber ich fürchte, Du willst auf etwas anders hinaus ;)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04

Re: Rule Beleuchtung

Beitrag von Backbe01 »

:D Nicht Ganz!

Ich würde mir das eher vorstellen wie z.B. bei der Harmony bei diesem Item:

Code: Alles auswählen

String HarmonyGreatRoomActivity              "Current Activity [%s]"  (gMain) { channel="harmonyhub:hub:GreatRoom:currentActivity" }
Hier habe ich dann in der Sitemap und im Habpanel eine Auswahlliste der unterschiedlichen Start Aktionen.

So würde ich mir das bei meinen Lichtszenen auch wünschen. Deshalb die Frage, ob es möglich ist, mehrere Items (gleicher Typ) in einem String Item zu bündeln.
OH 4.1.0M2 auf nuc in Docker

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

Re: Rule Beleuchtung

Beitrag von udo1toni »

Ich weiß immer noch nicht, was Du Dir vorstellst. In einer Sitemap kannst Du ein Item steuern. Einfaches Beispiel:
Item

Code: Alles auswählen

Number nSzene "Szene [%d]"

Switch Lampe1
Dimmer Lampe2

Code: Alles auswählen

Switch item=nSzene mappings=[1="Szene 1",2="Szene 2",3="Szene 3"]
rule:

Code: Alles auswählen

rule "Szenen Anwahl"
when
    Item nSzene received command
then
    if(!(receivedCommand instanceof Number)) return;
    switch receivedCommand {
        case 1: {
            Lampe1.sendCommand(OFF)
            Lampe3.sendCommand(50)
        }
        case 2: {
            Lampe1.sendCommand(ON)
            Lampe3.sendCommand(100)
        }
        case 3: {
            Lampe1.sendCommand(OFF)
            Lampe3.sendCommand(0)
        }
    }
end
Natürlich lassen isch beliebig viele Items innerhalb eines Case einbauen. Weiterhin kann man beliebig viele verschiedene Zahlen (und damit beliebig viele cases) verwenden. Allerdings ist es nicht praktikabel, mehr als 4 Knöpfe nebeneinander in der Basic UI rendern zu lassen (aber man kann das selbe Item mit unterschiedlichen Mappings mehrfach verwenden oder alternativ das Selection Widget verwenden)
Man kann auch ein String Item als Auswahl verwenden, aber es geht kein Weg an der Rule vorbei, und man kann nicht über den Inhalt eines Strings entscheiden, welche Items gesteuert werden sollen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Backbe01
Beiträge: 123
Registriert: 19. Jul 2019 21:04

Re: Rule Beleuchtung

Beitrag von Backbe01 »

Danke Udo für deine Mühen! Vielleicht gehe ich die Sache auch falsch an und sehe den Wald vor lauter Bäumen nicht! Ich werde das demnächst testen, habe aber seit einem Update erstmal ein anderes Problem mit den Stripes. Dafür eröffne ich aber ein neues Thema... Ich werden aber nochmal bereichten, wenn (hoffentlich) alles wieder richtig läuft.
OH 4.1.0M2 auf nuc in Docker

Antworten