Включает в себя схему оптопорта и модуль от E-Byte E180-Z5812SP, который работает, как Zigbee-роутер
Repository electricity_meter_zrd
Версия 1 устройства хранится в отдельной ветке
Рассчитано на взаимодействие через оптопорт с однофазными многотарифными электросчетчиками:
Модуль посылает команды электросчетчику и принимает ответы от него. В настоящий момент устройство может прочитать
В проекте используется модуль от компании E-BYTE на чипе TLSR8258F512ET32 - E180-Z5812SP.
Испытывалось все на вот таком dongle от Telink
Схема
Electricity Meter состоит из двух частей. Основной, на которой расположены оптопорт, usb разъем и питание. И модуль zigbee с датчиком температуры. Так сделано для универсальности. К оптопорту можно подключить практически что угодно (модуль на другом чипе, UART-USB преобразователь и т.д.).
Плата
На гребенку выведены следующие пины модуля
Ссылки на проект в easyeda
Корпус
Корпус напечатан на 3D принтере.
Готовое устройство
Скачиваем проект
Если скачали архивом, разворачиваем в какой-нибудь временной директории. Далее запускаем Eclipse. В левом верхнем углу нажимаем File, в развернувшемся меню выбираем Import
Далее выбираем Existing Project into Workspace
и жмем Next
.
В открывшемся окне по очереди выбираем
Browse
- находим директорию, куда скачали и развернули проект.Projects:
на появившемся проекте.Copy projects into workspace
Finish
Все, проект у нас в Эклипсе.
Далее нужен компилятор и кое-какие утилиты. Компилятор можно скачать у 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
Устройство высылает 12 “явных” отчетов. И 8 “скрытых” из интерфеса пользователя.
Явные отчеты
Настроить периоды отправки отчетов, если не устроят по умолчанию, можно в интерфейсе zigbee2mqtt во вкладке reporting(подробней о настройках чуть ниже).
Скрытые отчеты
Настроить периоды отправки “скрытых” отчетов нельзя. Они отпраляются принудительно перед одноименным значением. Например, изменилось напряжение сети. Перед отправкой отчета со значением напражения сети принудительно высылаются два отчета - множитель и делитель напряжения сети. И т.д. Связано с тем, что правильное значение высчитывается в конверторе и множитель и делитель должны быть уже определены до получения значения. В обычном варианте иногда отчеты по множителю или делителю приходили позже значения. В данной схеме с принудительными отчетами множитель и делитель всегда приходят раньше значения.
Светодиодная индикация режимов модуля
Красный светодиод сигнализирует о присутствии питания на модуле. Ну и косвенно говорит нам, что программа запустилась и работает. Зеленый светодиод служит для информирования о режимах работы модуля.
Память модуля, прошивка (firmware) и где хранится конфиг
В данном проекте обновление OTA не используется. Связано это с тем, что при конфигурации с OTA на TLSR8258F512 отведено под прошивку только 0x34000 байт. И даже, если применить модуль TLST8258F1 с 1мБ - это все равно не сильно исправляет ситуацию, в нем отведено место под прошивку 0x40000. К чему все это. Размер прошивки с 6 счетчиками подошел к своему пределу, что-то около 200000 байт. Если предположить, что счетчики будут добавляться, то мы в самом ближайшем будущем столкнемся с тем, что прошивка превысит размер выделенного под нее пространстсва. Раздельная компиляция для конкретного счетчика мне не понравилась, там вылезли свои глюки. Потому было принято решение остановиться на схеме с использованием bootloader'a
. При таком решении и отключенном обновлением OTA, размер прошивки может достигать более 400 кБ, что достаточно много. Карту памяти можно посмотреть тут - tl_zigbee_sdk/proj/drivers/drv_nv.h.
Согласно спецификации на чип TLSR8258F512ET32 при использовании bootloader'a
память распределена следующим образом
0x00000 Bootloader
0x08000 Firmware
0x39000 OTA Image
0x6A000 NV_1
0x76000 MAC address
0x77000 C_Cfg_Info
0x78000 U_Cfg_Info
0x7A000 NV_2
0x80000 End Flash
Так, как обновление OTA не используется, то прошивка может занимать оба пространства Firmware
и OTA Image
, что в сумме составляет 0x62000 (401408) байт.
bootloader
ничего не умеет, кроме, как запускать прошивку с адреса 0x8000.
В конфиге сохраняютстя только настройки модуля. Конфиг записывается в NV_2 (куда-то в область с 0x7a000 по 0x7c000). Используется модуль NV_MODULE_APP с номером NV_ITEM_APP_USER_CFG (для понимания смотрите app_cfg.h и tl_zigbee_sdk/proj/drivers/drv_nv.h)
В электросчетчиках используются разные протоколы обмена. Дополнительную информацию смотрите в разделе по конкретному электросчетчику.
Открываем на редактирование файл configuration.yaml
от zigbee2mqtt. И добавляем в конец файла
external_converters:
- electricity_meter.js
Файл electricity_meter.js
копируем из папки проекта туда же, где лежит configuration.yaml
от zigbee2mqtt. Не забываем разрешить подключение новых устройств - permit_join: true
. Перегружаем zigbee2mqtt. Проверяем его лог, что он запустился и нормально работает.
Первоначальная настройка происходит через web-интерфейс zigbee2mqtt. Для начала нужно убедиться, что устройство в сети.
Если во вкладке devices
его нет, нужно нажать кнопку на устройстве 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
вводить не нужно.
Протокол обмена описан в ГОСТ Р МЭК 61107-2001
. В ГОСТе нужно читать только то, что касается режима С. Практически все тоже самое, что в протоколе обмена счетчика Энергомера-СЕ102М
, за небольшим исключением. Вычисление контрольной суммы отличается от рекомендуемого стандартом и осуществляется как “исключающее ИЛИ”. Скорость для начала обмена данными через оптопорт - 300b. После первой команды запроса на соединение, счетчик переходит на скорость 9600b.
В настоящий момент устройство может прочитать из счетчика:
Для этого счетчика серийный номер в web-интерфейсе zigbee2mqtt
вводить не нужно.
Счетчик общается по протоколу СПОДЭС.
В настоящий момент устройство может прочитать из счетчика:
У этого счетчика нет команды запроса ресурса батареи. Поэтому оставшийся ресурс вычисляется между текущей датой прибора, датой производства.
Если счетчик выбран и устройство примагничено к окошку оптопорта счетчика, то в exposes
web-интерфейса zigbee2mqtt
получим примерно такую картинку.
Если данные не считываются, есть несколько причин.
В результате вы получите примерно вот такую картинку.