Блог

Интеграция счётчика "Меркурий-231" в Home Assistant через VR-007.3

Электросчетчики "Меркурий-23x", если кто-то не знал, отличаются умом и сообразительностью возможностью дистанционного считывания показаний. Насколько я понимаю, эта возможность предназначена в первую очередь не для конечных пользователей, а для специалистов предприятий энергосбыта. Но тем не менее, есть возможность считывания показаний и простыми обывателями. При этом никакие правила и законы не нарушаются - ведь мы не изменяем работу счётчика, а лишь читаем его показания.

Я не буду тут останавливаться на способах подключения к счётчику (инвазивных и неинвазивных), протоколах передачи данных и т.д., и т.п. Всю эту информацию вы можете прочитать здесь - на сайте не то самого производителя счётчиков, не то кого-то, очень близкого к нему.

Для автоматизированного учета показаний счётчика предлагается приобрести роутер VR-007.3, описание которого вы можете в подробностях прочитать здесь, а также считыватель показаний, который нужно выбрать в зависимости от ссособа подключения к счетчику - RS485, IrDA или оптопорт.

Вкратце лишь скажу, что роутер VR-007.3 представляет собой обычный китайский WiFi-роутер модели Youku YK1 с прошивкой OpenWRT и кое-какими дополнениями. Благодаря этим дополнениям, веб-интерфейс роутера содержит панель управления счетчиком.

Всё бы хорошо, но только вот эта "система контроля" получается "замкнутой на саму себя". Автор разработки предлагает нам любоваться красивой веб-страницей, но не даёт практически никакх возможностей по передаче полученных данных куда-либо "вовне". Все данные сохраняются в базе данных SQLite, расположенной в файловой системе роутера.

Тем не менее, автор всё же предлагает нам несколько не совсем удобных вариантов экспорта данных во внешний мир. Это:

  1. Ежедневная (вернее, еженощная) рассылка по e-mail кратенькой текстовой строки, содержащей текущие показания счетчика с учетом раздельной тарификации по времени суток (если такая есть).
  2. Передача показаний на "narodmon.ru" (для этого, соответственно, требуется иметь там аккаунт).
  3. Передача показаний на MQTT-брокер.

Лирическое отступление: когда я спросил автора разработки, почему он не сделал хотя бы экспорт таблицы показаний в CSV, он ответил мне, что это можно сделать на narodmon.ru. В-общем, поезд "Москва-Тверь" идет через Владивосток :-).

Рассмотрим нюансы перечисленных способов экспорта данных подробнее.

Способ 1 (email-рассылка). Раз в сутки (в 01:00) вы (или тот, кого вы укажете в качестве адресата) будет получать на электронную почту сообщение с таким текстом:

M231_xxxxxxxx___T1=61636.665___T2=43865.342___T3=0.000___T4=0.000

То есть, заводской номер счётчика и текущие показатели кВтч по четырем тарифам (в моем примере используется два тарифа - дневной и ночной - поэтому в остальных тарифах нули).

На этом все. Больше никаких данных и никакой статистики. Якобы, именно в таком формате можно передавать показания электрокомпании в той местности, где уважаемый автор имеет честь проживать (если мне память не изменяет, это Нижегородская область). Большое спасибо, конечно - но страна у нас большая, и далеко не всее электрокомпании принимают показания счётчиков имено в таком формате.

К числу "странностей" этого способа следует также отнести и то, что для каждого проданного VR-007.3 заводится свой персональный аккаунт электронной почты, который является "автором" сообщений, а для рассылки принудительно (т.е., без возможности выбора или назначения в настройках) используется SMTP-сервер, предоставленный автором.

В наше время, когда каждый первый озабочен информационной безопасностью и сохранением персональных данных, это выглядит несколько странно.

Способ 2 (narodmon.ru). Ну что тут сказать? Если кому-то хочется, чтобы показания его счётчика видели все желающие, а злоумышленники при этом еще и могли видеть географические координаты расположения счетчика, а также вычислять по величине энергопотребления периоды, когда хозяев нет дома, то пользуйтесь на здоровье - это ваше право. Если же "народный мониторинг" нужен вам лишь как промежуточное звено для возможности экспорта данных, то... не знаю.

(Тут мне подсказывают, что на "народмоне" можно ограничить видимость и сделать так, чтобы счетчик был виден только вам. Хорошо - но тогда зачем эти данные вообще публиковать на стороннем сервере? Вопрос философский, в-общем).

Способ 3 (MQTT). Собственно, на этот способ я и возлагал самые большие надежды, поскольку рассчитывал через MQTT получать показания в Home Assistant. Но первое, с чем я сразу столкнулся - это "непроходимость" данных. Не знаю, кто какой брокер использует, а я использую Mosquitto. И мой "москит" выдал мне в логах, что не смог авторизовать клиента из-за некорректного ClientID. Усердное копание в логах ошибок показало, что VR-007.3 в качестве ClientID сообщает брокеру свой MAC-адрес в формате "XX:XX:XX:XX:XX:XX" - то есть, с двоеточиями. А Mosquitto не принимает двоеточия и отвергает такой ClientID.

С этого момента я перестал рассматривать VR-007.3 как "чёрный ящик" и перешёл в активную фазу работы. Первое, что я сделал - это перестал переписываться с автором, ибо его вечные "не в этой жизни", "мы подумаем" и "может быть когда-нибудь реализуем" мне порядком надоели.

В-общем, пользуясь открытостью платформы OpenWRT, я залез в файловую систему роутера и начал копаться в файлах. Выяснил, что данные для передачи формируются в файле /www/pages/loop.php, и участок, ответственный за формирование MQTT-payload'а выглядит так (строка 1190 или около того):

$mqtt = new phpMQTT($db->mqtt_server, $db->mqtt_port, $db->MAC);

Как и говорилось выше, автор решил в качестве ClientID подставить MAC-адрес роутера, сохраненный в базе данных с настройками. А адрес этот содержит двоеточия, которых не должно быть в ClientID.

Здесь можно пойти сложным путём - например прописать функцию, убирающую двоеточия из строки. Или создать дополнительный элемент настроек для задания ClientID. Но можно поступить просто - прописать ClientID открытым текстом. Вот так:

$mqtt = new phpMQTT($db->mqtt_server, $db->mqtt_port, "MyVR007_3");

Проблему с "инвалидным" ClientID мы решили. Теперь перейдем к анализу формата данных, передаваемых роутером на MQTT-брокер. Вот, что мы имеем изначально:

$mqtt->publish("VR007/".$db->type_cn."/Time", $melbdate3,0); $mqtt->publish("VR007/".$db->type_cn."/U1", $U1_1,0); $mqtt->publish("VR007/".$db->type_cn."/U2", $U2_1,0); $mqtt->publish("VR007/".$db->type_cn."/U3", $U3_1,0); $mqtt->publish("VR007/".$db->type_cn."/I1", $I1_1,0); $mqtt->publish("VR007/".$db->type_cn."/I2", $I2_1,0); $mqtt->publish("VR007/".$db->type_cn."/I3", $I2_1,0); $mqtt->publish("VR007/".$db->type_cn."/P1", $P1_1,0); $mqtt->publish("VR007/".$db->type_cn."/P2", $P2_1,0); $mqtt->publish("VR007/".$db->type_cn."/P3", $P3_1,0); $mqtt->publish("VR007/".$db->type_cn."/PS", $PS_1,0); $mqtt->publish("VR007/".$db->type_cn."/Q1", $Q1_1,0); $mqtt->publish("VR007/".$db->type_cn."/Q2", $Q2_1,0); $mqtt->publish("VR007/".$db->type_cn."/Q3", $Q3_1,0); $mqtt->publish("VR007/".$db->type_cn."/QS", $QS_1,0); $mqtt->publish("VR007/".$db->type_cn."/S1", $S1_1,0); $mqtt->publish("VR007/".$db->type_cn."/S2", $S2_1,0); $mqtt->publish("VR007/".$db->type_cn."/S3", $S3_1,0); $mqtt->publish("VR007/".$db->type_cn."/SS", $SS_1,0); $mqtt->publish("VR007/".$db->type_cn."/E1", $E1_1,0); $mqtt->publish("VR007/".$db->type_cn."/E2", $E2_1,0); $mqtt->publish("VR007/".$db->type_cn."/E3", $E3_1,0); $mqtt->publish("VR007/".$db->type_cn."/E4", $E4_1,0);

То есть, роутер пишет в топик "/VR007/xxx" (где xxx - тип счетчика, сохранённый в базе данных настроек) 23 параметра в простом текстовом формате. Чтобы прочитать эти данные из Home Assistant'а, нам придется создать (ручками) 23 (!!!) сенсора, логически друг с другом не связанных. Но если мы изменим формат публикации на JSON, то тогда сможем получить 1 (всего!) сенсор с 23-мя атрибутами - то есть, что-то, более-менее похожее на целостный объект. Первым делом подкорректируем выдачу даты-времени (переменная $melbdate3). По умолчанию формат выдачи выглядит так: 2021-03-17 16:10:07

Я не знаю, почему, но Home Assistant'у больше по душе вот такая выдача: 2021-03-17T16:10:07

Проблема решается просто: перед блоком команд типа $mqtt->publish... вставляем строчку:

$mqtt_datetime = str_replace(" ", "T", $melbdate3);

То есть, создаем переменную, которая примет значение даты-времени в "исправленном" формате.

После этой строки добавим еще парочку - здесь мы зададим значения переменным, определяющим топик и payload.

И в заверщение напишем команду отправки данных брокеру. Должно получиться примерно так (название топика можно придумать любое):

$topic = "mercury/MyVR007_3/sensors_common"; $payload = "{\"Time\":\"".$mqtt_datetime."\",\"P1\":".$P1_1.",\"Q1\":".$Q1_1.",\"S1\":".$S1_1.",\"U1\":".$U1_1.",\"I1\":".$I1_1.",\"P2\":".$P2_1.",\"Q2\":".$Q2_1.",\"S2\":".$S2_1.",\"U2\":".$U2_1.",\"I2\":".$I2_1.",\"P3\":".$P3_1.",\"Q3\":".$Q3_1.",\"S3\":".$S3_1.",\"U3\":".$U3_1.",\"I3\":".$I3_1.",\"PS\":".$PS_1.",\"QS\":".$QS_1.",\"SS\":".$SS_1.",\"E1\":".$E1_1.",\"E2\":".$E2_1.",\"E3\":".$E3_1.",\"E4\":".$E4_1."}"; $mqtt->publish($topic, $payload,0);

Старый блок команд $mqtt->publish... по желанию можно удалить, можно закомментировать, а можно и оставить - ничего страшного от того, что информация будет писаться сразу в два топика, не будет.

Теперь наша выдача в MQTT-брокере будет выглядеть так:

{ "Time":"2021-03-17T16:26:07", "P1":123.91, "Q1":-163.51, "S1":205.15, "U1":212.99, "I1":0.961, "P2":241.59, "Q2":-269.63, "S2":362.02, "U2":213.65, "I2":1.693, "P3":244.54, "Q3":96.20, "S3":262.81, "U3":213.02, "I3":1.233, "PS":610.04, "QS":-336.94, "SS":829.98, "E1":61683.244, "E2":43892.118, "E3":0.000, "E4":0.000 }

Как говорилось в одном старом анекдоте, "Ну, во-первых, это красиво..."

Теперь идем в Home Assistant и создаем один-единственный сенсор:

sensor: - platform: mqtt name: "m231_sensors_common" state_topic: "mercury/MyVr007_3/sensors_common" value_template: "{{ value_json.time}}" json_attributes_topic: "mercury/MyVR007_3/sensors_common" json_attributes_template: "{{ value_json | tojson }}" unique_id: m231_sensors_common

В интерфейсе Home Assistant'а идём в раздел "Панель разработчика" и на закладке "Состояния" в поле "Объект" вводим или выбираем из списка: sensor.m231_sensors_common. И получаем:

Собственно говоря, на этом всё. Теперь мы можем поступать с полученными данными, как захотим.


Youku YK1 это что вообще? Роутер там TP-Link TL-MR3020.

прошивка и модуль расписан в  http://cyber-place.ru/showthread.php?s=fdb504d1b706209f09082afc87383a98&t=1307">Cyberwrt и много других модулей.

для снятия показаний по кабелю можно взять esp8266 и модуль rs485 с прошивками от http://Modkam.ru">Modkam.ru или с проекта http://Wifi-iot.ru">Wifi-iot.ru

Спасибо за совет! Попробую. Просто я не очень хорошо владею языком PHP.

А вообще идеальным вариантом было бы такое наполнение топиков MQTT, чтобы HA распознал это дело как интеграцию с автоматическим распознаванием устройства.

С HA не знаком, а что для это нужно? Достаточно ли изменить формат посылки?
Если не ошибаюсь достаточно 1 раз создать и настроить шаблон кому-то, а дальше уже распространять его.

Наконец-то руки дошли. Я поппробовал ваш способ. Действительно, ваш массив выглядит значительно элегантнее, чем моя "строка".
Одно только смущает - с вашим вариантом все числовые значения закавычены. Т.е. при просмотре топика вместо, к примеру, 12345.678 отображается число в кавычках - "12345.678".

Но к счастью на работоспособность в HA это не влияет.

Шикарно! 


А в Nodered VR-007.3 уже кто-то завёл?

у меня нет файла /www/pages/loop.php, но есть /www/dist/pages/loop.php

это опечатка или у нас как-то по разному реализовано?

