UNPKG

14.6 kBJavaScriptView Raw
1/* jshint -W097 */
2/* jshint -W030 */
3/* jshint strict:true */
4/* jslint node: true */
5/* jslint esversion: 6 */
6'use strict';
7
8const colorconv = require('./colorconv');
9
10/**
11 * Celsius to Fahrenheit
12 * @param {number} celsius - 10
13 */
14function 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 * Fahrenheit to Celsius
25 * @param {number} fahrenheit - 20
26 */
27function 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 * @param {*} self
39 * @param {*} devicename - Name of the device like 'livingroom'
40 */
41async function setDeviceName(self, devicename) {
42 let name = devicename;
43 let deviceid = self.getDeviceName();
44 let obj = await self.adapter.getObjectAsync(deviceid);
45 // if (!name) name = 'Device ' + deviceid;
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 * @param {*} self
57 * @param {*} state - channel like Relay0.Channel
58 * @param {*} channelename - Name of the channel like 'channel 1 like livingroom'
59 */
60async 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 // if (!name) name = 'Channel ' + state.split('.').slice(0, 1).join();
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 * returns seconds in format daysDTT:MM:SS
79 * Example: 123D20:10:08 or 12:41:02
80 * @param {number} uptime - seconds
81 */
82function 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 * get the CoAP value by key
105 * @param {integer} key - like 112
106 * @param {array} array - [[0,111,0],[0,112,1]]
107 */
108function 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 * Get external temperature for device with key in unit C or F
119 * @param {*} value - like JSON.parse(value)
120 * @param {*} key - '0', '1', ....
121 * @param {*} unit . 'C' or 'F'
122 */
123function 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 * Get external humidity for device with key
144 * @param {*} value - like JSON.parse(value)
145 * @param {*} key - '0', '1', ....
146 */
147function 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 * @param {*} self
158 */
159async 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
181async 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 * get the hex value for an integer value
199 * @param {*} number like 10 or 99
200 */
201function intToHex(number) {
202 if (!number) number = 0;
203 let hex = number.toString(16);
204 hex = ('00' + hex).slice(-2).toUpperCase(); // 'a' -> '0A'
205 return hex;
206}
207
208/**
209 * get the integer value for a hex value
210 * @param {*} hex like 0A or FF
211 */
212function hextoInt(hex) {
213 if (!hex) hex = '00';
214 return parseInt(hex, 16);
215}
216
217/**
218 * get the RGBW value for red, green, blue, white value
219 * @param {*} self
220 */
221async 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
240function 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
253async 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
264async 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 // stateId = id + '.lights.value';
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
287async function getPowerFactor(self, channel) {
288 // let stateVoltage = await self.adapter.getStateAsync(self.getDeviceName() + '.Emeter' + channel + '.Voltage');
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 // let voltage = stateVoltage.val;
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 * For EM3, it was not a good idea to implement this function. To far away from standard
306 * @param {*} self
307 */
308async 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
319async 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 * For EM3, it was not a good idea to implement this function. To far away from standard
332 * @param {*} self
333 */
334async 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 * For EM3, it was not a good idea to implement this function. To far away from standard
346 * @param {*} self
347 */
348async 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 * For EM3, it was not a good idea to implement this function. To far away from standard
360 * @param {*} self
361 */
362async 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 * Get golor mode like white or color
378 * @param {*} self
379 */
380async 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 * Timer
389 * @param {*} self
390 * @param {*} id - like 'Relay0.Timer'
391 * @param {*} newval - 10
392 */
393async 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 * Get favorite position
412 * @param {*} self
413 * @param {*} id
414 */
415async 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 * @param {*} self - self object
424 * @param {*} id - id of state like relay0.switch
425 * @param {*} value - value like true
426 * @param {*} initvalue - value like false
427 * @param {*} ms - time in ms
428 */
429function 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 * @param {*} self - self object
442 * @param {*} id - id of state like relay0.switch
443 * @param {*} value - value like false or 'huhu'
444 */
445async function setValueForId(self, id, value) {
446 id = self.getDeviceName() + '.' + id;
447 await self.adapter.setStateAsync(id, { val: value, ack: true });
448}
449
450async 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
460module.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};