Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RCT: add battery control #18178

Merged
merged 12 commits into from
Feb 2, 2025
Merged

RCT: add battery control #18178

merged 12 commits into from
Feb 2, 2025

Conversation

andig
Copy link
Member

@andig andig commented Jan 11, 2025

@andig andig added the devices Specific device support label Jan 11, 2025
@andig andig changed the title Feat/rct battery RCT: add battery control Jan 11, 2025
@andig
Copy link
Member Author

andig commented Jan 12, 2025

@Maschga could you give this PR a try? I'm not sure I'm calling the right functions for hold/normal. Would be great if you could test this with an actual device.

@andig andig marked this pull request as ready for review January 12, 2025 13:56
@Maschga
Copy link
Contributor

Maschga commented Jan 12, 2025

Normal looks good. 👍

Why do you use SOCTargetConstant for Hold?
According to do-gooder it should be SOCTargetExternal. Is SOCTargetConstant better? What is the effect?
Source:

return m.conn.Write(rct.PowerMngSocStrategy, []byte{rct.SOCTargetConstant})

@andig
Copy link
Member Author

andig commented Jan 12, 2025

What is the effect?

I wouldn't know. It sounded as if the RCT would then hold the soc constant. However, that's also not what we want. Hold should prevent discharge, but still allow charge. Not sure how to best do this. I guess SOCTargetExternal with given Soc would still have the same problem.

@Maschga
Copy link
Contributor

Maschga commented Jan 12, 2025

Is it evcc possible to calculate how much surplus is available in addition to charging the e-car and how many kw could still charge the battery? Then this could be added using power_mng.battery_power_extern.

@andig
Copy link
Member Author

andig commented Jan 12, 2025

much surplus is available in addition to charging the e-car and how many kw could still charge the battery? Then this could be added using power_mng.battery_power_extern.

Why? Battery does that itself?!

@Maschga
Copy link
Contributor

Maschga commented Jan 12, 2025

I have set power_mng.soc_strategy to Constant. This results in the target Soc of the battery being set to 50%. RCT then wanted to discharge the battery, which is currently full.

@andig
Copy link
Member Author

andig commented Jan 12, 2025

So: what to use for hold (but still charge surplus)? You'll need to tell me- I can't test this...

@TobiasHuber1980
Copy link
Contributor

TobiasHuber1980 commented Jan 12, 2025

Keine Ahnung, aber vielleicht hilft es euch ja...

External battery control is possible when the SoC target selection is set to "Extern":

Parameter: 0xF168B748 // power_mng.soc_strategy | t_enum (uint8_t) | SoC target selection

The following six values are possible:

0 – SoC target = SoC

1 – Const

2 – Extern

3 – Average Battery voltage

4 – Intern (default)

5 – Timetable

The power_mng.battery_power_extern parameter allows external control of the desired battery power:

0xBD008E29 // power_mng.battery_power_extern | t_float | Battery target power [W] (positive = discharge)

@Maschga
Copy link
Contributor

Maschga commented Jan 12, 2025

You could set power_mng.soc_min to the current SOC value of the battery. This will prevent the battery from discharging, but the battery can still charge if there is excess power available.

@andig
Copy link
Member Author

andig commented Jan 12, 2025

Welches Datenformat braucht da der Parameter? 1 Byte? Float32?

@Maschga
Copy link
Contributor

Maschga commented Jan 12, 2025

Laut rctclient ist das ein float.
So sieht der Code im PR aus:

// SetSocMin sets the minimum SOC target (power_mng.soc_min) with the given value
func (c *Connection) SetSocMin(min float32) error {
	if min < 0.00 || min > 1.00 {
		return fmt.Errorf("invalid SOC min value: %.2f, valid range is 0.00 to 1.00", min)
	}

	// Round to 2 decimal places
	min = float32(math.Round(float64(min)*100) / 100)

	data := make([]byte, 4)
	binary.BigEndian.PutUint32(data, math.Float32bits(min))

	if err := c.Write(PowerMngSocMin, data); err != nil {
		return fmt.Errorf("failed to set SOC min: %w", err)
	}

	return nil
}

@Maschga
Copy link
Contributor

Maschga commented Jan 12, 2025

Das Runden der Zahl kannst du weglassen. Das ändere ich noch im PR.

@andig
Copy link
Member Author

