UNPKG

node-red-contrib-voice-assistant

Version:

一个小度-小爱-猫精音箱控制NODE-RED自定义设备的节点

133 lines (132 loc) 5.28 kB
"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;