2
0
Files
node-red-contrib-mi-devices/dist/devices/gateway/Gateway.js
2018-03-21 23:29:36 +01:00

114 lines
3.5 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const events = require("events");
const crypto = require("crypto");
const GatewayServer_1 = require("./GatewayServer");
const _1 = require("./");
const Color_1 = require("../../utils/Color");
class Gateway extends events.EventEmitter {
constructor(sid, ip) {
super();
this.sid = sid;
this.ip = ip;
this._subdevices = {};
}
set password(password) {
this._password = password;
}
get key() {
if (!this.lastToken || !this._password)
return null;
var cipher = crypto.createCipheriv('aes-128-cbc', this._password, Gateway.iv);
var key = cipher.update(Buffer.from(this.lastToken), "ascii", "hex");
cipher.final('hex');
return key;
}
handleMessage(msg) {
if (msg.data) {
if (msg.model === "gateway" && msg.sid === this.sid && msg.token) {
this.lastToken = msg.token;
}
}
if (msg.isGetIdListAck()) {
msg.data.forEach((sid) => {
this.read(sid);
});
}
if (msg.isReadAck() || msg.isReport()) {
if (!this._subdevices[msg.sid]) {
for (let SubDeviceClass of [_1.Magnet, _1.Motion, _1.Switch, _1.Weather]) {
if (SubDeviceClass.acceptedModels.indexOf(msg.model) >= 0) {
this._subdevices[msg.sid] = new SubDeviceClass(msg.sid, msg.model);
this._subdevices[msg.sid].on('values-updated', (sidOrMessage) => {
this.emit("subdevice-values-updated", sidOrMessage);
});
this.emit("subdevice-found", msg.sid);
}
}
}
if (this._subdevices[msg.sid]) {
this._subdevices[msg.sid].handleMessage(msg);
}
}
}
getSubdevice(sid) {
return this._subdevices[sid] || null;
}
hasSubdevice(sid) {
return !!this._subdevices[sid];
}
getIdList() {
this.send({
cmd: "get_id_list",
});
}
read(sid) {
this.send({ cmd: "read", sid: sid || this.sid });
}
setLight(brightness, rgb) {
this.send({
cmd: "write",
data: {
rgb: Color_1.Color.toValue(rgb.red, rgb.green, rgb.blue, brightness),
sid: this.sid
}
});
}
playSound(musicId, volume) {
this.send({
cmd: "write",
data: {
mid: musicId,
volume: volume,
sid: this.sid
}
});
}
send(message) {
let msg = Object.assign({}, message.payload || message);
if (msg.cmd) {
msg.sid = message.sid || this.sid;
if (msg.gateway) {
delete msg.gateway;
}
if (msg.cmd === "write") {
msg.data.key = this.key;
}
GatewayServer_1.GatewayServer.getInstance().sendToGateway(this.sid, msg);
}
}
get subdevices() {
return this._subdevices;
}
toJSON() {
return {
sid: this.sid,
ip: this.ip,
key: this.password,
subdevices: this.subdevices
};
}
}
Gateway.iv = Buffer.from([0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58, 0x56, 0x2e]);
exports.Gateway = Gateway;