Skip to content

Instantly share code, notes, and snippets.

@Yanni66
Created March 5, 2018 15:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Yanni66/bc7604bb8646d52c9c864b4ca40c63b6 to your computer and use it in GitHub Desktop.
Save Yanni66/bc7604bb8646d52c9c864b4ca40c63b6 to your computer and use it in GitHub Desktop.
(function() {
var knx_vdev_obj = {
title: "KNX Group Addresses",
cells: {
"2-2-1": {
type: "switch",
value: false
},
"2-2-2": {
type: "switch",
value: false
},
"0-0-6": {
type: "pushbutton",
value: false
},
"1-1-16": {
type: "value",
value: 0,
knx_type: "wide"
},
"1-1-9": {
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;
}
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;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment