Включает в себя схему оптопорта и модуль от Tuya ZTU, который работает, как Zigbee-роутер
Repository electricity_meter_zrd
Версия 1 устройства хранится в отдельной ветке и больше не поддерживается. Версия на модуле E180-Z5812SP хранится в отдельной ветке и больше тоже не поддерживается.
Рассчитано на взаимодействие через оптопорт с однофазными многотарифными электросчетчиками:
Electricitymeter посылает команды электросчетчику и принимает ответы от него. В настоящий момент устройство может прочитать
Zigbee - удерживать кнопку более 5 секунд.В проекте используется модуль от компании Tuya на чипе TLSR8258F1KAT32 - ZTU.

Испытывалось все на вот таком dongle от Telink


Схема
Electricity Meter состоит из двух частей. Основной, на которой расположены оптопорт, usb разъем и питание. И модуль zigbee с датчиком температуры. Так сделано для универсальности. К оптопорту можно подключить практически что угодно (модуль на другом чипе, UART-USB преобразователь и т.д.).
Схема zigbee на модуле ZTU.
Плата
Плата основной части (низ).
Плата zigbee части на модуле ZTU (верх).
Плата zigbee части на модуле ZTU (низ).
На гребенку выведены следующие пины модуля
Ссылки на проект в easyeda
Корпус
Корпус напечатан на 3D принтере.


Готовое устройство


Скачиваем проект
Если скачали архивом, разворачиваем в какой-нибудь временной директории. Далее запускаем Eclipse. В левом верхнем углу нажимаем File, в развернувшемся меню выбираем Import

Далее выбираем Existing Project into Workspace и жмем Next.

В открывшемся окне по очереди выбираем
Browse - находим директорию, куда скачали и развернули проект.Projects: на появившемся проекте.Copy projects into workspaceFinish
Все, проект у нас в Эклипсе.
Далее нужен компилятор и кое-какие утилиты. Компилятор можно скачать у Telink’a. Установщик поставит IDE (правленый Эклипс) и компилятор с утилитами. Но мне такой винегрет не нравится, поэтому я пользуюсь обычным Эклипсом и makefile. Так же компилятор есть у Ai-Thinker. Там есть под Windows и под Linux. Так же советую скачать git bash for windows. Это позволит писать makefiles, которые будут прекрасно работать и под Windows и под Linux практически без редактирования. Еще понадобится Python, но я думаю, это не проблема. Не забудьте отредактировать в makefile и bootloader.makefile пути к компилятору, если он у вас лежит в другом месте.

Итак, компиляцию начинаем с bootloader. Собираем и прошиваем (как и чем шить чуть ниже). Если модуль пустой, то после прошивки bootloader'a модуль просто начнет моргать светодиодом. Это нормально.

Далее компилируем уже саму прошивку и прошиваем.

Если все прошло без ошибок, то модуль запустится и начнет работу.
И последнее - проект сделан таким образом, что его можно вообще собрать без IDE, обычнам make в командной строке.

Вопрос - как залить прошивку в модуль. Есть несколько вариантов. Самый простой, это приобрести у Telink их фирменный программатор.

Но он неоправдано дорого стоит. Есть другой, более бюджетный вариант. Заказываем модуль TB-04 или TB-03 от Ai-Thinker. Почему-то у самого производителя TB-04 не числится. Но на aliexpress их полно. В них применен TLSR8253. Паяем перемычку согласно фото.

И заливаем прошивку вот отсюда
Все, у нас есть недорогой программатор, который может загружать прошивки через SWS в модули от Telink’a. Пин D4 (SWM) программатора нужно соединить с пином SWS программируемого модуля, не забыть объединить земли и подкинуть питание на оба модуля.
Сама программа-прошивальщик лежит тут
Устройство является роутером, питается от сети ~200 вольт и никогда не спит.
По умолчанию считывание показаний с электросчетчика происходит один раз в минуту. Изменить в большую сторону можно через интерфейс zigbee2mqtt во вкладке Exposes (подробней о настройках чуть ниже).
Reporting
Устройство высылает 13 отчетов.
Настроить периоды отправки отчетов, если не устроят по умолчанию, можно в интерфейсе zigbee2mqtt во вкладке reporting(подробней о настройках чуть ниже).
Светодиодная индикация режимов модуля
Красный светодиод сигнализирует о присутствии питания на модуле. Ну и косвенно говорит нам, что программа запустилась и работает. Зеленый светодиод служит для информирования о режимах работы модуля.
Память модуля, прошивка (firmware) и где хранится конфиг
В версии 3 ОТА реализована, так как модуль ZTU имеет на борту чип TLST8258F1 с 1мБ флеш-памяти.
Согласно спецификации на чип TLSR8258F1KAT32 при использовании bootloader'a память распределена следующим образом
0x00000 Bootloader
0x08000 Firmware
0x77000 OTA Image
0xE6000 NV
0xFC000 U_Cfg_Info
0xFE000 F_Cfg_Info
0xFF000 MAC address
0x100000 End Flash
bootloader ничего не умеет, кроме, как запускать прошивку с адреса 0x8000 и копировать прошивку из области загрузки в область старта при обновлении через ОТА (при обновлении рекомендуется выбрать счетчик No Device).
В конфиге сохраняютстя только настройки модуля. Конфиг записывается в NV (0xE6000) в модуле ZTU. Используется модуль NV_MODULE_APP с номером NV_ITEM_APP_USER_CFG (для понимания смотрите app_cfg.h и tl_zigbee_sdk/proj/drivers/drv_nv.h)
В электросчетчиках используются разные протоколы обмена. Дополнительную информацию смотрите в разделе по конкретному электросчетчику.
Первоначальная настройка происходит через web-интерфейс zigbee2mqtt. Для начала нужно убедиться, что устройство в сети.

