Проблема с KNX (нужно получать телеграммы из шины)

я готов

Ок, номер anydesk тот же?

Такое впечатление что к KNX подключна не шина а просто питание. То есть - пусто.
Давайте фото подключения шины все-таки.
Ну и можно для уверенности подключить в шину до какого-либо устройства.

Объект удаленный - попрошу кого-нибудь сфотографировать инсталляцию :slight_smile:

т.е. подоткнуть кабель до вайренборда между БП и первым устройством в шине?

Ну лучше в точку подключения существующего адаптера KNX.


Вот картинки подключения.

Знаю, что “витуха” - это не совсем то, что нужно, но между щитами менее 10 метров и правильный кабель проложить забыли.

На 10 метрах работать будет практически с любым.
А получится подключить тот де преобразователь вместе с этим кабелем, к контроллеру?

Тишина в шине в моем случае была из за того что неверно было соединение в БП (соединен выход питания а не BUS, но у вас вроде правильно). Рекомендую отключить все лишнее и использовать схему БП-Шлюз-первое ближайшее устройство, можно диагностировать доступ к устройству из ETS. Также Вы используете адреса из конца диапазона (пишете 32, в конфиге 31), хотя при вводе адреса 32 ETS выдает ошибку, рекомендую переопределить адреса в начало диапазона. Вполне возможно что в KNXD есть ошибка обработки адресов конца диапазона.

У Вас KNXd работает в multicast режиме, а в ETS идет соединение по IP tunneling, может поэтому тишина?

Как настроить правильно?

Гипотезу с адресами буду проверять завтра - поеду на объект.

По идее ETS сама найдет KNXd, надо перейти в раздел ETS - системная шина - интерфейсы. Вручную multicast роутеры не дает настроить. У шины KNX есть 3 типа адаптеров - USB, IP tunneling, IP multicast routing. По первому понятно, второй использует прямое TCP/IP соединение (в недорогих адаптерах позволяется до 4х одновременных соединений, 5е устройство не подключится, были прецеденты), 3е это KNX routers, самые дорогие, но менее проблемные, работают по широковещательной UDP рассылке дейтаграмм (KNX зарезервирован специальный адрес, начинается на 224, видно на скриншотах).

https://wirenboard.com/wiki/KNX_Quick_start

вот здесь, слайды Добавление интерфейса и Тест интерфейса, как раз там видно шлюз с адресом 224

1 лайк

и еще тут информация по настройке KNXd

https://wirenboard.com/wiki/Knxd#.D0.9D.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B9.D0.BA.D0.B0

доехал до объекта.
Подключил свой юсб-адаптер в шину прямо у WB

Т.е шина в порядке, данные есть. Как WB заставить их увидеть?

Остановите knxd и запустите его с параметрами по умолчанию. vbusmonitor1 - тоже не выдает ничего?

Тоже ничего.

А еще у меня есть WB на соседнем объекте с похожей конфигурацией. Там подоткнул KNX - и сразу данные пошли.

Что делать?

Неисправность knx модуля мы исключили. Пробуем сброс контроллера до заводского?

Какие-то чудеса. Взял и поменял KNX-модули местами. На том объекте, где сразу “включилось” (пусть для определенности будет “объект 2”) - с проблемным модулем тоже все завелось - данные вижу.

Заведомо исправный модуль воткнул в WB на проблемном объекте (“объект1”). Ситуация повторилась - тишина, ничего нет. Пошел дальше - снова разобрал WB и переставил модуль из 2 слота в 1 слот. Все параметры knxd установил по умолчанию. Переконфигурировал “железо” и внезапно увидел данные:

i:4/1/4 g:15/0/1 GroupValueWrite 0x0c 0xfd

Если я правильно читаю это, то тут телеграмма от устройства 4.1.4 в группу 15/0/1 - но тут уже несоответствие: физический адрес устройства правильный - это термостат, но вот вещает он в группу 31/0/1

Т.е. возможно, это какой-то “глюк” в конфигурации, хотя WB пришел с уже установленным и сконфигурированным модулем.

Это ситуация на “объекте1”

Сейчас смотрю, схожая ситуация и на “объекте2”:

i:5/1/2 g:12/3/1 GroupValueWrite 0x0c 0x7a - вот телеграмма…

Опять адрес правильный: 5.1.2 (датчик движения/освещенности/температуры), а вот групповой адрес должен быть 28/3/1

Похоже, что, модуль неправильно отрабатывает “старшие” групповые адреса.

И теперь вопрос, как мне все-таки вытащить данные?

Проекты KNX мне менять нельзя (там все уже отлажено и конфигурации раскатаны по объектам)

И еще, у меня эти две WB хотя и на разных объектах (физически), но находятся в одной сети. И я вижу сообщения шины из с объекта1 на WB объекта2 (и наоборот) - смотрю топики “/devices/knx/controls/data”. Похоже, в широковещательном режиме работают knxd и “всем, кто готов слушать, рассказывают”. Как отработать эту ситуацию? Оба knxd настроены праметрами по умолчанию.

