Methoden in OpenHAB? Mit Lambda funktionierts

Methoden in OpenHAB? Mit Lambda funktionierts

Verwöhnt

Nun bin ich ja von C# ziemlich verwöhnt. Aber mit einem System, bei dem es keine Methoden gibt, habe ich schon länger nicht mehr gearbeitet. Batches lasse ich dabei mal außen vor. In OpenHAB ist aber genau DAS mein Problem. Da ich Code ungerne an mehreren Stellen vorliegen habe, nutze ich gerne Methoden. Wenn Du das jetzt nicht nachvollziehen kannst, dann gehe bitte nochmal auf Los. 😉

Kompliziert oder Umfangreich?

In meinem Falle ist es so, dass ich meine Heizungsthermostate abhängig von verschiedenen Parametern steuere. So wird die Soll Temperatur für die aktuelle Tageszeit berechnet. Dazu greife ich auf Zeiten für die Woche und das Wochenende zu. Im Anschluss wird die Temperatur im Thermostat gesetzt. Aber natürlich nur, wenn die Fenster geschlossen sind. Und Anwesend will ich auch sein. Und vielleicht habe ich die Heizung ja sogar als abgeschaltet gekennzeichnet, dann brauche ich die Thermostate auch nicht setzen. Vor dem tatsächlichen Setzen prüfe ich auch noch, ob das Thermostat die Temperatur vielleicht schon hat. Dann brauche ich das ebenfalls nicht senden.

Kein Copy & Paste

Würde ich diese Prüfungen via Copy & Paste in alle Regeln verteilen, wäre es sehr unübersichtlich und schlecht wartbar. Jede Änderung müsste ich wieder über alle Regeln verteilen. Weitere Probleme und auch die Folgen mag sich jeder selbst ausmalen. Diese Vorgehensweise kam also für mich nicht in Frage.
Es gibt für OpenHAB noch eine alternative Rule-Engine die auch Javascript, Python und Groovy unterstützen soll. Aber die läuft bei meinem OH2 leider nicht.

Die Lösung

Es hat schon eine ganze Zeit gedauert. Irgendwann bin ich in der OpenHAB Community auf eine Lösung gestoßen. Es geht um Lambda Statements. Diese lassen sich als Methoden mehr oder weniger gut zweckentfremden. Einschränkungen sind allerdings, dass man alles ausserhalb des globalen Namensraumes übergeben muss. Und dabei hat man nur maximal 6 Parameter. Benötigt man mehr, muss man noch mehr pfuschen und die Parameter in einer Hashmap unterbringen. Soweit ging es aber zum Glück bei mir nicht.

Ein Beispiel

Für meine Berechnung der Tagestemperatur sieht die „Methode“ nun folgendermaßen aus:

val Functions.Function5<Float, Number, Number, Number, Number, void> getTemperatureByHour = [Float roomSetTemperature, Number ComfortTemperature_Week_Begin, Number ComfortTemperature_Week_End, Number ComfortTemperature_Weekend_Begin, Number ComfortTemperature_Weekend_End
|
    val float temperaturAbsenkung = 17f
    if(Anwesend.state == OFF)
        return temperaturAbsenkung 
    var day = now.getDayOfWeek
    var hour = now.getHourOfDay
    var beginTime = ComfortTemperature_Week_Begin
    if(day == 6 || day == 7)
        beginTime = ComfortTemperature_Weekend_Begin
    var endTime = ComfortTemperature_Week_End
    if(day == 5 || day == 6)
        endTime = ComfortTemperature_Weekend_End
    if(hour >= beginTime && hour < endTime)
    { return roomSetTemperature } 
    return temperaturAbsenkung 
]

Die Variable temperaturAbsenkung hatte ich eigentlich zusammen mit anderen Variablen im Kopf der Datei definiert. Allerdings hat die „Methode“ keinen Zugriff auf diesen

Bereich. Ich werden diese Werte also noch als virtuelle Items anlegen, denn diese sind auch dort verfügbar. Positiver Nebeneffekt ist dann auch, dass ich die Werte in der Sitemap eintragen und damit aus der App heraus verändern kann.

Fazit

Auch wenn ich mit der Lösung nicht ganz zufrieden bin, so bin ich doch froh sie gefunden zu haben. Die Alternative hätte mir arge Bauchschmerzen bereitet und der Spaß an OpenHAB wäre sicherlich schnell vorbei gegangen. So ist es zwar auch keine wirklich schöne Lösung, aber bis man eine ordentliche Sprache für die Regeln verwenden kann, werde ich sicherlich damit klar kommen. Noch eine Frage an Euch. Sind die Zahlen 6,7 und 5 für Euch „Magic Numbers“? Oder wisst ihr auf den ersten Blick etwas damit anzufangen? Ich überlege sie durch Konstanten mit sprechenden Namen zu ersetzen. Aber da ich es in der Methode machen müsste, würde es diese ziemlich aufblähen.

Michael Grünwaldt

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert