Die Regel ist ja auch k_cke... (sorry)
Punkt 1: Niemals einen Time cron Trigger einsetzen, wenn es keinen triftigen Grund dafür gibt! Nie! (Nein, es gibt hier keinen Grund dafür)
Punkt 2: Niemals Thread::sleep() verwenden (es sei denn siehe Punkt 1, triftiger Grund - ist hier nicht gegeben)
Punkt 3: Es ist nicht gut, Status einfach so als Zahl zu betrachten, obwohl gar nicht sichergestellt ist, dass es sich um eine Zahl handelt.
Punkt 4: Du kannst nicht einfach den Wert des Items überschreiben, das muss früher oder später zu Problemen führen. Entweder Du nutzt ein zweites Item, welches dann für die Nulleinspeisung genutzt wird, oder Du löst das Problem auf völlig andere Art, nämlich über eine JS-Transformation innerhalb des Channels (openHAB3 mal vorausgesetzt, bei openHAB2 abhängig vom Binding)
Frage am Rande: Welche Version von openHAB läuft? Davon hängt ab, wie sich die Rule Engine verhält. Tipp an dieser Stelle: Man kann im persönlichen Bereich im Profil eine Signatur setzen, das ist ein guter Platz für eine kurze Info über die verwendete Hard/Software, als Beispiel mag meine Signatur dienen
So, die "bessere" Version Deiner Rule:
Code: Alles auswählen
"WR Begrenzer"
when
Item VerbrauchIn changed // nicht! received update)
then
if(!(newState instanceof Number)) // keine Zahl?
return; // dann Abbruch!
var nIst = (newState as Number).floatValue // Zahl in Variable üernehmen
if(nIst > 550) nIst = 500 // mehr als 550? dann 500
if(nIst < 1) nIst = 10 // weniger als 1? dann 10
if(VerbrauchOut.state instanceof Number) // Hat Zielitem einen gültigen Wert?
if((VerbrauchOut.state as Number).floatValue == nIst) // falls ja, entspricht er dem neuen Wert?
return; // falls ja, Abbruch, nichts zu tun!
// Wert muss ins Item übernommen werden, also
VerbrauchOut.postUpdate(nIst)
val mqttActions = getActions("mqtt","mqtt:broker:neuer")
mqttActions.publishMQTT("Leistung", nIst.toString)
end
Die Rule triggert bei Wertänderung, nicht einmal pro Sekunde.
Die Rule prüft, ob der aktuelle Wert (aus der impliziten Variablen newState entnommen, das geht schneller als aus dem Item auszulesen) eine Zahl ist. Ist das nicht der Fall, bricht die Rule ab, da sie nur Unsinn anstellen könnte.
Ist der Wert eine gültige Zahl, so wird dieser Wert als Fließkommazahl in eine lokale Variable übernommen.
Anschließend werden Werte über 550 auf 500 und Werte unter 1 auf 10 korrigiert. (gewöhnlich wird man allerdings exakt den Grenzwert setzen und nicht akzeptieren, dass es überhaupt Werte außerhalb der Grenzwerte gibt)
Jetzt folgt noch die Prüfung, ob das Ausgangsitem (welches nicht identisch mit dem Wertgeber ist!) einen gültigen Wert als Status hat. Ist das der Fall, wird geprüft, ob es sich um den aktuellen Wert handelt. Ist das der Fall, muss die Rule nichts weiter tun und bricht ab. Die Prüfung muss hier in zwei Schritten erfolgen, da der Vergleich ansonsten eine Fehlermeldung nach sich ziehen kann - die wird durch die Typprüfung verhindert.
Ansonsten (Kein Wert, oder Wert unterscheidet sich) wird nun der neue Wert ins Ausgangsitem übernommen und es erfolgt eine Meldung.
Soll es ein Item sein (und die Voraussetzungen sind gegeben), so kannst Du im Link zwischen Channel und Item als Profile eine JS Transformation setzen. Der Code dafür ist dann JavaScript. Im JavaScript Script wird eine Funktion definiert, die einzelnen Schritte sind dann, aus dem übergebenen String eine Zahl zu machen, die Zahl auf die Grenzwerte hin zu untersuchen und abschließend den begrenzten Wert zurückzugeben. sieht etwa so aus:
Code: Alles auswählen
(function(inValue) {
if(isNaN(inValue))
return null;
var out = parseFloat(inValue);
if(out > 550)
out = 500;
if(out < 1)
out = 10;
return out;
})(input)
Der Code ist aber nicht getestet

Du musst den Code im Verzeichnis $OPENHAB_CONF/transform/ in einer einzelnen Datei abspeichern, z.B. borders.js (die Endung ist verpflichtend, der Name aber frei wählbar. Kurz, möglichst keine führenden Ziffern, keine Sonderzeichen usw... sollte klar sein)
Und dann setzt Du im Link als Profile JS und gibst als Parameter den Scriptnamen an, also z.B. borders.js
Sollte JS nicht zur Auswahl stehen, musst Du zuerst noch die JS Transformation installieren
Unter openHAB4 musst Du stattdessen nur JS Scripting einrichten, da ist die Transformation integraler Bestandteil.

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet