1 2 3 4 5 6 7 8 9 10 0/10 0,00оценок: 0

сидим дома Подключение счетчиков Элехант к термостату ZONT

Тема в разделе "Оборудование и эксплуатация систем", создана пользователем White57km, 08.11.23.

  1. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    Подключение счетчиков Элехант к термостату ZONT
    Всем добрый день!
    Давно хотел заняться изучением радио модуля nRF24L01 но постоянно откладывал по разным причинам. И тут мне в руки попался счетчик газа Элехант СГБД-3,2ТК с дистанционной передачей данных, который передает данные на мобильное приложение «Элехант» для смартфона по Bluetooth, который далее через Интернет передает информацию в личный кабинет ресурсоснабжающей организации на сервере «Элехант». Эти же данные можно увидеть на выносном дисплее, который отобразит показания всех Ваших счетчиков «Элехант». А счетчики могут быть не только на газ, но и на воду. Так же приятно удивила цена, в том числе на выносной дисплей. В общем, не удержался, и решил разобрать этот выносной дисплей ради интереса. И тут оказалось, что заявленный Bluetooth в нем реализован на модуле с nRF24L01+. Это событие подвигло меня все же заняться изучением данного радио модуля. А заодно и попробовать вывести данные от счетчика Элехант в личный кабинет отопительного контроллера ZONT установленного на даче.
     
  2. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    Изучение документации на радио модуль nRF24L01 не на много приблизило меня к конечной цели, но позволило мне научиться работать с этим модулем. Поиск информации в интернете привел меня в конечном поиске к следующей статье. http://dmitry.gr/index.php?r=05.Projects&proj=11.%20Bluetooth%20LE%20fakery
    В ней написано как можно использовать модуль nRF24L01 для работы с Bluetooth. Так же приведены исходные тексты подпрограмм для реализации этой идеи. Дальнейшее изучение фирменного выносного дисплея «Элехант» показало, что на разъем платы выведены сигналы TX и RX от USART микроконтроллера. Если данные можно получить по последовательному порту, то задачка бы сильно упростилась. Но попытка связаться с производителем не удалась и на мои запросы в результате никто не ответил. Поэтому было принято решение на первоначальном этапе попытаться сделать свой выносной дисплей на модуле nRF24L01. В результате экспериментов было выявлено, что передача данных от счетчика производится на частоте 2,480 гГц. Эта частота соответствует 39 рекламному каналу (Advertising channel). Используется 32 байта полезной нагрузки. Автоподтверждение отключено, используется адресация из четырех байт (0x8E89BED6), скорость передачи 1 Мбит/с, контрольная сумма CRC отключена. Есть интересная статья «BLE под микроскопом» (https://habr.com/ru/articles/319244/) где можно почитать о формате данных пакетов, используемых частотах и еще много другой полезной информации. В результате проб и ошибок, наконец, удалось принимать пакеты данных от нужного счетчика. Результаты приведены на рисунке ниже.
     
  3. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
  4. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    Каждый пакет занимает две строчки. Пакеты шлются каждые 15 секунд. Теперь первая задача попробовать расшифровать эти пакеты.
     
  5. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    Структура пакета оказалась довольно стандартной.
    02 1B – Заголовок (02 – PDU Type и т. д.; 1B – Length длина пакета в байтах, итого 27 байт.)
    74 01 00 01 31 B0 – MAC адрес
    14 – Length длина данных в байтах, 20 байт.
    FF – AD Type Manufacturer specific data
    FF FF – Company ID (Код производителя)
    80 С8 0A 01 01 31 74 01 00 C3 08 00 00 7F 0F 09 0F – Данные
    A4 A4 3E – Контрольная сумма CRC 24 Bit
    В общем то осталось только расшифровать данные и придумать как передавать их контроллеру ZONT.
     
  6. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    Поиск в интернете данных по подключению счетчиков Элехант к системам умного дома дал следующий результат.
    Подключение счётчиков воды Элехант к умному дому OpenHAB
    https://habr.com/ru/articles/586500/
    Сбор и визуализация показаний счетчиков воды Элехант СВД-15 в Home Assistant
    https://sprut.ai/article/sbor-i-vizualizaciya-pokazaniy-schetchikov-vody-elehant-svd-15-v-home-assistant
    Поддержка счетчиков воды Элехант
    https://support.wirenboard.com/t/podderzhka-schetchikov-vody-elehant/4809
    После анализа полученной информации стало ясно, что серийный номер счетчика занимает три байта. Cобствено показания счетчика занимают 4 байта. И, наконец, два байта это показания встроенного датчика температуры, но это еще под вопросом.
    80 С8 0A 01 01 31 74 01 00 C3 08 00 00 7F 0F 09 0F
    О назначении остальных байтов данных приходится пока только догадываться. Удалось только установить, что байт, выделенный серым цветом, является внутренним счетчиком времени и его показания увеличиваются на единицу каждую минуту. В итоге, мы, в общем то, имеем всю необходимую для нас информацию:
    Номер счетчика: 0х000174 = 372
    Показания счетчика: 0x000008C3 = 2243, что соответствует показаниям 224,3 л или 0,224 м³.
    Температура: 0x090F = 2319, значение соответствует, судя по градуснику 23,19 °С.
    Серийный номер нам понадобится для идентификации счетчика. Показания счетчика будем передавать контроллеру ZONT. Ну а со значением температуры пока делать ничего не будем.
     
  7. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    На распродаже прикупил также два счетчика для воды. Счетчик воды СВД-20 для холодной воды и тарифный счетчик СВТ-15 для горячей воды. Второй счетчик взял больше из интереса, чем из практической необходимости, так как горячую воду из холодной греет бойлер. Зацепила сама идея. Пока температура горячей воды ниже +40°С счетчик считает горячую воду холодной, ну а выше этой температуры уже горячей. Как к такому решению относятся поставщики ресурсов, не знаю, но раз счетчики сертифицированы, то, наверное, вынуждены принимать такие показания. Меня же больше интересовало, где же находятся эти значения в принятом пакете. Вроде места то и не осталось, а еще, по идее, где то должен отслеживаться заряд батарейки в счетчике. В результате все оказалось просто. Пакет данных от счетчиков воды оказался аналогичным счетчику газа. От тарифного счетчика приходят по очереди два пакета с одним и тем же серийным номером, но разными показаниями. При этом изменяется так же пара байт данных из тех, назначение которых нам пока не известно. Буду анализировать и поищу информацию в интернете. Таким образом, у нас получается уже четыре счетчика. Один для газа и три для воды. Забыл сказать, что счетчик газа изначально приобретался для контроля уровня газа в баллоне или газгольдере. Но это отдельная тема… А еще возникла идея подключить сюда же счетчик электроэнергии. Итого получилось уже пять счетчиков.
     
  8. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    Ниже представлена информация полученная от трех различных счетчиков Элехант.
    upload_2023-11-13_8-37-9.png
    Здесь на картинке тарифный счетчик СВТ-15 имеет номер 00147D. В строке 000004 передаются данные о холодной воде, а в строке 000010 данные о горячей воде. Анализируя посылки от трех счетчиков можно предположить, что семнадцатый байт в посылке скорее всего указывает на тип счетчика. Если его значение равно 01, то это счетчик газа, если 02, то счетчик воды. А следующий за ним восемнадцатый байт модель конкретного счетчика. Также можно заметить, что в так называемый MAC адрес входит номер счетчика, тип и модель счетчика.
     
  9. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    Теперь попробуем разобраться с передачей полученных данных в контроллер ZONT. Передать показания счетчика контроллеру ZONT можно двумя способами. По протоколу Modbus шины RS-485 или по шине 1-Wire, к которой подключаются цифровые датчики температуры. Более универсальный – это второй вариант. Эмулируя работу датчиков температуры, информацию о значении счетчика можно передавать не только контроллерам и термостатам ZONT, но и практически любым другим аналогичным контроллерам, поддерживающим подключение цифровых датчиков температуры. Есть, правда, и ограничения. Цифровые датчики типа DS18S20 и DS18B20 измеряют температуру от +125°С до -55°С. Таким образом мы сможем передавать значения счетчика от 0 до 127, что ни есть хорошо. Можно задействовать значение после десятичной запятой, что позволит вывести уже значение 127,9 (хотя теоретически можно вывести и два знака после запятой, но известные мне контроллеры этого не делают). Действительно нет смысла выводить значение температуры с точностью 0,01 градуса. Кроме этого получать значения счетчика в градусах как то не эстетично. Но оказалось, что контроллеры ZONT поддерживают различные физические величины, том числе литры и метры кубические. Кроме того они позволяют использовать множители и можно выводить значения в диапазоне от +155 до -100. Правда и тут не обошлось без ложки дегтя. В нашем случае это значение 85,0. При этом значении датчик, почему то, считается отсутствующим. В службе технической поддержки сей факт подтвердили, но не более того. А столкнулся я с этим, когда мониторил давление газа в газовых баллонах. Там как раз при полной зарядке баллона давление около 8,5 бар. И датчики просто как бы отваливаются. Но теперь мы знаем об этом и сможем избежать этого. Есть еще один нюанс. Если, по каким-то причинам, датчик пропустит хоть одно обращение к нему контроллера, то датчик будет считаться какое-то время недоступным. И если мы будем обслуживать сразу несколько разных датчиков, то возможны неприятные моменты с постоянным отваливанием показаний.
     
  10. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    Теперь надо определиться каким образом мы будем эмулировать работу цифрового датчика температуры. Было бы неплохо получить какое-нибудь универсальное решение. В результате изучения вопроса было принято решение использовать для связи с контроллером ZONT модуль IMB-2131. Модуль поддерживает эмуляцию до восьми датчиков, позволяет масштабировать данные и посылать их для отображения с нужными физическими единицами. Для данного модуля есть демонстрационная плата, выполненная в виде платы расширения для Arduino Uno R3. В описании на модуль есть также пример программы для Arduino, который возьмем за основу. Для настройки самого модуля есть специальная программа ComWS. В настройках можно включать/выключать нужные каналы и присваивать каналам нужный тип данных и множитель. Собственно данные можно передавать в двух форматах. Формате цифрового датчика температуры DS18S20 или в специальном формате данных. Прежде всего, надо определиться с форматом собственных данных, которые мы хотим увидеть. Для тестирования попробуем выводить данные от счетчика в литрах, м³, ну и, допустим, в килограммах. Значения будут отображаться от 0 до 999. В дальнейшем, при необходимости, можно будет передавать данные каждого счетчика в виде показаний двух датчиков. Но пока ограничимся одним значением. Возьмем ранее считанное значение счетчика 0x000008C3 = 2243, что соответствует показаниям 224,3 л или 0,224 м³. Соответственно будем выводить 224 литра, 0,22 м³ и учитывая, что 1 л сжиженного газа равен приблизительно 0,52 кг то получаем (0,52 * 224,3) 117 кг. Осталось только дождаться заказанного модуля с демонстрационной платой. А плата Arduino осталась от предыдущих экспериментов.
     
  11. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    Пока нет реального железа, займемся немного теорией и подготовимся к настройкам модуля. Настройка модуля IMB-2131 аналогична настройкам адаптеров OWA-xxxx. Для тех, кто знаком с данными адаптерами и осуществлял их настройку, проблем не возникнет. Для остальных нужно пояснить, что адаптеры OWA предназначены для подключения к термостатам и контроллерам ZONT нестандартных датчиков или если нет возможности подключить датчики напрямую. Итак, мы определились, что для теста у нас будет три датчика (счетчика). Первый будет считать расход в литрах от 0 до 999. Как было сказано ранее, вывести значение больше 127 обычным способом не получится. Поэтому мы будем формировать значение нашего счетчика (224) как 22,4 с множителем на десять. Единица измерения – литры. Из сводной таблицы типов данных видим, что объему в литрах соответствует код 0x28. Чтобы установить множитель на десять производим следующие манипуляции. Представляем полученный код в двоичном виде 0x28 = 00101000, сдвигаем значение на два бита влево и отбрасываем старшие два бита (101000хх). Теперь вместо двух младших бит записываем множитель, который берем из таблицы множителей данных. В нашем случае получаем значение 10100010 = 0xA2. Теперь это значение нам надо будет занести в поле [Type:] настройки нужного канала, установить галочку включения канала и не забыть сохранить изменения. На этом настройка канала закончена. Второй счетчик у нас считает расход в метрах кубических. Допустим, нас интересует диапазон расхода от 0 до 99,9 м³. Для данного диапазона нам множитель не нужен. Код объема в метрах кубических равен 0x27. Получаем с учетом множителя на единицу 0x27 = 00100111 => 100111xx => 10011101 = 0x9D. Ну и третий счетчик будет измерять расход в килограммах. Здесь мы ради интереса введем диапазон от 0 до 12,00 кг. Почему именно такой? Во первых, интересно увидеть значения с точностью до одной сотой значения, во вторых, в стандартный газовый баллон на 27 л входит как раз около 12 кг газа, ну и в третьих пока мы просто учимся настраивать модуль IMB-2131. В данном примере нам уже понадобится не множитель, а делитель на десять. В результате получаем следующее значение для настройки: 0x29 = 00101001 => 101001xx => 10100100 = 0xA4. На этом настройку можно считать законченной. Пока описывал настройки, увидел в описании, что есть еще множитель на сто. Может где и пригодится.
     
  12. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    Теперь немного о передаче непосредственно данных. Как было сказано выше, на данный момент предусмотрено два формата передачи данных. Первый из них это формат цифрового датчика температуры DS18S20. Почему именно его, а не аналогичного ему DS18B20 не совсем понятно. Ну да есть, как есть. Кому интересно может прочитать описание на датчик. Если коротенько, то данные занимают три байта: Temp_MSB (00h), Temp_LSB (AAh) и Count_Remain (0Ch). В скобках указаны значения, устанавливающиеся после подачи напряжения питания на датчик. О них мы еще поговорим позднее. Temp_MSB – это, собственно, знак числа. Если байт равен 00h, то знак плюс, если FFh, то знак минус. Temp_LSB – целочисленное значение температуры. Count_Remain – дробная часть значения. На самом деле, данные здесь определения для Temp_LSB и Count_Remain, довольно вольные, но полностью отражают главную суть. На самом деле контроллеры ZONT рассчитывают полное значение по формуле:
    upload_2023-11-17_9-28-59.png
    Где Count_Per_C является константой и равно 10h, а Temp_Read = Temp_LSB/2. Не знаю, как у кого, но по мне тот, кто это придумал, большой шалун. Кстати формула эта не от инженеров ZONT, а от производителя самих датчиков. Я в основном пишу свои программы на ассемблере и мне трудно принять, что, допустим, 1,3 = 1 + 0,3, а 1,8 = 2 - 0,2. Ну вы поняли… Ну да это лирика. Рассмотрим пока пример из программы для Arduino для демонстрационной платы. Там для этого формата просто присваиваются значения каждому байту, чтобы выводилось значение 3,3, где Temp_MSB = 00h, Temp_LSB = 06h, Count_Remain = 07h. Для себя я решил рассчитывать значение по следующему алгоритму. Со знаком все понятно. Целая часть рассчитывается как значение параметра умноженное на два (3 * 2 = 6 = 06h). Дробная часть вычисляется из таблицы:
    upload_2023-11-17_9-29-42.png
    Здесь значению 0,3 соответствует 07h. Если дробная часть равна 0,8 или 0,9 то к целой части прибавляется двойка. Т. е. для вывода значения 3,9 наши значения примут следующий вид: Temp_MSB = 00h, Temp_LSB = 08h, Count_Remain = 0Dh. Собственно поэтому мы и можем вывести максимальное целое значение не больше 127. Еще хотел бы вернуться к значениям по умолчанию для датчиков температуры. Напомню, что значения принимают вид: Temp_MSB (00h), Temp_LSB (AAh) и Count_Remain (0Ch). Если перевести эти значения в человеческий вид, то мы получим значение +85,0. Сам по себе датчик температуры температуру не измеряет. Ему для этого необходимо передать команду на измерение. И если датчик работоспособен, то он начнет выдавать уже реально измеренную температуру. Кроме того данные датчики подключаются к ZONT по схеме «паразитного питания», т. е. непосредственно напряжение питания на датчик не подается. Фирменные датчики в данном режиме работают нормально, а вот Китайские клоны датчиков работают, как повезет. А везет очень редко. Скорее всего, поэтому и было принято решение, что данное значение от датчика обозначает его неисправность. В адаптерах OWA эту «неисправность» починили тем, что данное значение никогда не передается контроллерам ZONT а подменяется на ближайшее. А вот в модулях IMB-2131 я еще не испытывал. Поэтому если вам жизненно необходимо увидеть именно это значение и его результаты с множителями, то придется перейти на контроллеры других фирм.
     
  13. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    Второй формат данных является, как я понял, внутренним форматом для адаптеров OWA. Данные представлены также тремя байтами. Байт данных (Data), функция преобразования (Func) и смещение (OffSet). Основной принцип следующий. Байт данных преобразуется с помощью функции преобразования в нужное значение и к нему прибавляется смещение. Есть несколько разных функций преобразования. Все описывать не стану, рассмотрим пока функцию 03h. Информация взята из описания к модулю. Это самый распространенный тип преобразования. Данные кодируются в двоично-десятичном формате. Значение данных 0x45 будет преобразовано в десятичное значение 4,5. После этого к полученному значению будет прибавлено значение коррекции. Если байт коррекции равен 0x70, то в результате мы получим окончательное значение 4,5 + 70 = 74,5. Полученное значение может быть только положительным числом. Применение значений типа 0x1F не допускается. Исключением является значение 0xFF которым кодируется информация об ошибке. При обработке данного значения данные будут преобразованы в значение -55,0. Данный тип преобразования применяется для вывода без знаковых значений в диапазоне от 0,0 до 99,9. С помощью специального механизма множителей, который описан в настройках модуля, с помощью этого типа преобразования возможно выводить значения типа 745 мм. рт. ст. В общем то это то, что нам нужно. Таким образом, чтобы вывести значение 224 нам надо послать следующие значения: Data = 24h, Func = 03h, OffSet = 20h. Ну и должен быть установлен множитель на десять. Использование данного формата идеально подходит для данных из таблицы перекодировки, где входное напряжение АЦП является адресом данных в таблице перекодировки. Большинство 8-битных микроконтроллеров имеют 10-разрядные АЦП что соответствует 1024 значениям результата преобразования. Если отбросить два младших разряда измерения, то получаем 256 отсчетов (1 байт) и можем использовать его в качестве адреса таблицы. Для входного сигнала 0…+5В получаем разрешение около 20 мВ. Такого разрешения вполне достаточно для работы с большинством аналоговых датчиков. Модуль IMB-2131 имеет один аналоговый вход для подключения непосредственно к нему аналогового датчика. И в настройках этого датчика используется именно такой подход. Т. е. составляем передаточную таблицу датчика в соответствии с выбранным типом преобразования и устанавливаем нужное смещение. Для многих стандартных датчиков таблицы преобразования уже созданы и их не придется составлять самостоятельно. К данному входу можно подключить и датчики с выходом токовая петля 0…20мА но для этого необходимо допаять на модуле специальный резистор. Причем обязательно. Если этого не сделать, то будет кердык нашему входу, а может и всему модулю.
     
  14. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    Пришел модуль IMB-2131 с демонстрационной платой. Пришлось немного поработать паяльникам, чтобы получить желаемый для меня результат. Не были запаяны разъемы под Arduino UNO и преобразователь интерфейса. Так же припаял дополнительный светодиод для индикации работы устройства. На все понадобилось минут десять, так что устать не успел. В результате получилось вот такое устройство.
    upload_2023-11-21_9-15-47.png
    Преобразователь интерфейса USB в интерфейс UART выполнен на базе чипа CP2101 и предназначен для настройки модуля IMB-2131. Если у вас есть свой такой преобразователь, то можно заказать демонстрационную плату без данного преобразователя. Подключение к контроллеру ZONT производится с помощью установленного на демоплате клеммника. Напряжение питания +5В может поступать как с платы преобразователя, так и с платы Arduino (устанавливается перемычками на плате). Также возможно запитывание устройства от внешнего блока питания, на плате есть место для установки стабилизатора напряжения и сопутствующих элементов. Сам модуль устанавливается на плату в специальные разъемы и может быть легко извлечен для использования в других устройствах.
     
  15. White57km
    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113

    White57km

    Живу здесь

    White57km

    Живу здесь

    Регистрация:
    04.07.17
    Сообщения:
    90
    Благодарности:
    113
    Подключение модуля к ПК проблем не вызвало. В программе настройки ComWS кроме необходимых нам настроек есть еще куча других настроек. Нам они пока не интересны. Канал AN0 модуля по умолчанию обслуживает собственный аналоговый вход модуля. Оставляем его, как есть, а для своих нужд включаем каналы AN1-AN3 и прописываем в них нужные нам типы данных. Каналу AN1 присваиваем тип A2, каналу AN2 присваиваем тип 9D и каналу AN3 присваиваем тип A4. Теперь загружаем в Arduino тестовый скетч от демонстрационной платы. Подключаем к Arduino демонстрационную плату, которую, в свою очередь, подключаем к контроллеру ZONT туда, где подключаются цифровые датчики температуры. Для эксперимента решил вначале подключить к своему старому контроллеру ZONT H-1000. В результате получился вот такой стенд.
    upload_2023-11-22_9-1-18.png