Berechnung Farbton, Ladezustand vom AKKU

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
mad-mike
Beiträge: 459
Registriert: 6. Jan 2021 18:05
Answers: 3

Berechnung Farbton, Ladezustand vom AKKU

Beitrag von mad-mike »

Moin zusammen. Mein neuer Akku der PV analge hat keine Anzeige mehr, so das man einen Aktuellen Ladestand nicht erkennen kann.

Ich habe hier noch eine Shelly Lampe und wollte hier den Farbton anhand vom Ladezustand anzeigen lassen..


Ich habe 2 grenzen makiert für maximum, und minimum, das klappt. nur den Teil wo man berechnen muss, klappt nicht irgendwie habe ich immer Bunte Lampe, aber nicht einmal so wie es sein soll.

Werte welche zur Shelly gesendet werden:
Lampe rot= 0
Lampe Grün = 120

Code: Alles auswählen

rule "SOC Lampe"
when
    Item SOC changed
then
    var Number  nSOC  = (SOC.state as Number).floatValue                      // Untergrenze auf 0 verschieben
    var Integer hue = 10
    if(nSOC < 30)                                                               // Untergrenze
        hue = 0                                                                 // Minimalwert setzen
    else if(nSOC > 90)                                                          // Obergrenze 
        hue = 120                                                               // Maximalwert setzen
    else                                                                         
        hue = 12 * nSOC / 10 .intValue                                      // Wertebereich umrechnen
        sendCommand(SOC_Lampe, hue +',100,100')
    logInfo("Lamp","Lampe = {} %",hue)
end
Irgendwie ist die Berechnung der Steigung nicht korrekt, kann jemand Helfen??

Danke und schönes Wochenende :!:

;)
Gruss mad-mike

openHABian 4.3.0 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: Berechnung Farbton, Ladezustand vom AKKU

Beitrag von udo1toni »

Probiere es bitte mal so:

Code: Alles auswählen

rule "SOC Lampe"
when
    Item SOC changed
then
    var   Number nSOC  = (SOC.state as Number).floatValue  // 0 bis 100
    if(nSOC < 30) nSOC =   0                               // alles unter 30 ist   0
    if(nSOC > 90) nSOC = 100                               // alles über  90 ist 100
    val   Integer iHue = nSOC * 12 / 10                    // 0 - 100 -> 0 - 120

    SOC_Lampe.sendCommand(iHue.toString +',100,100')       // iHue als String verwenden
    // SOC_Lampe.sendCommand(new HSBType(iHue,100,100))    // alternativ HSBType generieren

    logInfo("stateOfCharge","Farbwinkel = {} °",iHue)
end
Da die lokale Konstante iHue bereits als Integer definiert ist, muss man nicht extra .intValue verwenden. Wenn man dies aber tun wollte, so müsste der gesamte Wert geklammert werden, so:

Code: Alles auswählen

val Integer iHue = (nSOC * 12 / 10).intValue
Niemals sendCommand() als Action aufrufen, wenn es vermeidbar ist (wirklich, niemals).
openHAB errät durchaus viele Konvertierungen korrekt, aber Integer zu String wird regelmäßig schief gehen, deshalb einfach mit .toString die Konvertierung erzwingen.
Eine Alternative wäre das Erzeugen des korrekten HSBType, klappt aber auch nicht immer, der String sollte dagegen schon funktionieren, aber nur, wenn er auch korrekt generiert wurde :)
Das Verhalten sollte so sein:
SOC 0 % -30 % -> 0 °
SOC 30 % - 90 % -> 36 ° - 108 °
SOC 90 % - 100 % -> 120 °
openHAB4.3.0 stable in einem Debian-Container (bookworm) (Proxmox 8.3.1, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 459
Registriert: 6. Jan 2021 18:05
Answers: 3

Re: Berechnung Farbton, Ladezustand vom AKKU

Beitrag von mad-mike »

Moin, Danke dafür ;)

Code: Alles auswählen

    SOC_Lampe.sendCommand(iHue.toString +',100,100')       // iHue als String verwenden
Gibt eine Fehler meldung raus:

