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. |
…it (#1793) #1776 counts an EV order as flowing until the charger can have applied it, using the highest order sent within the charger's response time. That included orders a later cut had already replaced. With Easee Cloud's declared 180 s, a charge at 10,350 W, a 25 s pause and a 4,140 W request kept 10,350 W reserved: the restart waited 2 min 47 s with fuse_limit while the phases read about 1.3 A. Reported on a real Easee/Pixii site by segran2 in #1763, reproduced in evMeterSite. The charger follows its latest order, and the meter shows its draw until a cut lands, so a cut ends the reservation of the higher orders before it. A run of rises still counts its highest, which is its latest, so stacked rises stay covered. The restart now comes after 12 s. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…otection (#1800) * test(control): field matrix for EV charging and fuse protection v0.155.0-beta.1 passed our tests and failed on field sites the same night. We tested our defaults: fixed 3p, no step table, planned charging stubbed, and chargers that applied an order at once or exactly when they declared. Easee Cloud applies in 30-60 s and declares 180 s. TestSiteSimFieldMatrix runs Core's EV charging and fuse protection in the closed loop against 314 cases: the field reports (the help report of 22 Oct, the site in #1763, the home box) with every charger timing, a sweep over fuse, phase mode, step table, car phases and house load, and a timing sweep over every request. Planned charging now runs through the real controller: a minimal planner sends the slot's Wh and on-power, from the steps main.go gives the planner. Each case runs in a synctest bubble, so command evidence, the API's verdict and live Home use run on the plant's clock. Invariants, every second: the fuse holds; FTW's limit as before; no fuse cut while every phase is under the limit; no second cut while an unapplied cut covers the overage; a planned charge delivers 90 % of what the fuse allows; planned charging and Charge now never put a three-phase charger on one phase; a charger drawing against its order reads not following; Home use stays measured while every device reads. testdata/sitesim_field_known.txt lists the rows that fail on master and the fix that turns each green. The sim gains the Easee driver's auto split and phase hold, and outside steps no longer count as our raise. The matrix skips -race builds: it finds nothing there and runs 15 times slower. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(control): the write mode logs what it would fail * test(control): probe rows from the three-phase review Twenty-four rows from #1799's review and fix D: a charger whose table holds only one-phase levels (max 5,520 W, auto), phase mode unset with a goal and a 2,300 W plan slot, surplus-only with a goal and 2.5 kW of export, a held 1p order raised to 3p beside a phase at 20 A, the help report's site with a one-phase car, and a long L1 step under a three-phase car. Surplus cases get the planner's PV forecast as pickSurplusSteps reads it, so the one-phase rule is judged as Core makes it: one phase only when the next 30 min stay below three phases at 6 A. Surplus cuts follow the export and are no longer judged as fuse cuts. The trace also logs a change of reason. New label hold3p: the app sends Charge now as 3p for an auto loadpoint, and a charger whose table stops below 4,140 W gets 0 W. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Latest follow-up — 22 October 2026: single-resume 6 A hardware testResult: the approximately five-minute startup delay also occurs with only one Core-issued resume. This updates the earlier outstanding single-resume test. It does not validate this PR's allocation change. A temporary, locally built Core diagnostic based on released v0.155.0-beta.1 used the local slot label v0.155.0-beta.9001 (not an official release). Original local Easee driver 1.3.12 was retained. A positive manual hold could enable diagnostic_single_resume only for a bounded duration of at most 600 seconds. Suppression happened in Core's recovery scheduler, not through failed/fabricated driver acknowledgements. Fuse/load-protection timing, admission clamps, stop and fault handling were unchanged. All times Europe/Stockholm:
Interpretation: repeated Core resume attempts are not necessary for the five-minute delay to occur. The result supports a delay beyond Core admission, but does not establish the internal Easee firmware/cloud mechanism, exclude all vehicle interaction, or eliminate every current-reassertion effect. One controlled run is not universal startup acceptance. Software validation before deployment: control, loadpoint, telemetry and API suites passed; targeted loadpoint/API race tests passed. Tests covered a single attempt, suppression after an uncertain failed attempt, automatic return to ordinary recovery after expiry, bounded API validation and visibility, and retained zero-power/manual-stop dispatch. Earlier failed method remains excluded: the Lua duplicate-refusal experiment caused Core's normal driver-fault escalation and return to autonomous default. That run cannot answer the startup-delay question. The FTW screenshot at 04:17:27 showed this induced command failure, not a confirmed Easee hardware fault. The “charger reports a fault” wording warrants separate feedback review (#1762). Restoration verified: native launcher rollback restored original Core v0.155.0-beta.1 and its exact original binary checksum; original Easee 1.3.12 checksum also matched. Temporary hold removed (manual_active=false), ordinary plan/deadline control resumed and fallback rollback timer disabled. No protection waiting times were changed. Installation/restart transitions are excluded from the actual paused-start test. Evidence retained locally: source-timestamped JSONL capture, driver logs, diagnostic code/tests and hardware-run report. Approximately three-second sampling and asynchronous sources limit transient/timing conclusions. Full EV/Pixii priority, stable requested-current delivery, import-limit edge cases and export-phase acceptance remain open. |
Retest on released v0.155.1-beta.1 — 22 October 2026Follow-up to the single-resume investigation. Both this PR and #1762 remain unmerged; these are observations of the released version, not hardware acceptance of either PR head. Local Easee driver 1.3.12 retained; EV charge cost web-only patch installed. No Core diagnostic mode active. All times Europe/Stockholm. Pause/restart admission improved in this run
Easee delay remains
Short 7500 W import-ceiling retest
Outstanding allocation acceptance Removed the test hold and restored the import ceiling to its prior disabled value; final readback: v0.155.1-beta.1, manual_active=false, commanded_reason=plan, EV 0 W. A separate cap-restoration watchdog was armed as a fallback. No driver, persistent goal or fuse/load-protection setting changed. Support evidence prepared: a standalone Swedish report consolidates four timed direct-6-A runs, 7 A-to-6 A comparisons, source/receipt timestamp limits and specific questions for Easee. Exact model/firmware still need verification; no claim of a confirmed internal firmware cause. The document has not been sent to Easee. Raw captures and report retained locally; no credentials included here. See the companion feedback update in #1762. Keep remaining acceptance open. |
Hardware follow-up — 23 October 2026: reservation candidate and Easee allocation tracePartial acceptance only. The local candidate keeps the EV command at 15 A while limiting optional Pixii charging, but the latest trace reproduces a separate fall in Easee's own allocated current and pilot. This is not complete end-to-end acceptance or validation of the unchanged PR head. Environment and source scope: local ARM64 Core slot Candidate software checks: full All following times are 23 October, Europe/Stockholm:
The first run's 25.33 A sample must remain part of the safety record; successful later runs do not erase it or exclude faster unsampled transients. In the 01:36 run, the conditional full-EV projection reached about 24.70 A; this was an asynchronous projection, not an actual measured phase current or proof that the 24 A working margin always held. New localization: allocated current falls before/with the pilotThe final run added circuit allocation observations 70–72, temperature and related limits to the normal Easee observation request, and recorded every outgoing driver command/settings POST with safe numeric payload fields.
Interpretation: this is more specific than a power-only mismatch: Easee reported a lower circuit allocation and advertised pilot despite a 15 A FTW request. Car-only refusal to consume the offered power does not explain the lower advertised pilot by itself. The underlying Easee/site allocation decision, another controller, firmware and charger/vehicle interaction are not yet separated. A confirmed firmware defect is not established. The startup 12 A limit also shows that simultaneous Pixii charging is not necessary for every instance of reduced allocation. Cleanup: both manual test holds were released at 02:01:49.799–.800. Original Easee Lua was restored byte-for-byte; health was ok with four drivers ok. The ordinary plan subsequently requested 10.35 kW EV charging, actual about 8.87 kW, battery 0 W; manual holds were inactive. Therefore cleanup returned to ordinary plan charging, not necessarily idle. Local Core candidate remains installed. Evidence limits / remaining work: raw JSONL site/EV measurements, vendor source timestamps, allocation fields and complete command trace are retained locally. Sources are asynchronous and unchanged vendor values are not independent physical samples. Internal reservation before/after values were not instrumented, so observed battery limits do not isolate this clamp from all other Core clamps. Review/publish the local source follow-ups separately; retain full hardware acceptance as open; request Easee allocation/site-control audit for 00:00:21Z and 00:00:32Z on 23 October. Firmware observation: 344. This run does not retest the separate direct-6-A delay. Companion feedback implications are recorded in #1762. Neither PR should be closed or treated as fully hardware-accepted on this evidence. |
Comparison with #1789 — 23 October 2026CI for this PR's 4372354 has completed: every executed check passed; conditional jobs remain explicitly skipped. Compared that head with #1789 at c60da23, using the same input test file and small adapters for the replaced allocation function/history layout. Production code was unchanged. Nine inputs were evaluated both at allocation and through complete Separate the policy difference from the pending-battery regression:
The first row is the documented reservation-policy disagreement. The highlighted row is different and uses full EV delivery:
The new invariant assertion fails on #1789 at allocation, complete manual dispatch and ordinary idle dispatch; it passes on #1763. Healthy drivers, battery SoC 50%, charge/discharge caps 10/5 kW and fresh aligned readings were used. The complete-dispatch fixtures disable the separate slew limiter and dispatch interval so this tests the fuse clamp's own admission decision. This is a conditional balanced-response calculation with unchanged house/EV loads, not measured hardware overcurrent, fuse operation or proof of the duration of an excursion. A configured slew limiter and subsequent correction can change the physical trajectory. Code inspection is consistent with the result: #1789 subtracts pending battery import from room for positive charging increases, while its existing-discharge retention calculation does not subtract that pending import. #1763's follow-up accounts for it when releasing relief as well. The selected existing #1789 scenario/phase/relief/battery-fuse tests pass. Its different simulator version was not presented as an identical run of the 340-case matrix. No #1789 code was modified, no hardware commands were issued and the physical FTW remains on restored official v0.155.1-beta.1. Recommendation: carry this pending-import regression into the selected implementation and resolve it separately from the EV-under-delivery reservation policy. This does not require merging all of #1763 into #1789. Keep the policy/integration decision open; the comparison alone is not authority to close either PR. Exact common test, adapters and raw result logs are retained locally. Common test SHA-256: |
|
The independent pending-battery regression identified in the comparison is now addressed in #1816, stacked directly on #1789 ( |
Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>
Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>
An accepted EV current offer could be counted as if the car already consumed that power. Optional battery charging could then occupy the room the EV still needed. For example, a 10.35 kW offer with about 4.2 kW delivered must not be treated as 10.35 kW already included in the site meter.
This PR reserves the unmet EV demand before optional battery charging, including Charge now, and keeps that protection through pending pause and battery-relief transitions. Feedback wording is tracked separately in #1762.
Implementation
The branch now merges official
v0.155.1-beta.1in6d7b714, preserving the earlier PR commits. Follow-up commit4372354480671b1d22df1c80a6f5c5d045ac4e30incorporates the previously local transition fixes plus the reviewed telemetry-accessor change and additional regressions. These follow-ups are now in the PR branch; they are no longer only a local hardware candidate.Validation on 4372354 — 23 October 2026
make verify: passed, including all Go suites, simulation/regression matrix, script checks, vet and build. Docker context and live Avahi checks were skipped because no Docker daemon was available.git diff --check: passed.A complete control/telemetry/loadpoint race run also passed during integration; the final commit was verified with the targeted race command above after the final meter-snapshot cleanup.
Hardware evidence and limits
The detailed 23 October allocation/command trace and earlier reports remain in the discussion. They used a locally packaged
v0.155.1-beta.9002candidate, not an installation built from final PR commit 4372354.Full EV delivery was observed with 1.5 kW battery charging, and stepped EV/Pixii runs showed Core retaining a 15 A EV command while limiting the battery. Easee nevertheless lowered its own allocated current and pilot; a complete driver command trace found no coincident FTW pause, phase change or reduced current command. The exact Easee allocation decision remains unresolved.
Keep the aborted battery-first run's 25.33 A measured sample in the safety record. Later runs peaked at 18.95, 23.74 and 24.13 A; these do not erase the earlier sample or exclude unsampled transients. Internal reservation before/after values were not captured on hardware. Final-commit hardware acceptance, wider import/export scenarios and the separate 6 A start delay remain open. This update performs software tests only and changes nothing on the installed FTW.
Integration conflict — keep draft
#1789 deletes
clampEVBatteryHeadroomand explicitly adopts a different reservation policy; #1782 also touches the phase calculation. This branch continues the owner-requested #1763 correction on the released baseline and does not merge, overwrite or validate those PRs. Resolve the control-policy/dependency choice before merge; these branches must not be treated as independently compatible fixes. No reviewers were automatically requested and no merge/release is performed.Pending import across batteries (24 October 2026)
Keep pending battery import when that battery has no target in the current dispatch. A fresh reading from another battery can no longer clear its reservation. The existing command expiry and EV reservation policy stay in place.
This follow-up merges master
2d7c8eba41f0d247c8833029fc33bd60f32aa04binto the existing branch and adds the fix, a changeset andTestEVBatteryPendingImportAcrossTargets.Validation on
7361f9d0818a106789b97e37fca09954afd105a7:make verify, control/telemetry/loadpoint race,make e2e,npm testand the telemetry-read check pass.s10-25ands15bat-16, through the real Core binary, Modbus and OCPP.Docker-context and live-Avahi checks were skipped on this host. Simulator results do not establish physical equipment or Easee firmware acceptance. The PR remains draft; no merge, release or box update was made.