Skip to content

MyPV charger: Fix charger logic error #22402

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

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
Open

Conversation

docolli
Copy link
Contributor

@docolli docolli commented Jul 16, 2025

Should Fix temporary charger logic error mentioned in #22356

Put standby power of "10 W" into a variable for easier modification, if necessary.
Only if heater has a specific status and this power is exceeded, the charger goes to state C.
Enabled state now depends on value of heaters operation state register.

Only in cases when Elwa 2/AC Thor starts heating by themselfes due to boost backup heating a "charger out of sync: expected disabled, got enabled" error is logged.

Tested with AC Thor 9s.
Hope this fix is also fine for AC Elwa 2.
Debug message added for eventual troubleshooting of this heater type.

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @docolli - I've reviewed your changes and they look great!


Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

charger/mypv.go Outdated
@@ -192,12 +193,13 @@ func (wb *MyPv) Status() (api.ChargeStatus, error) {

// Enabled implements the api.Charger interface
func (wb *MyPv) Enabled() (bool, error) {
b, err := wb.conn.ReadHoldingRegisters(elwaRegSetPower, 1)
b, err := wb.conn.ReadHoldingRegisters(elwaRegPower, 1)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Entschuldigung, aber das ist einfach falsch. Ob die WB "enabled" ist hat überhaupt nichts damit zu tun ob sie lädt.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kein Problem, musst dich nicht entschuldigen!
Der Code stammt ja eh von Dir: #15466
Ich habe hier nur den Variablenbezug geändert.😇

PS: Eigentlich bräuchte man im Code nur noch Register 1000 zum Lesen/Schreiben der Leistung. Könnte man in 1 Variable zusammenführen (elwaRegGetSetPower oder nur elwaRegPower).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ich habe hier nur den Variablenbezug geändert.

Genau. Geht halt nicht.

Copy link
Contributor Author

@docolli docolli Jul 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Das verstehe ich leider nicht warum der Bezug auf einen anderen (korrekteren) Variablennamen ein Problem sein soll?
Ursprünglich hat man über elwaRegSetPower (1000) geschrieben (...Set...) und über elwaRegPower (1074) die Leistung gelesen.
Das ist aber schon seit einiger Zeit geändert und die Leistung wird auch aus Register 1000 gelesen, daher hat elwaRegPower seitdem auch den Wert 1000.

An dieser Stelle im Code wird aber doch gar nicht geschrieben, sondern die Leistung gelesen, also wäre hier die Verwendung der Variable elwaRegPower korrekter. Auch wenn beide auf Register 1000 verweisen und es eigentlich keinen Unterschied macht.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nochmal. Ob die Elwa lädt oder nicht (=Power) ist für die Frage ob sie laden darf (=Vorgabeleistung != 0) völlig irrelevant!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Das könnt nur ihr sagen ;). Solange das bei SetPower>0 auf 0-2 geht ja :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Naja, bei SetPower>0 geht es z.B. nie auf 0, weil der Heizstab ja dadurch einen PV Überschuss mitgeteilt bekommt und in der Regel dann zu heizen beginnt.
Außer er erreicht "seine" Temperaturgrenze, dann geht er auf 3.
Aber er kann auch, bei Unterschreiten der Mindesttemperatur, von sich aus anfangen zu heizen, dann haben wir 2.

Ich habe das mal versucht mit switch-case umzusetzen, aber er heizt jetzt mit Mindestlleistung, auch wenn Mode=Off. Aber ich vermute, wenn er auf PV Überschuss wartet (Wert=0), darf ich nicht wb.enable=true machen, oder?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die Anforderung ist klar. Wenns die erfüllt dann gehts ;)

Copy link
Contributor Author

@docolli docolli Jul 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also dann diese Logik:

enabled : true = 1 / 2
enabled : false = 0 / 3 / 4

Erster Test war erfolgreich.
Wenn er jetzt aber selber anfängt zu heizen wegen Sicherstellung Warmwasser, dann wird evcc einen "charger logic error: disabled but charging" Fehler melden. Aber das ist ja vermutlich sogar korrekt und so gewollt.

Edit: Blödsinn von mir! Dann meldet er Status 2 und das ist dann auch enabled=true. Sollte also keinen Fehler melden.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

...und bei enabled=off sollte er auch kein WW machen!

@andig andig marked this pull request as draft July 16, 2025 09:19
@andig andig added the heating Heating label Jul 16, 2025
docolli and others added 3 commits July 17, 2025 20:20
charger/mypv.go Outdated
Comment on lines 210 to 213
0, // standby
3, // set temperature reached
4, // no control signal
5: // red cross flashes
Copy link
Member

