PV Überschussladen - Ladefreigabe
- 
				JeKo1969
- Beiträge: 7
- Registriert: 1. Jun 2023 07:30
PV Überschussladen - Ladefreigabe
Hallo alle zusmmen,
ich bräuchte mal einen Tipp, was ich hier falsch mache.
Ich bin gerade dabei, die Stuerung für das Überschussladen meines E-Fahrzeugs zu bauen. Ich möchte, dass der Ladevorgang beginnt, wenn der Ladezustand der Batterie = 100 % ist, und der Ladevorgang unterbrochen wird, wenn sich die Batterie auf < 90 % entladen hat.
Items:
- Freigabe Typ: Switch
- Battery Level Live Typ: Number:Dimensionless
Rule: Es erscheint diese Faehlermeldung:
Was ist falsch ? Danke schonmal im Vorraus ...
Gruß
Jens
						
						ich bräuchte mal einen Tipp, was ich hier falsch mache.
Ich bin gerade dabei, die Stuerung für das Überschussladen meines E-Fahrzeugs zu bauen. Ich möchte, dass der Ladevorgang beginnt, wenn der Ladezustand der Batterie = 100 % ist, und der Ladevorgang unterbrochen wird, wenn sich die Batterie auf < 90 % entladen hat.
Items:
- Freigabe Typ: Switch
- Battery Level Live Typ: Number:Dimensionless
Rule: Es erscheint diese Faehlermeldung:
Was ist falsch ? Danke schonmal im Vorraus ...
Gruß
Jens
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
			
									
						- udo1toni
- Beiträge: 15415
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: PV Überschussladen - Ladefreigabe
Herzlich willkommen im openHAB Forum!
Fehler 1: Du postest ein Bild von Deinem Code.
Fehler 2: Du schreibst von einem Fehler, zeigst ihn aber nicht. Bitte keine Screenshots, wenn vermeidbar.
 Bitte keine Screenshots, wenn vermeidbar. 
Aus dem Log heraus kann man Text leicht per Zwischenablage übernehmen.
Fehler 3 (jetzt kommen wir Deinen Fehlern langsam näher): Du vergleichst einen Status mit einem String.
Fehler 4: Du verwendest ein Type Casting mitten in Bool'scher Algebra (das ist die Ursache der Fehlermeldung)
Fehler 5: Du castest einfach, obwohl ein Number Item durchaus auch Werte enthalten kann, die nicht nach Number gecastet werden können (zumindest riskant).
Fehler 6: Du vergleichst einen UoM Wert % mit einer Zahl ohne Einheit. Das geht nicht.
Fehler 7 (kein echter Fehler, aber unnötig): Du verwendest received update als Trigger.
Fehler 8 (zumindest unlogisch): Das triggernde Item kommt in der Rule gar nicht vor. Warum dieser Trigger?
Fehler 9: Vergleich auf == mit dem Schaltstatus. Ein Switch Item kann wie Number auch Status ungleich ON und OFF melden, dann macht die Rule nichts mehr.
Klarer:
Warum so viele Variablen? Eine Variable benötigt wesentlich weniger Taktzyklen als eine Abfrage eines Bus-Wertes. Sobald man einen Bus-Wert mehr als einmal braucht, ist die Variable die bevorzugte Variante.
Die einzelnen Schritte der Rule:
also keine Anführungszeichen, das Casting in Klammern und mittels .intValue Erzwingen eines Integer Wertes, außerdem Vergleich mittels != (nicht gleich) um z.B. NULL und UNDEF mit zu berrücksichtigen. 
Aber selbst mit den Einrückungen sieht der Code nicht schön aus und birgt wie erwähnt Gefahren.
						
									
									Fehler 1: Du postest ein Bild von Deinem Code.
Fehler 2: Du schreibst von einem Fehler, zeigst ihn aber nicht.
 Bitte keine Screenshots, wenn vermeidbar.
 Bitte keine Screenshots, wenn vermeidbar. Aus dem Log heraus kann man Text leicht per Zwischenablage übernehmen.
Fehler 3 (jetzt kommen wir Deinen Fehlern langsam näher): Du vergleichst einen Status mit einem String.
Fehler 4: Du verwendest ein Type Casting mitten in Bool'scher Algebra (das ist die Ursache der Fehlermeldung)
Fehler 5: Du castest einfach, obwohl ein Number Item durchaus auch Werte enthalten kann, die nicht nach Number gecastet werden können (zumindest riskant).
Fehler 6: Du vergleichst einen UoM Wert % mit einer Zahl ohne Einheit. Das geht nicht.
Fehler 7 (kein echter Fehler, aber unnötig): Du verwendest received update als Trigger.
Fehler 8 (zumindest unlogisch): Das triggernde Item kommt in der Rule gar nicht vor. Warum dieser Trigger?
Fehler 9: Vergleich auf == mit dem Schaltstatus. Ein Switch Item kann wie Number auch Status ungleich ON und OFF melden, dann macht die Rule nichts mehr.
Klarer:
Code: Alles auswählen
rule "Ladefreigabe"
when
    Item SolarEdge_Battery_Level changed
    // Item SolarEdge_Live_Export changed                            // Warum dieses Item, und nicht das bestimmende Item?
then
    var iLevel = 0                                                   // definiere lokale Variable als 0
    if(SolarEdge_Battery_Level.state instanceof Number)              // Falls Item gültigen Wert hat
        iLevel = (SolarEdge_Battery_Level.state as Number).intValue  // lade diesen Wert
    var soll = Freigabe.state                                        // definiere lokale Variable mit aktuellem Status der Freigabe
    if(iLevel < 90)                                                  // Falls iLevel unter 90
        soll = OFF                                                   // abschalten
    if(iLevel == 100)                                                // Falls Level 100
        soll = ON                                                    // einschalten
    if(Freigabe.state != soll)                                       // Falls ist von soll abweicht
        Freigabe.sendCommand(soll.toString)                          // sende soll (.toString ist wegen Typefehler nötig)
endDie einzelnen Schritte der Rule:
- Trigger durch Wertänderung des Items, welches das Verhalten der Rule beeinflusst (der Batterielevel, Fehler 7, 8)
- Laden des Wertes in eine lokale Variable unter Berücksichtigung von ungültigen Eingangswerten (Fehler 4 - 6)
- Bestimmen des Soll über eine Variable (drei Möglichkeiten: unverändert, OFF oder ON
- Vergleich, ob Soll von Ist abweicht und gegebenenfalls Steuerbefehl senden (Fehler 9)
Code: Alles auswählen
rule "Ladefreigabe"
when
    Item SolarEdge_Live_Export received update
then
  if(Freigabe.state !=  ON && (SolarEdge_Battery_Level.state as Number).intValue == 100) Freigabe.sendComand(ON)
  if(Freigabe.state != OFF && (SolarEdge_Battery_Level.state as Number).intValue ==  90) Freigabe.sendComand(OFF)
endAber selbst mit den Einrückungen sieht der Code nicht schön aus und birgt wie erwähnt Gefahren.
openHAB5.0.1 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime) (Proxmox 9.0.11, LXC)
						- 
				JeKo1969
- Beiträge: 7
- Registriert: 1. Jun 2023 07:30
Re: PV Überschussladen - Ladefreigabe
Hallo udo1toni,
vielen Dank für die Hilfe. Aller Anfang ist schwer....
						
									
									
						vielen Dank für die Hilfe. Aller Anfang ist schwer....
- udo1toni
- Beiträge: 15415
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: PV Überschussladen - Ladefreigabe
Immer gerne 
Und Kopf hoch, jeder hat mal angefangen...
						
									
									
Und Kopf hoch, jeder hat mal angefangen...
openHAB5.0.1 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime) (Proxmox 9.0.11, LXC)
						- 
				JeKo1969
- Beiträge: 7
- Registriert: 1. Jun 2023 07:30
Re: PV Überschussladen - Ladefreigabe
Hallo, hallo. Nach dem Problem ist vor dm Problem.
Die Ladefreigabe funktioniert super. Die Festlegung der Ladeleistung anhand der ins Netz eingespeisten Leistung noch nicht.
Verwendete Items:
SolarEdge_Live_Export vom Typ Number:Power
Ladeleistung vom Typ Number
Leider kriege ich nicht raus, wie ich den Code anders einfüge: [MOD: so:]
Fehler:
Ladelesitung bleibt immer 0
Keine Fehlermeldung in den Log Einträgen. Keine Ahnung, was ich falsch mache ..
						
						Die Ladefreigabe funktioniert super. Die Festlegung der Ladeleistung anhand der ins Netz eingespeisten Leistung noch nicht.
Verwendete Items:
SolarEdge_Live_Export vom Typ Number:Power
Ladeleistung vom Typ Number
Leider kriege ich nicht raus, wie ich den Code anders einfüge: [MOD: so:]
Code: Alles auswählen
rule "Ueberschussladen"
when
    Item SolarEdge_Battery_Level changed                                                    
              
then
    var SoC = 0                                                                             
    if(SolarEdge_Battery_Level.state instanceof Number)                                     
        SoC = (SolarEdge_Battery_Level.state as Number).intValue                            
    var StatusFreigabe = Freigabe.state                                                     
    if(SoC < 90)                                                                           
        StatusFreigabe = OFF                                                                
    if(SoC == 100)                                                                          
        StatusFreigabe = ON                                                                 
    if(Freigabe.state != StatusFreigabe)
        Freigabe.sendCommand(StatusFreigabe.toString)
    var Export = (SolarEdge_Live_Export.state as number).floatValue
    
    var LoadPower = 0                                                                       // 0;0;0=0.00 kW                                                                   
    
    if(Freigabe.state !=  OFF){ 
        
        if(Export >= 1.49 && Export < 1.73){                                                // 6;0;0=1.44 kW
            LoadPower = 1.44
            }
        if(Export >= 1.73 && Export < 1.97){                                                // 7;0;0=1.68 kW
            LoadPower = 1.68
            }
        if(Export >= 1.97 && Export < 2.21){                                                // 8;0;0=1.92 kW
            LoadPower = 1.92
            }
        if(Export >= 2.21 && Export < 2.45){                                                // 9;0;0=2.16 kW
            LoadPower = 2.16
            }
        if(Export >= 2.45 && Export < 2.69){                                                // 10;0;0=2.40 kW
            LoadPower = 2.40
            }
        if(Export >= 2.69 && Export < 2.93){                                                // 11;0;0=2.64 kW
            LoadPower = 2.64
            }
        if(Export >= 2.93 && Export < 3.17){                                                // 12;0;0=2.88 kW
            LoadPower = 2.88
            }
        if(Export >= 3.17 && Export < 3.41){                                                // 13;0;0=3.12 kW
            LoadPower = 3.12
            }
        if(Export >= 3.41 && Export < 3.65){                                                // 14;0;0=3.36 kW
            LoadPower = 3.36
            }
        if(Export >= 3.65 && Export < 3.77){                                                // 15;0;0=3.60 kW
            LoadPower = 3.60
            }
        if(Export >= 3.77 && Export < 4.37){                                                // 16;0;0=3.72 kW
            LoadPower = 3.72
            }
        if(Export >= 4.37 && Export < 5.09){                                                // 6;6;6=4.32 kW
            LoadPower = 4.32
            }
        if(Export >= 5.09 && Export < 5.81){                                                // 7;7;7=5.04 kW
            LoadPower = 5.04
            }
        f(Export >= 5.81 && Export < 6.53){                                                 // 8;8;8=5.76 kW
            LoadPower = 5.76
            }
        f(Export >= 6.53){                                                                  // 9;9;9=6.48 kW
            LoadPower = 6.48
            }             
    }
 
    // 10;10;10=7.20 kW
    // 11;11;11=7.92 kW
    // 12;12;12=8.64 kW
    // 13;13;13=9.36 kW
    // 14;14;14=10.1 kW
    // 15;15;15=10.8 kW
    // 16;16;16=11.1 kW
    Ladeleistung.postUpdate(LoadPower)                               
end
Ladelesitung bleibt immer 0
Keine Fehlermeldung in den Log Einträgen. Keine Ahnung, was ich falsch mache ..
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
			
									
						- 
				violine21
- Beiträge: 602
- Registriert: 20. Sep 2019 05:49
Re: PV Überschussladen - Ladefreigabe
Über dem Editorfenster ist ein Button </>, den betätigen und zwischen den Code-Kennzeichnern (eckige Klammern) den Code einfügen (s.u.).Leider kriege ich nicht raus, wie ich den Code anders einfüge:
In deiner Rule beziehst du dich nicht auf die eingespeiste Leistung, sonder auf den Ladestand deiner Batterie (SOC).Die Festlegung der Ladeleistung anhand der ins Netz eingespeisten Leistung noch nicht.
Evtl. entsteht da etwas anderes, wie erwartet?
Dieser Code-Teil
Code: Alles auswählen
var StatusFreigabe = Freigabe.stateDie hätte sonst zu dem Zeitpunkt noch keinen Wert.Verwendete Items:
SolarEdge_Live_Export vom Typ Number:Power
Ladeleistung vom Typ Number
Code: Alles auswählen
rule "Ueberschussladen"
when
Item SolarEdge_Battery_Level changed
then
var SoC = 0
if(SolarEdge_Battery_Level.state instanceof Number)
SoC = (SolarEdge_Battery_Level.state as Number).intValue
var StatusFreigabe = Freigabe.state
if(SoC < 90)
StatusFreigabe = OFF
if(SoC == 100)
StatusFreigabe = ON
if(Freigabe.state != StatusFreigabe)
Freigabe.sendCommand(StatusFreigabe.toString)
var Export = (SolarEdge_Live_Export.state as number).floatValue
var LoadPower = 0 // 0;0;0=0.00 kW
if(Freigabe.state != OFF){
if(Export >= 1.49 && Export < 1.73){ // 6;0;0=1.44 kW
LoadPower = 1.44
}
if(Export >= 1.73 && Export < 1.97){ // 7;0;0=1.68 kW
LoadPower = 1.68
}
if(Export >= 1.97 && Export < 2.21){ // 8;0;0=1.92 kW
LoadPower = 1.92
}
if(Export >= 2.21 && Export < 2.45){ // 9;0;0=2.16 kW
LoadPower = 2.16
}
if(Export >= 2.45 && Export < 2.69){ // 10;0;0=2.40 kW
LoadPower = 2.40
}
if(Export >= 2.69 && Export < 2.93){ // 11;0;0=2.64 kW
LoadPower = 2.64
}
if(Export >= 2.93 && Export < 3.17){ // 12;0;0=2.88 kW
LoadPower = 2.88
}
if(Export >= 3.17 && Export < 3.41){ // 13;0;0=3.12 kW
LoadPower = 3.12
}
if(Export >= 3.41 && Export < 3.65){ // 14;0;0=3.36 kW
LoadPower = 3.36
}
if(Export >= 3.65 && Export < 3.77){ // 15;0;0=3.60 kW
LoadPower = 3.60
}
if(Export >= 3.77 && Export < 4.37){ // 16;0;0=3.72 kW
LoadPower = 3.72
}
if(Export >= 4.37 && Export < 5.09){ // 6;6;6=4.32 kW
LoadPower = 4.32
}
if(Export >= 5.09 && Export < 5.81){ // 7;7;7=5.04 kW
LoadPower = 5.04
}
f(Export >= 5.81 && Export < 6.53){ // 8;8;8=5.76 kW
LoadPower = 5.76
}
f(Export >= 6.53){ // 9;9;9=6.48 kW
LoadPower = 6.48
}
}
// 10;10;10=7.20 kW
// 11;11;11=7.92 kW
// 12;12;12=8.64 kW
// 13;13;13=9.36 kW
// 14;14;14=10.1 kW
// 15;15;15=10.8 kW
// 16;16;16=11.1 kW
Ladeleistung.postUpdate(LoadPower)
end
- 
				JeKo1969
- Beiträge: 7
- Registriert: 1. Jun 2023 07:30
Re: PV Überschussladen - Ladefreigabe
Ok, danke. Die Triggerbedingung für die rule ist natürlich Quatsch. Habe ich geändert. Ändert aber nichts daran, dass die Ladelesitung immer 0 bleibt.
Verwendete Items:
- Freigabe Typ: Switch
- Battery Level Live Typ: Number:Dimensionless
- SolarEdge_Live_Export vom Typ Number:Power
- Ladeleistung vom Typ Number
Nach dem then kommt erst mal der Code, den Du mir freundlicherweise zur Verfügung gestellt hast, nur mit geänderten Variabelennamen. Ab var Export beginnt mein Code.
						
									
									
						Verwendete Items:
- Freigabe Typ: Switch
- Battery Level Live Typ: Number:Dimensionless
- SolarEdge_Live_Export vom Typ Number:Power
- Ladeleistung vom Typ Number
Nach dem then kommt erst mal der Code, den Du mir freundlicherweise zur Verfügung gestellt hast, nur mit geänderten Variabelennamen. Ab var Export beginnt mein Code.
Code: Alles auswählen
[rule "Ueberschussladen"
when
    Item SolarEdge_Live_Export changed                                                    
              
then
    var SoC = 0                                                                             // Ab hier Code von Udo1Toni mit umbenannten Variablen (iLevel --> SoC, soll --> StatusFreigabe)                                               
    if(SolarEdge_Battery_Level.state instanceof Number)                                     
        SoC = (SolarEdge_Battery_Level.state as Number).intValue                            
    var StatusFreigabe = Freigabe.state                                                  
    if(SoC < 90)                                                                           
        StatusFreigabe = OFF                                                                
    if(SoC == 100)                                                                          
        StatusFreigabe = ON                                                                 
    if(Freigabe.state != StatusFreigabe)
        Freigabe.sendCommand(StatusFreigabe.toString)
    var Export = (SolarEdge_Live_Export.state as number).floatValue                         // Ab hier beginnt mein eigener Code
    
    var LoadPower = 0                                                                       // 0;0;0=0.00 kW                                                                   
    
    if(Freigabe.state !=  OFF){ 
        
        if(Export >= 1.49 && Export < 1.73){                                                // 6;0;0=1.44 kW
            LoadPower = 1.44
            }
        if(Export >= 1.73 && Export < 1.97){                                                // 7;0;0=1.68 kW
            LoadPower = 1.68
            }
        if(Export >= 1.97 && Export < 2.21){                                                // 8;0;0=1.92 kW
            LoadPower = 1.92
            }
        if(Export >= 2.21 && Export < 2.45){                                                // 9;0;0=2.16 kW
            LoadPower = 2.16
            }
        if(Export >= 2.45 && Export < 2.69){                                                // 10;0;0=2.40 kW
            LoadPower = 2.40
            }
        if(Export >= 2.69 && Export < 2.93){                                                // 11;0;0=2.64 kW
            LoadPower = 2.64
            }
        if(Export >= 2.93 && Export < 3.17){                                                // 12;0;0=2.88 kW
            LoadPower = 2.88
            }
        if(Export >= 3.17 && Export < 3.41){                                                // 13;0;0=3.12 kW
            LoadPower = 3.12
            }
        if(Export >= 3.41 && Export < 3.65){                                                // 14;0;0=3.36 kW
            LoadPower = 3.36
            }
        if(Export >= 3.65 && Export < 3.77){                                                // 15;0;0=3.60 kW
            LoadPower = 3.60
            }
        if(Export >= 3.77 && Export < 4.37){                                                // 16;0;0=3.72 kW
            LoadPower = 3.72
            }
        if(Export >= 4.37 && Export < 5.09){                                                // 6;6;6=4.32 kW
            LoadPower = 4.32
            }
        if(Export >= 5.09 && Export < 5.81){                                                // 7;7;7=5.04 kW
            LoadPower = 5.04
            }
        f(Export >= 5.81 && Export < 6.53){                                                 // 8;8;8=5.76 kW
            LoadPower = 5.76
            }
        f(Export >= 6.53){                                                                  // 9;9;9=6.48 kW
            LoadPower = 6.48
            }             
    }
 
    // 10;10;10=7.20 kW
    // 11;11;11=7.92 kW
    // 12;12;12=8.64 kW
    // 13;13;13=9.36 kW
    // 14;14;14=10.1 kW
    // 15;15;15=10.8 kW
    // 16;16;16=11.1 kW
    Ladeleistung.postUpdate(LoadPower)                               
end]- 
				JeKo1969
- Beiträge: 7
- Registriert: 1. Jun 2023 07:30
Re: PV Überschussladen - Ladefreigabe
Und jetzt kommt doch eine Fehlermeldung:
4:27:08.931 [ERROR] [.internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Ueberschussladen-1' failed: Could not cast 2.55 kW to void; line 19, column 19, length 37 in Ueberschussladen
line 19, column 19 ist hier:
var Export = (SolarEdge_Live_Export.state as number).floatValue // Ab hier beginnt mein eigener Code
						
									
									
						4:27:08.931 [ERROR] [.internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Ueberschussladen-1' failed: Could not cast 2.55 kW to void; line 19, column 19, length 37 in Ueberschussladen
line 19, column 19 ist hier:
var Export = (SolarEdge_Live_Export.state as number).floatValue // Ab hier beginnt mein eigener Code
- 
				violine21
- Beiträge: 602
- Registriert: 20. Sep 2019 05:49
Re: PV Überschussladen - Ladefreigabe
Im unteren Teil der Rule hast du in den if-Zweigen geschweifte Klammern verwendet.
Warum nicht auch im oberen Teil?
Hat das Item
eine Einheit?
Nachtrag:
Versuch es mal damit:
						
									
									
						Warum nicht auch im oberen Teil?
Hat das Item
Code: Alles auswählen
SolarEdge_Live_ExportNachtrag:
Versuch es mal damit:
Code: Alles auswählen
var Export = 0.0
var Export = (SolarEdge_Live_Export.state as number).floatValue
- udo1toni
- Beiträge: 15415
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: PV Überschussladen - Ladefreigabe
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:
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:
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:
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
						
									
									
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
endDas 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]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
...
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

openHAB5.0.1 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime) (Proxmox 9.0.11, LXC)
						