IoT e IA

Predicción de demanda energética con datos de contadores IoT y MQTT

Un caso práctico de predicción de demanda energética: recoger datos de contadores por MQTT, convertir contadores de energía en demanda, añadir variables de clima y calendario y publicar pronósticos del día siguiente para edificios y plantas.

Dashboard de predicción de demanda energética que compara la demanda medida de un edificio con un pronóstico del día siguiente y un límite de potencia máxima
Pruébalo en tu propio broker MQTTConsigue un broker MQTT privado y gestionado con el plan Free y empieza con ejemplos de código listos para usar.
Pruébalo gratis Ejemplos de código Sin tarjeta

La predicción de demanda energética estima cuánta electricidad consumirá un edificio, una planta o un emplazamiento en las próximas horas o días. Con contadores IoT que envían lecturas por MQTT, puedes construir un pronóstico a partir de tus propios datos en lugar de depender de las facturas mensuales. Este caso de uso recorre el camino de los datos desde el contador hasta el modelo, las variables que importan para la demanda, un script funcional de predicción del día siguiente y cómo publicar el resultado para que sirva para recortar picos y tomar decisiones de planificación.

Por qué predecir la demanda energética

Un pronóstico de carga responde a preguntas prácticas que los responsables de instalaciones y producción afrontan a diario:

  • Gestión de la demanda máxima. Muchas tarifas incluyen cargos por potencia basados en el intervalo más alto del mes. Saber de antemano que mañana por la tarde te acercarás al límite te permite desplazar cargas flexibles.
  • Planificación de cargas flexibles. Los procesos por lotes, la carga de vehículos eléctricos, el preenfriamiento y el calentamiento de agua pueden moverse a horas con menor demanda o precios más bajos.
  • Compras y autoconsumo. Los emplazamientos con fotovoltaica, baterías o contratos con discriminación horaria necesitan un pronóstico de demanda para decidir cuándo cargar, descargar o comprar.
  • Detección de anomalías. Una diferencia grande y persistente entre el pronóstico y la carga real suele indicar equipos que se han quedado encendidos, un compresor que falla o un error de medición.

El horizonte de predicción depende de la decisión: los pronósticos intradía (próximas horas) apoyan el control en tiempo real, los del día siguiente apoyan la planificación y las compras, y los horizontes más largos sirven para elaborar presupuestos.

El camino de los datos: del contador al modelo

Una instalación típica tiene contadores o subcontadores eléctricos conectados a un gateway que los lee por Modbus, M-Bus o una API del fabricante y publica las lecturas en un broker MQTT. Los datos meteorológicos y los calendarios de producción u ocupación se publican o almacenan junto a ellos.

Meters (Modbus RTU/TCP) -> gateway -> MQTT broker -> historian subscriber -> forecasting service
                                           ^                                         |
                       weather / schedule publisher                 forecast topic <-+

Una estructura de topics clara mantiene el modelo independiente de los fabricantes de contadores:

connectmq/site1/main/meter1/energy       {"ts":..., "kwh_total": 183422.6}
connectmq/site1/main/meter1/power        {"ts":..., "kw": 142.8}
connectmq/site1/weather/outdoor          {"ts":..., "temp_c": 27.4}
connectmq/site1/main/meter1/forecast     {"generated":..., "points":[...]}

Siempre que puedas, publica la energía como un contador acumulado en lugar de valores por intervalo. Si se pierde un mensaje, el siguiente valor del contador sigue conteniendo el consumo, y la demanda por intervalo se puede reconstruir exactamente por diferencias. La potencia instantánea es útil para dashboards en directo, pero resulta ruidosa para predecir. Si tus contadores son dispositivos Modbus, la guía Modbus TCP a MQTT muestra la parte del gateway.

Variables que determinan la predicción de demanda energética

Grupo de variables Ejemplos Por qué importa
Calendario Hora del día, día de la semana, indicador de festivo, mes La ocupación y la producción siguen horarios
Carga con retardo Misma hora de ayer, misma hora de la semana pasada La demanda tiene una fuerte persistencia
Clima Temperatura exterior, su pronóstico, humedad, irradiancia solar Las cargas de calefacción y refrigeración dependen de ella
Clima derivado Grados-hora de refrigeración y calefacción, retardo de temperatura Los edificios responden con inercia térmica
Operación Plan de producción, patrón de turnos, recuento de ocupantes Explica la variación no debida al clima

En los pronósticos del día siguiente, todas las variables deben estar disponibles antes de hacer la predicción. Eso significa usar el pronóstico meteorológico, no la temperatura medida, para las horas futuras, y usar retardos de al menos 24 horas. Mezclar clima medido y pronosticado durante el entrenamiento es una causa habitual de modelos que parecen excelentes en las pruebas y decepcionan en operación.

Un pronóstico del día siguiente en Python

El siguiente script simula el contador y la temperatura exterior de un edificio comercial durante cuatro semanas, los publica en el servidor MQTT público gratuito (pensado para pruebas y prototipos, no para datos de producción), los vuelve a recoger, convierte el contador en demanda cada 15 minutos, entrena un modelo de gradient boosting y publica un pronóstico de 24 horas. En un despliegue real, el paso de recogida leería de tu historian en lugar de un simulador.

import json
import math
import random
import time
import uuid

import numpy as np
import pandas as pd
import paho.mqtt.client as mqtt
from sklearn.ensemble import HistGradientBoostingRegressor

BROKER = "broker.connectmq.com"
BASE = f"connectmq/demo/{uuid.uuid4().hex[:8]}/site1"
START = 1767225600  # 2026-01-01 00:00 UTC
STEPS = 28 * 96     # 4 semanas de intervalos de 15 minutos
rows = []


def on_message(client, userdata, msg):
    p = json.loads(msg.payload)
    p["kind"] = msg.topic.rsplit("/", 1)[1]
    rows.append(p)


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="elf-" + uuid.uuid4().hex[:8])
client.on_message = on_message
client.connect(BROKER, 1883, keepalive=60)
client.subscribe([(f"{BASE}/meter1/energy", 1), (f"{BASE}/weather/temp", 1)])
client.loop_start()
time.sleep(1)

counter = 100000.0
for i in range(STEPS):
    t = START + i * 900
    hour = (t % 86400) / 3600
    workday = time.gmtime(t).tm_wday < 5
    temp = 24 + 7 * math.sin((hour - 9) / 24 * 2 * math.pi) + random.gauss(0, 1)
    occupied = workday and 7 <= hour < 19
    kw = 40 + (90 if occupied else 0) + 6 * max(temp - 22, 0) + random.gauss(0, 5)
    counter += kw * 0.25
    client.publish(f"{BASE}/meter1/energy", json.dumps({"ts": t * 1000, "kwh_total": round(counter, 2)}))
    client.publish(f"{BASE}/weather/temp", json.dumps({"ts": t * 1000, "temp_c": round(temp, 2)}))
    time.sleep(0.21)  # dos mensajes por paso, por debajo de 10 msg/s

time.sleep(3)

df = pd.DataFrame(rows)
df["ts"] = pd.to_datetime(df["ts"], unit="ms", utc=True)
energy = df[df.kind == "energy"].set_index("ts")["kwh_total"].sort_index().resample("15min").last()
temp = df[df.kind == "temp"].set_index("ts")["temp_c"].sort_index().resample("15min").mean()

data = pd.DataFrame({"kw": energy.interpolate().diff() * 4, "temp": temp.interpolate()})
data["hour"] = data.index.hour + data.index.minute / 60
data["dow"] = data.index.dayofweek
data["lag_1d"] = data["kw"].shift(96)
data["lag_7d"] = data["kw"].shift(7 * 96)
data["cdh"] = (data["temp"] - 22).clip(lower=0)
FEATS = ["hour", "dow", "lag_1d", "lag_7d", "temp", "cdh"]
data = data.dropna()

train, test = data.iloc[:-96], data.iloc[-96:]
model = HistGradientBoostingRegressor(max_iter=300, learning_rate=0.05).fit(train[FEATS], train["kw"])
pred = model.predict(test[FEATS])
mae = np.mean(np.abs(pred - test["kw"]))
print(f"Day-ahead MAE: {mae:.1f} kW, peak forecast {pred.max():.0f} kW, actual peak {test['kw'].max():.0f} kW")

forecast = {
    "generated": int(time.time() * 1000),
    "model": "gbr-load-v1",
    "unit": "kW",
    "points": [{"ts": int(ts.timestamp() * 1000), "kw": round(float(v), 1)} for ts, v in zip(test.index, pred)],
}
client.publish(f"{BASE}/meter1/forecast", json.dumps(forecast), qos=1, retain=True).wait_for_publish()
client.loop_stop()
client.disconnect()

Instálalo con pip install paho-mqtt pandas numpy scikit-learn. La ejecución tarda unos diez minutos porque el simulador respeta el límite de mensajes del broker público. El día de prueba usa aquí la temperatura medida simulada como sustituto de un pronóstico meteorológico; en producción, proporciona al modelo la temperatura pronosticada para las horas futuras. Para profundizar en el backtesting con varios orígenes de predicción y la comparación con una línea base ingenua, consulta predicción de series temporales IoT.

Convertir el pronóstico en acciones

Un pronóstico solo compensa cuando cambia decisiones. Patrones habituales:

  1. Alertas de pico. Compara el pico pronosticado con tu límite de potencia y avisa al equipo de mantenimiento la tarde anterior.
  2. Desplazamiento de cargas. Un script de planificación se suscribe al topic del pronóstico y mueve cargas flexibles, como la carga de vehículos eléctricos o el calentamiento por lotes, a intervalos de baja demanda.
  3. Preenfriamiento y precalentamiento. La climatización puede aprovechar horas baratas o de baja demanda para almacenar energía térmica en la masa del edificio, un patrón que se trata en optimización HVAC con IA.
  4. Seguimiento de pronóstico frente a real. Publica la desviación en directo como un topic propio y genera alertas ante diferencias persistentes.

