Eastron SDM120 con ESPHome: medir consumo por RS485 sin nube (YAML)
Para leer el Eastron SDM120 desde ESPHome conecta el puerto RS485 del medidor a un ESP32 a través de un MAX485 y usa la plataforma `sdm_meter`. Si tu variante no responde, `modbus_controller` te deja leer cada registro a mano. Aquí están el cableado, el YAML y lo que conviene comprobar antes de compilar.
Este artículo es información general de instalación, no un consejo eléctrico prescriptivo. Si vas a tocar el cuadro, corta la corriente o deja el trabajo a un electricista. Aquí se describe el cableado de la parte RS485 y de bajo voltaje, no la acometida del medidor.
Qué mide el SDM120 y por qué interesa leerlo desde ESPHome
El Eastron SDM120 es un contador de energía monofásico con salida Modbus RTU. Publica tensión, corriente, potencia activa, factor de potencia, frecuencia y energía importada/exportada. Si lo integras con ESPHome, los datos quedan en Home Assistant y no dependen de la app de nadie: todo se lee en tu red local.
El modelo SDM120M usa el carril DIN y mide a través de la conexión directa; el SDM120CT mide mediante pinza. Si tu objetivo es monitorizar, no facturar, el CT suele ser más cómodo de instalar sin tocar la acometida. Los registros Modbus son parecidos, pero no asumas que son idénticos entre revisiones.
Material necesario
- Eastron SDM120, SDM120M o SDM120CT, según instalación.
- Un ESP32 con al menos dos pines GPIO libres para UART y uno para control de flujo.
- Módulo convertidor TTL a RS485 tipo MAX485 (busca uno con DE/RE sacados a pines separados o un puente para unirlos).
- Fuente de 5 V y par trenzado para el bus A/B.
Cableado RS485 entre SDM120, MAX485 y ESP32
La secuencia de pines que doy aquí sigue la configuración publicada por esp32.co.uk para el SDM120M: RO al RX del ESP32 (GPIO16 en su ejemplo), DI al TX (GPIO17) y DE/RE juntos al pin de control de flujo (GPIO4). Si tu ESP32 usa otros GPIO, cámbialos en los dos lados, no solo en el YAML.
| SDM120 (puerto RS485) | MAX485 | ESP32 |
|---|---|---|
| A (+) | A | — |
| B (−) | B | — |
| — | RO | GPIO16 (RX) |
| — | DI | GPIO17 (TX) |
| — | DE y RE unidos | GPIO4 (flow_control_pin) |
| — | VCC | 5 V |
| — | GND | GND |
El bus A/B es diferencial: no lo juntes con GND ni lo pases por una breadboard larga si puedes evitarlo. Un par trenzado corto reduce los errores de lectura.
Baud rate: 2400 o 9600 depende de tu unidad
La guía de esp32.co.uk fija 2400 como valor habitual del SDM120M, con 9600 como alternativa si tu medidor está configurado así. La etiqueta del fabricante y el manual de tu revisión son lo que manda; si no ves datos en Home Assistant tras compilar, cambia `baud_rate` antes que sospechar del cableado. Sin confirmar a fecha de 27/09 para todas las variantes Eastron: no hay un único valor universal.
YAML primero: `sdm_meter`, el camino corto
ESPHome incluye la plataforma `sdm_meter` para contadores Eastron. Cuando tu medidor sigue el mapa de registros estándar, esto es todo lo que necesitas:
uart:
id: modbus_uart
tx_pin: GPIO17
rx_pin: GPIO16
baud_rate: 2400
stop_bits: 1
parity: NONE
modbus:
id: modbus_bus
uart_id: modbus_uart
flow_control_pin: GPIO4
sensor:
- platform: sdm_meter
address: 1
voltage:
name: "Tensión red"
current:
name: "Corriente"
active_power:
name: "Potencia activa"
frequency:
name: "Frecuencia red"
total_import_energy:
name: "Energía importada"
total_export_energy:
name: "Energía exportada"
El `flow_control_pin` gestiona DE/RE: ESPHome lo pone en marcha al transmitir. El `address` es la dirección Modbus del contador; si has cambiado la suya, cámbiala aquí.
YAML de emergencia: `modbus_controller` para leer un holding register
Si tu SDM120 tiene un mapa de registros distinto (o quieres leer solo un valor concreto sin depender de la plataforma dedicada), usa `modbus_controller`. El esqueleto es este:
uart:
id: modbus_uart
tx_pin: GPIO17
rx_pin: GPIO16
baud_rate: 2400
stop_bits: 1
parity: NONE
modbus:
id: modbus_bus
uart_id: modbus_uart
flow_control_pin: GPIO4
modbus_controller:
- id: sdm120
address: 1
modbus_id: modbus_bus
update_interval: 10s
sensor:
- platform: modbus_controller
modbus_controller_id: sdm120
name: "Holding register ejemplo"
register_type: holding
address: 0x0000
value_type: U_WORD
La dirección `0x0000` es un ejemplo genérico de holding register, no la dirección de tensión del SDM120. Consulta la hoja de datos de tu revisión para saber qué registro corresponde a cada magnitud, o quédate con `sdm_meter` si la plataforma dedicada te funciona. El tipo `U_WORD` se usa para registros enteros sin signo de 16 bits; si el valor viene en otro formato, ajústalo al tipo documentado por Eastron.
Cómo verificar que la lectura funciona
Tras compilar y flashear, mira los logs del dispositivo. Si la comunicación es correcta, verás los sensores creados y valores que cambian. Si aparece `Modbus timeout` o valores constantes, revisa en este orden: baud rate, A/B invertidos, y que el pin DE/RE esté realmente en el GPIO declarado.
En Home Assistant los sensores aparecerán con los nombres que pusiste y con `device_class` apropiado para integrarlos en el panel de energía. Enlaza la energía importada al contador de la red y tendrás el consumo local histórico sin pasar por ninguna nube.
Fuentes consultadas
- ESPHome: Modbus component
- ESPHome: Modbus Controller
- esp32.co.uk: SDM120/SDM630 Modbus Energy Meter with ESP32
- modbusmanager.com: Eastron SDM120 register map and wiring
Cambios de esta pieza
- 27/09/2026: primera versión. Verificado contra esphome.io, esp32.co.uk y modbusmanager.com. Direcciones de registro y baud rate por lote marcados como dependientes de la revisión del medidor.