node-red-contrib-symi
Version:
Node-RED nodes for smart home device communication with Home Assistant integration, supporting HassKit, Clowire, Alive, LF and complete Symi protocols
72 lines (61 loc) • 1.6 kB
JavaScript
/**
* HassKit协议处理器
* 支持气候控制和开关设备
*/
const crc16 = function (data) {
let tmp = 0
for (let i of data) {
tmp += i
}
return tmp & 0xff
}
const DATA_LENGTH = 8
const fns = {
switch: require('./hasskit/Switch'),
climate: require('./hasskit/Climate')
}
module.exports = {
/**
* 收到tcp数据预处理
* @param {Buffer} data
*/
handleRece: function (data) {
// 大于8个字节超出hasskit数据帧取后8位,小于8位无效丢弃
if (data.length > DATA_LENGTH) {
data = data.slice(-DATA_LENGTH)
} else if (data.length < DATA_LENGTH) {
return
}
if (data[0] !== 0xb2 || data[DATA_LENGTH - 1] !== 0x2b)
return
var crc = crc16(data.slice(1, -2));
if (data[DATA_LENGTH - 2] === crc) {
return data
}
return
},
/**
* 处理写入数据
* @param {Buffer|Array} buf
*/
handle_write: function (buf) {
let data = Buffer.from(buf)
if (data.length < DATA_LENGTH) return
data[6] = crc16(data.slice(1, -2))
return data
},
/**
* 获取对象转缓冲区函数
* @param {string} domain
*/
getObjToBuf: function (domain) {
return fns[domain] ? fns[domain].obj2buf : null
},
/**
* 获取缓冲区转对象函数
* @param {string} domain
*/
getBufToObj: function (domain) {
return fns[domain] ? fns[domain].buf2obj : null
}
};