Wireless M-Bus

Получение данных от устройств Wireless Meter-Bus (wM-Bus), таких как счетчики газа или электроэнергии

Текущий релиз
0.14.1
Разработчик
Christian Landvogt
Лицензия
GPL-2.0-only

Этот адаптер позволяет принимать беспроводные данные M-Bus от поддерживаемых приемников. Возможности реализации на разных устройствах различаются, но режимы wMBus можно настроить для всех перечисленных устройств.

  • Модули Embit WMB
  • Amber Wireless AMB8465 ( Внимание: включен командный режим (UART_CMD_Out_Enable)!)
  • IMST iM871A
  • IMST iU891A-XL
  • КУЛ

Стек WMBUS был "переработан" на основе проекта FHEM и подвергся значительной доработке и рефакторингу. Тестирование проводилось с использованием исходных данных, полученных из интернета, примеров данных OMS и некоторых тестовых данных из библиотеки jmbus. Некоторые граничные случаи еще не протестированы.

Создание, обновление и т.д. устройств в основном основаны на адаптере M-Bus от Apollon77 (см. ниже).

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

Если парсер выдаст ошибку, необработанные данные Telegram будут сохранены в состоянии info.rawdata.

Внимание: Приёмник Amber, похоже, зависает через некоторое время (или после получения определённого количества сообщений) в режиме C? Аппаратная неисправность?

Вариант IMST iM871A: Существует USB-приемник "RWE Smart Home", который по сути является IMST iM871A, но ядро не загружает соответствующий драйвер автоматически. Вот однострочный код для создания правила udev, чтобы это исправить:

sudo bash -c "echo \
    

ACTION==\"add\", ATTRS{idVendor}==\"10c4\", ATTRS{idProduct}==\"87ed\", RUN+=\"/sbin/modprobe cp210x\" RUN+=\"/bin/sh -c \\'echo 10c4 87ed > /sys/bus/usb-serial/drivers/cp210x/new_id\\'\"' > /etc/udev/rules.d/99-imst.rules"

Ссылки:

Первоначальная настройка

Первоначальная настройка требует конфигурации основных параметров (аппаратное подключение к приемнику wmbus) и настройки ключей AES для всех зашифрованных узлов wmbus, данные с которых будут собираться. Самая сложная часть — это ключи AES.

Базовая настройка

Для этого необходимо выбрать соответствующее USB-устройство и правильную скорость передачи данных ( обычно для IMST iM871A: 57600 бод; IMST iU891A-XL: 115200 бод; Amber: 9600 бод; Embit: 9600 бод, CUL: 38400 или 9600 бод). Большинство измерительных приборов будут передавать данные в режиме "T".

Начиная с версии 0.9.0, адаптер также поддерживает подключение к последовательным устройствам, доступным через TCP-сокет. Однако административный интерфейс пока это не отражает, и вам нужно выбрать «пользовательский порт» и ввести хост в качестве параметра. tcp://host:port.

Другие варианты

  • Обновление неизмененных состояний : При получении телеграммы все состояния будут обновлены, даже если их значение не изменилось. (по умолчанию: включено)
  • Принудительный перевод единиц энергии в кВт·ч : Все единицы энергии (Вт·ч и Дж) будут переведены в кВт·ч. (по умолчанию: выключено)
  • Временно блокировать устройство после нескольких неудачных попыток : если 10 последовательных телеграмм от одного и того же устройства не будут успешно обработаны, устройство будет игнорироваться до перезагрузки адаптера (по умолчанию: включено).
  • Обрабатывайте только устройства, у которых уже есть дерево объектов : телеграммы от устройств, у которых еще нет дерева объектов, игнорируются, поэтому новые устройства не создаются — это полезно после того, как все интересующие вас счетчики настроены. Телеграммы, которые вообще не могут быть расшифрованы, также игнорируются: они не добавляют устройство в список ключей AES и не записываются в info.rawdata Автоматический список блокировки по-прежнему учитывает их, поэтому нежелательное устройство перестает требовать попытки декодирования — просто в журнале об этом не сообщается. Устройство, удаленное из дерева объектов, исчезает навсегда сразу же. Поиск устройств выполняется при запуске адаптера, поэтому для устройства, которое должно быть обнаружено снова, требуется перезапуск. (по умолчанию: выключено)
  • Перезапись имени, единицы измерения и роли состояний данных : Имя, единица измерения и роль состояния данных следуют за декодированной телеграммой — после обновления парсера или при включении параметра «Принудительное преобразование единиц энергии в кВтч» — но только до тех пор, пока они соответствуют тому, что записал сам адаптер. Имя, которое вы присвоили состоянию, или роль, которую вы изменили для другого адаптера, остаются неизменными, как и все состояния, созданные более ранней версией адаптера. Включите эту опцию, чтобы вернуть все состояния данных к тому состоянию, с которым адаптер создал бы их в своей следующей телеграмме, включая ваши собственные имена, и снова выключите после этого. (по умолчанию: выключено)

Каждое состояние данных запоминает, для какой записи данных оно было создано — номер хранилища, тариф, подразделение, поле функции (мгновенное, максимальное, минимальное, состояние ошибки) и расширения VIF. Идентификатор состояния указывает только позицию записи в телеграмме, ее номер хранилища и тип, поэтому счетчик, отправляющий записи в разном порядке или телеграммы разной структуры, может поместить другую запись под тот же идентификатор. Такое значение пропускается, а не записывается в состояние, описывающее другую запись, и в журнале это указывается один раз для каждого состояния. Состояние, созданное более ранней версией адаптера, принимает за свою запись первую запись, поступившую после обновления.

Автоматически поддерживаются компактные телеграммы (используемые некоторыми устройствами Kamstrup): структура полной телеграммы запоминается устройством, чтобы она сохранялась после перезагрузки адаптера, и используется для декодирования компактных телеграмм. Только компактные телеграммы, отправленные устройством до первой отправки полной телеграммы, не могут быть декодированы и молча пропускаются.

Ключи AES

Идентификатор устройства представляет собой комбинацию кода производителя и идентификатора устройства (например, AAA-12345678). Ключ может быть введен либо в виде открытого текста длиной в 16 символов, либо в виде шестнадцатеричной строки длиной в 32 символа (16 байт).

Самый простой способ настроить ключи — запустить адаптер без предварительной настройки ключей и дождаться зашифрованной телеграммы, после чего адаптер сгенерирует запись с ключом "НЕИЗВЕСТНЫЙ". (Если включена опция "обрабатывать только устройства, у которых уже есть дерево объектов", ни одно устройство не может ожидать ключа — кнопка будет отключена и будет это указывать.) Затем вы можете ввести соответствующий ключ и сохранить настройки. Если вы видите устройства, которые вам неизвестны или от которых вы просто хотите избавиться (например, устройства соседей), вы можете добавить их на вкладку "Заблокированные устройства" (см. ниже).

Блокировка нежелательных устройств

Вкладка «Заблокированные устройства» позволяет полностью запретить адаптеру обрабатывать телеграммы с нежелательных устройств.

Вам нужно лишь ввести идентификатор устройства (например, AAA-12345678), который можно получить из дерева объектов после получения и анализа телеграммы или из журнала отладки.

Впоследствии, при удалении устройства из дерева объектов, адаптер не будет создавать его заново.

Данные, специфичные для производителя

Некоторые счетчики записывают значения, не описанные стандартом, в запись данных, специфичную для производителя : это небольшой массив данных размером в несколько байтов, содержащий несколько значений. Парсер уже знает некоторые из них (например, датчик дыма Itron) и записывает их значения как собственные состояния. Для всех остальных счетчиков массив данных представляет собой одно состояние, содержащее большое число, а вкладка «Данные, специфичные для производителя» — это место, где вы описываете его содержимое.

Описание представлено в формате JSON, по одной записи на каждый код производителя — три буквы адреса устройства:

{
    "ACM": [
        { "byte": 0, "bit": 0, "description": "Backflow detected" },
        { "byte": 1, "description": "Battery", "unit": "%", "legacyName": "VIF_BATTERY_PERCENT" },
        { "byte": 2, "bytes": 3, "description": "Volume", "unit": "l" },
        { "byte": 5, "flags": ["Leakage", "Burst", null, "Removal"] },
        { "byte": 6, "bits": [0, 1], "description": "Network mode", "values": ["Off", "Walk-by", "Fixed"] }
    ]
}
ключчто это делает
byteгде значение в двоичном файле начинается с нуля (обязательно)
bytesсколько это байтов (по умолчанию 1)
bit /bitsодин бит или включающий диапазон, например [0, 1] этого байта
descriptionЗначение параметра становится названием штата (обязательно, если не указано иное). flags (дано)
flagsодно имя на каждый бит байта. null Чтобы ненадолго пропустить этот момент — каждое имя становится отдельным штатом.
valuesимена для чисел, которые может содержать поле, в виде списка или объекта, например { "4": "Water" }
unitединица государства
legacyNameтот VIF_… часть идентификатора штата, см. ниже.
storageNo, tariffотменяют то, что указано в записи, из которой они пришли.

Приведенная выше таблица представляет собой сводку. Каждое поле, которое может содержать описание, и то, как каждое из них влияет на значение, документировано в самом парсере: wireless-mbus-parser, "Описание объекта вместо его декодирования"

  • Та же ссылка находится под редактором во вкладке. «Вставить пример» вставляет в редактор описание несуществующего счетчика, содержащее по одному полю каждого типа. Это самый быстрый способ начать: заменить его. XXX с кодом производителя вашего счетчика.

Если производитель использует несколько типов данных, опишите каждый из них в виде схемы с указанием типов устройств и VIF-кода, к которому он относится — первый соответствующий код декодирует данные:

{ "ACM": [{ "deviceType": 7, "fields": [ ... ] }, { "deviceType": [4, 12], "fields": [ ... ] }] }

Описания редактируются в JSON-редакторе вкладки, который выделяет их и отмечает синтаксическую ошибку во время ввода. К нему относятся две кнопки. Кнопка «Проверить описания» передает их парсеру и сообщает, что тот с ними делает, с точным указанием ошибки для отклоненного варианта («бит 9 находится за пределами поля в байте 0»). Кнопка «Декодировать с помощью описаний» принимает телеграмму в шестнадцатеричном формате — например, из журнала отладки — и перечисляет все состояния, которые она бы записала в таблицу, так что описание можно попробовать перед сохранением. Ни одна из кнопок ничего не записывает.

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

Стоит знать две вещи:

  • Идентификатор штата определяется на основе описания его поля , поэтому "description": "Battery" становится …-VIF_BATTERY. Таким образом, исправление опечатки в описании приводит к переименованию штата. legacyName Эта часть идентификатора устанавливается напрямую и остается стабильной, что стоит делать для каждого значения, которое вы собираетесь сохранить.
  • Описание заменяет собой то, которое поставляется парсером для данного производителя, а не добавляет к нему что-либо новое. Описание одного параметра дымового извещателя Itron означает, что остальные 25 параметров больше не будут записаны.

Варианты Telegram

Большинство счетчиков отправляют телеграммы с одним вариантом компоновки. Некоторые время от времени отправляют и второй вариант — значения за последний расчетный период или данные настройки, — а некоторые чередуют несколько вариантов. Адаптер считает каждый вариант компоновки устройства как вариант, названный по контрольной сумме заголовков его записей (например, 3A7F Полная и компактная телеграммы макета представляют собой один и тот же вариант. Полученная информация сохраняется вместе с объектом устройства, поэтому она сохраняется после перезапуска; счетчики записываются не чаще одного раза в час, и новый вариант записывается немедленно.

Вкладка «Варианты Telegram» отображает их: «Показать варианты Telegram» перечисляет все варианты каждого устройства с указанием типа кадров, количества увиденных телеграмм, времени первого и последнего увиденного события, а также состояний, в которые записываются его записи. Ни один из вариантов не рассматривается как лучший — значение каждого из них относится к состоянию его собственной записи. Если вы вообще не хотите видеть значения варианта, введите адрес устройства и вариант в список игнорируемых вариантов Telegram: его телеграммы отбрасываются после декодирования, но всё равно учитываются в таблице. Адрес устройства — полный, с кодом производителя (LSE-58511882, нет 58511882 В начале журнала это указано для строки, которая никогда не сможет совпасть.

Обновление с версии 0.11.x

В версии 0.12.0 встроенный парсер Telegram заменен библиотекой wireless-mbus-parser . Идентификаторы объектов остаются прежними, но меняются четыре вещи:

  • Измеренные значения теперь представляют собой числа , а не предварительно отформатированный текст. "474.240" стал 474.24 Штаты всегда были определенного типа. mixed Таким образом, сам ioBroker не возражает, но бэкэнд истории, хранящий данные в текстовом формате, — нет: InfluxDB отклоняет числовые значения для поля, содержащего строки, а SQL-адаптер хранит один тип данных для каждой точки данных, поэтому эти серии начинаются заново. После обновления просмотрите лог вашего адаптера истории и решите для каждой серии, следует ли удалить старые данные или сохранить их рядом с новыми.
  • Необходимо обратить внимание на скрипты и визуализации, которые сравнивают или форматируют этот текст : state.val === '474.240' Теперь данные не совпадают, и виджет, который использовал фиксированное количество десятичных знаков, отображает простое число.
  • Данные о тарифе и устройстве были считаны из неправильных битов , теперь они корректны, поэтому названия состояний счетчика с несколькими тарифами меняются. Их идентификаторы остаются неизменными.
  • Зарезервированные и неизвестные VIF-файлы могут иметь разные имена в библиотеке, поэтому некоторые необычные значения счетчиков отображаются под новым идентификатором. Старые значения остаются и могут быть удалены — все остальное записывается как прежде.

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

Измерительные приборы Techem and Diehl (PRIOS)

В версии 0.12.0 были допущены две ошибки: распределитель затрат на отопление Techem выдавал бессмысленные данные под такими названиями, как... VIF_RETURN_TEMP Счетчик тепла Techem вообще не считывался и попал в список автоматической блокировки, а счетчик воды PRIOS показал свой объем в единицах стоимости тепла. Версия 0.12.1 снова считывает их корректно — созданные для них в версии 0.12.0 состояния сохраняются и могут быть удалены, а правильные записываются в следующей телеграмме.

Два из их состояний названы иначе, чем в версии 0.11.x, поскольку значения предыдущего периода теперь содержат номер хранилища, к которому они относятся. 1-1-… скорее, чем 1-0-…), а оставшийся срок службы батареи счетчика PRIOS указывается в месяцах, а не в годах.

Список дел

  • Отправка телеграмм для приемников в режиме S?
  • Обработка данных со счетчиков с помощью "множественных телеграмм"

Changelog

WORK IN PROGRESS

  • (ChL) Every data state remembers the data record it was created for, and a value of a different record at the same position of a telegram is skipped instead of being written to it
  • (ChL) Name, unit and role of the data states follow the decoded telegram as long as nobody changed them; names you gave a state and states of earlier versions stay as they are, and the new option "Overwrite name, unit and role of the data states" sets them all back
  • (ChL) Fix the states of data records that a device did not have in its first telegram after a start of the adapter: they were written without being created
  • (ChL) Fix states, and devices, that were deleted in the object tree while the adapter was running: they were written without an object until the next start, and are created again by the next telegram now
  • (ChL) Count the telegram variants of every device - the layouts of data records a meter sends - and show them in the new "Telegram variants" tab of the admin UI
  • (ChL) Telegram variants can be ignored per device, so that the values of a layout nobody wants are not written; the log says at the start which entries of the list can never match

0.13.1 (2026-09-22)

  • (ChL) Convert the adapter to TypeScript
  • (ChL) Fix the "Simple Hexstring" receiver rejecting a telegram that carries its block CRCs without announcing them with a leading "Z": the parser is left to look for them rather than being told there are none, which made it read the first CRC byte as the CI field (#276)
  • (ChL) The "Simple Hexstring" receiver drops a line that is no telegram instead of turning it into one, takes a lower case "z" as the CRC marker as well, and reports the frame type of the configured mode again
  • (ChL) Fix the instance reporting the connection of the receiver as its connection to the ioBroker databases: a receiver that was away showed an instance as disconnected that was talking to them, and a connected one kept js-controller from stopping an adapter that had lost the states database

0.13.0 (2026-09-09)

  • (ChL) Describe the manufacturer specific data records of a meter in the admin UI, the result become states of their own
  • (ChL) Update wireless-mbus-parser to 1.5.0: support for decoding manufacturer specific blobs - description for Itron smoke detector included.

0.12.3 (2026-09-07)

  • (ChL) Fix the CUL initialisation on the receivers that lose the first byte written after the line has been idle: every command is now sent with a separator in front of it, which is what gets lost instead of the command letter, and setting the mode waits for its confirmation rather than failing on a line that crossed it (#312)

0.12.2 (2026-09-05)

  • (ChL) Add an option to only handle devices that already have an object tree, so that no new devices are created and no telegram of a device without one is reported
  • (ChL) Remember the record layout of a device, so that its compact telegrams are decoded right after a restart of the adapter
  • (ChL) Update wireless-mbus-parser to 1.3.1, which fixes the date of the current reading of a Techem meter - it used to be stamped with the year it was decoded in rather than with the year of the meter
  • (ChL) Report at the log level the message deserves: a receiver that stays away no longer writes an error with every attempt, what the hardware says about itself is a warning, and the noise of the air is debug

0.12.1 (2026-09-05)

  • (ChL) Fix Techem and Diehl (PRIOS) meters, which 0.12.0 decoded wrongly or not at all - the states it wrote for them carry wrong names and values and can be deleted
  • (ChL) Fix the adapter stopping instead of blocking a device whose telegrams keep failing to decode
  • (ChL) A 64 bit measured value with a scaling factor is a number now, like every other measured value

License

Copyright (c) 2019 ISFH - Institute for Solar Energy Research www.isfh.de
Copyright (c) 2021 - 2026 Christian Landvogt

Licensed under GPLv2. See LICENSE and NOTICE