NOTEPAD: components needed for wall-panel parity with the current home dashboard

This commit is contained in:
2026-08-17 09:54:28 +02:00
parent 5fc7bbee34
commit 5483de13c0
+101 -2
View File
@@ -13,8 +13,25 @@ should reopen it.
### To be sorted ### To be sorted
- BUG: Logs currently only have small time window compared to e.g. graphs (in the home view); can we fix this, especially for the purpose of tracing back events?
- FEAT: we should introduce a unified way to select time ranges in graph views with some convenience buttons like -1h -6h -24h . Make sure this also applies to the smaller "trend" charts like shown in the node panel or on edges; here we could show the time range selector upon hovering the graph (presets are fine)
- INFRA: ensure that all the packages/ dependencies needed to run fluksio are available on arm to make this software runnable on e.g. raspbian
- INFRA: merge the philosophy statement at the beginning of vision.md into the rest of the document. Dissolve the decision dates and fold the decisions into a clean structure - INFRA: merge the philosophy statement at the beginning of vision.md into the rest of the document. Dissolve the decision dates and fold the decisions into a clean structure
- BUG/UI mobile friendly support is degraded: 1) toolbar in the "Flows" viewport extend mobile viewport width 2) position of nodes should never be static; always adjust such that there are as few as possible overlaps (of nodes and edge labels) and direction is left to right (desktop) or top to bottom (mobile) with a minimal (but clean) overall edge length 3) Dashboard view is not mobile friendly at all; as dashboard design is infeasible on mobile, render all widgets in a vertically stacked order. This allows to inspect each widget and make changes. Layout changes are not a feature on mobile 4) the home view is not responsive; all items shown there should re-order on mobile such that no scrollbars appear - BUG/UI mobile friendly support is degraded: 1) toolbar in the "Flows" viewport extend mobile viewport width 2) position of nodes should never be static; always adjust such that there are as few as possible overlaps (of nodes and edge labels) and direction is left to right (desktop) or top to bottom (mobile) with a minimal (but clean) overall edge length 3) Dashboard view is not mobile friendly at all; as dashboard design is infeasible on mobile, render all widgets in a vertically stacked order. This allows to inspect each widget and make changes. Layout changes are not a feature on mobile 4) the home view is not responsive; all items shown there should re-order on mobile such that no scrollbars appear. Make sure the mobile support is anchored in the design such that future work does not break it
- BUG/UI the codeberg icon should be replaced by a gitea icon
- FEAT/UX mirror the "publish" system from the flow editor to the dashboard; i.e. dashboards are always editable (edit mode) when not in the "read-only wallpanel" mode. Changes are made effective by clicking "Publish" in the toolbar (identical to flows).
- BUG/UI replace the search bar in flows/dashboard by a search icon which opens the search bar upon click. Also the create button should become a "+" icon button; both right aligned
- FEAT/UI introduce an "Publish all" (checkmark icon button) to the flow and dashboard overview which publishs all changes without having to access the individual flows
- BUG/UI add a bit more vertical spacing between elements in the (node) panels
- FEAT/UI add a loading animation for the initial app load and when loading individual pages; make sure that elements e.g. in the home dashboard load independently to ensure a fast loading of the initial site but figures charts, tables, graph etc. follow after that
- FEAT/UI introduce a graph panel which renders at the top right next to the graph view (to make more use of the horizontal space) and which allows (de-) selecting flows to be excluded from the graph view or search for individual nodes where only the flows containing this node should be shown (like slicing the brain)
- FEAT/UI (deferred until MCP lands): add a "bot" icon button to the home view (graph panel) which opens a chat window (reuse general concept of a chat side panel) to explain the error(s)
- FEAT/UI trend graphs (in the home view table, but also nodes/edges view) should fade out towards the left end
- BUG/UI unify the trend graph view; adopt the style we use in the panels/ edges into the the trend graphs in the table of the home view
- BUG/UI ensure the content of the table (flow activity) in the home view uses the full width (e.g. we could right align the trend graphs, center the colums in the middle and left align the name of the flow)
- FEAT/UI introduce si unit style shortening of large values (like k, M, ..) globally
- FEAT/UI text labels in the brain graph view should only show upon hovering. Edges/nodes which fire seldomly should dim out over time (up to a lower limit). Get inspiration on how "Obsidian" visualizes the graph view. Also make sure nodes shapes are visible on both light and dark themes (consider using fill color instead of shadows) -> web-search / research about visualization of large graphs and ensure high quality visual design
- BUG/UI make sure the edges point towards the center of the nodes in the brain graph view (currently some of them seem a bit off-center)
### Connector write paths ### Connector write paths
@@ -61,6 +78,87 @@ is what M4 still waits on, together with porting the flows.
- PERF/API: two unmarked ceilings — `/observability/flows` scans every `metric_minute` row in the window on each 30 s poll, and `queue.stats()` does a keyspace `scan_iter` on every call while two endpoints poll it. - PERF/API: two unmarked ceilings — `/observability/flows` scans every `metric_minute` row in the window on each 30 s poll, and `queue.stats()` does a keyspace `scan_iter` on every call while two endpoints poll it.
- CHORE/INFRA: dev only — memory-queue ids (`mem-{seq}`) restart at 0 each boot and `FlowRun.id` is the primary key, so a restart without Redis upserts over the previous boot's run rows. - CHORE/INFRA: dev only — memory-queue ids (`mem-{seq}`) restart at 0 each boot and `FlowRun.id` is the primary key, so a restart without Redis upserts over the previous boot's run rows.
### Wall-panel parity with the current home dashboard
What a fluksio dashboard still lacks to replace `geli-dash` (Dash/Plotly, e-ink
panel: clock and nav chrome, indoor climate, weather forecast strip, calendar
agenda, room light groups, sliders, power/battery bars, and three pages of
InfluxDB time series). Component-level only; the arrangement and the styling are
this design system's business, not that one's.
Decisions taken up front, because most items below depend on them:
- Structured data reaches a widget as a *declared shape*, not as opaque JSON with
a path per binding. A path would leave the picker with nothing to offer and
`widgetIssue` unable to judge a tile from the document alone.
- A chart asks a flow for its series the way every other input widget speaks:
it publishes a request message and reads the answer. No query API, no
database knowledge in the widget.
- Nothing e-ink-specific in the widgets. Panel access is a credential problem
(see below); the display's demands are a rendering profile, deferred.
- FEAT/FLOW: declared structured dtypes — `series` (labelled ts/value pairs),
`record` (flat named scalars) and `list` (ordered items of a declared shape) in
`DType`, checked like the scalars are, with `WIDGET_DTYPES` extended so a
widget binds a shape rather than "some JSON". Everything a single number can
say stays a `float`/`bool` message. Prerequisite for the agenda, forecast,
notification and queried-chart widgets.
- FEAT/UI+FLOW: charts that query. A chart owns a refresh interval, publishes a
request message (range, interval) exactly as a slider publishes a value, and
draws the `series` message a data node answers with. The answer carries the
range and interval it was computed for and the widget ignores one that does not
match its request — otherwise two charts, or two panels, on the same node
overwrite each other's window. Costs a duplicate query rather than a wrong
chart. Needs a floor under the interval and dedup of identical in-flight
requests. The alternative — a message name per widget — would mean dynamic
names in a namespace that is deliberately static.
- FEAT/NODE: a series read mode for the InfluxDB node: return the whole
aggregated window (`aggregateWindow`, function and interval from the request)
as one `series` message, instead of the single aggregated scalar it produces
now. This is what the environment, power and server pages are made of.
- FEAT/UI: bar/level widget — a horizontal bar with its value written on it, and
a nested bar for a quantity contained in another (PV inside inverter input).
The arc gauge is the only level display today.
- FEAT/UI: latching toggle button (pressed state read back from a bool message)
and exclusive button group (one of N, the active one read back). The current
button is fire-and-forget and the switch is a lone bool, so a set of room light
modes cannot be expressed.
- FEAT/UI: icon-by-value widget — a mapping from value or range to a lucide icon
and a colour token. Carries both the weather condition icon and derived hints
such as "indoor dewpoint above outdoor, open a window".
- FEAT/UI: agenda widget over a `list` message — the next N items with relative
day labels ("Today", "Tomorrow", weekday, then date) and truncated titles.
- FEAT/UI: forecast strip widget over a `list` message — N columns of label,
icon and value, with the later columns drawn progressively dimmer.
- FEAT/UI: notification widget — title and body from a `record` message, held
until replaced. Worth wiring to the alerting events rather than a message of
its own.
- FEAT/UI: clock widget — local time and date, bound to nothing.
- FEAT/UI: chart presentation — axis titles, a unit, an optional fixed y range,
and the per-series label the document already stores but the editor never
offers.
- FEAT/UI: the slider panel exposes only min and max; the renderer already reads
`step` and `unit`. Add those plus tick marks (a 2022 °C setpoint at 0.1 is
unusable without them).
- FEAT/API: a kiosk credential for `/view/{name}`, so a panel is not a
logged-in browser session. Note it cannot be strictly read-only: a querying
chart publishes its request, so the token needs that one write scope.
- FEAT/UI: per-dashboard theme — forced light, forced dark, or switched on a
schedule. View mode inherits localStorage and the OS preference today, which
a panel in a room has no way to set.
- FEAT/UI: page navigation in view mode. `/view/{name}` renders the first page
and offers no way to reach the others; the editor side of this is the
multi-page item under *Dashboard follow-ups*.
- CHORE/FLOW: porting the controls needs a declared writable message per control,
since an input widget can only target what a flow declares. Consider a
dashboard-input node so a flow states plainly that a value arrives from a
panel, rather than each control borrowing some node's port.
Deliberately not ported: the local-state/timestamp reconciliation the old
dashboard does per widget — publishing on release and reading the value back
covers it — and its demo mode, since an unbound or silent message already renders
as an em dash.
### Dashboard follow-ups ### Dashboard follow-ups
- BUG/UI: ensure dashboard wallpanel (read-only) links hot reload automatically on dashboard changes - BUG/UI: ensure dashboard wallpanel (read-only) links hot reload automatically on dashboard changes
@@ -111,10 +209,11 @@ Open on purpose. Each names what should bring it back.
- CHORE/INFRA: `requires-python` is capped below 3.14 because the MCP SDK wants a newer starlette there than the pinned `sentry-sdk<2` allows. Lift the cap when sentry-sdk moves to 2.x. - CHORE/INFRA: `requires-python` is capped below 3.14 because the MCP SDK wants a newer starlette there than the pinned `sentry-sdk<2` allows. Lift the cap when sentry-sdk moves to 2.x.
- CHORE/INFRA: `bun run --filter frontend build` fails on this workspace with `crypto.hash is not a function` — Vite 7 wants Node 20.12+ and the host has 18. The Docker image builds fine, so it only bites local bundling; `bunx tsc` still type-checks. - CHORE/INFRA: `bun run --filter frontend build` fails on this workspace with `crypto.hash is not a function` — Vite 7 wants Node 20.12+ and the host has 18. The Docker image builds fine, so it only bites local bundling; `bunx tsc` still type-checks.
- FEAT/UI: an endpoint's edge routes straight across the graph, so it can pass behind a node that sits between the lane and the node it wires to. Readable, but a routed edge would be tidier. - FEAT/UI: an endpoint's edge routes straight across the graph, so it can pass behind a node that sits between the lane and the node it wires to. Readable, but a routed edge would be tidier.
- FEAT/UI: an e-ink rendering profile for a dashboard — motion off, hover-only affordances resolved to something visible, high-contrast palette, thick strokes, and a repaint cadence low enough for a display that takes a second to settle. Reopen when a panel with such a display is actually hung.
## Blocked ## Blocked
- CHORE/INFRA: `bun install` inside the frontend Docker build intermittently fails with - CHORE/INFRA: `bun install` inside the frontend Docker build intermittently fails with
"Fail extracting tarball" for several packages at once, and succeeds on a plain rebuild. "Fail extracting tarball" for several packages at once, and succeeds on a plain rebuild.
It looks like concurrent extraction under memory pressure. Pin down or retry in the It looks like concurrent extraction under memory pressure. Pin down or retry in the
Dockerfile if it starts costing CI time. Dockerfile if it starts costing CI time. NOTE: memory lifted; retry and close if stale