Skip to content

docs(debug-journal): map the IOG supervision bounce symptom into the octopus row (GH#5390) - #5397

Merged
springfall2008 merged 2 commits into
mainfrom
bot/debug-journal-2026-10-05
Oct 5, 2026
Merged

springfall2008 merged 2 commits into
mainfrom
bot/debug-journal-2026-10-05

Conversation

@springfall2008

Copy link
Copy Markdown
Owner

🤖 Automated journal flush (triage bot) — folding a 9-candidate slice (all of today's queue; 0 left queued) into tools/debug-journal.md, every claim re-verified against current main (ee401eca, v9.3.5).

Folded in

  • GH#5381 — rate_tolerances()' 5% write-gate band swallows the 0 W → low-power move. Folded as a new symptom-table row ("battery charges nothing in a low power window straight after an export / freeze-export on a rate-register inverter"): the skip is the change-gate (within_fuzzy on adjust_charge_rate()/adjust_discharge_rate()), the band is 5% of the per-minute ceiling in watts, low power floors at max(400, ...) (find_charge_rate()), the register is left at 0 W by export with charge_discharge_with_rate (Huawei) and by export freeze without a timed pause, and the existing adjust_charge_rate4 case pins 100 W → 0 W as no-write — a fix needs a deliberate decision on the to-0W direction. Re-verified the band, the 400 W floor and the pinned test on main.
  • GH#5382 — folded into the marginal-rate-sensors row: the cheap/moderate bands read event-contaminated rate_min/rate_max (free/saving/Axle loaders precede the final rate scan, so an Octopus free session zeroes rate_min, cheap_threshold = rate_min × 1.2 = 0 pins is_cheap false) while the sensor's own published attributes come from rate_min_base/rate_max_base — the attributes are the shape the band should follow. Verified on marginal.py (:153-154 vs :160-164).
  • GH#5384 — folded into the car-charging row: plan_car_charging() ranks on import price only while each low_rates window already carries an export average (built with alt_rates=self.rate_export, fetch.py) that only plan_iboost_smart() consumes; the overlapping asks pull in opposite directions (Charge the car on forecast solar surplus #5195/Add opportunistic solar (sun-following) car charging model #4125/Using up excess solar to dynamically charge EV #632 divert-to-car vs Consider solar export value when scheduling EV charging #5384 weigh-foregone-export) — check which the reporter wants before pattern-matching.
  • GH#5385 — folded into the Solis row: CID 499 (max export power) read scales ×100 only when raw < 200 while the write is unconditional int(value) // 100 (read/write asymmetry; _discovery_export_limit() duplicates the split), test_solis.py::test_publish_entities_export_power_unit_conversion pins the threshold split (case 6: raw 200 stays 200.0) so a suite green is not unit-correctness evidence; the "apps.yaml can't override" half is by design (overwrite=True), inverter_limit_charge/_discharge the exceptions.
  • GH#5386 — folded into the GivTCP REST row: a read-back miss larger than the REST verify tolerance (write_tolerance_watts()/12 charge, /25 discharge) never converges through either layer; Predbat's REST mirror entities are the read-back, so the dump alone proves non-convergence; why the register sits at 5100 is open (stale cached Control read vs firmware/BMS cap). Added as the third instance of the rate-verify family; both theories marked open/untested.
  • GH#5388 — the generalisable half of the SolaX-counter finding: minute_data() clamps dips but only zeroes recovery ramps steeper than MAX_INCREMENT = 1.2 kWh/min, so a dip whose recovery is gentler than 1.2 kWh/min is counted in full as the day's energy — folded into the "Energy totals jump or reset" symptom row (MAX_INCREMENT confirmed 1.2 at const.py:110; the diff > max_increment zeroing at utils.py:1552), with a 0-PV-day counter-argument ("just publish 0" trips pv_calibration()'s down-day rules, solcast.py) added to the Solcast row. The SolaX-specific half is NOT re-added: PR fix(solax): hold a lifetime counter that dips rather than read the recovery as energy #5389 (fc3354f, merged 2026-10-04) already implemented the proposed fix and folded the SolaX-specific account into the SolaX row itself — verified hold_counter_dip(), the 24 h reset rule, the X1-AC 0-PV publish and the M2-fields note are all already in the row.
  • GH#5390 — two folds: (1) into the car-charging row (generic trap): re: config args are first-match-wins — resolve_arg_re() breaks on the first hit, so an alternation across two integrations consults exactly one detection sensor; (2) into the octopus row: the "battery flips Charge↔Demand with a pausing car" symptom mapped to the Partial charge from intelligent dispatch didn't treat full 30-min slot as cheap for home battery #5316/fix(octopus): keep a started IOG dispatch's half hour cheap after the car stops #5319 supervision family (3-minute not-charging trigger, 2-minute confirming grace, strip + resume), with the hourly car-kWh log lines as the ground-truth check; and the version-archaeology clause ("works on 9.x/broke on 9.y needs git tag --contains before being accepted as a regression — the 5390 claim was arithmetically impossible as a regression") went into the Version-drift trap bullet.
  • GH#5394 — new symptom row: the plan-tab tooltip charge kW shows the pre-clamp rate while the prediction clamps at min(rate, inverter_limit × inverter_loss) (and a hybrid with PV can legitimately exceed via battery_rate_max_charge_dc, so a fix can't be a bare min()) — display-only.
  • GH#5395 — folded into the Fox row: the device MaxSoc setting is published and write-back works, but automatic_config() does not bind it; no per-inverter max-SoC arg exists and the planner's only ceiling is global best_soc_max — "published ≠ bound", tree-wide maxsoc grep is the tell; siblings GE Cloud does not bind battery_min_soc, so the planner models a floor the device rejects #4832/input_number for Configurable Max SoC% #2128/Fox ESS Modbus - Setting Max SOC value #3837/Fox Cloud can overshoot the desired SoC on a forced charge #3398 noted; the device-side MaxSoc application on the write path stays marked unverified.

Existing entries corrected (each named with the merge that moved it)

Dropped

Verification

  • Pre-commit hooks: all pass (cspell reworded "upstep" → "single-read upward jump" rather than adding a dictionary entry; no dictionary changes needed — maxsoc/Wallbox/zappi already present).
  • Quick suite: all modules green except teslemetry, which aborts 00:00–01:00 local via the previously documented UTC-vs-local bug in test_teslemetry_local_weekday_follows_the_base_clock (test_teslemetry.py:2789) — reproduced again on this docs-only tree at 00:15 BST 2026-10-05, and unrelated to this diff. Every other module ran green (secrets, export_encoding, export_more_solar_warning, perf, plot, predict_pv_power, dashboard_device_class, inverter_config_sensor, model, model_kernel, kernel_parity, prediction_batch, inverter, execute, all web_/chat/agent_tools, all component suites, ge_cloud, solax, sigenergy, fox_api, all manual_, all minute_data*, rate_replicate, download, …).
  • The journal file's "Adding to this file" section asks for verified claims: each fold says what was verified and on which tree; hypotheses stay marked as such.

🤖 Generated with Claude Code

CI and others added 2 commits October 5, 2026 00:16
…); mark GH#5376 fixed by PR #5377 (v9.3.5) and GH#5366 by PR #5383; re-verify the SolaX/counter-dip entries after PR #5389; add the CID499 read/write units, marginal-band contamination, GivTCP verify-tolerance, minute-data dip asymmetry, Fox MaxSoc, car-export-blind, re:-first-match and tooltip-clamp entries

Co-Authored-By: Claude Code <noreply@anthropic.com>
…octopus row (GH#5390)

Co-Authored-By: Claude Code <noreply@anthropic.com>
@springfall2008
springfall2008 marked this pull request as ready for review October 5, 2026 18:17
Copilot AI balanced review requested due to automatic review settings October 5, 2026 18:17

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review any files in this pull request. Check if the Files changed in this pull request are included in default exclusions.

@springfall2008
springfall2008 merged commit 7e6cd27 into main Oct 5, 2026
2 checks passed
@springfall2008
springfall2008 deleted the bot/debug-journal-2026-10-05 branch October 5, 2026 18:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants