Skip to content

Componente ESPHome IEC 62056-21

IEC 62056-21 es un estándar internacional para un protocolo de intercambio de datos con medidores de servicios públicos. Principalmente para electricidad, pero también para agua, térmicos y otros medidores. Anteriormente se conocía como IEC 61107.

El componente iec62056 te permite leer datos de cualquier medidor compatible. Requiere un puerto serial y una interfaz óptica externa. El intercambio de datos utiliza un canal óptico infrarrojo. Los medidores compatibles están equipados con una placa metálica redonda característica con dos optoelementos en su interior. El protocolo podría usarse con otras capas de transporte, por ejemplo, bucle de corriente, pero el componente solo fue probado con la interfaz óptica.

Soporta 4 modos de IEC 62056-21: A, B, C y D. El modo E no es compatible.

El componente no soporta programación. Configurar los parámetros del medidor requiere una contraseña secreta, lo que hace imposible su uso por usuarios comunes.

La interfaz en un medidor. Anillo metálico para un imán y dos elementos ópticos en su interior.

Existen otros estándares de medidores inteligentes que utilizan la misma interfaz óptica. Aunque comparten algunos conceptos comunes, no son compatibles.

Instalación

Agrega el siguiente código al archivo de configuración YAML de ESPHome para referenciar el componente externo.

yaml
external_components:
    # Componente IEC62056
    - source: github://aquaticus/esphome-iec62056

Teoría de operación

El componente opera en 2 modos principales:

  • Comunicación bidireccional con un medidor. En este modo, un medidor envía datos solo cuando se le solicita. Requiere un receptor y transmisor IR. Este es el modo A, B y C según IEC 62056-21.
  • Comunicación unidireccional, donde un medidor envía datos a una sonda de vez en cuando. Solo requiere un receptor IR. En la terminología de IEC 62056-21 es el modo D.

Modos A, B, C

El componente lee datos por primera vez 15 segundos después del arranque. Primero, envía una solicitud de identificación a 300 bps. El medidor devuelve la tasa de baudios máxima que puede manejar. Después de eso, la tasa de baudios del puerto serial se cambia al valor proporcionado por el medidor o configurado por la opción baud_rate_max. El medidor transmite registros de datos con códigos OBIS asociados.

Si la transmisión ha fallado (por un error de suma de comprobación o formato inválido), el componente intentará leer los datos nuevamente, pero esta vez utilizando una velocidad de transmisión más lenta. Por cada reintento, la velocidad se disminuye. El número de reintentos y retrasos se puede configurar.

Si el medidor funciona con batería, se puede aplicar una secuencia especial de activación. Esto ocurre solo cuando battery_meter está configurado como True.

Modo D

Para medidores que operan en modo D, solo necesitas un receptor IR ya que la transmisión a un medidor no es compatible. En este modo, el medidor envía datos cada pocos segundos sin ninguna solicitud. Debes configurar el puerto serial para que coincida con el formato de transmisión del medidor. A diferencia de los modos A, B y C que se detectan automáticamente, el Modo D debe habilitarse manualmente configurando mode_d=True en la configuración de la plataforma.

Modo E

Este modo no es compatible. El Modo E utiliza codificación binaria sobre un enlace HDLC.

El componente intenta usar el modo C para medidores que reportan el modo E. Esto debería funcionar si el medidor admite ambos modos E y C. Para medidores que solo admiten el modo E, la lectura no es posible.

Códigos OBIS

El código OBIS (Sistema de Identificación de Objetos) identifica las diferentes lecturas de un medidor. El código consta de hasta 6 subidentificadores de grupo. El código se formatea de la siguiente manera: A-B:C.D.E*F, donde:

  • A - medio: 0=objeto abstracto, 1=electricidad, 6=calor, 7=gas, 8=agua
  • B - canal, 0=no hay canal disponible
  • C - valor físico, por ejemplo, corriente, voltaje, temperatura.
  • D - tipo de medición,
  • E - tarifa, 0=total, 1=tarifa #1, 2=tarifa #2 y así sucesivamente
  • F - período de facturación

A, B y F pueden omitirse. Los códigos pueden usar dígitos hexadecimales, por ejemplo, el código 15.8.0 podría representarse como F.8.0.

Los códigos están estandarizados, pero los dispositivos envían un número diferente de códigos. Para obtener una lista de códigos compatibles con tu medidor, habilita el registro DEBUG para el componente iec62056 y observa la salida del registro. Salida de muestra:

log
[10:50:12][D][iec62056.component:416]: Data: '1-0:15.8.1(00000009999.567*kWh)'
[10:50:12][D][iec62056.component:416]: Data: '1-0:15.8.2(00000000000.000*kWh)'
[10:50:12][D][iec62056.component:416]: Data: '1-0:15.8.3(00000000000.000*kWh)'
[10:50:12][D][iec62056.component:416]: Data: '1-0:15.8.4(00000000000.000*kWh)'

TIP

El código OBIS del sensor debe coincidir exactamente con lo que se transmite desde un medidor. Esta es la parte antes del primer paréntesis (.

Si un código OBIS tiene solo dos dígitos, debes usar comillas en el archivo de configuración; por ejemplo, "1.2" en lugar de solo 1.2.

Para obtener una lista de códigos OBIS para medidores eléctricos, puedes visitar:

Hardware

Para comunicarte con un medidor, debes conectar una interfaz óptica al puerto serie. La interfaz consta de un LED infrarrojo y un fototransistor. Además, el dispositivo debe estar equipado con un imán de anillo para mantenerlo alineado con el medidor.

Si el medidor opera en modo unidireccional D, solo se requiere un fototransistor IR.

Sonda

El estándar define las dimensiones máximas de la sonda que se puede conectar a un medidor. Debe estar equipada con un imán, ya que es la única forma de mantener la sonda en una posición estable.

Dimensiones de la sonda óptica

Configuración

Para ver los datos del medidor en Home Assistant, debes definir un sensor o un sensor de texto con el código OBIS apropiado. Ten en cuenta que los medidores admiten diferentes conjuntos de códigos OBIS. Por defecto, el componente no define ningún sensor.

Puerto serie

El componente requiere bus UART. El puerto serie debe configurarse como 7E1 en la mayoría de los casos. Cuando mode_d=True, la velocidad de baudios debe establecerse en un valor compatible con el medidor. Generalmente 2400 o 9600 bps. Para otros modos (mode_d=False), la velocidad de transmisión se negocia con el medidor. baud_rate se ignora y puede ser cualquier valor.

yaml
# Example UART configuration entry
uart:
    rx_pin: GPIO21
    tx_pin: GPIO22
    baud_rate: 9600
    data_bits: 7
    parity: EVEN
    stop_bits: 1

WARNING

Para ESP8266, se recomienda encarecidamente usar UART de hardware. El UART de software no puede manejar transmisiones más rápidas que 4800 bps.

Es posible que necesites desactivar el registro si la sonda óptica está conectada al puerto serie utilizado por el componente de registro.

yaml
# Establece baud_rate en 0 para desactivar el registro a través de UART.
logger:
    baud_rate: 0

Plataforma

Para usar el componente, debes definir la sección de plataforma iec62056 en el archivo de configuración. Consiste en configuraciones básicas.

yaml
# Example platform configuration entry for bidirectional communication
iec62056:
  update_interval: 60s
  baud_rate_max: 9600
  battery_meter: False
yaml
# Ejemplo de entrada de configuración de plataforma para comunicación unidireccional
iec62056:
  mode_d: True

Variables de configuración

  • update_interval (Opcional, Time): El intervalo para leer datos de un medidor. Por defecto es 15min. never desactiva las actualizaciones. En ese caso, se debe usar un interruptor para activar la lectura. Para obtener lecturas continuas, use un valor pequeño como 1s.
  • baud_rate_max (Opcional, int): Limita la velocidad máxima de transmisión al valor especificado. Por defecto, está configurado a 9600 ya que proporciona una conexión estable. Para desactivarlo, configúrelo a 0. De esa manera, puede usar la tasa de baudios máxima posible de 19200 si el medidor lo admite. Para ESP8266 use el UART de software configurado a 4800 o menos.
  • receive_timeout (Opcional, Time): Tiempo máximo que el componente espera datos de un medidor antes de informar un error de transmisión. Por defecto es 3s.
  • battery_meter (Opcional, booleano): Configúrelo a true si un medidor es alimentado por batería. De esa manera se usará una secuencia especial de encendido.
  • retry_delay (Opcional, Time): En caso de fallo de transmisión, tiempo de espera antes de reintentar la transmisión. Por defecto es 15s.
  • retry_counter_max (Opcional, int): En caso de fallo de transmisión, el número máximo de reintentos. Por defecto es 2.
  • uart_id (Opcional, ID: Especificar manualmente el ID del Componente UART si desea usar múltiples buses UART.
  • mode_d (Opcional, booleano): Configúrelo a True si un medidor envía datos cada pocos segundos. Esto obliga al componente a operar en modo D. En este modo, los datos nunca se transmiten a un medidor. Si se configura, cualquier otra configuración excepto receive_timeout se ignora. No olvide configurar la tasa de baudios UART que el medidor está usando. Si no está seguro, pruebe 2400 7E1 o 9600 7E1.

::: advertencia Los medidores alimentados por batería suelen limitar el número de lecturas para conservar energía, por ejemplo, a 4 lecturas al día. Si un medidor no impone el límite, las lecturas frecuentes pueden disminuir significativamente la vida útil de la batería. :::

Sensor

El sensor informa el primer valor entre paréntesis del registro. Para los siguientes datos

log
1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)

el valor del sensor es 6000.385. Para obtener el segundo valor (fecha/hora en este ejemplo) use un Sensor de Texto.

El sensor solo admite valores decimales. Si el registro contiene datos en cualquier otro formato, debe usar Sensor de Texto y opcionalmente lambda para convertirlo a un número.

yaml
# Example sensor configuration entries
sensor:
  - platform: iec62056
    obis: 1-0:15.8.0
    name: Absolute active energy total
    unit_of_measurement: kWh
    accuracy_decimals: 3
    device_class: energy
    state_class: total_increasing

  - platform: iec62056
    name: Instantaneous current in phase L1
    obis: 1-0:31.7.0
    unit_of_measurement: A
    accuracy_decimals: 2
    device_class: current
    state_class: measurement

  - platform: iec62056
    name: Instantaneous voltage in phase L1
    obis: 1-0:32.7.0
    unit_of_measurement: V
    accuracy_decimals: 1
    device_class: voltage
    state_class: measurement

  - platform: iec62056
    name: Absolute active instantaneous power
    obis: 1-0:15.7.0
    unit_of_measurement: kW
    accuracy_decimals: 3
    device_class: energy
    state_class: measurement

Variables de configuración

  • obis (Requerido): Código OBIS.
  • Todas las demás opciones de Sensor.

Sensor de Texto

El sensor de texto proporciona datos de lectura como texto. A diferencia del Sensor, puede seleccionar qué parte de la lectura se informa e incluso enviar todo el registro de datos de vuelta a Home Assistant.

yaml
# Sample text sensor configuration
# Data record:
# 1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)

text_sensor:
  - platform: iec62056
    obis: 1-0:15.6.0
    group: 2 # "2000-01-01 20:10:30"
    name: Date time

  - platform: iec62056
    obis: 1-0:15.6.0
    group: 1 # "00000006000.385"
    name: Value

  - platform: iec62056
    obis: 1-0:15.6.0
    group: 0 # "1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)"
    name: The entire record

Variables de configuración

  • obis (Requerido): Código OBIS. Puede definir múltiples sensores de texto con el mismo OBIS pero un grupo diferente.
  • grupo (Opcional, int): Grupo de valores, 0, 1 o 2. Por defecto es 1. Si se establece en 0, se informa todo el registro de datos, incluido el código OBIS. 1 informa el primer valor, 2 el segundo.
  • Todas las demás opciones son de Sensor de Texto.

Conversión de datos

Si un medidor informa datos como un valor no decimal, puede convertirlo automáticamente usando un sensor de plantilla y lambda. Supongamos que el medidor envía un registro como el siguiente con datos codificados en hexadecimal:

text
0-0:96.8.0*255(ABCDEF00)

Primero, cree un sensor de plantilla que publique datos como un valor decimal.

yaml
sensor:
  - platform: template
    id: hex_to_dec_sensor
    name: "Converted hexadecimal number"

Ahora cree un sensor de texto que recibirá datos como una cadena, los convertirá a decimal y los publicará.

yaml
text_sensor:
  - platform: iec62056
    id: hex_sensor
    obis: 0-0:96.8.0*255
    name: Hex content
    internal: True
    on_value:
      lambda: |-
        std::string hex_str = id(hex_sensor).state;
        uint32_t dec=std::stoul(hex_str, nullptr, 16);
        ESP_LOGI("iec62056.component", "Converted HEX '%s' to %u decimal", hex_str.c_str(), dec);
        id(hex_to_dec_sensor).publish_state((float)dec);

Cada vez que el sensor de texto recibe un nuevo valor, lo convierte a decimal y lo publica usando el sensor con id hex_to_dec_sensor. La bandera internal evita que el sensor sea visible en Home Assistant. En el registro deberías ver:

log
[I][iec62056.component:127]: Converted HEX 'ABCDEF00' to 2882400000 decimal

Los mismos resultados se pueden obtener usando lambdas de Home Assistant. En este escenario, el sensor de texto publica el valor hexadecimal y el sensor de plantilla de Home Assistant realiza la conversión.

Switch

El interruptor proporciona la capacidad de activar la lectura bajo demanda. Cuando el estado cambia de OFF a ON, el componente inicia la transmisión de datos desde un medidor. Puedes usar el interruptor en automatización.

Se pueden usar las variables de configuración de Switch.

yaml
# Sample switch configuration
switch:
  - platform: iec62056
    name: 'Readout Trigger'

No puedes activar la lectura en el modo D.

Sensor binario

Se establece en ON cuando comienza la transmisión a un medidor. OFF cuando la transmisión ha terminado.

Puedes usar todas las variables de configuración de Sensor Binario.

yaml
# Sample automation to turn LED on when data read from a meter
switch:
  - platform: gpio
    pin: GPIO2
    name: Internal LED
    id: led_switch
    internal: True

binary_sensor:
  - platform: iec62056
    id: meter_status
    name: Meter Connection Status
    on_press:
      then:
        - switch.turn_on: led_switch
    on_release:
      then:
        - switch.turn_off: led_switch

Solución de problemas

  • Asegúrate de que la sonda esté alineada correctamente con los elementos ópticos en el medidor.
  • Los medidores generalmente se instalan en áreas no muy limpias. Puede que necesites quitar el polvo de la interfaz óptica de vez en cuando.
  • Si encuentras errores de transmisión y de verificación BCC, disminuye la velocidad de baudios usando la configuración baud_rate_max.
  • Si tu dispositivo maneja múltiples sensores que pasan mucho tiempo en el ciclo de actualización, puede que necesites aumentar el tamaño del búfer del puerto serie. Especialmente si notas problemas de transmisión cuando se habilitan sensores adicionales pero no cuando están deshabilitados.

Ver también