Knx

Пока можно сделать так:
Явно задать групповые адреса из диапазона 6.x.x например.
в скрипте заменить строку 215 на

if ((sourceAddr[1] == "0/0/0") || (sourceAddr[1].substring(0, 4) == "1/1/")) { // skip local echo

где константа “1/1/” - это часть адреса с которым сам контроллер отправляет телеграммы*.

Второй вариант - поменять адреса “клиентов” (параметр -E) на 6.1.2:4
и строку соответственно на

if ((sourceAddr[1] == "0/0/0") || (sourceAddr[1].substring(0, 4) == "6/0/")) { // skip local echo

А можно получить комментарий по решению? не совсем понимаю, что это даст. И какой из вариантов лучше?

решение позволит контроллеру не раегировать на отправленные им же телеграммы (подавить локальное эхо). Цель - не реагировать на телеграммы в которых адрес источника - свой же, локальный. Адреса “источника” - задаются параметром -E knxd.

А какой из вариантов выбирать? Или они равнозначны?

Это где задать? EIB address (-e, --eibaddr) ?
Второе решение не помогло. Адрес статуса “мечется” как ненормальный туда-сюда.

В общем равнозначны, первый - ультимативный.

А как раз для того чтобы не учитывать “меняющуюся” часть -

она задается только старшими разрядами. Покажите текущую конфигурацию?

(function() {
    var knx_vdev_obj = {
        title: "KNX Group Addresses",
        cells: {
            "1-0-31": {
                type: "switch",
                value: false
            },
            "1-2-32": {
                type: "value",
                value: "0"
            },
            "2-0-31": {
                type: "switch",
                value: false,
                readonly : true
            },
            "2-2-32": {
                type: "value",
                value: "0",
                readonly : true
            },
            "1-0-5": {
                type: "switch",
                value: false
            },
            "2-0-4": {
                type: "switch",
                value: false,
                readonly : true
            },
            "2-0-5": {
                type: "switch",
                value: false
            },
            "4-2-0": {
                type: "temperature",
                scale: 0.1,
                value: 0
            },
            "5-0-0": {
                type: "temperature",
                scale: 0.1,
                value: 0
            },
            "5-0-1": {
                type: "concentration",
                value: 0
            },
            "5-0-2": {
                type: "concentration",
                scale: 1,
                value: 0
            },
            "1-1-10": {
               type: "switch",
                value: false
            },
            "1-1-11": {
                type: "switch",
                value: false,
            },
            "2-1-10": {
                type: "value",
                value: "0"
            }
        }
    };

// в
    var vdev_when_changed = [];
    var vdev_devid = "knx_group_addrs";

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

    defineVirtualDevice(vdev_devid, knx_vdev_obj);

    defineRule("knx_vdev_feedback", {
        whenChanged: vdev_when_changed,
        then: function(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\:|\,/);
            var groupAddr = arr[1].split(/g\:|\,/);
            var arr1 = newValue.split(/GroupValueWrite/);
            var value = arr1[1];
            if ((sourceAddr[1] == "0/0/0") || (sourceAddr[1].substring(0, 4) == "6/0/")) { // skip local echo
                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;
};

У вас сейчас “клиентские” адреса заданы как 6.1.2:4 а в скрипте

То есть в проверку не попадают. Замените “0” на “1” в скрипте.

так как надо? я вас не пойму? в скриптах не селен, от слова совсем. Скажите какие настройки выставить, что бы работало

Заменил, теперь выглядит так:
if ((sourceAddr[1] == "0/0/0") || (sourceAddr[1].substring(0, 4) == "6/1/")) { // skip local echo
Статус теперь не меняется совсем.

И не диммируется. Добавил такой объект:

"1-2-32": {
                type: "range",
                max: 100,
                value: 0

Сработало только один раз (установить на 63%), теперь на все изменения устанавливает только “ТО” значение (63%). При изменении ползунка, в ETS прилетают какие-то рандомные значения, ставлю 18, прилетает 11,
59 - 23,
79 - 6,
67 - 1,
57 - 22,
93 - 11
я могу долго проверять, но логику пока не вижу.
заметил логику. Каждые 10 пунктов в WB отправляют в шину изменение значения на 4
20-8
30-12
40-16
50-20
но только до 60. с 65 - прилетает 0
70-2
80-6
90-10
100-14
Кстати, статус адреса, каким-то образом начал работать. Который за свич отвечает 2-0-31

Не рандомные, просто для диммирования нужен формат в 2 байта.
как раз сейчас немного переписываю “базовый” скрипт.

Когда можно ждать переписанный “базовый” скрипт?

Добрый день. В общем я добавляю в основном “типы”, Думаю завтра.

1 лайк

доброго утра! что то пошло не так?

Недоделал пока, но в процессе.

Доработано правило knx_vdev_incoming
Ну и строки 2-9 добавлены. Обязательно надо указать адрес(а) клиентские. Попробуйте.

(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: {
            "1-1-55": {
                type: "voltage",
                value: 250.333,
                readonly: false
            },
            "1-1-90": {
                type: "switch",
                value: false,
                readonly: false
            },
            "1-1-65": {
                type: "switch",
                value: false,
                readonly: false
            },
            "1-1-30": {
                type: "range",
              	max: 230,
                value: 220,
                readonly: false
            },
            "1-1-31": {
                type: "range",
              	max: 230,
                value: 220,
                readonly: false,
                knx_type: "wide"
            }
        }
    };


    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;
};

не совсем понял что тут указывать? за что отвечает?

Значения из параметров kndxd.
те что в веб-интерфейсе называются “Client-addrs (-E, --client-addrs)”
Тут указаны
1.1.92:8