Перестали идти куда? В топик knx пишется? Или не доходит до него в проверке условия? Подпишитесь на топик, посмотрите.
Возможно два пути - формирование телеграмм по иземенению виртуальных устройств или сразу из правил без виртуальных, особенно если не нужна обратная связь.
С моей точки зрения - через виртуальные вернее.
Тут надо исключить свои, клентские адреса knxd, которые принадлежат контроллеру.
Какие они?
А что именно передаете, какой тип значение? Ну если строку, например пытаться сконвертировать - да, будет на выходе булев.
Как и писал выше - с клиентских адресов контроллера.
Я предлагаю для начала просто создать тестовый скрипт, с одним правилом и проверить на нем.
что значит “подписаться на топик” как это сделать?
Передавал напряжение с счетчика, передавал температуру проца самого WB.
Почему всегда с разных? не встречал в KNX что одна физ. железка с разных адресов швыряла. Взять тот же LM есть один ее физ. адрес она по нему с шиной и работает…
ок. Создаю первый скрипт knx-main.js
(function() {
var knx_vdev_obj = {
title: "KNX Group Addresses",
cells: {
"15-1-1": {
type: "voltage",
value: 250.333
}
}
};
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] == "5/10/")) { // 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;
};
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;
};
и второй knx-test.js
(function() {
defineRule("hdl_panel_set_temp", {
whenChanged: "wb-map12e_67/Urms L1",
then: function(newValue, devName, cellName) {
dev["knx_group_addrs/15-1-1"] = knxConvertToFloat16(newValue + 2); // Передаем на KNX панельку температуру с датчика DS18B20
log.info("Температура", newValue);
}
});
})();
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;
};
Посмотртте (выведите в лог) тип переменной. Если строка - ее нельзя конвертировать наприямую в функции предназначенной для работы с числами.
Ну и для float надо указать knx_type: “wide” в описании поля.
я запутался… как в логе вывести тип данных не нагуглил.
Но зачем вы пишите “если так” - вы же писали инструкцию, и наверняка знаете каким типом передаются данные и если по моим сообщениям видно что проблема в типах данных, то помогите плиз как преобразовать или правильно передать данные. knx_type: “wide” я пробовал изменений нет…
может anydesk? завтра что бы разом закрыть вопросы по SNMP и KNX это решающие факторы по которым мы определимся для себя в использовании ваших контроллеров на наших объектах.
У нас кстати скоро (через неделю или две) выйдет бета-версия совершенно нового драйвера для KNX, в котором работа с типами данных будет сильно удобнее. Я бы дождался её.
Это хорошая новость! Но хотя бы в аспекте некоторых задач которые сейчас есть, хотелось бы достигнуть результатов.
Если резюмировать моменты которые сейчас есть то это: назначение правильного типа данных (нужного) для передачи в knx из knx. И решить вопрос по SNMP можно ли и какие использовать oid для того что бы были другие типы данных.
добавлю еще одну из важных хотелок: нужна функция которая позволит мониторить наличие устройства на шине KNX. т.е. производить опрос на наличие устройства в шине по физ. адресу.
понимаю, я это написал как одна из самых распространенных обсуждаемых тем. и на данный момент это без особых сложностей можно делать на LM. хотелось бы что бы и у Вас это было. В принципе если нужно то я могу рассказать и показать как связь с шиной KNX реализована на LM и как с ней там работать. у них там все сделано очень грамотно и удобно. минимум скриптов, настраивается все выбором полей и в скрипте просто логика.