Skip to content

docs(debug-journal): fold in the 2026-10-08 queue slice (8 candidates); mark GH#4925 fixed in PR #4938; note the PR #4738 time-entity escape hatch - #5453

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

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

Conversation

@springfall2008

Copy link
Copy Markdown
Owner

Automated journal flush — bot branch bot/debug-journal-2026-10-09, built by the daily /journal-update run. All 8 queued candidates (2026-10-08) were verified against current main c073c369 before landing; 0 left queued (queue limit was 15).

Folded in — 8 of 8, none dropped

  • GH#5437 → "Too many API errors" symptom row: extended so one HA outage walking both mechanisms is recognisable — REST error counter (Too many API errors) followed by Failed HAInterface init blocks startup for 10 minutes in wait_api_started, so an HA restart costs ~12.5 min downtime #5134's init failure (Cannot initialise Home Assistant Interface, the constructor's bare raise ValueError making str(e) empty, hence the trailing comma; HAHistory: No HAInterface available on the 60-s-doubling component backoff; wait_api_started() 10-min give-up; HA interface not found). Added: fatal_error is initialised once and never cleared in-process; the full-log discriminator (repeated Predbat: Startup banners = restart loop alive but not converging, no banner = stopped-but-running); the restart wrapper lives in the separate springfall2008/predbat_addon repo (out of reach from triage sessions — read the banner pattern, not repo access).
  • GH#5438 → Octopus row: vehicle-catalogue lookups match by make+model name, last match wins (zappi "(all models)" is listed at 7.4 and 22.0 — order is the API's); the device attrs are spread into the component's intelligent_dispatch entity, automatic_config() wires octopus_intelligent_slot to it, and fetch_sensor_data_car_planning() consumes them — battery size replaced outright when truthy (recalculating the car SoC), rate via max(rate, configured) (the "Take the max as Octopus over reports" line predates the catalogue) — so a too-high catalogue figure makes both unreachable from apps.yaml while the component runs. Symptom tell: Car 0 rate from Octopus is 22.0kW and configured rate 7.4 repeating. The coordinator's value does not fit the container's type - dropped warning (catalogue sends strings; _clean_number() refuses them) is a cosmetic marker for this path. Fix direction (fallback-to-config on ambiguity) proposed in triage, unreviewed.
  • GH#5442 → curve row: the learner is gated to inverter 0 at the caller (if id == 0 and ... in both the charge and discharge branches of execute.py; lineage Charge curve averaging and auto mode #683/Improve charge curve, and add discharge curve calculations #690, Feb 2024 — design, not a regression). find_charge_curve() is itself per-inverter, so the log discriminator is: Inverter 1 Looking for ... lines present ⇒ the gate is not the problem; absent for inverter 1 while present for inverter 0 ⇒ the gate. Only inverter 0's history is searched. The learned curve is a single fleet-wide value (config read once via self.args.get, cannot be configured per inverter; consumed at combined fleet SoC% in the single-combined-battery simulation), so per-inverter curves are a plan-model rework, not a flag. Repeating Cannot find ... curve every 5 min is the normal auto-mode signature; the debug-yaml double-args trap noted.
  • GH#5444 → Ohme row: the two 404 classes on /v1/chargeSessions/... are now separated — ohme_control returns HTTP 404 when attempting to start charging #4719 route-withdrawal (No static resource ...) vs the new no-active-session class (stop route live but keyed on the device serial; server keeps no active-session row once finished/unplugged ⇒ pause 404s forever). Predbat-side amplifier: control_charge() awaits max-charge/pause with no exception guard, so the ApiException escapes before self.control_charging = should_charge records the transition — the same pause is retried every CONTROL_INTERVAL_SECONDS (60 s) and update_success_timestamp() is skipped, so a long storm degrades component health. The /config/ohme.py path trap and the upstream-ohmepy VERSION drift-check note ride along. Same ticket: FINISHED is excluded from CONNECTED_STATUSES, so an attached-but-idle car reads unplanned (no slots, Predbat-led pause; workaround ohme_control: false, feat(ohme): take the car plan from Ohme's own schedule when Predbat is not controlling the charger #5401) — the plugged-in-idle session-mode link is explicitly marked the unverified link, pending a reporter capture.
  • GH#5445 → new "Excluded load" row after the Car-charging row: car_charging_energy is the generic excluded-load list (subtracted in get_filtered_load_window()/today_cost()/load_today_comparison(), gated on car_charging_hold, docs endorse heat-pump use; ML loads it with the same gating); car_energy_reported_load is the inside/outside CT-clamp flag with four consumer sites (fetch disable, ML disable, output planned-slot subtraction, web power-flow diagram); no heat-pump key or diagram node exists — the real ask is naming clarity + node + flag symmetry; load_forecast: - predheat.heat_energy$external cross-ref to the Predheat row; Use car_charging_energy as evidence for Octopus Intelligent dispatches, and warn when car_energy_reported_load looks wrong #5318 interaction noted.
  • GH#5446 → HA write/verify row: new flag-vs-wiring contradiction entry — a capability flag set false in the inverter: block silently discards the apps.yaml wiring (the dummy-creation block overwrites the [self.id] slot; user_configured_entity() protects only the four time entities); TESLA's def ships has_target_soc/has_reserve_soc true so the flags-off shape is a user override of the very flags that would write their entity. Forensic tie-back: Wrote X ... successfully on a sensor.* placeholder is the poll reading back its own echo — live args vs args_from_apps_yaml plus the control_ledger's owned_value/confirmed_at tie the quoted log line to the placeholder, so a reporter theory about the hardware interpreting that register cannot act through the write.
  • GH#5450 → Savings row: the restore/accumulate block under update_pred()'s if self.calculate_savings: restores via load_previous_value_from_ha() (state first, then the last recorder history entry — the fallback applies to attribute reads too), adds savings_today_predbat once per date (gate minutes_now > 60, Fox Cloud retry backoff, savings calc update change to 1am #3108), no plausibility check anywhere, calculate_savings hard-wired True, no built-in reset exists (gateway.py reads only display-side); start_date defaults to "today" when missing (Fixs to avoid high rate import, use timestamp for savings counter #2844) without touching the restored balance — a "start_date newer than retained data" report is the first Fixs to avoid high rate import, use timestamp for savings counter #2844-build day, not a data reset. Recovery (undocumented): state edit re-stating start_date, since deleting the entity alone risks the recorder fallback resurrecting the stale balance. Fix pounds calculation for savings #1114/Fox Cloud retry backoff, savings calc update change to 1am #3108 archaeology ruled out as inflators; the original inflator remains unreconstructed (marked suspected).
  • GH#5452 → Compare row: compared cost excludes the standing charge — enable_standing_charge (prediction.py) omits "compare" from its gate list (never in it — Tariff comparison feature #1952's birth commit), while enable_save_stats includes it (why the plan HTML renders); select_best ranks on the blended metric so ranking inherits the gap. New generalisation: a compare config: block overrides only CONFIG_ITEMS (fetch_config → config_index, built solely from CONFIG_ITEMS; metric_standing_charge is not one) — despite compare.md promising "any standard Predbat configuration setting". Fix traps named: flipping cost10 to save="compare" repopulates predict_*_best (plan HTML renders as PV10); the "Actual" line includes the standing charge, projections don't; two stale annual.py comment sites claim "compare"/"yesterday" switch on enable_standing_charge — only "best"/"yesterday" are true.

