Lo que necesita

El cable que encadena la batería maestra con la primera esclava debe salir del LINK PORT 1 de la maestra, nunca del LINK PORT 0. Se conecta al LINK PORT 0 de la esclava, y cada batería siguiente repite el mismo esquema 1 → 0. Al revés, la maestra nunca ve el resto de la pila y el Pylon-Monitor solo mostrará una batería, por muchas que tengas.
Elija su integración
Las dos opciones se configuran en la página Settings del dispositivo (http://pylon-monitor.local/settings o http://<IP-DISPOSITIVO>/settings). Elija una: son independientes.
Autodescubrimiento MQTT
Usa el broker Mosquitto en Home Assistant. El Pylon-Monitor anuncia sus propios sensores y Home Assistant los crea automáticamente. Sin YAML.
Configurar la opción 1 ↓API REST
No necesita broker. Home Assistant lee directamente el endpoint JSON integrado /api.json. La página Settings del dispositivo escribe el YAML por usted, con su IP y su número de baterías ya rellenados.
pylon-monitor.local aparecen en la parte inferior de la pantalla. En la Lite (sin pantalla), abra http://pylon-monitor.local o busque «pylon-monitor» en la lista de dispositivos conectados de su router. Para una integración a prueba de todo, dele una dirección fija: una reserva DHCP en el router (recomendado) o la tarjeta Static IP de la página Settings.Opción 1 — Autodescubrimiento MQTT
Recomendada si usa el complemento Mosquitto broker en Home Assistant. En cuanto el dispositivo se conecta al broker, publica los mensajes de descubrimiento estándar en homeassistant/sensor/… y los sensores aparecen en Ajustes → Dispositivos y servicios → MQTT en pocos segundos, agrupados bajo un único dispositivo llamado Pylon-Monitor.
1. Rellene 4 campos en el dispositivo
En la página Settings del dispositivo, busque la tarjeta Home Assistant — MQTT y rellene estos campos (etiquetas tal como las muestra el dispositivo):
Pulse Save changes. Unos segundos después, la línea Home Assistant (MQTT) del panel del dispositivo muestra Connected y se crean los sensores de abajo, sin configurar ninguna entidad a mano. Para desactivar MQTT, vacíe Broker IP y guarde.
mqtt-pylon) y úsela aquí en lugar de su cuenta de administrador. La IP del broker es simplemente la de su Home Assistant cuando Mosquitto funciona en él.2. Los sensores creados en Home Assistant
El nombre del dispositivo (por defecto pylon-monitor, modificable en Settings) sirve de prefijo de los topics. Si lo ha cambiado, sustituya pylon-monitor por el suyo.
| Sensor en Home Assistant | Topic de descubrimiento | Unidad / tipo |
|---|---|---|
| Battery SOC | homeassistant/sensor/pylon-monitor/soc/config | % · battery |
| Battery SOH | homeassistant/sensor/pylon-monitor/soh/config | % · mdi:battery-heart-variant |
| Battery voltage | homeassistant/sensor/pylon-monitor/voltage/config | V · voltage |
| Battery current | homeassistant/sensor/pylon-monitor/current/config | A · current |
| Battery power | homeassistant/sensor/pylon-monitor/power/config | W · power |
| Battery temp | homeassistant/sensor/pylon-monitor/temp/config | °C · temperature |
| MOSFET temp | homeassistant/sensor/pylon-monitor/mostemp/config | °C · temperature |
| Charge cycles | homeassistant/sensor/pylon-monitor/cycles/config | mdi:counter |
| Battery state | homeassistant/sensor/pylon-monitor/state/config | mdi:battery-sync |
| Cell imbalance | homeassistant/sensor/pylon-monitor/celldelta/config | mV · mdi:scale-balance |
| Battery count | homeassistant/sensor/pylon-monitor/units/config | mdi:battery-multiple |
Todos leen su valor de un único topic de estado retenido, actualizado tras cada lectura de la batería:
pylon-monitor/state
El mensaje combinado tiene este aspecto:
{
"soc": 94,
"soh": 96,
"voltage": 48.62,
"current": -7.20,
"power": -350.1,
"temp": 23.4,
"mostemp": 28.1,
"cycles": 486,
"celldelta": 12,
"units": 2,
"state": "Discharging",
"hw": "gen2",
"pack": "lv"
}
3. ¿Varias baterías? Sensores para cada una
En cuanto su pack tiene más de una batería Pylontech, el dispositivo crea además 5 sensores por batería — Battery 1 SOC, Battery 1 SOH, Battery 1 cycles, Battery 1 voltage, Battery 1 state, luego Battery 2, 3… — cada uno en su propio topic (pylon-monitor/battery1/state, pylon-monitor/battery2/state…). Ideal para detectar la batería que envejece más rápido que las demás.
pylon-monitor/battery1/state
{ "voltage": 48.61, "current": -3.60, "power": -175.0, "soc": 94, "soh": 97,
"cycles": 480, "charge_cnt": 391, "discharge_cnt": 0, "state": "Discharging",
"model": "US3000C", "bms_sw": "…", "serial": "…",
"cell_min_mv": 3238, "cell_max_mv": 3247, "cell_delta_mv": 9, "cell_count": 15 }
Estos sensores llevan además atributos, visibles en la ficha de cada sensor: modelo de la batería, versión del BMS, número de serie y — una vez leídas las celdas — tensión de celda más baja, más alta y la diferencia entre ambas. Así se distingue «Battery 3» de «Battery 4» sin entidades adicionales.
El dispositivo mantiene también un topic de disponibilidad con «Last Will»: si pierde la alimentación o el WiFi, cada sensor pasa a «no disponible» en Home Assistant en lugar de quedarse congelado en silencio en su último valor.
pylon-monitor/status → "online" (retained) | "offline" (Last Will, retained)
Opción 2 — API REST
No necesita broker MQTT. La integración rest incluida en Home Assistant lee el dispositivo cada 30 segundos. Lo más fácil: copie el bloque de la tarjeta Home Assistant — REST de la página Settings: ya contiene su IP y un par SOH + ciclos para cada batería realmente detectada. La versión de abajo es la misma plantilla para un pack de 2 baterías. Desde el firmware 3.4.0 (Lite 1.1.0, generación 1: 3.1), /api.json exige su clave de acceso — el bloque copiado desde el dispositivo ya incluye ?key=…. Si configuró REST antes de actualizar, añada ?key=<su Access key> (Settings → Public JSON access) a la línea resource:. MQTT no cambia.
El JSON que devuelve el dispositivo
GET http://<DEVICE-IP>/api.json?key=<ACCESS-KEY>
{
"system": "pylon-monitor",
"firmware": "3.3.2",
"hw": "gen2",
"battery_link": true,
"summary": {
"soc": 94,
"voltage": 48.62,
"current": -7.20,
"power": -350.10,
"state": "Discharging",
"units": 2
},
"health": {
"soh": 96,
"cycles": 486,
"charge_cnt": 782,
"discharge_cnt": 0
},
"unitsDetail": [
{ "soc": 94, "soh": 97, "cycles": 480, "model": "US3000C", "...": "..." },
{ "soc": 94, "soh": 95, "cycles": 492, "model": "US3000C", "...": "..." }
]
}
Recortado para facilitar la lectura: la respuesta completa también contiene temps, cells, alarms y net, y unitsDetail da tensión, corriente, SOC, SOH, ciclos, modelo y número de serie de cada batería (presente cuando el pack tiene varias). Atención: el SOH está bajo health, no bajo summary, un error clásico al copiar y pegar.
Pegue esto en configuration.yaml
# Access key: device Settings > Public JSON access (required since
# firmware 3.4.0 / Lite 1.1.0 / gen. 1 3.1). The block generated by the
# device's own Settings page already contains it.
rest:
- resource: http://<DEVICE-IP>/api.json?key=<ACCESS-KEY>
scan_interval: 30
sensor:
- name: "Pylontech SOC"
unique_id: pylontech_soc
value_template: "{{ value_json.summary.soc }}"
unit_of_measurement: "%"
device_class: battery
state_class: measurement
- name: "Pylontech SOH"
unique_id: pylontech_soh
value_template: "{{ value_json.health.soh }}"
unit_of_measurement: "%"
state_class: measurement
- name: "Pylontech Voltage"
unique_id: pylontech_voltage
value_template: "{{ value_json.summary.voltage }}"
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
- name: "Pylontech Current"
unique_id: pylontech_current
value_template: "{{ value_json.summary.current }}"
unit_of_measurement: "A"
device_class: current
state_class: measurement
- name: "Pylontech Power"
unique_id: pylontech_power
value_template: "{{ value_json.summary.power }}"
unit_of_measurement: "W"
device_class: power
state_class: measurement
- name: "Pylontech State"
unique_id: pylontech_state
value_template: "{{ value_json.summary.state }}"
# One SOH + cycles pair per battery (only on a pack of 2 or more):
- name: "Pylontech Battery 1 SOH"
unique_id: pylontech_battery1_soh
value_template: "{{ value_json.unitsDetail[0].soh }}"
unit_of_measurement: "%"
state_class: measurement
- name: "Pylontech Battery 1 cycles"
unique_id: pylontech_battery1_cycles
value_template: "{{ value_json.unitsDetail[0].cycles }}"
state_class: measurement
- name: "Pylontech Battery 2 SOH"
unique_id: pylontech_battery2_soh
value_template: "{{ value_json.unitsDetail[1].soh }}"
unit_of_measurement: "%"
state_class: measurement
- name: "Pylontech Battery 2 cycles"
unique_id: pylontech_battery2_cycles
value_template: "{{ value_json.unitsDetail[1].cycles }}"
state_class: measurement
Reinicie Home Assistant (Herramientas para desarrolladores → Reiniciar). Los sensores aparecen en Ajustes → Dispositivos y servicios → Entidades: busque pylontech.
Panel de energía
Para una batería, el panel de energía de Home Assistant espera dos contadores en kWh: la energía cargada y la energía descargada. El Pylon-Monitor da la potencia de la batería en W (positiva = carga, negativa = descarga), así que los crea una sola vez con ayudantes:
- Separe la potencia en dos con dos sensores de plantilla: potencia de carga = la parte positiva, potencia de descarga = la parte negativa convertida en positiva.
- Convierta cada una en kWh con un ayudante Integral (suma de Riemann), prefijo «k», método «Izquierda».
- En Ajustes → Paneles → Energía, sección Almacenamiento en batería, añada los dos contadores: energía que entra, energía que sale.
Lo mismo en YAML (nombres de las entidades MQTT; con la opción 2 use sensor.pylontech_power):
template:
- sensor:
- name: "Battery charge power"
unique_id: pylontech_charge_power
unit_of_measurement: "W"
device_class: power
state_class: measurement
state: "{{ [states('sensor.pylon_monitor_battery_power') | float(0), 0] | max }}"
- name: "Battery discharge power"
unique_id: pylontech_discharge_power
unit_of_measurement: "W"
device_class: power
state_class: measurement
state: "{{ [0 - (states('sensor.pylon_monitor_battery_power') | float(0)), 0] | max }}"
sensor:
- platform: integration
source: sensor.battery_charge_power
name: "Battery energy in"
unique_id: pylontech_energy_in
unit_prefix: k
round: 2
method: left
- platform: integration
source: sensor.battery_discharge_power
name: "Battery energy out"
unique_id: pylontech_energy_out
unit_prefix: k
round: 2
method: left
Compruebe el nombre exacto de su sensor de potencia en Ajustes → Entidades (busque «power»): cambia si ha renombrado el dispositivo o tiene varios Pylon-Monitor.
Aviso de batería baja
Una notificación en su móvil en cuanto la batería baja del 20 %:
alias: "Pylontech batería baja"
triggers:
- trigger: numeric_state
entity_id: sensor.pylon_monitor_battery_soc
below: 20
actions:
- action: notify.notify
data:
message: "Batería Pylontech al {{ states('sensor.pylon_monitor_battery_soc') }} %"
La misma idea con Battery state, Cell imbalance (por ejemplo, por encima de 50 mV) o con sensores no disponibles durante más de 10 minutos, señal de que el dispositivo está desconectado.
Node-RED, Jeedom y otros
Node-RED — un nodo http request, método GET, URL http://<IP-DISPOSITIVO>/api.json?key=<ACCESS-KEY>, retorno «a parsed JSON object», y luego lea msg.payload.summary.soc (o cualquier otro campo). Con MQTT configurado, un nodo mqtt in en pylon-monitor/state es aún más sencillo: sin sondeo.
Jeedom — instale el plugin JSON, apunte un equipo a http://<IP-DISPOSITIVO>/api.json?key=<ACCESS-KEY> y asocie las rutas a comandos (p. ej. summary>soc, summary>voltage, summary>state).
Todo lo demás — openHAB, ioBroker, Domoticz, EVCC o sus propios scripts: todo lo que lee MQTT o un endpoint JSON por HTTP funciona, con los mismos topics y el mismo /api.json.
Preguntas
¿Funciona con la Lite (sin pantalla)?
Sí. El autodescubrimiento MQTT y la API REST forman parte del firmware de todos los modelos: con pantalla, Lite, primera y segunda generación. Solo cambia cómo encontrar la IP: pylon-monitor.local o la lista de dispositivos del router.
Mis sensores REST dejaron de estar disponibles tras una actualización del firmware — ¿por qué?
Desde el firmware 3.4.0 (Lite 1.1.0, generación 1: 3.1) el dispositivo pide una contraseña que usted crea en el primer acceso, y <code>/api.json</code> necesita su clave de acceso: la normativa europea de ciberseguridad para objetos conectados (directiva RED, EN 18031) obliga ahora a proteger cada dispositivo. Abra el dispositivo una vez en un navegador para crear su contraseña, añada <code>?key=<Access key></code> (<em>Settings → Public JSON access</em>) a su línea <code>resource:</code> y reinicie Home Assistant. Los sensores MQTT siguen funcionando sin cambios.
¿Necesito internet o el Cloud de Pylon-Monitor?
No. Home Assistant se comunica directamente con el dispositivo en su red local. El Cloud gratuito es opcional: solo añade acceso remoto e historial a largo plazo.
Tengo varias baterías: ¿veo cada una?
Sí. Con MQTT el dispositivo crea 5 sensores por batería (SOC, SOH, ciclos, tensión, estado), con modelo y número de serie como atributos. Con REST, el YAML generado añade SOH y ciclos de cada batería.
¿Cada cuánto se actualizan los valores?
Tras cada lectura de la batería: cada 60 segundos por defecto, ajustable de 30 a 300 segundos con el ajuste Battery polling de la página Settings. Con REST, Home Assistant consulta cada 30 segundos.
Mis sensores dicen «no disponible»: ¿qué compruebo?
Es la señal de disponibilidad haciendo su trabajo: el dispositivo ya no está conectado al broker (corte de luz, WiFi, broker reiniciado). Abra la página del dispositivo: la línea Home Assistant (MQTT) indica Connected u Offline. Reintenta solo cada 10 segundos.
¿Puede Home Assistant controlar la batería?
No, a propósito: la integración solo ofrece sensores de lectura. Nada en Home Assistant puede cambiar un ajuste de su batería o de su BMS.
¿Necesito HACS o una integración personalizada?
No. El autodescubrimiento MQTT y la integración REST forman parte del propio Home Assistant. Solo hay que instalar el complemento Mosquitto, y únicamente si elige MQTT.
¿Todavía sin Pylon-Monitor?
Conéctelo al puerto CONSOLE, únalo a su WiFi y su Pylontech aparece en Home Assistant. V2 con pantalla 59 €, Lite sin pantalla 49 €.
Guía completa de MQTT y REST →