Skip to content

Commit ed6bb53

Browse files
malysclaude
andcommitted
docs(CP-003): conclude the validation run
Three bundles, 51 samples. Of eleven probed energy properties exactly one answers — PERF_VEHICLE_SPEED. The other ten return no CarPropertyValue on every read, and state of charge, range, outside temperature and the climate block reach the app through the SAIC vendor managers instead. Battery power is not pending, it is absent: EV_INSTANTANEOUS_CHARGE_RATE is declared and never published on this generation, now recorded in EVHardware's catalogue as such. The CP-030 model can therefore never train from it here, and anything needing kWh stays unavailable and has to say so. The arrival forecast does not need it. Two units were settled and one bug found by settling them: speed reports km/h and was converted twice, and the navigation adapter's remaining distance is in metres. The table says "not observed" where the evidence is stationary-only rather than guessing a cadence from a value that never changed, and the verdict lists the scenarios still uncaptured. Bumps EVHardware to 02dca34. Refs: CP-003 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent e13bdd6 commit ed6bb53

2 files changed

Lines changed: 61 additions & 18 deletions

File tree

‎analysis/CP-003_energy_signal_validation.md‎

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -139,29 +139,39 @@ Never copy a conclusion from one row into another.
139139

140140
## Per-signal conclusions
141141

142-
Allowed availability values: `validated`, `unavailable`, `intermittent`, `not tested`. Units and
143-
semantics must be observed or remain `unknown`; do not infer them from field names.
142+
Allowed availability values: `validated`, `available`, `never published`, `intermittent`,
143+
`not tested`. Units and semantics must be observed or remain `unknown`; do not infer them from
144+
field names.
145+
146+
**What the 2026-09-04 evidence does and does not cover.** Three bundles, all captured stationary
147+
with the HVAC off, 51 samples between them. That is enough to say whether a signal publishes at
148+
all and enough to settle the two unit questions below, and it is *not* enough to state an update
149+
cadence or a working range for anything: nothing changed while the car stood still. Rows below
150+
say `not observed` where that is the honest answer rather than guessing from one value.
151+
152+
The scenarios the protocol asks for and this evidence does not have: HVAC on max, urban
153+
accelerate/regen, motorway at 110 and 130, a gradient, and a charging session.
144154