Existing entries corrected

Verification

  • Every candidate's load-bearing claims re-verified on current main c073c369 by symbol greps + targeted reads: octopus.py (catalogue query + last-match loops + device-dict spread), fetch.py (attr consumers, curve-config read, calculate_savings hard-wired, standing-charge read), execute.py (both id == 0 curve gates), ohme.py (unguarded control_charge, CONNECTED_STATUSES, 60-s dispatch loop), inverter.py (user_configured_entity single-caller, dummy-creation block), config.py (TESLA def, car_energy_reported_load), coordinator.py (_clean_number string refusal + drop warning), ha.py (REST counter, bare raise ValueError), component_base.py (backoff, wait_api_started), predbat.py (savings block, fatal_error, HA interface not found), hass.py lifecycle, output.py (savings publication sites), gateway.py totals read, annual.py stale comments, git show 610db30a for Charge curve averaging and auto mode #683 lineage.
  • Hooks: pre-commit run --all-files passed (the chained quick suite was killed at the 10-min Bash cap mid-run — the documented pre-existing surface; a docs-only diff cannot affect tests). Three ordinary-English coinages the cspell hook flagged (suffixable, cumulatives, inspectable) were reworded rather than added to the dictionary; no dictionary change, nothing re-staged.
  • Nothing was corrected that a later merge didn't already invalidate, and nothing left queued. Charge / discharge curve only works for one inverter #5442's "maintainer decision; do not frame per-inverter curves as small" note is preserved in the fold.

