-
Notifications
You must be signed in to change notification settings - Fork 0
/
ha-watchdog.js
135 lines (116 loc) · 3.72 KB
/
ha-watchdog.js
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
let CONFIG = {
endpoint: "http://192.168.68.129:8123", // Home assistant IP
numberOfFails: 3, // Number of failures that trigger the power on
httpTimeout: 10, // Time in seconds after which the http request is considered failed
pingTime: 60, // Time in seconds to retry a "ping"
};
let GREEN = 0;
let RED = 0;
let WHITE = 0;
let failCounter = 0;
let pingTimer = null;
let error = true;
function PingHomeAssistant()
{
Shelly.call(
"HTTP.Request",
{ method: "GET", url: CONFIG.endpoint, timeout: CONFIG.httpTimeout},
function (response, error_code, error_message)
{
if (error_code === -114 || error_code === -104)
{
console.log("Failed to reach HA: ", error_code, " ", error_message);
failCounter++;
}
else
{
console.log("Succeeded to probe HA: ", error_code);
failCounter = 0;
if (error === true)
{
SetLightRing(GREEN, 20,1);
error = false;
}
}
if (failCounter === CONFIG.numberOfFails)
{
console.log("Too many fails, turning on plug...");
error = true;
Shelly.call(
"Switch.Set",
{ id: 0, on: true },
function () {});
SetLightRing(RED, 20,20);
}
});
}
// String '0',...,'F' -> 0,...,15 (case agnostic)
function HexCharToInt(hexChar)
{
if( hexChar > 96 && hexChar < 103 )
return 10 + (hexChar - 97);
if( hexChar > 64 && hexChar < 71 )
return 10 + (hexChar - 65);
if( hexChar > 47 && hexChar < 58 )
return (hexChar - 48);
die("Invalid hex value.");
}
// HH string ('A3') -> integer (163)
function HexToInt(hex)
{
return 16 * HexCharToInt(hex.at(0)) + HexCharToInt(hex.at(1));
}
// HH string ('A3') -> shelly rgb integer (64 = 163 / 255 * 100)
function HexToShellyColorValue(hex)
{
return Math.round( HexToInt( hex ) * 0.392156 );
}
function RGBStringToShellyValues(rgbString)
{
return ([
HexToShellyColorValue(rgbString.slice(1, 3)),
HexToShellyColorValue(rgbString.slice(3, 5)),
HexToShellyColorValue(rgbString.slice(5, 7)),
]);
}
function ReportConfigError(res, ec, em)
{
if ( ec )
console.log("Config update error", ec, em);
}
function ConfigurePlug()
{
let uiConfig = Shelly.getComponentConfig("plugs_ui");
if( uiConfig.leds.mode !== "switch" )
{
uiConfig.leds.mode = "switch";
Shelly.call( "PLUGS_UI.SetConfig", { config: uiConfig }, ReportConfigError )
}
}
function SetLightRing(shellyRGB, onBrightness, offBrightness)
{
let onColorConfig = { rgb: shellyRGB, brightness: onBrightness };
let offColorConfig = { rgb: shellyRGB, brightness: offBrightness };
let uiConfig = Shelly.getComponentConfig("plugs_ui");
if( uiConfig.leds.mode === "switch" )
{
uiConfig.leds.colors["switch:0"].on = onColorConfig;
uiConfig.leds.colors["switch:0"].off = offColorConfig;
// This call would fail in firmware 1.0.0-beta up to at least 1.0.8:
// Shelly.call( "PLUGS_UI.SetConfig", { config: uiConfig }, ReportConfigError )
// Hence, using the rpc api to achieve the same.
let configUrl = "http://localhost/rpc/PLUGS_UI.SetConfig?config=" + JSON.stringify(uiConfig);
Shelly.call("HTTP.Request", { method: "GET", url: configUrl, timeout: 15, ssl_ca: "*" }, ReportConfigError);
}
else
{
console.log("Incorrect color mode (", uiConfig.leds.mode, "), should be \"switch\"");
}
}
console.log("Starting HA Watchdog");
ConfigurePlug();
GREEN = RGBStringToShellyValues("#008000");
RED = RGBStringToShellyValues("#FF0000");
WHITE = RGBStringToShellyValues("#FFFFFF");
pingTimer = Timer.set(CONFIG.pingTime * 1000, true, PingHomeAssistant);
SetLightRing(WHITE, 20,20);