@premultiply premultiply Jul 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Riecht mir zu stark nach weiterhin falschen Verständnis von
a) Freigabe liegt vor - Energiebezug erlaubt,
b) Freigabe liegt nicht vor - eigenmächtiger Energiebezug unter allen Umständen untersagt.

Suggested change
0, // standby
3, // set temperature reached
4, // no control signal
5: // red cross flashes
0: // standby

Was sollen offensichtliche Fehlerzustände oder Thermostatabschaltungen damit zu tun haben?

Copy link
Contributor Author

@docolli docolli Jul 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, aber ich tu mir einfach schwer die Logik dahinter vollständig zu verstehen und auf einen Heizstab zu übertragen. 😟

Ich hatte das jetzt so verstanden, dass eine Freigabe ein von der Wallbox definierter Zustand ist und mit dem Zustand des LP in evcc synchron sein muss. Freigabe heißt, die Wallbox kann, wenn man ihr eine Leistungsvorgabe schickt, laden, weil ein Auto angesteckt ist, eine RFID Karte erkannt wurde usw.
So habe ich das jetzt auf die Heizstab Zustände angewendet und deshalb auch z.B. die 3 (Solltemperatur erreicht) in die Liste aufgenommen. In diesem Zustand kann der Heizstab keine Leistung annehmen (ins Register 1000 kann man schon schreiben, aber da wird nix passieren) und wird auch nicht anfangen zu heizen.

Oder ist das ein von evcc definierter Zustand, ob man einer Wallbox aktuell eine Leistungsvorgabe schicken kann, weil eine Freigabe vorliegt? Und evcc blockiert bzw. gibt die Wallbox entsprechend per Befehl frei.

Der Heizstab kann aber im Gegensatz zu einer Wallbox doch immer Energie beziehen. Ich KANN es ihm auch nicht per Befehl verbieten, soweit ich das weiß! Wenn der Anwender beim Heizstab die WW Sicherstellung aktiviert hat (und das macht Sinn ! Ich nutze das als "Sicherheitsnetz", falls die WP mal ausfällt und das WW zu kalt werden droht), dann wird er auch ohne evcc anfangen zu heizen, wenn die Mindesttemperatur unterschritten ist. Also auch wenn der LP auf Aus steht. Wenn wir durch LP = Aus auch die WW Sicherstellung deaktivieren, werden wir vermutlich einige verängerte Anwender haben, weil das überraschend kommt, dass evcc den Heizstab so tief beherrscht.

PS: Eventuell könnte man dieses Register zur kompletten Deaktivierung des Heizstabs nutzen:

1081 R/W Device state 0 / 1

Das lässt sich lesen, aber auch beschreiben! Laut Doku sollte man da aber nicht mehr als 1x pro Tag schreiben, weil sonst der interne Speicher stärker altert und früher defekt ist.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Und evcc blockiert bzw. gibt die Wallbox entsprechend per Befehl frei.

Richtig. Und nicht anders.

Keine Freigabe heisst keine Freigabe.
Und über Enabled muss evcc lesen können ob der via Enable vorgegebene Freigabezustand vom Gerät verstanden und eingehalten wird.

Copy link
Contributor Author

@docolli docolli Jul 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Neue Erkenntnisse:
Register 1081 kontrolliert den gesamten Heizstab und wäre prinzipiell das was für Enable/Disable gesucht wird! Auf 0 gesetzt ist der Heizstab komplett deaktiviert.

Großer Nachteil: Die vom Heizstab gebotenen Funktionen "WW Sicherstellung / Boost" und "Legionellenschutz" sind damit auch nicht mehr aktiv !!!
Das passt dann zwar zur evcc Vorgabe "keine Freigabe = absolut keine Leistungsaufnahme", aber damit unterbindet evcc eventuell kritische Dinge wie "alle 3 Tage um 12h auf 70°C heizen, um gefährliche Legionellenbildung zu vermeiden".
Diese Freiheit sollte der MyPV Heizstab haben, zeit- bzw. temperaturabhängig selbst anfangen zu heizen, auch wenn der LP in evcc gerade auf "Aus" steht oder anderweitig keine Freigabe hat.
Wenn wir das so strikt wie gefordert implementieren, werden wir Ärger mit Anwendern bekommen, weil evcc wichtige Funktionen deaktiviert hat. Das würde ich nicht vorschlagen, es so zu tun.

Bleiben wir also beim Status und so wie @premultiply vorgeschlagen hat, beachten wir nur die Werte 1/2 und 0, von denen wir sicher wissen, was sie für den Freigabezustand bedeuten. Beim Rest geben wir den gemerkten Zustand zurück.

Oliver Merk added 2 commits July 19, 2025 14:22
@docolli docolli marked this pull request as ready for review July 21, 2025 15:45
Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @docolli - I've reviewed your changes and they look great!


Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
heating Heating
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy