У меня бесконечно срач в шину
Кто источник? Содержание телеграм? Логи?
источником был 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.там будет более привычно.
//"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 не реагирует и ползунок не перемещается.
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
Источник - контроллер.