Composant ESPHome IEC 62056-21
IEC 62056-21 est une norme internationale pour un protocole d'échange de données avec des compteurs de services publics. Principalement pour l'électricité, mais aussi pour l'eau, la chaleur et d'autres compteurs. Elle était auparavant connue sous le nom de IEC 61107.
Le composant iec62056
vous permet de lire les données de tout compteur compatible. Il nécessite un port série et une interface optique externe. L'échange de données utilise un canal optique infrarouge. Les compteurs compatibles sont équipés d'une plaque métallique ronde caractéristique avec deux opto-éléments à l'intérieur. Le protocole pourrait être utilisé avec d'autres couches de transport, par exemple boucle de courant, mais le composant a été testé uniquement avec l'interface optique.
Il prend en charge 4 modes de l'IEC 62056-21 : A, B, C et D. Le mode E n'est pas pris en charge.
Le composant ne prend pas en charge la programmation. La configuration des paramètres du compteur nécessite un mot de passe secret, ce qui le rend impossible à utiliser par les utilisateurs ordinaires.
Il existe d'autres normes de compteurs intelligents qui utilisent la même interface optique. Bien qu'ils partagent certains concepts communs, ils ne sont pas compatibles.
Installation
Ajoutez le code suivant au fichier de configuration YAML d'ESPHome pour référencer le composant externe.
yaml
external_components:
# Composant IEC62056
- source: github://aquaticus/esphome-iec62056
Théorie de fonctionnement
Le composant fonctionne en 2 modes principaux :
- Communication bidirectionnelle avec un compteur. Dans ce mode, un compteur envoie des données uniquement sur demande. Il nécessite un récepteur et un émetteur IR. C'est le mode A, B et C selon l'IEC 62056-21.
- Communication unidirectionnelle, où un compteur envoie des données à une sonde de temps en temps. Il nécessite uniquement un récepteur IR. Dans la terminologie de IEC 62056-21, c'est le mode D.
Modes A, B, C
Le composant lit les données pour la première fois 15 secondes après le démarrage. Tout d'abord, il envoie une demande d'identification à 300 bps. Le compteur retourne le débit en bauds maximum qu'il peut gérer. Ensuite, le débit en bauds du port série est changé à la valeur fournie par le compteur ou configurée par l'option baud_rate_max
. Le compteur transmet les registres de données avec les codes OBIS associés.
Si la transmission a échoué (mauvais checksum ou format invalide), le composant essaiera de lire les données à nouveau, mais cette fois en utilisant une vitesse de transmission plus lente. À chaque nouvelle tentative, la vitesse est réduite. Le nombre de tentatives et les délais peuvent être configurés.
Si le compteur est alimenté par batterie, une séquence spéciale de réveil peut être appliquée. Cela se produit uniquement lorsque battery_meter
est réglé sur True
.
Mode D
Pour les compteurs fonctionnant en mode D, vous n'avez besoin que d'un récepteur IR car la transmission vers un compteur n'est pas prise en charge. Dans ce mode, le compteur envoie des données toutes les quelques secondes sans aucune requête. Vous devez configurer le port série pour correspondre au format de transmission du compteur. Contrairement aux modes A, B et C qui sont détectés automatiquement, le Mode D doit être activé manuellement en réglant mode_d=True
dans la configuration de la plateforme.
Mode E
Ce mode n'est pas pris en charge. Le mode E utilise un encodage binaire sur un lien HDLC.
Le composant essaie d'utiliser le mode C pour les compteurs signalant le mode E. Cela devrait fonctionner si le compteur prend en charge à la fois les modes E et C. Pour les compteurs ne prenant en charge que le mode E, la lecture n'est pas possible.
Codes OBIS
Le code OBIS (Object Identification System) identifie les différentes lectures d'un compteur. Le code se compose de jusqu'à 6 sous-identifiants de groupe. Le code est formaté comme suit : A-B:C.D.E*F
, où :
A
- médium : 0=objets abstraits, 1=électricité, 6=chaleur, 7=gaz, 8=eauB
- canal, 0=aucun canal disponibleC
- valeur physique, par exemple courant, tension, température.D
- type de mesure,E
- tarif, 0=total, 1=tarif #1, 2=tarif #2 et ainsi de suiteF
- période de facturation
A
, B
et F
peuvent être omis. Les codes peuvent utiliser des chiffres hexadécimaux, par exemple, le code 15.8.0
pourrait être représenté comme F.8.0
.
Les codes sont standardisés mais les appareils envoient un nombre différent de codes. Pour obtenir une liste des codes pris en charge par votre compteur, activez le journal DEBUG
pour le composant iec62056
et observez la sortie du journal. Exemple de sortie :
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
Le code OBIS du capteur doit correspondre exactement à ce qui est transmis par un compteur. C'est la partie avant la première parenthèse (
.
Si un code OBIS ne comporte que deux chiffres, vous devez utiliser des guillemets dans le fichier de configuration ; par exemple, "1.2"
au lieu de simplement 1.2
.
Pour une liste des codes OBIS pour les compteurs électriques, vous pouvez visiter :
- https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm
- https://onemeter.com/docs/device/obis/#index
Matériel
Pour communiquer avec un compteur, vous devez attacher une interface optique au port série. L'interface se compose d'une LED infrarouge et d'un phototransistor. De plus, l'appareil doit être équipé d'un aimant annulaire pour le maintenir aligné avec le compteur.
Si le compteur fonctionne en mode unidirectionnel D, seul un phototransistor IR est requis.
Sonde
La norme définit les dimensions maximales de la sonde qui peut être attachée à un compteur. Elle doit être équipée d'un aimant car c'est le seul moyen de maintenir la sonde dans une position stable.
Configuration
Pour voir les données du compteur dans Home Assistant, vous devez définir un capteur ou un capteur de texte avec le code OBIS approprié. Notez que les compteurs prennent en charge différents ensembles de codes OBIS. Par défaut, le composant ne définit aucun capteur.
Port série
Le composant nécessite un bus UART. Le port série doit être configuré en 7E1 dans la plupart des cas. Lorsque mode_d=True
, le débit en bauds doit être réglé sur une valeur prise en charge par le compteur. Généralement 2400 ou 9600 bps. Pour les autres modes (mode_d=False
), la vitesse de transmission est négociée avec un compteur. baud_rate
est ignoré et peut être n'importe quelle valeur.
yaml
# Example UART configuration entry
uart:
rx_pin: GPIO21
tx_pin: GPIO22
baud_rate: 9600
data_bits: 7
parity: EVEN
stop_bits: 1
WARNING
Pour ESP8266, il est fortement recommandé d'utiliser le matériel UART. Le logiciel UART ne peut pas gérer des transmissions supérieures à 4800 bps.
Vous devrez peut-être désactiver la journalisation si la sonde optique est connectée au port série utilisé par le composant de journalisation.
yaml
# Réglez baud_rate à 0 pour désactiver la journalisation via UART.
logger:
baud_rate: 0
Plateforme
Pour utiliser le composant, vous devez définir la section de la plateforme iec62056
dans le fichier de configuration. Elle se compose de paramètres de base.
yaml
# Example platform configuration entry for bidirectional communication
iec62056:
update_interval: 60s
baud_rate_max: 9600
battery_meter: False
yaml
# Exemple de configuration de plateforme pour la communication unidirectionnelle
iec62056:
mode_d: True
Variables de configuration
- update_interval (Optionnel, Time): L'intervalle pour lire les données d'un compteur. Par défaut, il est de
15min
.never
désactive les mises à jour. Dans ce cas, un interrupteur doit être utilisé pour déclencher la lecture. Pour obtenir des lectures continues, utilisez une petite valeur comme 1s. - baud_rate_max (Optionnel, int) : Limite la vitesse de transmission maximale à la valeur spécifiée. Par défaut, elle est réglée à
9600
car elle offre une connexion stable. Pour la désactiver, réglez-la à0
. De cette façon, vous pouvez utiliser le débit en bauds maximum possible de19200
si le compteur le supporte. Pour ESP8266, utilisez l'UART logiciel réglé à4800
ou moins. - receive_timeout (Optionnel, Time): Temps maximum que le composant attend les données d'un compteur avant de signaler une erreur de transmission. Par défaut, il est de
3s
. - battery_meter (Optionnel, booléen) : Réglez sur true si un compteur est alimenté par batterie. De cette façon, une séquence spéciale de mise sous tension sera utilisée.
- retry_delay (Optionnel, Time): En cas d'échec de transmission, temps d'attente avant de réessayer la transmission. Par défaut, il est de
15s
. - retry_counter_max (Optionnel, int) : En cas d'échec de transmission, le nombre maximum de tentatives. Par défaut, il est de
2
. - uart_id (Optionnel, ID : Spécifiez manuellement l'ID du Composant UART si vous souhaitez utiliser plusieurs bus UART.
- mode_d (Optionnel, booléen) : Réglez sur
True
si un compteur envoie des données toutes les quelques secondes. Cela force le composant à fonctionner en mode D. Dans ce mode, les données ne sont jamais transmises à un compteur. Si réglé, tous les autres paramètres saufreceive_timeout
sont ignorés. N'oubliez pas de régler le débit en bauds de l'UART utilisé par le compteur. Si vous n'êtes pas sûr, essayez2400 7E1
ou9600 7E1
.
WARNING
Les compteurs alimentés par batterie limitent généralement le nombre de lectures pour préserver l'énergie, par exemple à 4 lectures par jour. Si un compteur n'impose pas de limite, des lectures fréquentes peuvent réduire considérablement la durée de vie de la batterie.
Capteur
Le capteur rapporte la première valeur entre parenthèses de l'enregistrement. Pour les données suivantes
log
1-0:15.6.0(00000006000.385*kW)(2000-01-01 20:10:30)
la valeur du capteur est 6000.385
. Pour obtenir la deuxième valeur (date/heure dans cet exemple), utilisez un Capteur de Texte.
Le capteur ne prend en charge que les valeurs décimales. Si l'enregistrement contient des données dans un autre format, vous devez utiliser un Capteur de Texte et éventuellement un lambda pour le convertir en nombre.
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 configuration
- obis (Requis): Code OBIS.
- Toutes les autres options du Capteur.
Capteur de Texte
Le capteur de texte fournit les données de lecture sous forme de texte. Contrairement au Capteur, vous pouvez sélectionner quelle partie de la lecture est rapportée et même renvoyer l'intégralité de l'enregistrement de données à 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 configuration
- obis (Requis): Code OBIS. Vous pouvez définir plusieurs capteurs de texte avec le même OBIS mais un groupe différent.
- groupe (Optionnel, int): Groupe de valeurs,
0
,1
, ou2
. Par défaut à1
. Si réglé à0
, l'intégralité de l'enregistrement de données est rapportée, y compris le code OBIS.1
rapporte la première valeur,2
la deuxième. - Toutes les autres options proviennent du Capteur de Texte.
Conversion de données
Si un compteur rapporte des données sous forme de valeur non décimale, vous pouvez les convertir automatiquement en utilisant un capteur de modèle et un lambda. Supposons que le compteur envoie un enregistrement comme le suivant avec des données encodées en hexadécimal :
text
0-0:96.8.0*255(ABCDEF00)
Tout d'abord, créez un capteur de modèle qui publiera les données sous forme de valeur décimale.
yaml
sensor:
- platform: template
id: hex_to_dec_sensor
name: "Converted hexadecimal number"
Créez maintenant un capteur de texte qui recevra les données sous forme de chaîne, les convertira en décimal et les publiera.
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);
Chaque fois que le capteur de texte reçoit une nouvelle valeur, il la convertit en décimal et la publie en utilisant le capteur avec l'identifiant hex_to_dec_sensor
. Le drapeau internal
empêche le capteur d'être visible dans Home Assistant. Dans le journal, vous devriez voir :
log
[I][iec62056.component:127]: Converted HEX 'ABCDEF00' to 2882400000 decimal
Les mêmes résultats peuvent être obtenus en utilisant les lambdas de Home Assistant. Dans ce scénario, le capteur de texte publie une valeur hexadécimale et le capteur de modèle Home Assistant effectue la conversion.
Interrupteur
L'interrupteur permet de déclencher la lecture sur demande. Lorsque l'état passe de OFF
à ON
, le composant initie la transmission de données depuis un compteur. Vous pouvez utiliser l'interrupteur dans l'automatisation.
Les variables de configuration de Switch peuvent être utilisées.
yaml
# Sample switch configuration
switch:
- platform: iec62056
name: 'Readout Trigger'
Vous ne pouvez pas déclencher la lecture en mode D.
Capteur binaire
Réglez sur ON
lorsque la transmission vers un compteur commence. OFF
lorsque la transmission est terminée.
Vous pouvez utiliser toutes les variables de configuration de Binary Sensor.
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
Dépannage
- Assurez-vous que la sonde est correctement alignée avec les éléments optiques du compteur.
- Les compteurs sont généralement installés dans des zones pas très propres. Vous devrez peut-être enlever la poussière de l'interface optique de temps en temps.
- Si vous rencontrez des erreurs de transmission et de somme de contrôle BCC, réduisez le débit en bauds en utilisant le paramètre
baud_rate_max
. - Si votre appareil gère plusieurs capteurs qui passent beaucoup de temps dans la boucle de mise à jour, vous devrez peut-être augmenter la taille du tampon du port série. Surtout si vous notez des problèmes de transmission lorsque des capteurs supplémentaires sont activés mais pas lorsqu'ils sont désactivés.