Aber gerne
Code: Alles auswählen
val hum = if(FlurEGWandthermostatHomematicIP_Humidity.state instanceof Number) (FlurEGWandthermostatHomematicIP_Humidity.state as Number).intValue else 60
Ich arbeite hier mit dem ternären Operator. Grundform: if(a) b else c -> sollte a zutreffen, nimm b, ansonsten nimm c
Ich bringe das Ganze mal in eine etwas andere Form:
Code: Alles auswählen
var hum = 60
if(FlurEGWandthermostatHomematicIP_Humidity.state instanceof Number)
hum = (FlurEGWandthermostatHomematicIP_Humidity.state as Number).intValue
Diese drei Zeilen sind das Äquivalent für die eine Zeile, es wird aber etwas klarer, was hier passiert.
Die Variable hum bekommt einen Default Wert 60 (dies ist der Wert, welcher keine Aktion auslöst, weder ON noch OFF)
Falls das Item FlurEGWandthermostatHomematicIP_Humidity im Status eine Zahl stehen hat (das ist nicht zwingend der Fall!) wird anschließend diese Zahl in der Variablen hum gespeichert.
Warum nun der ternäre Operator? Eine Konstante (val statt var) kann nur einmalig einen Wert zugewiesen bekommen, über den ternären Operator kann ich aber die Möglichkeit abfangen, dass das Item keinen gültigen Wert liefert.
Code: Alles auswählen
var myStr = "" // erstellen der Variable myStr, Füllwort für {} ???
Die Variable ist in meinem Code an dieser Stelle mit einem leeren String gefüllt, das hat schon seine Richtigkeit! Ich verwende diese Variable hinten im logInfo().
Falls der gesendete Befehl ON ist, lautet der Satz "Humidity Alarm Flur EG wird gesetzt",
falls der Befehl OFF ist, lautet der Satz "Humidity Alarm Flur EG wird zurück gesetzt",
weil logInfo() die {} durch den Inhalt der Variable myStr substituiert.
Wenn OFF gesendet werden soll, wird myStr auf "zurück " gesetzt (auch das Leerzeichen hatte seinen Grund... in diesem Fall stört es aber nicht weiter, ob nun
zurück gesetzt oder zurückgesetzt spielt letztlich keine Rolle)
Um die letzten drei Zeilen Code zu verstehen, muss man die oberen Zeilen verstanden haben:
Die aktuelle Schaltstellung wird in die Variable soll geladen. Somit ist der aktuelle Schaltzustand nun der Sollzustand des Schalters.
Falls hum über 60 ist, wird der Sollzustand auf ON gesetzt.
Falls hum über 60 ist, wird der Sollzustand auf OFF gesetzt.
Nun kommt Dein Fragezeichen:
Falls der aktuelle Schaltzustand vom soll abweicht (wir erinnern uns... ursprünglich war soll mal exakt dieser Schaltzustand... Nur falls der Sollwert nach unten oder oben abweicht,
kann soll von
ist abweichen.)
Die geschweifte Klammer fasst alle Befehle zu einem Block zusammen, denn die if-Anweisung bezieht sich auf beide nachfolgenden Befehle.
Die Grenzwerte <> 40 müsstest Du weiter oben ändern. Allerdings bietet es sich fast an, das zusammenzufassen. Also hier noch mal die komplette Rule:
Code: Alles auswählen
rule "Humidity Alarm"
when
Item FlurEGWandthermostatHomematicIP_Humidity changed // Wenn sich die Feuchte ändert
then
var grenzwert = 60 // Grenzwert, der gehalten werden soll
var hum = grenzwert // setze Gernzwert als default
if(FlurEGWandthermostatHomematicIP_Humidity.state instanceof Number) // falls Messwert gültig
hum = (FlurEGWandthermostatHomematicIP_Humidity.state as Number).intValue // setze hum auf Messwert
var soll = HumidityAlarmSchalterFlurEG.state // setze aktuellen Schaltzustand als soll
var myStr = "" // inizialisiere den String als leeren String
if(hum > grenzwert) // falls die Humidity größer 60
soll = ON // setze Humidity Schalter Flur EG auf ON
if(hum < grenzwert) { // falls die Humidity kleiner 60
soll = OFF // setze Humidity Schalter Flur EG auf OFF
myStr = "zurück " // Füllwort ergänzen
}
if(HumidityAlarmSchalterFlurEG.state != soll) { // Falls Schaltstellung von soll abweicht
HumidityAlarmSchalterFlurEG.sendCommand(soll.toString) // Schalte um
logInfo("HumidityAlarm","Humidity Alarm Flur EG wird {}gesetzt",myStr) // und sende eine Zeile ins log
} else
logInfo("HumidityAlarm","Humidity Alarm unverändert auf {}",soll)
end
Ich habe hinten noch ein else mit einem zusätzlichen logInfo() ergänzt, so dass die Rule nun bei jedem Trigger etwas ausgibt. Das ist aber letztlich Geschmacksache, sowas müllt oftmals nur das Log zu...
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet