仪表板
DeviceChain 包含可嵌入、支持版本管理的仪表板系统,用于可视化实时设备数据。仪表板是你在控制台编写的租户作用域资源。它根据可移植 JSON 定义渲染,同一定义可以在控制台、独立参考查看器,或任何安装 npm 运行时包的 React 应用中渲染。
已提供:画布编辑器(支持撤销与重做、复制组件,以及在仪表板之间复制粘贴)、内置组件集(遥测、告警和命令/控制组件)、带暂停功能的看板时间范围、可在中断后自动恢复的实时订阅、组件动作(确认/解除告警、发送命令,由服务器授权)、版本管理(发布 / 回滚)、合成数据预览、命名插槽和绑定清单、导出、导入、克隆和入门模板、独立 /dash 参考查看器,以及发布于 npm 的运行时包。
计划中:更丰富的数据源选择器(关系图遍历、下钻)、按断点编辑布局,以及更多组件。
画布
仪表板在由正方形单元格组成的网格中布置组件。网格提供:
- 按单元格放置:每个组件占据由整格组成的区块(列 × 行),每种组件类型可以规定它占据的最小和最大区块;
- 互不重叠:网格上的两个组件不会共享单元格,在编辑器中移动或调整某个组件的大小时,其他组件会被向下推开;
- 相对于另一个组件放置的组件:锚定在该组件的某个点上并随之移动,例如地图上的徽标或图表下方的说明。只有这类组件会叠放在其他组件之上;
- 可选背景图片或颜色。
未自行定义网格的仪表板使用 12 列、56 px 的最小单元格尺寸和 8 px 的单元格间距(gutter)。
仪表板测量的是其挂载容器(面板、固定宽度框架或整页)的宽度,而不是屏幕。只要设计时的列数在画布的最小单元格尺寸下放得下,布局就按设计显示,单元格会拉伸以填满宽度,因此大屏幕得到的是更大的单元格,而不是更多的单元格。容器更窄时,仪表板使用放得下的列数,并按阅读顺序把组件放入其中,每个组件保持在它允许的尺寸范围内。宽度小于 600 px 时(例如手机),每个组件独占一行,仪表板呈现为单列。挂载时的尺寸选项(fill、固定宽度或固定高度)由宿主选择。
仪表板还有一个密度:compact、comfortable(默认)或 wall。它会按 0.9、1 和 1.5 的比例缩放所有文字和间距尺寸、单元格间距,以及列可以缩小到的最小单元格,因此 wall 绘制的是适合在房间另一端阅读的仪表板。作者在编辑器中设置密度,查看者可以覆盖它(参见 /dash 的 density 参数)。
定义格式和渲染器为每个组件保存各断点的位置,断点按仪表板容器的宽度选择;以这种方式定义的断点布局会取代自动重排。但画布编辑器只写入基础断点,所以目前在控制台编写的仪表板只有一个布局,在较窄的容器中会自动重排。
组件
内置组件覆盖六个通道:遥测、静态(无数据)、告警、控制、选择和位置。时序图、仪表与罗盘使用 Apache ECharts 渲染,地图使用 MapLibre GL,其余使用普通 DOM。
液位与指示类组件(线性仪表、液位仪表、电池、状态灯、信号格)从不猜测刻度:没有最小值和最大值或没有数据时,组件会直接说明,而不是画出看似合理的填充。超出刻度的值会把填充固定在端点,并在读数旁标出 ▲ 或 ▼。只有当数值处于异常区间时才按阈值区间着色;normal 区间保持组件的中性颜色。罗盘和进度环遵循同样的规则:超出 0–360 的航向会折回表盘(370° 显示为 10°),没有最小值和最大值的进度环会直接说明。仪表、罗盘和进度环的读数以页面文字显示,而不是画在图表里。
统计卡片显示某个测量在一段时间跨度内的一个数值:平均值、最小值、最大值、总和、读数个数,或最新读数。该数值由平台根据跨度内的每一条读数计算,而不是根据图表绘制的平均值,因此最大值就是最大的那条读数,而不是最大的平均值。统计卡片跟随看板的时间范围,除非你为它指定了自己的跨度;它会在数值旁标明所覆盖的跨度(“Maximum · 1h”),并在看板暂停时停止更新。跨度在整分钟处开始和结束,因此数值从不包含跨度开始之前的读数。实时卡片在一小时的跨度下每分钟重新读取一次,跨度越长读取越少(一周的跨度每 42 分钟一次),浏览器标签页隐藏时不读取。设置为最新读数的卡片会显示该读数距今的时间。它与液位类组件一样按阈值区间着色。无法计算数值时(数据源不支持、读取失败,或跨度内没有读数),卡片会直接说明,而不显示任何数字;读数个数是例外,没有读数的跨度显示 0。柱状图和饼图绘制每个所选测量的最新读数,每个测量对应一根柱或一个扇区;饼图表示整体的占比,所以它会拒绝负值和全为零的数据,而不是画出别的东西。两者都以页面文字和图形绘制,因此标签是可读的文本,而不是画布的一部分。柱的数值在放得下时写在柱旁,饼图的图例给出每个数值及其占比,所有数值也都写在图表的描述中,供屏幕阅读器使用。
命令滑块和命令开关显示的是最近一次发给设备的值及该命令的投递状态(待处理、已送达或失败),绝不是设备的当前状态。滑块在松开时(或用键盘按 Enter 时)发送一次,拖动过程中不发送;未被要求发送的值(按 Escape 或放弃拖动)会被丢弃。只有当上一条命令处于待处理或已送达状态时,开关才会发送与上次所发值相反的值。如果尚未发送过任何内容、上一条命令失败,或它不在最近的命令之中,开关不会猜测:它会提供 On 和 Off 两个按钮,并发送你选择的那一个。在上一条命令仍在受理时,两者都不会再次发送。如果命令还有其他没有默认值的必填参数,或所选参数不存在或类型不符,组件会说明原因并且不发送任何内容。没有 command:write 权限的查看者看到的是只读状态。 滑块还有步进模式(将 mode 设为 stepper):− 和 + 按参数声明的步长调整数值,且不超出其声明的最小值与最大值;在你按下“发送”(或 Enter)之前不会发送任何内容,按 Esc 会放弃已调整的值。
| 组件 | 通道 | 显示内容 |
|---|---|---|
| 时序图 | telemetry | 在仪表板时间范围(或组件自身跨度)内的一个或多个测量序列;可选地标出该设备的告警(从触发到清除的色带,颜色对应严重程度)和发给它的命令 |
| 仪表 | telemetry | 对照范围/阈值显示单个最新值 |
| 最新值卡片 | telemetry | 单个当前读数及其时间戳 |
| 表格 | telemetry | 单台设备每个测量值的最新读数 |
| 线性仪表 | telemetry | 以横向或纵向条形或温度计显示单个最新值,需设置最小值和最大值 |
| 液位仪表 | telemetry | 按最新值在必填的最小值和最大值之间填充的储罐,读数显示为数值或百分比 |
| 电池 | telemetry | 按最新值填充的电池图标,未设置最小值和最大值时使用 0–100 百分比刻度 |
| 状态灯 | telemetry | 按数值所在阈值区间着色的指示灯,或在开启值处亮灭,并带文字说明 |
| 信号格 | telemetry | 每个阈值一格,最新值每达到一个阈值就点亮一格 |
| 罗盘 | telemetry | 以指针在整圈表盘上显示航向(风向、方位),并给出度数和最接近的八个方位之一 |
| 进度环 | telemetry | 在必填的最小值和最大值之间填充的圆环,读数显示为百分比或数值 |
| 统计卡片 | telemetry | 某个测量在看板时间范围(或自身跨度)内的平均值、最小值、最大值、总和、读数个数或最新读数 |
| 柱状图 | telemetry | 每个所选测量的最新读数各为一根柱,按数据源的顺序或按数值排序;宽组件为纵向柱,高组件为横向条 |
| 饼图 | telemetry | 每个所选测量在其最新读数总和中所占的份额,并附带名称、数值和百分比图例 |
| Fleet table(车队表格) | telemetry | 一个设备组中每台设备一行、每个测量一列,每个单元格是该设备自己的最新读数及其时效,并按该列的阈值着色;可排序、可分页,点击设备名称会在关联的组件中选中该设备。柱状图设置为每台设备一根柱时,会以柱状形式绘制同样的逐设备读数 |
| 标签 | static | 静态文本 |
| 图片 | static | 静态图像,例如其他组件下方的平面图 |
| 告警表格 | alarm | 设备或锚点的实时告警 |
| 告警计数 | alarm | 未关闭告警的汇总数量 |
| 告警严重级别 | alarm | 按严重级别拆分的活动告警:堆叠条加图例,图例给出每个严重级别的数量,可针对范围内的所有告警或某一类型的设备 |
| 命令 / 控制 | control | 带类型的参数表单,用于派发命令并显示实时投递生命周期 |
| 命令滑块 | control | 用滑块设置命令的一个数值参数,松开时发送;取值范围来自命令定义 |
| 命令开关 | control | 用开关设置命令的一个布尔参数,每次点击发送一条命令 |
| 实体选择器 | selection | 重新绑定命名插槽的选择器,让查看者选择仪表板或其中单个组件显示哪个实体 |
| 地图 | location | 已绑定设备的最新已知位置 |
大多数遥测组件支持阈值、单位和精度。阈值指定的是严重级别(normal、warning、minor、major 或 critical),而不是颜色,因此由主题决定每个区间在浅色和深色模式下的外观;只有异常区间才着色。未设置精度时,数值四舍五入到 3 位小数;小于 1 的数值保留 4 位有效数字。
显示读数的组件会标明其数值距今多久(例如“12 sec. ago”)。如果填写了组件的 Stale after (seconds)(过期阈值)设置,超过该时长的数值会变灰并标记为过期;平台不预设默认值,因为任何固定数字都会把上报频率低但运行正常的设备标成过期。没有内容可显示的组件会说明原因(未选择设备、时间范围内没有数据、无法显示的设备组),而不是画出一个空框。
组件使用 CSS 自定义属性设置主题,因此嵌入应用无需修改组件代码即可控制外观。
时间范围与暂停
仪表板有一个时间范围:从现在往回推的一段时间,图表在这段时间内绘制,统计卡片也在这段时间内计算。查看者可以在仪表板顶栏中选择 15 分钟、1 小时、6 小时、24 小时或 7 天。作者可以在编辑器中保存其他默认值;未保存默认值的仪表板使用一小时。组件可以固定自己的跨度(一分钟到一周),查看者的选择不会改变它;固定为五分钟的时序图始终是一条五分钟的曲线。
暂停会冻结仪表板在那一刻显示的内容:图表、卡片、仪表、表格、告警组件和地图都保留屏幕上的数值,恢复后重新显示实时数值。暂停只冻结显示。命令以及告警的确认和解除仍会立即发出,其状态也会继续更新,暂停提示中会注明这一点(“commands still send”)。
图表按时间桶读取历史数据,每次读取最多 240 个点:15 分钟和 1 小时的跨度按 1 分钟分桶,6 小时按 2 分钟,24 小时按 6 分钟,7 天按 42 分钟。图表最多保留 2,000 个实时样本;当较长跨度在高频率下超过这一数量时,最早的样本先被丢弃,图表会注明它实际覆盖的起始时间。
地图瓦片与位置访问
选择哪个瓦片提供方是租户级决定,而不是逐组件决定。参见底图。
地图组件在租户底图上渲染设备位置。新实例已配置底图,因此地图组件无需额外设置即可绘制瓦片。组件自身的 tileUrl 和 attribution 选项可以只为该仪表板覆盖底图,适合在租户范围启用之前试用提供方。
如果任何层级都没有瓦片来源——运维人员将实例默认值设为 {},租户也没有设置——组件仍会绘制真正的地图,使用内置的公共领域大陆与国界世界底图。只有地图渲染器本身完全无法加载或启动时,例如代理阻止加载,或浏览器没有可用 WebGL,才会退回显示相对位置的平面面板。
读取位置还需要 location:read 权限。每个成员默认获得的只读基础权限不包含它,参见设备位置。没有该权限的查看者会收到说明,而不是看到空地图。
动作与权限
组件可以携带动作:确认或解除告警,或者发送命令。服务器根据调用方自己的租户作用域权限授权每个动作。例如,需要 alarm:write 的动作对只读查看者不可用。
打开仪表板需要 dashboard:read,每个启用的租户成员都拥有该权限。它属于只读基础权限,与读取设备、事件、状态、命令和告警并列。仪表板是对这些权限已能访问的数据进行保存的排列,因此能读取数据的成员也能打开相应视图。
dashboard:write 控制创建、更新、发布、回滚和删除,仍需通过角色授予。
数据源
组件不内嵌查询,而是内嵌由运行时解析的带类型选择器:
device:通过令牌选择单台设备。anchor:限定于组织实体(客户、区域或资产)的遥测,由被跟踪关系指定。运行时在客户端将它展开为当前关联到该实体的设备,并流式读取各成员的原始样本:每台设备一个流,最多 500 个成员。只有车队表格和设置为每台设备一根柱的柱状图会读取锚点,因为它们把每台设备的读数分开保存。其他遥测小部件只显示一台设备;绑定到锚点时,它会明确说明这一点,而不会把多台设备的读数混在同一个测量名称下。服务器端将锚点事件聚合为单个序列的能力仍保留待实现。选择器的aggregation字段会保存并原样返回,但尚未读取使用。slot:命名占位符,由宿主在挂载时从绑定清单解析(见下文嵌入)。目前控制台写入这种类型:加载仪表板时,它将具体device和anchor选择器重写为插槽,因此编写的仪表板默认是可复用模板。
另外两种类型 devices 和 relatedTraversal 为存储定义的前向兼容而保留。在实现之前,运行时会拒绝它们。
选择器通过客户端 SDK 针对 GraphQL API 解析,因此解析具有以下特点:
- 最新:设备新分配到区域后,无需编辑仪表板,下次打开该区域仪表板时就会出现(已打开的仪表板在重新加载前保留其已解析的成员);
- 权限检查:使用调用方自己的、经过认证的租户作用域 API 访问。
实时值的到达方式取决于通道:
| 通道 | 值如何到达 |
|---|---|
| telemetry | GraphQL 订阅,经多路复用,使组件较多的仪表板每台设备只打开一个流,而不是每个组件一个流 |
| alarm | 由实时告警流触发重新查询,并通过 30 秒轮询补充 |
| control | 只使用轮询,因为 command-delivery 不提供订阅 |
告警和控制组件各自持有自己的流和计时器。只有遥测通道会多路复用。
订阅连接在建立连接时使用的访问令牌到期后关闭(参见 WebSocket 订阅)。独立 /dash 查看器会在访问令牌到期前自动续期,因此长期运行在墙面显示器上的仪表板可以持续接收实时数据。如果续期被拒绝,查看器会明确提示(参见会话续期),而不会卡住不动。
连接状态与恢复
仪表板顶栏会显示实时数据是否正在到达:live(实时)、reconnecting(正在重试断开的连接)、 以及 offline(连接已断开 20 秒,或浏览器本身已离线)。连接正常但设备暂时没有上报时,仍显示为实时; 数值距今多久由新鲜度读数说明,而不是由这个徽标说明。
实时组件可以从任意时长的中断中恢复,无需重新加载页面。只要仪表板还开着,断开的连接就会一直重试; 服务器结束的数据流会在等待后重新打开,等待时间逐次加倍,最长 30 秒。组件代码下载失败时, 会在组件自己的框内显示失败信息,点击 Reset widget 即可重新下载。
重新连接之后
仪表板连接中断期间发送的读数永远不会通过实时流到达,因此当某个数据流恢复时(网络或服务器恢复,或服务器结束了该数据流而仪表板重新打开了它),每个组件都会改为从已存储的历史数据中读取这些读数:
- 折线图会重新读取其历史数据,并用它替换中断之前绘制的内容。在该读取完成之前,或读取失败时,图表会在中断期间断开折线,而不是从中断前的最后一个读数到中断后的第一个读数画一条直线。读取失败后每 30 秒重试一次。在已暂停的仪表板上,读取会等到你恢复后进行。未绑定到单个设备的折线图没有可读取的已存储历史数据,因此其断开处会保留;
- 车队表格或每台设备一根柱的柱状图会重新读取每台设备的最新值,立即读取一次,并在下一个整分钟刚过时再读取一次,以便包含中断最后一分钟内发送的读数。读取失败的设备保留其原先显示的值;
- 统计卡片会立即重新读取其数值,而不是等到下一次计划刷新。
编写、版本管理与预览
你在控制台中编写仪表板:
- 画布编辑器:拖动和调整尺寸,提供真实设备/锚点选择器。组件会对齐到单元格,移动或调整某个组件时会把相邻组件向下推开。获得焦点的组件可以用方向键移动一格;Shift 加方向键会把网格组件的大小调整一格,或把相对放置的组件微移四分之一格。组件的 Placement(放置方式)可以是 Grid(网格),也可以是 Relative to…(相对于)另一个组件,锚定在该组件的九个点之一上。编辑器还可以设置仪表板的密度和默认时间范围。
- 布局检查:每个组件会在自身上显示布局问题:尺寸超出组件支持的范围、组件超出网格右边缘、相对放置的组件落在画布之外、组件未声明尺寸限制,或标题重复了副标题。前三种是错误,会阻止发布;Fit to limits(适配限制)会把每个组件调整到其支持的尺寸,并把每个组件移回画布内。其余的只是建议。
- 撤销、重做、复制组件、复制和粘贴:用 Ctrl+Z(Mac 上为 Cmd+Z)撤销,用 Ctrl+Shift+Z 或 Ctrl+Y(Mac 上为 Cmd+Shift+Z)重做,最多 100 步;在同一字段中连续输入算作一步。历史记录在保存和发布之后仍然保留,因此你可以撤销刚刚保存的编辑;回滚会清空历史记录。Ctrl+D(Cmd+D)复制所选组件。复制和粘贴使用浏览器自身的复制粘贴,Paste(粘贴)按钮会粘贴本标签页中最后复制的组件,也可以粘贴到其他仪表板上。粘贴或复制的组件会以自身尺寸放在第一个空位,相对放置的组件会被粘贴到网格上。只有当目标仪表板有以相同方式绑定的同一插槽时,组件才保留其数据源;否则粘贴后不带数据源,编辑器会说明原因。在其他租户中复制的组件绝不会带上任何设备或实体。在字段中输入时,或有对话框、菜单打开时,这些快捷键都不会生效。
- 版本管理:工作定义是可变的草稿。发布将其捕获为不可变版本,并使该版本成为生效版本,即查看者看到的版本。你可以在不改动草稿的前提下重新启用某个旧版本(设为生效),也可以回滚到某个旧版本,这会用它覆盖草稿。历史记录是已发布快照列表,不是差异列表。
- 合成数据预览:将实时数据替换为客户端生成器(正弦 / 斜坡 / 随机游走),在任何设备上报前验证布局、刻度和阈值。
- 导出:下载或复制定义,以便共享或在其他地方嵌入。
- 导入、克隆与入门模板:可以从导出的定义(粘贴或上传;服务器能够存储的任何仪表板都可以导入,因为 1 MiB 的限制针对的是不含缩进的定义)、从现有仪表板(克隆,位于列表和编辑器的导出菜单中),或从新建仪表板提供的入门模板(车队概览、单设备详情、告警看板)创建新的仪表板。三种方式都会经过编辑器打开已存储仪表板时所用的同一套检查,并且始终以你选择的令牌创建新仪表板,不会覆盖现有仪表板。结果是草稿;发布仍需显式操作。
- 本控制台无法解析的组件(例如来自未安装在此处的包)会以占位符保留,其存储的定义保持不变。导入时会列出这些组件,只要仍有占位符,发布就保持被阻止。
- 定义中绑定的设备、客户、区域或资产如果在此租户中不存在,会在保存任何内容之前显示出来。对每一项,你可以从此租户中选择替代项,或保持插槽未绑定并稍后再绑定。确实存在的绑定会原样保留。模板或使用复制为模板导出的定义不带任何绑定,因此会要求你为每个设备插槽选择设备。
- 定义中加载内容所用的每个外部站点(图片、地图瓦片、画布背景)都会在保存任何内容之前列出,因为每次打开仪表板时浏览器都会访问这些站点。
- 入门模板使用
temperature、humidity等示例测量名称;请在编辑器中将其改为你的设备实际上报的名称。
草稿属于作者。读取草稿定义或已发布版本的定义需要 dashboard:write。只持有 dashboard:read 的成员可以看到仪表板的名称、描述以及哪个版本生效,并通过 publishedDashboard 查询获得生效版本的定义。从未发布的仪表板不会向他们提供任何内容,响应会明确说明这一点,而不是返回空白仪表板。
发布或启用某个版本不会改变草稿的 updatedAt,因此用你已持有的基线保存草稿依然有效。版本列表本身只提供每个版本的编号、可选标签和描述,以及谁在何时发布。
面板会记录保存时所用的格式。比该格式更旧的查看器或控制台会拒绝打开此面板并提示升级,而不是错误地绘制它;调用 parseDashboardDefinition 的应用会收到 code 为 'schemaTooNew' 的 DashboardDefinitionError(请检查 code 而不是 instanceof;当应用打包了该包的两个副本时,instanceof 会失效)。以旧格式保存的面板仍可打开,并在加载时转换,布局为近似转换。在编辑器中,转换后的面板会显示一条横幅,提示你检查布局并保存;保存后即写入新格式。旧版本中保存了样本数量的时序图现在改为跟随仪表板的时间范围,横幅会列出这些图表,以便你在需要时为其固定跨度。
嵌入:定义、插槽与绑定清单
仪表板定义可移植,也可作为模板复用。组件绑定到命名插槽,而不是硬编码读取哪台设备。挂载时,宿主提供绑定清单,将每个插槽映射到具体设备或锚点。因此,一份定义加上两份清单,就能为两台不同设备提供两个实时仪表板,无需修改定义本身。
运行时分层组织为以下包:
| 包 | 职责 |
|---|---|
@devicechain/client | TypeScript SDK:认证、GraphQL 操作、实时订阅 |
@devicechain/widgets | React 组件(输入数据源,输出像素),以及布局渲染器 |
@devicechain/dashboards | DashboardHub(管理连接、解析选择器、多路复用遥测订阅),以及定义、选择器、插槽和绑定清单类型 |
React 应用使用解析器构造一个 hub,再结合绑定清单渲染定义,即可嵌入实时仪表板。渲染器通过绑定清单解析每个插槽,因此重新指向某个插槽(例如查看者下钻到某条告警)时,只有绑定到该插槽的组件会重新订阅,仪表板其余部分保留其实时值。仓库中的控制台与独立 /dash 应用都采用此路径,构建时使用与外部使用者下载的相同产物。这些包发布在 npm,外部应用以相同方式安装。参见 npm 包,了解安装命令、版本与 dist-tag 策略,以及地图组件需要的宿主配置。
/dash 参考查看器
独立 /dash 应用是参考外部嵌入应用。它有自己的登录。给它一个仪表板令牌,它会获取该仪表板当前生效的版本;也可以粘贴导出的定义,这不需要访问服务,是外部嵌入方或离线预览的方式。两种方式都可以附加绑定清单,并渲染结果。
它在编写方面只提供查看:没有编辑器、没有保存功能,并且只请求生效版本,从不请求草稿。不过组件动作仍然可用。持有 alarm:write 或 command:write 的查看者,可以通过其渲染的仪表板确认/解除告警,并向真实设备派发命令;服务器始终执行这些权限检查。
会话续期与展示模式
/dash 会在访问令牌到期前,使用登录时获得的刷新令牌自动续期。网络中断或服务器错误不会结束会话:查看器会以逐渐拉长的间隔持续重试,直到当前访问令牌真正到期。如果服务器拒绝续期(服务器上的登录已被结束,或刷新令牌已过期),或中断持续到访问令牌到期之后,仪表板会被全屏的会话已结束提示取代,并提供重新登录按钮,因此显示器不会停在过时的数值上。如果地址中带有 dashboard 参数,重新登录后会回到同一个仪表板。
地址可以携带参数,让书签或墙面显示器以正确的模式打开正确的仪表板:
/dash/?dashboard=<token>&kiosk=1&theme=dark&density=wall
| 参数 | 取值 | 作用 |
|---|---|---|
dashboard | 仪表板令牌 | 登录后直接加载该仪表板当前生效的版本。该参数在登录过程中(包括单点登录)会被保留。 |
kiosk | 1(或 true) | 隐藏页眉及其控件,改为在仪表板角落悬浮显示连接状态徽标和全屏按钮。此模式下没有退出登录控件。 |
chrome | 0(或 false) | 与 kiosk 同用时,同时隐藏悬浮控件,适用于截屏或由页面自行为仪表板加框的场景。仪表板正在重连或已离线时,连接状态徽标仍会显示,因此停止接收数据的仪表板绝不会看起来仍是实时的。 |
theme | dark、light | 设置颜色主题。在非展示模式下,页眉中的开关可切换主题并记住选择;theme 参数本身不会被记住。 |
density | compact、comfortable、wall | 覆盖仪表板创作时设定的密度。它会缩放所有文字和间距尺寸、单元格间距,以及列可以缩小到的最小单元格,因此 wall 绘制得更大,在窄屏上列数更少,compact 则绘制得更小。不带该参数时使用仪表板自身的密度;该参数绝不会保存到仪表板中,也不会被记住。 |
range | 15m、1h、6h、24h、7d | 以该时间范围打开仪表板,而不是仪表板自身的默认范围。查看者仍可更改。 |
paused | 1 | 在加载时刻以暂停状态打开仪表板。其他任何值都会以实时状态打开。 |
rotate | <token>,<token>,... | 轮播列表:两到 24 个仪表板令牌,依次显示。它隐含 kiosk,并优先于 dashboard。 |
every | 秒,10 到 3600 | rotate 列表中每个仪表板显示的时长。缺省为 60。 |
取值无法识别的参数会被忽略,并在浏览器控制台输出警告;仪表板仍会加载,该项设置使用默认值。
轮播列表
需要在多个仪表板之间循环的墙面显示屏使用 rotate:
/dash/?rotate=<token-a>,<token-b>,<token-c>&every=45&density=wall
每个仪表板显示 every 秒,然后由下一个接替,最后一个之后从头再来。底边的一条细进度条显示当前仪表板已播放多久,一个小控制条给出仪表板名称、它在列表中的位置,并提供上一个、暂停和下一个按钮。chrome=0 会隐藏控制条,保留进度条。
- 下一个仪表板在轮到之前就已读取:在当前仪表板的最后十秒(间隔很短时则立即)读取,因此切换到的是已经就绪的仪表板。每个仪表板的在线版本在每一轮都会重新读取,所以你发布的仪表板会在列表下次轮到它时出现。
- 操作仪表板会暂停轮播。 点击、按键、滚动或触摸都会让列表停住,避免有人正在阅读的组件被切走;在这些操作都停止 30 秒后恢复。暂停按钮会一直保持暂停,直到再次按下。处于暂停状态的列表总会有所提示,即使设置了
chrome=0。 - 无法打开的仪表板会被跳过,页面上会有一条说明它及原因的提示,其余仪表板继续播放。如果没有任何仪表板能打开,页面会说明并提供重试。
- 链接的其余参数对每个仪表板都生效。 每个仪表板使用相同的
range,或相同的固定from和to窗口,以及相同的theme和density。bind.<slot>参数会在拥有同名槽位的仪表板上绑定该设备,在其他仪表板上则略去,因此一条链接可以为多个仪表板绑定设备。 - 无法使用的部分会被忽略,并在页面上提示。 不是仪表板令牌的条目会被跳过;超出 10 到 3600 秒或不是整数的
every回退为 60;超过 24 个的仪表板会被截掉;可用仪表板少于两个就不是轮播列表(只有一个时,等同于在dashboard中指定它)。提示可以关闭;墙面显示屏继续播放。
另请参见架构概览和 GraphQL API 参考。