1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | 'use strict';
|
7 |
|
8 | const colorconv = require('./colorconv');
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | function celsiusToFahrenheit(celsius) {
|
15 | try {
|
16 | let fahrenheit = celsius * 1.8 + 32;
|
17 | return Math.round(fahrenheit * 100) / 100;
|
18 | } catch (error) {
|
19 | return undefined;
|
20 | }
|
21 | }
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 | function fahrenheitToCelsius(fahrenheit) {
|
28 | try {
|
29 | let celsius = (fahrenheit - 32) * 5 / 9;
|
30 | return Math.round(celsius * 100) / 100;
|
31 | } catch (error) {
|
32 | return undefined;
|
33 | }
|
34 | }
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 | async function setDeviceName(self, devicename) {
|
42 | let name = devicename;
|
43 | let deviceid = self.getDeviceName();
|
44 | let obj = await self.adapter.getObjectAsync(deviceid);
|
45 |
|
46 | if (name && obj && obj.common && name !== obj.common.name) {
|
47 | obj.common.name = name;
|
48 | await self.adapter.setObjectAsync(deviceid, obj);
|
49 | self.states[deviceid] = name;
|
50 | }
|
51 | return devicename;
|
52 | }
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 | async function setChannelName(self, state, channelename) {
|
61 | let name = channelename;
|
62 | let channel = state.split('.').slice(0, -1).join();
|
63 | if (channel) {
|
64 | let channelid = self.getDeviceName() + '.' + channel;
|
65 | let obj = await self.adapter.getObjectAsync(channelid);
|
66 |
|
67 | if (name && obj && obj.common && name !== obj.common.name) {
|
68 | obj.common.name = name;
|
69 | await self.adapter.setObjectAsync(channelid, obj);
|
70 | self.states[channelid] = name;
|
71 | }
|
72 | }
|
73 | return channelename;
|
74 | }
|
75 |
|
76 |
|
77 |
|
78 |
|
79 |
|
80 |
|
81 |
|
82 | function uptimeString(uptime) {
|
83 | if (uptime) {
|
84 | let timeDifference = new Date(uptime * 1000);
|
85 | let secondsInADay = 60 * 60 * 1000 * 24;
|
86 | let secondsInAHour = 60 * 60 * 1000;
|
87 | let days = Math.floor(timeDifference / (secondsInADay) * 1);
|
88 | let hours = Math.floor((timeDifference % (secondsInADay)) / (secondsInAHour) * 1);
|
89 | let mins = Math.floor(((timeDifference % (secondsInADay)) % (secondsInAHour)) / (60 * 1000) * 1);
|
90 | let secs = Math.floor((((timeDifference % (secondsInADay)) % (secondsInAHour)) % (60 * 1000)) / 1000 * 1);
|
91 | if (hours < 10) { hours = '0' + hours; }
|
92 | if (mins < 10) { mins = '0' + mins; }
|
93 | if (secs < 10) { secs = '0' + secs; }
|
94 | if (days > 0) {
|
95 | uptime = days + 'D' + hours + ':' + mins + ':' + secs;
|
96 | } else {
|
97 | uptime = hours + ':' + mins + ':' + secs;
|
98 | }
|
99 | }
|
100 | return uptime;
|
101 | }
|
102 |
|
103 |
|
104 |
|
105 |
|
106 |
|
107 |
|
108 | function getCoapValue(key, array) {
|
109 | if (array) {
|
110 | for (let k in array) {
|
111 | if (array[k][1] === key) return array[k][2];
|
112 | }
|
113 | }
|
114 | return undefined;
|
115 | }
|
116 |
|
117 |
|
118 |
|
119 |
|
120 |
|
121 |
|
122 |
|
123 | function getExtTemp(value, key, unit) {
|
124 | let unitkey = '';
|
125 | switch (unit) {
|
126 | case 'C':
|
127 | unitkey = 'tC';
|
128 | break;
|
129 | case 'F':
|
130 | unitkey = 'tF';
|
131 | break;
|
132 | default:
|
133 | return 0;
|
134 | }
|
135 | if (value && value.hasOwnProperty('ext_temperature') && value.ext_temperature.hasOwnProperty(key) && value.ext_temperature[key].hasOwnProperty(unitkey)) {
|
136 | return value.ext_temperature[key][unitkey];
|
137 | } else {
|
138 | return 0;
|
139 | }
|
140 | }
|
141 |
|
142 |
|
143 |
|
144 |
|
145 |
|
146 |
|
147 | function getExtHum(value, key) {
|
148 | if (value && value.hasOwnProperty('ext_humidity') && value.ext_humidity.hasOwnProperty(key) && value.ext_humidity[key].hasOwnProperty('hum')) {
|
149 | return value.ext_humidity[key]['hum'];
|
150 | } else {
|
151 | return 0;
|
152 | }
|
153 | }
|
154 |
|
155 |
|
156 |
|
157 |
|
158 |
|
159 | async function getLightsObjectColor(self) {
|
160 | let id = self.getDeviceName();
|
161 | let obj = {
|
162 | 'ison': 'lights.Switch',
|
163 | 'mode': 'lights.mode',
|
164 | 'red': 'lights.red',
|
165 | 'green': 'lights.green',
|
166 | 'blue': 'lights.blue',
|
167 | 'white': 'lights.white',
|
168 | 'gain': 'lights.gain',
|
169 | 'temp': 'lights.temp',
|
170 | 'brightness': 'lights.brightness',
|
171 | 'effect': 'lights.effect'
|
172 | };
|
173 | for (let i in obj) {
|
174 | let stateId = id + '.' + obj[i];
|
175 | let state = await self.adapter.getStateAsync(stateId);
|
176 | obj[i] = state ? state.val : undefined;
|
177 | }
|
178 | return obj;
|
179 | }
|
180 |
|
181 | async function getLightsObjectWhite(self) {
|
182 | let id = self.getDeviceName();
|
183 | let obj = {
|
184 | 'ison': 'lights.Switch',
|
185 | 'white': 'lights.white',
|
186 | 'temp': 'lights.temp',
|
187 | 'brightness': 'lights.brightness'
|
188 | };
|
189 | for (let i in obj) {
|
190 | let stateId = id + '.' + obj[i];
|
191 | let state = await self.adapter.getStateAsync(stateId);
|
192 | obj[i] = state ? state.val : undefined;
|
193 | }
|
194 | return obj;
|
195 | }
|
196 |
|
197 |
|
198 |
|
199 |
|
200 |
|
201 | function intToHex(number) {
|
202 | if (!number) number = 0;
|
203 | let hex = number.toString(16);
|
204 | hex = ('00' + hex).slice(-2).toUpperCase();
|
205 | return hex;
|
206 | }
|
207 |
|
208 |
|
209 |
|
210 |
|
211 |
|
212 | function hextoInt(hex) {
|
213 | if (!hex) hex = '00';
|
214 | return parseInt(hex, 16);
|
215 | }
|
216 |
|
217 |
|
218 |
|
219 |
|
220 |
|
221 | async function getRGBW(self) {
|
222 | let id = self.getDeviceName();
|
223 | let stateId;
|
224 | let state;
|
225 | stateId = id + '.lights.red';
|
226 | state = await self.adapter.getStateAsync(stateId);
|
227 | let valred = state ? state.val : 0;
|
228 | stateId = id + '.lights.green';
|
229 | state = await self.adapter.getStateAsync(stateId);
|
230 | let valgreen = state ? state.val : 0;
|
231 | stateId = id + '.lights.blue';
|
232 | state = await self.adapter.getStateAsync(stateId);
|
233 | let valblue = state ? state.val : 0;
|
234 | stateId = id + '.lights.white';
|
235 | state = await self.adapter.getStateAsync(stateId);
|
236 | let valwhite = state ? state.val : 0;
|
237 | return '#' + intToHex(valred) + intToHex(valgreen) + intToHex(valblue) + intToHex(valwhite);
|
238 | }
|
239 |
|
240 | function getColorsFromRGBW(value) {
|
241 | value = value || '#00000000';
|
242 | let obj = {
|
243 | red: hextoInt(value.substr(1, 2) || '00'),
|
244 | green: hextoInt(value.substr(3, 2) || '00'),
|
245 | blue: hextoInt(value.substr(5, 2) || '00'),
|
246 | white: hextoInt(value.substr(7, 2) || '00')
|
247 | };
|
248 | return obj;
|
249 | }
|
250 |
|
251 |
|
252 |
|
253 | async function getHsvFromRgb(self) {
|
254 | let value = await getRGBW(self);
|
255 | let rgbw = getColorsFromRGBW(value);
|
256 | let hsv = colorconv.rgbToHsv(rgbw.red, rgbw.green, rgbw.blue);
|
257 | return {
|
258 | hue: hsv[0],
|
259 | saturation: hsv[1],
|
260 | brightness: hsv[2]
|
261 | };
|
262 | }
|
263 |
|
264 | async function getColorsFromHue(self) {
|
265 | let id = self.getDeviceName();
|
266 | let stateId;
|
267 | let state;
|
268 | stateId = id + '.lights.hue';
|
269 | state = await self.adapter.getStateAsync(stateId);
|
270 | let valhue = state ? state.val : 0;
|
271 | stateId = id + '.lights.saturation';
|
272 | state = await self.adapter.getStateAsync(stateId);
|
273 | let valsaturation = state ? state.val : 0;
|
274 |
|
275 | stateId = id + '.lights.gain';
|
276 | state = await self.adapter.getStateAsync(stateId);
|
277 | let valvalue = state ? state.val : 0;
|
278 | let rgb = colorconv.hsvToRgb(valhue, valsaturation, valvalue);
|
279 | let obj = {
|
280 | red: rgb[0],
|
281 | green: rgb[1],
|
282 | blue: rgb[2],
|
283 | };
|
284 | return obj;
|
285 | }
|
286 |
|
287 | async function getPowerFactor(self, channel) {
|
288 |
|
289 | let statePower = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter' + channel + '.Power');
|
290 | let stateReactivePower = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter' + channel + '.ReactivePower');
|
291 | let pf = 0.00;
|
292 | if (statePower && stateReactivePower) {
|
293 |
|
294 | let power = statePower.val;
|
295 | let reactive = stateReactivePower.val;
|
296 | if (Math.abs(power) + Math.abs(reactive) > 1.5) {
|
297 | pf = power / Math.sqrt(power * power + reactive * reactive);
|
298 | pf = Math.round(pf * 100) / 100;
|
299 | }
|
300 | }
|
301 | return pf;
|
302 | }
|
303 |
|
304 |
|
305 |
|
306 |
|
307 |
|
308 | async function getTotalSumm(self) {
|
309 | let calctotal = 0.00;
|
310 | let TotalPhase1 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter0.Total');
|
311 | let TotalPhase2 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter1.Total');
|
312 | let TotalPhase3 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter2.Total');
|
313 | calctotal = (TotalPhase1.val + TotalPhase2.val + TotalPhase3.val);
|
314 | calctotal = Math.round(calctotal * 100) / 100;
|
315 | return calctotal;
|
316 | }
|
317 |
|
318 |
|
319 | async function getTotalReturnedSumm(self) {
|
320 | let calctotal = 0.00;
|
321 | let TotalPhase1 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter0.Total_Returned');
|
322 | let TotalPhase2 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter1.Total_Returned');
|
323 | let TotalPhase3 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter2.Total_Returned');
|
324 | calctotal = (TotalPhase1.val + TotalPhase2.val + TotalPhase3.val);
|
325 | calctotal = Math.round(calctotal * 100) / 100;
|
326 | return calctotal;
|
327 | }
|
328 |
|
329 |
|
330 |
|
331 |
|
332 |
|
333 |
|
334 | async function getCurrentSumm(self) {
|
335 | let calccurrent = 0.00;
|
336 | let CurrentPhase1 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter0.Current');
|
337 | let CurrentPhase2 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter1.Current');
|
338 | let CurrentPhase3 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter2.Current');
|
339 | calccurrent = (CurrentPhase1.val + CurrentPhase2.val + CurrentPhase3.val);
|
340 | calccurrent = Math.round(calccurrent * 100) / 100;
|
341 | return calccurrent;
|
342 | }
|
343 |
|
344 |
|
345 |
|
346 |
|
347 |
|
348 | async function getPowerSumm(self) {
|
349 | let calcPower = 0.00;
|
350 | let PowerPhase1 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter0.Power');
|
351 | let PowerPhase2 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter1.Power');
|
352 | let PowerPhase3 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter2.Power');
|
353 | calcPower = (PowerPhase1.val + PowerPhase2.val + PowerPhase3.val);
|
354 | calcPower = Math.round(calcPower * 100) / 100;
|
355 | return calcPower;
|
356 | }
|
357 |
|
358 |
|
359 |
|
360 |
|
361 |
|
362 | async function getVoltageCalc(self, vtype) {
|
363 | let calcVoltage = 0.00;
|
364 | let VoltagePhase1 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter0.Voltage');
|
365 | let VoltagePhase2 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter1.Voltage');
|
366 | let VoltagePhase3 = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter2.Voltage');
|
367 | if (vtype == 'mean') {
|
368 | calcVoltage = ((VoltagePhase1.val + VoltagePhase2.val + VoltagePhase3.val) / 3);
|
369 | } else {
|
370 | calcVoltage = ((VoltagePhase1.val + VoltagePhase2.val + VoltagePhase3.val) / Math.sqrt(3));
|
371 | }
|
372 | calcVoltage = Math.round(calcVoltage * 100) / 100;
|
373 | return calcVoltage;
|
374 | }
|
375 |
|
376 |
|
377 |
|
378 |
|
379 |
|
380 | async function getMode(self) {
|
381 | let id = self.getDeviceName();
|
382 | let stateId = id + '.mode';
|
383 | let state = await self.adapter.getStateAsync(stateId);
|
384 | return state ? state.val : undefined;
|
385 | }
|
386 |
|
387 |
|
388 |
|
389 |
|
390 |
|
391 |
|
392 |
|
393 | async function getSetDuration(self, id, newval) {
|
394 | try {
|
395 | id = self.getDeviceName() + '.' + id;
|
396 | let state = await self.adapter.getStateAsync(id);
|
397 | let value;
|
398 | if (state) {
|
399 | value = state.val > 0 ? state.val : 0;
|
400 | }
|
401 | if (newval >= 0) {
|
402 | await self.adapter.setStateAsync(id, { val: newval, ack: true });
|
403 | }
|
404 | return value;
|
405 | } catch (error) {
|
406 | return 0;
|
407 | }
|
408 | }
|
409 |
|
410 |
|
411 |
|
412 |
|
413 |
|
414 |
|
415 | async function getFavoritePosition(self, id) {
|
416 | let node = self.getDeviceName() + '.' + id;
|
417 | let state = await self.adapter.getStateAsync(node);
|
418 | return state ? state.val : undefined;
|
419 | }
|
420 |
|
421 |
|
422 |
|
423 |
|
424 |
|
425 |
|
426 |
|
427 |
|
428 |
|
429 | function setAndInitValue(self, id, value, initvalue, ms) {
|
430 | id = self.getDeviceName() + '.' + id;
|
431 | if (!ms) ms = 100;
|
432 | if (value != initvalue) setTimeout(async () => {
|
433 | self.states[id] = initvalue;
|
434 | await self.adapter.setStateAsync(id, { val: initvalue, ack: true });
|
435 | }, ms);
|
436 | return value;
|
437 | }
|
438 |
|
439 |
|
440 |
|
441 |
|
442 |
|
443 |
|
444 |
|
445 | async function setValueForId(self, id, value) {
|
446 | id = self.getDeviceName() + '.' + id;
|
447 | await self.adapter.setStateAsync(id, { val: value, ack: true });
|
448 | }
|
449 |
|
450 | async function getValue(self, id) {
|
451 | try {
|
452 | if (id && id[0] !== '.') id = '.' + id;
|
453 | let state = await self.adapter.getStateAsync(self.getDeviceName() + id);
|
454 | if (state) { return state.val; } else { return undefined; }
|
455 | } catch (error) {
|
456 | return undefined;
|
457 | }
|
458 | }
|
459 |
|
460 | module.exports = {
|
461 | celsiusToFahrenheit: celsiusToFahrenheit,
|
462 | fahrenheitToCelsius: fahrenheitToCelsius,
|
463 | setDeviceName: setDeviceName,
|
464 | setChannelName: setChannelName,
|
465 | uptimeString: uptimeString,
|
466 | getExtTemp: getExtTemp,
|
467 | getExtHum: getExtHum,
|
468 | getLightsObjectColor: getLightsObjectColor,
|
469 | getLightsObjectWhite: getLightsObjectWhite,
|
470 | intToHex: intToHex,
|
471 | getHsvFromRgb: getHsvFromRgb,
|
472 | getColorsFromHue: getColorsFromHue,
|
473 | getColorsFromRGBW: getColorsFromRGBW,
|
474 | getPowerFactor: getPowerFactor,
|
475 | getTotalSumm: getTotalSumm,
|
476 | getTotalReturnedSumm: getTotalReturnedSumm,
|
477 | getCurrentSumm: getCurrentSumm,
|
478 | getPowerSumm: getPowerSumm,
|
479 | getVoltageCalc: getVoltageCalc,
|
480 | getMode: getMode,
|
481 | getSetDuration: getSetDuration,
|
482 | getFavoritePosition: getFavoritePosition,
|
483 | getRGBW: getRGBW,
|
484 | setAndInitValue: setAndInitValue,
|
485 | setValueForId: setValueForId,
|
486 | getValue: getValue
|
487 | };
|