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

17 марта 2021, 15:18

Электросчетчики "Меркурий-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. И получаем:
 

1600x_image.png?1615994289

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


Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @SprutAI

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. (Alecseyyy)
    (Alecseyyy) 2 месяца назад

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

    прошивка и модуль расписан в  Cyberwrt и много других модулей.

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

  2. Алексей Гамов (alexey-gamov)
    Алексей Гамов (alexey-gamov) отредактировано 2 месяца назад

    Я бы секцию по публикации лучше оформил так

    • Игорь Бурундуковский (booroondook)

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

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

      • Алексей Гамов (alexey-gamov)
        Алексей Гамов (alexey-gamov) отредактировано 2 месяца назад

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

  3. Евгений Олейник (permadm)
    Евгений Олейник (permadm) отредактировано 2 месяца назад

    Шикарно! 

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

  4. Евгений Олейник (permadm)
    Евгений Олейник (permadm) 2 месяца назад

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

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

    • Игорь Бурундуковский (booroondook)
      Игорь Бурундуковский (booroondook) отредактировано 2 месяца назад

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

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

  5. (itProfi)
    (itProfi) 2 месяца назад

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

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

    https://github.com/vad7/PowerM...

    1000x_image.jpg?1617886563
  6. (fenst)
    (fenst) отредактировано 2 месяца назад

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

    • Игорь Бурундуковский (booroondook)

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

      • (fenst)
        (fenst) 2 месяца назад

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

        • Игорь Бурундуковский (booroondook)

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

          • (fenst)
            (fenst) 2 месяца назад

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

  7. Игорь Николаевич (uropek)
    Игорь Николаевич (uropek) отредактировано месяц назад
    Комментарий удален
К списку блогов

Тематические чаты

Похожие записи

12 сентября 2020, 20:51
Создание при помощи бесплатной программы Sweet Home 3D интерактивного плана помещения для Home Assistant.
16 июля 2020, 15:13
Удобная настройка Home Assistant с помощью packages.
19 августа 2019, 20:21
Сервис для изготовления удобной маркировки в электрический щиток
13 февраля 2019, 22:00
Подключение радио на Xiaomi Gateway к Home Assistant c дальнейшим использованием в автоматизациях
19 апреля 2019, 20:53
Требуется ваше мнение!
06 февраля 2019, 12:02
Автоматизированное открытие/закрытие окна
04 апреля 2019, 12:45
Самое важное из апдейта Home Assistant 0.91-0.91.4 от 03.04.19.
21 марта 2019, 11:59
Самое важное из апдейта Home Assistant 0.9 от 20.03.19.
21 февраля 2019, 21:12
Самое важное из апдейта Home Assistant 0.88 от 20.02.19.