Consola de Explotación Fusión 3D
Fusión 3D Prototipo de consola · InfluxDB + Grafana

Consola de explotación

Las dos piezas que faltaban: la visualización de series temporales sobre Grafana embebido, y el control de desviaciones con notificaciones por rol. Cambia el rol arriba a la derecha y verás cómo cambia todo lo demás.

Sesión iniciada como

Series temporales

iframe src

En producción esta zona es un <iframe> a un panel de Grafana en modo kiosk. La selección de zona, métrica y rango no se hace dentro de Grafana: se hace aquí y viaja al panel por variables en la URL, que es lo que ata el modelo 3D a los datos. Lo que ves dibujado es una simulación con datos generados.

—
desviaciones abiertas
—
críticas sin reconocer
14 min
tiempo medio de reconocimiento
objetivo del contrato: 30 min
1.240 kWh
exceso acumulado del mes
sobre línea base corregida

Desviaciones y avisos

Política de notificación

Severidad🔧 Instalador / mantenedor📋 Administrador / gestor🏢 Propiedad
Horario silencioso

De 22:00 a 7:00 solo salen las críticas. El resto se acumula en el resumen de la mañana.

Antirruido

Histéresis del 5 %, dos lecturas consecutivas fuera de banda, máximo 6 avisos por hora y edificio, y agrupación por zona.

Escalado

Sin reconocer a los 15 min → segundo canal y jefe de mantenimiento. A los 60 min → administrador.

Modo mantenimiento

Silencia una zona durante una intervención programada, y lo deja registrado para que no parezca un hueco de datos.

01

Cómo encaja Grafana e InfluxDB

Con la pila decidida, la pregunta ya no es «Grafana sí o no», sino dónde termina Grafana y dónde empieza Fusión 3D. Si esa frontera queda difusa, acabáis manteniendo dos productos que se pisan. La línea que propongo es nítida: Grafana dibuja las series, y todo lo espacial —el color de una zona en el modelo, la chincheta que parpadea, el estado que ve el técnico en el móvil— lo resuelve vuestro backend consultando InfluxDB directamente.

Gateway del edificioKNX · BACnet · Modbus · Matter → MQTT saliente
NormalizadorTraduce a modelo canónico de punto y escribe con protocolo de líneas
InfluxDBSerie temporal, bucket por inquilino, tareas de agregado
API Fusión 3DConsulta directa para el 3D, el estado y los informes
GrafanaPaneles embebidos y exploración del instalador
La API y Grafana leen del mismo InfluxDB, pero para cosas distintas y con credenciales distintas.
NecesidadQuién la resuelvePor qué
Colorear las zonas del modelo 3D por temperatura o consumoAPI propia → InfluxDBEs un valor por espacio, cacheado en Redis. Meter un iframe aquí sería absurdo
Estado actual y minigráfico en la ficha de una estanciaAPI propia → InfluxDBDebe funcionar en el móvil del técnico, offline y en dos toques
Gráfica de detalle, comparación entre zonas, rangos largosGrafana embebidoEs exactamente para lo que existe. No tiene sentido reescribirlo
Exploración libre del instalador cuando algo huele raroGrafana, abierto aparteEnlace «abrir en Grafana» con el rango y la zona ya puestos
Informe de cumplimiento auditableAPI propia → InfluxDBLa evidencia tiene que ser vuestra, exportable y con sello de tiempo, no una captura de pantalla
Evaluación de reglas y umbralesGrafana Alerting → webhookVer el apartado 4: se aprovecha el evaluador, pero la incidencia vive en vuestro dominio

La regla de oro del embebido

El usuario nunca navega dentro de Grafana. Los controles —zona, métrica, rango— están en vuestra interfaz y viajan al panel como variables en la URL del iframe, como se ve en la barra gris de arriba: si cambias de zona, cambia el src. Así el modelo 3D sigue siendo el mando y Grafana es la pantalla, no un producto paralelo con su propio menú.

02

Esquema en InfluxDB

