Knx

У меня бесконечно срач в шину

Кто источник? Содержание телеграм? Логи?

источником был wirenboard с разными адресами диапазона который я установил. Содержание это это циклическая отправка 1 / 0 в гр. адрес с свитчевым объектом. Логи не предоставлю т.к. сразу убил процесс, почистил логи в ETS и хотел повторить, не удалось. Скажу только то что в вебморде Wirenda в этот момент выключатель тоже переключался туда сюда.

P.S. почему нет обратки от 1byte объекта? т.е. отправка работает а фидбэк Wirend почему то не видит…

удалось таки повторить. нажал на выключателе и понеслось (выключатель на KNX шине). т.е. он изменил статус фидбэка, и wirendboard начал циклично слать.


(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-1-2": {
                type: "switch",
                value: false,
              	readonly: false
            },
            "15-1-1": {
                type: "voltage",
                value: 250.333,
                knx_type: "wide",
              	readonly: false
            },
          	"15-1-3": {
                type: "voltage",
                value: 250.333,
                knx_type: "voltage",
              	readonly: false
            },
          	"15-1-15": {
                type: "temperature",
                scale: 0.1,
                value: 0,
              	readonly: false
            },
          	"6-1-2": {
                type: "switch",
                value: false,
              	readonly: false
            },
          	"6-1-5": {
                type: "switch",
                value: false,
              	readonly : true
            },
          	"6-1-4": {
                type: "range",
                max: 255,
                value: 0,
                knx_type: "wide",
              	readonly: false
            },
          	"6-1-6": {
                type: "range",
                max: 255,
                value: 0,
                knx_type: "wide",
              	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;
};

Вот сюда надо указать клиентский адрес. У вас же явно 5.10.200
То есть надо указать адрес отправилеля, чтобы не обрабатывать свои же телеграммы.

простите за мою тупость. но я не вкурю каким видом…???

//"Staic" part address, NUMBER
  var LocalADDR0 = 5.10.200;
  var LocalADDR1 = 5.10.200;
    //"Dynamic" range address, number
  var LocalADDR2=92
  var LocalADDR2count=8

Просто мне даже как KNX программисту который занимается больше 10 лет KNX, не понятно что тут “на мудрено”…

Я привык что контроллеру/устройству прописал один адрес и все он работает в шине… тут же адрес, диапазон, потом укажи адрес что бы свои же телеграммы…

 //"Staic" part address, NUMBER
  var LocalADDR0 = 5;
  var LocalADDR1 = 10;
    //"Dynamic" range address, number
  var LocalADDR2=200
  var LocalADDR2count=30

То есть адрес (диапазон адресов) разбиваем “по точкам” - и указываем.
LocalADDR2count=30 - это количество адресов выделяеое KNX под локальные.
Покажите с камими параметрами запускается knxd - напишу точно как менять скрипт.

На неделе планируется выпуск доработанного KNXD.там будет более привычно.

image

//"Staic" part address, NUMBER
  var LocalADDR0 = 5;
  var LocalADDR1 = 10;
    //"Dynamic" range address, number
  var LocalADDR2=205
  var LocalADDR2count=3

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

нет, был диапазон 10 вроде. я изменил на 3 т.к. не понимаю зачем вообще давать ей этот диапазон… по хорошему поставить 1 и все.) точнее я понимаю что, Wirend’у так проще и быстрее общаться с шиной… но это лишнее мне кажется.

кстати фидбэка с диммера так и нет)

},
          	"6-1-4": {
                type: "range",
                max: 255,
                value: 0,
                knx_type: "wide",
              	readonly: false
            },
          	"6-1-6": {
                type: "range",
                max: 255,
                value: 0,
                knx_type: "wide",
              	readonly : true
            }

6-1-4 это команда… но только странно что она полный дипазон выдает только с 0-255 а не 0-100, но это понятно что наверное с “типами” данных почините.

но вот 6-1-6 это статус диммера, устройство в шину шлет но wirend не реагирует и ползунок не перемещается.

image

ETS получает из того же диапазона адрес, так как тоже “клиент”.

Так, покажите телеграммы, подпиской на топик, на которые должно реагировать?

Я не вижу тут телеграмму.
Покажите что в топик knx приходит.
Ну и можно ж просто текстом, не картинками.
Ну и в скрипте включите лог - чтобы видеть что пришло

вижу только в KNX шине, устройство отдало свою текущую яркость (это видно на скрине)

судя по команде mosquitto_sub -t '/devices/knx4_group_addrs/controls/6-1-6' -v и ответе “0” то ничего…

ок

var dimmerValue = "knx4_group_addrs/6-1-6";


defineRule("dimmer", { //название правила 

  whenChanged: dimmerValue, //при изменении указанного значения
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("DimmerValue ", newValue); //Это лог.
  }
    	
});

тишина…

Это топик виртуального устройства, я про knx топик, то есть /devices/knx/controls/data

Switch объект то показывает, если вкл то и статус переключается…

root@wirenboard-A5IILD2Q:~# mosquitto_sub -t '/devices/knx/controls/data' -v
/devices/knx/controls/data i:5/10/20 g:6/1/4 GroupValueWrite 0x33
/devices/knx/controls/data i:5/10/102 g:6/1/6 GroupValueWrite 0x33
/devices/knx/controls/data i:5/10/20 g:6/1/4 GroupValueWrite 0x80
/devices/knx/controls/data i:5/10/102 g:6/1/6 GroupValueWrite 0x80
/devices/knx/controls/data i:5/10/20 g:6/1/4 GroupValueWrite 0xff
/devices/knx/controls/data i:5/10/102 g:6/1/6 GroupValueWrite 0xff


Источник - контроллер.