Skip to content

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.

L'interface sur un compteur. Anneau métallique pour un aimant et deux éléments optiques à l'intérieur.

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=eau
  • B - canal, 0=aucun canal disponible
  • C - 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 suite
  • F - 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 :

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.

Dimensions de la sonde optique

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 de 19200 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 sauf receive_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, essayez 2400 7E1 ou 9600 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, ou 2. 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.

Voir aussi