Aquí se decide si el sistema aguanta o se ahoga a los dos años. En una base de series temporales el enemigo no es el volumen de puntos, es la cardinalidad: el número de combinaciones distintas de etiquetas. Cada etiqueta que se añade multiplica, no suma.

medida:  lectura

etiquetas (indexadas, cardinalidad acotada)
  tenant      tnt_brain4          // redundante con el bucket, útil en consultas
  building    bld_olias
  storey      sty_p02
  space       spc_open_space      // la clave: permite agrupar por zona
  point       pnt_knx_1_2_14
  metric      energia_activa      // temperatura | potencia | co2 | estado
  protocol    knx

campos (no indexados)
  value       12.4
  quality     1                   // 0 = dato dudoso o interpolado

NUNCA como etiqueta: marcas de tiempo, identificadores de mensaje,
valores continuos, nombres de estancia editables por el usuario.
El nombre legible vive en PostgreSQL y se une por space; si se
etiqueta con el nombre, cada vez que el gestor lo corrija nace
una serie nueva y el histórico se parte en dos.
DecisiónRecomendaciónMotivo
Aislamiento entre clientesUn bucket por inquilino, y por edificio en carteras grandesAislamiento duro, tokens de lectura por inquilino y borrado limpio al darse de baja. Filtrar por etiqueta depende de que nadie se equivoque en una consulta
RetenciónCrudo 13 meses · agregados 10 minutos y 1 hora, sin caducidadTrece meses permiten comparar contra el mismo mes del año anterior, que es como se mide el ahorro. Los agregados son los que sostienen el informe de cumplimiento
AgregadosTarea programada que rellena los buckets de 10 min y 1 hUna gráfica de 30 días no debe leer datos crudos: ni Grafana ni el móvil lo aguantan bien
EscrituraPor lotes desde el normalizador, con reintento y cola en el gatewayUn corte de red no puede perder lecturas: la continuidad del histórico es un requisito normativo, no una comodidad
HuecosMarcar la ausencia como evento, no interpolar en silencioUn hueco no detectado es un fallo de eficiencia que nadie ve. De hecho, «sin datos» debe ser una regla de aviso

Cambio respecto al documento de arquitectura

En el análisis inicial propuse TimescaleDB para las series. Con InfluxDB decidido, ese punto queda sustituido y conviene actualizar el documento. La consecuencia real es que ya no hay una sola base de datos: la semántica del edificio, los anclajes y los inquilinos siguen en PostgreSQL, y las lecturas viven aparte. Todo lo que antes se resolvía con un join ahora son dos consultas y una unión en el servicio. No es grave, pero hay que asumirlo en el diseño de la API desde el principio en lugar de descubrirlo en el tercer informe.

03

Embeber Grafana en condiciones

Autenticación

Es la parte que más proyectos rompe. Hay tres caminos y solo uno sirve para un SaaS multi-inquilino:

  • Acceso anónimo: trivial de montar y descartado de inmediato. Cualquiera con la URL ve los datos de un edificio ajeno.
  • Paneles públicos o compartidos: cómodo para una demo comercial, inaceptable para datos de cliente. Sirve, como mucho, para el edificio de muestra de la web.
  • Autenticación por JWT: vuestro backend firma un token de vida corta con el usuario y su organización, Grafana lo verifica con la clave pública y aplica sus permisos. Es la vía correcta y la que hay que montar desde el primer día, porque migrar después obliga a rehacer usuarios y carpetas.

Con eso resuelto: una organización de Grafana por inquilino, una carpeta por edificio, y un usuario de servicio con permiso de solo lectura sobre el bucket que le corresponde.

Los paneles se aprovisionan como código

Nadie construye a mano el panel de cada cliente. Los cuadros de mando se definen en ficheros versionados y se despliegan con el resto del sistema, con variables por edificio y por zona. Un cliente nuevo no es trabajo de configuración: es una fila más.