Для разбора использую скрипт, который нашел тут же (в соседней ветке по KNX)

(function() {
  //From settings /etc/wb-knxd-config.conf
  //"Staic" part address, NUMBER
  var LocalADDR0 = 1;
  var LocalADDR1 = 1;
    //"Dynamic" range address, number
  var LocalADDR2=92
  var LocalADDR2count=8
  log.debug("Local address", LocalADDR0+"/"+LocalADDR0+"/"+LocalADDR2+":"+(LocalADDR2+LocalADDR2count));
  
    var knx_vdev_obj = {
        title: "KNX4 Group Addresses",
        cells: {
            "15-0-0": {
                type: "temperature",
                scale: 0.1,
                value: 0,
              	readonly: true
            },
            "31-0-1": {
                type: "temperature",
                scale: 0.1,
                value: 0,
              	readonly: true
            },
            "31-0-2": {
                type: "temperature",
                scale: 0.1,
                value: 0,
              	readonly: true
            },
            "31-1-0": {
                type: "temperature",
                scale: 0.1,
                value: 0,
              	readonly: true
            },
            "31-1-1": {
                type: "temperature",
                scale: 0.1,
                value: 0,
              	readonly: true
            },
            "31-1-2": {
                type: "temperature",
                scale: 0.1,
                value: 0,
              	readonly: true
            }
        }
    };


    var vdev_when_changed = [];
    var vdev_devid = "knx4_group_addrs";

    for (var control_id in knx_vdev_obj.cells) {
        if (knx_vdev_obj.cells.hasOwnProperty(control_id)) {
            vdev_when_changed.push("knx4_group_addrs/" + control_id);
        }
    }

    defineVirtualDevice(vdev_devid, knx_vdev_obj);

    defineRule("knx_vdev_feedback", {
        whenChanged: vdev_when_changed,
        then: function(newValue, devName, cellName) {
          log.info("vdev_when_changed", newValue, devName, cellName)
            var group_address = cellName.split("-").join("/");
            var value = +newValue;
            var write_str = "";


            if (knx_vdev_obj.cells[cellName].knx_type == "wide") {
                while (value > 0) {
                    var rem = value % 256;
                    value = Math.floor(value / 256);
                    write_str = rem + " " + write_str;
                }
                write_str = "0 " + write_str;
            } else {
                write_str = "" + value;
            }

            if (write_str) {
                dev["knx/data"] = "g:{} GroupValueWrite {}".format(group_address, write_str);
            }
        }
    });

     defineRule("knx_vdev_incoming", {
        whenChanged: "knx/data",
        then: function(newValue, devName, cellName) {
            var arr = newValue.split(/\s/);
            var sourceAddr = arr[0].split(/i\:|\,/);
            sourceAddr=sourceAddr[1].split("/") //Разбиваем адрес источника (отправителя) на элементы.
            var groupAddr = arr[1].split(/g\:|\,/);
            var arr1 = newValue.split(/GroupValueWrite/);
            var value = arr1[1];
            log.debug("** sourceAddr.length", sourceAddr.length, "sourceAddr", sourceAddr )
            //Если адрес источника нулевой или совпадает с адресом клиента
            if ((sourceAddr[0] == LocalADDR0)&(sourceAddr[1] == LocalADDR1) & (sourceAddr[2] >= LocalADDR2) & (sourceAddr[2] <= (LocalADDR2+LocalADDR2count)) ) { // skip local echo
              log.debug("Local echo from", sourceAddr[1], "scipped")
                return;
            }
            dev[vdev_devid][groupAddr[1].split("/").join("-")] = !!parseInt(value, 16);
        }
    });

})()



function knxConvertToFloat16(value) {
    var sign = 0;
    var exp = 0;
    if (value < 0) {
        sign = 1;
    }

    var mant = Math.floor(value * 100);
    while ((mant < -2048) || (mant > 2047)) {
        mant = mant >> 1;
        exp += 1
    }

    var data = (sign << 15) | (exp << 11) | (mant & 0x07ff);
    return data;
};

function convertfromKnx(value) {
var byte1 = "0x" + value[3] + value[4];
var byte2 = "0x" + value[8] + value[9];
var data = parseInt(byte1, 16) * 256 + parseInt(byte2, 16);
var sign = data >> 15;
var exponent = (data >> 11) & 0x0f;
var mantisse = data & 0x7ff;
if (sign) {
mantisse = -2048 + mantisse;
}
output = (mantisse * (Math.pow(2, exponent)) / 100);
return output;
};



групповые адреса пробовал записывать как они есть на самом деле (31-0-1 и т.п.) и так, как вижу их в телеграмме (15-0-0) - результат одинаковый. В значениях стоят нули и не меняются.