Immer wieder die gleichen Verständnisprobleme...

Du bist also in guter Gesellschaft.
Grundsätzlich arbeitet openHAB
ereignisorientiert. Das gilt im besonderen Maße für die Rules Engine. Eine Rule wird ausgeführt, sobald ein bestimmtes
Ereignis auftritt. es stehen verschiedene Ereignisse zur Verfügung.
Hier geht es um die Auswertung eines Messwerts, das bedeutet, es kommen zwei Trigger in Frage,
recieved update (triggert jedes Mal, wenn das Item ein Status
Update erhält) und
changed (triggert jedes Mal, wenn der Item Status sich
ändert).
Da die Rule bei Unterschreiten eines Grenzwertes etwas tun soll, ist
changed hier korrekt.
changed als Trigger hat zwei weitere Optionen, man kann die Änderung
von und/oder
auf einen
fixen Wert als Trigger-Bedingung definieren. Hier ist aber keine der beiden Optionen sinnvoll, denn man müsste ja für jeden möglichen Wert einen eigenen Trigger verwenden, da für beide Werte nur jeweils ein fixer Wert angegeben werden kann, kein Wertebereich.
Soweit der
Trigger der Rule.
Innerhalb der Rule wird eine Aktion ausgeführt. Ob diese Aktion ausgeführt wird, soll nun davon abhängig gemacht werden, ob ein bestimmter
Zustand herrscht. Zustand und Ereignis sind zwei komplett unterschiedliche Dinge, das ist der Knackpunkt bei dieser Betrachtung.
Die Rule hat zwei Abschnitte, nämlich den when-Teil und den then-Teil. Der when-Teil enthält eine Liste aller Trigger, die zur Ausführung der Rule führen sollen, der then-Teil enthält den Code, der ausgeführt werden soll. Damit ist auch erklärbar, warum es im when-Teil der Rule kein Schlüsselwort
and gibt. Jeder angegebene Trigger führt dazu, dass die Rule gestartet wird. Man kann kein Ereignis definieren, welches nur dann auftritt, wenn ein bestimmter Zustand herrscht, noch weniger sinnvoll ist es, darauf zu bestehen, dass zwei Ereignisse zeitgleich auftreten müssen (das wären die einzig möglichen Interpretationen eines
and im Trigger-Bereich)
Da wir die Aktion nur unter bestimmten Bedingungen ausführen wollen, muss dies im Code der Rule passieren. Deshalb muss Deine Rule wie folgt aussehen:
Code: Alles auswählen
rule "Zirkulation aus"
when
Item Zirkulation changed
then
if((Zirkulation.state as Number).floatValue<= 32)
sendCommand(Zirkulationspumpe , OFF)
end
Besser wäre es allerdings, die Zirkulationspumpe nur einmalig auszuschalten. Außerdem solltest Du Dir direkt angewöhnen, wann immer möglich die Methode der Action vorzuziehen:
Code: Alles auswählen
rule "Zirkulation aus"
when
Item Zirkulation changed
then
if((Zirkulation.state as Number).floatValue<= 32 && Zirkulationspumpe.state != OFF)
Zirkulationspumpe.sendCommand(OFF)
end
Der Befehl wird also nur gesendet, wenn die Temperatur unter 32 liegt (oder gleich ist...) und gleichzeitig die Zirkulationspumpe nicht ausgeschaltet ist.