Skip to content

ESPHome IEC 62056-21 Компонент

IEC 62056-21 е международен стандарт за протокол за обмен на данни с измервателни уреди. Основно за електричество, но също така и за вода, топлинни и други измервателни уреди. Преди това е бил известен като IEC 61107.

Компонентът iec62056 ви позволява да четете данни от всеки съвместим измервателен уред. Изисква сериен порт и външен оптичен интерфейс. Обменът на данни използва инфрачервен оптичен канал. Съвместимите измервателни уреди са оборудвани с характерна кръгла метална плоча с два оптоелемента вътре. Протоколът може да се използва с други транспортни слоеве, напр. токов контур, но компонентът е тестван само с оптичния интерфейс.

Поддържа 4 режима на IEC 62056-21: A, B, C и D. Режим E не се поддържа.

Компонентът не поддържа програмиране. Настройката на параметрите на конфигурацията на измервателния уред изисква тайна парола, което го прави невъзможно за използване от обикновени потребители.

Интерфейсът на измервателен уред. Метален пръстен за магнит и два оптични елемента вътре.

Съществуват и други стандарти за интелигентни измервателни уреди, които използват същия оптичен интерфейс. Въпреки че споделят някои общи концепции, те не са съвместими.

Инсталация

Добавете следния код към YAML конфигурационния файл на ESPHome, за да реферирате външния компонент.

yaml
external_components:
    # IEC62056 компонент
    - source: github://aquaticus/esphome-iec62056

Теория на работа

Компонентът работи в 2 основни режима:

  • Двунасочна комуникация с измервателен уред. В този режим измервателният уред изпраща данни само при поискване. Изисква IR приемник и предавател. Това е режим A, B и C според IEC 62056-21.
  • Еднопосочна комуникация, при която измервателният уред изпраща данни към проба от време на време. Изисква само IR приемник. В терминологията на IEC 62056-21 това е режим D.

Режими A, B, C

Компонентът чете данни за първи път 15 секунди след стартиране. Първо, изпраща заявка за идентификация при 300 bps. Измервателният уред връща максималната скорост на предаване, която може да обработи. След това скоростта на серийния порт се променя на стойността, предоставена от измервателния уред или конфигурирана чрез опцията baud_rate_max. Измервателният уред предава данни регистри с асоциирани OBIS кодове.

Ако предаването е неуспешно (лоша контролна сума или невалиден формат), компонентът ще се опита да прочете данните отново, но този път с по-ниска скорост на предаване. При всяко повторение скоростта се намалява. Броят на повторенията и забавянията могат да бъдат конфигурирани.

Ако измервателният уред е на батерия, може да се приложи специална последователност за събуждане. Това се случва само когато battery_meter е настроен на True.

Режим D

За измервателни уреди, работещи в режим D, ви е необходим само IR приемник, тъй като предаването към измервателния уред не се поддържа. В този режим измервателният уред изпраща данни на всеки няколко секунди без никакво запитване. Трябва да конфигурирате серийния порт, за да съответства на формата на предаване на измервателния уред. За разлика от режими A, B и C, които се откриват автоматично, режим D трябва да бъде активиран ръчно, като се зададе mode_d=True в конфигурацията на платформата.

Режим E

Този режим не се поддържа. Режим E използва двоично кодиране върху HDLC връзка.

Компонентът се опитва да използва режим C за измервателни уреди, които съобщават режим E. Това трябва да работи, ако измервателният уред поддържа и двата режима E и C. За измервателни уреди, поддържащи само режим E, четенето не е възможно.

OBIS кодове

OBIS (Object Identification System) кодът идентифицира различните показания от измервателния уред. Кодът се състои от до 6 групи подидентификатори. Кодът е форматиран по следния начин: A-B:C.D.E*F, където:

  • A - среда: 0=абстрактни обекти, 1=електричество, 6=топлина, 7=газ, 8=вода
  • B - канал, 0=няма наличен канал
  • C - физическа стойност, например ток, напрежение, температура.
  • D - тип измерване,
  • E - тариф, 0=общо, 1=тарифа #1, 2=тарифа #2 и т.н.
  • F - период на фактуриране

A, B и F могат да бъдат пропуснати. Кодове могат да използват шестнадесетични цифри, например, код 15.8.0 може да бъде представен като F.8.0.

