Считывание показаний счётчика Энергомера CE307 R33.145.0A.N.
Программа подключается к локальному MQTT брокеру и публикует сообщения для AutoDiscovery. И устройство с сущностями автоматически появляются в Home Assistant под именем "Электросчётчик Energomera CE307 011791165813462" с сенсорами с именами "Сумма T1+T2+T3", "Тариф T1", "Тариф T2", "Тариф T3". Потом считывает показания со счётчика и публикует эти данные в соответствующие MQTT топики.
Программа после считывания показаний со счётчика и публикации этих данных в MQTT завершает своё выполнение и выгружается. Поэтому в Cron надо добавить время когда надо запускать эту программу. Правильнее было бы сделать, чтобы программа постоянно работала, но я пока не умею делать так, чтобы считывание происходило в другом треде и следить за тем, что тот тред дошёл до конца и завершать тред, если до конца не дошло. Просто иногда бывает, что от счётчика приходят не те данные, которые ожидаются и программа не доходит до завершения. Поэтому каждый раз заново запуская программу получается более гарантированно, что всё отработает как надо.
Этот счётчик из полезных данных может выдавать только текущие показания киловатт*часов: суммарное, тариф1, тариф2, тариф3 (смотря сколько тарифов ночных, дневных и т.п.). Больше с него ничего не снять толкового!
Сверху на электросчётчике есть крышечка. У меня правый болтик опломбирован и он как раз нам не нужен.
Откручиваем левый болтик и за этот же край тянем и крышка открывается. И там нам доступны болтовые клемы для подключения по RS485.
Подключаем RS485 к клемам 12 (А) и 13 (В).
Подключаем питание 12В и не меньше 100мА к клемам 14 (GND) и 15 (+12В).
Внутри витой пары 4 пары скрученных проводочков. RS485 А и В должны идти по одной паре скрученных проводочков. Не добавляйте соседние проводочки на линию А и В! Иначе увеличивается площадь ловли помех и наводок. Например антенна 1кв.м. ловит 1дБ помех. А антенна 2кв.м. ловит 2дБ помех.
Переходник USB - RS485 можно купить на али за пару сотен. У меня такой:
Потом лично я вставил этот переходник в Onion Omega2, который работает на линуксе и установил туда python3-lite. Но другие скорее всего будут втыкать этот USB/RS485 в Raspberry pi, что более правильно и дешевле. Но я хотел по WiFi передавать данные, чтобы малинка не была привязана проводами.
Из минусов.
- Пакеты данных и запросов и ответов обрамлены байтом 0xC0. То есть 0xC0 стоит и вначале пакета и в конце. Если в теле пакета встречается 0xC0, то его надо заменить 0xDB, 0xDC, но я это не делал. В пакете нет обычного окончания строки EOL типа \n и т.п. Поэтому не возможно воспользоваться функцией (readline). Читаем каждый пришедший байт, накапливаем и если пришёл 0xC0 и кол-во байт 16 и первая часть пакета равно C0 48 FD 00 96 34 57 01 30 00, то считываем значения киловатт
- В ответе нет идентификации на какой запрос или на какой тариф пришёл ответ. Поэтому введены таймеры и запрашиваем по порядку потихоньку. И запрашиваем 2 раза для проверки.
- В AdminTools (когда подключаешь USB-RS485 переходник к компьютеру), не вчитываясь внимательно в руководства - выбираешь канал связи "RS232 (CE30x)", что как бы логично. А надо выбирать "RS232 (CE102)". И нужно указать в программе "Адрес устройства". Это пять последних цифр серийного номера счётчика.
Подключение надо настроить на скорость 9600 8N1.
Получив все данные я посылаю их по HTTP GET JSON в Home Assistant. И программа закрывается.
В crontab -e
я настроил расписание, чтобы программа запускалась каждый день в 23:59: 59 23 * * * /usr/bin/python3 /root/schetchik.py
В описание протокола можно не вчитываться. Можно в AdminTools посмотреть запросы и ответы и скопировать запросы.
У меня пакеты такие:
Запрос суммарного значения: C0 48 96 34 FD 00 00 00 00 00 D2 01 30 00 00 40 C0
Запрос значения по тарифу 1: C0 48 96 34 FD 00 00 00 00 00 D2 01 30 00 01 F5 C0
Запрос значения по тарифу 2: C0 48 96 34 FD 00 00 00 00 00 D2 01 30 00 02 9F C0
Запрос значения по тарифу 3: C0 48 96 34 FD 00 00 00 00 00 D2 01 30 00 03 2A C0
Но! 96 и 34 вы должны заменить на своё.
У меня серийный номер счётчика заканчивается на 13462, что в hex = 0x34 0x96. И вот эти 34 96 надо поменять местами: 96 34. И вы у себя это проделайте! И предпоследний байт (который перед C0) - нужно вычислить CRC8 с полиномом 0xB5. Это можно сделать на странице: http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
Получаем ответ: C0 48 FD 00 96 34 57 01 30 00 09 22 EC 8B 04 00 1B C0
.
Где EC 8B 04 00
- нужное нам значение. Надо переставить байты в обратной последовательности: 00 04 8B EC
и получится в dec число 297964. Это число надо разделить на 100. И получится 2979,64. Ровно столько потреблённых киловатт отображается и на дисплее электросчётчика на определённом тарифе.
Программа публикует всё в локальный MQTT брокер. Чтобы Home Assistant видел эти сообщения, надо на машине с Home Assistant чтобы был установлен и настроен MQTT брокер (например как дополнение в Home Assistant) и MQTT клиент в "Устройства и службы". И нужно настроить MQTT бридж между этим MQTT брокером и MQTT брокером, который на машине, отвечающей за считывание показаний со счётчика.
Принцип работы и настройки MQTT бриджа можно изучить по ссылке: https://www.youtube.com/watch?v=-dEGtIDfi78.
Кратко:
В Home Assistant в Дополнениях в настройках "File editor" выключаем пункт "Enforce Basepath", чтобы можно было редактировать файлы, которые находятся выше папки "config". Через "File editor" создаём файл /share/mosquitto/mosquitto.conf и добавляем туда данные:
connection bridge-01
address 192.168.1.123:1883
topic # in 0
remote_username MQTTuser
remote_password MQTTpass
В настройках MQTT брокера в Home Assistant нужно прописать active: true
.
После таких изменений надо перезагрузить дополнение MQTT в Home Assistant! Лично у меня иногда приходится ещё и перезагрузить Zigbee2mqtt дополнение, потому что Zigbee2mqtt зависит от этого MQTT дополнения. Но такое происходит не всегда. Можно просто перезагружать весь Home Assistant, только не через "Быстрая перезагрузка".
В этих данных topic # in 0
означает, что все сообщения с MQTT брокера машины на котором находится программа считывания данных со счётчика - будут публиковаться в MQTT брокер на Home Assistant. В обратную сторону не будут, потому что не добавлена строчка topic # out 0
, потому что в данном случае это не нужно.
Чтобы добавить программу в автозагрузку/автозапуск/как сервис для linux (проверял на debian):
- Поместите файл
energomera_ce307_linux
в папку/etc/init.d/
и переименуйте его вenergomera_ce307
- Надо указать, что файл может выполняться:
chmod +x /etc/init.d/energomera_ce307
- Показываем системе, что мы добавили новый сервис
update-rc.d -f energomera_ce307 defaults
- Запускаем программу выполняться в фоне:
service energomera_ce307 start
Чтобы добавить программу в автозагрузку/автозапуск/как сервис для OpenWRT (проверял на Onion Omega2p):
- Поместите файл
energomera_ce307_openwrt
в папку/etc/init.d/
и переименуйте его вenergomera_ce307
- Надо указать, что файл может выполняться:
chmod +x /etc/init.d/energomera_ce307
- Показываем системе, что мы добавили новый сервис
/etc/init.d/energomera_ce307 enable
- Запускаем программу выполняться в фоне:
/etc/init.d/energomera_ce307 start
Могу помочь с внедрением программы. Или могу разработать программу для другого счётчика. За оплату. https://wa.me/+79802616369