/electricity_meter_zrd

Primary LanguageCApache License 2.0Apache-2.0

Electricity Meter Zigbee TLSR8258 (E-Byte E180-Z5812SP)

Устройство для дистанционного мониторинга многотарифных однофазных счетчиков с последующей передачей показаний в Home Assistant.

Включает в себя схему оптопорта и модуль от E-Byte E180-Z5812SP, который работает, как Zigbee-роутер

Repository electricity_meter_zrd

Версия 1 устройства хранится в отдельной ветке



  • Рассчитано на взаимодействие через оптопорт с однофазными многотарифными электросчетчиками:

  • Модуль посылает команды электросчетчику и принимает ответы от него. В настоящий момент устройство может прочитать

    • 4 тарифа (в kWh)
    • силу тока (если доступно, в A)
    • напряжение сети (если доступно, в V)
    • мощность (если доступно, в kW)
    • оставшийся ресурс батарии прибора (если доступно, в %)
    • полный серийный номер прибора (например 3171112520109)
    • дату изготовления прибора (если доступно, например 04.10.2017)
  • Сохраняет в энергонезависимой памяти модуля только конфигурационные данные.

  • Передает показания по сети Zigbee.

  • Взаимодейстивие с "умными домами" через zigbee2mqtt.

  • Первоначальная настройка происходит через web-интерфейс zigbee2mqtt.

  • Сбросить устройство до заводских значений (zigbee) - нажать кнопку 5 раз.

  • Сделать restart модуля - зажать кнопку более чем на 5 секунд.

  • Однократное короткое нажатие на кнопку - принудительный репорт всех значений.


В проекте используется модуль от компании E-BYTE на чипе TLSR8258F512ET32 - E180-Z5812SP.

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

Схема

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

Плата

На гребенку выведены следующие пины модуля

  • SWS, GND - для заливки в модуль прошивки
  • RST, TX-DBG - на всякий случай, вдруг кому-то пригодится.

Ссылки на проект в easyeda

Корпус

Корпус напечатан на 3D принтере.

STL файл основания

STL крышки

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


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

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

В открывшемся окне по очереди выбираем

  1. Browse - находим директорию, куда скачали и развернули проект.
  2. Ставим галочку в Projects: на появившемся проекте.
  3. Ставим галочку на Copy projects into workspace
  4. Жмем 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 "скрытых" из интерфеса пользователя.

Явные отчеты

  • Температура (1)
  • Четыре тарифа (4)
  • Остаточный процент жизни батарейки электросчетчика (1)
  • Серийный номер электросчетчика (1)
  • Дата изготовления электросчетчика (1)
  • Наименование электросчетчика (1)
  • Напряжение сети (1)
  • Сила тока (1)
  • Мощность (1)

Настроить периоды отправки отчетов, если не устроят по умолчанию, можно в интерфейсе zigbee2mqtt во вкладке reporting(подробней о настройках чуть ниже).

Скрытые отчеты

  • Множитель и делитель тарифов (2)
  • Множитель и делитель для напряжения сети (2)
  • Множитель и делитель силы тока (2)
  • Множитель и делитель для мощности (2)

Настроить периоды отправки "скрытых" отчетов нельзя. Они отпраляются принудительно перед одноименным значением. Например, изменилось напряжение сети. Перед отправкой отчета со значением напражения сети принудительно высылаются два отчета - множитель и делитель напряжения сети. И т.д. Связано с тем, что правильное значение высчитывается в конверторе и множитель и делитель должны быть уже определены до получения значения. В обычном варианте иногда отчеты по множителю или делителю приходили позже значения. В данной схеме с принудительными отчетами множитель и делитель всегда приходят раньше значения.

Светодиодная индикация режимов модуля

Красный светодиод сигнализирует о присутствии питания на модуле. Ну и косвенно говорит нам, что программа запустилась и работает. Зеленый светодиод служит для информирования о режимах работы модуля.

  • Одна вспышка - модуль в сети, считывание данных с электросчетчика успешно.
  • Две вспышки - модуль в сети, считывание данных с электросчетчика не происходит.
  • Три вспышки - модуль не в сети, считывание данных с электросчетчика успешно.
  • Четыре вспышки - модуль не в сети, считывание данных с электросчетчика не происходит.

