-
Notifications
You must be signed in to change notification settings - Fork 0
/
shelly.ts
93 lines (84 loc) · 3.39 KB
/
shelly.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import mdns from 'multicast-dns'; // https://www.npmjs.com/package/multicast-dns
import { Answer } from 'dns-packet';
import fs from 'fs';
import fp from 'fs/promises';
import path from 'path'
import { msg } from './index.js';
import { ShellyScripts } from './shellydefs.js';
import { AssertionError } from 'assert';
export interface Shscript {
id: number;
name: string;
enable: boolean;
}
const shellys = new Map<string, string>();
export async function BackupShelly(backdir: string, answer: Answer) {
if (!fs.existsSync(backdir)) fs.mkdirSync(backdir);
// msg(`${aa.type} ${JSON.stringify(aa)}`)
if (answer.type !== 'SRV')
return;
shellys.set(answer.name, answer.name);
msg(`Found Shelly device: ${answer.name}`);
shellys.set(answer.name, "found");
const sh = answer.name.split('.')[0];
const devdir = path.join(backdir, `${sh}`); // For additional details
const assureDevDir = () => { if (!fs.existsSync(devdir)) fs.mkdirSync(devdir); };
// if (sh.includes("3c610579a4ec")) debugger;
try {
async function savekind(ask: string, kind: string) {
try {
const xget = `http://${sh}/rpc/${ask}.List`;
const things = await (await fetch(xget)).json();
const items = things[kind];
if (!items.length)
return null;
assureDevDir();
await fp.writeFile(path.join(devdir, `hooks.json`), JSON.stringify(things, null, 2));
return things;
}
catch (e: any) {
msg(`Error getting ${ask} for ${sh}f`, e.message);
}
}
const getter = `http://${sh}/rpc/Shelly.GetConfig`;
// msg(getter);
const result = await (await fetch(getter)).json();
await fp.writeFile(path.join(backdir, `${sh}.json`), JSON.stringify(result, null, 2));
await savekind("Webhook", "hooks");
// need to get scripts separately?
// http://192.168.33.1/rpc/Script.List
const slist = `http://${sh}/rpc/Script.List`;
const scripts = await (await fetch(slist)).json() as ShellyScripts;
if (scripts.scripts.length) {
assureDevDir();
// Get scripts
await fp.writeFile(path.join(devdir, `scripts.json`), JSON.stringify(scripts, null, 2));
for (const sc of scripts.scripts) {
try {
const sget = `http://${sh}/rpc/Script.GetCode?id=${sc.id}`;
const result = await (await fetch(sget)).json();
const script = result.data.trim();
if (script)
await fp.writeFile(path.join(devdir, `${sc.name}.js`), script);
}
catch (e: any) {
msg(answer.name, e.message);
// debugger;
}
}
}
}
catch (e: any) {
const backv1 = path.join(backdir, 'v1');
if (!fs.existsSync(backv1)) fs.mkdirSync(backv1);
try {
const getv1 = `http://${sh}/status`;
const result = await (await fetch(getv1)).json();
await fp.writeFile(path.join(backv1, `${sh}.json`), JSON.stringify(result, null, 2));
}
catch (e: any) {
msg(answer.name, e.message);
await fp.writeFile(path.join(backv1, `${sh}.fail`), e.message);
}
}
}