Я думаю, это зависит от способа доступа к файловой системе роутера. В OpenWRT применяется некое такое "накладывание" файловых систем друг на друга. 

В-общем, думаю, что ваш файл правильный. Только совет - прежде чем что-то делать, сделайте бэкап. И помните, что штатный OpenWRT'шный метод бэкапирования не охватывает эти самые файлы дополнения от разработчиков VR007.

я не смог подключиться по sftp, зашел только по ssh

https://sprut.ai/static/media/cache/00/00/49/5/7822183/76218/1000x_image.jpg?1616433365" alt="1000x_image.jpg?1616433365" />
https://sprut.ai/static/media/cache/00/00/49/5/7822183/76217/1000x_image.jpg?1616433208" alt="1000x_image.jpg?1616433208" />



Да, у производителя адаптеров ничего не поменялось за последние годы. Всё безумно дорого..)

Вот проект, который реально работает (не мой) - единственное, нужно любыми средствами только распарсить xml

https://github.com/vad7/PowerMeter-IrDA">https://github.com/vad7/PowerM...

https://sprut.ai/static/media/cache/00/81/73/5/8029012/76884/1000x_image.jpg?1617886563" alt="1000x_image.jpg?1617886563" />

А кто-то может кинуть в меня рабочим примером, как с Меркурия через "RS485<->LAN адаптер" писать данные со счетчика в InfluxDB? Есть Raspbian и Win10

Обязательно именно в InfluxDB? У меня есть способ записи в MySQL/MariaDB. Почитайте вот: https://groups.google.com/g/vladrusanov/c/ibrkRidwWEw/m/XRJh08nbBgAJ">https://groups.google.com/g/vl...

Не совсем. У Вас же все равно используется VR-007.3. А я хочу вообще без него. Чтобы Меркурий -->

RS485toLAN --> некий скрипт на Linux\Win10 --> InfluxDB

Конвертер RS485-to-LAN вам обойдется дороже, чем перепрошитый под "Меркурий" роутер (VR-007.3 или друугой). Ну а конвертер RS485-to-USB (чтобы подключить его к роутеру) стоит сущие копейки на Алиэкспрессе. Плюс вам не потребуется мудрить со скриптом парсинга - получите готовый вместе с роутером.

Так RS485-to-LAN у меня уже есть, т.к. я отправлял данные в платное облачное АСКУЭ yaenergetik.ru. Сейчас хочется локально и бесплатно, нужен как раз только тот самый скрипт для парсинга

Напишите разработчику (https://groups.google.com/g/vladrusanov">https://groups.google.com/g/vl...). Вдруг он сжалится и поделится с вами алгоритмами парсинга данных, получаемых из "Меркурия".

https://github.com/mrkrasser/MercuryStats">MercuryStats no GitHub

https://www.incotexcom.ru/files/em/docs/mercury-protocol-obmena-1.pdf">Протокол обмена однофазных счетчиков Меркурий 200, 201, 203 (кроме Меркурий 203.2TD), 206

https://www.incotexcom.ru/files/em/docs/mercury-protocol-obmena-3-2019.pdf">Протокол обмена трехфазных счетчиков Меркурий 230, 231, 233, 234 и счетчиков Меркурий 203.2TD



Как подключить  Меркурий 231 ART-01ш? Я так понимаю только через оптопорт, что это такое и где купить?

Приветствую  господа, случайно напал на эту статью. Я не специалист в HomeAssistent, но не увидел в приведенном описании еще одного способа получения данных. Это GET запросы или AJAX, он позволяет получить все переменные мгновенных значений или энергий с роутера VR-007.3. Данные представлены через разделитель и похожи на CSV формат. Размер данных сравним с объемом MQTT. 

Home Assistant вполне позволяет отправлять запросы - и не только типа GET, но и вообще RESTful в полном объеме (можно почитать https://www.home-assistant.io/integrations/rest/">здесь).


Ну а что касается использования GET-запросов к конкретно устройствам "VR", то, как говорится, просто ещё руки не дошли.


В любом случае, спасибо за "подталкивание". Попробую реализовать. 


Но тем не менее!!! Эти GET-запросы возвращают просто строки значений, разделенных точкой с запятой. Ну, т.е., действительно формат CSV. С таким форматом не совсем удобно работать, потому что нужно вручную описывать структуру (вернее, структура-то плоская - в-общем, нужно знать порядок следования показателей), задавать имена переменных, парсить строку и т.д.


Вот если бы "VR" умели выдавать ответ в формате JSON, было бы гораздо интереснее.


Вернуться назад
Вернуться назад