iobroker.zigbee2mqtt 2.1.0 → 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/lib/messages.js CHANGED
@@ -1,39 +1,39 @@
1
1
  async function adapterInfo(config, log) {
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('==================================================================================');
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
- 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('==================================================================================');
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
- adapterInfo,
38
- zigbee2mqttInfo,
37
+ adapterInfo,
38
+ zigbee2mqttInfo,
39
39
  };
@@ -4,39 +4,39 @@ const net = require('net');
4
4
 
5
5
 
6
6
  class MqttServerController {
7
- constructor(adapter) {
8
- this.adapter = adapter;
9
- }
7
+ constructor(adapter) {
8
+ this.adapter = adapter;
9
+ }
10
10
 
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
- }
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
- 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
- }
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
- MqttServerController
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
- //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];
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
- // 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];
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
- 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
- };
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
- 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
- };
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
- 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 }];
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
- const rv = [];
251
- payload.forEach(element => {
252
- rv.push(rgb_to_rgbstring(element));
253
- });
254
- return rv.toString();
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
- const rgb = hsvToRGB(h, s, v);
259
- return rgb_to_cie(rgb.r, rgb.g, rgb.b);
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
- 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;
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
- return rgb_to_rgbstring(hsvToRGB(h, s, v));
299
+ return rgb_to_rgbstring(hsvToRGB(h, s, v));
279
300
  }
280
301
 
281
- exports.hsv_to_cie = hsv_to_cie;
282
- exports.rgb_to_cie = rgb_to_cie;
283
- exports.cie_to_rgb = cie_to_rgb;
284
- exports.hsvToRGB = hsvToRGB;
285
- exports.rgbToHSV = rgbToHSV;
286
- exports.colorArrayFromString = colorArrayFromString;
287
- exports.colorStringFromRGBArray = colorStringFromRGBArray;
288
- exports.hsvToRGBString = hsvToRGBString;
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
+ };