iobroker.sonoff 2.5.1 → 2.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -22
- package/README.md +203 -199
- package/admin/i18n/de/translations.json +52 -0
- package/admin/i18n/en/translations.json +52 -0
- package/admin/i18n/es/translations.json +52 -0
- package/admin/i18n/fr/translations.json +52 -0
- package/admin/i18n/it/translations.json +52 -0
- package/admin/i18n/nl/translations.json +52 -0
- package/admin/i18n/pl/translations.json +52 -0
- package/admin/i18n/pt/translations.json +52 -0
- package/admin/i18n/ru/translations.json +52 -0
- package/admin/i18n/zh-cn/translations.json +52 -0
- package/admin/index.html +177 -177
- package/admin/index_m.html +218 -218
- package/admin/words.js +54 -54
- package/io-package.json +14 -13
- package/lib/datapoints.js +193 -193
- package/lib/server.js +1765 -1732
- package/lib/tools.js +99 -99
- package/main.js +93 -93
- package/package.json +20 -9
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -37
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -24
- package/.github/auto-merge.yml +0 -17
- package/.github/dependabot.yml +0 -16
- package/.github/stale.yml +0 -78
- package/.github/workflows/dependabot-automerge.yml +0 -22
- package/.github/workflows/test-and-release.yml +0 -156
- package/.mocharc.json +0 -5
- package/.releaseconfig.json +0 -3
package/admin/index.html
CHANGED
|
@@ -1,177 +1,177 @@
|
|
|
1
|
-
<html>
|
|
2
|
-
<head>
|
|
3
|
-
<!-- these 4 files always have to be included -->
|
|
4
|
-
<link rel="stylesheet" type="text/css" href="../../lib/css/themes/jquery-ui/redmond/jquery-ui.min.css"/>
|
|
5
|
-
<script type="text/javascript" src="../../lib/js/jquery-1.11.1.min.js"></script>
|
|
6
|
-
<script type="text/javascript" src="../../socket.io/socket.io.js"></script>
|
|
7
|
-
<script type="text/javascript" src="../../lib/js/jquery-ui-1.10.3.full.min.js"></script>
|
|
8
|
-
|
|
9
|
-
<!-- these three files have to be always included -->
|
|
10
|
-
<link rel="stylesheet" type="text/css" href="../../css/adapter.css"/>
|
|
11
|
-
<script type="text/javascript" src="../../js/translate.js"></script>
|
|
12
|
-
<script type="text/javascript" src="../../js/adapter-settings.js"></script>
|
|
13
|
-
<script type="text/javascript" src="words.js"></script>
|
|
14
|
-
<!-- you have to define 2 functions in the global scope: -->
|
|
15
|
-
<script type="text/javascript">
|
|
16
|
-
var onChange;
|
|
17
|
-
var secret;
|
|
18
|
-
|
|
19
|
-
function encrypt(key, value) {
|
|
20
|
-
var result = '';
|
|
21
|
-
for(var i = 0; i < value.length; ++i) {
|
|
22
|
-
result += String.fromCharCode(key[i % key.length].charCodeAt(0) ^ value.charCodeAt(i));
|
|
23
|
-
}
|
|
24
|
-
return result;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function decrypt(key, value) {
|
|
28
|
-
var result = '';
|
|
29
|
-
for(var i = 0; i < value.length; ++i) {
|
|
30
|
-
result += String.fromCharCode(key[i % key.length].charCodeAt(0) ^ value.charCodeAt(i));
|
|
31
|
-
}
|
|
32
|
-
return result;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function setValue(id, value) {
|
|
36
|
-
var $value = $('#' + id + '.value');
|
|
37
|
-
if ($value.attr('type') === 'checkbox') {
|
|
38
|
-
$value.prop('checked', value).change(function() {
|
|
39
|
-
onChange();
|
|
40
|
-
});
|
|
41
|
-
} else {
|
|
42
|
-
$value.val(value).change(function() {
|
|
43
|
-
onChange();
|
|
44
|
-
}).keyup(function() {
|
|
45
|
-
onChange();
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function loadHelper(settings, param, subparam) {
|
|
51
|
-
if (!settings) return;
|
|
52
|
-
|
|
53
|
-
if (settings.useChunkPatch === undefined) settings.useChunkPatch = false;
|
|
54
|
-
if (settings.timeout === undefined) settings.timeout = 300;
|
|
55
|
-
|
|
56
|
-
if (subparam && param) {
|
|
57
|
-
for (var key in settings[param][subparam]) {
|
|
58
|
-
if (typeof settings[param][subparam][key] !== 'object') {
|
|
59
|
-
setValue(param + '_' + subparam + '_' + key, settings[param][subparam][key]);
|
|
60
|
-
} else {
|
|
61
|
-
alert('4th level is not supported');
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
} else if (param) {
|
|
65
|
-
for (var key in settings[param]) {
|
|
66
|
-
if (typeof settings[param][key] !== 'object') {
|
|
67
|
-
setValue(param + '_' + key, settings[param][key]);
|
|
68
|
-
} else {
|
|
69
|
-
loadHelper(settings, param, key);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
} else {
|
|
73
|
-
for (var key in settings) {
|
|
74
|
-
if (typeof settings[key] !== 'object') {
|
|
75
|
-
if (key === 'pass') {
|
|
76
|
-
settings[key] = decrypt(secret, settings[key]);
|
|
77
|
-
}
|
|
78
|
-
setValue(key, settings[key]);
|
|
79
|
-
} else {
|
|
80
|
-
loadHelper(settings, key);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// the function loadSettings has to exist ...
|
|
87
|
-
function load(settings, _onChange) {
|
|
88
|
-
$('#tabs').tabs();
|
|
89
|
-
onChange = _onChange;
|
|
90
|
-
socket.emit('getObject', 'system.config', function (err, obj) {
|
|
91
|
-
secret = (obj.native ? obj.native.secret : '') || 'Zgfr56gFe87jJOM';
|
|
92
|
-
loadHelper(settings);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
onChange(false);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function saveHelper(obj, id, value) {
|
|
99
|
-
var ids = id.split('_');
|
|
100
|
-
|
|
101
|
-
if (ids.length === 1) {
|
|
102
|
-
if (ids[0] === 'pass') value = encrypt(secret, value);
|
|
103
|
-
obj[id] = value;
|
|
104
|
-
} else if (ids.length === 2) {
|
|
105
|
-
if (!obj[ids[0]]) obj[ids[0]] = {};
|
|
106
|
-
obj[ids[0]][ids[1]] = value;
|
|
107
|
-
} else if (ids.length === 3) {
|
|
108
|
-
if (!obj[ids[0]]) obj[ids[0]] = {};
|
|
109
|
-
if (!obj[ids[0]][ids[1]]) obj[ids[0]][ids[1]] = {};
|
|
110
|
-
obj[ids[0]][ids[1]][ids[2]] = value;
|
|
111
|
-
}
|
|
112
|
-
return obj;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function getSettings() {
|
|
116
|
-
var obj = {};
|
|
117
|
-
$('.value').each(function () {
|
|
118
|
-
var $this = $(this);
|
|
119
|
-
var id = $this.attr('id');
|
|
120
|
-
|
|
121
|
-
if ($this.attr('type') === 'checkbox') {
|
|
122
|
-
obj = saveHelper(obj, id, $this.prop('checked'))
|
|
123
|
-
} else {
|
|
124
|
-
obj = saveHelper(obj, id, $this.val())
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
return obj;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
function save(callback) {
|
|
131
|
-
if ($('#pass').val() !== $('#pass_confirm').val()) {
|
|
132
|
-
showMessage(_('Password confirmation is not equal with password'));
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
callback(getSettings());
|
|
137
|
-
}
|
|
138
|
-
</script>
|
|
139
|
-
</head>
|
|
140
|
-
<body>
|
|
141
|
-
<!-- you have to put your config page in a div with id adapter-container -->
|
|
142
|
-
<div id="adapter-container">
|
|
143
|
-
<table><tr>
|
|
144
|
-
<td><img src="sonoff.png"></td>
|
|
145
|
-
<td style="padding-top: 20px;padding-left: 10px"><h3 class="translate">Sonoff adapter settings</h3></td>
|
|
146
|
-
</tr></table>
|
|
147
|
-
<table>
|
|
148
|
-
<tr>
|
|
149
|
-
<td colspan='2'><h4 class="translate">Connection settings</h4></td>
|
|
150
|
-
</tr>
|
|
151
|
-
<tr>
|
|
152
|
-
<td><label class="translate" for="port">Port:</label></td>
|
|
153
|
-
<td><input id="port" type="number" min="1" max="65565" class="value"/></td>
|
|
154
|
-
</tr>
|
|
155
|
-
<tr>
|
|
156
|
-
<td><label class="translate" for="timeout">Client timeout (sec):</label></td>
|
|
157
|
-
<td><input id="timeout" type="number" min="1" max="65565" class="value"/></td>
|
|
158
|
-
</tr>
|
|
159
|
-
<tr>
|
|
160
|
-
<td colspan='2'><h4 class="translate">Authentication settings</h4></td>
|
|
161
|
-
</tr>
|
|
162
|
-
<tr>
|
|
163
|
-
<td><label class="translate" for="user">User:</label></td>
|
|
164
|
-
<td><input id="user" size="17" class="value"/></td>
|
|
165
|
-
</tr>
|
|
166
|
-
<tr>
|
|
167
|
-
<td><label class="translate" for="pass">Password:</label></td>
|
|
168
|
-
<td><input id="pass" type="password" size="17" class="value"/></td>
|
|
169
|
-
</tr>
|
|
170
|
-
<tr>
|
|
171
|
-
<td><label class="translate" for="pass_confirm">Password confirmation:</label></td>
|
|
172
|
-
<td><input id="pass_confirm" type="password" size="17"/></td>
|
|
173
|
-
</tr>
|
|
174
|
-
</table>
|
|
175
|
-
</div>
|
|
176
|
-
</body>
|
|
177
|
-
</html>
|
|
1
|
+
<html>
|
|
2
|
+
<head>
|
|
3
|
+
<!-- these 4 files always have to be included -->
|
|
4
|
+
<link rel="stylesheet" type="text/css" href="../../lib/css/themes/jquery-ui/redmond/jquery-ui.min.css"/>
|
|
5
|
+
<script type="text/javascript" src="../../lib/js/jquery-1.11.1.min.js"></script>
|
|
6
|
+
<script type="text/javascript" src="../../socket.io/socket.io.js"></script>
|
|
7
|
+
<script type="text/javascript" src="../../lib/js/jquery-ui-1.10.3.full.min.js"></script>
|
|
8
|
+
|
|
9
|
+
<!-- these three files have to be always included -->
|
|
10
|
+
<link rel="stylesheet" type="text/css" href="../../css/adapter.css"/>
|
|
11
|
+
<script type="text/javascript" src="../../js/translate.js"></script>
|
|
12
|
+
<script type="text/javascript" src="../../js/adapter-settings.js"></script>
|
|
13
|
+
<script type="text/javascript" src="words.js"></script>
|
|
14
|
+
<!-- you have to define 2 functions in the global scope: -->
|
|
15
|
+
<script type="text/javascript">
|
|
16
|
+
var onChange;
|
|
17
|
+
var secret;
|
|
18
|
+
|
|
19
|
+
function encrypt(key, value) {
|
|
20
|
+
var result = '';
|
|
21
|
+
for(var i = 0; i < value.length; ++i) {
|
|
22
|
+
result += String.fromCharCode(key[i % key.length].charCodeAt(0) ^ value.charCodeAt(i));
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function decrypt(key, value) {
|
|
28
|
+
var result = '';
|
|
29
|
+
for(var i = 0; i < value.length; ++i) {
|
|
30
|
+
result += String.fromCharCode(key[i % key.length].charCodeAt(0) ^ value.charCodeAt(i));
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function setValue(id, value) {
|
|
36
|
+
var $value = $('#' + id + '.value');
|
|
37
|
+
if ($value.attr('type') === 'checkbox') {
|
|
38
|
+
$value.prop('checked', value).change(function() {
|
|
39
|
+
onChange();
|
|
40
|
+
});
|
|
41
|
+
} else {
|
|
42
|
+
$value.val(value).change(function() {
|
|
43
|
+
onChange();
|
|
44
|
+
}).keyup(function() {
|
|
45
|
+
onChange();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function loadHelper(settings, param, subparam) {
|
|
51
|
+
if (!settings) return;
|
|
52
|
+
|
|
53
|
+
if (settings.useChunkPatch === undefined) settings.useChunkPatch = false;
|
|
54
|
+
if (settings.timeout === undefined) settings.timeout = 300;
|
|
55
|
+
|
|
56
|
+
if (subparam && param) {
|
|
57
|
+
for (var key in settings[param][subparam]) {
|
|
58
|
+
if (typeof settings[param][subparam][key] !== 'object') {
|
|
59
|
+
setValue(param + '_' + subparam + '_' + key, settings[param][subparam][key]);
|
|
60
|
+
} else {
|
|
61
|
+
alert('4th level is not supported');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
} else if (param) {
|
|
65
|
+
for (var key in settings[param]) {
|
|
66
|
+
if (typeof settings[param][key] !== 'object') {
|
|
67
|
+
setValue(param + '_' + key, settings[param][key]);
|
|
68
|
+
} else {
|
|
69
|
+
loadHelper(settings, param, key);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
for (var key in settings) {
|
|
74
|
+
if (typeof settings[key] !== 'object') {
|
|
75
|
+
if (key === 'pass') {
|
|
76
|
+
settings[key] = decrypt(secret, settings[key]);
|
|
77
|
+
}
|
|
78
|
+
setValue(key, settings[key]);
|
|
79
|
+
} else {
|
|
80
|
+
loadHelper(settings, key);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// the function loadSettings has to exist ...
|
|
87
|
+
function load(settings, _onChange) {
|
|
88
|
+
$('#tabs').tabs();
|
|
89
|
+
onChange = _onChange;
|
|
90
|
+
socket.emit('getObject', 'system.config', function (err, obj) {
|
|
91
|
+
secret = (obj.native ? obj.native.secret : '') || 'Zgfr56gFe87jJOM';
|
|
92
|
+
loadHelper(settings);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
onChange(false);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function saveHelper(obj, id, value) {
|
|
99
|
+
var ids = id.split('_');
|
|
100
|
+
|
|
101
|
+
if (ids.length === 1) {
|
|
102
|
+
if (ids[0] === 'pass') value = encrypt(secret, value);
|
|
103
|
+
obj[id] = value;
|
|
104
|
+
} else if (ids.length === 2) {
|
|
105
|
+
if (!obj[ids[0]]) obj[ids[0]] = {};
|
|
106
|
+
obj[ids[0]][ids[1]] = value;
|
|
107
|
+
} else if (ids.length === 3) {
|
|
108
|
+
if (!obj[ids[0]]) obj[ids[0]] = {};
|
|
109
|
+
if (!obj[ids[0]][ids[1]]) obj[ids[0]][ids[1]] = {};
|
|
110
|
+
obj[ids[0]][ids[1]][ids[2]] = value;
|
|
111
|
+
}
|
|
112
|
+
return obj;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function getSettings() {
|
|
116
|
+
var obj = {};
|
|
117
|
+
$('.value').each(function () {
|
|
118
|
+
var $this = $(this);
|
|
119
|
+
var id = $this.attr('id');
|
|
120
|
+
|
|
121
|
+
if ($this.attr('type') === 'checkbox') {
|
|
122
|
+
obj = saveHelper(obj, id, $this.prop('checked'))
|
|
123
|
+
} else {
|
|
124
|
+
obj = saveHelper(obj, id, $this.val())
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
return obj;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function save(callback) {
|
|
131
|
+
if ($('#pass').val() !== $('#pass_confirm').val()) {
|
|
132
|
+
showMessage(_('Password confirmation is not equal with password'));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
callback(getSettings());
|
|
137
|
+
}
|
|
138
|
+
</script>
|
|
139
|
+
</head>
|
|
140
|
+
<body>
|
|
141
|
+
<!-- you have to put your config page in a div with id adapter-container -->
|
|
142
|
+
<div id="adapter-container">
|
|
143
|
+
<table><tr>
|
|
144
|
+
<td><img src="sonoff.png"></td>
|
|
145
|
+
<td style="padding-top: 20px;padding-left: 10px"><h3 class="translate">Sonoff adapter settings</h3></td>
|
|
146
|
+
</tr></table>
|
|
147
|
+
<table>
|
|
148
|
+
<tr>
|
|
149
|
+
<td colspan='2'><h4 class="translate">Connection settings</h4></td>
|
|
150
|
+
</tr>
|
|
151
|
+
<tr>
|
|
152
|
+
<td><label class="translate" for="port">Port:</label></td>
|
|
153
|
+
<td><input id="port" type="number" min="1" max="65565" class="value"/></td>
|
|
154
|
+
</tr>
|
|
155
|
+
<tr>
|
|
156
|
+
<td><label class="translate" for="timeout">Client timeout (sec):</label></td>
|
|
157
|
+
<td><input id="timeout" type="number" min="1" max="65565" class="value"/></td>
|
|
158
|
+
</tr>
|
|
159
|
+
<tr>
|
|
160
|
+
<td colspan='2'><h4 class="translate">Authentication settings</h4></td>
|
|
161
|
+
</tr>
|
|
162
|
+
<tr>
|
|
163
|
+
<td><label class="translate" for="user">User:</label></td>
|
|
164
|
+
<td><input id="user" size="17" class="value"/></td>
|
|
165
|
+
</tr>
|
|
166
|
+
<tr>
|
|
167
|
+
<td><label class="translate" for="pass">Password:</label></td>
|
|
168
|
+
<td><input id="pass" type="password" size="17" class="value"/></td>
|
|
169
|
+
</tr>
|
|
170
|
+
<tr>
|
|
171
|
+
<td><label class="translate" for="pass_confirm">Password confirmation:</label></td>
|
|
172
|
+
<td><input id="pass_confirm" type="password" size="17"/></td>
|
|
173
|
+
</tr>
|
|
174
|
+
</table>
|
|
175
|
+
</div>
|
|
176
|
+
</body>
|
|
177
|
+
</html>
|