Componente ESPHome IEC 62056-21
IEC 62056-21 è uno standard internazionale per un protocollo di scambio dati con contatori di utenza. Principalmente per l'elettricità, ma anche per acqua, termico e altri contatori. Era precedentemente noto come IEC 61107.
Il componente iec62056
ti permette di leggere i dati da qualsiasi contatore compatibile. Richiede una porta seriale e un'interfaccia ottica esterna. Lo scambio di dati utilizza un canale ottico a infrarossi. I contatori compatibili sono dotati di una caratteristica piastra metallica rotonda con due opto-elementi all'interno. Il protocollo potrebbe essere utilizzato con altri strati di trasporto, ad es. loop di corrente, ma il componente è stato testato solo con l'interfaccia ottica.
Supporta 4 modalità di IEC 62056-21: A, B, C e D. La modalità E non è supportata.
Il componente non supporta la programmazione. L'impostazione dei parametri di configurazione del contatore richiede una password segreta che rende impossibile l'uso da parte degli utenti ordinari.
Esistono altri standard per contatori intelligenti che utilizzano la stessa interfaccia ottica. Sebbene condividano alcuni concetti comuni, non sono compatibili.
Installazione
Aggiungi il seguente codice al file di configurazione YAML di ESPHome per fare riferimento al componente esterno.
yaml
external_components:
# Componente IEC62056
- source: github://aquaticus/esphome-iec62056
Teoria del funzionamento
Il componente opera in 2 modalità principali:
- Comunicazione bidirezionale con un contatore. In questa modalità, un contatore invia dati solo quando richiesto. Richiede un ricevitore e trasmettitore IR. Questa è la modalità A, B e C secondo IEC 62056-21.
- Comunicazione unidirezionale, dove un contatore invia dati a una sonda di tanto in tanto. Richiede solo un ricevitore IR. Nella terminologia IEC 62056-21 è la modalità D.
Modalità A, B, C
Il componente legge i dati per la prima volta 15 secondi dopo l'avvio. Prima, invia una richiesta di identificazione a 300 bps. Il contatore restituisce la velocità massima di baud che può gestire. Successivamente, la velocità di baud della porta seriale viene cambiata al valore fornito dal contatore o configurato tramite l'opzione baud_rate_max
. Il contatore trasmette i registri dei dati con i codici OBIS associati.
Se la trasmissione non riesce (checksum errato o formato non valido), il componente tenterà di leggere nuovamente i dati, ma questa volta utilizzando una velocità di trasmissione più lenta. Per ogni tentativo, la velocità viene ridotta. Il numero di tentativi e i ritardi possono essere configurati.
Se il contatore è alimentato a batteria, può essere applicata una sequenza di risveglio speciale. Questo avviene solo quando battery_meter
è impostato su True
.
Modalità D
Per i contatori che operano in modalità D, è necessario solo un ricevitore IR poiché la trasmissione a un contatore non è supportata. In questa modalità, il contatore invia dati ogni pochi secondi senza alcuna richiesta. È necessario configurare la porta seriale per adattarsi al formato di trasmissione del contatore. A differenza delle modalità A, B e C che vengono rilevate automaticamente, la Modalità D deve essere abilitata manualmente impostando mode_d=True
nella configurazione della piattaforma.
Modalità E
Questa modalità non è supportata. La Modalità E utilizza la codifica binaria su collegamento HDLC.
Il componente tenta di utilizzare la modalità C per i contatori che riportano la modalità E. Questo dovrebbe funzionare se il contatore supporta entrambe le modalità E e C. Per i contatori che supportano solo la modalità E, la lettura non è possibile.
Codici OBIS
Il codice OBIS (Object Identification System) identifica le diverse letture di un contatore. Il codice è composto da un massimo di 6 sottogruppi identificativi. Il codice è formattato in questo modo: A-B:C.D.E*F
, dove:
A
- mezzo: 0=oggetti astratti, 1=elettricità, 6=calore, 7=gas, 8=acquaB
- canale, 0=nessun canale disponibileC
- valore fisico, ad esempio corrente, tensione, temperatura.D
- tipo di misurazione,E
- tariffa, 0=totale, 1=tariffa #1, 2=tariffa #2 e così viaF
- periodo di fatturazione
A
, B
e F
possono essere omessi. I codici possono utilizzare cifre esadecimali, ad esempio, il codice 15.8.0
potrebbe essere rappresentato come F.8.0
.
I codici sono standardizzati, ma i dispositivi inviano un numero diverso di codici. Per ottenere un elenco dei codici supportati dal tuo contatore, abilita il log DEBUG
per il componente iec62056
e osserva l'output del log. Esempio di output:
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
Il codice OBIS del sensore deve corrispondere esattamente a ciò che viene trasmesso da un contatore. Questa è la parte prima della prima parentesi (
.
Se un codice OBIS è composto da solo due cifre, dovresti usare le virgolette nel file di configurazione; ad esempio, "1.2"
invece di solo 1.2
.
Per un elenco di codici OBIS per contatori elettrici, puoi visitare:
- https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm
- https://onemeter.com/docs/device/obis/#index
Hardware
Per comunicare con un contatore, devi collegare un'interfaccia ottica alla porta seriale. L'interfaccia è composta da un LED a infrarossi e un fototransistor. Inoltre, il dispositivo deve essere dotato di un magnete ad anello per mantenerlo allineato con il contatore.
Se il contatore opera in modalità unidirezionale D, è richiesto solo un fototransistor IR.
Sonda
Lo standard definisce le dimensioni massime della sonda che può essere collegata a un contatore. Deve essere dotata di un magnete poiché è l'unico modo per mantenere la sonda in una posizione stabile.
Configurazione
Per visualizzare i dati del contatore in Home Assistant, devi definire un sensore o un sensore di testo con il codice OBIS appropriato. Nota che i contatori supportano diversi set di codici OBIS. Di default, il componente non definisce alcun sensore.
Porta seriale
Il componente richiede bus UART. La seriale deve essere configurata come 7E1 nella maggior parte dei casi. Quando mode_d=True
, il baud rate deve essere impostato su un valore supportato dal contatore. Solitamente 2400 o 9600 bps. Per altre modalità (mode_d=False
), la velocità di trasmissione viene negoziata con un contatore. baud_rate
viene ignorato e può essere qualsiasi valore.
yaml
# Example UART configuration entry
uart:
rx_pin: GPIO21
tx_pin: GPIO22
baud_rate: 9600
data_bits: 7
parity: EVEN
stop_bits: 1
WARNING
Per ESP8266 è altamente raccomandato utilizzare UART hardware. UART software non può gestire trasmissioni più veloci di 4800 bps.
Potrebbe essere necessario disabilitare il logging se la sonda ottica è collegata alla porta seriale utilizzata dal componente logger.
yaml
# Imposta baud_rate a 0 per disabilitare il logging tramite UART.
logger:
baud_rate: 0
Piattaforma
Per utilizzare il componente, devi definire la sezione della piattaforma iec62056
nel file di configurazione. Consiste in impostazioni di base.
yaml
# Example platform configuration entry for bidirectional communication
iec62056:
update_interval: 60s
baud_rate_max: 9600
battery_meter: False
yaml
# Esempio di configurazione della piattaforma per comunicazione unidirezionale
iec62056:
mode_d: True
Variabili di configurazione
- update_interval (Opzionale, Time): L'intervallo per leggere i dati da un contatore. Il valore predefinito è
15min
.never
disabilita gli aggiornamenti. In tal caso, dovrebbe essere utilizzato un interruttore per attivare la lettura. Per ottenere letture continue, utilizzare un valore piccolo come 1s. - baud_rate_max (Opzionale, int): Limita la velocità massima di trasmissione al valore specificato. Per impostazione predefinita, è impostato su
9600
poiché fornisce una connessione stabile. Per disabilitarlo, impostarlo su0
. In questo modo è possibile utilizzare la velocità massima di baud di19200
se il contatore lo supporta. Per ESP8266 utilizzare l'UART software impostato su4800
o inferiore. - receive_timeout (Opzionale, Time): Tempo massimo che il componente attende i dati da un contatore prima di segnalare un errore di trasmissione. Il valore predefinito è
3s
. - battery_meter (Opzionale, booleano): Impostare su true se un contatore è alimentato a batteria. In questo modo verrà utilizzata una sequenza di accensione speciale.
- retry_delay (Opzionale, Time): In caso di fallimento della trasmissione, tempo di attesa prima di riprovare la trasmissione. Il valore predefinito è
15s
. - retry_counter_max (Opzionale, int): In caso di fallimento della trasmissione, il numero massimo di tentativi. Il valore predefinito è
2
. - uart_id (Opzionale, ID: Specificare manualmente l'ID del Componente UART se si desidera utilizzare più bus UART.
- mode_d (Opzionale, booleano): Impostare su
True
se un contatore invia dati ogni pochi secondi. Questo forza il componente a operare in modalità D. In questa modalità i dati non vengono mai trasmessi a un contatore. Se impostato, qualsiasi altra impostazione eccettoreceive_timeout
viene ignorata. Non dimenticare di impostare la velocità di baud UART che il contatore sta utilizzando. Se non sei sicuro prova2400 7E1
o9600 7E1
.
WARNING
I misuratori alimentati a batteria in genere limitano il numero di letture per preservare l'energia, ad esempio a 4 letture al giorno. Se un misuratore non impone il limite, letture frequenti possono ridurre significativamente la durata della batteria.
Sensore
Il sensore riporta il primo valore tra parentesi dal record. Per i seguenti dati
log
1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)
il valore del sensore è 6000.385
. Per ottenere il secondo valore (data/ora in questo esempio) usa un Sensore di Testo.
Il sensore supporta solo valori decimali. Se il record contiene dati in qualsiasi altro formato, devi usare un Sensore di Testo e opzionalmente lambda per convertirlo in un numero.
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
Variabili di configurazione
- obis (Obbligatorio): Codice OBIS.
- Tutte le altre opzioni da Sensore.
Sensore di Testo
Il sensore di testo fornisce i dati di lettura come testo. A differenza del Sensore, puoi selezionare quale parte della lettura viene riportata e persino inviare l'intero record di dati 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
Variabili di configurazione
- obis (Obbligatorio): Codice OBIS. Puoi definire più sensori di testo con lo stesso OBIS ma un gruppo diverso.
- group (Opzionale, int): Gruppo di valori,
0
,1
o2
. Predefinito a1
. Se impostato a0
, viene riportato l'intero record di dati incluso il codice OBIS.1
riporta il primo valore,2
il secondo. - Tutte le altre opzioni sono da Sensore di Testo.
Conversione dei dati
Se un misuratore riporta dati come valore non decimale, puoi convertirlo automaticamente usando un sensore template e lambda. Supponiamo che il misuratore invii un record come il seguente con dati codificati in esadecimale:
text
0-0:96.8.0*255(ABCDEF00)
Per prima cosa, crea un sensore template che pubblicherà i dati come valore decimale.
yaml
sensor:
- platform: template
id: hex_to_dec_sensor
name: "Converted hexadecimal number"
Ora crea un sensore di testo che riceverà i dati come stringa, li convertirà in decimale e li pubblicherà.
Ogni volta che il sensore di testo riceve un nuovo valore, lo converte in un decimale e lo pubblica utilizzando il sensore con id hex_to_dec_sensor
. Il flag internal
impedisce al sensore di essere visibile in Home Assistant. Nel log dovresti vedere:
Gli stessi risultati possono essere ottenuti utilizzando le lambda di Home Assistant. In questo scenario, il sensore di testo pubblica il valore esadecimale e il sensore di template di Home Assistant effettua la conversione.
Interruttore
L'interruttore fornisce la possibilità di attivare la lettura su richiesta. Quando lo stato viene cambiato da OFF
a ON
, il componente avvia la trasmissione dei dati da un contatore. Puoi utilizzare l'interruttore nell'automazione.
Le variabili di configurazione da Interruttore possono essere utilizzate.
Non puoi attivare la lettura in modalità D.
Sensore binario
Impostato su ON
quando inizia la trasmissione a un contatore. OFF
quando la trasmissione è terminata.
Puoi utilizzare tutte le variabili di configurazione da Sensore Binario.
Risoluzione dei problemi
- Assicurati che la sonda sia correttamente allineata con gli elementi ottici sul contatore.
- I contatori sono solitamente installati in aree non molto pulite. Potrebbe essere necessario rimuovere la polvere dall'interfaccia ottica di tanto in tanto.
- Se incontri errori di trasmissione e checksum BCC, riduci la velocità in baud utilizzando l'impostazione
baud_rate_max
. - Se il tuo dispositivo gestisce più sensori che impiegano molto tempo nel ciclo di aggiornamento, potrebbe essere necessario aumentare la dimensione del buffer della porta seriale. Soprattutto se noti problemi di trasmissione quando i sensori aggiuntivi sono abilitati ma non quando sono disabilitati.