Repository navigation
Conversation
Signed-off-by: Segran <goran@andersson-stehag.se>
Signed-off-by: Segran <goran@andersson-stehag.se>
Signed-off-by: Segran <goran@andersson-stehag.se>
Field-test report — 2026-10-20 (partial pass)Tested commit Passed / observed
Not yet demonstrated in the field
Outcome: Partial field-test pass; no regression observed in the tested conditions. No code changes proposed from this test. A conclusive EV-headroom field check would require diagnostic visibility into EV demand, qualified realized EV power, and battery targets before/after the clamp. |
Hardware follow-up — 22 October 2026: distinguish Core admission from Easee startupTest environment: released Core v0.155.0-beta.1 with local Easee driver 1.3.12. This is not a test of PR head 387b7d7 and does not establish acceptance of this PR's allocation change. Times below are Europe/Stockholm.
The late 6 A start is consistent with an Easee firmware/allocation delay, but the internal cause and the effect of repeated resume commands remain unproven. A single-resume long-duration comparison remains useful. The early no-power warning preceded real delivery and should be reviewed separately from allocation correctness. No automatic over-request startup boost or safety-limit change was introduced. Temporary commands were removed after the tests and ordinary planning resumed. These observations do not close the outstanding EV-priority/headroom acceptance criteria. |
Consolidated hardware and Core investigation — 21–22 October 2026This consolidates the later results, including the follow-up to the earlier comment. Partial hardware success; outstanding faults remain. Keep acceptance open. #1763 is the primary location because allocation/admission is central; the feedback findings below are relevant to #1762 but are not claims about its unmerged implementation. Environment and evidence boundaryThe later runs used released Core v0.155.0-beta.1 and locally modified Easee 1.3.12, not this PR's head and not the older v0.154.1-beta.2 backport described above. Consequently, these results neither validate nor disprove this PR's exact implementation. Configured main fuse: 25 A, three-phase. No raw vendor/Pixii control bypass was used. Temporary holds were removed or expired and ordinary planning resumed. Times below are Europe/Stockholm. Observed successes
EV priority remains incomplete: in the battery-first run, 15 A was requested but Core later offered only 13 A with fuse_limit while Pixii recovered toward 6 kW. The last changed pilot observation was 12 A and delivery approximately 8.3 kW. Full 15 A priority and command-to-pilot propagation were not established. Direct 6 A start: delayed, not demonstrated impossibleEarlier three-minute runs ended without power; longer observation changed the conclusion:
These runs separate Core admission delay from a subsequent charger-side pilot delay. They support delayed 6 A startup, but do not establish the charger's internal mechanism or exclude influence from repeated resume commands. A single-resume long observation is still outstanding. Core admission delay reproduced in softwareSource review found that recordEVOffers uses the driver's declared power freshness interval as a command-settling interval. Easee declares power_max_age_s=180. Recent command rises can therefore remain reserved as potentially unobserved load after a zero-power pause. The admission calculation combines that reservation with measured/thermal phase loading and a 35-second restart dwell. A controlled test using the released source's existing evMeterSite fixture reproduced a long admission delay. Physical application delay was 5 s, telemetry delay 10 s and house load 900 W in both cases. Sequence: 25 s at a 10350 W request, 25 s pause, then 4140 W request.
Both simulations reached a 4140 W offer; pre-start measured phases were approximately 1.30 A. This demonstrates sensitivity to the freshness/settling coupling and closely explains the long field admission delay, but is not an exact tick-level household replay. The restart dwell may accrue during the pause, so it is not necessarily an additional 35 s after the request. No production timeout was shortened. Review separate telemetry-validity and command-propagation semantics. Any correction needs protection against delayed execution, stale/silent meters, rebound and multiple chargers; command acknowledgement alone must not release reserved headroom. Feedback inconsistency relevant to #1762The owner's FTW screenshot at 03:37:34 shows:
This screenshot predates the 03:40:09 pilot transition and is consistent with the measured waiting period. It is not evidence of stale app rendering after startup. The reported current-limit reason is an observation, not a proven explanation of the delay. Review contradictory messaging and distinguish waiting, observed limits and confirmed cause. Remaining acceptance
Evidence retained locally: source-timestamped JSONL captures, Core/driver logs, plans and per-test reports. Approximately 3-second capture intervals and asynchronous vendor/site observations cannot exclude faster transients; unchanged vendor values are not independent new measurements. No recorded phase current exceeded 25 A in the cited runs. The controlled replay and field observations are separate evidence, not a complete hardware safety proof. |
An accepted, stable EV current offer could be counted as if the car already consumed that power. When the car drew less, optional battery charging could retain the space the EV still needed. For example, a 10.35 kW offer with only 4.155 kW delivered let Pixii keep 9.383 kW despite a projected busiest phase of 29.5 A on a 25 A site.
This change keeps the missing EV demand reserved before optional battery charging, including Charge now. It fixes allocation separately from the diagnostic wording in #1762 / #1761.
Change
clampEVBatteryHeadroomcredits only the smaller of the lowest recent EV offer and qualified measured EV delivery. A stable offer alone no longer proves that its load is inside the site meter.The existing phase guard keeps its 1 A working margin where tighter than the configured margin. No fuse settings or user priorities are changed.
Evidence and tests
The original regression commit reproduces two captured-household cases on master
94c04d385d2a0dd11f05547454d29509f942ef50: 10.35 kW offered / 4.155 kW delivered, and 4.14 kW offered / zero delivered. Both were red before the fix and now pass. A fully realized-offer control preserves battery allocation.Additional tests cover fresh, missing, stale, future, misaligned, faulted, offline, unavailable and cached-source power, negative/excessive readings, multiple chargers, full reservation without delivery, and independence from battery-device readings. Existing command-pending, unseen battery reduction, asymmetric phase, export relief and joined-EV recovery/control-loop tests remain in the control suite.
The allocation replay assumes balanced three-phase EV/battery power at configured 230 V and unchanged other loads. It is not an Easee hardware simulator.
Hardware validation — 21 October 2026
Installed the PR head
387b7d7as a local backport in the affected ARM64 installation, running a locally packaged Corev0.154.1-beta.2. This is not a deployment of the PR branch verbatim: the package also retains earlier local diagnostics and a separate vehicle-SoC replanning correction. The later hardware runs used a separate, locally patched Easee driver 1.3.11. Neither that driver correction nor the SoC correction is part of this PR.Manual EV priority and battery backoff/recovery
During ordinary planned battery charging on 21 October, Europe/Stockholm:
The capture contains 61 samples, roughly five seconds apart, with vendor source timestamps plus FTW command, power and phase-current observations. Cloud and Modbus samples are not exactly simultaneous. These observations support manual EV priority/backoff/recovery on this installation; they do not prove every transient or internal reservation invariant.
Separate charger-start finding
An earlier 6 A / 4.14 kW test reached approximately 10.86 kW. A subsequent source-timestamped capture showed the charger briefly reporting a 32 A dynamic limit and 16 A physical-pilot observation around resume, before settling to 6 A. This is a separate charger-start/current-control issue, not evidence that the allocation correction itself resolves Easee start behavior.
A local Easee-driver candidate reasserts the intended current before/after resume and on a later poll. With that candidate, a clean 180-second 6 A test held approximately 4.145 kW for over two minutes, maximum observed pilot 6 A and maximum grid phase current 8.308 A, then expired to 0 W under the plan. Another attempt needed a second resume before charging started. The complete capture corrected an earlier preliminary interpretation of that attempt as no-start; delayed cloud observations showed delivery before the stop completed. Do not infer universal charger-start acceptance from the successful run.
Scheduled charging — overnight read-only follow-up
All times below are Europe/Stockholm on 21 October 2026. These observations come from the locally modified installation described above, not an unchanged PR checkout.
At the final check, the plan contained charging through 05:30, 06:00–06:15 and 07:00–07:30; the final end time had moved from 07:15 to 07:30. These replans mean the originally scheduled windows cannot be treated as fixed acceptance scenarios.
Evidence: FTW minute history, Pixii phase-current series (10-second aggregates retaining maxima), loadpoint command/feedback state, incident planning snapshots and Easee driver logs. All reads succeeded. Repeated unchanged vendor power values are not independent physical measurements; site-meter load and session-energy integration support delivery, but no independent EV energy meter was used. Minute aggregates and asynchronous sources limit transition timing. No recorded phase current exceeded the configured 25 A limit; this does not exclude unobserved faster transients. The overnight checks changed no control, settings, goals or driver and initiated no vendor login. Both one-shot monitors have completed and are disabled.
Remaining acceptance
Keep this PR draft. Manual battery backoff/recovery and one stable 6 A run are supported by the captures, and scheduled EV delivery was observed with a substantial delay. Reliable scheduled starts, full requested 15 A delivery, and clean stop/return-to-plan behavior are not accepted. The cause of acknowledged starts with no power, the approximately 8.3 kW delivery under a 10.35 kW request, and the brief post-04:45 restart remain unresolved. The evidence does not yet separate charger/vehicle behavior, driver resume handling and plan/deadline decisions.
Battery discharge-to-idle behavior, fresh vehicle-SoC-driven replanning and broader hardware coverage remain outstanding. The vehicle's own 64% reading remained stale; the later approximately 69.1% planning SoC was inferred, not a fresh vehicle observation. The allocation regression tests remain valid evidence for the scoped code correction, but these mixed-environment hardware runs do not establish complete end-to-end acceptance.
Validation of the fix
make verify: passed on commit387b7d7; Docker-context validation skipped because no Docker daemon was available.go test -race ./internal/control: passed.TestJoinedEVWaitsForMeasuredBatteryBackoffThenResumes: passed.make verify GO_TEST_TIMEOUT=30mpassed on the Pi using RAM-backed test data; this is not production SD-card performance evidence. Race tests forinternal/cars,internal/telemetryandinternal/controlpassed on macOS after the Pi race runtime could not start (unsupported VMA range). These checks cover the local package and must not be presented as testing an unchanged PR checkout.Repository hygiene follow-up
EV power qualification now lives in
telemetry.Store.OnlineEVControlPower, including the health and source-age checks; control adds only site/EV time alignment and per-demand reservation bounds. No telemetry-read exception or CI waiver was added. The exactcheck-telemetry-reads.shcheck passes locally and both Ubuntu/macOS GitHub jobs are green.make verifypasses on the updated head. This describes the earlier validation; current CI status must be checked independently.