homebridge-smartsystem
Version:
SmartServer (Proxy Websockets to TCP sockets, Smappee MQTT, Duotecno IP Nodes, Homekit interface)
132 lines • 4.49 kB
JavaScript
"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