PV Überschussladen - Ladefreigabe

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

JeKo1969
Beiträge: 7
Registriert: 1. Jun 2023 07:30
Answers: 0

PV Überschussladen - Ladefreigabe

Beitrag von JeKo1969 »

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:
Regel.png
Es erscheint diese Faehlermeldung:
Log.png
Was ist falsch ? Danke schonmal im Vorraus ...

Gruß

Jens
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
udo1toni
Beiträge: 14041
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: PV Überschussladen - Ladefreigabe

Beitrag von udo1toni »

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:

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
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:
  1. Trigger durch Wertänderung des Items, welches das Verhalten der Rule beeinflusst (der Batterielevel, Fehler 7, 8)
  2. Laden des Wertes in eine lokale Variable unter Berücksichtigung von ungültigen Eingangswerten (Fehler 4 - 6)
  3. Bestimmen des Soll über eine Variable (drei Möglichkeiten: unverändert, OFF oder ON
  4. Vergleich, ob Soll von Ist abweicht und gegebenenfalls Steuerbefehl senden (Fehler 9)
Das absolute Minimum an Änderungen wäre diese Variante:

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
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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

JeKo1969
Beiträge: 7
Registriert: 1. Jun 2023 07:30
Answers: 0

Re: PV Überschussladen - Ladefreigabe

Beitrag von JeKo1969 »

Hallo udo1toni,
vielen Dank für die Hilfe. Aller Anfang ist schwer....

Benutzeravatar
udo1toni
Beiträge: 14041
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: PV Überschussladen - Ladefreigabe

Beitrag von udo1toni »

Immer gerne :)
Und Kopf hoch, jeder hat mal angefangen...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

JeKo1969
Beiträge: 7
Registriert: 1. Jun 2023 07:30
Answers: 0

Re: PV Überschussladen - Ladefreigabe

Beitrag von JeKo1969 »

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:]

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
Fehler:
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: 590
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: PV Überschussladen - Ladefreigabe

Beitrag von violine21 »

Leider kriege ich nicht raus, wie ich den Code anders einfüge:
Über dem Editorfenster ist ein Button </>, den betätigen und zwischen den Code-Kennzeichnern (eckige Klammern) den Code einfügen (s.u.).
Die Festlegung der Ladeleistung anhand der ins Netz eingespeisten Leistung noch nicht.
In deiner Rule beziehst du dich nicht auf die eingespeiste Leistung, sonder auf den Ladestand deiner Batterie (SOC).
Evtl. entsteht da etwas anderes, wie erwartet?
Dieser Code-Teil

Code: Alles auswählen

var StatusFreigabe = Freigabe.state
ist mir unklar. Ist die Variable "Freigabe" global definiert (vor dem Beginn der Rule) oder ist es ein Item?
Verwendete Items:
SolarEdge_Live_Export vom Typ Number:Power
Ladeleistung vom Typ Number
Die hätte sonst zu dem Zeitpunkt noch keinen Wert.

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
Answers: 0

Re: PV Überschussladen - Ladefreigabe

Beitrag von JeKo1969 »

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.

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
Answers: 0

Re: PV Überschussladen - Ladefreigabe

Beitrag von JeKo1969 »

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

violine21
Beiträge: 590
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: PV Überschussladen - Ladefreigabe

Beitrag von violine21 »

Im unteren Teil der Rule hast du in den if-Zweigen geschweifte Klammern verwendet.
Warum nicht auch im oberen Teil?
Hat das Item

Code: Alles auswählen

SolarEdge_Live_Export
eine Einheit?

Nachtrag:
Versuch es mal damit:

Code: Alles auswählen

var Export = 0.0
var Export = (SolarEdge_Live_Export.state as number).floatValue

Benutzeravatar
udo1toni
Beiträge: 14041
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: PV Überschussladen - Ladefreigabe

Beitrag von udo1toni »

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 :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

Antworten