гаджеты и прочие приборы,  дом,  софт,  стройка

Подключение счётчиков воды Элехант к умному дому OpenHAB

6 лет жизни в доме пролетели незаметно и вот пришло время доверять или менять счётчик воды. Поясню, что у меня в доме городской водопровод и канализация, соответственно мне выставляют счета за воду, а объём водоотведения (канализации) считатют равным потреблению воды и так как цены ижевского водоканала растут в последние годы весьма заметно, то я решил воспользоваться вариантом с установкой дополнительного счётчика на воду для полива, которая не учитывается при определении платы за канализацию. Некоторые ради экономии делают отдельные скважины для полива, но я применил передовые технологии полива для сокращения расхода воды именно на полив, да и сам полив у меня регулируется умным домом, так что, потребляемые объёмы невелики (да участок у меня небольшой). Но у меня есть увлажнитель и он распыляет по дому около кубометра воды за сутки и вода эта не попадает в канализацию, а выводится вытяжной вентиляцией на улицу. Фактически я именно ради того что бы не оплачивать канализацию за те объёмы воды, что уходят в воздух и решил поменять схему включения и установить дополнительный счётчик. Водоканал объяснил мне по телефону какая должна быть схема установки счётчиков. Сантехники перепаяли мне трубы изрядно и поставили новые счётчики.

То была присказка, а вот теперь перейду к интересному. 6 лет назад я изучал счётчики и цена на счётчики с выдачей конкретных цифр была заоблачной. Альтернатива была в счётчиках, которые выдавали импульсы. К ним ставился контроллер, который их читал и передавал дальше в умный дом для отображения. Такая система у меня была реализована, но она имела недостатки в лице энергозависимости и необходимости вносить коррекцию в случае если водой пользовались при отсутствии электричества. Но годы прошли и появились бюджетные счётчики которые имеют беспроводной интерфейс BLE который широко распространён среди гаджетов для умного дома. Он отличается от Zigbee простотой реализации и становится всё более популярен. В частности Xiaomi раньше использовавший Zigbee теперь выпускает новые модели устройств с BLE. Ну вот в поисках счётчиков умных в этом году я наткнулся на счётчики Элехант, которые стоят как импульсные счётчики, но при этом данные выдают именно через BLE. Так что я их заказал в Ozon и 4 дня дней забрал в в ближайшем «продуктовом магазине типа Перкрёсток» (там у нас выдача Ozon и постамат Халва куда DPD привозит посылки с Aliexpress). Счётчики стоили по 1 320₽ при том, что цена простейшего счётчика ~600₽, а цена импульсных счётчиков заметно дороже Элехантна.

Они пока не опломбированы, так как Водоканал обещал прийти в течение 3х-4 недель…

Счётчики выглядят прикольно, так как у них вместо циферок QR-код для скачивания приложения и номер самого счётчика, а показаний на нём самом посмотреть нельзя! При этом заявлено, что батарейки хватает на 6 лет и в ходе проведения поверки каждые 6 лет нужно менять батарейку. Данные в BLE. Данные в BLE они выдают в поле «manufacturer», то есть данные производителя без расшифровки и разбивки на поля. Я написал в техподдержку производителя с вопросом а нет ли документации по поводу того, что они вещают в эфир. На что мне ответили — «это коммерческая тайна», что было ожидаемо и предельно глупо, конечно, так как поиск выдал, ещё до того как я задал вопрос, несколько реализаций извлечения этих самых данных. Наиболее интересным вариантов и понятным мне оказалась вот эта статья. Оттуда я взял тестовый скрипт и расположение полей, а дальше переписал преобразования в удобном виде прямо в OpenHAB.