// URL que compone el frontend para el iframe
const src = `${GRAFANA}/d-solo/fusion-zona/zona`
  + `?orgId=${tenant.grafanaOrgId}`
  + `&panelId=2`
  + `&var-building=${buildingId}`
  + `&var-space=${spaceId}`          // ← lo pone el clic en el modelo 3D
  + `&var-metric=${metric}`
  + `&from=now-24h&to=now`
  + `&theme=${isDark ? 'dark' : 'light'}`   // el panel sigue el tema de la app
  + `&kiosk`                                // sin menús de Grafana
  + `&auth_token=${shortLivedJwt}`;

# grafana.ini — lo mínimo para que el iframe cargue
[security]
allow_embedding = true
cookie_samesite = none          // exige HTTPS en ambos extremos
[auth.jwt]
enabled = true
header_name = X-JWT-Assertion
jwk_set_url = https://api.fusion3d.es/.well-known/jwks.json
LímiteQué significaQué hacer
Licencia AGPLGrafana OSS es AGPLv3. Ejecutarlo como servicio aparte y embeberlo por iframe no convierte vuestro código en derivado, pero modificar Grafana sí obliga a publicar esos cambiosNo tocar el código de Grafana. Si hace falta, consultarlo con un abogado antes, no después
MarcaQuitar el logotipo y personalizar la apariencia es función de la edición EnterpriseAsumir la marca de Grafana en el panel, o presupuestar Enterprise cuando el cliente lo exija
Cookies de tercerosLos navegadores restringen cookies entre dominios y eso rompe iframes mal montadosServir Grafana bajo vuestro propio dominio, por ejemplo metricas.fusion3d.es, detrás del mismo proxy
Vuelta desde GrafanaUn panel puede enlazar hacia vuestra aplicación, pero no puede pedirle que navegue estando dentro del iframeLa dirección 3D → Grafana es fluida por variables; la contraria, un enlace que abre pestaña. No prometer más
MóvilUn panel embebido en una pantalla de teléfono se lee malEn móvil, minigráfico propio y botón «ver detalle», que abre Grafana a pantalla completa
04

Desviaciones: quién evalúa y quién manda

Grafana trae un motor de alertas capaz de evaluar consultas y disparar avisos. La tentación es usarlo tal cual y ahorrarse el trabajo. La tentación contraria es escribir un motor propio desde cero. Las dos son malas por separado; la buena es partirlo:

  • Grafana evalúa la condición sobre InfluxDB y dispara. Os ahorra el bucle de evaluación, el estado pending, la histéresis y las ventanas temporales, que es bastante código aburrido y delicado.
  • Un punto de contacto de tipo webhook entrega el disparo a vuestra API en lugar de mandar un correo.
  • Fusión 3D crea la incidencia: la ata a un espacio y a un punto, le pone severidad, la coloca en el modelo 3D, decide a quién avisar según la política, y le lleva el ciclo de vida hasta el cierre.

La razón de fondo es que una alerta de Grafana vive en Grafana: no sabe qué es un anclaje, no puede reconocerse desde el móvil del técnico, no entra en el parte de mantenimiento y no aparece en el informe de cumplimiento. La evaluación es commodity; la incidencia es vuestro producto.

POST /v1/hooks/grafana   (punto de contacto tipo webhook)
{
  "status": "firing",
  "labels": {
    "rule": "consumo_sobre_base",
    "space": "spc_open_space",     // las etiquetas de Influx viajan intactas
    "building": "bld_olias",
    "severity": "serious"
  },
  "values": { "actual": 41.2, "baseline": 29.8 },
  "startsAt": "2026-09-06T18:42:11Z",
  "fingerprint": "a3f1c9…"          // idempotencia: no duplicar la incidencia
}

→ Fusión 3D: crea o actualiza la incidencia, resuelve el anclaje del
espacio, aplica la política de notificación por rol y horario, y devuelve 200.
El cierre llega con el mismo fingerprint y status "resolved".

Las reglas que de verdad hacen falta

