Repository navigation
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 intoNov 13, 2026
Conversation
… 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
…o quote mark the key parser trips on 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
…s own discharge-end level (#1358) Claude-Session: https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w # Conflicts: # CHANGELOG.md
… 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
…tery at the end, why lines, price paid vs the hours (#1321) Claude-Session: https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w
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.
Low-risk parts of the review on #1322, built to the approved mockup:
Not built (risk): Move, load skip/start, bottom tab bar, hub layout, separate phone layouts.
https://claude.ai/code/session_01UikL7PL23jjzZtjyqe4P8w