Для того что бы получить данные из BLE и отправить их в MQTT и через него в OpenHAB я использую шлюз LUMI европейской версии от Xiaomi с прошивкой OpenWrt где включен BLE (по умолчанию он не используется и интерфейс неактивен). Сразу скажу, что Xiaomi не использует этот интерфейс и предлагает покупать новые модели шлюзов для новых датчиков!!! Такой вот маркетинг!!! Так что, если кто там рассказывает сказки про замедление iPhone лучше почувствуйте как китайцы просто тупо предлагают менять железку из-за того, что софт не хотят исправить свой. Короме самого OpenWrt на шлюз установлен пакет EspruinoHub и Zigbee2MQTT, конечно. Первый отправляет всё полученное из BLE на MQTT брокер и обратно, а второй так же связывает Zigbee в обе стороны.

вот как выглядит информация полученная от счётчика в MQTT

Получив такую информацию я завожу в OpenHAB счётчик как вещь (thing) и прописываю каналы, которые все кроме уровня сигнала обрабатывают топик ble/advertise/b0:01:02:00:bc:f6/manufacturer/ffff но для обработки применяют разные скрипты для получения разной информации или информации в разных форматах.

Для получения значения потребления воды в десятых долях литра я используют входное преобразование (Incoming Volume Transformation) JS:elehant_vol_cl.js прямо в расширенных настройках канала. Сам скрипт лежит в каталоге transform и представляет собой простенькую процедуру на JavaScript:

(function(i) {
    var str=i.replace(/"/g,'');
    return parseInt((str.substr(24,2)+str.substr(22,2)+str.substr(20,2)+str.substr(18,2)),16)
})(input)  

для работы скрипта ему нужна локальная переменная и при её определении обрезаются пробелы, если они вдруг окажутся в выдаче. Формируется строка в правильной последовательности и она преобразовывается из шестнадцатеричной системы в десятичную. Так как в сбытовую компанию сдаются показания в кубометрах, то рядом лежит скрипт где возвращается результат деления на 10000 этого целого.

Для однозначности идентификации счётчиков полезно получать их номера непосредственно с них и это делается вот таким скриптом:

(function(i) {
    var str=i.replace(/"/g,'');
    return parseInt((str.substr(16,2)+str.substr(14,2)+str.substr(12,2)),16);
})(input)

всё то же что в первом, но другие символы из строки используются.

В целом код описания вещи выглядит вот так у меня:

UID: mqtt:topic:53f40ec181:WaterCounter1
label: Счётчик воды №1
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:53f40ec181
location: garage
channels:
  - id: WaterCounter1rssi
    channelTypeUID: mqtt:number
    label: Счётчик воды №1 уровень сигнала
    description: ""
    configuration:
      stateTopic: ble/advertise/b0:01:02:00:bc:f6/rssi
  - id: WaterCount1serial
    channelTypeUID: mqtt:number
    label: Номер счётчика воды №1
    description: ""
    configuration:
      stateTopic: ble/advertise/b0:01:02:00:bc:f6/manufacturer/ffff
      transformationPattern: JS:elehant_serial.js
  - id: WaterCounter1cl
    channelTypeUID: mqtt:number
    label: Показания счётчика воды №1 в десятых долях литра
    description: ""
    configuration:
      stateTopic: ble/advertise/b0:01:02:00:bc:f6/manufacturer/ffff
      transformationPattern: JS:elehant_vol_cl.js
  - id: WaterCounter1state
    channelTypeUID: mqtt:string
    label: Строка состояния счётчика воды №1
    description: ""
    configuration:
      stateTopic: ble/advertise/b1:01:02:00:bc:f7/manufacturer/ffff
  - id: WaterCounter1
    channelTypeUID: mqtt:number
    label: Показания счётчика воды №1 в m3
    description: null
    configuration:
      stateTopic: ble/advertise/b0:01:02:00:bc:f6/manufacturer/ffff
      transformationPattern: JS:elehant_vol.js

Вот так выглядит почти конечный результат (можно его выводить дальше как угодно)

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Спасибо!

Теперь редакторы в курсе.