devicescript-consola-debugging-logging

Consola y depuración en DeviceScript

  • 4 min

La consola de DeviceScript es el canal con el que observamos lo que ocurre dentro del programa, tanto en el simulador como en una placa conectada.

En Arduino, nuestra ventana al mundo es el Serial.print(). Funciona, pero es primitivo. Tenemos que concatenar cadenas, convertir números a texto manualmente y, si queremos ver el estado de un objeto complejo, tenemos que imprimir sus variables una a una.

En DeviceScript, jugamos con ventaja. Al estar en el ecosistema de VS Code y TypeScript, tenemos herramientas de depuración “de verdad”.

El objeto console

En DeviceScript, la depuración se realiza principalmente a través del objeto global console, con una API parecida a la de JavaScript en otros entornos.

La salida de estos comandos viaja desde el microcontrolador (o el simulador) a través del cable USB o WiFi, y se muestra directamente en el panel “DeviceScript” de la terminal de VS Code.

Niveles de registro

No todo es un simple mensaje. Tenemos varios niveles de severidad que nos ayudan a filtrar el ruido visualmente:

console.log("Mensaje estándar: Todo va bien")
console.debug("Debug: Datos internos aburridos pero útiles")
console.warn("Advertencia: Algo raro ha pasado, pero sigo funcionando")
console.error("Error: ¡Houston, tenemos un problema!")
Copied!

Usar console.error no detiene el programa, pero en VS Code suele resaltar la línea en rojo brillante, lo que ayuda mucho a detectar fallos rápidamente entre un mar de texto.

Formatear cadenas

En C++ (Arduino), hacer una frase con variables suele ser tedioso: Serial.print("Temperatura: "); Serial.print(t); Serial.println(" C");

En DeviceScript, usamos las Template Strings (comillas invertidas ```) de TypeScript. Es una maravilla para la legibilidad:

let temperatura = 24.5
let humedad = 60

// Limpio, elegante y legible
console.log(`Lectura actual -> Temp: ${temperatura}°C | Humedad: ${humedad}%`)
Copied!

Registrar datos estructurados

Podemos pasar varios valores a console.log, aunque para registrar medidas de sensores DeviceScript incorpora una opción más específica: console.data añade automáticamente una marca de tiempo y envía los datos al panel DeviceScript - Data.

const estadoRobot = {
    id: "Robot-01",
    bateria: 85,
    posicion: { x: 10, y: 20 },
    activo: true
}

console.log(estadoRobot)
console.data({ bateria: estadoRobot.bateria, x: estadoRobot.posicion.x })
Copied!

El formato exacto de un objeto complejo puede depender de la versión del runtime. Para telemetría, es preferible enviar un objeto plano con console.data.

Esto es vital cuando trabajamos con sensores que devuelven muchos datos o configuraciones complejas. Poder ver el estado completo de un objeto de un vistazo ahorra horas de debugging.

Inspeccionar el programa con el depurador

A veces, el console.log es demasiado rápido y llena la pantalla (“scroll ciego”). Si tenemos un sensor leyendo cada 50ms, la consola se vuelve ilegible.

DeviceScript y VS Code tienen una característica genial: Watch Variables (Inspección de variables).

Como estamos en un entorno de depuración real, podemos poner Breakpoints (Puntos de ruptura).

  1. Haz clic en el margen izquierdo de una línea de código para añadir un punto de interrupción.
  2. Ejecuta el programa en modo Debug con F5 o desde el panel de depuración.

Cuando el código llegue a esa línea, el microcontrolador se pausará.

En el panel Variables puedes consultar el estado del programa en ese instante, inspeccionar objetos y revisar colecciones.

Al pausar el programa, la capa de comunicación de servicios continúa procesando paquetes, pero tu código DeviceScript deja de avanzar. No depures de esta forma un equipo cuyo estado pueda volverse peligroso al detener la lógica de control.

Usar el panel visual

Además de la consola, el dashboard permite observar el estado de los servicios simulados.

Si usamos servicios estándar como LightBulb o Button, no necesitamos llenar el código de mensajes redundantes.

Simplemente, mirad el Dashboard.

  • ¿El icono del botón se hunde? -> El código lo detecta.
  • ¿El icono de la bombilla se enciende? -> La lógica de salida funciona.

Esto parece obvio, pero a menudo llenamos el código de logs innecesarios cuando una simple mirada al estado del servicio en el panel nos daría la respuesta.