Repository navigation
fix: Ladepunkte nutzen die Abschaltschwelle der Verbraucher - #3984
Merged
LKuemmel merged 1 commit intoSep 21, 2026
Merged
Conversation
calc_switch_off_threshold() liest fuer alle Lasten surplus.consumer.switch_off_threshold. surplus.vehicle.switch_off_threshold ist konfigurierbar, wird migriert und in der Debug-Ausgabe angezeigt, aber im Regelalgorithmus nirgends gelesen. Die Migration verschiebt den alten pv_charging/switch_off_threshold nach surplus/vehicle/switch_off_threshold. Damit regeln bestehende Anlagen seit dem Update mit dem neu angelegten Consumer-Default 0 statt mit dem konfigurierten Wert.
s0170071
marked this pull request as ready for review
September 20, 2026 13:46
LKuemmel
approved these changes
Sep 21, 2026
AlexanderHa98
pushed a commit
to AlexanderHa98/core
that referenced
this pull request
Sep 28, 2026
) calc_switch_off_threshold() liest fuer alle Lasten surplus.consumer.switch_off_threshold. surplus.vehicle.switch_off_threshold ist konfigurierbar, wird migriert und in der Debug-Ausgabe angezeigt, aber im Regelalgorithmus nirgends gelesen. Die Migration verschiebt den alten pv_charging/switch_off_threshold nach surplus/vehicle/switch_off_threshold. Damit regeln bestehende Anlagen seit dem Update mit dem neu angelegten Consumer-Default 0 statt mit dem konfigurierten Wert.
AlexanderHa98
pushed a commit
to AlexanderHa98/core
that referenced
this pull request
Sep 29, 2026
) calc_switch_off_threshold() liest fuer alle Lasten surplus.consumer.switch_off_threshold. surplus.vehicle.switch_off_threshold ist konfigurierbar, wird migriert und in der Debug-Ausgabe angezeigt, aber im Regelalgorithmus nirgends gelesen. Die Migration verschiebt den alten pv_charging/switch_off_threshold nach surplus/vehicle/switch_off_threshold. Damit regeln bestehende Anlagen seit dem Update mit dem neu angelegten Consumer-Default 0 statt mit dem konfigurierten Wert.
LKuemmel
added a commit
that referenced
this pull request
Sep 30, 2026
* dimm kit: improve error handling, handle deleted output devices (#3868) * dimm kit: improve error handling, handle deleted output devices * review, complete logging * Apply batched suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * fixes * add pytest --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * PV-Reset: NO_CHARGING_ALLOWED blockiert den robustness-Reset nicht mehr (#3968) Nach PR #3966 blockierte ein eingesteckter, aber unterhalb der Einschaltschwelle wartender Ladepunkt (Zustand NO_CHARGING_ALLOWED) weiterhin dauerhaft den Reset von reserved_surplus/released_surplus - das ist aber der mit Abstand häufigste, langlebigste Zustand eines PV-ladenden Fahrzeugs. Jede Reservierung wird jedoch bereits beim Übergang in diesen Zustand freigegeben (siehe zB Counter.reset_switch_on_off()), sodass er nie mit einer noch offenen Reservierung erreicht wird - er gehörte also nie in die Blockierliste. Betroffen war zB ein Fall, in dem eine verwaiste reserved_surplus-Reservierung aus einem unterbrochenen Vorgang nie mehr zurückgesetzt wurde, wodurch die Einschaltschwelle dauerhaft nicht mehr erreicht werden konnte (PV-Laden startet gar nicht mehr) - siehe Diskussion. Ersetzt die 5 Einzelvergleiche + Chargepoint/Consumer-Fallunterscheidung + plug_state-Sonderfall durch eine einzige Zustandsliste der tatsächlich reservierungshaltenden Zustände (PERFORMING_PHASE_SWITCH, PHASE_SWITCH_DELAY, SWITCH_OFF_DELAY, SWITCH_ON_DELAY), verifiziert gegen jede +=/-=-Stelle in counter.py/ev.py/chargepoint.py. references #3908 (reply in thread) * fix: external_openwb chargepoint crashes when fault_state topic is missing (#3970) get_values() indexed received_topics[fault_state] directly, including inside its own KeyError handler - if the paired internal chargepoint hadn't published fault_state yet (startup, reconnect), the fallback crashed on the exact same missing key instead of handling it. * consumer: fix hierarchy, default usage (#3975) * consumer: fix hierarchy, default usage * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * fix: external_openwb occasionally missed retained MQTT topics under load (#3976) start_finite_loop()'s fixed 1s collection window left little margin for connection/handshake overhead when the paired internal chargepoint was busy (eg mid-charge), occasionally causing get_values() to miss a retained topic despite retain=True. Made the timeout configurable (default unchanged for the other 17 call sites) and doubled it for external_openwb specifically, which has to reliably collect ~20 topics over a real network hop rather than one or two local values. * Systembericht Verbraucher (#3956) * add consumers; reorganize structure * improve * fix: Ladepunkte nutzen die Abschaltschwelle der Verbraucher (#3984) calc_switch_off_threshold() liest fuer alle Lasten surplus.consumer.switch_off_threshold. surplus.vehicle.switch_off_threshold ist konfigurierbar, wird migriert und in der Debug-Ausgabe angezeigt, aber im Regelalgorithmus nirgends gelesen. Die Migration verschiebt den alten pv_charging/switch_off_threshold nach surplus/vehicle/switch_off_threshold. Damit regeln bestehende Anlagen seit dem Update mit dem neu angelegten Consumer-Default 0 statt mit dem konfigurierten Wert. * removing meter-only consumers from load management priority (#3998) * removing meter-only consumers from load management priority * review * extend for self_controlled * Potential fix for pull request finding 'Preserve pre-existing empty groups during migration' Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * build UI (#3999) * Update: Hausverbrauch Zähler (#3991) * EVU auf Auto entspricht Ja * fix * avm: fix consumer switch_on/off using unresolved ain, fix bare return in session lookup (#3987) * build UI (#4000) * Feature negative dc charging (#3795) * Add Bidi to instant-charging * Update Koala-UI min/max DC-Sollleistung * fix * Build Themes * avm consumer: invertierte Session-Refresh-Bedingung beheben (#4001) ensure_valid_session_id() erneuerte die Session nur, wenn check_valid_session_id() False war - die Funktion liefert aber "ist ungültig" zurück, nicht "ist gültig". Dadurch wurde nie erneuert, sobald session_id einmal None oder abgelaufen war: alle Anfragen liefen dauerhaft mit sid=None und schlugen mit HTTP 403 fehl. Umbenannt zu session_id_expired(), passend zum tatsächlichen Rückgabewert. * Peak Filter: bei Rückwärtssprüngen auf Wert größer/gleich Höchststand warten (#4007) * Peak Filter: bei Rückwärtssprüngen auf Wert größer/gleich Höchststand warten * review * build UI (#4008) * Consumer: Add Daikin, EGO and EMS-ESP (#3969) * Add Daikin, EGO and EMS-ESP consumer modules * daikin: Air2Air-Fixes aus Review (Lena, PR #3969) + neues Altherma-Modul Air2Air: Name korrigiert ("Daikin Air2Air (HomeHub EKRHH)"), METER_ONLY entfernt (keine Leistungsmessung verfügbar). Neu: daikin_homehub_altherma - eigenes Modul für Daikin Altherma, da eigene Modbus-Register (EKRHH Installer Reference Guide 4PDE744838, Kap. 9, separat von Air2Air/Kap. 10). Register gegen das offizielle Handbuch geprüft: - switch_on/off: Reg 56 (Smart-Grid-Modus), analog zu Air2Airs Reg 1000 - set_power_limit: Reg 58 (Allgemeine Leistungsbegrenzung, gilt laut Handbuch unabhängig vom Smart-Grid-Modus, anders als Reg 57) - update: Input-Reg 51 (Stromverbrauch Wärmepumpe) - Altherma kann im Gegensatz zu Air2Air tatsächlich Leistung melden, daher METER_ONLY hier sinnvoll * Consumer: Add Mitsubishi and Gree AC modules (#3973) * Add Mitsubishi and Gree AC consumer modules * Mitsubishi/Gree: METER_ONLY entfernt, da keine Leistungsmessung Beide Module haben keine update()-Funktion und liefern somit keine Leistungsmessung; ConsumerUsage.METER_ONLY war daher nicht zutreffend. * Gree: tcid im Bind-Request ergänzt (Review Lena) cid muss beim Binden konstant "app" sein, tcid identifiziert das Zielgerät per MAC - bestätigt gegen tomikaa87/gree-remote und cmroche/greeclimate. * build UI (#4010) * Fixed Hours Tariff: migrate fixed-hours weekdays to Python weekday format (#4009) * Hierarchie: Entferne mit Verbraucher verknüpften Zähler (#4011) * Hierarchie: Entferne mit Verbraucher verknüpften Zähler * flake8 * Speicher-Vorrang bei Erholung von Mindest- bis Maximal-SoC (#3986) * bat_all: restore Speicher-Vorrang beim Erholen von Mindest-SoC bis Maximal-SoC * bat_all: Speicherleistung nicht ans Fahrzeug weitergeben, wenn Entladung nicht erlaubt ist * build UI (#4025) * Add ACLs consumer and load management topics (#3964) * Add acls * Add load management prio to status * fix colors theme: leftover pv_charging topic paths from PR #3812 topic migration (#3946) * Build Themes * Consumer: Add Kermi, LG Therma V, Luxtronik (#3971) * Add Kermi, LG Therma V and Luxtronik consumer modules * kermi, luxtronik: Skalierungsfaktoren korrigiert (Review #3971) Kermi Reg 301 (PV-Überschuss): war /10, muss *10 sein. Luxtronik Reg 10301 (el. Leistung): war *10, muss *100 sein. Reg 108 (Kermi) war bereits korrekt. * Sonnenbatterie: add OperationMode Optimization (#3769) * add Mode Optimization * check for valid OperatingMode * Fix load management single phase netting and Bidi discharge currents (#4012) * Lastmanagement: eigenen Ladestrom bei ein-/zweiphasigem Laden nicht mehr als Fremdlast zählen _set_current_left() entschied per min(element_current) < 0, ob der Strom eines Ladepunkts als Verbrauch oder Einspeisung zählt. Bei ein-/zweiphasigem Laden reicht dafür schon minimales negatives Messrauschen auf einer ungenutzten Phase - der eigene Ladestrom wurde dann nirgends vom Zähler-Rohwert abgezogen, das Lastmanagement hielt die eigene Ladung für Fremdlast (falsche "Maximalstromstärke erreicht"/Schieflast-Meldungen, siehe Discussion #3908). _set_power_left() hat exakt dasselbe Problem nicht, da dort schon die Gesamtleistung statt einzelner Phasenströme geprüft wird - jetzt angeglichen. * Bidi-Entladung: eigene Hardware-Stromgrenze des Ladepunkts durchsetzen check_min_max_current() rief check_cp_max_current() (setzt dc_max_current des Ladepunkt-Templates durch) nur im Lade-Zweig auf, nicht beim Entladen (BIDI_CHARGING, required_current < 0) - die vom Fahrzeug gemeldete max_discharge_power wurde beachtet, die eigene Hardwaregrenze des Ladepunkts nicht. Bug in #3795, check_cp_max_current() behandelt negative Werte bereits korrekt (Vorzeichen wird erhalten). * build UI (#4026) * Improve Monthly/Yearly Log (#3829) * Improve Log * Move generate_totals-Logger in logger.py * Fix * Fix Circular Import * Update .gitignore * fix * Ensure ramdisk folder exists * retrigger Copilot * Add Copilot suggestions * fix * Fix Tesla/Powerwall data handling and improve robustness of control loop (#3232) * tesla/powerwall: implement load management, add fail-fast handling and gateway diagnostics - add structured HTTP error handling in PowerwallHttpClient - distinguish transport, HTTP and JSON parsing failures - support fail_fast=False for non-critical requests - track cycle_failed and cookie_renewed state across one polling cycle - add fail-fast handling in device.py - stop remaining Tesla component updates once a critical Powerwall request fails - log native TCP connection state diagnostics via /proc/net/tcp(/tcp6) - emit periodic session / connection health logs - keep cookie reuse, but mark startup + reauth cycles explicitly - reduce /api/status traffic in counter.py - fetch firmware only after startup or after a new auth cookie was negotiated - treat /api/status as non-critical so it cannot fail the whole cycle - keep import/export counters based on aggregate["site"]["energy_imported/exported"] - do not use summed per-phase energy counters as meter source - keep /api/meters/site for phase details only - add derived fallback currents and signed power factors from P/Q/U when Tesla/Neurio currents are 0 - expose additional diagnostics such as frequency / serial number - add throttled debug logging to compare aggregate counters with per-phase sums - restore aggregate-based site counters so load management works correctly again * tesla/powerwall: simplify device/http client and keep cookie reauth handling - remove session / connection diagnostics and analysis-only helpers - remove /proc-based connection stats and periodic session logging - keep fail-fast handling for the Tesla update cycle - keep cookie reuse and 401/403 reauthentication flow - keep support for non-critical requests via fail_fast=False - reduce implementation closer to upstream while preserving Powerwall-specific fixes * tesla/powerwall: simplify device/http client and keep local current fallback - remove analysis-only diagnostics and session tracking from device.py - remove connection stats and other debug-only helpers - simplify http_client.py to a minimal request wrapper - keep cookie reuse and 401/403 reauthentication flow in device.py - use fail-fast handling in device.py via SingleComponentUpdateContext(..., reraise=True) - move Tesla-specific robustness back into the counter module only - keep aggregate["site"]["energy_imported/exported"] as sole source for EVU counters - keep local current and power factor calculation when Neurio/Tesla returns only 0 currents - remove /api/status handling from counter.py - fix formatting / lint issues (newline at EOF, spaces instead of tabs) * Fix Tesla error handling and compatibility note - use central openWB component error handling - remove Tesla-specific fail-fast handling - rely on the shared HTTP response hook - remove obsolete local API compatibility warning * se standard error handling in Tesla counter - remove _safe_float and module-specific defaults - propagate HTTP errors to central error handling - keep compatibility fallback for missing phase data - calculate phase currents from P/Q/U when Tesla reports zero currents * Fix Tesla module lint errors * Adjust Tesla API compatibility note * Error status table (#3943) * add error and warning icons to chargepoint table * Align warning icons - remove extra warning column * No tooltip for mobile - ellipsis title only if truncated * Build Themes * add consumer temperature readings to consumer card (#3974) * add consumer temperature readings to consumer card * check if temperature data is present * use getValueObject for formatting * Build Themes * Consumer: Add M-TEC, Weishaupt, Xtherma (#3972) * Add M-TEC, Weishaupt and Xtherma consumer modules * M-TEC: Reg 707 durch evcc-Quelle bestätigt, Kommentar aktualisiert Reg 707 (elektrische Leistungsaufnahme) ist in evcc's mtec.yaml als holding register mit scale 1 gelistet, identisch zu unserer Implementierung. * Weishaupt: Reg 33126 entfernt (nicht verifizierbar), Xtherma: SG-Ready on/off ergänzt Weishaupt: Reg 33126 (el. Leistungsaufnahme) ist weder in der offiziellen Datenpunktliste (83807301) noch in einer ausgereiften Community-Implementierung (OStrama/weishaupt_modbus) zu finden - update()/METER_ONLY entfernt, SollwertPV (Reg 40002, offiziell dokumentiert) bleibt unverändert. Xtherma: Reg 60 (SG-Ready-Modus) ergänzt switch_on/switch_off (SUSPENDABLE_ONOFF), eigener 30min-Throttle laut Protokoll. * Fix charge cost calc (#4022) * fix chargelog energy source calculation * Add Test * fix circular error --------- Co-authored-by: LKuemmel <76958050+LKuemmel@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: SeaSpotter <florian.horch@gmail.com> Co-authored-by: ndrsnhs <156670705+ndrsnhs@users.noreply.github.com> Co-authored-by: s0170071 <33855380+s0170071@users.noreply.github.com> Co-authored-by: GitHub Actions <actions@github.com> Co-authored-by: BrettS <168732306+Brett-S-OWB@users.noreply.github.com> Co-authored-by: NicoP-codeing <nico.prenzel@pn-systeme.de>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Counter.calc_switch_off_threshold()liest für alle Lasten die Abschaltschwelle der Verbraucher — auch für Ladepunkte:chargemode_config.surplus.vehicle.switch_off_thresholdexistiert, ist in der UI konfigurierbar, wird übersetdata.pygepflegt und increate_debug.pyausgegeben — im Regelalgorithmus wird es aber nirgends gelesen.Woher es kommt
Nicht aus der Umbenennung: #3812 (d07e2b9) hat den Topic verschoben und dabei
surplus_config.vehicle.switch_off_thresholdkorrekt beibehalten.Neun Minuten später hat #3808 (9f8e435, „Verbrauchersteuerung") die Signatur von
chargepoint: Chargepointaufload: Loadverallgemeinert und dabeivehicle.durchconsumer.ersetzt, ohne Fallunterscheidung:Bei der Abschaltverzögerung hat derselbe Commit genau die Fallunterscheidung eingeführt, die der Schwelle fehlt —
_get_switch_off_delay_by_load(). Die beiden Methoden stehen incounter.pydirekt untereinander.Bei der Einschaltschwelle stimmt die Aufteilung ebenfalls:
calc_switch_on_power()bekommt sie überget_pv_config_py_load()lastabhängig. Das entspricht dem, was in #3908 beschrieben ist:Nur die Abschaltschwelle fällt heraus.
Warum das Anlagen im Feld trifft
Die Migration verschiebt den alten Ladepunkt-Wert genau in das Feld, das nicht gelesen wird:
Bis dahin lag unter
pv_charging/switch_off_thresholddie Abschaltschwelle der Ladepunkte. Nach dem Update steht sie untersurplus/vehicle/…und wird nicht mehr gelesen; stattdessen greiftsurplus/consumer/switch_off_threshold, das die Migration frisch mit0anlegt (update_config.py:668).Damit ist die Einstellung „Abschaltschwelle" für Fahrzeuge wirkungslos: sie wird gespeichert, migriert, angezeigt — und ignoriert.
Warum das bisher kaum auffällt
Der Default ist in beiden Feldern
0, und war es vor der Umbenennung auch. Betroffen ist also nur, wer den Wert bewusst verändert hatte; je nach Vorzeichen schaltet die Ladung seither zu früh oder zu spät ab. Wer nie etwas eingestellt hat, merkt nichts — deshalb taucht das in den Rückmeldungen zu 2.3.0-Alpha.2 wohl auch nicht als eigener Punkt auf.Änderung
_get_switch_off_threshold_by_load(), aufgebaut wie das direkt darüber stehende_get_switch_off_delay_by_load(). Für Verbraucher ändert sich nichts.Der
feed_in_limit-Zweig bleibt unangetastet: er rechnet mitvehicle.switch_on_threshold, undChargemodeConfigSurplusConsumerhat dazu kein Gegenstück.Test
test_calc_switch_off_threshold_by_loadprüft beide Lastarten gegen unterschiedliche Schwellen. Ohne die Änderung schlägt der Fall „Ladepunkt" mitassert -50 == -200fehl — der Ladepunkt bekommt die Verbraucherschwelle —, der Fall „Verbraucher" ist grün. Das trennt Fix und Regression sauber.Dieselben 17 Fehlschläge (
ocpp_test.py,charge_template_test.py), sie bestehen aufmasterunverändert.flake8sauber.