iobroker.zigbee 1.8.1 → 1.8.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/.eslintignore +2 -0
- package/.eslintrc.json +37 -0
- package/.github/FUNDING.yml +3 -0
- package/.github/auto-merge.yml +17 -0
- package/.github/dependabot.yml +24 -0
- package/.github/stale.yml +13 -0
- package/.github/workflows/codeql.yml +41 -0
- package/.github/workflows/dependabot-automerge.yml +22 -0
- package/.github/workflows/test-and-release.yml +149 -0
- package/.releaseconfig.json +3 -0
- package/.travis/wiki.sh +28 -0
- package/.travis.yml +41 -0
- package/README.md +31 -8
- package/admin/admin.js +466 -482
- package/admin/i18n/de/translations.json +2 -2
- package/admin/index_m.html +1 -1
- package/admin/tab_m.html +3 -44
- package/admin/words.js +2 -2
- package/gulpfile.js +464 -0
- package/io-package.json +18 -25
- package/lib/backup.js +2 -2
- package/lib/binding.js +37 -32
- package/lib/colors.js +158 -163
- package/lib/commands.js +90 -99
- package/lib/developer.js +12 -9
- package/lib/devices.js +179 -169
- package/lib/exclude.js +36 -30
- package/lib/exposes.js +139 -163
- package/lib/groups.js +83 -81
- package/lib/json.js +6 -5
- package/lib/networkmap.js +3 -2
- package/lib/ota.js +18 -34
- package/lib/rgb.js +72 -114
- package/lib/seriallist.js +20 -25
- package/lib/states.js +526 -511
- package/lib/statescontroller.js +183 -206
- package/lib/utils.js +23 -24
- package/lib/zbBaseExtension.js +4 -4
- package/lib/zbDelayedAction.js +13 -5
- package/lib/zbDeviceAvailability.js +65 -69
- package/lib/zbDeviceConfigure.js +21 -9
- package/lib/zbDeviceEvent.js +4 -3
- package/lib/zigbeecontroller.js +103 -109
- package/main.js +147 -163
- package/package.json +15 -29
- package/test/integration.js +5 -0
- package/test/mocha.custom.opts +2 -0
- package/test/mocha.setup.js +14 -0
- package/test/package.js +5 -0
- package/test/unit.js +5 -0
- package/docs/de/img/CC2531.png +0 -0
- package/docs/de/img/CC2538_CC2592_PA.PNG +0 -0
- package/docs/de/img/CC2591.png +0 -0
- package/docs/de/img/boards.jpg +0 -0
- package/docs/de/img/cc26x2r.PNG +0 -0
- package/docs/de/img/results.jpg +0 -0
- package/docs/de/img/sku_429478_2.png +0 -0
- package/docs/de/img/sku_429601_2.png +0 -0
- package/docs/de/readme.md +0 -27
- package/docs/en/img/CC2531.png +0 -0
- package/docs/en/img/CC2591.png +0 -0
- package/docs/en/img/deconz.png +0 -0
- package/docs/en/img/sku_429478_2.png +0 -0
- package/docs/en/img/sku_429601_2.png +0 -0
- package/docs/en/readme.md +0 -30
- package/docs/flashing_via_arduino_(en).md +0 -110
- package/docs/ru/img/CC2531.png +0 -0
- package/docs/ru/img/CC2591.png +0 -0
- package/docs/ru/img/sku_429478_2.png +0 -0
- package/docs/ru/img/sku_429601_2.png +0 -0
- package/docs/ru/readme.md +0 -28
- package/docs/tutorial/CC2530_20190425.zip +0 -0
- package/docs/tutorial/CC2530_CC2591_20190515.zip +0 -0
- package/docs/tutorial/CC2530_CC2592_20190515.zip +0 -0
- package/docs/tutorial/CC2531_20190425.zip +0 -0
- package/docs/tutorial/adm5_1.PNG +0 -0
- package/docs/tutorial/adm5_2.PNG +0 -0
- package/docs/tutorial/cat.PNG +0 -0
- package/docs/tutorial/groups-1.png +0 -0
- package/docs/tutorial/groups-2.png +0 -0
- package/docs/tutorial/inst.PNG +0 -0
- package/docs/tutorial/reflash-finish.PNG +0 -0
- package/docs/tutorial/reflash-step0.png +0 -0
- package/docs/tutorial/reflash-step1.PNG +0 -0
- package/docs/tutorial/reflash-step2.PNG +0 -0
- package/docs/tutorial/settings.png +0 -0
- package/docs/tutorial/tab-dev-1.png +0 -0
- package/docs/tutorial/zigbee.png +0 -0
- package/docs/tutorial/zigbee15.png +0 -0
package/lib/rgb.js
CHANGED
|
@@ -4,7 +4,7 @@ With these functions you can convert the CIE color space to the RGB color space
|
|
|
4
4
|
The developer documentation for Philips Hue provides the formulas used in the code below:
|
|
5
5
|
https://developers.meethue.com/documentation/color-conversions-rgb-xy
|
|
6
6
|
|
|
7
|
-
I've used the formulas and Objective-C example code and
|
|
7
|
+
I've used the formulas and Objective-C example code and transfered it to JavaScript.
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
Examples:
|
|
@@ -60,20 +60,24 @@ function cie_to_rgb(x, y, brightness) {
|
|
|
60
60
|
const Z = (Y / y) * z;
|
|
61
61
|
|
|
62
62
|
//Convert to RGB using Wide RGB D65 conversion
|
|
63
|
-
let red
|
|
63
|
+
let red = X * 1.656492 - Y * 0.354851 - Z * 0.255038;
|
|
64
64
|
let green = -X * 0.707196 + Y * 1.655397 + Z * 0.036152;
|
|
65
|
-
let blue
|
|
65
|
+
let blue = X * 0.051713 - Y * 0.121364 + Z * 1.011530;
|
|
66
66
|
|
|
67
67
|
//If red, green or blue is larger than 1.0 set it back to the maximum of 1.0
|
|
68
68
|
if (red > blue && red > green && red > 1.0) {
|
|
69
|
+
|
|
69
70
|
green = green / red;
|
|
70
71
|
blue = blue / red;
|
|
71
72
|
red = 1.0;
|
|
72
|
-
}
|
|
73
|
+
}
|
|
74
|
+
else if (green > blue && green > red && green > 1.0) {
|
|
75
|
+
|
|
73
76
|
red = red / green;
|
|
74
77
|
blue = blue / green;
|
|
75
78
|
green = 1.0;
|
|
76
|
-
}
|
|
79
|
+
}
|
|
80
|
+
else if (blue > red && blue > green && blue > 1.0) {
|
|
77
81
|
|
|
78
82
|
red = red / blue;
|
|
79
83
|
green = green / blue;
|
|
@@ -81,24 +85,25 @@ function cie_to_rgb(x, y, brightness) {
|
|
|
81
85
|
}
|
|
82
86
|
|
|
83
87
|
//Reverse gamma correction
|
|
84
|
-
red
|
|
85
|
-
green
|
|
86
|
-
blue
|
|
88
|
+
red = red <= 0.0031308 ? 12.92 * red : (1.0 + 0.055) * Math.pow(red, (1.0 / 2.4)) - 0.055;
|
|
89
|
+
green = green <= 0.0031308 ? 12.92 * green : (1.0 + 0.055) * Math.pow(green, (1.0 / 2.4)) - 0.055;
|
|
90
|
+
blue = blue <= 0.0031308 ? 12.92 * blue : (1.0 + 0.055) * Math.pow(blue, (1.0 / 2.4)) - 0.055;
|
|
91
|
+
|
|
87
92
|
|
|
88
93
|
//Convert normalized decimal to decimal
|
|
89
|
-
red
|
|
90
|
-
green
|
|
91
|
-
blue
|
|
94
|
+
red = Math.round(red * 255);
|
|
95
|
+
green = Math.round(green * 255);
|
|
96
|
+
blue = Math.round(blue * 255);
|
|
92
97
|
|
|
93
|
-
if (isNaN(red) || red < 0) {
|
|
98
|
+
if (isNaN(red) || red < 0 ) {
|
|
94
99
|
red = 0;
|
|
95
100
|
}
|
|
96
101
|
|
|
97
|
-
if (isNaN(green) || green < 0) {
|
|
102
|
+
if (isNaN(green) || green < 0 ) {
|
|
98
103
|
green = 0;
|
|
99
104
|
}
|
|
100
105
|
|
|
101
|
-
if (isNaN(blue) || blue < 0) {
|
|
106
|
+
if (isNaN(blue) || blue < 0 ) {
|
|
102
107
|
blue = 0;
|
|
103
108
|
}
|
|
104
109
|
|
|
@@ -115,18 +120,18 @@ function cie_to_rgb(x, y, brightness) {
|
|
|
115
120
|
*/
|
|
116
121
|
function rgb_to_cie(red, green, blue) {
|
|
117
122
|
// Apply a gamma correction to the RGB values, which makes the color more vivid and more the like the color displayed on the screen of your device
|
|
118
|
-
red
|
|
119
|
-
green
|
|
120
|
-
blue
|
|
123
|
+
red = (red > 0.04045) ? Math.pow((red + 0.055) / (1.0 + 0.055), 2.4) : (red / 12.92);
|
|
124
|
+
green = (green > 0.04045) ? Math.pow((green + 0.055) / (1.0 + 0.055), 2.4) : (green / 12.92);
|
|
125
|
+
blue = (blue > 0.04045) ? Math.pow((blue + 0.055) / (1.0 + 0.055), 2.4) : (blue / 12.92);
|
|
121
126
|
|
|
122
127
|
// RGB values to XYZ using the Wide RGB D65 conversion formula
|
|
123
|
-
const X
|
|
124
|
-
const Y
|
|
125
|
-
const Z
|
|
128
|
+
const X = red * 0.664511 + green * 0.154324 + blue * 0.162028;
|
|
129
|
+
const Y = red * 0.283881 + green * 0.668433 + blue * 0.047685;
|
|
130
|
+
const Z = red * 0.000088 + green * 0.072310 + blue * 0.986039;
|
|
126
131
|
|
|
127
132
|
// Calculate the xy values from the XYZ values
|
|
128
|
-
let x
|
|
129
|
-
let y
|
|
133
|
+
let x = (X / (X + Y + Z)).toFixed(4);
|
|
134
|
+
let y = (Y / (X + Y + Z)).toFixed(4);
|
|
130
135
|
|
|
131
136
|
if (isNaN(x)) {
|
|
132
137
|
x = 0;
|
|
@@ -145,13 +150,9 @@ function hsvToRGB(h, s, v) {
|
|
|
145
150
|
s = s / 100;
|
|
146
151
|
v = v / 100;
|
|
147
152
|
|
|
148
|
-
let r;
|
|
149
|
-
let g;
|
|
150
|
-
let b;
|
|
153
|
+
let r; let g; let b;
|
|
151
154
|
if (arguments.length === 1) {
|
|
152
|
-
s = h.s;
|
|
153
|
-
v = h.v;
|
|
154
|
-
h = h.h;
|
|
155
|
+
s = h.s, v = h.v, h = h.h;
|
|
155
156
|
}
|
|
156
157
|
const i = Math.floor(h * 6);
|
|
157
158
|
const f = h * 6 - i;
|
|
@@ -159,36 +160,12 @@ function hsvToRGB(h, s, v) {
|
|
|
159
160
|
const q = v * (1 - f * s);
|
|
160
161
|
const t = v * (1 - (1 - f) * s);
|
|
161
162
|
switch (i % 6) {
|
|
162
|
-
case 0:
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
case
|
|
168
|
-
r = q;
|
|
169
|
-
g = v;
|
|
170
|
-
b = p;
|
|
171
|
-
break;
|
|
172
|
-
case 2:
|
|
173
|
-
r = p;
|
|
174
|
-
g = v;
|
|
175
|
-
b = t;
|
|
176
|
-
break;
|
|
177
|
-
case 3:
|
|
178
|
-
r = p;
|
|
179
|
-
g = q;
|
|
180
|
-
b = v;
|
|
181
|
-
break;
|
|
182
|
-
case 4:
|
|
183
|
-
r = t;
|
|
184
|
-
g = p;
|
|
185
|
-
b = v;
|
|
186
|
-
break;
|
|
187
|
-
case 5:
|
|
188
|
-
r = v;
|
|
189
|
-
g = p;
|
|
190
|
-
b = q;
|
|
191
|
-
break;
|
|
163
|
+
case 0: r = v, g = t, b = p; break;
|
|
164
|
+
case 1: r = q, g = v, b = p; break;
|
|
165
|
+
case 2: r = p, g = v, b = t; break;
|
|
166
|
+
case 3: r = p, g = q, b = v; break;
|
|
167
|
+
case 4: r = t, g = p, b = v; break;
|
|
168
|
+
case 5: r = v, g = p, b = q; break;
|
|
192
169
|
}
|
|
193
170
|
return {
|
|
194
171
|
r: Math.round(r * 255),
|
|
@@ -199,92 +176,73 @@ function hsvToRGB(h, s, v) {
|
|
|
199
176
|
|
|
200
177
|
function rgbToHSV(r, g, b, numeric) {
|
|
201
178
|
if (arguments.length === 1) {
|
|
202
|
-
g = r.g;
|
|
203
|
-
b = r.b;
|
|
204
|
-
r = r.r;
|
|
179
|
+
g = r.g, b = r.b, r = r.r;
|
|
205
180
|
}
|
|
206
|
-
const max = Math.max(r, g, b);
|
|
207
|
-
const min = Math.min(r, g, b);
|
|
181
|
+
const max = Math.max(r, g, b); const min = Math.min(r, g, b);
|
|
208
182
|
const d = max - min;
|
|
209
183
|
let h;
|
|
210
184
|
const s = (max === 0 ? 0 : d / max);
|
|
211
185
|
const v = max / 255;
|
|
212
186
|
|
|
213
187
|
switch (max) {
|
|
214
|
-
case min:
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
case r
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
break;
|
|
225
|
-
case b:
|
|
226
|
-
h = (r - g) + d * 4;
|
|
227
|
-
h /= 6 * d;
|
|
228
|
-
break;
|
|
229
|
-
}
|
|
230
|
-
if (numeric) {
|
|
231
|
-
return {
|
|
232
|
-
h: Math.round(h * 360),
|
|
233
|
-
s: Math.round(s * 100),
|
|
234
|
-
v: Math.round(v * 100),
|
|
235
|
-
};
|
|
236
|
-
}
|
|
188
|
+
case min: h = 0; break;
|
|
189
|
+
case r: h = (g - b) + d * (g < b ? 6: 0); h /= 6 * d; break;
|
|
190
|
+
case g: h = (b - r) + d * 2; h /= 6 * d; break;
|
|
191
|
+
case b: h = (r - g) + d * 4; h /= 6 * d; break;
|
|
192
|
+
}
|
|
193
|
+
if (numeric) return {
|
|
194
|
+
h: Math.round(h*360),
|
|
195
|
+
s: Math.round(s*100),
|
|
196
|
+
v: Math.round(v*100),
|
|
197
|
+
};
|
|
237
198
|
return {
|
|
238
199
|
h: (h * 360).toFixed(3),
|
|
239
200
|
s: (s * 100).toFixed(3),
|
|
240
201
|
v: (v * 100).toFixed(3),
|
|
241
202
|
};
|
|
242
203
|
}
|
|
243
|
-
|
|
244
204
|
function colorArrayFromString(value) {
|
|
245
|
-
if (typeof
|
|
205
|
+
if (typeof(value) === 'string') {
|
|
246
206
|
const rv = [];
|
|
247
|
-
value.split(',').forEach(element =>
|
|
248
|
-
rv.push(colors.ParseColor(element))
|
|
207
|
+
value.split(',').forEach(element => {
|
|
208
|
+
rv.push(colors.ParseColor(element));
|
|
209
|
+
});
|
|
249
210
|
return rv;
|
|
250
211
|
}
|
|
251
|
-
return [{r:
|
|
212
|
+
return [{r:0,g:128,b:255}];
|
|
252
213
|
}
|
|
253
214
|
|
|
254
|
-
function colorStringFromRGBArray(payload)
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
215
|
+
function colorStringFromRGBArray(payload)
|
|
216
|
+
{
|
|
217
|
+
let rv = []
|
|
218
|
+
payload.forEach(element => {
|
|
219
|
+
rv.push(rgb_to_rgbstring(element));
|
|
220
|
+
});
|
|
258
221
|
return rv.toString();
|
|
259
222
|
}
|
|
260
223
|
|
|
261
|
-
function hsv_to_cie(h,
|
|
262
|
-
const rgb = hsvToRGB(h,
|
|
224
|
+
function hsv_to_cie(h,s,v){
|
|
225
|
+
const rgb = hsvToRGB(h,s,v);
|
|
263
226
|
return rgb_to_cie(rgb.r, rgb.g, rgb.b);
|
|
264
227
|
}
|
|
265
228
|
|
|
266
229
|
function rgb_to_rgbstring(element) {
|
|
267
230
|
let col = '#';
|
|
268
|
-
if (element && element.hasOwnProperty(
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
}
|
|
278
|
-
if (element && element.hasOwnProperty('b')) {
|
|
279
|
-
col = col + element.b.toString(16).padStart(2, '0');
|
|
280
|
-
} else {
|
|
281
|
-
col = col + '00';
|
|
282
|
-
}
|
|
231
|
+
if (element && element.hasOwnProperty("r"))
|
|
232
|
+
col = col + element.r.toString(16).padStart(2, '0');
|
|
233
|
+
else col = col + '00';
|
|
234
|
+
if (element && element.hasOwnProperty("g"))
|
|
235
|
+
col = col + element.g.toString(16).padStart(2, '0');
|
|
236
|
+
else col = col + '00';
|
|
237
|
+
if (element && element.hasOwnProperty("b"))
|
|
238
|
+
col = col + element.b.toString(16).padStart(2, '0');
|
|
239
|
+
else col = col + '00';
|
|
283
240
|
return col;
|
|
284
241
|
}
|
|
285
242
|
|
|
286
|
-
|
|
287
|
-
|
|
243
|
+
|
|
244
|
+
function hsvToRGBString(h,s,v) {
|
|
245
|
+
return rgb_to_rgbstring(hsvToRGB(h,s,v))
|
|
288
246
|
}
|
|
289
247
|
|
|
290
248
|
exports.hsv_to_cie = hsv_to_cie;
|
package/lib/seriallist.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
const serialPortUtils = require('zigbee-herdsman/dist/adapter/serialPortUtils').default;
|
|
4
|
+
|
|
4
5
|
|
|
5
6
|
class SerialList {
|
|
6
7
|
constructor(adapter) {
|
|
7
8
|
this.adapter = adapter;
|
|
8
|
-
this.adapter.on('message',
|
|
9
|
+
this.adapter.on('message', this.onMessage.bind(this));
|
|
9
10
|
}
|
|
10
|
-
|
|
11
11
|
/**
|
|
12
12
|
* @param {ioBroker.Message} obj
|
|
13
13
|
*/
|
|
@@ -16,33 +16,28 @@ class SerialList {
|
|
|
16
16
|
switch (obj.command) {
|
|
17
17
|
case 'listUart':
|
|
18
18
|
if (obj.callback) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
.catch(e => {
|
|
31
|
-
this.adapter.sendTo(obj.from, obj.command, [], obj.callback);
|
|
32
|
-
this.adapter.log.error(e);
|
|
33
|
-
});
|
|
34
|
-
} else {
|
|
35
|
-
this.adapter.log.warn('Module serialport is not available');
|
|
36
|
-
this.adapter.sendTo(obj.from, obj.command, [{
|
|
37
|
-
label: 'Not available',
|
|
38
|
-
comName: ''
|
|
39
|
-
}], obj.callback);
|
|
40
|
-
}
|
|
19
|
+
this.listSerial()
|
|
20
|
+
.then((ports) => {
|
|
21
|
+
this.adapter.log.debug('List of ports: ' + JSON.stringify(ports));
|
|
22
|
+
this.adapter.sendTo(obj.from, obj.command, ports.map(item => ({
|
|
23
|
+
label: item.friendlyName || item.pnpId || item.manufacturer,
|
|
24
|
+
comName: item.path
|
|
25
|
+
})), obj.callback);
|
|
26
|
+
}).catch((err) => {
|
|
27
|
+
this.adapter.log.error(`List of ports error: ${err}`);
|
|
28
|
+
this.adapter.sendTo(obj.from, obj.command, [], obj.callback);
|
|
29
|
+
});
|
|
41
30
|
}
|
|
42
31
|
break;
|
|
43
32
|
}
|
|
44
33
|
}
|
|
45
34
|
}
|
|
35
|
+
|
|
36
|
+
listSerial() {
|
|
37
|
+
return serialPortUtils.find([{}]).then((ports) => {
|
|
38
|
+
return ports.map((port) => {return {comName: port};});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
46
41
|
}
|
|
47
42
|
|
|
48
43
|
module.exports = SerialList;
|