iobroker.zigbee 1.8.3 → 1.8.7
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/README.md +6 -0
- package/admin/adapter-settings.js +244 -0
- package/admin/admin.js +520 -494
- package/admin/index_m.html +1171 -1001
- package/admin/tab_m.html +44 -2
- 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 +27 -0
- 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 +30 -0
- package/docs/flashing_via_arduino_(en).md +110 -0
- 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 +28 -0
- 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/io-package.json +34 -33
- package/lib/backup.js +2 -2
- package/lib/binding.js +32 -37
- package/lib/colors.js +163 -158
- package/lib/commands.js +100 -91
- package/lib/developer.js +9 -12
- package/lib/devices.js +168 -178
- package/lib/exclude.js +30 -36
- package/lib/exposes.js +168 -143
- package/lib/groups.js +81 -83
- package/lib/json.js +5 -6
- package/lib/networkmap.js +2 -3
- package/lib/ota.js +34 -18
- package/lib/rgb.js +114 -72
- package/lib/seriallist.js +25 -20
- package/lib/statescontroller.js +206 -183
- package/lib/utils.js +29 -23
- package/lib/zbBaseExtension.js +4 -4
- package/lib/zbDelayedAction.js +5 -13
- package/lib/zbDeviceAvailability.js +69 -65
- package/lib/zbDeviceConfigure.js +9 -21
- package/lib/zbDeviceEvent.js +3 -4
- package/lib/zigbeecontroller.js +133 -128
- package/main.js +169 -154
- package/package.json +28 -14
- package/.eslintignore +0 -2
- package/.eslintrc.json +0 -37
- package/.github/FUNDING.yml +0 -3
- package/.github/auto-merge.yml +0 -17
- package/.github/dependabot.yml +0 -24
- package/.github/stale.yml +0 -13
- package/.github/workflows/codeql.yml +0 -41
- package/.github/workflows/dependabot-automerge.yml +0 -22
- package/.github/workflows/test-and-release.yml +0 -149
- package/.releaseconfig.json +0 -3
- package/.travis/wiki.sh +0 -28
- package/.travis.yml +0 -41
- package/gulpfile.js +0 -464
- package/test/integration.js +0 -5
- package/test/mocha.custom.opts +0 -2
- package/test/mocha.setup.js +0 -14
- package/test/package.js +0 -5
- package/test/unit.js +0 -5
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 transferred it to JavaScript.
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
Examples:
|
|
@@ -60,24 +60,20 @@ 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
|
-
|
|
70
69
|
green = green / red;
|
|
71
70
|
blue = blue / red;
|
|
72
71
|
red = 1.0;
|
|
73
|
-
}
|
|
74
|
-
else if (green > blue && green > red && green > 1.0) {
|
|
75
|
-
|
|
72
|
+
} else if (green > blue && green > red && green > 1.0) {
|
|
76
73
|
red = red / green;
|
|
77
74
|
blue = blue / green;
|
|
78
75
|
green = 1.0;
|
|
79
|
-
}
|
|
80
|
-
else if (blue > red && blue > green && blue > 1.0) {
|
|
76
|
+
} else if (blue > red && blue > green && blue > 1.0) {
|
|
81
77
|
|
|
82
78
|
red = red / blue;
|
|
83
79
|
green = green / blue;
|
|
@@ -85,25 +81,24 @@ function cie_to_rgb(x, y, brightness) {
|
|
|
85
81
|
}
|
|
86
82
|
|
|
87
83
|
//Reverse gamma correction
|
|
88
|
-
red
|
|
89
|
-
green
|
|
90
|
-
blue
|
|
91
|
-
|
|
84
|
+
red = red <= 0.0031308 ? 12.92 * red : (1.0 + 0.055) * Math.pow(red, (1.0 / 2.4)) - 0.055;
|
|
85
|
+
green = green <= 0.0031308 ? 12.92 * green : (1.0 + 0.055) * Math.pow(green, (1.0 / 2.4)) - 0.055;
|
|
86
|
+
blue = blue <= 0.0031308 ? 12.92 * blue : (1.0 + 0.055) * Math.pow(blue, (1.0 / 2.4)) - 0.055;
|
|
92
87
|
|
|
93
88
|
//Convert normalized decimal to decimal
|
|
94
|
-
red
|
|
95
|
-
green
|
|
96
|
-
blue
|
|
89
|
+
red = Math.round(red * 255);
|
|
90
|
+
green = Math.round(green * 255);
|
|
91
|
+
blue = Math.round(blue * 255);
|
|
97
92
|
|
|
98
|
-
if (isNaN(red) || red < 0
|
|
93
|
+
if (isNaN(red) || red < 0) {
|
|
99
94
|
red = 0;
|
|
100
95
|
}
|
|
101
96
|
|
|
102
|
-
if (isNaN(green) || green < 0
|
|
97
|
+
if (isNaN(green) || green < 0) {
|
|
103
98
|
green = 0;
|
|
104
99
|
}
|
|
105
100
|
|
|
106
|
-
if (isNaN(blue) || blue < 0
|
|
101
|
+
if (isNaN(blue) || blue < 0) {
|
|
107
102
|
blue = 0;
|
|
108
103
|
}
|
|
109
104
|
|
|
@@ -120,18 +115,18 @@ function cie_to_rgb(x, y, brightness) {
|
|
|
120
115
|
*/
|
|
121
116
|
function rgb_to_cie(red, green, blue) {
|
|
122
117
|
// 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
|
|
123
|
-
red
|
|
124
|
-
green
|
|
125
|
-
blue
|
|
118
|
+
red = (red > 0.04045) ? Math.pow((red + 0.055) / (1.0 + 0.055), 2.4) : (red / 12.92);
|
|
119
|
+
green = (green > 0.04045) ? Math.pow((green + 0.055) / (1.0 + 0.055), 2.4) : (green / 12.92);
|
|
120
|
+
blue = (blue > 0.04045) ? Math.pow((blue + 0.055) / (1.0 + 0.055), 2.4) : (blue / 12.92);
|
|
126
121
|
|
|
127
122
|
// RGB values to XYZ using the Wide RGB D65 conversion formula
|
|
128
|
-
const X
|
|
129
|
-
const Y
|
|
130
|
-
const Z
|
|
123
|
+
const X = red * 0.664511 + green * 0.154324 + blue * 0.162028;
|
|
124
|
+
const Y = red * 0.283881 + green * 0.668433 + blue * 0.047685;
|
|
125
|
+
const Z = red * 0.000088 + green * 0.072310 + blue * 0.986039;
|
|
131
126
|
|
|
132
127
|
// Calculate the xy values from the XYZ values
|
|
133
|
-
let x
|
|
134
|
-
let y
|
|
128
|
+
let x = (X / (X + Y + Z)).toFixed(4);
|
|
129
|
+
let y = (Y / (X + Y + Z)).toFixed(4);
|
|
135
130
|
|
|
136
131
|
if (isNaN(x)) {
|
|
137
132
|
x = 0;
|
|
@@ -150,9 +145,13 @@ function hsvToRGB(h, s, v) {
|
|
|
150
145
|
s = s / 100;
|
|
151
146
|
v = v / 100;
|
|
152
147
|
|
|
153
|
-
let r;
|
|
148
|
+
let r;
|
|
149
|
+
let g;
|
|
150
|
+
let b;
|
|
154
151
|
if (arguments.length === 1) {
|
|
155
|
-
s = h.s
|
|
152
|
+
s = h.s;
|
|
153
|
+
v = h.v;
|
|
154
|
+
h = h.h;
|
|
156
155
|
}
|
|
157
156
|
const i = Math.floor(h * 6);
|
|
158
157
|
const f = h * 6 - i;
|
|
@@ -160,12 +159,36 @@ function hsvToRGB(h, s, v) {
|
|
|
160
159
|
const q = v * (1 - f * s);
|
|
161
160
|
const t = v * (1 - (1 - f) * s);
|
|
162
161
|
switch (i % 6) {
|
|
163
|
-
case 0:
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
case
|
|
162
|
+
case 0:
|
|
163
|
+
r = v;
|
|
164
|
+
g = t;
|
|
165
|
+
b = p;
|
|
166
|
+
break;
|
|
167
|
+
case 1:
|
|
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;
|
|
169
192
|
}
|
|
170
193
|
return {
|
|
171
194
|
r: Math.round(r * 255),
|
|
@@ -176,73 +199,92 @@ function hsvToRGB(h, s, v) {
|
|
|
176
199
|
|
|
177
200
|
function rgbToHSV(r, g, b, numeric) {
|
|
178
201
|
if (arguments.length === 1) {
|
|
179
|
-
g = r.g
|
|
202
|
+
g = r.g;
|
|
203
|
+
b = r.b;
|
|
204
|
+
r = r.r;
|
|
180
205
|
}
|
|
181
|
-
const max = Math.max(r, g, b);
|
|
206
|
+
const max = Math.max(r, g, b);
|
|
207
|
+
const min = Math.min(r, g, b);
|
|
182
208
|
const d = max - min;
|
|
183
209
|
let h;
|
|
184
210
|
const s = (max === 0 ? 0 : d / max);
|
|
185
211
|
const v = max / 255;
|
|
186
212
|
|
|
187
213
|
switch (max) {
|
|
188
|
-
case min:
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
case
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
214
|
+
case min:
|
|
215
|
+
h = 0;
|
|
216
|
+
break;
|
|
217
|
+
case r:
|
|
218
|
+
h = (g - b) + d * (g < b ? 6 : 0);
|
|
219
|
+
h /= 6 * d;
|
|
220
|
+
break;
|
|
221
|
+
case g:
|
|
222
|
+
h = (b - r) + d * 2;
|
|
223
|
+
h /= 6 * d;
|
|
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
|
+
}
|
|
198
237
|
return {
|
|
199
238
|
h: (h * 360).toFixed(3),
|
|
200
239
|
s: (s * 100).toFixed(3),
|
|
201
240
|
v: (v * 100).toFixed(3),
|
|
202
241
|
};
|
|
203
242
|
}
|
|
243
|
+
|
|
204
244
|
function colorArrayFromString(value) {
|
|
205
|
-
if (typeof
|
|
245
|
+
if (typeof value === 'string') {
|
|
206
246
|
const rv = [];
|
|
207
|
-
value.split(',').forEach(element =>
|
|
208
|
-
rv.push(colors.ParseColor(element));
|
|
209
|
-
});
|
|
247
|
+
value.split(',').forEach(element =>
|
|
248
|
+
rv.push(colors.ParseColor(element)));
|
|
210
249
|
return rv;
|
|
211
250
|
}
|
|
212
|
-
return [{r:0,g:128,b:255}];
|
|
251
|
+
return [{r: 0, g: 128, b: 255}];
|
|
213
252
|
}
|
|
214
253
|
|
|
215
|
-
function colorStringFromRGBArray(payload)
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
rv.push(rgb_to_rgbstring(element));
|
|
220
|
-
});
|
|
254
|
+
function colorStringFromRGBArray(payload) {
|
|
255
|
+
const rv = [];
|
|
256
|
+
payload.forEach(element =>
|
|
257
|
+
rv.push(rgb_to_rgbstring(element)));
|
|
221
258
|
return rv.toString();
|
|
222
259
|
}
|
|
223
260
|
|
|
224
|
-
function hsv_to_cie(h,s,v){
|
|
225
|
-
const rgb = hsvToRGB(h,s,v);
|
|
261
|
+
function hsv_to_cie(h, s, v) {
|
|
262
|
+
const rgb = hsvToRGB(h, s, v);
|
|
226
263
|
return rgb_to_cie(rgb.r, rgb.g, rgb.b);
|
|
227
264
|
}
|
|
228
265
|
|
|
229
266
|
function rgb_to_rgbstring(element) {
|
|
230
267
|
let col = '#';
|
|
231
|
-
if (element && element.hasOwnProperty(
|
|
232
|
-
|
|
233
|
-
else
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
268
|
+
if (element && element.hasOwnProperty('r')) {
|
|
269
|
+
col = col + element.r.toString(16).padStart(2, '0');
|
|
270
|
+
} else {
|
|
271
|
+
col = col + '00';
|
|
272
|
+
}
|
|
273
|
+
if (element && element.hasOwnProperty('g')) {
|
|
274
|
+
col = col + element.g.toString(16).padStart(2, '0');
|
|
275
|
+
} else {
|
|
276
|
+
col = col + '00';
|
|
277
|
+
}
|
|
278
|
+
if (element && element.hasOwnProperty('b')) {
|
|
279
|
+
col = col + element.b.toString(16).padStart(2, '0');
|
|
280
|
+
} else {
|
|
281
|
+
col = col + '00';
|
|
282
|
+
}
|
|
240
283
|
return col;
|
|
241
284
|
}
|
|
242
285
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
return rgb_to_rgbstring(hsvToRGB(h,s,v))
|
|
286
|
+
function hsvToRGBString(h, s, v) {
|
|
287
|
+
return rgb_to_rgbstring(hsvToRGB(h, s, v));
|
|
246
288
|
}
|
|
247
289
|
|
|
248
290
|
exports.hsv_to_cie = hsv_to_cie;
|
package/lib/seriallist.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
let SerialPort = null;
|
|
5
4
|
|
|
6
5
|
class SerialList {
|
|
7
6
|
constructor(adapter) {
|
|
8
7
|
this.adapter = adapter;
|
|
9
|
-
this.adapter.on('message', this.onMessage
|
|
8
|
+
this.adapter.on('message', obj => this.onMessage(obj));
|
|
10
9
|
}
|
|
10
|
+
|
|
11
11
|
/**
|
|
12
12
|
* @param {ioBroker.Message} obj
|
|
13
13
|
*/
|
|
@@ -16,28 +16,33 @@ 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
|
-
|
|
19
|
+
SerialPort = SerialPort || require('serialport').SerialPort;
|
|
20
|
+
if (SerialPort) {
|
|
21
|
+
// read all found serial ports
|
|
22
|
+
SerialPort.list()
|
|
23
|
+
.then(ports => {
|
|
24
|
+
this.adapter.log.info(`List of port: ${JSON.stringify(ports)}`);
|
|
25
|
+
this.adapter.sendTo(obj.from, obj.command, ports.map(item => ({
|
|
26
|
+
label: item.friendlyName || item.pnpId || item.manufacturer,
|
|
27
|
+
comName: item.path
|
|
28
|
+
})), obj.callback);
|
|
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
|
+
}
|
|
30
41
|
}
|
|
31
42
|
break;
|
|
32
43
|
}
|
|
33
44
|
}
|
|
34
45
|
}
|
|
35
|
-
|
|
36
|
-
listSerial() {
|
|
37
|
-
return serialPortUtils.find([{}]).then((ports) => {
|
|
38
|
-
return ports.map((port) => {return {comName: port};});
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
46
|
}
|
|
42
47
|
|
|
43
48
|
module.exports = SerialList;
|