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