145155
| Signal | Generation | Availability | Unit/semantics | Sign | Median update | Valid range | Evidence files |
146156
|---|---|---|---|---|---|---|---|
147-
| socPercent | pending | not tested | unknown | n/a | unknown | unknown | pending |
148-
| rangeKm | pending | not tested | unknown | n/a | unknown | unknown | pending |
157+
| socPercent | SWI68-29958-1300R67 | available | percent of charge | n/a | not observed (0 changes, stationary capture) | 56,1 % held; full range not exercised | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
158+
| rangeKm | SWI68-29958-1300R67 | available | km, the vehicle's own remaining range | n/a | not observed (0 changes, stationary capture) | 278 km at 56,1 %; not exercised | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
149159
| speedKmh | SWI68-29958-1300R67 | validated | **km/h at the property** — not m/s as AAOS specifies | magnitude taken; signed in reverse | 1000 ms (sampler-bound) | 0 at standstill; 34–36 km/h mean over two town drives | 2026-09-04 bundle: `trips-SWI68-*.json`, `evidence-SWI68-*.json` |
150-
| batteryPowerKw | pending | not tested | unknown | unknown | unknown | unknown | pending |
151-
| batteryTempCelsius | pending | not tested | unknown | n/a | unknown | unknown | pending |
152-
| batteryEnergyKwh | pending | not tested | unknown | n/a | unknown | unknown | pending |
153-
| batteryCapacityKwh | pending | not tested | unknown | n/a | unknown | unknown | pending |
160+
| batteryPowerKw | SWI68-29958-1300R67 | **never published** — declared, no `CarPropertyValue` in 51 samples | n/a | n/a | n/a | n/a | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
161+
| batteryTempCelsius | SWI68-29958-1300R67 | **never published** — declared, no `CarPropertyValue` in 51 samples | n/a | n/a | n/a | n/a | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
162+
| batteryEnergyKwh | SWI68-29958-1300R67 | **never published** — declared, no `CarPropertyValue` in 51 samples | n/a | n/a | n/a | n/a | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
163+
| batteryCapacityKwh | SWI68-29958-1300R67 | **never published** — declared, no `CarPropertyValue` in 51 samples | n/a | n/a | n/a | n/a | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
154164
| odometerKm | SWI68-29958-1300R67 | unavailable via `PERF_ODOMETER` | n/a | n/a | n/a | n/a | 2026-09-04 bundle: `no CarPropertyValue` on every read |
155165
| nav_adapter_odometer_km | SWI68-29958-1300R67 | validated | km, total mileage from `SaicNav` (adapter service, not `PERF_ODOMETER`) | n/a | getter, polled | 22564 km, stable at standstill | 2026-09-04 bundle: `evidence-SWI68-*.json` |
156-
| outsideTempCelsius | pending | not tested | unknown | n/a | unknown | unknown | pending |
157-
| cabinTempCelsius | pending | not tested | unknown | n/a | unknown | unknown | pending |
158-
| chargingStatus | pending | not tested | unknown | n/a | unknown | unknown | pending |
159-
| chargePortConnected | pending | not tested | unknown | n/a | unknown | unknown | pending |
160-
| parked | pending | not tested | unknown | n/a | unknown | unknown | pending |
161-
| climate.powerOn | pending | not tested | unknown | n/a | unknown | unknown | pending |
162-
| climate.acOn | pending | not tested | unknown | n/a | unknown | unknown | pending |
163-
| climate.autoOn | pending | not tested | unknown | n/a | unknown | unknown | pending |
164-
| climate.econOn | pending | not tested | unknown | n/a | unknown | unknown | pending |
166+
| outsideTempCelsius | SWI68-29958-1300R67 | available | °C | n/a | not observed (0 changes, stationary capture) | 39,5–40,0 °C, a car parked in the sun | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
167+
| cabinTempCelsius | SWI68-29958-1300R67 | **never published** — declared, no `CarPropertyValue` in 51 samples | n/a | n/a | n/a | n/a | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
168+
| chargingStatus | SWI68-29958-1300R67 | available | int; 0 while not charging | n/a | not observed (0 changes, stationary capture) | 0; charging session not captured | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
169+
| chargePortConnected | SWI68-29958-1300R67 | **never published** — declared, no `CarPropertyValue` in 51 samples | n/a | n/a | n/a | n/a | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
170+
| parked | SWI68-29958-1300R67 | available | boolean, from gear | n/a | not observed (0 changes, stationary capture) | true; gear transitions D→R→P seen in an earlier bundle | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
171+
| climate.powerOn | SWI68-29958-1300R67 | available | boolean | n/a | not observed (0 changes, stationary capture) | false; HVAC-on scenario not captured | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
172+
| climate.acOn | SWI68-29958-1300R67 | available | boolean | n/a | not observed (0 changes, stationary capture) | false; HVAC-on scenario not captured | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
173+
| climate.autoOn | SWI68-29958-1300R67 | available | boolean | n/a | not observed (0 changes, stationary capture) | false; HVAC-on scenario not captured | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
174+
| climate.econOn | SWI68-29958-1300R67 | available | boolean | n/a | not observed (0 changes, stationary capture) | false; HVAC-on scenario not captured | 2026-09-04 bundles (3): `evidence-SWI68-*.json` |
165175
| climate.recirculationOn | pending | not tested | unknown | n/a | unknown | unknown | pending |
166176
| climate.fanLevel | pending | not tested | unknown | n/a | unknown | unknown | pending |
167177
| climate.fanLevelMax | pending | not tested | unknown | n/a | unknown | unknown | pending |
@@ -222,3 +232,36 @@ SWI68 is listed.
222232
`getVehicleSpeedKmh`, so every telemetry upload from this car has carried a speed 3.6× too
223233
high. It picks the fix up with the next submodule bump; the history already sent to ABRP does
224234
not correct itself.
235+
236+
## Verdict — 2026-09-04
237+
238+
**CarPropertyManager is nearly silent on this car.** Of eleven probed energy properties, one
239+
answers: `PERF_VEHICLE_SPEED`. The other ten return `no CarPropertyValue` on every read, in
240+
every bundle. State of charge, range, outside temperature and the whole climate block do reach
241+
the app — through the SAIC vendor managers, not through the Android property layer. The
242+
firmware-aware layer is doing exactly the job it exists for.
243+
244+
**Battery power is not pending, it is absent.** `EV_INSTANTANEOUS_CHARGE_RATE` is declared and
245+
never published on SWI68-29958-1300R67. Recorded in `EVHardware`'s
246+
`CarPropertyEvidence.isNeverPublished`, which is a different claim from "not validated yet" and
247+
reads differently to a driver: an unvalidated signal may start working, an absent one will not.
248+
249+
Two consequences follow, and neither is a defeat:
250+
251+
- The **CP-030 energy model can never train** from battery power on this generation. Anything
252+
that needs kWh — consumption in kWh/100 km, the HVAC attribution, the post-trip breakdown —
253+
stays unavailable here and must say so rather than showing a modelled number.
254+
- The **arrival forecast does not need it**. CP-041 takes a rate in percent of charge per
255+
kilometre, from the vehicle's own range or from recorded trips, and both inputs read.
256+
257+
**Two units were settled, and one bug found by settling them.** `PERF_VEHICLE_SPEED` reports
258+
km/h and was being converted a second time, inflating every recorded distance by 3.6 — a 2.4 km
259+
route stored as 8.46 km. `getRemainingDistance` on the navigation adapter reports metres. The
260+
independent reference for the first was the adapter's odometer, which reads where
261+
`PERF_ODOMETER` does not.
262+
263+
**What this run did not cover.** HVAC on max, urban accelerate/regen, motorway at 110 and 130,
264+
a gradient, and a charging session. None of them can revive battery power — it is absent, not
265+
quiet — but they would establish the update cadence and working ranges the table leaves at
266+
`not observed`, and a charging session is the only way to characterise `chargingStatus` and
267+
`chargePortConnected`. Worth a follow-up run; not worth blocking anything on.

0 commit comments

Comments
 (0)