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 кодове за електромери, можете да посетите:
- https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm
- https://onemeter.com/docs/device/obis/#index
Хардуер
За да комуникирате с електромера, трябва да прикрепите оптичен интерфейс към серийния порт. Интерфейсът се състои от инфрачервен 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
. - Ако вашето устройство обработва множество сензори, които прекарват много време в цикъла на актуализация, може да се наложи да увеличите размера на буфера на серийния порт. Особено ако забележите проблеми с предаването, когато допълнителни сензори са активирани, но не и когато са деактивирани.