(function() { var knx_vdev_obj = { title: "KNX Group Addresses", cells: { "0-0-3": { type: "switch", value: false }, "0-0-2": { type: "switch", value: true }, "0-0-5": { type: "switch", value: false }, "0-0-1": { type: "switch", value: false }, "0-2-5": { type: "range", max: 255, value: 0, knx_type: "wide" }, "1-6-0": { type: "range", max: 255, value: 0, knx_type: "wide" }, "4-1-0": { type: "switch", value: false }, "4-1-1": { type: "range", max: 255, value: 0, knx_type: "wide" }, } }; 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; log("knx vdev rule {} {} {} {}", newValue, devName, cellName, value); 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; } if (value < 1) { var rem1 = value % 256; value = Math.floor(value / 256); write_str = rem1 + " " + write_str; dev["knx/data"] = "g:{} GroupValueWrite {}".format(group_address, 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] == "1/1/255")) { // skip local echo return; } log("knx vdev incoming rule {}", newValue); 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; };