Cinco tipos cubren el noventa por ciento de lo que un edificio necesita vigilar. Conviene resistirse a añadir más hasta que un cliente lo pida:

  • Umbral sobre un valor absoluto, con banda y tiempo mínimo fuera de banda. La sala técnica a más de 28 °C durante diez minutos.
  • Desviación sobre línea base corregida por grados-día y por día de la semana. Es la regla que exige la normativa y la que justifica el ahorro.
  • Consumo fuera de horario, que es la desviación más fácil de detectar y la que más dinero devuelve el primer mes.
  • Ausencia de dato: un punto que lleva tres horas mudo. Sin esta regla, una pasarela caída pasa por un edificio que no consume.
  • Equipo que no responde a un comando, que distingue un fallo de comunicación de un fallo de la máquina.

El registro de incidencias es la evidencia normativa

El RITE exige que el sistema detecte las pérdidas de eficiencia e informe al responsable. Ese «e informe» es literal: hay que poder demostrar a quién se avisó, cuándo y qué se hizo. El rastro que se ve en la ficha de la desviación —detectada, notificada, reconocida, resuelta, con nombres y horas— no es un adorno de la interfaz: es el documento que se le enseña al inspector y el que sostiene la medición y verificación de un certificado de ahorro. Conviene que sea inmutable y exportable desde el primer día.

05

Notificaciones: dos personas, dos productos

El error clásico de este módulo es tratar «avisar» como una función técnica. No lo es: el instalador y el administrador quieren cosas opuestas, y si se les manda lo mismo, uno se satura y el otro se entera tarde.

🔧 Instalador o mantenedor📋 Administrador o gestor
Qué quiereSaber qué está roto, dónde está y poder actuarSaber si el edificio va bien y qué le va a costar
CuándoAhora, incluida la madrugada si es críticoPor la mañana, en un resumen. Solo lo crítico interrumpe
CanalNotificación en el móvil y WhatsApp; SMS al escalarCorreo con el resumen; WhatsApp solo para lo crítico
Qué puede hacerReconocer, actuar sobre el equipo, cerrar con causaReconocer, pedir intervención, aprobar gasto
Qué le sobraLos resúmenes y los gráficos bonitosEl detalle técnico y los avisos de comunicación

Lo que impide que el sistema se vuelva ruido

Un sistema de avisos mal calibrado se desactiva solo: la gente lo silencia y a partir de ahí no protege nada. Cinco defensas, todas visibles en el panel de arriba:

  • Histéresis y confirmación: no se avisa al primer cruce del umbral, sino tras dos lecturas consecutivas fuera de banda, y no se cierra hasta volver con un margen del 5 %.
  • Tope por hora y edificio: pasado el tope, se agrupa en un único aviso con el recuento.
  • Agrupación por zona y causa: si caen doce puntos de la misma planta, es un aviso de planta, no doce avisos.
  • Modo mantenimiento: silenciar durante la intervención y dejarlo registrado, para que ese hueco de datos tenga explicación en el informe.
  • Escalado en lugar de repetición: si nadie reconoce, no se repite el mismo mensaje, se sube de canal y de persona.

Y un detalle que vosotros tenéis regalado: la API de WhatsApp Business ya la habéis integrado en GrinPass. Para un administrador de fincas español, WhatsApp es el canal que sí lee. Reutilizarlo aquí es de las pocas ventajas de partida que no hay que construir.

Qué construir, en este orden

  • Semana 1-2 · InfluxDB con el esquema de etiquetas y las tareas de agregado; escritura por lotes desde el normalizador.
  • Semana 2-3 · Grafana con autenticación por JWT, una organización por inquilino y dos paneles aprovisionados: zona y edificio.
  • Semana 3-4 · Incidencias: webhook de Grafana, ciclo de vida, ficha con rastro auditable y aparición en el modelo 3D.
  • Semana 4-5 · Política de notificación por rol, con WhatsApp y correo, escalado y antirruido.
  • Semana 5-6 · Línea base corregida por grados-día y el informe mensual exportable, que es lo que cierra el argumento de cumplimiento.

Fusión 3D · Brain4 Solutions, S.L. · Prototipo de consola de explotación con InfluxDB y Grafana, 6 de septiembre de 2026. Los datos mostrados son generados; la barra de iframe src muestra la URL real que compondría el frontend. Paleta de series validada para deficiencias de visión del color y contraste en ambos temas.