Repository navigation
docs(debug-journal): map the IOG supervision bounce symptom into the octopus row (GH#5390) - #5397
Merged
Merged
Conversation
…); 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
marked this pull request as ready for review
October 5, 2026 18:17
Contributor
There was a problem hiding this comment.
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🤖 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 currentmain(ee401eca, v9.3.5).Folded in
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_fuzzyonadjust_charge_rate()/adjust_discharge_rate()), the band is 5% of the per-minute ceiling in watts, low power floors atmax(400, ...)(find_charge_rate()), the register is left at 0 W by export withcharge_discharge_with_rate(Huawei) and by export freeze without a timed pause, and the existingadjust_charge_rate4case 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.rate_min/rate_max(free/saving/Axle loaders precede the final rate scan, so an Octopus free session zeroesrate_min,cheap_threshold = rate_min × 1.2 = 0pinsis_cheapfalse) while the sensor's own published attributes come fromrate_min_base/rate_max_base— the attributes are the shape the band should follow. Verified onmarginal.py(:153-154 vs :160-164).plan_car_charging()ranks on import price only while eachlow_rateswindow already carries anexportaverage (built withalt_rates=self.rate_export,fetch.py) that onlyplan_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.int(value) // 100(read/write asymmetry;_discovery_export_limit()duplicates the split),test_solis.py::test_publish_entities_export_power_unit_conversionpins 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/_dischargethe exceptions.write_tolerance_watts()/12charge,/25discharge) 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.minute_data()clamps dips but only zeroes recovery ramps steeper thanMAX_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; thediff > max_incrementzeroing at utils.py:1552), with a 0-PV-day counter-argument ("just publish 0" tripspv_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 — verifiedhold_counter_dip(), the 24 h reset rule, the X1-AC 0-PV publish and the M2-fields note are all already in the row.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 needsgit tag --containsbefore being accepted as a regression — the 5390 claim was arithmetically impossible as a regression") went into the Version-drift trap bullet.min(rate, inverter_limit × inverter_loss)(and a hybrid with PV can legitimately exceed viabattery_rate_max_charge_dc, so a fix can't be a bare min()) — display-only.automatic_config()does not bind it; no per-inverter max-SoC arg exists and the planner's only ceiling is globalbest_soc_max— "published ≠ bound", tree-widemaxsocgrep 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)
car_charging_rateaccept a list:car_list_arg()splits the base-key list across per-car slots, a per-car suffixed scalar wins over its slice, and a list on a per-car suffix is ignored (falls back to the base list's slice). The row now keeps the pre-fix(car): accept car_charging_rate as a per-car list in apps.yaml #5383float(list)TypeErrormechanism for older logs and citestest_fetch_config_options.pypinning the three new rules.candidate_aios or list(all_inverters)last-resort branch was removed byeaef6e61(2026-10-04, "defer auto-config until battery telemetry"): a fleet with no battery-capable telemetry now defers auto-config with a warn (_auto_configuredstays False so it retries), while an empty-serial slot that does report battery telemetry is still bound. The empty-serial trap itself survives on the battery-telemetry shape.Dropped
minute_datadip/recovery asymmetry and the 0-PV down-day note survived as folds, where not yet covered.Verification
maxsoc/Wallbox/zappialready present).teslemetry, which aborts 00:00–01:00 local via the previously documented UTC-vs-local bug intest_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, …).🤖 Generated with Claude Code