Ich habe mir erlaubt, Dein Posting oben anzupassen
Zunächst einmal hast Du in Deiner Rule Syntax Fehler. Es ist natürlich möglich, dass es sich um einen Copy&Paste-Fehler handelt, aber das ist unwahrscheinlich. Die letzten beiden
if() haben ein i zu wenig.

Entsprechend wirst Du mit ziemlicher Sicherheit auch im Log eine Fehlermeldung der Art "
Rule ... has errors, therefor ignoring it" zu sehen bekommen.
Allgemein kann ich nur die Verwendung von VS Code empfehlen, dort gibt es das openHAB Plugin. Man muss das Plugin nur aus dem Marketplace installieren und anschließend die notwendigen Daten eintragen. Das ist der Hostname des openHAB Systems (bzw. die IP), der Port für den Webzugriff (falls vom Standard 8080 abweichend), den Port für LSP (falls vom Standard 5007 abweichend) sowie die Zugangsdaten - unter openHAB3 aufwärts erzeugt man dazu in der UI ein Token und fügt dieses als authToken ein (kein Username, kein Passwort).
Anschließend schickt das Plugin den Code, den Du eingibst live an Dein openHAB System und der openHAB Server prüft diesen Code auf Korrektheit.
Das heißt, Du siehst schon bei der Eingabe der Rule, ob Du irgendwo einen Fehler gemacht hast.
Nun inhaltlich:
Eigentlich ist die Rule in Ordnung, aber zum Einen hast Du versäumt, beim Item
SolarEdge_Live_Export auch auf einen gültigen Wert zu prüfen.
Zum Zweiten nutzt Du
Freigabe.sendCommand(). Handelt es sich tatsächlich um ein Signal, welches externe Hardware steuert? Ansonsten wäre
.postUpdate() die bessere Wahl.
Und zum Dritten ist Dein if-Wald unnötig kompliziert. Punkt 1: Eine einzelne Anweisung muss nicht geklammert werden. Punkt 2: Wenn Du statt ausschließlich
if() Anweisungen auch
else if() verwendest, kannst Du Dir die beidseitige Prüfung ersparen. Da der DSL die Formatierung des Codes wumpe ist, so:
Code: Alles auswählen
rule "Ueberschussladen"
when
Item SolarEdge_Battery_Level changed
then
var SoC = 0
if(SolarEdge_Battery_Level.state instanceof Number) // Batterielevel gültig?
SoC = (SolarEdge_Battery_Level.state as Number).intValue // dann in Variable übernehmen
var StatusFreigabe = Freigabe.state // Freigabe-Item holen
if(SoC < 90) // falls SolarEdge unter 90 %
StatusFreigabe = OFF // Freigabe aus
if(SoC == 100) // falls SolaerEdge voll
StatusFreigabe = ON // Freigabe an
if(Freigabe.state != StatusFreigabe) // Falls Freigabestatus geändert
Freigabe.postUpdate(StatusFreigabe.toString) // in Item übernehmen
var Export = 0
if(SolarEdge_Live_Export.state instanceof Number) // exportierte Strommenge gültig?
(SolarEdge_Live_Export.state as Number).floatValue // dann in Variable übernehmen
var LoadPower = 0 // 0; 0; 0 = 0.00 kW
if(StatusFreigabe != OFF){ // Falls Laden erlaubt
if(Export >= 11.15) LoadPower = 11.10 else // 16;16;16 = 11.10 kW
if(Export >= 10.85) LoadPower = 10.80 else // 15;15;15 = 10.80 kW
if(Export >= 10.15) LoadPower = 10.10 else // 14;14;14 = 10.10 kW
if(Export >= 9.41) LoadPower = 9.36 else // 13;13;13 = 9.36 kW
if(Export >= 8.69) LoadPower = 8.64 else // 12;12;12 = 8.64 kW
if(Export >= 7.97) LoadPower = 7.92 else // 11;11;11 = 7.92 kW
if(Export >= 7.25) LoadPower = 7.20 else // 10;10;10 = 7.20 kW
if(Export >= 6.53) LoadPower = 6.48 else // 9; 9; 9 = 6.48 kW
if(Export >= 5.81) LoadPower = 5.76 else // 8; 8; 8 = 5.76 kW
if(Export >= 5.09) LoadPower = 5.04 else // 7; 7; 7 = 5.04 kW
if(Export >= 4.37) LoadPower = 4.32 else // 6; 6; 6 = 4.32 kW
if(Export >= 3.77) LoadPower = 3.72 else // 16; 0; 0 = 3.72 kW
if(Export >= 3.65) LoadPower = 3.60 else // 15; 0; 0 = 3.60 kW
if(Export >= 3.41) LoadPower = 3.36 else // 14; 0; 0 = 3.36 kW
if(Export >= 3.17) LoadPower = 3.12 else // 13; 0; 0 = 3.12 kW
if(Export >= 2.93) LoadPower = 2.88 else // 12; 0; 0 = 2.88 kW
if(Export >= 2.69) LoadPower = 2.64 else // 11; 0; 0 = 2.64 kW
if(Export >= 2.45) LoadPower = 2.40 else // 10; 0; 0 = 2.40 kW
if(Export >= 2.21) LoadPower = 2.16 else // 9; 0; 0 = 2.16 kW
if(Export >= 1.97) LoadPower = 1.92 else // 8; 0; 0 = 1.92 kW
if(Export >= 1.73) LoadPower = 1.68 else // 7; 0; 0 = 1.68 kW
if(Export >= 1.49) LoadPower = 1.44 // 6; 0; 0 = 1.44 kW
}
Ladeleistung.postUpdate(LoadPower) // setze erlaube Ladeleistung
end
Ich habe hier die Reihenfolge umgedreht und prüfe auf >=, genauso hätte ich die Reihenfolge auch lassen können und auf < prüfen können. Der Punkt ist, ich brauche nur die eine Grenze zu betrachten, Sobald ich meinen Grenzwert erreicht habe, werden die restlichen Prüfungen übersprungen.
Das else habe ich hinten dran geschrieben, damit alle Zeilen exakt untereinander stehen, das Auge codiert mit.
Kurze Zwischenfrage:
LadeLeistung ist ausschließlich eine Anzeige in openHAB? Falls das nicht der Fall ist und Du mit diesem Item
direkt die Wallbox steuern willst, musst Du in der letzten Zeile
Ladeleistung.sendCommand(LoadPower) schreiben, denn Du sendest einen Befehl an die Wallbox.
Und jetzt komme ich und eröffne Dir, dass es noch eleganter geht.
Dazu installierst Du zunächst die SCALE Transformation und legst anschließend eine Datei im Dateisystem an, und zwar im Ordner
$OPENHAB_CONF/transform/. Nenne die Datei
charge.scale und füge diesen Text ein:
Code: Alles auswählen
[0..1.49[=0
[1.49..1.73[=1.44
[1.73..1.97[=1.68
[1.97..2.21[=1.92
[2.21..2.45[=2.16
[2.45..2.69[=2.40
[2.69..2.93[=2.64
[2.93..3.17[=2.88
[3.17..3.41[=3.12
[3.41..3.65[=3.36
[3.65..3.77[=3.60
[3.77..4.37[=3.72
[4.37..5.09[=4.32
[5.09..5.81[=5.04
[5.81..6.53[=5.76
[6.53..7.25[=6.48
[7.25..7.97[=7.20
[7.97..8.69[=7.92
[8.69..9.41[=8.64
[9.41..10.15[=9.36
[10.15..10.85[=10.1
[10.85..11.15[=10.8
[11.15..]=11.1
Es handelt sich bei SCALE um eine Wertebereichszuweisung. [ bzw. ] nach innen bedeutet: der Wert gehört dazu. [ bzw. ] nach außen bedeutet, der Wert gehört nicht dazu. also
[0..1]=wenig -> Von 0 bis 1 (incl. beider Werte) wird das Wort "wenig" zurückgeliefert.
]1..2[=ned viel -> Von 1 bis 2 (ohne diese beiden Werte) werden die Worte "ned viel" zurück geliefert.
fehlt ein Wert ganz (die letzte Zuweisung) so bedeutet dies "unendlich", also
]5..]=zu viel -> bei allem über 5 werden die Worte "zu viel" zurück geliefert.
Nun können wir in der Rule diese Anweisung nutzen:
Code: Alles auswählen
...
if(StatusFreigabe != OFF)
LoadPower = transform("SCALE","charge.scale",Export)
Ladeleistung.postUpdate(LoadPower) // setze erlaube Ladeleistung
...
Die SCALE Transformation ist natürlich vor allem interessant, um Werte für eine Anzeige aufzubereiten,
Da die scale Datei von oben nach unten abgearbeitet wird, könnte man auch hier nur eine Seite betrachten. die erste Zeile, deren Bedingungen erfüllt sind gibt den Wert zurück, aber so wie oben ist es halt exakt
