Ir al contenido

Patrones y buenas prácticas

Cuatro patrones cubren la mayoría de los artefactos. Todos parten de que gVar ya está cargado cuando tu código empieza a correr.

No hay inicialización: se lee y se refresca.

setInterval(() => {
console.log("miVariable:", gVar.miVariable);
}, 500);
const claves = ["temperatura", "humedad", "estado"];
setInterval(() => {
for (const clave of claves) {
document.querySelector("#" + clave).textContent = gVar[clave] ?? "";
}
}, 500);

Un botón que escribe una gVar, y la UI que refleja el estado real:

const boton = document.querySelector("#luz");
boton.addEventListener("click", () => {
gVar.encender = !gVar.encender;
});
setInterval(() => {
boton.classList.toggle("activo", gVar.encendido === true);
}, 500);
setInterval(() => {
const proj = plotSerie("temperaturas", { maxPoints: 100, timeMode: "clock" });
if (!proj) return;
dibujar(proj.points.map((p) => p.label), proj.points.map((p) => p.y));
}, 500);
NecesidadHerramienta
Adquisición constante y fiable de datos del hardwareboardCode del thing, no el artefacto.
Registrar eventos del usuariopushData desde el artefacto.
Leer gVar y actualizar la pantallasetInterval(..., 500).
Animar entre valoresrequestAnimationFrame.
  • Relee cada 500 ms. Es el ritmo con el que la plataforma sincroniza; leer gVar es local y no genera tráfico.
  • pushData, nunca push() sobre el arreglo de una serie: el segundo pierde la marca de tiempo.
  • Series recortadas: para gráficas usa plotSerie; el eje X sale de point.label y el valor de point.y, nunca de point.x ni de la posición en el arreglo.
  • Comprueba el null de plotSerie antes de dibujar: significa que la serie todavía no tiene datos.
  • Considera el gateway caído. gVarStatus.gatewayOnline === false significa que los things no están en línea; muestra ese estado en vez de datos congelados.
setInterval(() => {
const texto = gVarStatus.gatewayOnline ? "Conectado" : "Dispositivo desconectado";
document.querySelector("#estado").textContent = texto;
}, 500);

Cuando el usuario cambia de pestaña, el navegador congela o ralentiza los timers. Un artefacto en segundo plano deja de refrescar la UI y deja de generar datos con pushData: lo que no se ejecutó, no ocurrió. La plataforma también pausa la sincronización mientras la pestaña está oculta y la retoma al volver.

Conclusión práctica: la adquisición de datos vive en el thing, no en el artefacto. Un artefacto es la interfaz, no el registrador.

AcciónQué pasa
gVar.config.avanzado.x = 2Los cambios anidados de más de un nivel no se detectan. Reasigna el objeto completo.
structuredClone(gVar)Falla: gVar es un Proxy. Usa { ...gVar }.
gVar.serie.push(x)Viaja sin marca de tiempo. Usa pushData.
pushData desde dos pestañas a la vezSolo escribe la que tenga el rol; la otra avisa por console.warn.
boardCode y artefacto alimentando la misma serieMarcas de tiempo desordenadas: elige un solo escritor por serie.