Receiving data from "Neva" (Taipit) electricity meters through the optical port (ir), using Arduino. This method can be used in ESP32, ESP8266 and other microcontrollers. The obtained data will be useful for use in Home Assistant, ioBrkoer, Majordomo, openHab, and others.
<SOH>R1<STX>000905FF()<ETX>o
, который можно взять из лога официальной программы Тайпита), так и краткого (вида: 000905
). При использовании краткого запроса, он будет дополнен недостающими данными и дополнен контрольной суммой (XOR).Схема очень проста. К выводам виртуального UART подключен светодиод и фототранзистор. Я использовал сборку TCRT5000, но можно использовать и другие подходящие IR-светодиод и фототранзистор/фотодиод. Скорее всего, придется подкорректировать резитсоры R1 и R2.
Светодиод подключен катодом на TX, т.к. счетчик ждет инвертированный сигнал. Анод подключен на порт Ардуино, на котором стандартными таймерами генерируется 38khz (в моем случае, на китайской Arduino Pro Mini это был вывод 9).
Фототранзистор подключен стандартным образом. Если из счетчика будет приходить много мусора, то можно попробовать порегулировать сопротивление резистора R1.
Схема:
..для тех кому легче картинкой:
Сама считывающая головка сделана на макетной плате, которой придана полукруглая форма под посадочные места на счетчике. К плате приклеены половинки круглого магнита, для лучшего центрирования и удержания на самом счетчике.
В стандартный UART выдаются диагностические данные и, с указанной периодичностью, передаются данные запрошенные в счетчике. Все данные из счетчика разделены "трубой" |
.
Данные выглядят так:
Init meter
Noanswer
Noanswer
Connect to meter: /TPC5NEVAMT124.4104
Freq:0E0701FF(000050.00)|Voltage:0C0700FF(000211.33)|Current:0B0700FF(000000.00)|APower:100700FF(00000000)|PowerFactor:0D07FFFF(20.00)...|...|...|...
Передающиеся данные из счетчика строятся по такому шаблону: Название_параметра:ОТВЕТсчетчика()|
. В примере выше Freq:0E0701FF(000050.00)|
, Freq
- частота, в ответе счетчика 000050.50
- значение 50.00Гц.
Можно отправить в UART-порт запрос, который будет переслан в счетчик. Например, на запрос 000902
(дата) ответ будет форматирован следующем образом: RQST:[000902]ANSWR:{000902FF(220105)}
, т.е. [RQST:текст_запроса
]ANSWR:{текст_ответа
}.
Короткий запрос послать просто, а вот с полным запросом всё сложнее. В полном запросе есть специальные непечатные символы. Для запросов из Linux-систем я пользуюсь таким подходом:
#!/bin/sh
STRING="01 52 31 02 30 30 30 39 30 32 46 46 28 29 03 68"
for c in $STRING; do printf "\x$c" > /dev/ttyUSB0; done;
printf "\n" > /dev/ttyUSB0
Тот же запрос даты, но целиком 16 байт (01 52 31 02 30 30 30 39 30 32 46 46 28 29 03 68
, в тексте это выглядит примерно так .R1.000902FF().h
или точнее <SOH>R1<STX>000902FF()<ETX>h
).
Т.е. запрос, в виде hex-кодов (как он указан в логе программы управления счетчиком), с помощью команды printf
отправляется побайтово в порт usb-serial переходника /dev/ttyyUSB0
По умолчанию, код будет работать с однофазным счётчиком (например Нева МТ112, МТ113, МТ114, МТ115, МТ124). Для работы с трехфазными счетчиками (Нева МТ324, МТ314, МТ315, МТ313), необходимо раскомментировать THREE_PHASE_METER
.
По умолчанию данные будут считываться:
NEXT_ELECTRICITY_DATA_REQUEST_IN
)NEXT_METER_VALUES_REQUEST_IN
)NEXT_METER_REQUEST_IN
)Эти и все другие настройки можно посмотреть в коде.
Скетч написан под ардуино 16мГц, если частота вашего чипа другая, то нужно будет пересчитать таймер.
Скетч тестировался на Arduino Pro Mini со счетчиком Нева MT324 1.0 AR E4S (трехфазный) и Нева МТ 124 AR2S (однофазный).
В папке taipit расположены программы и документы, которые могут помочь в поиске кода запроса для вашего счетчика.
Т.к. Ардуино нам генерирует нужные 38кгц, мы можем очень легко подключиться стандартной программой к счетчику, подключив RX и TX порты переходника вместо виртуальных RX и TX портов переходника. Вот так:
Удачного учёта!