node-red-contrib-voice-assistant
Version:
一个小度-小爱-猫精音箱控制NODE-RED自定义设备的节点
133 lines (132 loc) • 5.28 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const baseService_1 = __importDefault(require("./baseService"));
const haClient_1 = __importDefault(require("../comm/haClient"));
class Halink extends baseService_1.default {
constructor(node, url, token) {
super(node.brokerConn);
this.node = node;
this.enDeviceData = node.devData || [];
this.devPrefix = node.brokerConn.username + '-ha-' + node.brokerConn.localmac + '-';
this.haClient = new haClient_1.default(url, token);
this.haClient.onMessage = this.onhaMessage.bind(this);
this.haDeviceCreated = false;
this.onStatus = this.onTcpStatus;
this.cloundStatus = '云服务未连接';
this.haStatus = 'HA未连接';
this.domains = ['light', 'switch', 'cover', 'climate', 'fan'];
}
//生成HA设备
createHaDevice() {
return __awaiter(this, void 0, void 0, function* () {
if (this.haDeviceCreated)
return; //已生成
yield new Promise((resolve) => setTimeout(resolve, 1000));
const { success, result } = (yield this.haClient.getStates());
//console.log('createHadevice',this.enDeviceData)
if (!success)
return; //获取设备失败;
result === null || result === void 0 ? void 0 : result.forEach((obj) => {
obj.domain = obj.entity_id.split('.')[0];
if (this.domains.indexOf(obj.domain) === -1)
return;
obj.name = obj.attributes.friendly_name;
obj.enable = false;
const o = this.enDeviceData.find((it) => it.id === obj.entity_id);
//console.log(o)
if (o) {
obj.name = o.name;
obj.enable = o.enable;
}
obj.id = this.devPrefix + obj.domain + '-' + this.models.length;
this.models.push(obj);
});
//console.log(this.models)
this.haDeviceCreated = true;
});
}
//ha消息
onhaMessage(data) {
if (data.connect) {
setTimeout(() => {
this.createHaDevice();
}, 1000);
}
this.onHaStatus(data);
}
resSetData(cmd) {
var _a;
if (((_a = cmd.id) === null || _a === void 0 ? void 0 : _a.split('-')[1]) !== 'ha')
return;
const callServiceData = this.handleAttribute.getCallServiceData(cmd);
if (!callServiceData)
return new Promise((resolve) => {
resolve({ status: -1 });
});
return this.haClient.callservice(callServiceData);
}
onHaStatus(data) {
const status = { fill: 'green', shape: 'dot', text: '' };
if (data.connect) {
this.haStatus = 'HA连接成功';
}
else if (data.err) {
status.fill = 'yellow';
if (data.err === 'HA断开连接' || data.err === 'HA认证失败')
status.fill = 'red';
this.haStatus = data.err;
}
else {
return this.statesChange(data);
}
status.text = this.cloundStatus + '-' + this.haStatus;
this.node.status(status);
}
statesChange(data) {
if (!data.data)
return;
if (!data.data.event)
return;
if (data.data.event.event_type !== 'state_changed')
return;
const state = data.data.event.data;
for (let i = 0; i < this.models.length; i++) {
if (this.models[i].entity_id === state.entity_id) {
this.models[i].state = state.new_state.state;
this.models[i].attributes = state.new_state.attributes;
break;
}
}
}
onTcpStatus(err, msg) {
const status = { fill: 'green', shape: 'dot', text: '' };
if (err) {
this.cloundStatus = err;
status.fill = 'red';
}
else if (msg.connect) {
this.cloundStatus = '云服务已连接';
}
else if (msg.reconnect) {
this.cloundStatus = '重连云服务';
status.fill = 'yellow';
}
else
return;
status.text = this.cloundStatus + '-' + this.haStatus;
this.node.status(status);
}
}
exports.default = Halink;