Saltar al contenido principal

Paneles

DeviceChain incluye un sistema de paneles (dashboards) embebible y con control de versiones para visualizar datos de dispositivos en vivo. Un panel es un recurso con alcance de inquilino creado en la consola y renderizado a partir de una definición JSON portable — la misma definición puede embeberse en cualquier aplicación React o abrirse en el visor de referencia independiente.

Estado

Disponible: el editor de lienzo (canvas), el conjunto de widgets integrado (widgets de telemetría, alarma y comando/control), suscripciones en vivo, acciones de widget (reconocer/limpiar alarma, enviar comando — autorizadas por el servidor), versionado (publicar / revertir), vista previa sintética, slots con nombre + manifiestos de vinculación (binding manifests), y exportación — además del visor de referencia independiente /dash. Planeado: publicar los paquetes de runtime en el registro público de npm (hoy se compilan dentro del repositorio), selectores de fuente de datos más completos (recorrido del grafo de relaciones, drill-down), edición de diseño por punto de quiebre (breakpoint), y widgets adicionales.

El lienzo

Un panel distribuye widgets en una cuadrícula CSS fluida: una cuadrícula de columnas de alta resolución (los widgets se colocan por extensión de columna/fila, no por píxeles fijos), orden en z / capas, un desplazamiento en píxeles opcional por widget para ajuste fino o superposición, y una imagen o color de fondo opcional. Como las columnas son fraccionarias, un panel llena el ancho de cualquier contenedor en el que se monte — un panel lateral, un marco de ancho fijo, o una página completa — y un control de dimensionamiento en el momento del montaje (fill, ancho fijo, o alto fijo) permite que el host elija. El ajuste a la cuadrícula (snap-to-grid) es inherente a la cuadrícula, y como los widgets pueden compartir celdas y apilarse por z, aún pueden superponerse (por ejemplo, tarjetas sobre una imagen de plano de planta). Los diseños son por punto de quiebre, de modo que un panel puede organizarse de forma distinta en diferentes tamaños de pantalla.

Widgets

Los widgets integrados abarcan tres canales — telemetría, alarma y control — y se renderizan sobre Apache ECharts:

WidgetCanalMuestra
Gráfico de series temporalestelemetríauna o más series de mediciones a lo largo de una ventana de tiempo
Medidor (gauge)telemetríael último valor único frente a un rango / umbrales
Tarjeta de último valortelemetríauna sola lectura actual con su marca de tiempo
Tablatelemetríafilas recientes para un dispositivo o ancla
Etiquetatelemetríatexto estático
Imagentelemetríauna imagen estática (p. ej. un plano de planta detrás de otros widgets)
Tabla de alarmasalarmaalarmas en vivo para un dispositivo o ancla
Conteo de alarmasalarmaun recuento acumulado de alarmas abiertas
Comando / controlcontrolun formulario de parámetros tipado que despacha un comando y muestra su ciclo de vida de entrega en vivo

Los widgets se tematizan con propiedades personalizadas de CSS, de modo que una aplicación embebedora controla su apariencia sin modificar el código del widget.

Los widgets también pueden portar acciones — reconocer o limpiar una alarma, o enviar un comando — que el servidor autoriza contra los propios derechos con alcance de inquilino del solicitante (por ejemplo, una acción que requiere alarm:write queda inerte para un visor de solo lectura).

Fuentes de datos

Un widget no embebe una consulta — embebe un selector tipado que el runtime resuelve:

  • device — un solo dispositivo por token.
  • anchor — telemetría con alcance a una entidad organizacional (un cliente, área o activo), agregada mediante una consulta del lado del servidor sobre los eventos anclados a esa entidad.

Los selectores se resuelven a través del SDK de cliente contra la API GraphQL, de modo que la resolución es en vivo — un dispositivo recién asignado a un área aparece en el panel de esa área sin editarlo — y verificada por permisos, porque usa el propio acceso de API autenticado y con alcance de inquilino del solicitante. Los valores en vivo llegan mediante suscripciones GraphQL, multiplexadas de modo que un panel con muchos widgets abre un flujo por dispositivo en lugar de uno por widget.

Creación, versionado y vista previa

Los paneles se crean en la consola:

  • Un editor de lienzo de arrastrar y redimensionar con selectores reales de dispositivo / ancla.
  • Versionado — la definición en vivo es un borrador mutable; publicar la captura como una versión inmutable, y puedes revertir a cualquier versión anterior (lo que la vuelve a convertir en borrador en el mismo lugar). El historial es una lista de instantáneas publicadas, no un diff.
  • Vista previa sintética — sustituye los datos en vivo por un generador del lado del cliente (seno / rampa / paseo aleatorio) para validar el diseño, las escalas y los umbrales antes de que ningún dispositivo haya reportado.
  • Exportación — descarga o copia una definición para compartirla o embeberla en otro lugar.

Incrustación: definiciones, slots y manifiestos de vinculación

Una definición de panel es portable y reutilizable como plantilla. En lugar de codificar de forma fija qué dispositivo lee cada widget, los widgets se vinculan a slots con nombre; un host suministra un manifiesto de vinculación (binding manifest) en el momento del montaje que mapea cada slot a un dispositivo o ancla concreto. Así, una definición + dos manifiestos → dos paneles en vivo para dos dispositivos distintos, sin ningún cambio en la definición misma.

El runtime está estructurado como paquetes en capas:

PaqueteRol
@devicechain/clientel SDK de TypeScript — autenticación, operaciones GraphQL, suscripciones en vivo
@devicechain/widgetslos componentes de widget en React (entra la fuente de datos, salen los píxeles)
@devicechain/dashboardsel DashboardHub (posee la conexión, resuelve selectores, multiplexa suscripciones) y el renderizador

Cualquier aplicación React embebe un panel en vivo construyendo un hub con un resolvedor y un manifiesto de vinculación, y renderizando la definición. La aplicación independiente /dash es el embebedor externo de referencia: tiene su propio inicio de sesión, acepta una definición exportada más un manifiesto de vinculación, y la renderiza en modo solo vista — el ejemplo de referencia para embeber paneles de DeviceChain en una aplicación separada.

Consulta también la vista general de Arquitectura y la referencia de la API GraphQL.