Seite 3 von 3

Re: mal wieder Fachwissen gefragt

Verfasst: 1. Nov 2021 23:33
von udo1toni
:) heißt, Du willst zwei Meldungen haben, im Zweifel sollte die 1. Meldung mit einer automatischen Steuerung der Solltemperaturen einhergehen. also ungefähr so:

Code: Alles auswählen

rule "Pufferspeicher Nachricht"
when 
    Item Pufferspeichersensor_Temperatur changed 
then
    logDebug("warmwasser", "Rule getriggert! Wert : {} ", Pufferspeichersensor_Temperatur.state )
    if(!(previousState instanceof Number))
       logWarn("warmwasser", "kein gültiger Vergleichswert! Setze Wert unter 55.")
    val nPrev = if(previousState instanceof Number) (previousState as Number).floatValue else 50
    if(!(newState instanceof Number)) {
       logWarn("warmwasser", "Sensor Item liefert keinen gültigen Zahlenwert. Abbruch!")
       return;
    }
    val nNew = (newState as Number).floatValue
    if(nNew > 55 && nPrev <= 55) {
       logInfo("warmwasser", "Pufferspeicher hat Temperatur 55 °C überschritten! ")
       Meldung.postUpdate("Der Pufferspeicher hat die Temperatur 55 °C überschritten!")
       // Hier Code zum Setzen der Solltemperatur einbauen:
       // Heizung1_Soll.sendCommand(21)
       // Heizung2_Soll.sendCommand(21)
    }
    if(nNew > 85 && nPrev <= 85) {
       logWarn("warmwasser", "Pufferspeicher hat Temperatur 85 °C überschritten!")
       Meldung.postUpdate("Der Pufferspeicher hat die Temperatur 85 °C überschritten!")
    }
end
Theoretisch könnte es dazu kommen, dass beide Meldungen ausgegeben werden, das ist aber nur der Fall, wenn die Temperatur zwischen zwei Messungen von unter 55 auf über 85 steigt. Also z.B., wenn der Kachelofen explodiert... ;) Schschschuldigung...
Zum Testen kannst Du entweder das Logging aufdrehen, oder natürlich das logDebug zu Beginn durch ein logInfo ersetzen. Aber im Normalbetrieb möchtest Du von solchen Rules nur behelligt werden, wenn es auch einen konkreten Anlass gibt (ein Sensor ist ausgefallen o.Ä.)

Re: mal wieder Fachwissen gefragt

Verfasst: 2. Nov 2021 20:58
von Snatsch
vielen lieben Dank udo1toni für deine Hilfe :) könntest du mir die Zeile nochmal erklären :?:

Code: Alles auswählen

val nPrev = if(previousState instanceof Number) (previousState as Number).floatValue else 50

Re: mal wieder Fachwissen gefragt

Verfasst: 2. Nov 2021 22:58
von udo1toni
Aber gerne.
Es wird eine Konstante (val) mit dem Namen nPrev definiert. Dieser Konstanten wird ein Wert zugewiesen, und zwar abhängig von der Bedingung (if()), dass die implizite Variable previousState eine Zahl enthält (instanceof Number).
Falls die Bedingung erfüllt ist, den Wert aus previousState, als Number verwendet und gewandelt nach Float.
Falls die Bedingung nicht erfüllt wird, wird der Wert 50 verwendet.

previousState ist eine implizite Variable, das heißt, das System stellt sie zur Verfügung, und zwar, weil die Rule mit dem Trigger changed auslöst. Die Variable enthält den Status des triggernden Items vor dem Change.

Falls openHAB neu gestartet ist, enthält previousState den Wert NULL. Falls der letzte Wert z.B. durch einen Übertragungsfehler keine gültige Zahl enthielt, nimmt die Rule einen Wert unterhalb des unteren Alarms an. Somit ist sichergestellt, dass beim Überschreiten der Grenzwerte im Zweifel eine Meldung geschickt wird, falls der letzte Wert ungültig war.

Das Konstrukt (if(a) b else c) heißt ternärer Operator.

Re: mal wieder Fachwissen gefragt

Verfasst: 3. Nov 2021 20:46
von Snatsch
:) super echt vielen Dank für deine Mühe.