Con ConnectMQ puedes observar los topics del pronóstico y de la potencia medida en el explorador de topics en directo y definir reglas de alerta por umbral sobre la demanda medida, de modo que el registro de alertas recoja cada intervalo que haya superado tu límite. Las acciones más avanzadas se ejecutan en tus propios clientes, como flujos de Node-RED o servicios Python suscritos al mismo broker.

Actualizar los pronósticos a lo largo del día

Un pronóstico del día siguiente se hace una sola vez, pero el día rara vez transcurre exactamente según lo previsto. Un turno extra no planificado o una tarde más calurosa de lo esperado modifican la carga. Una mejora sencilla es volver a ejecutar el pronóstico cada hora usando la última demanda medida como entrada adicional, y publicar cada nueva versión en el mismo topic retenido con una marca de tiempo de generación. Los consumidores siempre ven la visión más reciente, y puedes almacenar todas las versiones para medir cuánto mejoran la precisión las actualizaciones intradía respecto a la ejecución original del día anterior.

Errores prácticos frecuentes

  • Reinicios y desbordamientos del contador. Los contadores dan la vuelta o se reinician tras una sustitución; trata las diferencias negativas como reinicios, no como demanda negativa.
  • Zonas horarias y horario de verano. Almacena en UTC y calcula las variables de calendario en hora local, o tu arranque de las 08:00 se desplazará una hora dos veces al año.
  • Festivos y paradas. Sin un indicador de festivo, el modelo pronosticará la carga de un día laborable normal en un festivo.
  • Líneas base cambiantes. Equipos nuevos, reformas o cambios de horario hacen que el historial antiguo resulte engañoso; da más peso a los datos recientes o reentrena con una ventana deslizante.
  • Sumas de subcontadores que no cuadran con el contador principal. Existen cargas no medidas y pérdidas; pronostica directamente el contador principal en lugar de sumar pronósticos de subcontadores, y usa los subcontadores para diagnóstico.

Escalar a varios emplazamientos

Un edificio es un script; cincuenta emplazamientos, repartidos por ejemplo entre Monterrey, Bogotá y Valencia, son una plataforma. Mantén la misma estructura de topics en todos los emplazamientos, ejecuta un único servicio de predicción que se suscriba con comodines y almacena los resultados por emplazamiento. Un broker MQTT gestionado elimina el trabajo operativo de mantener la capa de mensajería, y ConnectMQ ofrece clústeres Dedicated y despliegues BYOC cuando los emplazamientos requieren aislamiento. Para saber más sobre cómo combinar modelos con dispositivos conectados, consulta la guía de IA e IoT, y para una visión basada en modelos de los sistemas energéticos, gemelos digitales para energía. Si además quieres ver la demanda y el pronóstico sobre el propio edificio, un gemelo digital 3D permite situar cada contador en su planta y su zona.

Empieza con ConnectMQ

Crea un broker Serverless gratuito en app.connectmq.com, sin tarjeta de crédito. Conecta tu gateway de contadores y tu servicio de predicción con los YOUR_USERNAME, YOUR_PASSWORD y YOUR_CLIENT_ID generados, y empieza a construir el historial que necesita tu modelo de predicción de demanda energética. A medida que añadas emplazamientos, pasa a un plan de broker MQTT en la nube más grande sin cambiar tus topics.

Preguntas frecuentes

¿Qué es la predicción de demanda energética?

La predicción de demanda energética estima la demanda eléctrica de un edificio, una planta o una zona de la red para intervalos de tiempo futuros, normalmente a partir de datos históricos de contadores, información meteorológica y de calendario.

¿Cuántos datos necesito para predecir la demanda energética?

Unas pocas semanas de datos cada 15 minutos pueden producir un pronóstico del día siguiente utilizable para un edificio con horarios estables. Se necesita un año o más para capturar los patrones estacionales de calefacción y refrigeración y los festivos.

¿Debo publicar energía o potencia desde mis contadores?

Publica el contador de energía acumulada para lograr precisión en la predicción y la facturación, porque los mensajes perdidos no hacen que se pierda consumo. Publica además la potencia instantánea si necesitas dashboards en directo.

¿Qué modelo funciona mejor para predecir la demanda?

El gradient boosting sobre variables de calendario, retardos y clima es una opción por defecto sólida y explicable. Compáralo con una línea base de mismo día de la semana anterior y cámbialo solo si otro modelo gana en un backtest móvil.

Artículos relacionados

Todos los artículos →

Tu broker MQTT privado, a unos pocos clics

Crea una cuenta, obtén las credenciales de tu broker y conecta tu primer dispositivo, sin servidores que instalar, parchear ni escalar.