Если во вкладке devices его нет, нужно разрешить сопряжение в zigbee2mqtt и если устройство не начало подключаться в течении минуты, зажать кнопку на устройстве на более чем 5 секунд (зеленый светодиод должен начать моргать с частотой примерно раз в секунду). Итак убедились, что устройство в сети, можно переходить к настройкам. Переходим к вкладке exposes устройства.

Видим, что в ячейке Device model preset выставлен счетчик No Device, т.е. никакой счетчик не выбран, считывание данных не происходит. Выбираем нужный счетчик из предложенных. По умолчанию период опроса счетчика - 1 минута. Если нужно больше (максимальное значение 255 минут), меняем настройку Device measurement preset.

Счетчик общается по протоколу МИРТЕК.
В настоящий момент устройство может прочитать из счетчика:
Для корректного соединения со счетчиком в разделе exposes в web-интерфейсе zigbee2mqtt нужно ввести 5 последних цифр серийного номера прибора. Например для счетчика, который изображен на фото, это 07943. Так, как первая цифра 0, то вводить нужно 7943. Также прибор этот номер показывает на дисплее, как AD-07943.

Счетчик общается по своему протоколу.
В настоящий момент устройство может прочитать из счетчика:
Для корректного соединения со счетчиком в разделе exposes в web-интерфейсе zigbee2mqtt нужно ввести 5 последних цифр серийного номера прибора. Например для счетчика, который изображен на фото, это 32580. Также прибор этот номер показывает на дисплее, как AD-32580.
У этого счетчика нет команды запроса ресурса батареи. Поэтому оставшийся ресурс вычисляется из других параметров. Принято считать (во всяком случае разработчики этого счетчика так считают), что ресурс батареи порядка 10 лет. Следовательно, мы просто вычисляем оставшийся ресурс в месяцах между текущей датой прибора, датой производства и 120-тью месяцами (т.е. 10-тью годами). Ну а из этого потом легко получить проценты.

Счетчик общается по протоколу.
В настоящий момент устройство может прочитать из счетчика:
Для корректного соединения со счетчиком в разделе exposes в web-интерфейсе zigbee2mqtt нужно ввести серийный номера прибора. Например для счетчика, который изображен на фото, это 36896545.
У этого счетчика нет команды запроса ресурса батареи. Поэтому оставшийся ресурс вычисляется из других параметров. Будем считать, что ресурс батареи порядка 10 лет или 120 месяцев. Также есть команда наработки счетчика в часах, отдельно от сети (при наличие входного напряжения 220 вольт) и отдельно от батареи (при отсутствии входного напряжения). Плюсуем эти значения и получаем наработку прибора в часах. А потом мы просто вычисляем оставшийся ресурс в месяцах между 120-тью месяцами (т.е. 10-тью годами) и наработкой. Ну а из этого потом легко получить проценты.
В процессе написания кода для этого счетчика выяснилось, что на первую (любую) команду между опросами, счетчик или не отвечает, или присылает какой-то мусор. А вот на последующие команды отвечает нормально. Поэтому сперва кидаем ему любую команду, делаем небольшую паузу (например 500 мсек) и только потом начинаем опрашивать счетчик.

Протокол обмена на этот счетчик размещен на сайте Энергомеры, в руководстве по эксплуатации
В настоящий момент устройство может прочитать из счетчика:
Для этого счетчика серийный номер в web-интерфейсе zigbee2mqtt вводить не нужно.

Протокол обмена на этот счетчик размещен на сайте Энергомеры, в руководстве по эксплуатации
В настоящий момент устройство может прочитать из счетчика:
Для этого счетчика серийный номер в web-интерфейсе zigbee2mqtt вводить не нужно.
В настоящее время устройство поддерживает два счетчика.
НЕВА МТ 124 AS O 5(60) А

Протокол обмена описан в ГОСТ Р МЭК 61107-2001. В ГОСТе нужно читать только то, что касается режима С. Практически все тоже самое, что в протоколе обмена счетчика Энергомера-СЕ102М, за небольшим исключением. Вычисление контрольной суммы отличается от рекомендуемого стандартом и осуществляется как “исключающее ИЛИ”. Скорость для начала обмена данными через оптопорт - 300b. После первой команды запроса на соединение, счетчик переходит на скорость 9600b.
В настоящий момент устройство может прочитать из счетчика:
НЕВА МТ 124 AS E4P 5(60) А

В настоящий момент устройство может прочитать из счетчика:
Для этих счетчиков серийный номер в web-интерфейсе zigbee2mqtt вводить не нужно.

Счетчик общается по протоколу СПОДЭС.
В настоящий момент устройство может прочитать из счетчика:
У этого счетчика нет команды запроса ресурса батареи. Поэтому оставшийся ресурс вычисляется между текущей датой прибора, датой производства.
Если счетчик выбран и устройство примагничено к окошку оптопорта счетчика, то в exposes web-интерфейса zigbee2mqtt получим примерно такую картинку.

Если данные не считываются, есть несколько причин.

В результате вы получите примерно вот такую картинку.

Tamper - несанкционированное отсоединение устройства от счетчика.ZCL_ATTRID_LINE_CURRENT на ZCL_ATTRID_RMS_CURRENT и ZCL_ATTRID_APPARENT_POWER на ZCL_ATTRID_ACTIVE_POWER.zigbee2mqtt.E180-Z5812SP в пользу модуля ZTU.