node-red-contrib-knx-ultimate
Version:
Control your KNX intallation via Node-Red! Single Node KNX IN/OUT with optional ETS group address importer. Easy to use and highly configurable.
218 lines (148 loc) • 5.81 kB
JavaScript
const KNXClient = require("./KNXClient");
const KNXAddress = require("./protocol/KNXAddress").KNXAddress;
const DPTLib = require('./dptlib');
const KNXDataBuffer = require("./protocol/KNXDataBuffer").KNXDataBuffer;
// Create tunnel socket with source knx address 1.1.100
const optionsDefaults = {
physAddr: '15.15.21',
connectionKeepAliveTimeout: 60,
//ipAddr: "224.0.23.12",
//hostProtocol: "Multicast", // TunnelUDP, TunnelTCP, Multicast
//isSecureKNXEnabled: false,
ipAddr: "192.168.1.15",
hostProtocol: "TunnelUDP", // TunnelUDP, TunnelTCP, Multicast
isSecureKNXEnabled: false,
//ipAddr: "192.168.1.54",
//hostProtocol: "TunnelTCP", // TunnelUDP, TunnelTCP, Multicast
//isSecureKNXEnabled: true,
ipPort: 3671,
suppress_ack_ldatareq: false,
loglevel: "info",
localEchoInTunneling: true,
//localIPAddress: "", // Riempito da KNXEngine
interface: "" // en3
};
const knxClient = new KNXClient.KNXClient(optionsDefaults);
knxClient.on(KNXClient.KNXClientEvents.error, err => {
console.log("BANANA ERRORE", err);
});
// Call discoverCB when a knx gateway has been discovered.
knxClient.on(KNXClient.KNXClientEvents.discover, info => {
const [ip, port] = info.split(":");
discoverCB(ip, port);
});
knxClient.on(KNXClient.KNXClientEvents.disconnected, info => {
console.log("BANANA DISCONNESSO", info);
});
knxClient.on(KNXClient.KNXClientEvents.close, info => {
console.log("BANANA CHIUSO", info);
});
knxClient.on(KNXClient.KNXClientEvents.connected, info => {
console.log("CONNESSO CON CHANNEL ID ", knxClient.channelID);
});
knxClient.on(KNXClient.KNXClientEvents.connecting, info => {
console.log("CONNECTING ", info);
});
// start auto discovery on interface with ip 192.168.1.99
//knxClient.startDiscovery("192.168.1.157");
const wait = (t = 3000) => {
return new Promise(resolve => {
setTimeout(() => { resolve(); }, t);
});
};
const handleBusEvent = function (_datagram, _echoed, rawCEMISocketMessage) {
//console.log(`${srcAddress.toString()} -> ${dstAddress.toString()} :`, npdu.dataValue);
try {
var dpt = DPTLib.resolve("DPT1.001");
var jsvalue = DPTLib.fromBuffer(_datagram.cEMIMessage.npdu.dataValue, dpt)
} catch (error) {
console.log(error);
}
let sType = "";
if (_datagram.cEMIMessage.npdu.isGroupRead) sType = "GroupValue_Read";
if (_datagram.cEMIMessage.npdu.isGroupResponse) sType = "GroupValue_Response";
if (_datagram.cEMIMessage.npdu.isGroupWrite) sType = "GroupValue_Write";
let srcAddress = _datagram.cEMIMessage.srcAddress.toString();
let dstAddress = _datagram.cEMIMessage.dstAddress.toString();
let isRepeated = _datagram.cEMIMessage.control.repeat === 1 ? false : true;
// 23/03/2021 Supergiovane: Added the CEMI telegram for ETS Diagnostic
// #####################################################################
let cemiETS = "";
if (rawCEMISocketMessage !== undefined) {
try {
var iStart = _datagram._header._headerLength + 4;
cemiETS = rawCEMISocketMessage.toString("hex").substring(iStart * 2);
} catch (error) { cemiETS = ""; }
}
// #####################################################################
console.log("BANANA", srcAddress, dstAddress, jsvalue, "Echoed", _echoed, "Type", sType, "Repeat", isRepeated, "cemiETS", cemiETS)
};
try {
console.log("INIZIO CONNESSIONE")
knxClient.Connect();
} catch (error) {
console.log("ORRORE CONNESSIONE",error);
return;
}
knxClient.on(KNXClient.KNXClientEvents.indication, handleBusEvent);
setTimeout(() => {
try {
console.log("ACCENDEO")
knxClient.write("0/1/1", true, "DPT1.001");
} catch (error) {
console.log("ORRORE", error)
}
}, 5000);
setTimeout(() => {
//grpaddr, value, bitlength
// Write raw buffer to a groupaddress with dpt 1 (e.g light on = value true = Buffer<01>) with a bitlength of 1
let writeraw = Buffer.from('01', 'hex'); // Put '00' instead of '01' to switch off the light.
let bitlenght = 1;
try {
console.log("RAWEO", writeraw);
knxClient.writeRaw("0/1/1", writeraw, bitlenght);
} catch (error) {
console.log("ORRORE", error)
}
}, 8000);
setTimeout(() => {
console.log("DISCONNETTO");
knxClient.Disconnect();
}, 10000);
setTimeout(() => {
console.log("CONNETTO");
knxClient.Connect();
}, 12000);
// setInterval(() => {
// try {
// let adpu = {};
// let knxDataBuff
// let addr
// adpu = DPTLib.populateAPDU(false, adpu, "DPT1.001");
// knxDataBuff = new KNXDataBuffer(adpu.data)
// addr = KNXAddress.createFromString("0/1/1", KNXAddress.TYPE_GROUP); // 257
// console.log("BANANA SOENGO)")
// knxEngine.writeAsync(addr, knxDataBuff);
// } catch (error) {
// console.log("ORRORE", error)
// }
// }, 3000);
// setTimeout(() => {
// knxClient.readAsync(addr);
// }, 10000);
// setTimeout(() => {
// knxClient.respondAsync(addr, knxDataBuff);
// }, 5000);
// Actions to perform when a KNX gateway has been discovered.
const discoverCB = (ip, port) => {
// console.log("Connecting to ", ip, port);
// // Connect to the knx gateway on ip:port
// knxClient.connectAsync(ip, port)
// .then(() => {
// console.log("Connected through channel id ", knxClient.channelID);
// var dpt = DPTLib.resolve("DPT1.001");
// let adpu = {};
// console.log("SENT", DPTLib.populateAPDU(false, adpu, dpt))
// //knxClient.sendWriteRequest("15.15.0", "0/1/1", DPTLib.populateAPDU(false, "", dpt));
// });
};