ivan-cc / neva-meter-opticalport-reader-arduino

Receiving data from "Neva" (Taipit) electricity meters through the optical port, using Arduino. For a smart home.
1 stars 0 forks source link

neva-meter-opticalport-reader-arduino

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.


Считывание показаний из счетчиков электроэнергии серии "Нева" (производства компании "Тайпит") через оптический порт (IrDA) с помощью Ардуино.

Умные дома на связи со счетчиком

Что умеет:

  1. Работа с однофазными или трехфазными счётчиками.
  2. Считывание основных параметров электросети (напряжение, ток, мощность, коэфициент мощности, частота, сдвиги по фазам (для 3-х фазных счетчиков) и пр.).
  3. Считывание показаний потребления (общие и по тарифным зонам - день, ночь и пр.), т.е. самые главные цифры - расход электричества.
  4. Считывание данных о самом счетчике (дата, время и пр.).
  5. Периодичность считывания можно регулировать.
  6. Считанные данные, после перекодировки, отправляются на стандартный UART-порт Арудино, для последующей обработки со стороны систем умного дома.
  7. Возможность отправить в UART-порт команду, которую Ардуино отправит в счетчик, получит ответ и перешлет его обратно в UART.
  8. Переподключение к счетчику при потере сигнала.
  9. Возможность использования полного запроса (вида: <SOH>R1<STX>000905FF()<ETX>o, который можно взять из лога официальной программы Тайпита), так и краткого (вида: 000905). При использовании краткого запроса, он будет дополнен недостающими данными и дополнен контрольной суммой (XOR).
  10. Все принятые от счетчика данные очищаются от непечатных символов.

Схема

Схема очень проста. К выводам виртуального UART подключен светодиод и фототранзистор. Я использовал сборку TCRT5000, но можно использовать и другие подходящие IR-светодиод и фототранзистор/фотодиод. Скорее всего, придется подкорректировать резитсоры R1 и R2.

Светодиод подключен катодом на TX, т.к. счетчик ждет инвертированный сигнал. Анод подключен на порт Ардуино, на котором стандартными таймерами генерируется 38khz (в моем случае, на китайской Arduino Pro Mini это был вывод 9).

Фототранзистор подключен стандартным образом. Если из счетчика будет приходить много мусора, то можно попробовать порегулировать сопротивление резистора R1.

Схема: Схема

..для тех кому легче картинкой:

Ардуино

Оптическая считывающая головка

Сама считывающая головка сделана на макетной плате, которой придана полукруглая форма под посадочные места на счетчике. К плате приклеены половинки круглого магнита, для лучшего центрирования и удержания на самом счетчике. reader_1 reader_2 reader_3

Получение данных

В стандартный 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.

По умолчанию данные будут считываться:

Эти и все другие настройки можно посмотреть в коде.

Скетч написан под ардуино 16мГц, если частота вашего чипа другая, то нужно будет пересчитать таймер.

Скетч тестировался на Arduino Pro Mini со счетчиком Нева MT324 1.0 AR E4S (трехфазный) и Нева МТ 124 AR2S (однофазный).

Дополнительные данные

В папке taipit расположены программы и документы, которые могут помочь в поиске кода запроса для вашего счетчика.

Бонус

Т.к. Ардуино нам генерирует нужные 38кгц, мы можем очень легко подключиться стандартной программой к счетчику, подключив RX и TX порты переходника вместо виртуальных RX и TX портов переходника. Вот так: connect_meters_to_pc


Удачного учёта!