andig commented Jan 12, 2025

Du kannst nochmal probieren. Wenn das nicht funzt gerne nach Bedarf anpassen.

@Maschga
Copy link
Contributor

Maschga commented Jan 12, 2025

Kannst du für minsoc einen Default von 7% (also 0.07) und für maxsoc einen Default von 97% (also 0.97) angeben?

@andig
Copy link
Member Author

andig commented Jan 12, 2025

Das kannst du im Template ändern.

@andig
Copy link
Member Author

andig commented Jan 12, 2025

Braucht man für charge überhaupt external? Sonst könnte man da auch einfach nur den minsoc setzen und müsste gar nicht mit dem Modus rumfrickeln...

@Maschga
Copy link
Contributor

Maschga commented Jan 12, 2025

@andig Kannst du mir für diesen PR Schreibzugriff geben? Würde gerne eine Implementierung committen.

@Maschga Maschga mentioned this pull request Jan 12, 2025
@Maschga
Copy link
Contributor

Maschga commented Jan 12, 2025

Hab's mit einem separaten PR gelöst.

* Update dependency

* fix BatteryCharge

* add defaults

* add comment
* Update dependency

* fix BatteryCharge

* add defaults

* add comment

* change battery mode logic
@Maschga
Copy link
Contributor

Maschga commented Jan 14, 2025

Das ist die beste Lösung, die ich finden konnte.
Es sollte funktionieren, ich konnte es bisher nur mit der RCT App am Gerät testen, aber noch nicht mit evcc selbst.
Die Aufrufe sind aber die gleichen.

@Maschga
Copy link
Contributor

Maschga commented Jan 14, 2025

@andig Soll es noch mit evcc getestet werden? Ich habe keinen dynamischen Tarif.

@Maschga
Copy link
Contributor

Maschga commented Jan 15, 2025

Soll ich noch einen PR erstellen, um den Lint-Test zu fixen?

@andig
Copy link
Member Author

andig commented Jan 15, 2025

Fixed. You can avoid this using VScode with Go plugin.

meter/rct.go Show resolved Hide resolved
meter/rct.go Show resolved Hide resolved
@andig andig marked this pull request as ready for review January 15, 2025 09:18
@andig andig self-assigned this Jan 15, 2025
@Maschga
Copy link
Contributor

Maschga commented Jan 20, 2025

@andig Mir fällt noch eines auf: Die RCT-Batterie macht periodisch Kalibrierungen. Wenn die Batterie gerade in diesem Modus ist (sei es Kalibrierung oder Balancing), dann wäre es super, wenn evcc auf BatteryNormal geht, ansonsten wird die Kalibrierung gestört.
Das lässt sich damit abfragen:
0x71765BD8 INT32 INT32 battery.status Battery status

Hier werden die zwei wichtigen Werte erklärt.

Ich kann gerne im mlnoga-PR die Werte zum Lesen hinzufügen, aber ich weiß nicht, wo die Logik in evcc am Besten hinpasst. Kannst du mir da helfen?

@andig
Copy link
Member Author

andig commented Jan 20, 2025

Leider nein- das passt nicht in die Logik. Man könnte allenfalls den Start von Charge/Hold mit Fehlermeldung verhindern.

@Maschga
Copy link
Contributor

Maschga commented Jan 20, 2025

Dass die Batterie die Kalibrierung ungestört machen kann, wäre sehr wichtig.
Dann auch gerne die Implementierung mit Fehlermeldungen.

@Maschga
Copy link
Contributor

Maschga commented Jan 20, 2025

Dann gibt es wahrscheinlich auch keine Logik, um zum Beispiel 1 Minute bevor die Kalibrierung startet in den BatteryNormal Modus zu wechseln?

@Maschga
Copy link
Contributor

Maschga commented Jan 20, 2025

Und meine letzter Gedanke: Vielleicht sollte im Fall, dass der Inselmodus eingetreten ist, die Batterie auch nur im Modus BatteryNormal bleiben. Sorry für die ganzen Spezialfälle.

@Maschga
Copy link
Contributor

Maschga commented Jan 20, 2025

Kann ich dafür einen PR machen?

@andig
Copy link
Member Author

andig commented Jan 20, 2025

Für "Modus nicht starten" gerne. Einen Hintergrundprozess der Modi wieder beendet würde ich nicht sehen oder wäre zumindest nicht RCT-spezifisch. Dafür fehlt mir noch der echte Bedarf.

@Maschga
Copy link
Contributor

Maschga commented Jan 25, 2025

Habe den PR eingereicht, siehe #18417.

Ich habe den Code lokal kompiliert und ausgeführt. Funktioniert bei mir ohne Probleme, zumindest was BatteryHold angeht.
Ich habe keinen dynamischen Tariff, deswegen kann ich BatteryCharge schlecht testen.

Jetzt bleibt uns nur noch übrig, auf mlnoga/rct#20 zu warten.

@andig
Copy link
Member Author

andig commented Jan 25, 2025

Du kannst alles mit

evcc meter

testen.

@Maschga
Copy link
Contributor

Maschga commented Jan 25, 2025

Habe es ausgeführt:

$ evcc meter
[main  ] INFO 2025/01/25 15:45:07 evcc 0.0.0
[main  ] INFO 2025/01/25 15:45:07 using config file: D:\Git\evcc\evcc.yaml
[db    ] INFO 2025/01/25 15:45:07 using sqlite database: C:\Users\xxx\.evcc\evcc.db
my_pv
-----
Power: 3037W

my_grid
-------
Power:  -2910W
Energy: 1437.3kWh

my_battery
----------
Power: -6W
Soc:   99%

db:10
-----
Power: -6W
Soc:   99%

db:8
----
Power:  -2910W
Energy: 1437.3kWh

db:9
----
Power: 3037W

Ich interpretiere das mal als erfolgreich. Bin ich damit richtig?

@Maschga
Copy link
Contributor

Maschga commented Feb 2, 2025

Wie sieht hier das weitere Vorgehen aus?

@andig
Copy link
Member Author

andig commented Feb 2, 2025

Magst du den Konflikt auflösen? Es wäre super wenn wir mlnoga noch mit rein bekämen.

@Maschga
Copy link
Contributor

Maschga commented Feb 2, 2025

Den Konflikt schaue ich mir an. 👍

@andig andig merged commit ae0a656 into master Feb 2, 2025
7 checks passed
@andig andig deleted the feat/rct-battery branch February 2, 2025 10:24
@userwithoutpassword
Copy link

userwithoutpassword commented Feb 9, 2025

@andig Mir fällt noch eines auf: Die RCT-Batterie macht periodisch Kalibrierungen. Wenn die Batterie gerade in diesem Modus ist (sei es Kalibrierung oder Balancing), dann wäre es super, wenn evcc auf BatteryNormal geht, ansonsten wird die Kalibrierung gestört. Das lässt sich damit abfragen: 0x71765BD8 INT32 INT32 battery.status Battery status

Hier werden die zwei wichtigen Werte erklärt.

Ich kann gerne im mlnoga-PR die Werte zum Lesen hinzufügen, aber ich weiß nicht, wo die Logik in evcc am Besten hinpasst. Kannst du mir da helfen?

Wie hast du das gelöst? Ich habe den RCT in HA integriert. Dort wird auch "Battery Status" gelogt. Allerdings steht das die ganze Zeit auf Normal und ändert sich im Monat nur für ein paar Sekunden auf was anderes. Das verwirrt mich etwas weil diese Kalibrierung mit Akku ganz aufladen und dann entladen dauert halt länger als nur ein paar Sekunden.

Wie ist das bei dir? Also ich kenn die technische Doku aber hast du mal beobachtet was der RCT tatsächlich tut wenn er die Batterie kalibiert?

Es gibt auch noch ein weiteres Feld "Next Calibration" oder so. Da steht bei mir aber seit Ewigkeiten schon dasselbe Datum drin...

Interessant ist ob der RCT sich überhaupt übersteuern/stören lässt wenn er grad kalibriert...

@Maschga
Copy link
Contributor

Maschga commented Feb 9, 2025

Wie der Status der Batterie beim Kalibrieren ist, konnte ich noch nicht selber herausfinden, weil meine Batterie noch nicht kalibriert hat.

Das mit dem Übersteuern will ich persönlich nicht ausprobieren, wobei mich das Verhalten dabei schon interessieren würde.

@userwithoutpassword
Copy link

Ja berichte mal was dein RCT macht. Bei mir ändert sich der Wert nur für ein paar Sekunden...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
devices Specific device support
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants