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.
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=aguaB
- canal, 0=no hay canal disponibleC
- 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í sucesivamenteF
- 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:
- https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm
- https://onemeter.com/docs/device/obis/#index
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.
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 a0
. De esa manera, puede usar la tasa de baudios máxima posible de19200
si el medidor lo admite. Para ESP8266 use el UART de software configurado a4800
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 exceptoreceive_timeout
se ignora. No olvide configurar la tasa de baudios UART que el medidor está usando. Si no está seguro, pruebe2400 7E1
o9600 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
o2
. Por defecto es1
. Si se establece en0
, 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.