Shelly EM en Home Assistant por MQTT: topics, unidades y el Panel de Energía

Hay dos caminos para meter un Shelly EM en Home Assistant. La integración nativa lo detecta sola (por CoIoT en los Gen1), no pide YAML y conserva la app y la nube de Shelly: es la vía para la mayoría. MQTT tiene sentido si ya corres un broker, quieres toda la casa en MQTT o necesitas los topics para otro sistema. Es la que más dudas genera, y es la que desarrollamos.

Activar MQTT, y qué pierdes

En la web del equipo (su IP en el navegador): Internet & Security → Advanced — Developer Settings, activa MQTT, pon la IP del broker, usuario y contraseña, puerto 1883, y guarda. El prefijo por defecto es shellies/shellyem-<id>, donde <id> es la parte hexadecimal del identificador del equipo, visible en su web.

En el EM Gen1, activar MQTT desactiva la nube de Shelly. Pierdes el control remoto desde la app y el histórico de Shelly Cloud; en tu red y en Home Assistant todo sigue funcionando.

Qué publica, y en qué unidades

Cada medida tiene su topic bajo shellies/shellyem-<id>/emeter/<canal>/, con 0 y 1 para las dos pinzas:

TopicQué esUnidad
powerPotencia activaW
reactive_powerPotencia reactivaVAR
voltageTensiónV
totalEnergía consumida acumulada, persiste a reiniciosWh
total_returnedEnergía vertida acumulada, persiste a reiniciosWh
energyConsumida desde el último arranqueW·min
returned_energyVertida desde el último arranqueW·min

Además, shellies/shellyem-<id>/online publica true/false con la conexión del equipo, y el relé se lee en relay/0 y se manda en relay/0/command con on, off o toggle.

La regla que importa: para contar energía, los acumulados en Wh —total y total_returned—, divididos entre 1000. Los de W·min se ponen a cero cada vez que el equipo arranca y están en una unidad que obliga a convertir dos veces: no sirven para llevar la cuenta.

Los sensores en Home Assistant

Tres sensores por canal: la potencia instantánea, para ver el consumo en vivo y para automatizaciones; y las dos energías, que son las que alimentan el Panel de Energía. Sustituye XXXXXX por el identificador de tu equipo:

mqtt:
  sensor:
    - name: "EM potencia"
      state_topic: "shellies/shellyem-XXXXXX/emeter/0/power"
      unit_of_measurement: "W"
      device_class: power
      state_class: measurement
      availability_topic: "shellies/shellyem-XXXXXX/online"
      payload_available: "true"
      payload_not_available: "false"

    - name: "EM energía consumida"
      state_topic: "shellies/shellyem-XXXXXX/emeter/0/total"
      value_template: "{{ (value | float / 1000) | round(3) }}"
      unit_of_measurement: "kWh"
      device_class: energy
      state_class: total_increasing

    - name: "EM energía vertida"
      state_topic: "shellies/shellyem-XXXXXX/emeter/0/total_returned"
      value_template: "{{ (value | float / 1000) | round(3) }}"
      unit_of_measurement: "kWh"
      device_class: energy
      state_class: total_increasing

La combinación device_class: energy + state_class: total_increasing sobre un acumulado en kWh es lo que hace que Home Assistant lo ofrezca en el Panel de Energía y lo reparta por horas, días y meses. La energía consumida va como «consumo de la red» y la vertida como «devolución a la red». El availability_topic hace que, si el equipo se desconecta, los sensores salgan como no disponibles en lugar de quedarse congelados en el último valor. Repite el bloque con /1/ para la segunda pinza.

Errores frecuentes

  • Usar energy en el Panel de Energía: se reinicia con cada arranque y está en W·min.
  • Olvidar state_class: total_increasing: el sensor no aparece en el panel.
  • Usar returned_energy para el vertido: mismo problema que energy; es total_returned.
  • Contar con la app en remoto: en Gen1, MQTT y nube son excluyentes.

¿Y con un EM Gen3 o un Pro?

Los Gen2 y posteriores hablan MQTT con otra estructura, basada en RPC: con «Generic status update over MQTT» activado publican el estado completo de cada componente en JSON, en <prefijo>/status/em1:0, en lugar de un topic por magnitud. Además, en ellos MQTT y la nube conviven. Para esos equipos la integración nativa de Home Assistant (por WebSocket RPC) es aún más directa; MQTT queda para cuando lo quieres expresamente.

Preguntas frecuentes

¿Necesito un broker?

Sí. El EM publica y alguien tiene que recibir: Mosquitto, por ejemplo el add-on oficial de Home Assistant.

¿El EM mide el excedente solar?

Sí, mide en los dos sentidos: lo que viertes sale en total_returned, y es el dato que necesita el Panel de Energía para la devolución a la red.

Resumen: total y total_returned en Wh ÷ 1000, device_class: energy y state_class: total_increasing; power solo para el instante; y en Gen1, MQTT a cambio de la nube.