Skip to content

SEM-dashboard: Rien's review — why list, battery at the end, charge-plan chip, reserve mark, names (#1321) - #1364

Merged
traktore-org merged 22 commits into
feature/1321-dashboard-nextfrom
feature/1321-rien-integrated
Nov 13, 2026
Merged

traktore-org merged 22 commits into
feature/1321-dashboard-nextfrom
feature/1321-rien-integrated

Conversation

@traktore-org

Copy link
Copy Markdown
Owner

Low-risk parts of the review on #1322, built to the approved mockup:

  • Names: SEM-dashboard (new) and SEM-classic (old); addresses unchanged.
  • Now: always-visible source mix, 24 h price strip, device chips.
  • Plan: a visible "Why this plan" list, a battery-at-the-end tile, a Charge plan button; the timeline fits a phone.
  • Devices: charge-plan chip with a pencil, a pencil on editable values, reserve mark with kWh above it, rows per battery, heat pump cost and next run, folded on phones.
  • Insights: average price paid vs the hours (dynamic tariffs). System: the entity each source reads.

Not built (risk): Move, load skip/start, bottom tab bar, hub layout, separate phone layouts.

  • Card tests (918), full suite green, seen on .175 at desktop and phone width

https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w

… level

The crawler names the level where the inverter itself stops discharging
(Huawei 'End-of-discharge SOC'), the twin of the end-of-charge role. A
backup, EPS or off-grid reserve is not it. SEM only reads it. The option
surface grows by this one field (#1358, declared in the .loosen file).

Claude-Session: https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w
…n end of discharge

The plan, tomorrow's preview, the battery-empty estimate and the peak
hold's refill check count the battery down to the higher of SEM's reserve
and the inverter's own end-of-discharge level, when the crawler has found
it. An unread, unknown or out-of-range level keeps the reserve. The plan
publishes the floor it used and where it came from. Setup and the Config
card show the field in 16 languages; SEM never writes it.

Claude-Session: https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w
…inator included

Moved to module level and read through getattr, as the charge-end
reader's callers need; the methods stay as thin wrappers.

Claude-Session: https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w
The sidebar names follow the owner's choice; the URL paths stay
(/sem-next, /sem-dashboard) so bookmarks keep working. The names change
when the dashboard is generated, as titles always have.

Claude-Session: https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w
The plan payload and sensor.sem_energy_plan carry battery_end
{kwh, pct, at} for tonight's plan (also on a quiet night) and
battery_floor_pct; tomorrow's preview carries provisional.battery_end.
Computed from the walked ledger's last step, on the plan's own floor.
Publishing only: no decision reads it.

Claude-Session: https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w
On a dynamic tariff the daily/monthly/yearly cost sensors carry
avg_price_paid (import cost / bought kWh) and avg_price_hours (the
import price time-weighted over the period, from two new cost-row
categories price_hours / price_x_hours, pruned with the cost rows).
On any other tariff neither is published (price_comparison false).
Publishing only.

Claude-Session: https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w
The plan's demand rows carry why {code, params} for the Plan card's
"Why this plan" list: from_battery, on_sun, before_departure,
unpriced_hours, one_rate or cheapest_hours (with the average price),
plus from/to. Read off the packer's allocations, never re-decided;
texts plan_why_<code> in 16 languages. Publishing only.

Claude-Session: https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w
… and a chip per device; System names the entity SEM reads

From the review of PR 1322: the source mix in percent stays visible under
the power bar, the money section ends with a 24 h price strip coloured by
the install's own price levels with a now mark (none on one rate), and a
row of device chips opens Devices. System's source tiles show the value and
the real entity SEM reads. Added only; nothing on the screens is replaced.

Claude-Session: https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w
… plan, the battery its reserve

From Rien's review: a visible "Why this plan" list (what, when, why per
device), a "Charge plan" link on each charger row, a battery-at-the-end
tile when the plan publishes it. On Devices: an always-visible charge-plan
chip with a pencil, a pencil on every editable value, the reserve mark and
the kWh above it, each battery's own level and power, the heat pump's cost
of heat and next run, and cards folded on phones. Insights shows the
average purchase price against the market when SEM publishes it. The
timeline no longer forces a width wider than a phone.

Claude-Session: https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w
…s what SEM uses, tax fields are not asked beside All-in
The battery end uses the plan's one floor (#1358); battery_floor_pct is published once.

Claude-Session: https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w
…tegrated

# Conflicts:
#	CHANGELOG.md
#	coordinator/coordinator.py
#	dashboard/card/dist/sem-cards.js
#	dashboard/card/sem-localize.cs.js
#	dashboard/card/sem-localize.da.js
#	dashboard/card/sem-localize.de.js
#	dashboard/card/sem-localize.es.js
#	dashboard/card/sem-localize.fi.js
#	dashboard/card/sem-localize.fr.js
#	dashboard/card/sem-localize.hu.js
#	dashboard/card/sem-localize.it.js
#	dashboard/card/sem-localize.js
#	dashboard/card/sem-localize.nl.js
#	dashboard/card/sem-localize.no.js
#	dashboard/card/sem-localize.pl.js
#	dashboard/card/sem-localize.pt.js
#	dashboard/card/sem-localize.ro.js
#	dashboard/card/sem-localize.sv.js
#	dashboard/card/sem-localize.zh.js
# Conflicts:
#	dashboard/card/dist/sem-cards.js
#	dashboard/card/sem-localize.cs.js
#	dashboard/card/sem-localize.da.js
#	dashboard/card/sem-localize.de.js
#	dashboard/card/sem-localize.es.js
#	dashboard/card/sem-localize.fi.js
#	dashboard/card/sem-localize.fr.js
#	dashboard/card/sem-localize.hu.js
#	dashboard/card/sem-localize.it.js
#	dashboard/card/sem-localize.js
#	dashboard/card/sem-localize.nl.js
#	dashboard/card/sem-localize.no.js
#	dashboard/card/sem-localize.pl.js
#	dashboard/card/sem-localize.pt.js
#	dashboard/card/sem-localize.ro.js
#	dashboard/card/sem-localize.sv.js
#	dashboard/card/sem-localize.zh.js
…rated

# Conflicts:
#	CHANGELOG.md
#	dashboard/card/dist/sem-cards.js
#	dashboard/card/sem-localize.cs.js
#	dashboard/card/sem-localize.da.js
#	dashboard/card/sem-localize.de.js
#	dashboard/card/sem-localize.es.js
#	dashboard/card/sem-localize.fi.js
#	dashboard/card/sem-localize.fr.js
#	dashboard/card/sem-localize.hu.js
#	dashboard/card/sem-localize.it.js
#	dashboard/card/sem-localize.js
#	dashboard/card/sem-localize.nl.js
#	dashboard/card/sem-localize.no.js
#	dashboard/card/sem-localize.pl.js
#	dashboard/card/sem-localize.pt.js
#	dashboard/card/sem-localize.ro.js
#	dashboard/card/sem-localize.sv.js
#	dashboard/card/sem-localize.zh.js
#	dashboard/translations.json
The battery at the end comes from plan.battery_end, the Why list from each
plan demand's why code, and the average price paid from the cost sensors'
avg_price_paid / avg_price_hours (dynamic tariffs only).

Claude-Session: https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w
@traktore-org
traktore-org merged commit d10740d into feature/1321-dashboard-next Nov 13, 2026
@traktore-org
traktore-org deleted the feature/1321-rien-integrated branch November 13, 2026 20:47
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.

1 participant