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.
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=águaB
- canal, 0=nenhum canal disponívelC
- 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 dianteF
- 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:
- https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm
- https://onemeter.com/docs/device/obis/#index
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.
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 como0
. Dessa forma, você pode usar a taxa de transmissão máxima possível de19200
se o medidor suportar. Para ESP8266, use o UART de software definido para4800
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, excetoreceive_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, tente2400 7E1
ou9600 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
ou2
. O padrão é1
. Se definido como0
, 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.