Java Openhab 3.0 - Array Regel

meph!sto

Rear Admiral
Registriert
Nov. 2003
Beiträge
6.140
Hi,
bitte habt nachsehen mit mir, denn ich bin was Programmieren angeht, echt eine Niete.
Ich habe zu Hause Openhab 3.0 im Einsatz und um das ganze "Smart" zu machen, bedarf es natürlich einiger Regeln.
Viele einfache Regeln bekomme ich hin, aber wenn es komplizierter wird, steig' ich aus.
Ich glaube dass die Openhab Regeln auf Java basieren, aber ich lasse mich natürlich eines besseren belehren.

Worum geht's genau ?
Ich habe im Wohnzimmer einige HUE Lampen und möchte diese nun, basierend darauf was im TV läuft, farblich ändern.
Hinter dem TV sind HUE Play Bars installiert und auf der Fußleiste sind HUE Lightstrips montiert.
Nun möchte ich gerne dass die HUE Play Bars bei bestimmten Sendungen angehen (und die HUE Lighstrips aus), bei allen anderen/nicht gelisteten Sendungen, sollen die Lightstrips angehen und die Play Bars aus.

So als Beispiel
Java:
rule "LIGHTBARS"
when VUDUO4K_Title changed
then
    var String BBT = "120,100,100"
    if (VUDUO4K_Title.state.toString.contains("Big Bang"))
    {
        gHUE_LV_LIGHTSTRIP.sendCommand(OFF)
        gHUE_LV_LIGHTBAR.sendCommand(new HSBType(BBT))
    }
end

Natürlich wäre es nun sehr mühselig für jeden Fall eine Regel zu erstellen.
Was ich also gerne hätte wären 2 Arrays,
1. mit den zu suchenden Strings die im Sendungsnamen und/oder Sendungsbeschreibung vorkommen
2. die HSBType (Farbkombination) die dann entsprechend geschaltet wird

Wenn keine gelistete Sendung läuft, sollen die Lightstrips (gHUE_LV_LIGHTSTRIP) angehen und die Play Bars (gHUE_LV_LIGHTBAR) ausgehen.

Habt ihr Tipps wie ich das realisieren kann ?
Den Trigger kann ich einstellen (das bekomme ich hin), was mir fehlt ist dieser Teil
Java:
rule "LIGHTBARS"
when VUDUO4K_Title changed
then
..... diesen wichtigen Teil bekomme ich nicht hin
end
Meine Javakenntnisse sind minimal und gehen gegen 0. Alles was ich bisher geschafft habe, ist Google zu verdanken.

Danke

Edit: Arrays werden wohl nicht direkt unterstützt, aber ArrayList. Sagt mir aber nichts :(
 
Zuletzt bearbeitet:
Java selbst bietet keine Rule Engine (die von openHAB ist quasi ein Plug-In für diese Funktionalität).
Unter dem folgenden Links wird die Xtext basierte Rule Engine erläutert, was für diejenigen die hier weiterhelfen können/wollen hilfreich sein dürfte.

Rules | openHAB
 
Zuletzt bearbeitet:
Sowas lässt mir natürlich keine Ruhe und habe eine Lösung gefunden.
Meine Test scheinen die Funktion zu bestätigen, aber ich werde im Verlauf des Tages weitersehen.

Code:
rule "SHOW BASED LIGHTING"
when
        Item VUDUO4K_Title changed or
        Item VUDUO4K_Description changed
        //Time cron "0 49 6 ? * *"
then
        var counter = 0
        val arSHOWS = newArrayList("Bundesliga","NFL","Friends")
        val arHSB = newArrayList("120,100,100","80,100,100","40,80,100")
        arSHOWS.forEach[ str |
                if (VUDUO4K_Title.state.toString.contains(str) || VUDUO4K_Description.state.toString.contains(str))
                {
                        if (gHUE_LV_LIGHTSRIP.state != 0 && gHUE_LV_LIGHTBAR.state != 0)
                        {
                                gHUE_LV_LIGHTSTRIP.sendCommand(OFF)
                                gHUE_LV_LIGHTBAR.sendCommand(new HSBType(arHSB.get(counter)))
                                logInfo("tv_lighting.rules","Lighting changed due to " + str)
                        }
                        else
                        {
                                 gHUE_LV_LIGHTSTRIP.sendCommand(ON)
                                 gHUE_LV_LIGHTBAR.sendCommand(OFF)
                        }
                        counter = counter + 1
                }
        ]
end

Edit: ziemlich anstrengend als Laie.
Problem an meiner o.g. Version war/ist, dass bei einem Treffer die forEach-Schleife nicht verlassen wird und weitergesucht wird.
Was zur Folge hat dass die Lichter an und dann wieder ausgehen.
Meiner Recherche nach kann man eine forEach-Schleife auch nicht "breake;" oder "return;"-nen.
Daher meine Lösung: einen Zähler mitlaufen lassen, und nur wenn der Zähler == 1, werden die LIGHTBARs gezündet, sonst die Lightsrips.
Bisher funktioniert die Lösung.
 
Zuletzt bearbeitet:
Zurück
Oben