Кодовете са стандартизирани, но устройствата изпращат различен брой кодове. За да получите списък с кодовете, поддържани от вашия измервателен уред, активирайте DEBUG лог за компонента iec62056 и наблюдавайте изхода на лога. Примерен изход:

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

OBIS кодът на сензора трябва да съвпада точно с това, което се предава от измервателния уред. Това е частта преди първата скоба (.

Ако OBIS кодът е само две цифри, трябва да използвате кавички в конфигурационния файл; например, "1.2" вместо само 1.2.

За списък с OBIS кодове за електромери, можете да посетите:

Хардуер

За да комуникирате с електромера, трябва да прикрепите оптичен интерфейс към серийния порт. Интерфейсът се състои от инфрачервен LED и фототранзистор. Освен това, устройството трябва да бъде оборудвано с пръстеновиден магнит, за да се поддържа в съответствие с електромера.

Ако електромерът работи в еднопосочен режим D, е необходим само IR фототранзистор.

Сонда

Стандартът определя максималните размери на сондата, която може да бъде прикрепена към електромера. Тя трябва да бъде оборудвана с магнит, тъй като това е единственият начин да се поддържа сондата в стабилна позиция.

Размери на оптичната сонда

Конфигурация

За да видите данните от електромера в Home Assistant, трябва да дефинирате сензор или текстов сензор с подходящия OBIS код. Имайте предвид, че електромерите поддържат различни набори от OBIS кодове. По подразбиране, компонентът не дефинира никакви сензори.

Сериен порт

Компонентът изисква UART шина. Серийният порт трябва да бъде конфигуриран като 7E1 в повечето случаи. Когато mode_d=True, скоростта на предаване трябва да бъде зададена на стойност, поддържана от електромера. Обикновено 2400 или 9600 bps. За други режими (mode_d=False) скоростта на предаване се договаря с електромера. baud_rate се игнорира и може да бъде всякаква стойност.

yaml
# Example UART configuration entry
uart:
    rx_pin: GPIO21
    tx_pin: GPIO22
    baud_rate: 9600
    data_bits: 7
    parity: EVEN
    stop_bits: 1

WARNING

За ESP8266 силно се препоръчва използването на хардуерен UART. Софтуерният UART не може да обработва предавания по-бързи от 4800 bps.

Може да се наложи да деактивирате логването, ако оптичната сонда е свързана към серийния порт, използван от компонента за логване.

yaml
# Задайте baud_rate на 0, за да деактивирате логването чрез UART.
logger:
    baud_rate: 0

Платформа

За да използвате компонента, трябва да дефинирате секция iec62056 платформа в конфигурационния файл. Тя се състои от основни настройки.

yaml
# Example platform configuration entry for bidirectional communication
iec62056:
  update_interval: 60s
  baud_rate_max: 9600
  battery_meter: False
yaml
# Пример за конфигурация на платформа за еднопосочна комуникация
iec62056:
  mode_d: True

Конфигурационни променливи

  • update_interval (По избор, Time): Интервалът за четене на данни от измервателен уред. По подразбиране е 15min. never деактивира актуализациите. В този случай трябва да се използва превключвател за задействане на четенето. За да получите непрекъснати показания, използвайте малка стойност като 1s.
  • baud_rate_max (По избор, int): Ограничете максималната скорост на предаване до зададената стойност. По подразбиране е зададено на 9600, тъй като осигурява стабилна връзка. За да го деактивирате, задайте го на 0. Така можете да използвате максималната възможна скорост на предаване от 19200, ако измервателният уред го поддържа. За ESP8266 използвайте софтуерен UART, зададен на 4800 или по-ниско.
  • receive_timeout (По избор, Time): Максимално време, което компонентът изчаква за данни от измервателен уред преди да докладва грешка в предаването. По подразбиране е 3s.
  • battery_meter (По избор, boolean): Задайте на true, ако измервателният уред е захранван с батерия. Така ще се използва специална последователност за включване.
  • retry_delay (По избор, Time): В случай на неуспех в предаването, време за изчакване преди повторен опит за предаване. По подразбиране е 15s.
  • retry_counter_max (По избор, int): В случай на неуспех в предаването, максимален брой повторни опити. По подразбиране е 2.
  • uart_id (По избор, ID: Ръчно задайте ID на UART компонент, ако искате да използвате множество UART шини.
  • mode_d (По избор, boolean): Задайте на True, ако измервателният уред изпраща данни на всеки няколко секунди. Това принуждава компонента да работи в режим D. В този режим данни никога не се предават към измервателния уред. Ако е зададено, всички други настройки, освен receive_timeout, се игнорират. Не забравяйте да зададете скоростта на предаване на UART, която измервателният уред използва. Ако не сте сигурни, опитайте 2400 7E1 или 9600 7E1.

WARNING

Батерийно захранваните измервателни уреди обикновено ограничават броя на измерванията, за да пестят енергия, например до 4 измервания на ден. Ако измервателният уред не налага ограничение, честите измервания могат значително да намалят живота на батерията.

Сензор

Сензорът отчита първата стойност в скобите от записа. За следните данни

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

стойността на сензора е 6000.385. За да получите втората стойност (дата/час в този пример), използвайте Текстов сензор.

Сензорът поддържа само десетични стойности. Ако записът съдържа данни в друг формат, трябва да използвате Текстов сензор и по желание ламбда, за да го преобразувате в число.

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

Конфигурационни променливи

  • obis (Задължително): OBIS код.
  • Всички други опции от Сензор.

Текстов сензор

Текстовият сензор предоставя данните като текст. За разлика от Сензора, можете да изберете коя част от данните да се отчете и дори да изпратите целия запис обратно към 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

Конфигурационни променливи

  • obis (Задължително): OBIS код. Можете да дефинирате няколко текстови сензора със същия OBIS, но различна група.
  • group (По избор, int): Група стойности, 0, 1 или 2. По подразбиране е 1. Ако е зададено на 0, се отчита целият запис, включително OBIS кода. 1 отчита първата стойност, 2 втората.
  • Всички други опции са от Текстов сензор.

Преобразуване на данни

Ако измервателният уред отчита данни като недесетична стойност, можете да ги преобразувате автоматично, използвайки шаблонен сензор и ламбда. Да предположим, че измервателният уред изпраща запис като следния с хекс-кодирани данни:

text
0-0:96.8.0*255(ABCDEF00)

Първо, създайте шаблонен сензор, който ще публикува данните като десетична стойност.

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

Сега създайте текстов сензор, който ще получава данните като низ, ще ги преобразува в десетична стойност и ще ги публикува.

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

Всеки път, когато текстовият сензор получи нова стойност, той я преобразува в десетична и я публикува, използвайки сензора с идентификатор hex_to_dec_sensor. Флагът internal предотвратява сензора да бъде видим в Home Assistant. В лога трябва да видите:

log
[I][iec62056.component:127]: Преобразуван HEX 'ABCDEF00' в 2882400000 десетична

Същите резултати могат да бъдат получени, използвайки Home Assistant ламбди. В този сценарий, текстовият сензор публикува шестнадесетична стойност и Home Assistant шаблонният сензор прави преобразуването.

Превключвател

Превключвателят предоставя възможност за задействане на прочитане при поискване. Когато състоянието се промени от OFF на ON, компонентът инициира предаване на данни от измервателния уред. Можете да използвате превключвателя в автоматизация.

Могат да се използват конфигурационни променливи от Switch.

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

Не можете да задействате прочитане в режим D.

Бинарен сензор

Задава се на ON, когато започне предаването към измервателния уред. OFF, когато предаването е завършено.

Можете да използвате всички конфигурационни променливи от 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

Отстраняване на проблеми

  • Уверете се, че сондата е правилно подравнена с оптичните елементи на измервателния уред.
  • Измервателните уреди обикновено са инсталирани в не много чисти зони. Може да се наложи да премахвате праха от оптичния интерфейс от време на време.
  • Ако срещнете грешки при предаване и BCC контролна сума, намалете скоростта на предаване, използвайки настройката baud_rate_max.
  • Ако вашето устройство обработва множество сензори, които прекарват много време в цикъла на актуализация, може да се наложи да увеличите размера на буфера на серийния порт. Особено ако забележите проблеми с предаването, когато допълнителни сензори са активирани, но не и когато са деактивирани.

Вижте също