Память модуля, прошивка (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.


Счетчик общается по протоколу МИРТЕК.

В настоящий момент устройство может прочитать из счетчика:

  • 4 тарифа (в kWh)
  • силу тока (в A)
  • напряжение сети (в V)
  • мощность (в kW)
  • оставшийся ресурс батарии прибора (в %)
  • полный серийный номер прибора (например 3171112520109)
  • дату изготовления прибора (например 04.10.2017)

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


Счетчик общается по своему протоколу.

В настоящий момент устройство может прочитать из счетчика:

  • 4 тарифа (в kWh)
  • силу тока (в A)
  • напряжение сети (в V)
  • мощность (в kW)
  • оставшийся ресурс батарии прибора (косвенно вычисляется, команды такой нет, в %)
  • полный серийный номер прибора (например 3171112520109)
  • дату изготовления прибора (например 04.10.2017)

Для корректного соединения со счетчиком в разделе exposes в web-интерфейсе zigbee2mqtt нужно ввести 5 последних цифр серийного номера прибора. Например для счетчика, который изображен на фото, это 32580. Также прибор этот номер показывает на дисплее, как AD-32580.

У этого счетчика нет команды запроса ресурса батареи. Поэтому оставшийся ресурс вычисляется из других параметров. Принято считать (во всяком случае разработчики этого счетчика так считают), что ресурс батареи порядка 10 лет. Следовательно, мы просто вычисляем оставшийся ресурс в месяцах между текущей датой прибора, датой производства и 120-тью месяцами (т.е. 10-тью годами). Ну а из этого потом легко получить проценты.


Счетчик общается по протоколу.

В настоящий момент устройство может прочитать из счетчика:

  • 4 тарифа (в kWh)
  • силу тока (в A)
  • напряжение сети (в V)
  • мощность (в kW)
  • оставшийся ресурс батарии прибора (косвенно вычисляется, команды такой нет, в %)
  • полный серийный номер прибора (например 35900555)
  • дату изготовления прибора (например 10.12.2018)

Для корректного соединения со счетчиком в разделе exposes в web-интерфейсе zigbee2mqtt нужно ввести серийный номера прибора. Например для счетчика, который изображен на фото, это 36896545.

У этого счетчика нет команды запроса ресурса батареи. Поэтому оставшийся ресурс вычисляется из других параметров. Будем считать, что ресурс батареи порядка 10 лет или 120 месяцев. Также есть команда наработки счетчика в часах, отдельно от сети (при наличие входного напряжения 220 вольт) и отдельно от батареи (при отсутствии входного напряжения). Плюсуем эти значения и получаем наработку прибора в часах. А потом мы просто вычисляем оставшийся ресурс в месяцах между 120-тью месяцами (т.е. 10-тью годами) и наработкой. Ну а из этого потом легко получить проценты.

В процессе написания кода для этого счетчика выяснилось, что на первую (любую) команду между опросами, счетчик или не отвечает, или присылает какой-то мусор. А вот на последующие команды отвечает нормально. Поэтому сперва кидаем ему любую команду, делаем небольшую паузу (например 500 мсек) и только потом начинаем опрашивать счетчик.


Протокол обмена на этот счетчик размещен на сайте Энергомеры, в руководстве по эксплуатации

В настоящий момент устройство может прочитать из счетчика:

  • 4 тарифа (в kWh)
  • силу тока (в A)
  • напряжение сети (в V)
  • мощность (в kW)
  • замена батареи (до этого события ресурс будет показан, как 100%).
  • полный серийный номер прибора (например 3171112520109)
  • дата изготовления прибора у этого счетчика не предусмотрена.

Для этого счетчика серийный номер в web-интерфейсе zigbee2mqtt вводить не нужно.


Протокол обмена описан в ГОСТ Р МЭК 61107-2001. В ГОСТе нужно читать только то, что касается режима С. Практически все тоже самое, что в протоколе обмена счетчика Энергомера-СЕ102М, за небольшим исключением. Вычисление контрольной суммы отличается от рекомендуемого стандартом и осуществляется как "исключающее ИЛИ". Скорость для начала обмена данными через оптопорт - 300b. После первой команды запроса на соединение, счетчик переходит на скорость 9600b.

В настоящий момент устройство может прочитать из счетчика:

  • 4 тарифа (в kWh)
  • мощность (в kW)
  • оставшийся ресурс батарии прибора (вычисляется по напряжению батарейки, команды такой нет, в %)
  • полный серийный номер прибора (например 3171112520109)
  • сила тока (не поддерживается)
  • напряжение сети (не поддерживается)
  • дата изготовления прибора у этого счетчика не предусмотрена.

Для этого счетчика серийный номер в web-интерфейсе zigbee2mqtt вводить не нужно.


Счетчик общается по протоколу СПОДЭС.

В настоящий момент устройство может прочитать из счетчика:

  • 4 тарифа (в kWh)
  • силу тока (в A)
  • напряжение сети (в V)
  • мощность (в kW)
  • оставшийся ресурс батарии прибора (косвенно вычисляется, команды такой нет, в %)
  • полный серийный номер прибора (например 21021839)
  • дату изготовления прибора (например 21.10.2021)

У этого счетчика нет команды запроса ресурса батареи. Поэтому оставшийся ресурс вычисляется между текущей датой прибора, датой производства.


Если счетчик выбран и устройство примагничено к окошку оптопорта счетчика, то в exposes web-интерфейса zigbee2mqtt получим примерно такую картинку.

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

  • Выбран не тот счетчик.
  • Не введен адрес счетчика, где он требуется.
  • Не совмещены светодиод и фототранзистор на устройстве и счетчике. Рекомендуется немного подвигать устройство.
  • Правильное позиционирование Electricity Meter на счетчике - USB разъемом вниз


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