UNPKG

homebridge-smartsystem

Version:

SmartServer (Proxy Websockets to TCP sockets, Smappee MQTT, Duotecno IP Nodes, Homekit interface)

132 lines 4.49 kB
"use strict"; // Handle support commands, those are not passed to a master // // Johan Coppieters // v1, 11/05/2020 // Object.defineProperty(exports, "__esModule", { value: true }); exports.Support = void 0; const fs = require("fs"); const logger_1 = require("../duotecno/logger"); class Support { constructor(system) { this.system = system; } fromTransport(str) { return str.replace(/§/g, ']'); } toTransport(str) { return str.replace(/]/g, '§'); } getFN(name) { return "./data/" + (name.toLowerCase().replace(/\ /g, "")) + ".json"; } doBackup(name, data) { try { (0, logger_1.log)("support", "Backup - " + name + " -> " + data.substr(0, 40) + "..."); fs.mkdirSync("./data", { recursive: true }); fs.writeFileSync(this.getFN(name), this.fromTransport(data)); } catch (e) { (0, logger_1.log)("support", "error: " + e.message); } return null; } doRestore(name) { try { const data = fs.readFileSync(this.getFN(name)).toString(); (0, logger_1.log)("support", "Restore - " + name + " -> " + data.substr(0, 40) + "..."); return "[9,R-" + name + ":" + this.toTransport(data) + "]"; } catch (e) { (0, logger_1.log)("support", "error: " + e.message); return null; } } doScenes(name, data) { this.doBackup(name, data); try { // works only for local server installations if (this.system) { (0, logger_1.log)("support", "setting scenes to: " + this.fromTransport(data)); this.system.scenes = JSON.parse(this.fromTransport(data)); } else { (0, logger_1.log)("support", "only server side scenes for local server installations !"); } } catch (e) { (0, logger_1.log)("support", "error: " + e.message); } return null; } doSendAudio(name) { try { const data = fs.readFileSync(this.getFN(name)).toString(); (0, logger_1.log)("support", "Send Audio - " + name + " -> " + data.substr(0, 40) + "..."); return "[9,A-" + name + ":" + this.toTransport(data) + "]"; } catch (e) { (0, logger_1.log)("support", "error: " + e.message); return null; } } // Format: // [9,K-type-address:data] // K = B(ackup), R(estore), S(end scenes), A(udio) // type = name of config like "system", "scenes", ... // // Writing to, reading from files // ./data/name.json getKind(msg) { if ((msg[0] == '[') && (msg[1] == '9') && (msg[2] == ',') && (msg[3] == 'B')) return 'B'; else if ((msg[0] == '[') && (msg[1] == '9') && (msg[2] == ',') && (msg[3] == 'R')) return 'R'; else if ((msg[0] == '[') && (msg[1] == '9') && (msg[2] == ',') && (msg[3] == 'A')) return 'A'; else if ((msg[0] == '[') && (msg[1] == '9') && (msg[2] == ',') && (msg[3] == 'S')) return 'S'; else return 'X'; } getName(msg) { const next = msg.indexOf(":"); if (next < 0) return ""; else return msg.substr(5, next - 5); } handle(msg) { const kind = this.getKind(msg); // no internal message -> tell it to the caller and let's get out of here if (kind === 'X') return { done: false }; // get type for restore or backup if any const name = this.getName(msg); // get the msg, remove [], cmd and type. msg = msg.substr(name.length + 6, msg.length - name.length - 8); //backup if (kind === "B") { return { done: true, answer: this.doBackup(name, msg) }; //restore } else if (kind === 'R') { return { done: true, answer: this.doRestore(name) }; //scenes } else if (kind === 'S') { return { done: true, answer: this.doScenes(name, msg) }; //send audio config } else if (kind === 'A') { return { done: true, answer: this.doSendAudio(name) }; } else { // we should not get here... return { done: false }; } } } exports.Support = Support; //# sourceMappingURL=support.js.map