Live evidence (PROD, 2026-08-08 ~15:45)
Charge mode Off, SEM enforcing it correctly (commanded_current: 0.0 A), observer mode off, car at ~100 % — and the EV card shows Status: Charging · 140 W, binary_sensor.sem_ev_charging: on.
Root cause
coordinator/sensor_reader.py (three sites): the physics inference ev_charging or ev_power > 100 marks charging whenever the meter reads over 100 W, even when the plug/charging sensors say off. That inference exists for the right reason — a lying plug sensor during a REAL charge (#616 class) — but a real charge cannot be below the 6 A minimum (~1.4 kW single-phase, ~4.1 kW three-phase). 140 W is charger/vehicle standby draw, common on a KEBA with a full car, and 100 W is far below the line that separates the two.
Fix direction
Raise the inference threshold to something no real charge can be under (e.g. 500 W — still catches every genuine charge, never a standby trickle), or additionally require that SEM has not itself commanded 0 A/disabled. All three sites (2078, 2968, 3353) plus a check for downstream consumers (session tracking, notifications, flow attribution) — the threshold feeds more than the badge.
Scope
1.7 lane — shipped behavior, unrelated to the 1.8 planner branch (reproduced on it, but the sites predate it).
Live evidence (PROD, 2026-08-08 ~15:45)
Charge mode Off, SEM enforcing it correctly (
commanded_current: 0.0 A), observer mode off, car at ~100 % — and the EV card shows Status: Charging · 140 W,binary_sensor.sem_ev_charging: on.Root cause
coordinator/sensor_reader.py(three sites): the physics inferenceev_charging or ev_power > 100marks charging whenever the meter reads over 100 W, even when the plug/charging sensors say off. That inference exists for the right reason — a lying plug sensor during a REAL charge (#616 class) — but a real charge cannot be below the 6 A minimum (~1.4 kW single-phase, ~4.1 kW three-phase). 140 W is charger/vehicle standby draw, common on a KEBA with a full car, and 100 W is far below the line that separates the two.Fix direction
Raise the inference threshold to something no real charge can be under (e.g. 500 W — still catches every genuine charge, never a standby trickle), or additionally require that SEM has not itself commanded 0 A/disabled. All three sites (
2078,2968,3353) plus a check for downstream consumers (session tracking, notifications, flow attribution) — the threshold feeds more than the badge.Scope
1.7 lane — shipped behavior, unrelated to the 1.8 planner branch (reproduced on it, but the sites predate it).