Innerhalb des if() muss es Luefterstufe.state != 0 heißen. ohne das .state ist das Item selbst gemeint, welches natürlich niemals 0 ist.
Der Code wird so funktionieren, aber da ich es nicht sein lassen kann... Es ist wichtig, zu verstehen, dass .state einen Status zurück gibt, keine Zahl. Auch wenn der Status eine Zahl ist, wird openHAB diese Zahl zunächst nur als Status betrachten. openHAB ist aber schlau genug, bei Bedarf ein TypeCasting durchzuführen. Wenn man das selbst beim Programmieren macht, fallen kleinere Fehler schneller auf. Die Rule sollte also am besten so aussehen:
Code: Alles auswählen
rule "Aussenluft manuell1"
when
Item Aussenluft changed or
Item AussenGrenzMax_Set changed or
Item AussenGrenzMin_Set changed
then
if(Dummy4.state != ON) return; // wenn Schalter aus(nicht an) , keine Aktionen
if(!(Aussenluft.state instanceof Number)) {
logWarn("Aussenluft manuell","Aussenluft.state not a Number: {}",Aussenluft.state) // numerisch ?
return;
}
if ((Aussenluft.state as Number) >= (AussenGrenzMax_Set.state as Number) && (Luefterstufe.state as Number) != 0) {
Luefterstufe.sendCommand(0)
logInfo("Aussenluft manuell","Luefterstufe ist jetzt: {} Aussenluft beträgt {}",Luefterstufe.state,Aussenluft.state )
}
else if ((Aussenluft.state as Number) <= (AussenGrenzMin_Set.state as Number) && (Luefterstufe.state as Number) != 2) {
Luefterstufe.sendCommand(2)
logInfo("Aussenluft manuell","Luefterstufe ist jetzt: {} Aussenluft beträgt {}",Luefterstufe.state,Aussenluft.state)
}
end
Allerdings geht es gleich weiter mit dem Rumgekrittel. Wie verhinderst Du, dass jemand Min über Max definiert? Wie verhinderst Du, dass jemand Min = Max definiert?
Es wäre meiner Meinung besser, einen Grenzwert und die Hystere einstellbar zu machen. für die Hysterese kann man dann in der Sitemap beim Setpoint Widget eine untere Grenze von +1 und eine obere Grenze von (z.B.) +5 setzen. Genauso lässt sich die Grenztemperatur dann auch auf sinnvolle Werte beschränken.
Selbstverständlich ist es leicht möglich, sowohl Minimum als auch Maximum im Klartext anzuzeigen, auch wenn nur eine der beiden Temperaturen eingestellt wird und die andere über die Hysterese bestimmt wird.
Falls man tatsächlich Minimum und Maximum einstellen möchte, müsste man in der Rule Vorkehrungen treffen, z.B. dass das Maximum automatisch auf Minimum + 1 gesetzt wird, falls nach einer Änderung des Minimums das Minimum über oder gleich dem Maximum ist, genauso natürlich für den umgekehrten Fall.
Es bietet sich wegen der mehrfachen Nutzung der Werte an, diese in lokalen Konstanten zu speichern; dadurch bekommt die Rule etwas mehr Struktur:
Code: Alles auswählen
rule "Aussenluft manuell1"
when
Item Aussenluft changed or
Item AussenGrenzMax_Set changed or
Item AussenGrenzHysterese_Set changed
then
if(Dummy4.state != ON) return; // wenn Schalter aus(nicht an) , keine Aktionen
if(!(Aussenluft.state instanceof Number)) {
logWarn("aussenluftManuell","Aussenluft.state not a Number: {}",Aussenluft.state) // numerisch ?
return;
}
val Number nTempOut = Aussenluft.state as Number
if(!(AussenGrenzMax_Set.state instanceof Number)) {
logWarn("aussenluftManuell","AussenGrenzMax_Set.state not a Number: {}",AussenGrenzMax_Set.state) // numerisch ?
return;
}
val Number nTempMax = AussenGrenzMax_Set.state as Number
if(!(AussenGrenzHysterese_Set.state instanceof Number)) {
logWarn("aussenluftManuell","AussenGrenzHysterese_Set.state not a Number: {}",AussenGrenzHysterese_Set.state) // numerisch ?
return;
}
val Number nTempMin = nTempMax - (AussenGrenzHysterese_Set.state as Number)
if(!(Luefterstufe.state instanceof Number)) {
logWarn("aussenluftManuell","Luefterstufe.state not a Number: {}",Luefterstufe.state) // numerisch ?
return;
}
val Number nStufe = Luefterstufe.state as Number
var Number nStufeSoll = nStufe
if (nTempOut >= nTempMax && nStufe != 0) nStufeSoll = 0
if (nTempOut <= nTempMin && nStufe != 2) nStufeStoll = 2
if(nStufe != nStufeSoll) {
Luefterstufe.sendCommand(nStufeSoll)
logInfo("aussenluftManuell","Luefterstufe geändert von {} auf {}. Aussenluft beträgt {}°C",nStufe,nStufeSoll,nTempOut)
}
end
Wenn Maximum und Hysterese mit restoreOnStartup persistiert werden, kann die Prüfung auf instanceof Number natürlich entfallen. Bei der Außentemperatur sollte man immer prüfen, weil ein Sensor ja auch mal ausfallen kann. Bei der Luefterstufe habe ic hdas nur der Vollständigkeit halber getan.
Bei den Logzeilen habe ich den Kontext etwas geändert. Hintergrund ist: man kann das Loglevel für jeden Kontext getrennt einstellen. Wenn man im Kontext Leerzeichen verwendet, muss man dabei daran denken, den Kontext in Anführungszeichen zu setzen. Verzichtet man auf Leerzeichen, braucht man auch keine Anführungszeichen