CI and others added 2 commits October 9, 2026 00:10
…); mark GH#4925 fixed in PR #4938; note the PR #4738 time-entity escape hatch

Folds (each verified against main c073c36 before landing):

- GH#5437 -> "Too many API errors" symptom row: one HA outage walks both
  mechanisms (REST counter + #5134's init failure); bare ValueError => empty
  str(e); fatal_error init-once, never cleared; full-log discriminator
  (Startup banners vs none); wrapper lives in predbat_addon (out of reach).
- GH#5438 -> Octopus row: vehicle-catalogue name matching keeps the last
  match; device attrs override configured rate/battery size outright
  (fetch.py "Take the max"); coordinator string-drop warning as marker.
- GH#5442 -> curve row: id == 0 caller gate in execute.py (both branches,
  lineage #683); find_charge_curve is per-inverter ("Inverter N Looking
  for" discriminator); one fleet-wide curve, not per-inverter suffixable;
  auto-mode re-run signature; debug-yaml double-args trap.
- GH#5444 -> Ohme row: no-active-session 404 class vs #4719 route
  withdrawal; unguarded control_charge() => 60s pause retry storm + health
  degrade; /config/ohme.py path trap; FINISHED excluded from
  CONNECTED_STATUSES gates the car plan (link marked unverified).
- GH#5445 -> new Excluded-load row: car_charging_energy is the generic
  excluded-load list; car_energy_reported_load is the inside-clamp flag
  (four consumer sites); no heat-pump key/diagram node; predheat row cross-ref.
- GH#5446 -> HA write/verify row: flag-vs-wiring contradiction (capability
  flag false silently discards apps.yaml wiring; user_configured_entity()
  protects only the four time entities); Wrote-X-successfully on a
  sensor.* placeholder is a self-echo, control_ledger ties log line to it.
- GH#5450 -> Savings row: restore/accumulate block, no plausibility guard,
  recorder-history fallback covers attribute reads; start_date = first
  #2844-run day, not a reset; recovery via state edit + re-stating
  start_date; #1114/#3108 archaeology ruled out as inflators.
- GH#5452 -> Compare row: standing charge excluded from compare
  (enable_standing_charge omits "compare" since #1952); compare config:
  blocks only override CONFIG_ITEMS; cost10 save-flip breaks plan HTML;
  Actual-vs-projection standing-charge gap; stale annual.py comments.

Re-check vs merged main:
- GH#4925 fixed in PR #4938 (merged 2026-10-08): entry updated, mechanism
  kept for older logs.
- PR #4738 (merged 2026-10-08) added user_configured_entity(): #5214 entry
  updated (time entities only) and GH#5446 extension added.
- Savings row's drifted line cites re-anchored on symbols.

Co-Authored-By: Claude Code <noreply@anthropic.com>
@springfall2008
springfall2008 marked this pull request as ready for review October 9, 2026 18:46
Copilot AI balanced review requested due to automatic review settings October 9, 2026 18:46
@springfall2008
springfall2008 merged commit 9b8fcd1 into main Oct 9, 2026
2 checks passed

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 deleted the bot/debug-journal-2026-10-09 branch October 9, 2026 18:46
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