Code: Alles auswählen

2024-10-07 00:14:30.244 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'soc-1' failed: An error occurred during the script execution: Could not invoke method: java.lang.Integer.toString() on instance: 80.40000000 in soc
Ich habe dies so nun gemacht:

Code: Alles auswählen

SOC_Lampe.sendCommand(iHue +',100,100')       // iHue als String verwenden

;)


Lässt sich das noch ändern von:
SOC 30 % - 90 % -> 36 ° - 108 °
auf:

Code: Alles auswählen

 SOC 30 % - 90 % -> 0 ° - 120 °
:?:
Da bin ich vorhin eigentlich gescheitert. :oops:


Habe die Lampe noch mit dem Keller Licht verknüpft, und noch ein return hinzugefügt.:

Code: Alles auswählen

rule "SOC Lampe"
when
    Item SOC changed or
    Item Keller_Licht changed
then
    if(Keller_Licht.state != ON)                                                // Automatik abgeschaltet?
    return;
    
    var   Number nSOC  = (SOC.state as Number).floatValue                       // 0 bis 100
    if(nSOC < 30) nSOC =   0                                                    // alles unter 30 ist   0
    if(nSOC > 90) nSOC = 100                                                    // alles über  90 ist 100
    val   Integer iHue = nSOC * 12 / 10                                         // 0 - 100 -> 0 - 120

    SOC_Lampe.sendCommand(iHue +',100,100')                                     // iHue als String verwenden

    logInfo("stateOfCharge","Farbwinkel = {} °",iHue)
end
funktioniert schon garnicht so schlecht. :D
Gruss mad-mike

openHABian 4.3.0 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: Berechnung Farbton, Ladezustand vom AKKU

Beitrag von udo1toni »

Offensichtlich nutzt openHAB DigDecimal statt Float... weshalb die Wandlung nach Integer schief geht.
mad-mike hat geschrieben: 7. Okt 2024 00:24 Lässt sich das noch ändern von: SOC 30 % - 90 % -> 36 ° - 108 °
auf: SOC 30 % - 90 % -> 0 ° - 120 °
aber sicher, das ist sogar noch einfacher...

Code: Alles auswählen

rule "SOC Lampe"
when
    Item SOC changed
then
    var   Number nSOC  = (SOC.state as Number).floatValue   // 0 bis 100
    nSOC = nSOC - 30                                        // -30 bis 70
    if(nSOC < 0) nSOC =   0                                 // alles unter 0 ist   0
    if(nSOC > 60) nSOC = 60                                 // alles über  60 ist 60
    val   Integer iHue = (nSOC * 2).intValue                // 0 - 60 -> 0 - 120

    SOC_Lampe.sendCommand(iHue.toString +',100,100')        // iHue als String verwenden

    logInfo("stateOfCharge","Farbwinkel = {} °",iHue)
end
Der interessante Wertebereich wird zunächst verschoben, so dass das Minimum für den linearen Anstieg (30 %) auf dem Nullpunkt steht (also -30 %). Alle Werte unter 0 werden auf 0 gesetzt. alle Werte über dem Maximum des linearen Anstiegs (also alle Werte, die nach dem Verschieben über 60 % liegen) werden auf das Maximum begrenzt (jetzt also 60 %).
Anschließend wird der neue Wertebereich (0 - 60) auf den gewünschten Wertebereich gestreckt (120 / 60 = 2, das ist also unser gesuchter Faktor für die Streckung)

Code: Alles auswählen

2024-10-06 22:49:50.359 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SOC' changed from 60 % to 0 %
2024-10-06 22:49:50.371 [INFO ] [nhab.core.model.script.stateOfCharge] - Farbwinkel = 0 °
2024-10-06 22:49:53.571 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SOC' changed from 0 % to 1 %
2024-10-06 22:49:53.574 [INFO ] [nhab.core.model.script.stateOfCharge] - Farbwinkel = 0 °
2024-10-06 22:49:55.204 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SOC' changed from 1 % to 2 %
2024-10-06 22:49:55.205 [INFO ] [nhab.core.model.script.stateOfCharge] - Farbwinkel = 0 °
2024-10-06 22:49:58.688 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SOC' changed from 2 % to 29 %
2024-10-06 22:49:58.690 [INFO ] [nhab.core.model.script.stateOfCharge] - Farbwinkel = 0 °
2024-10-06 22:50:02.636 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SOC' changed from 29 % to 30 %
2024-10-06 22:50:12.628 [INFO ] [nhab.core.model.script.stateOfCharge] - Farbwinkel = 0 °
2024-10-06 22:50:16.259 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SOC' changed from 30 % to 31 %
2024-10-06 22:50:16.260 [INFO ] [nhab.core.model.script.stateOfCharge] - Farbwinkel = 2 °
2024-10-06 22:50:18.132 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SOC' changed from 31 % to 32 %
2024-10-06 22:50:18.133 [INFO ] [nhab.core.model.script.stateOfCharge] - Farbwinkel = 4 °
2024-10-06 22:50:19.963 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SOC' changed from 32 % to 33 %
2024-10-06 22:50:19.964 [INFO ] [nhab.core.model.script.stateOfCharge] - Farbwinkel = 6 °
2024-10-06 22:50:21.281 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SOC' changed from 33 % to 34 %
2024-10-06 22:50:21.283 [INFO ] [nhab.core.model.script.stateOfCharge] - Farbwinkel = 8 °
2024-10-06 22:50:25.756 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SOC' changed from 34 % to 88 %
2024-10-06 22:50:25.758 [INFO ] [nhab.core.model.script.stateOfCharge] - Farbwinkel = 116 °
2024-10-06 22:50:28.272 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SOC' changed from 88 % to 89 %
2024-10-06 22:50:28.274 [INFO ] [nhab.core.model.script.stateOfCharge] - Farbwinkel = 118 °
2024-10-06 22:50:32.414 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SOC' changed from 89 % to 90 %
2024-10-06 22:50:32.415 [INFO ] [nhab.core.model.script.stateOfCharge] - Farbwinkel = 120 °
2024-10-06 22:50:35.116 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'SOC' changed from 90 % to 91 %
2024-10-06 22:50:35.118 [INFO ] [nhab.core.model.script.stateOfCharge] - Farbwinkel = 120 °
openHAB4.3.0 stable in einem Debian-Container (bookworm) (Proxmox 8.3.1, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 459
Registriert: 6. Jan 2021 18:05
Answers: 3

Re: Berechnung Farbton, Ladezustand vom AKKU

Beitrag von mad-mike »

Stark, funktioniert. ;)

Danke dafür.

Bei dir hören sich die Lösungen immer so leicht und logisch an. Man selber kommt nicht drauf.

:oops: :mrgreen:
Gruss mad-mike

openHABian 4.3.0 auf Raspberry Pi 4 Mod. b (8GB) ;)

mad-mike
Beiträge: 459
Registriert: 6. Jan 2021 18:05
Answers: 3

Re: Berechnung Farbton, Ladezustand vom AKKU

Beitrag von mad-mike »

Ich nochmal...

Ich habe die Logik dahinter verstanden, daraus ergibt sich noch die Frage: das Ergebnis soll 'keine/eine/zwei' nachkomma stellen haben, wie kann man das realisieren? :?:

Gruß ;)
Gruss mad-mike

openHABian 4.3.0 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: Berechnung Farbton, Ladezustand vom AKKU

Beitrag von udo1toni »

Das verstehe ich nicht. In diesem Fall (60 -> 120) gibt es keine Nachkommastellen. Oder ist der Ausgangswert feiner als 1 % aufgelöst?
openHAB4.3.0 stable in einem Debian-Container (bookworm) (Proxmox 8.3.1, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 459
Registriert: 6. Jan 2021 18:05
Answers: 3

Re: Berechnung Farbton, Ladezustand vom AKKU

Beitrag von mad-mike »

:oops:
Hat sich erledigt.. :lol:
Gruss mad-mike

openHABian 4.3.0 auf Raspberry Pi 4 Mod. b (8GB) ;)

Antworten