iobroker.zigbee2mqtt 2.1.1 → 2.2.0
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/io-package.json +14 -13
- package/lib/check.js +30 -30
- package/lib/colors.js +442 -443
- package/lib/deviceController.js +235 -232
- package/lib/exposes.js +867 -859
- package/lib/messages.js +31 -31
- package/lib/mqttServerController.js +30 -30
- package/lib/nonGenericDevicesExtension.js +47 -0
- package/lib/rgb.js +227 -203
- package/lib/states.js +6374 -6374
- package/lib/statesController.js +129 -129
- package/lib/utils.js +82 -82
- package/lib/websocketController.js +58 -58
- package/lib/z2mController.js +69 -64
- package/main.js +201 -201
- package/package.json +1 -1
package/lib/messages.js
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
async function adapterInfo(config, log) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
2
|
+
log.info('================================= Adapter Config =================================');
|
|
3
|
+
log.info(`|| Zigbee2MQTT Frontend Scheme: ${config.webUIScheme}`);
|
|
4
|
+
log.info(`|| Zigbee2MQTT Frontend Server: ${config.webUIServer}`);
|
|
5
|
+
log.info(`|| Zigbee2MQTT Frontend Port: ${config.webUIPort}`);
|
|
6
|
+
log.info(`|| Zigbee2MQTT Connection Type: ${config.connectionType}`);
|
|
7
|
+
if (config.connectionType == 'ws') {
|
|
8
|
+
log.info(`|| Zigbee2MQTT Websocket Server: ${config.wsServerIP}`);
|
|
9
|
+
log.info(`|| Zigbee2MQTT Websocket Port: ${config.wsServerPort}`);
|
|
10
|
+
log.info(`|| Zigbee2MQTT Websocket Dummy MQTT-Server: ${config.dummyMqtt ? 'activated' : 'deactivated'}`);
|
|
11
|
+
if (config.dummyMqtt == true) {
|
|
12
|
+
log.info(`|| Zigbee2MQTT Dummy MQTT IP-Bind: ${config.mqttServerIPBind}`);
|
|
13
|
+
log.info(`|| Zigbee2MQTT Dummy MQTT Port: ${config.mqttServerPort}`);
|
|
14
|
+
}
|
|
15
|
+
} else if (config.connectionType == 'exmqtt') {
|
|
16
|
+
log.info(`|| Zigbee2MQTT Externanl MQTT Server: ${config.externalMqttServerIP}`);
|
|
17
|
+
log.info(`|| Zigbee2MQTT Externanl MQTT Port: ${config.externalMqttServerPort}`);
|
|
18
|
+
} else if (config.connectionType == 'intmqtt') {
|
|
19
|
+
log.info(`|| Zigbee2MQTT Internal MQTT IP-Bind: ${config.mqttServerIPBind}`);
|
|
20
|
+
log.info(`|| Zigbee2MQTT Internal MQTT Port: ${config.mqttServerPort}`);
|
|
21
|
+
}
|
|
22
|
+
log.info(`|| Zigbee2MQTT Debug Log: ${config.debugLogEnabled ? 'activated' : 'deactivated'}`);
|
|
23
|
+
log.info(`|| Proxy Zigbee2MQTT Logs to ioBroker Logs: ${config.proxyZ2MLogs ? 'activated' : 'deactivated'}`);
|
|
24
|
+
log.info(`|| Use Kelvin: ${config.useKelvin ? 'yes' : 'no'}`);
|
|
25
|
+
log.info('==================================================================================');
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
async function zigbee2mqttInfo(payload, log) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
log.info('============================ Zigbee2MQTT Information =============================');
|
|
30
|
+
log.info(`|| Zigbee2MQTT Version: ${payload.version} `);
|
|
31
|
+
log.info(`|| Coordinator type: ${payload.coordinator.type} Version: ${payload.coordinator.meta.revision} Serial: ${payload.config.serial.port}`);
|
|
32
|
+
log.info(`|| Network panid ${payload.network.pan_id} channel: ${payload.network.channel} ext_pan_id: ${payload.network.extended_pan_id}`);
|
|
33
|
+
log.info('==================================================================================');
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
module.exports = {
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
adapterInfo,
|
|
38
|
+
zigbee2mqttInfo,
|
|
39
39
|
};
|
|
@@ -4,39 +4,39 @@ const net = require('net');
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
class MqttServerController {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
constructor(adapter) {
|
|
8
|
+
this.adapter = adapter;
|
|
9
|
+
}
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
11
|
+
async createMQTTServer() {
|
|
12
|
+
try {
|
|
13
|
+
const NedbPersistence = require('aedes-persistence-nedb');
|
|
14
|
+
const db = new NedbPersistence({ path: `${core.getAbsoluteInstanceDataDir(this.adapter)}/mqttData`, prefix: '' });
|
|
15
|
+
// @ts-ignore
|
|
16
|
+
const aedes = Aedes({ persistence: db });
|
|
17
|
+
const mqttServer = net.createServer(aedes.handle);
|
|
18
|
+
mqttServer.listen(this.adapter.config.mqttServerPort, this.adapter.config.mqttServerIPBind, () => {
|
|
19
|
+
this.adapter.log.info(`Statring MQTT-Server on IP ${this.adapter.config.mqttServerIPBind} and Port ${this.adapter.config.mqttServerPort}`);
|
|
20
|
+
});
|
|
21
|
+
} catch (err) {
|
|
22
|
+
this.adapter.log.error(err);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
26
|
+
async createDummyMQTTServer() {
|
|
27
|
+
try {
|
|
28
|
+
// @ts-ignore
|
|
29
|
+
const aedes = Aedes();
|
|
30
|
+
const mqttServer = net.createServer(aedes.handle);
|
|
31
|
+
mqttServer.listen(this.adapter.config.mqttServerPort, this.adapter.config.mqttServerIPBind, () => {
|
|
32
|
+
this.adapter.log.info(`Statring DummyMQTT-Server on IP ${this.adapter.config.mqttServerIPBind} and Port ${this.adapter.config.mqttServerPort}`);
|
|
33
|
+
});
|
|
34
|
+
} catch (err) {
|
|
35
|
+
this.adapter.log.error(err);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
module.exports = {
|
|
41
|
-
|
|
41
|
+
MqttServerController
|
|
42
42
|
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const nonGenDevStatesDefs = {
|
|
2
|
+
// https://www.zigbee2mqtt.io/devices/HG06467.html#trigger-effects
|
|
3
|
+
HG06467: [{
|
|
4
|
+
id: 'effect',
|
|
5
|
+
prop: 'effect',
|
|
6
|
+
name: 'effect',
|
|
7
|
+
icon: undefined,
|
|
8
|
+
role: 'state',
|
|
9
|
+
write: true,
|
|
10
|
+
read: true,
|
|
11
|
+
type: 'string',
|
|
12
|
+
def: '{"effect":{"effect":"snake","speed":100,"colors":[{"r":255,"g":0,"b":0},{"r":0,"g":255,"b":0},{"r":0,"g":0,"b":255}]}}',
|
|
13
|
+
setter: (value) => {
|
|
14
|
+
try {
|
|
15
|
+
const valObj = JSON.parse(value);
|
|
16
|
+
if (valObj.effect && valObj.effect.effect) {
|
|
17
|
+
return valObj.effect;
|
|
18
|
+
}
|
|
19
|
+
return valObj;
|
|
20
|
+
|
|
21
|
+
} catch (error) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
},
|
|
26
|
+
getter: payload => {
|
|
27
|
+
if (!payload.effect) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
return JSON.stringify(payload.effect);
|
|
31
|
+
},
|
|
32
|
+
}]
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
function getStateDefinition(model) {
|
|
36
|
+
const stateDef = nonGenDevStatesDefs[model];
|
|
37
|
+
if (stateDef) {
|
|
38
|
+
return stateDef;
|
|
39
|
+
} else {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
module.exports = {
|
|
46
|
+
getStateDefinition
|
|
47
|
+
};
|
package/lib/rgb.js
CHANGED
|
@@ -47,68 +47,68 @@ const colors = require('./colors.js');
|
|
|
47
47
|
* @return {Array} Array that contains the color values for red, green and blue
|
|
48
48
|
*/
|
|
49
49
|
function cie_to_rgb(x, y, brightness) {
|
|
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
|
-
|
|
50
|
+
//Set to maximum brightness if no custom value was given (Not the slick ECMAScript 6 way for compatibility reasons)
|
|
51
|
+
if (brightness === undefined) {
|
|
52
|
+
brightness = 254;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const z = 1.0 - x - y;
|
|
56
|
+
const Y = (brightness / 254).toFixed(2);
|
|
57
|
+
// @ts-ignore
|
|
58
|
+
const X = (Y / y) * x;
|
|
59
|
+
// @ts-ignore
|
|
60
|
+
const Z = (Y / y) * z;
|
|
61
|
+
|
|
62
|
+
//Convert to RGB using Wide RGB D65 conversion
|
|
63
|
+
// @ts-ignore
|
|
64
|
+
let red = X * 1.656492 - Y * 0.354851 - Z * 0.255038;
|
|
65
|
+
// @ts-ignore
|
|
66
|
+
let green = -X * 0.707196 + Y * 1.655397 + Z * 0.036152;
|
|
67
|
+
// @ts-ignore
|
|
68
|
+
let blue = X * 0.051713 - Y * 0.121364 + Z * 1.011530;
|
|
69
|
+
|
|
70
|
+
//If red, green or blue is larger than 1.0 set it back to the maximum of 1.0
|
|
71
|
+
if (red > blue && red > green && red > 1.0) {
|
|
72
|
+
|
|
73
|
+
green = green / red;
|
|
74
|
+
blue = blue / red;
|
|
75
|
+
red = 1.0;
|
|
76
|
+
} else if (green > blue && green > red && green > 1.0) {
|
|
77
|
+
|
|
78
|
+
red = red / green;
|
|
79
|
+
blue = blue / green;
|
|
80
|
+
green = 1.0;
|
|
81
|
+
} else if (blue > red && blue > green && blue > 1.0) {
|
|
82
|
+
|
|
83
|
+
red = red / blue;
|
|
84
|
+
green = green / blue;
|
|
85
|
+
blue = 1.0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
//Reverse gamma correction
|
|
89
|
+
red = red <= 0.0031308 ? 12.92 * red : (1.0 + 0.055) * Math.pow(red, (1.0 / 2.4)) - 0.055;
|
|
90
|
+
green = green <= 0.0031308 ? 12.92 * green : (1.0 + 0.055) * Math.pow(green, (1.0 / 2.4)) - 0.055;
|
|
91
|
+
blue = blue <= 0.0031308 ? 12.92 * blue : (1.0 + 0.055) * Math.pow(blue, (1.0 / 2.4)) - 0.055;
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
//Convert normalized decimal to decimal
|
|
95
|
+
red = Math.round(red * 255);
|
|
96
|
+
green = Math.round(green * 255);
|
|
97
|
+
blue = Math.round(blue * 255);
|
|
98
|
+
|
|
99
|
+
if (isNaN(red) || red < 0) {
|
|
100
|
+
red = 0;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (isNaN(green) || green < 0) {
|
|
104
|
+
green = 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (isNaN(blue) || blue < 0) {
|
|
108
|
+
blue = 0;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return [red, green, blue];
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
|
|
@@ -120,169 +120,193 @@ function cie_to_rgb(x, y, brightness) {
|
|
|
120
120
|
* @return {Array} Array that contains the CIE color values for x and y
|
|
121
121
|
*/
|
|
122
122
|
function rgb_to_cie(red, green, blue) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
123
|
+
// 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
|
|
124
|
+
red = (red > 0.04045) ? Math.pow((red + 0.055) / (1.0 + 0.055), 2.4) : (red / 12.92);
|
|
125
|
+
green = (green > 0.04045) ? Math.pow((green + 0.055) / (1.0 + 0.055), 2.4) : (green / 12.92);
|
|
126
|
+
blue = (blue > 0.04045) ? Math.pow((blue + 0.055) / (1.0 + 0.055), 2.4) : (blue / 12.92);
|
|
127
|
+
|
|
128
|
+
// RGB values to XYZ using the Wide RGB D65 conversion formula
|
|
129
|
+
const X = red * 0.664511 + green * 0.154324 + blue * 0.162028;
|
|
130
|
+
const Y = red * 0.283881 + green * 0.668433 + blue * 0.047685;
|
|
131
|
+
const Z = red * 0.000088 + green * 0.072310 + blue * 0.986039;
|
|
132
|
+
|
|
133
|
+
// Calculate the xy values from the XYZ values
|
|
134
|
+
let x = (X / (X + Y + Z)).toFixed(4);
|
|
135
|
+
let y = (Y / (X + Y + Z)).toFixed(4);
|
|
136
|
+
|
|
137
|
+
// @ts-ignore
|
|
138
|
+
if (isNaN(x)) {
|
|
139
|
+
// @ts-ignore
|
|
140
|
+
x = 0;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// @ts-ignore
|
|
144
|
+
if (isNaN(y)) {
|
|
145
|
+
// @ts-ignore
|
|
146
|
+
y = 0;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return [x, y];
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
|
|
153
153
|
function hsvToRGB(h, s, v) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
154
|
+
h = h % 360 / 360;
|
|
155
|
+
s = s / 100;
|
|
156
|
+
v = v / 100;
|
|
157
|
+
|
|
158
|
+
let r;
|
|
159
|
+
let g;
|
|
160
|
+
let b;
|
|
161
|
+
if (arguments.length === 1) {
|
|
162
|
+
s = h.s, v = h.v, h = h.h;
|
|
163
|
+
}
|
|
164
|
+
const i = Math.floor(h * 6);
|
|
165
|
+
const f = h * 6 - i;
|
|
166
|
+
const p = v * (1 - s);
|
|
167
|
+
const q = v * (1 - f * s);
|
|
168
|
+
const t = v * (1 - (1 - f) * s);
|
|
169
|
+
switch (i % 6) {
|
|
170
|
+
case 0:
|
|
171
|
+
r = v, g = t, b = p;
|
|
172
|
+
break;
|
|
173
|
+
case 1:
|
|
174
|
+
r = q, g = v, b = p;
|
|
175
|
+
break;
|
|
176
|
+
case 2:
|
|
177
|
+
r = p, g = v, b = t;
|
|
178
|
+
break;
|
|
179
|
+
case 3:
|
|
180
|
+
r = p, g = q, b = v;
|
|
181
|
+
break;
|
|
182
|
+
case 4:
|
|
183
|
+
r = t, g = p, b = v;
|
|
184
|
+
break;
|
|
185
|
+
case 5:
|
|
186
|
+
r = v, g = p, b = q;
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
r: Math.round(r * 255),
|
|
191
|
+
g: Math.round(g * 255),
|
|
192
|
+
b: Math.round(b * 255),
|
|
193
|
+
};
|
|
194
194
|
}
|
|
195
195
|
|
|
196
196
|
function rgbToHSV(r, g, b, numeric) {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
197
|
+
if (arguments.length === 1) {
|
|
198
|
+
g = r.g, b = r.b, r = r.r;
|
|
199
|
+
}
|
|
200
|
+
const max = Math.max(r, g, b);
|
|
201
|
+
const min = Math.min(r, g, b);
|
|
202
|
+
const d = max - min;
|
|
203
|
+
let h;
|
|
204
|
+
const s = (max === 0 ? 0 : d / max);
|
|
205
|
+
const v = max / 255;
|
|
206
|
+
|
|
207
|
+
switch (max) {
|
|
208
|
+
case min:
|
|
209
|
+
h = 0;
|
|
210
|
+
break;
|
|
211
|
+
case r:
|
|
212
|
+
h = (g - b) + d * (g < b ? 6 : 0);
|
|
213
|
+
h /= 6 * d;
|
|
214
|
+
break;
|
|
215
|
+
case g:
|
|
216
|
+
h = (b - r) + d * 2;
|
|
217
|
+
h /= 6 * d;
|
|
218
|
+
break;
|
|
219
|
+
case b:
|
|
220
|
+
h = (r - g) + d * 4;
|
|
221
|
+
h /= 6 * d;
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
if (numeric) return {
|
|
225
|
+
// @ts-ignore
|
|
226
|
+
h: Math.round(h * 360),
|
|
227
|
+
s: Math.round(s * 100),
|
|
228
|
+
v: Math.round(v * 100),
|
|
229
|
+
};
|
|
230
|
+
return {
|
|
231
|
+
// @ts-ignore
|
|
232
|
+
h: (h * 360).toFixed(3),
|
|
233
|
+
s: (s * 100).toFixed(3),
|
|
234
|
+
v: (v * 100).toFixed(3),
|
|
235
|
+
};
|
|
236
236
|
}
|
|
237
237
|
|
|
238
238
|
function colorArrayFromString(value) {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
239
|
+
if (typeof (value) === 'string') {
|
|
240
|
+
const rv = [];
|
|
241
|
+
value.split(',').forEach(element => {
|
|
242
|
+
rv.push(colors.ParseColor(element));
|
|
243
|
+
});
|
|
244
|
+
return rv;
|
|
245
|
+
}
|
|
246
|
+
return [{ r: 0, g: 128, b: 255 }];
|
|
247
247
|
}
|
|
248
248
|
|
|
249
249
|
function colorStringFromRGBArray(payload) {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
250
|
+
const rv = [];
|
|
251
|
+
payload.forEach(element => {
|
|
252
|
+
rv.push(rgb_to_rgbstring(element));
|
|
253
|
+
});
|
|
254
|
+
return rv.toString();
|
|
255
255
|
}
|
|
256
256
|
|
|
257
257
|
function hsv_to_cie(h, s, v) {
|
|
258
|
-
|
|
259
|
-
|
|
258
|
+
const rgb = hsvToRGB(h, s, v);
|
|
259
|
+
return rgb_to_cie(rgb.r, rgb.g, rgb.b);
|
|
260
260
|
}
|
|
261
261
|
|
|
262
262
|
function rgb_to_rgbstring(element) {
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
263
|
+
let col = '#';
|
|
264
|
+
if (element && element.hasOwnProperty('r'))
|
|
265
|
+
col = col + element.r.toString(16).padStart(2, '0');
|
|
266
|
+
else col = col + '00';
|
|
267
|
+
if (element && element.hasOwnProperty('g'))
|
|
268
|
+
col = col + element.g.toString(16).padStart(2, '0');
|
|
269
|
+
else col = col + '00';
|
|
270
|
+
if (element && element.hasOwnProperty('b'))
|
|
271
|
+
col = col + element.b.toString(16).padStart(2, '0');
|
|
272
|
+
else col = col + '00';
|
|
273
|
+
return col;
|
|
274
274
|
}
|
|
275
275
|
|
|
276
|
+
function hsbToRGB(h, s, b) {
|
|
277
|
+
const br = Math.round(b * 2.55);
|
|
278
|
+
if (s == 0) {
|
|
279
|
+
return [br, br, br];
|
|
280
|
+
} else {
|
|
281
|
+
const hue = h % 360;
|
|
282
|
+
const f = hue % 60;
|
|
283
|
+
const p = Math.round((b * (100 - s)) * .0255);
|
|
284
|
+
const q = Math.round((b * (6000 - s * f)) * .000425);
|
|
285
|
+
const t = Math.round((b * (6000 - s * (60 - f))) * .000425);
|
|
286
|
+
switch (Math.floor(hue / 60)) {
|
|
287
|
+
case 0: return [br, t, p];
|
|
288
|
+
case 1: return [q, br, p];
|
|
289
|
+
case 2: return [p, br, t];
|
|
290
|
+
case 3: return [p, q, br];
|
|
291
|
+
case 4: return [t, p, br];
|
|
292
|
+
case 5: return [br, p, q];
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
276
297
|
|
|
277
298
|
function hsvToRGBString(h, s, v) {
|
|
278
|
-
|
|
299
|
+
return rgb_to_rgbstring(hsvToRGB(h, s, v));
|
|
279
300
|
}
|
|
280
301
|
|
|
281
|
-
exports
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
302
|
+
module.exports = {
|
|
303
|
+
hsv_to_cie,
|
|
304
|
+
rgb_to_cie,
|
|
305
|
+
cie_to_rgb,
|
|
306
|
+
hsvToRGB,
|
|
307
|
+
rgbToHSV,
|
|
308
|
+
colorArrayFromString,
|
|
309
|
+
colorStringFromRGBArray,
|
|
310
|
+
hsvToRGBString,
|
|
311
|
+
hsbToRGB,
|
|
312
|
+
};
|