Skip to content

Componente ESPHome IEC 62056-21

IEC 62056-21 é um padrão internacional para um protocolo de troca de dados com medidores de serviços públicos. Principalmente para eletricidade, mas também para água, térmicos e outros medidores. Anteriormente era conhecido como IEC 61107.

O componente iec62056 permite que você leia dados de qualquer medidor compatível. Ele requer uma porta serial e uma interface óptica externa. A troca de dados utiliza um canal óptico infravermelho. Medidores compatíveis estão equipados com uma característica placa de metal redonda com dois opto-elementos dentro. O protocolo poderia ser usado com outras camadas de transporte, por exemplo, loop de corrente, mas o componente foi testado apenas com a interface óptica.

Ele suporta 4 modos do IEC 62056-21: A, B, C e D. O modo E não é suportado.

O componente não suporta programação. Configurar parâmetros de configuração do medidor requer uma senha secreta, o que torna impossível o uso por usuários comuns.

A interface em um medidor. Anel de metal para um ímã e dois elementos ópticos dentro.

Existem outros padrões de medidores inteligentes que usam a mesma interface óptica. Embora compartilhem alguns conceitos comuns, eles não são compatíveis.

Instalação

Adicione o seguinte código ao arquivo de configuração YAML do ESPHome para referenciar o componente externo.

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

Teoria de operação

O componente opera em 2 modos principais:

  • Comunicação bidirecional com um medidor. Neste modo, um medidor envia dados apenas quando solicitado. Requer um receptor e transmissor IR. Este é o modo A, B e C de acordo com o IEC 62056-21.
  • Comunicação unidirecional, onde um medidor envia dados para uma sonda de tempos em tempos. Requer apenas um receptor IR. Na terminologia do IEC 62056-21, é o modo D.

Modos A, B, C

O componente lê dados pela primeira vez 15 segundos após a inicialização. Primeiro, ele envia uma solicitação de identificação a 300 bps. O medidor retorna a taxa de baud máxima que pode suportar. Em seguida, a taxa de baud da porta serial é alterada para o valor fornecido pelo medidor ou configurado pela opção baud_rate_max. O medidor transmite registros de dados com códigos OBIS associados.

Se a transmissão falhar (checksum incorreto ou formato inválido), o componente tentará ler os dados novamente, mas desta vez usando uma velocidade de transmissão mais lenta. A cada tentativa, a velocidade é reduzida. O número de tentativas e atrasos pode ser configurado.

Se o medidor for alimentado por bateria, uma sequência especial de ativação pode ser aplicada. Isso acontece apenas quando battery_meter está configurado como True.

Modo D

Para medidores operando no modo D, você só precisa de um receptor IR, pois a transmissão para um medidor não é suportada. Neste modo, o medidor envia dados a cada poucos segundos sem qualquer solicitação. Você deve configurar a porta serial para corresponder ao formato de transmissão do medidor. Ao contrário dos modos A, B e C, que são detectados automaticamente, o Modo D deve ser habilitado manualmente configurando mode_d=True na configuração da plataforma.

Modo E

Este modo não é suportado. O modo E usa codificação binária sobre o link HDLC.

O componente tenta usar o modo C para medidores que reportam o modo E. Isso deve funcionar se o medidor suportar ambos os modos E e C. Para medidores que suportam apenas o modo E, a leitura não é possível.

Códigos OBIS

O código OBIS (Object Identification System) identifica as diferentes leituras de um medidor. O código consiste em até 6 sub-identificadores de grupo. O código é formatado assim: A-B:C.D.E*F, onde:

  • A - meio: 0=objeto abstrato, 1=eletricidade, 6=calor, 7=gás, 8=água
  • B - canal, 0=nenhum canal disponível
  • C - valor físico, por exemplo, corrente, tensão, temperatura.
  • D - tipo de medição,
  • E - tarifa, 0=total, 1=tarifa #1, 2=tarifa #2 e assim por diante
  • F - período de faturamento

A, B e F podem ser omitidos. Os códigos podem usar dígitos hexadecimais, por exemplo, o código 15.8.0 poderia ser representado como F.8.0.

Os códigos são padronizados, mas os dispositivos enviam um número diferente de códigos. Para obter uma lista de códigos suportados pelo seu medidor, habilite o log DEBUG para o componente iec62056 e observe a saída do log. Exemplo de saída:

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)'

::: dica O código OBIS do sensor deve corresponder exatamente ao que é transmitido de um medidor. Esta é a parte antes do primeiro parêntese (.

Se um código OBIS tiver apenas dois dígitos, você deve usar aspas no arquivo de configuração; por exemplo, "1.2" em vez de apenas 1.2. :::

Para uma lista de códigos OBIS para medidores elétricos, você pode visitar:

Hardware

Para se comunicar com um medidor, você deve conectar uma interface óptica à porta serial. A interface consiste em um LED infravermelho e um fototransistor. Além disso, o dispositivo deve estar equipado com um ímã de anel para mantê-lo alinhado com o medidor.

Se o medidor operar no modo unidirecional D, apenas um fototransistor IR é necessário.

Sonda

O padrão define as dimensões máximas da sonda que pode ser anexada a um medidor. Ela deve estar equipada com um ímã, pois é a única maneira de manter a sonda em uma posição estável.

Dimensões da sonda óptica

Configuração

Para ver os dados do medidor no Home Assistant, você deve definir um sensor ou sensor de texto com o código OBIS apropriado. Note que os medidores suportam diferentes conjuntos de códigos OBIS. Por padrão, o componente não define nenhum sensor.

Porta serial

O componente requer barramento UART. A serial deve ser configurada como 7E1 na maioria dos casos. Quando mode_d=True, a taxa de transmissão deve ser configurada para um valor suportado pelo medidor. Geralmente 2400 ou 9600 bps. Para outros modos (mode_d=False), a velocidade de transmissão é negociada com um medidor. baud_rate é ignorado e pode ser qualquer 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, é altamente recomendado usar UART de hardware. UART de software não pode lidar com transmissões mais rápidas que 4800 bps.

Pode ser necessário desativar o registro se a sonda óptica estiver conectada à porta serial usada pelo componente de registro.

yaml
# Defina baud_rate para 0 para desativar o registro via UART.
logger:
    baud_rate: 0

Plataforma

Para usar o componente, você deve definir a seção da plataforma iec62056 no arquivo de configuração. Consiste em configurações básicas.

yaml
# Example platform configuration entry for bidirectional communication
iec62056:
  update_interval: 60s
  baud_rate_max: 9600
  battery_meter: False
yaml
# Exemplo de configuração de plataforma para comunicação unidirecional
iec62056:
  mode_d: True

Variáveis de configuração

  • update_interval (Opcional, Time): O intervalo para ler dados de um medidor. O padrão é 15min. never desativa atualizações. Nesse caso, um interruptor deve ser usado para acionar a leitura. Para obter leituras contínuas, use um valor pequeno como 1s.
  • baud_rate_max (Opcional, int): Limita a velocidade máxima de transmissão para o valor especificado. Por padrão, é definido como 9600, pois fornece uma conexão estável. Para desativá-lo, defina como 0. Dessa forma, você pode usar a taxa de transmissão máxima possível de 19200 se o medidor suportar. Para ESP8266, use o UART de software definido para 4800 ou menos.
  • receive_timeout (Opcional, Time): Tempo máximo que o componente espera por dados de um medidor antes de relatar erro de transmissão. O padrão é 3s.
  • battery_meter (Opcional, booleano): Defina como verdadeiro se um medidor for alimentado por bateria. Dessa forma, uma sequência especial de ativação será usada.
  • retry_delay (Opcional, Time): Em caso de falha de transmissão, tempo de espera antes de tentar novamente a transmissão. O padrão é 15s.
  • retry_counter_max (Opcional, int): Em caso de falha de transmissão, o número máximo de tentativas. O padrão é 2.
  • uart_id (Opcional, ID: Especifique manualmente o ID do Componente UART se você quiser usar múltiplos barramentos UART.
  • mode_d (Opcional, booleano): Defina como True se um medidor enviar dados a cada poucos segundos. Isso força o componente a operar no modo D. Nesse modo, os dados nunca são transmitidos para um medidor. Se definido, quaisquer outras configurações, exceto receive_timeout, são ignoradas. Não esqueça de definir a taxa de transmissão UART que o medidor está usando. Se você não tiver certeza, tente 2400 7E1 ou 9600 7E1.

WARNING

Medidores alimentados por bateria geralmente limitam o número de leituras para preservar energia, por exemplo, para 4 leituras por dia. Se um medidor não impuser o limite, leituras frequentes podem diminuir significativamente a vida útil da bateria.

Sensor

O sensor relata o primeiro valor entre parênteses do registro. Para os seguintes dados

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

o valor do sensor é 6000.385. Para obter o segundo valor (data/hora neste exemplo) use um Sensor de Texto.

O sensor suporta apenas valores decimais. Se o registro contiver dados em qualquer outro formato, você deve usar o Sensor de Texto e opcionalmente lambda para convertê-lo em um 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

Variáveis de configuração

  • obis (Obrigatório): Código OBIS.
  • Todas as outras opções de Sensor.

Sensor de Texto

O sensor de texto fornece dados de leitura como texto. Em contraste com o Sensor, você pode selecionar qual parte da leitura é relatada e até mesmo enviar o registro de dados inteiro de volta para o 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

Variáveis de configuração

  • obis (Obrigatório): Código OBIS. Você pode definir vários sensores de texto com o mesmo OBIS, mas um grupo diferente.
  • group (Opcional, int): Grupo de valor, 0, 1 ou 2. O padrão é 1. Se definido como 0, o registro de dados inteiro é relatado, incluindo o código OBIS. 1 relata o primeiro valor, 2 o segundo.
  • Todas as outras opções são de Sensor de Texto.

Conversão de dados

Se um medidor relatar dados como um valor não decimal, você pode convertê-lo automaticamente usando um sensor de template e lambda. Vamos supor que o medidor envie um registro como o seguinte com dados codificados em hexadecimal:

text
0-0:96.8.0*255(ABCDEF00)

Primeiro, crie um sensor de template que publicará dados como um valor decimal.

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

Agora crie um sensor de texto que receberá dados como uma string, converterá para decimal e 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);

Toda vez que o sensor de texto recebe um novo valor, ele o converte para decimal e publica usando o sensor com id hex_to_dec_sensor. A flag internal impede que o sensor seja visível no Home Assistant. No log, você deve ver:

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

Os mesmos resultados podem ser obtidos usando lambdas do Home Assistant. Neste cenário, o sensor de texto publica o valor hexadecimal e o sensor de template do Home Assistant faz a conversão.

Switch

O switch fornece a capacidade de acionar a leitura sob demanda. Quando o estado é alterado de OFF para ON, o componente inicia a transmissão de dados de um medidor. Você pode usar o switch em automação.

Variáveis de configuração do Switch podem ser usadas.

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

Você não pode acionar a leitura no modo D.

Sensor binário

Define como ON quando a transmissão para um medidor começa. OFF quando a transmissão é finalizada.

Você pode usar todas as variáveis de configuração do Sensor Binário.

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

Solução de problemas

  • Certifique-se de que a sonda está devidamente alinhada com os elementos ópticos no medidor.
  • Os medidores geralmente são instalados em áreas não muito limpas. Pode ser necessário remover a poeira da interface óptica de tempos em tempos.
  • Se você encontrar erros de transmissão e de checksum BCC, diminua a taxa de baud usando a configuração baud_rate_max.
  • Se o seu dispositivo lida com vários sensores que passam muito tempo no loop de atualização, pode ser necessário aumentar o tamanho do buffer da porta serial. Especialmente se você notar problemas de transmissão quando sensores adicionais estão habilitados, mas não quando estão desabilitados.

Veja também