Context
With a fixed LAN ambient sensor deployed (Ecowitt gateway ingest, zebraengine/tesla-wall-connector#36), its readings take the top tier — they outrank the car sensor and the handle proxy, and the thermal model trusts them completely. That promotes sensor placement from an installation detail to a correctness concern.
The model's premise is handle_temp = ambient + rise. If the ambient sensor is close enough to the connector to be warmed by it, then measured "ambient" climbs whenever charging heats the surrounding air — which cancels out part of the very rise the model exists to measure.
Impact
Two failure modes, both quiet:
- Derate under-prediction, in the unsafe direction. An inflated ambient during a charge shrinks the apparent rise, so the forecast under-estimates how hot the handle will actually get and the suggested cap comes in too high.
- Corrupted degradation baseline. The per-segment fits feed the drift watch. A placement-induced rise suppression looks exactly like an install that is not degrading, so a genuine trend could be masked indefinitely.
How to check
No new instrumentation needed — fit_sessions() already records ambient_drift_c (measured ambient at the end of a load window minus the start) on every session fit, exposed via /api/thermal.
A positive ambient_drift_c is not on its own evidence of contamination: an uninsulated garage genuinely does warm over an afternoon charge, and that is real ambient change the model should be tracking. The tell is the time constant:
- Real garage warming — slow (tens of minutes to hours), does not reverse when current stops.
- Sensor contamination — tracks the handle closely on a scale of minutes, and collapses quickly once charging ends.
The per-sample ambient history is retained, so both can be checked directly against the handle trace for the same window rather than inferred from the aggregate.
Possible outcomes
- Clean — document the placement guidance in the README so the next install gets it right by default: beside or below the cable run rather than above it (a hot handle's convective plume rises), a few feet of horizontal offset, close enough to share the connector's air mass but not close enough to be heated by it, and mounted with an air gap on a low-mass surface rather than pressed against thermal mass.
- Contaminated — relocate, and consider surfacing this as an explicit diagnostic (e.g. flag fits whose
ambient_drift_c correlates with charge current) so the failure is loud instead of silent.
Notes
Worth resolving before leaning on measured-ambient fits for degradation conclusions, since the corruption mode is specifically one that hides a real problem rather than inventing a false one.
🤖 Generated with Claude Code
Context
With a fixed LAN ambient sensor deployed (Ecowitt gateway ingest, zebraengine/tesla-wall-connector#36), its readings take the top tier — they outrank the car sensor and the handle proxy, and the thermal model trusts them completely. That promotes sensor placement from an installation detail to a correctness concern.
The model's premise is
handle_temp = ambient + rise. If the ambient sensor is close enough to the connector to be warmed by it, then measured "ambient" climbs whenever charging heats the surrounding air — which cancels out part of the very rise the model exists to measure.Impact
Two failure modes, both quiet:
How to check
No new instrumentation needed —
fit_sessions()already recordsambient_drift_c(measured ambient at the end of a load window minus the start) on every session fit, exposed via/api/thermal.A positive
ambient_drift_cis not on its own evidence of contamination: an uninsulated garage genuinely does warm over an afternoon charge, and that is real ambient change the model should be tracking. The tell is the time constant:The per-sample ambient history is retained, so both can be checked directly against the handle trace for the same window rather than inferred from the aggregate.
Possible outcomes
ambient_drift_ccorrelates with charge current) so the failure is loud instead of silent.Notes
Worth resolving before leaning on measured-ambient fits for degradation conclusions, since the corruption mode is specifically one that hides a real problem rather than inventing a false one.
🤖 Generated with Claude Code