Loadpoint: don't abort update on unavailable §14a dimmer state - #32126
Loadpoint: don't abort update on unavailable §14a dimmer state#32126github-actions[bot] wants to merge 1 commit into
Conversation
A charger's Dimmer.Dimmed() legitimately returns api.ErrNotAvailable when the LPC scenario isn't announced (e.g. eebus-ohpcf when the partner has no active consumption limit). Treating this as fatal aborted the whole per-cycle update before status/session tracking, leaving the loadpoint permanently stuck as disconnected despite real charger activity.
|
Danke für die schnelle Rückmeldung! Zur Formulierung "Absturz": das war ungenau von mir – es handelt sich nicht um einen Crash/Panic, sondern um evccs Fail-Fast-Verhalten beim Start: [main] FATAL ... will attempt restart in: 15m0s. Der Dienst beendet sich also kontrolliert und wartet dann 15 Minuten bis zum nächsten Startversuch. Mein eigentlicher Punkt war, dass dabei alle Ladepunkte (auch die unabhängige Wallbox) für diese 15 Minuten mit ausfallen, weil ein einzelner, optionaler Ladepunkt (Wärmepumpe) beim Verbindungsaufbau hängt. Zur Version: Ich laufe auf einem Nightly-Build, Version 0.311.1 (im Formular-Feld "Version" hatte ich das versehentlich leer gelassen, sorry – trage ich nach). Ich stelle euch gerne ein Trace-Log nach, das beide Szenarien zeigt: den fehlgeschlagenen Verbindungsaufbau, der zum FATAL/Restart führt, und Ich setze eebus und den betroffenen Ladepunkt auf Trace-Level, reproduziere beide Fälle und hänge das Log hier an, sobald ich es habe. Danke auch für den Link zu #32132 – macht Sinn, das im größeren Kontext zu betrachten. Sieht so aus, als würde Punkt 6 dort genau mein "Problem 1" (Startup-Blockade durch einen einzelnen fehlerhaften Ladepunkt) sauber einordnen. Ich verfolge das Issue mit und liefere wie besprochen das Trace-Log für #32125 nach, sobald ich es habe. |
|
Hier das angeforderte Trace-Log (eebus:trace), auf den relevanten [eebus]-Bereich reduziert – enthält keine Zugangsdaten oder personenbezogenen Daten mehr (Original-Export hatte auch Tesla-Fahrzeugtelemetrie enthalten, die ich vor Veröffentlichung entfernt habe). Zeitraum: 14:56–15:55 Uhr, durchgehend während normalem Betrieb (kein Neustart in diesem Fenster). Ergebnis: EEBus-Verbindung zur Wärmepumpe (SKI 43dbc05f...) ist die ganze Stunde durchgehend stabil: Heartbeats laufen auf Protokollebene alle ~2s (heartbeatTimeout: PT4S), dazu alle ~60s ein ma-mpc-DataUpdatePower-Event (Leistungsmessung). Kein einziger Verbindungsabbruch. Leider enthält dieses Fenster keinen Neustart, daher fehlt die exakte [lp-2] ERROR dimmed: not available-Zeile selbst (die wird offenbar nur einmalig beim ersten Auftreten geloggt, nicht pro Zyklus wiederholt). Falls gewünscht, kann ich einen weiteren Mitschnitt ab einem gezielten systemctl restart evcc nachreichen, um genau diesen Moment einzufangen. Version: 0.311.1 (nightly) Evcc eebus trace extract 20260725 |
|
Hier das angeforderte Trace-Log (eebus:trace), auf den relevanten [eebus]-Bereich reduziert – enthält keine Zugangsdaten oder personenbezogenen Daten mehr (Original-Export hatte auch Tesla-Fahrzeugtelemetrie enthalten, die ich vor Veröffentlichung entfernt habe). Zeitraum: 14:56–15:55 Uhr, durchgehend während normalem Betrieb (kein Neustart in diesem Fenster). Ergebnis: EEBus-Verbindung zur Wärmepumpe (SKI 43dbc05f...) ist die ganze Stunde durchgehend stabil: Heartbeats laufen auf Protokollebene alle ~2s (heartbeatTimeout: PT4S), dazu alle ~60s ein ma-mpc-DataUpdatePower-Event (Leistungsmessung). Kein einziger Verbindungsabbruch. Leider enthält dieses Fenster keinen Neustart, daher fehlt die exakte [lp-2] ERROR dimmed: not available-Zeile selbst (die wird offenbar nur einmalig beim ersten Auftreten geloggt, nicht pro Zyklus wiederholt). Falls gewünscht, kann ich einen weiteren Mitschnitt ab einem gezielten systemctl restart evcc nachreichen, um genau diesen Moment einzufangen. Version: 0.311.1 (nightly) Evcc eebus trace extract 20260725 |
|
Danke für das Trace-Log, @dsrhash. Es beantwortet die Frage, warum der Fehler überhaupt auftritt — und die Begründung in der PR-Beschreibung stimmt so nicht. Das LPC-Szenario wird sehr wohl announced. Aus dem Log: {"useCaseName":"limitationOfPowerConsumption"},{"useCaseVersion":"1.0.0"},
{"useCaseAvailable":true},{"scenarioSupport":[1,2,3,4]}Szenario 1 ist Die eigentliche Ursache ist die Antwort des Wolf Link auf den {"loadControlLimitListData":[{"loadControlLimitData":[[
{"limitId":1},{"isLimitChangeable":true},{"isLimitActive":false}]]}]}Kein // eebus-go/usecases/eg/lpc/public.go:58
value, err := loadControl.GetLimitDataForId(*limitDescriptions[0].LimitId)
if err != nil || value.Value == nil {
return // resultErr == api.ErrDataNotAvailable
}Das wird in Fix dafür upstream: enbility/eebus-go#255. Betrifft dieselbe Stelle in Zur Failsafe-Frage: Failsafe ist hier nicht der richtige Fallback. Anmerkungen zum Log:
Damit ist die Frage, ob diese PR so bleiben soll, offen: mit dem Upstream-Fix sieht der Ladepunkt den Fehler gar nicht mehr. Das Verschlucken von 🤖 Generated with Claude Code |
|
Danke für die gründliche Analyse, das ist eine viel präzisere Erklärung als meine Race-Vermutung! Macht Sinn – dann bin ich gespannt auf den Upstream-Fix in eebus-go. Zur Klarstellung bezüglich des Startup-Problems (Problem 1): Es tritt bei mir nicht bei jedem Neustart auf, sondern nur sporadisch, wenn der Wolf Link im Netzwerk gerade nicht sauber erreichbar ist (z. B. nach dessen eigenem Reboot oder bei DNS-/mDNS-Hängern) – im aktuellen Mitschnitt lief die Verbindung entsprechend unauffällig durch. Falls hilfreich, kann ich versuchen, gezielt einen Moment abzupassen, in dem der Wolf Link kurzzeitig nicht erreichbar ist, und dafür ein separates Trace-Log liefern. |
|
Die Analyse ist falsch. Wolf hält sich nicht an die Spec. Es muss einen "Value" übergeben und Claude antwortet hier klar falsch. Es sollte die Spec dazu nehmen. Der Fehler ist bei Wolf. |
|
@DerAndereAndi der Upstream Request dazu ist enbility/eebus-go#255, der wäre damit also falsch. Unabhängig davon wird in evcc jetzt "data not valid" ignoriert. |
fixes #32125, depends on #32132
Dimmed()legitimately returnsapi.ErrNotAvailablewhen a charger's LPC (§14a) scenario isn't announced by the EEBus partner (e.g.eebus-ohpcf/eebus-ohpcf-wolfvaillantwhen the heat pump has no active consumption limit — seecharger/eebus-ohpcf.go, tested inTestOHPCF_LPC_Dimmed_Gating).Loadpoint.Update()treated any error fromDimmed()as fatal for the whole update cycle and returned immediately, before reachingupdateChargerStatus(), connected/charging publishing, and session tracking. For a charger where the LPC scenario is never announced, this made every single update cycle bail out early, so the loadpoint stayed permanently "not connected" and no session was ever tracked, despite real charging/consumption happening.This matches the pattern already used elsewhere in
loadpoint.go(e.g. phase switching), whereapi.ErrNotAvailablefrom an optional capability is ignored rather than treated as fatal.Fix: only abort the update cycle for genuine errors from
Dimmed(); ignoreapi.ErrNotAvailableand continue the normal update (skipping only theDim()write attempt, since it would fail the same way).This does not address the separate concern raised in the issue about a single failing charger blocking the startup of all loadpoints for 15 minutes — that is a broader startup/init design question (see
cmd/setup.goconfigureChargers/configureDevices) left for maintainer discussion.🤖 Generated with Claude Code