PV Überschussladen - Ladefreigabe
-
- 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: 14041
- 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.
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.
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)
end
Die 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)
end
Aber selbst mit den Einrückungen sieht der Code nicht schön aus und birgt wie erwähnt Gefahren.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet
-
- 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: 14041
- 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...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet
-
- 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.
-
- Beiträge: 590
- 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.state
Die 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
-
- 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]
-
- 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
-
- Beiträge: 590
- 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_Export
Nachtrag:
Versuch es mal damit:
Code: Alles auswählen
var Export = 0.0
var Export = (SolarEdge_Live_Export.state as number).floatValue
- udo1toni
- Beiträge: 14041
- 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
end
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
]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
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet