Декодирование данных получаемых по шине KNX

Добрый день

Использую Wirenboard6 и ваш модуль KNX.
Не получается найти, как корректно декодировать данные полученные в GroupValueWrite в поле DATA.
Документация по KNX не помогла, там используется немного другое представление данных.

Также очень странно, что например при установке температуры в термостате 25 градусов, в DATA для нужной группы приходит 0x0d 0x05.
Меняем на 23 градуса, потом обратно на 25, в DATA приходит уже 0x0d 0x23
Понять закономерность не получается.

1 лайк

Здравствуйте. Извиняюсь за задержку с ответом. За общение с устройствами KNX отвечает программа knxd. За передачу данных из knxd в mqtt отвечает программа wb-mqtt-knx . Она тут только посредник и показывает то, что получает knxd от устройства KNX (в Вашем случае от термостата) . Тут я бы в первую очередь обратился к документации на термостат. Но можно исключить проблемы контроллера: Для того что бы разобраться правильные ли данные передает в топик программа wb-mqtt-knx предлагаю посмотреть что происходит на шине. Для этого воспользуйтесь утилитой KnxTool
На пример для мониторинга шины подойдет команда:
knxtool vbusmonitor1 local:/var/run/knx
Другие команды knxtool и примеры использования есть по ссылке выше.
Если данные, что приходят на шину те же, что попадают в топик - значит со стороны WB6 никаких проблем нет.

1 лайк

В KNX данные типа температура, влажность представляются двумя байтами. На питоне преобразование этих байтов в градусы выглядит так:

data = int(byte1) * 256 + int(byte2)
sign = data >> 15
exponent = (data >> 11) & 0x0f
mantisse = float(data & 0x7ff)
if sign == 1: mantisse = -2048 + mantisse
value = str(int(mantisse * pow(2, exponent) / 100))

Обратное преобразование из температуры в байты для KNX выглядит так

floatval = float(value) * 100
i = 0
for i in range(0, 15):
___exp = pow(2, i)
___if ((floatval / exp) >= -2048) and ((floatval / exp) < 2047):break
if floatval < 0:
___sign = 1
___mantisse = int(2048 + (floatval / exp))
else:
___sign = 0
___mantisse = int(floatval / exp)
byte1 = (sign << 7) + (i << 3) + (mantisse >> 8)
byte2 = (mantisse & 0xff)

Соответственно
0x0d 0x05 это 25
0x0d 0x23 это 26
23 будет 0x0c 0x7e

Добрый день,

@avlevakov, большое спасибо, преобразовать данные получилось.
Можете дать ссылку на документацию KNX или примеры на питоне (или других языков) по разбору любых типов данных, а не только температуры и влажности.

Мне интересно как вы отправляете 2byte в knx шину , как принимать я взял почти готовый скрипт и разобрался вот тут Передача температуры на WB с KNX Z35 - #7 от пользователя Nikita_Bogdanov

2byte из wb-rules пишутся в knx , проверил.
runShellCommand(‘knxtool groupwrite local:/var/run/knx 0/0/5 0x01 0x02’);

Взято сдесь: