Seite 1 von 1

Lambda - Grundsätzliches

Verfasst: 4. Sep 2019 08:43
von Stefan Otten
Hallo zusammen,

ich blicke bei der Lambda Funktion leider nicht durch.
Was ich verstanden habe ist, das ich eine "Funktion" (Lambda) schreibe, z.B. Lampe stufenweise dimmen, und diese dann in einer Rule aufrufe.
Hier im Forum werden einige Lambda Beispiele angeführt, ich kann aber die dahinterstehenden Funktionen nicht finden, lediglich die Aufrufe.

Ich habe hier ein entsprechendes Beispiel gefunden: https://github.com/openhab/openhab1-add ... -Functions.
Ich komme aber überhaupt nicht klar damit.

Vielleicht kann mir jemand das Beispiel erklären, bzw. bei der Umsetzung meines "Dimmers" helfen.

Ich möchte für eine Terrarium Steuerung die Heizlampe abhängig von der vorhandenen Innentemperatur langsam Dimmen.
Deshalb würde ich gerne eine "Funktion" Dimmen anlegen und diese dann in einer Rule aufrufen.

Lieben Dank
Stefan

Re: Lambda - Grundsätzliches

Verfasst: 4. Sep 2019 12:08
von udo1toni
Orientiere Dich bitte möglichst nicht an dem openHAB1-Wiki, gerade was den Umgang mit Funktionen betrifft, hat sich etliches geändert.
Ich selbst scheue Funktionen unter openHAB, meist kommt man sehr gut ohne aus. Beispiel:

Code: Alles auswählen

//globale Variablen immer zu Beginn der Datei definieren!

var Timer tDimmer = null
var Boolean bHeizen

val Number nTempSoll = 25            // Solltemperatrur
val Number nTempHysterese = 0.2 // erlaubte +/- Abweichung


rule "Terrarium Dimmer"
when
    Item TerrariumTemp changed
then
    if(!(TerrariumTemp.state instanceof Number)) {
        logWarn("terrarium","Temperaturfühler liefert keine gültige Zahl! ({})",TerrariumTemp.state)
        return;
    }
    if((TerrariumTemp.state as Number) < nTempSoll - nTempHysterese) {
        logInfo("terrarium","Temperatur zu niedrig: {}°C",TerrariumTemp.state)
        bHeizen = true
    }
    if((TerrariumTemp.state as Number) > nTempSoll + nTempHydsterese) {
        logInfo("terrarium","Temperatur zu hoch: {}°C",TerrariumTemp.state)
        bHeizen = false
    }
    tDimmer?.cancel              // bestehenden Timer löschen
    tDimmer = createTimer(now.plusMillis(500),[ |
        var Number nDimm = 1
        if(! bHeizen)
            nDimm = -1
        TerrariumHeat.sendCommand((TerrariumHeat.state as Number) + nDimm)
        if((bHeizen && (TerrariumHeat.state as Number) < 100) || (!bHeizen && (TerrariumHeat.state as Number) > 0))
            tDimmer.reschedule(now.plusMillis(500))
    ])
end
Die Rule triggert, wenn sich die Temperatur des Terrariums geändert hat. Ist die Temperatur zu niedrig, soll geheizt werden, ist die Temperatur zu hoch, soll nicht geheizt werden. Anschließend wird ein Timer angelegt, der den Dimmer alle halbe Sekunde auf- bzw. abdimmt, je nach Bedarf.

Man könnte die Rule noch verbessern, indem man nicht nur heizen oder nicht heizen vorgibt, sondern noch eine Art Delta bestimmt. Damit könnte man dann den Dimmer nicht bis zwischen Maximum und Minimum regeln, sondern die gewünschte Zielhelligkeit vorgeben, so dass die Leuchte sich dann der Idealtemperatur annähert. Das ist allerdings etwas komplizierter ;)
Grob gesagt würde man oberen und unteren Dimmgrenzwert (die letzte Bedingung im Lambda des Timers) dynamisch anpassen, ist die Temperatur viel zu niedrig, wird man den unteren Grenzwert nach oben schieben und den oberen auf 100 setzen, ist sie viel zu hoch wird man den unteren Grenzwert auf 0 setzen, den oberen nach unten korrigieren. Weicht die Temperatur nur wenig ab, wird man das Delta verringern und die Grenzwerte jeweils in Richtung Mitte verschieben.

Re: Lambda - Grundsätzliches

Verfasst: 8. Sep 2019 22:21
von Stefan Otten
Hallo Udo,

danke für die Ausführliche Beschreibung.
Ich schaue mir das mal in Ruhe an.
Hast Du evtl. einen Link zu der Lambda Funktion in Openhab 2.xxx,
ich konnte nichts anderes finden....

Grüße

Re: Lambda - Grundsätzliches

Verfasst: 8. Sep 2019 23:50
von udo1toni
Nein, da gibt es leider nur wenig Dkou. Im englischen Forum gibt es ein paar gute Beträge dazu, da gibt es auch (englischsprachige) Links zur Dokumentation