@@ -1,8 +1,8 @@
# Dashboards and panel s
# Dashboards and device s
A **dashboard ** is a grid of widgets bound to message names. It can show values
and send controls across several flows. A **panel ** assigns published dashboards
to a paired screen, such as a wall tablet .
and send controls across several flows. A **device ** is a paired screen, such
as a wall tablet or a knob, and shows an ordered set of published dashboards .
## Building one
@@ -441,46 +441,61 @@ under the finger, as a tile view moves.
## Showing one
Open `/view/{name}` for a dashboard-only view with your normal session.
For a dedicated screen, pair a panel .
For a dedicated screen, pair a device .
## Panel s: hanging a screen on a wall
## Device s: hanging a screen on a wall
As a superuser:
1. Open **Dashboards → Panels ** , ad d a panel and select its dashboards. Th e
name you add it under sets its address, `/panel/{id}` , and a later change of
title keeps it.
2. Enable **Touch friendly ** for larger controls .
3. Open the displayed pairing link on the device. It shows a six-character code .
4. Enter that code for the panel, check the device description, then press
**Pair device ** .
1. Open **Devices → Add device ** an d name it after where it hangs. The nam e
sets its address, `/panel/{id}` , and a later change of title keeps it.
2. Under **Dashboards ** , add the ones it shows. The first is what it opens
with, and the arrows set the order of its rail .
3. Enable **Touch friendly ** for larger controls .
4. Open the pairing link on the device. It shows a six-character code.
5. Enter that code under **Pairing ** , check the device description, then press
**Pair ** . A device asking from your own network also appears in the list
below, with what it says about itself, and **Pair this one ** adopts it
without the code.
The screen collects its credential and shows the assigned published dashboards.
Several dashboards get a navigation rail.
Several dashboards get a navigation rail. The page says whether the device is
online, which it is while its live socket is open, and when it was last seen
since the instance started.
A panel credential reads its assigned dashboards, their bound messages an d the
Each save carries the version it was read at. When someone else save d the
device first, the save is refused and the page shows their version.
A device credential reads its assigned dashboards, their bound messages and the
artifacts they show. It writes only the targets of their controls and query
charts, and the `in` ports of its own [I/O ](#the-devices-own-io ). A message its
tiles only draw, or a dashboard setting is bound to, stays read only. On a
locked dashboard only the query charts may still publish.
**Unpair screen ** revokes a locally paired credential and keeps the panel's
dashboard assignment s. Deleting the panel removes the assignment and its
access.
**Unpair screen ** revokes a locally paired credential and keeps the device and
its dashboards. Deleting the device removes the assignment and its access, and
a device added again under the same name does not bring the old credential
back.
The device definitions are stored in the flow repository (`_devices/<id>.json` ),
so their history is in git with the flows. The credential generation lives in
`DEVICES_FILE` outside it, so reverting the repository never undoes an unpair.
An instance from before devices moves its `panels.json` there on its first
start and renames the file `panels.json.migrated` .
### A screen without a browser
The openpanel firmware, kept in its own repository, draws dashboards as native
widgets on an ESP32-P4 wall panel (Waveshare ESP32-P4-WIFI6-Touch-LCD-7B,
1024× 600). Once its config page points it at this instance (the dialog 's link
works too, the device keeps only its address), it shows the pairing code itself; enter it as in step 4 . It reads the same published
1024× 600). Once its config page points it at this instance (the device 's link
works too, the device keeps only its address), it shows the pairing code itself; enter it as in step 5 . It reads the same published
dashboards and live values and draws every widget type with two exceptions,
both shown as a placeholder: a website tile that embeds a page (image tiles
work), and a chart of runs, which a panel credential may not read. Media tiles
work), and a chart of runs, which a device credential may not read. Media tiles
play MJPEG streams, pushed frames, images, and H.264 Baseline or MJPEG clips up
to 640× 360. Re-encode other clips with the [clip recipe ](../code/nodes.md#making-clips-playable-on-an-lvgl-panel ).
The device decides what the panel' s [I/O ](#the-devices-own-io ) port names
The device decides what i ts [I/O ](#the-devices-own-io ) port names
mean. openpanel serves `gpio.<n>` , `backlight` , `touch` , `mic` and `speaker` ,
lists each one's `config` in its README and ignores any other name. A browser
screen serves none of them. The [speech recipe ](../code/nodes.md#speech-to-and-from-a-panel )
@@ -488,9 +503,8 @@ turns `mic` into text and text into `speaker`.
### The device's own I/O
A panel can also act as a node. Under **I/O ** , wire a port on the device to a
message. A new port saves once it has a port name and a message, at the latest
when the dialog closes:
A device can also act as a node. Under **I/O ** , wire a port on the device to a
message. A new port saves once it has a port name and a message:
| Field | Meaning |
|---|---|
@@ -515,12 +529,14 @@ by the nodes that produce it.
### A screen somewhere you cannot reach
An [enrolled instance ](portal.md ) also shows a portal pairing link. Use that
link on the remote screen, then approve its code i n the same dialog . The
device description says * via portal * .
link on the remote screen, then approve its code o n the device's page . The
device description says * via portal * . Anyone can ask the portal for a code, so
a request that came through it, or from outside your network, is adopted by
its code only and never from the list.
The instance enforces the same dashboard and message limits. Remote
credentials are issued by the portal, so **Unpair screen ** does not revoke
them; revoke them at the portal. Deleting the panel removes access on the
them; revoke them at the portal. Deleting the device removes access on the
instance.
## See also