Rechenregel in Rule

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
kaloschke
Beiträge: 177
Registriert: 29. Jan 2019 07:20
Answers: 0

Rechenregel in Rule

Beitrag von kaloschke »

Hallo,

verstehe gerade die Welt, äh die Mathematik nicht mehr. :|
Ich überwache den Pegelstand einer Regentonne, indem die Sensordaten (Spannung) an ein Item (WaterLevelWestRaw) übertragen werden.
In meiner Itemsdatei steht:

Code: Alles auswählen

val int MaxLevelWest = 4.6  // angezeigte Spannung des Sensors bei voller Tonne

rule "Wasserstand Westen" 
    when Item WaterLevelWestRaw changed
then
    logInfo("WaterLevelWestRaw {}", WaterLevelWestRaw.state.toString)
    var Number = (WaterLevelWestRaw.state as Number) * 100 / MaxLevelWest
    logInfo("Number {}", Number.toString)
    WaterLevelWest.postUpdate(Number)
end 
Im Log findet sich folgendes:

Code: Alles auswählen

2024-04-25 09:57:13.388 [INFO ] [re.model.script.WaterLevelWestRaw {}] - 4.4800
2024-04-25 09:57:13.389 [INFO ] [.openhab.core.model.script.Number {}] - 112.00000000
Mit meinen - vielleicht bescheidenen - Mathekenntnissen bleibe ich da doch immer unter 100 Prozent.

Viele Grüße

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

Re: Rechenregel in Rule

Beitrag von udo1toni »

Das erste Problem ergibt sich aus der Definition von MaxLevelWest als int. int ist zum Einen ein Integer, die Zuweisung wird also 4 ergeben, zum Anderen ist int ein Primitive. Bitte nicht, openHAB mag keine Primitives, die Rule wird dadurch unnötig langsam.

Das zweite Problem ergibt sich aus der Verwendung des Schlüsselwortes Number als Variablennamen :), es ist etwas irritierend, dass die Rule überhaupt funktioniert...
Es ist keine gute Idee, auf den Wert per WaterLevelWestRaw.state zuzugreifen, denn niemand kann Dir garantieren, dass das Item zum Zeitpunkt der Ausführung der Rule noch den Wert hat, den es hatte, als die Rule getriggert wurde(!)
logInfo() benötigt zwingend zwei Strings als Argumente, von denen der erste String der Name des Loggers ist, der zweite String ist die eigentliche Meldung.

Außerdem frage ich mich, ob der Sensor bei Minimalstand tatsächlich 0.0 Volt liefert :)

Die korrekte Rule:

Code: Alles auswählen

val Number nMaxLevelWest = 4.6  // Maximalspannung des Sensors (volle Tonne)
val Number nMinLevelWest = 0.0  // Minimalspannung des Sensors (leere Tonne)

rule "Wasserstand Westen" 
 when
    Item WaterLevelWestRaw changed
 then
    logInfo("waterlevel", "WaterLevelWestRaw: {}", newState)
    val Number nLevel = ((newState as Number).floatValue - nMinLevelWest) * 100 / (nMaxLevelWest - nMinLevelWest)
    logInfo("waterlevel", "Level berechnet: {}", nLevel)
    WaterLevelWest.postUpdate(nLevel)
end
Du kannst nun auch die Minimalspannung definieren (im Code erst mal tatsächlich 0...)

Da Du den Rohwert gar nicht brauchst, wäre es allerdings sinnvoller, die Umrechnung im Link zum Item einzubetten. Kommt etwas darauf an, welche Version von openHAB Du verwendest. Unter openHAB4 z.B. so:

Du verlinkst WaterLevelWest direkt mit dem Channel, der WaterLevelWestRaw speist und gibst bei Profile Script Rule DSL an. Im Feld Thing to Item Transformation gibst Du die Zeile

Code: Alles auswählen

|((input as Number).floatValue - 0.0) * 100 / (4.6 - 0.0)
an (achte dabei auf die Pipe zu Beginn der Zeile, diese bedeutet, dass der nachfolgende Text Inline Code ist).
Die 0.0 musst Du natürlich jeweils durch die Minimalspannung ersetzen :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

kaloschke
Beiträge: 177
Registriert: 29. Jan 2019 07:20
Answers: 0

Re: Rechenregel in Rule

Beitrag von kaloschke »

Großartig!!! Es MUSSTE ja eine Lösung geben, das war klar :-)
Obwohl mir das mit "int" schon peinlich ist :-(
Der Sensor liefert in der Tat 0.0 zurück. Ich benutze einen Drucksensor, der normalerweise als 4-20mA Schleife gebaut wird. Bei AliExpress gibt es aber auch Varianten, die direkt eine Ausgangsspannung liefern. Zusammen mit einem Shelly Plus Uni, an dem man auch sehr bequem einen oder mehrere Temperatursensoren DS18B20 anschließen kann, ist die Verkabelung sehr einfach und über das Shelly-Binding bequem nutzbar.

Also mal wieder vielen vielen Dank an udi1toni :D

Antworten