La submedición eléctrica con medidores IoT reparte la electricidad de la planta entre máquinas, líneas y servicios individuales en lugar de depender de un único contador general. En este tutorial conectarás medidores de energía Modbus de carril DIN en un bus RS-485 a un pequeño gateway, leerás con Python los contadores de tensión, corriente, potencia y energía, y los publicarás por MQTT para que cada máquina tenga su propia cifra de energía en vivo e histórica.
Por qué submedir a nivel de máquina
El contador general responde "cuánto"; los submedidores responden "dónde" y "cuándo". En cuanto cada máquina grande tiene su propio medidor, puedes ver el consumo en vacío entre pedidos, comparar máquinas idénticas, verificar el efecto de un nuevo variador o de un cambio de consigna e informar la energía por pieza. La submedición es también la columna vertebral de medida de la monitorización energética en fábricas a escala de planta y de un plan de recogida de datos según ISO 50001.
Elección de medidores y gateway
| Componente | Opción habitual | Notas |
|---|---|---|
| Medidor trifásico | Medidor multifunción de carril DIN con Modbus RTU por RS-485 y entradas para TC (p. ej. Eastron SDM630 MCT o modelos similares de otros fabricantes) | Comprueba que el mapa de registros esté publicado |
| Transformadores de corriente | TC de núcleo partido dimensionados para el alimentador, o bobinas Rogowski | El núcleo partido permite reequipar sin desconectar cables |
| Bus | RS-485 de par trenzado, en cadena (daisy chain), terminación de 120 ohmios en ambos extremos | Hasta 32 cargas unitarias por segmento sin repetidores |
| Gateway | Raspberry Pi con adaptador USB-RS485, PC edge industrial o un conversor Modbus TCP a RTU | Necesita una ruta de red fiable hasta el broker |
| Software | Python con pymodbus y paho-mqtt, o Node-RED | Abajo se muestra Python |
Asigna a cada medidor una dirección Modbus única (1, 2, 3, etc.) y la misma velocidad y paridad, configuradas desde el panel frontal del medidor. Los ejemplos usan 9600 baudios, 8 bits de datos, sin paridad y 1 bit de parada.
La instalación eléctrica de medidores y TC debe realizarla un electricista cualificado conforme a la normativa local. Los TC con salida secundaria de corriente nunca deben quedar en circuito abierto mientras circula corriente por el primario, salvo que sean del tipo seguro con salida en tensión.
Mapa de registros
Los medidores multifunción exponen las lecturas como floats IEEE 754 de 32 bits repartidos en dos input registers de 16 bits. Para la familia SDM630, algunos input registers útiles (código de función 04) son:
| Valor | Registro (decimal) | Unidad |
|---|---|---|
| Tensión fase 1 | 0 | V |
| Corriente fase 1 | 6 | A |
| Potencia total del sistema | 52 | W |
| Factor de potencia total del sistema | 62 | - |
| Frecuencia | 70 | Hz |
| Energía activa importada total | 72 | kWh |
Otros medidores usan direcciones, códigos de función u órdenes de palabra distintos. Trabaja siempre con el documento de registros del fabricante; un orden de palabra incorrecto produce números que parecen plausibles pero están completamente desviados.
Cableado del gateway
- Conecta los terminales A y B (a veces D+ y D-) del adaptador USB-RS485 a los terminales A y B del primer medidor y continúa en cadena hasta los demás medidores. Evita las topologías en estrella.
- Coloca resistencias de terminación de 120 ohmios en los dos extremos físicos del bus si los medidores o el adaptador no las traen integradas.
- Conecta la tierra de referencia si el adaptador la ofrece, sobre todo en tendidos largos.
- Enchufa el adaptador a la Raspberry Pi y confirma que aparece el dispositivo:
ls -l /dev/ttyUSB*
sudo usermod -aG dialout $USER # log out and in again afterwards
python3 -m venv ~/meter-env
source ~/meter-env/bin/activate
pip install "pymodbus>=3.10" paho-mqtt pyserial
El script del gateway de submedición eléctrica IoT
El script consulta cada medidor por turnos, decodifica los floats y publica un mensaje JSON por medidor en un topic que lleva el nombre de la máquina a la que alimenta. Para la demo usa el servidor público de pruebas gratuito; la variante de producción se muestra después.
#!/usr/bin/env python3
"""Electrical sub-metering gateway: Modbus RTU meters -> MQTT."""
import json
import struct
import time
import paho.mqtt.client as mqtt
from pymodbus.client import ModbusSerialClient
BROKER = "broker.connectmq.com"
PREFIX = "connectmq/demo/subm-4q9z/plant1"
POLL_SECONDS = 10
# Modbus address -> topic path of the machine it measures
METERS = {
1: "molding/imm-01",
2: "molding/imm-02",
3: "utilities/comp-1",
}
REGISTERS = { # name: input register address (float32, 2 words)
"v_l1": 0,
"i_l1": 6,
"kw": 52,
"pf": 62,
"hz": 70,
"kwh_total": 72,
}
def read_float(modbus, address, unit):
rr = modbus.read_input_registers(address, count=2, device_id=unit)
if rr.isError():
raise IOError(f"Modbus error unit {unit} reg {address}: {rr}")
return struct.unpack(">f", struct.pack(">HH", *rr.registers))[0]
def read_meter(modbus, unit):
values = {name: read_float(modbus, reg, unit) for name, reg in REGISTERS.items()}
values["kw"] = values["kw"] / 1000.0 # meter reports watts
return {k: round(v, 3) for k, v in values.items()}
def on_connect(client, userdata, flags, reason_code, properties):
print("MQTT connected:", reason_code)
client.publish(f"{PREFIX}/gateway/status", "online", qos=1, retain=True)
def main():
modbus = ModbusSerialClient(
port="/dev/ttyUSB0", baudrate=9600, bytesize=8, parity="N", stopbits=1, timeout=1
)
if not modbus.connect():
raise SystemExit("Cannot open serial port")
mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="subm-gw-4q9z")
mqttc.will_set(f"{PREFIX}/gateway/status", "offline", qos=1, retain=True)
mqttc.on_connect = on_connect
mqttc.connect(BROKER, 1883, keepalive=60)
mqttc.loop_start()
while True:
cycle_start = time.time()
for unit, path in METERS.items():
topic = f"{PREFIX}/{path}/energy"
try:
payload = {"ts": int(time.time()), "meter": unit, **read_meter(modbus, unit)}
mqttc.publish(topic, json.dumps(payload), qos=1)
print(topic, payload)
except IOError as err:
mqttc.publish(f"{topic}/error", str(err), qos=1)
print(err)
time.sleep(0.05) # short gap between meters on the bus
time.sleep(max(0, POLL_SECONDS - (time.time() - cycle_start)))
if __name__ == "__main__":
main()
Observa la salida desde cualquier equipo con el cliente de Mosquitto:
mosquitto_sub -h broker.connectmq.com -p 1883 -i subm-viewer-$RANDOM \
-t "connectmq/demo/subm-4q9z/plant1/#" -v
El servidor MQTT público gratuito es ideal para esta primera prueba, pero cualquiera puede leerlo, así que cambia a un broker privado antes de conectar equipos reales de producción.
Paso a producción
Pasa el gateway a TLS autenticado sustituyendo las líneas de conexión:
mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
mqttc.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
mqttc.tls_set()
mqttc.will_set(f"{PREFIX}/gateway/status", "offline", qos=1, retain=True)
mqttc.connect("broker.connectmq.com", 8883, keepalive=60)
Cambia PREFIX por tu propio espacio de nombres, por ejemplo connectmq/plant1, para seguir la jerarquía ISA-95. ConnectMQ reconoce este tipo de estructura y lista los dispositivos por sitio, área y línea en su portal, lo que facilita navegar entre unas cuantas docenas de medidores. Ejecuta el script como servicio de systemd para que se reinicie tras un fallo y al arrancar.
Asignar la energía a las máquinas
Con un topic por máquina, la asignación es directa:
- Energía por periodo: resta el contador
kwh_totalal inicio del turno o del día del valor al final. - Energía en vacío: combina la potencia con el estado de la máquina. La energía consumida mientras la máquina está en vacío o parada, usando los estados de la monitorización del estado de máquinas, es la cifra más accionable para muchas plantas.
- Resto no medido: contador general menos la suma de los submedidores. Un resto grande o creciente apunta a cargas no medidas o a un error de configuración de algún medidor.
- Energía por pieza: divide los kWh de la máquina entre las piezas buenas del mismo periodo.
Almacena el flujo con Telegraf o con un pequeño suscriptor en una base de datos de series temporales y calcula allí estas cifras; el broker transporta datos en vivo y últimos valores retenidos, no histórico.
Planificar el despliegue de la submedición
Mide primero los mayores consumidores. Un recorrido rápido con una pinza amperimétrica, o un vistazo a las placas de características de motores y resistencias, suele mostrar que un puñado de máquinas y servicios concentra gran parte de la carga. Ponlos en el primer bus, valida el camino de los datos de extremo a extremo y solo entonces amplía a cargas más pequeñas.
Mantén un registro de medidores desde el principio: dirección Modbus, ubicación física, alimentador, relación del TC, fecha de instalación y topic en el que publica. Esta lista es lo que permite que otra persona mantenga el sistema, y es exactamente el tipo de información documentada que pide una auditoría energética. Cuando sustituyas un medidor, anota el contador final del antiguo y el contador inicial del nuevo para que los cálculos por periodo sigan siendo correctos.
Por último, decide los intervalos de consulta según el propósito. Diez segundos bastan para dashboards en vivo y detección de energía en vacío; los informes de tipo facturación solo necesitan los contadores, así que en un bus largo es aceptable un intervalo más lento.
Solución de problemas de submedidores
| Síntoma | Causa probable | Solución |
|---|---|---|
| Timeouts en todos los medidores | A y B invertidos, velocidad o paridad incorrectas | Intercambia A/B, iguala la configuración serie en todos los dispositivos |
| Un medidor da timeout | Dirección Modbus duplicada o incorrecta | Comprueba la dirección en la pantalla del medidor |
| Valores como 1.4e-38 o números enormes | Orden de palabra o desplazamiento de registro incorrecto | Verifica el mapa de registros; prueba a intercambiar los dos registros |
| Potencia negativa | TC montado al revés o fases mal asignadas | Invierte el TC o corrige la asignación de fases |
| Potencia demasiado alta por un factor constante | Relación de TC mal configurada en el medidor | Configura la relación primario/secundario correcta |
| Errores intermitentes en buses largos | Falta de terminación o sin referencia de tierra | Termina ambos extremos y conecta la tierra de referencia |
Más allá de los kWh
Muchos medidores multifunción también exponen la distorsión armónica total, valores por fase y registros de demanda. Estos alimentan directamente la monitorización de la calidad de la energía, que ayuda a explicar disparos intempestivos y transformadores que se sobrecalientan. Para una visión genérica de cómo puentear cualquier dispositivo Modbus RTU, consulta Modbus RTU a MQTT. La guía de fabricación inteligente sitúa la submedición dentro de la hoja de ruta más amplia de la producción conectada; y si quieres ver el consumo de cada máquina sobre un gemelo digital 3D de la planta, estos mismos topics sirven de fuente.
Conecta tus medidores a ConnectMQ
ConnectMQ es un broker MQTT gestionado con TLS, MQTT 5, un explorador de topics en vivo, una vista de dispositivos ISA-95 y alertas por umbral en campos como kw o pf. Crea un broker Serverless gratuito sin tarjeta de crédito, pega las credenciales generadas y tus submedidores estarán en línea.
Preguntas frecuentes
¿Cuántos medidores de energía pueden compartir un bus RS-485?
Un segmento RS-485 estándar admite hasta 32 cargas unitarias, y muchos transceptores modernos presentan cargas fraccionarias, por lo que caben más. En la práctica, el límite lo marca el tiempo de consulta: más medidores por bus implica un ciclo más largo para cada medidor.
¿Puedo usar medidores Modbus TCP en su lugar?
Sí. Sustituye ModbusSerialClient por ModbusTcpClient y la dirección IP del medidor; la decodificación de registros y la publicación MQTT siguen igual.
¿Debe el gateway calcular los kWh a partir de las lecturas de potencia?
No. Publica el registro de energía acumulada del propio medidor. Es preciso entre consultas y sobrevive a reinicios del gateway y a mensajes perdidos.
¿Son seguros por internet los datos de submedición eléctrica IoT?
Usa TLS en el puerto 8883 con credenciales emitidas para cada gateway. En ConnectMQ, los client ID están vinculados a sus credenciales y los intentos de inicio de sesión fallidos repetidos provocan el bloqueo de la IP.



