iobroker.sprinklecontrol 0.2.12 → 0.2.14

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.
Files changed (62) hide show
  1. package/{Lizenz → LICENSE} +21 -21
  2. package/README.md +80 -129
  3. package/admin/i18n/de/translations.json +134 -0
  4. package/admin/i18n/en/translations.json +134 -0
  5. package/admin/i18n/es/translations.json +134 -0
  6. package/admin/i18n/fr/translations.json +134 -0
  7. package/admin/i18n/it/translations.json +134 -0
  8. package/admin/i18n/nl/translations.json +134 -0
  9. package/admin/i18n/pl/translations.json +134 -0
  10. package/admin/i18n/pt/translations.json +134 -0
  11. package/admin/i18n/ru/translations.json +134 -0
  12. package/admin/i18n/uk/translations.json +134 -0
  13. package/admin/i18n/zh-cn/translations.json +134 -0
  14. package/admin/index_m.html +904 -907
  15. package/admin/index_m.js +779 -780
  16. package/admin/style.css +453 -158
  17. package/admin/words.js +143 -136
  18. package/io-package.json +268 -189
  19. package/lib/adapter-config.d.ts +19 -16
  20. package/lib/evaporation.js +443 -412
  21. package/lib/myConfig.js +373 -359
  22. package/lib/sendMessageText.js +162 -199
  23. package/lib/tools.js +148 -118
  24. package/lib/valveControl.js +918 -888
  25. package/main.js +2041 -1764
  26. package/package.json +51 -30
  27. package/.commitmessage +0 -4
  28. package/.gitattributes +0 -2
  29. package/admin/admin.d.ts +0 -1
  30. package/docs/de/img/E-Mail.jpg +0 -0
  31. package/docs/de/img/Extraeinstellungen.jpg +0 -0
  32. package/docs/de/img/Pumpeneinstellung.jpg +0 -0
  33. package/docs/de/img/Pushover.jpg +0 -0
  34. package/docs/de/img/Select_ID.jpg +0 -0
  35. package/docs/de/img/Telegram.jpg +0 -0
  36. package/docs/de/img/Ventil-Haupteinstellung.jpg +0 -0
  37. package/docs/de/img/Ventil-Pumpeneinstellung.jpg +0 -0
  38. package/docs/de/img/WhatsApp.jpg +0 -0
  39. package/docs/de/img/Zeiteinstellung.jpg +0 -0
  40. package/docs/de/img/analog.jpg +0 -0
  41. package/docs/de/img/bistabil.jpg +0 -0
  42. package/docs/de/img/control.jpg +0 -0
  43. package/docs/de/img/festeTage.jpg +0 -0
  44. package/docs/de/img/main.jpg +0 -0
  45. package/docs/de/img/main_tab.jpg +0 -0
  46. package/docs/de/img/schaltverhalten.jpg +0 -0
  47. package/docs/de/img/sprinklecontrol.png +0 -0
  48. package/docs/de/img/verdunstDiagra.jpg +0 -0
  49. package/docs/de/img/verdunstung.jpg +0 -0
  50. package/docs/de/sprinklecontrol.md +0 -588
  51. package/docs/en/img/schaltverhalten.jpg +0 -0
  52. package/docs/en/img/screenshot1.jpg +0 -0
  53. package/docs/en/img/screenshot2.jpg +0 -0
  54. package/docs/en/img/screenshot3.jpg +0 -0
  55. package/docs/en/img/screenshot4.jpg +0 -0
  56. package/docs/en/img/screenshot5.jpg +0 -0
  57. package/docs/en/img/screenshot6.jpg +0 -0
  58. package/docs/en/img/screenshot7.jpg +0 -0
  59. package/docs/en/img/screenshot8.jpg +0 -0
  60. package/docs/en/img/sprinklecontrol.png +0 -0
  61. package/docs/en/sprinklecontrol.md +0 -230
  62. package/main.test.js +0 -30
@@ -1,200 +1,163 @@
1
- 'use strict';
2
- /*
3
- info: log aufbau sendMessageText.js: #4.*
4
- */
5
- /**
6
- * The adapter instance
7
- * @type {ioBroker.Adapter}
8
- */
9
- let adapter;
10
- /**
11
- *
12
- * @type {{}}
13
- */
14
- let ObjMessage = {};
15
-
16
- /**
17
- * Modul zum Versenden von Nachrichten mittels Telegram, E-Mail, Pushover oder WhatsApp
18
- * der passende Adapter muss installiert sein!
19
- * @type {{onlySendError(): boolean, sendMessage(string): void, initConfigMessage(ioBroker.Adapter): void}}
20
- */
21
- const sendMessageText = {
22
-
23
- /**
24
- *
25
- * @param {ioBroker.Adapter} myAdapter - Kopie von Adapter main.js
26
- */
27
- initConfigMessage (myAdapter) {
28
- adapter = myAdapter;
29
- switch (adapter.config.notificationsType) {
30
- case 'Telegram':
31
- ObjMessage = {
32
- /** @type {boolean} */ enabled: adapter.config.notificationEnabled || false,
33
- /** @type {string} */ notificationsType: adapter.config.notificationsType,
34
- /** @type {string} */ type: 'message',
35
- /** @type {string} */ instance: adapter.config.telegramInstance,
36
- /** @type {boolean} */ silentNotice: adapter.config.telegramSilentNotice,
37
- /** @type {boolean} */ noticeType: (adapter.config.telegramNoticeType === 'longTelegramNotice'),
38
- /** @type {string} */ user: adapter.config.telegramUser,
39
- /** @type {boolean} */ onlyError: adapter.config.telegramOnlyError,
40
- /** @type {number} */ waiting: parseInt(adapter.config.telegramWaitToSend) * 1000
41
- };
42
- break;
43
-
44
- case 'E-Mail':
45
- ObjMessage = {
46
- /** @type {boolean} */ enabled: adapter.config.notificationEnabled || false,
47
- /** @type {string} */ notificationsType: adapter.config.notificationsType,
48
- /** @type {string} */ type: 'message',
49
- /** @type {string} */ instance: adapter.config.emailInstance,
50
- /** @type {boolean} */ noticeType: (adapter.config.emailNoticeType === 'longEmailNotice'),
51
- /** @type {string} */ emailReceiver: adapter.config.emailReceiver,
52
- /** @type {string} */ emailSender: adapter.config.emailSender,
53
- /** @type {boolean} */ onlyError: adapter.config.emailOnlyError,
54
- /** @type {number} */ waiting: (parseInt(adapter.config.emailWaitToSend) * 1000) || 0
55
- };
56
- break;
57
-
58
- case 'Pushover':
59
- ObjMessage = {
60
- /** @type {boolean} */ enabled: adapter.config.notificationEnabled || false,
61
- /** @type {string} */ notificationsType: adapter.config.notificationsType,
62
- /** @type {string} */ type: 'message',
63
- /** @type {string} */ sound: adapter.config.pushoverSound,
64
- /** @type {string} */ instance: adapter.config.pushoverInstance,
65
- /** @type {boolean} */ silentNotice: adapter.config.pushoverSilentNotice,
66
- /** @type {boolean} */ noticeType: (adapter.config.pushoverNoticeType === 'longPushoverNotice'),
67
- /** @type {string} */ deviceID: adapter.config.pushoverDeviceID,
68
- /** @type {boolean} */ onlyError: adapter.config.pushoverOnlyError,
69
- /** @type {number} */ waiting: parseInt(adapter.config.pushoverWaitToSend) * 1000
70
- };
71
- break;
72
-
73
- case 'WhatsApp':
74
- ObjMessage = {
75
- /** @type {boolean} */ enabled: adapter.config.notificationEnabled || false,
76
- /** @type {string} */ notificationsType: adapter.config.notificationsType,
77
- /** @type {string} */ type: 'message',
78
- /** @type {string} */ instance: adapter.config.whatsappInstance,
79
- /** @type {boolean} */ noticeType: (adapter.config.whatsappNoticeType === 'longWhatsappNotice'),
80
- /** @type {boolean} */ onlyError: adapter.config.whatsappOnlyError,
81
- /** @type {number} */ waiting: parseInt(adapter.config.whatsappWaitToSend) * 1000
82
- };
83
- break;
84
- }
85
- },
86
- /**
87
- * send Message ist für Telegram formatiert und muss für andere Empfänger umformatiert werden
88
- *@param {string} message - Botschaft
89
- */
90
- sendMessage (message) {
91
-
92
- let sendMessage = message;
93
-
94
- setTimeout(function () {
95
- switch (ObjMessage.notificationsType) {
96
- case 'Telegram':
97
- if (ObjMessage.enabled &&
98
- ObjMessage.instance !== '' &&
99
- ObjMessage.instance !== null &&
100
- ObjMessage.instance !== undefined) {
101
- adapter.log.debug('start sendMessageText per Telegram');
102
- sendMessage = '<b><u>SprinkleControl:</u></b>\n' + sendMessage;
103
- // send Telegram Message
104
- if ((ObjMessage.User) && (ObjMessage.User !== 'allTelegramUsers')) {
105
- adapter.sendTo(ObjMessage.instance, 'send', {
106
- user: ObjMessage.User,
107
- text: sendMessage,
108
- disable_notification: ObjMessage.SilentNotice,
109
- parse_mode: 'HTML'
110
- });
111
- } else {
112
- adapter.sendTo(ObjMessage.instance, 'send', {
113
- text: sendMessage,
114
- disable_notification: ObjMessage.SilentNotice,
115
- parse_mode: 'HTML'
116
- });
117
- }
118
- }
119
- break;
120
-
121
- case 'E-Mail':
122
-
123
- if (ObjMessage.enabled &&
124
- ObjMessage.instance !== '' &&
125
- ObjMessage.instance !== null &&
126
- ObjMessage.instance !== undefined) {
127
- sendMessage = '<b><u>SprinkleControl:</u></b>\n' + sendMessage;
128
- sendMessage = sendMessage.replace(/\n/g, '<br />');
129
- adapter.log.debug(`start sendMessageText per E-Mail on used E-Mail-Instance: ${ObjMessage.instance}`);
130
- // Send E-Mail Message
131
- adapter.sendTo(ObjMessage.instance, 'send', {
132
- html: sendMessage,
133
- to: ObjMessage.emailReceiver,
134
- subject: 'SprinkleControl',
135
- from: ObjMessage.emailSender
136
- });
137
- }
138
- break;
139
-
140
- case 'Pushover' :
141
-
142
- if (ObjMessage.enabled &&
143
- ObjMessage.instance !== '' &&
144
- ObjMessage.instance !== null &&
145
- ObjMessage.instance !== undefined) {
146
- adapter.log.debug(`start sendMessageText per E-Mail on used E-Mail-Instance: ${ObjMessage.instance}`);
147
- // Send pushover Message
148
- if (ObjMessage.SilentNotice === 'true' || ObjMessage.SilentNotice === true) {
149
- adapter.sendTo(ObjMessage.instance, 'send', {
150
- message: sendMessage,
151
- sound: ObjMessage.sound,
152
- priority: -1,
153
- html: 1,
154
- title: 'SprinkleControl',
155
- device: ObjMessage.deviceID
156
- });
157
- } else {
158
- adapter.sendTo(ObjMessage.instance, 'send', {
159
- message: sendMessage,
160
- sound: ObjMessage.sound,
161
- html: 1,
162
- title: 'SprinkleControl',
163
- device: ObjMessage.deviceID
164
- });
165
- }
166
- }
167
- break;
168
-
169
- case 'WhatsApp' :
170
- if (ObjMessage.enabled &&
171
- ObjMessage.instance !== '' &&
172
- ObjMessage.instance !== null &&
173
- ObjMessage.instance !== undefined) {
174
- sendMessage = '<b><u>SprinkleControl:</u></b>\n' + sendMessage;
175
- sendMessage = sendMessage.replace(/\n/g,'%0A'); // Zeilenumbruch
176
- sendMessage = sendMessage.replace(/<b>|<\/b>/g, '*'); // Fett Bold
177
- sendMessage = sendMessage.replace(/<i>|<\/i>/g, '_'); // kursive Italic
178
- sendMessage = sendMessage.replace(/<u>|<\/u>/g, ''); // unterstrichen
179
- adapter.log.debug(`start sendMessageText per WhatsApp on used WhatsApp-Instance: ${ObjMessage.instance}`);
180
- // Send WhatsApp Message
181
- adapter.sendTo(ObjMessage.instance, 'send', {
182
- text: sendMessage
183
- });
184
- }
185
- break;
186
- }
187
- }, ObjMessage.waiting);
188
- },
189
-
190
- /**
191
- * Nachrichtenversandabfrage => true (Ja)
192
- * @returns {boolean}
193
- */
194
- onlySendError () {
195
- return (adapter.config.notificationEnabled && adapter.config.notificationsType && ObjMessage.onlyError);
196
- }
197
-
198
- }
199
-
1
+ 'use strict';
2
+ /*
3
+ info: log aufbau sendMessageText.js: #4.*
4
+ */
5
+ /**
6
+ * The adapter instance
7
+ *
8
+ */
9
+ let adapter;
10
+ let ObjMessage = {};
11
+
12
+ /**
13
+ * Modul zum Versenden von Nachrichten mittels Telegram, E-Mail, Pushover oder WhatsApp
14
+ * der passende Adapter muss installiert sein!
15
+ *
16
+ */
17
+ const sendMessageText = {
18
+
19
+ /**
20
+ *
21
+ * @param myAdapter - Kopie von Adapter main.js
22
+ */
23
+ initConfigMessage (myAdapter) {
24
+ adapter = myAdapter;
25
+ switch (adapter.config.notificationsType) {
26
+ case 'Telegram':
27
+ ObjMessage = { enabled: adapter.config.notificationEnabled || false, notificationsType: adapter.config.notificationsType, type: 'message', instance: adapter.config.telegramInstance, silentNotice: adapter.config.telegramSilentNotice, noticeType: (adapter.config.telegramNoticeType === 'longTelegramNotice'), user: adapter.config.telegramUser, onlyError: adapter.config.telegramOnlyError, waiting: (Math.round(adapter.config.telegramWaitToSend) * 1000) || 0
28
+ };
29
+ break;
30
+
31
+ case 'E-Mail':
32
+ ObjMessage = { enabled: adapter.config.notificationEnabled || false, notificationsType: adapter.config.notificationsType, type: 'message', instance: adapter.config.emailInstance, noticeType: (adapter.config.emailNoticeType === 'longEmailNotice'), emailReceiver: adapter.config.emailReceiver, emailSender: adapter.config.emailSender, onlyError: adapter.config.emailOnlyError, waiting: (Math.round(adapter.config.emailWaitToSend) * 1000) || 0
33
+ };
34
+ break;
35
+
36
+ case 'Pushover':
37
+ ObjMessage = { enabled: adapter.config.notificationEnabled || false, notificationsType: adapter.config.notificationsType, type: 'message', sound: adapter.config.pushoverSound, instance: adapter.config.pushoverInstance, silentNotice: adapter.config.pushoverSilentNotice, noticeType: (adapter.config.pushoverNoticeType === 'longPushoverNotice'), deviceID: adapter.config.pushoverDeviceID, onlyError: adapter.config.pushoverOnlyError, waiting: (Math.round(adapter.config.pushoverWaitToSend) * 1000) || 0
38
+ };
39
+ break;
40
+
41
+ case 'WhatsApp':
42
+ ObjMessage = { enabled: adapter.config.notificationEnabled || false, notificationsType: adapter.config.notificationsType, type: 'message', instance: adapter.config.whatsappInstance, noticeType: (adapter.config.whatsappNoticeType === 'longWhatsappNotice'), onlyError: adapter.config.whatsappOnlyError, waiting: (Math.round(adapter.config.whatsappWaitToSend) * 1000) || 0
43
+ };
44
+ break;
45
+ }
46
+ },
47
+ /**
48
+ * send Message ist für Telegram formatiert und muss für andere Empfänger umformatiert werden
49
+ *
50
+ *@param message - Botschaft
51
+ */
52
+ sendMessage (message) {
53
+
54
+ let sendMessage = message;
55
+
56
+ setTimeout(function () {
57
+ switch (ObjMessage.notificationsType) {
58
+ case 'Telegram':
59
+ if (ObjMessage.enabled &&
60
+ ObjMessage.instance !== '' &&
61
+ ObjMessage.instance !== null &&
62
+ ObjMessage.instance !== undefined) {
63
+ adapter.log.debug('start sendMessageText per Telegram');
64
+ sendMessage = `<b><u>SprinkleControl:</u></b>\n${ sendMessage }`;
65
+ // send Telegram Message
66
+ if ((ObjMessage.User) && (ObjMessage.User !== 'allTelegramUsers')) {
67
+ adapter.sendTo(ObjMessage.instance, 'send', {
68
+ user: ObjMessage.User,
69
+ text: sendMessage,
70
+ disable_notification: ObjMessage.SilentNotice,
71
+ parse_mode: 'HTML'
72
+ });
73
+ } else {
74
+ adapter.sendTo(ObjMessage.instance, 'send', {
75
+ text: sendMessage,
76
+ disable_notification: ObjMessage.SilentNotice,
77
+ parse_mode: 'HTML'
78
+ });
79
+ }
80
+ }
81
+ break;
82
+
83
+ case 'E-Mail':
84
+
85
+ if (ObjMessage.enabled &&
86
+ ObjMessage.instance !== '' &&
87
+ ObjMessage.instance !== null &&
88
+ ObjMessage.instance !== undefined) {
89
+ sendMessage = `<b><u>SprinkleControl:</u></b>\n${ sendMessage}`;
90
+ sendMessage = sendMessage.replace(/\n/g, '<br />');
91
+ adapter.log.debug(`start sendMessageText per E-Mail on used E-Mail-Instance: ${ObjMessage.instance}`);
92
+ // Send E-Mail Message
93
+ adapter.sendTo(ObjMessage.instance, 'send', {
94
+ html: sendMessage,
95
+ to: ObjMessage.emailReceiver,
96
+ subject: 'SprinkleControl',
97
+ from: ObjMessage.emailSender
98
+ });
99
+ }
100
+ break;
101
+
102
+ case 'Pushover' :
103
+
104
+ if (ObjMessage.enabled &&
105
+ ObjMessage.instance !== '' &&
106
+ ObjMessage.instance !== null &&
107
+ ObjMessage.instance !== undefined) {
108
+ adapter.log.debug(`start sendMessageText per E-Mail on used E-Mail-Instance: ${ObjMessage.instance}`);
109
+ // Send pushover Message
110
+ if (ObjMessage.SilentNotice === 'true' || ObjMessage.SilentNotice === true) {
111
+ adapter.sendTo(ObjMessage.instance, 'send', {
112
+ message: sendMessage,
113
+ sound: ObjMessage.sound,
114
+ priority: -1,
115
+ html: 1,
116
+ title: 'SprinkleControl',
117
+ device: ObjMessage.deviceID
118
+ });
119
+ } else {
120
+ adapter.sendTo(ObjMessage.instance, 'send', {
121
+ message: sendMessage,
122
+ sound: ObjMessage.sound,
123
+ html: 1,
124
+ title: 'SprinkleControl',
125
+ device: ObjMessage.deviceID
126
+ });
127
+ }
128
+ }
129
+ break;
130
+
131
+ case 'WhatsApp' :
132
+ if (ObjMessage.enabled &&
133
+ ObjMessage.instance !== '' &&
134
+ ObjMessage.instance !== null &&
135
+ ObjMessage.instance !== undefined) {
136
+ sendMessage = `<b><u>SprinkleControl:</u></b>\n${ sendMessage}`;
137
+ sendMessage = sendMessage.replace(/\n/g,'%0A'); // Zeilenumbruch
138
+ sendMessage = sendMessage.replace(/<b>|<\/b>/g, '*'); // Fett Bold
139
+ sendMessage = sendMessage.replace(/<i>|<\/i>/g, '_'); // kursive Italic
140
+ sendMessage = sendMessage.replace(/<u>|<\/u>/g, ''); // unterstrichen
141
+ adapter.log.debug(`start sendMessageText per WhatsApp on used WhatsApp-Instance: ${ObjMessage.instance}`);
142
+ // Send WhatsApp Message
143
+ adapter.sendTo(ObjMessage.instance, 'send', {
144
+ text: sendMessage
145
+ });
146
+ }
147
+ break;
148
+ }
149
+ }, ObjMessage.waiting);
150
+ },
151
+
152
+ /**
153
+ * Nachrichtenversandabfrage => true (Ja)
154
+ *
155
+ * @returns
156
+ */
157
+ onlySendError () {
158
+ return (adapter.config.notificationEnabled && adapter.config.notificationsType && ObjMessage.onlyError);
159
+ }
160
+
161
+ };
162
+
200
163
  module.exports = sendMessageText;
package/lib/tools.js CHANGED
@@ -1,118 +1,148 @@
1
- 'use strict';
2
-
3
-
4
- /**
5
- * func addTime (02:12:24 + 00:15) || (807) => 02:12:39
6
- * @param time1 {string|number} z.B. 02:12:24 || 807 => 02:12:39
7
- * @param time2 {string|number|undefined} z.B. 02:12:24 || 807 => 02:12:39 || undef.
8
- * @returns {string}
9
- */
10
- function addTime(time1, time2){
11
- const wert = string2seconds(time1) + string2seconds(time2);
12
- return seconds2string(wert);
13
-
14
- // private functions
15
- function seconds2string(n){
16
- n = Math.abs(n);
17
- const h = Math.trunc(n / 3600);
18
- const m = Math.trunc((n / 60 ) % 60);
19
- const sec = Math.trunc(n % 60);
20
- return (h === 0)?(frmt(m) + ':' + frmt(sec)):(frmt(h) + ':' + frmt(m) + ':' + frmt(sec));
21
- } // end function seconds2string
22
-
23
- function string2seconds(n) {
24
- if(!n || (n === "--:--")) return 0;
25
- if(Number.isInteger(n)) return n;
26
- const tmp = n.split(':').reverse();
27
- if(!tmp.length) tmp[0] = 0; // Sekunden
28
- if(tmp.length < 2) tmp[1] = 0; // Minuten
29
- if(tmp.length < 3) tmp[2] = 0; // Stunden
30
- while(tmp[0] > 59) {
31
- tmp[0] -= 60;
32
- ++tmp[1];
33
- }
34
- while(tmp[1] > 59) {
35
- tmp[1] -= 60;
36
- ++tmp[2];
37
- }
38
- return (tmp[2] * 3600 + tmp[1] * 60 + 1 * tmp[0]);
39
- } // string2seconds
40
-
41
- function frmt(n) { return n < 10 ? '0' + n : n;}
42
-
43
- } // end - function addTime
44
-
45
-
46
- /**
47
- * func Format Time
48
- * → hier wird der übergebene Zeitstempel, myDate, in das angegebene Format, timeFormat, umgewandelt.
49
- * Ist myDate nicht angegeben, so wird die aktuelle Zeit verwendet.
50
- * @param {ioBroker.Adapter} adapter
51
- * @param {date|any} myDate
52
- * @param {string} timeFormat - 'kW': Rückgabe der KW;
53
- * - 'dayNr': Tag des Jahres (Tagesnummer)
54
- * - 'day': Wochentag
55
- * - 'dd.mm. hh:mm': Rückgabe Datum und Zeit
56
- * @returns {string|number}
57
- */
58
- function formatTime(adapter, myDate, timeFormat) { // 'kW' 'dd.mm. hh:mm'
59
- function zweiStellen (s) {
60
- while (s.toString().length < 2) {s = '0' + s;}
61
- return s;
62
- }
63
-
64
- const d = (myDate)? new Date(myDate):new Date();
65
- const tag = zweiStellen(d.getDate());
66
- const monat = zweiStellen(d.getMonth() + 1);
67
- const stunde = zweiStellen(d.getHours());
68
- const minute = zweiStellen(d.getMinutes());
69
- const currentThursday = new Date(d.getTime() +(3-((d.getDay()+6) % 7)) * 86400000);
70
- // At the beginning or end of a year the thursday could be in another year.
71
- const yearOfThursday = currentThursday.getFullYear();
72
- // Get first Thursday of the year
73
- const firstThursday = new Date(new Date(yearOfThursday,0,4).getTime() +(3-((new Date(yearOfThursday,0,4).getDay()+6) % 7)) * 86400000);
74
-
75
-
76
- switch (timeFormat) {
77
- case 'dayNr': // Berechnung der Tagesnummer
78
- let start = new Date(d.getFullYear(), 0, 0);
79
- let diff = (d - start) + ((start.getTimezoneOffset() - d.getTimezoneOffset()) * 60 * 1000);
80
- let oneDay = 1000 * 60 * 60 * 24;
81
- return Math.floor(diff / oneDay);
82
-
83
- case 'kW': // formatTime('','kW');
84
- // +1 we start with week number 1
85
- // +0.5 an easy and dirty way to round result (in combination with Math.floor)
86
- return Math.floor(1 + 0.5 + (currentThursday.getTime() - firstThursday.getTime()) / 86400000/7);
87
-
88
- case 'day': // Wochentag 0:So;1:Mo;...6:Sa
89
- return d.getDay();
90
-
91
- case 'dd.mm. hh:mm':
92
- return tag + '.' + monat + ' ' + stunde + ':' + minute;
93
-
94
- default:
95
- adapter.log.info('function formatTime: falsches Format angegeben');
96
- break;
97
- }
98
- }
99
-
100
- /**
101
- * TREND - Zwischenwert ermitteln
102
- * @param {number} a1 - Istwert a1 der Zeitachse
103
- * @param {number} a2 - Istwert a2 der Zeitachse
104
- * @param {number} b1 - Sollwert b1 der Wertachse
105
- * @param {number} b2 - Sollwert b2 der Wertachse
106
- * @param {number} sollA3 - Sollwert soll_A3 der Zeitachse
107
- * @returns {number} Zwischenwert
108
- */
109
- function trend (a1,a2,b1,b2,sollA3) {
110
- return (sollA3-a1)*(b2-b1)/(a2-a1)+b1;
111
- }
112
-
113
-
114
- module.exports = {
115
- addTime,
116
- formatTime,
117
- trend
118
- };
1
+ 'use strict';
2
+
3
+
4
+ /**
5
+ * func addTime (02:12:24 + 00:15) || (15)sek => 02:12:39
6
+ *
7
+ * @param time1 - z.B. 02:12:24 || 7944
8
+ * @param time2 -z.B. 00:15 || 15 | Null
9
+ * @returns - (h > 0) ? 02:12:39 : 12:39
10
+ */
11
+ function addTime(time1, time2){
12
+ const wert = string2seconds(time1) + string2seconds(time2);
13
+ return seconds2string(wert);
14
+
15
+ // private functions
16
+ function seconds2string(n){
17
+ n = Math.abs(n);
18
+ const h = Math.trunc(n / 3600);
19
+ const m = Math.trunc((n / 60 ) % 60);
20
+ const sec = Math.trunc(n % 60);
21
+ return (h === 0)?(`${frmt(m)}:${frmt(sec)}`):(`${frmt(h)}:${frmt(m)}:${frmt(sec)}`);
22
+ } // end function seconds2string
23
+
24
+ function string2seconds(n) {
25
+ if(!n || (n === '--:--')) return 0;
26
+ if(Number.isInteger(n)) return n;
27
+ const tmp = n.split(':').reverse();
28
+ if(!tmp.length) tmp[0] = 0; // Sekunden
29
+ if(tmp.length < 2) tmp[1] = 0; // Minuten
30
+ if(tmp.length < 3) tmp[2] = 0; // Stunden
31
+ while(tmp[0] > 59) {
32
+ tmp[0] -= 60;
33
+ ++tmp[1];
34
+ }
35
+ while(tmp[1] > 59) {
36
+ tmp[1] -= 60;
37
+ ++tmp[2];
38
+ }
39
+ return (tmp[2] * 3600 + tmp[1] * 60 + 1 * tmp[0]);
40
+ } // string2seconds
41
+
42
+ function frmt(n) {
43
+ return n < 10 ? `0${n}` : n;
44
+ }
45
+
46
+ } // end - function addTime
47
+
48
+
49
+ /**
50
+ * func Format Time
51
+ * hier wird der übergebene Zeitstempel, myDate, in das angegebene Format, timeFormat, umgewandelt.
52
+ * Ist myDate nicht angegeben, so wird die aktuelle Zeit verwendet.
53
+ *
54
+ * @param adapter
55
+ * @param myDate
56
+ * @param timeFormat - 'kW': Rückgabe der KW;
57
+ * - 'dayNr': Tag des Jahres (Tagesnummer)
58
+ * - 'day': Wochentag
59
+ * - 'dd.mm. hh:mm': Rückgabe Datum und Zeit
60
+ * - 'hh:mm': Rückgabe der Zeit
61
+ * - 'past': true => Heute schon vorbei
62
+ * @returns
63
+ */
64
+ function formatTime(adapter, myDate, timeFormat) { // 'kW' 'dd.mm. hh:mm' 'hh:mm'
65
+ /**
66
+ * @param s
67
+ */
68
+ function zweiStellen (s) {
69
+ while (s.toString().length < 2) {
70
+ s = `0${s}`;
71
+ }
72
+ return s;
73
+ }
74
+
75
+ const d = (myDate) ? new Date(myDate) : new Date();
76
+ const tag = zweiStellen(d.getDate());
77
+ const monat = zweiStellen(d.getMonth() + 1);
78
+ const stunde = zweiStellen(d.getHours());
79
+ const minute = zweiStellen(d.getMinutes());
80
+ const currentThursday = new Date(d.getTime() +(3-((d.getDay()+6) % 7)) * 86400000);
81
+ // At the beginning or end of a year the thursday could be in another year.
82
+ const yearOfThursday = currentThursday.getFullYear();
83
+ // Get first Thursday of the year
84
+ const firstThursday = new Date(new Date(yearOfThursday,0,4).getTime() +(3-((new Date(yearOfThursday,0,4).getDay()+6) % 7)) * 86400000);
85
+
86
+
87
+ switch (timeFormat) {
88
+ // Berechnung der Tagesnummer
89
+ case 'dayNr': {
90
+ const start = new Date(d.getFullYear(), 0, 0);
91
+ // @ts-ignore
92
+ const diff = (d - start) + ((start.getTimezoneOffset() - d.getTimezoneOffset()) * 60 * 1000);
93
+ const oneDay = 1000 * 60 * 60 * 24;
94
+ return Math.floor(diff / oneDay);
95
+ }
96
+ // formatTime('','kW');
97
+ case 'kW': {
98
+ // +1 we start with week number 1
99
+ // +0.5 an easy and dirty way to round result (in combination with Math.floor)
100
+ return Math.floor(1 + 0.5 + (currentThursday.getTime() - firstThursday.getTime()) / 86400000/7);
101
+ }
102
+ // Wochentag 0:So;1:Mo;...6:Sa
103
+ case 'day': {
104
+ return d.getDay();
105
+ }
106
+ // 'hh:mm'
107
+ case 'hh:mm': {
108
+ return `${stunde}:${minute}`;
109
+ }
110
+ // 'dd.mm. hh:mm'
111
+ case 'dd.mm. hh:mm': {
112
+ return `${tag}.${monat} ${stunde}:${minute}`;
113
+ }
114
+ // true → Heute schon vorbei
115
+ case 'past': {
116
+ const cd = new Date();
117
+ const cStunde = zweiStellen(cd.getHours());
118
+ const cMinute = zweiStellen(cd.getMinutes());
119
+ return ((stunde > cStunde) || ((stunde === cStunde) && (minute >= cMinute)));
120
+ }
121
+
122
+ default: {
123
+ adapter.log.info('function formatTime: falsches Format angegeben');
124
+ break;
125
+ }
126
+ }
127
+ }
128
+
129
+ /**
130
+ * TREND - Zwischenwert ermitteln
131
+ *
132
+ * @param a1 - Istwert a1 der Zeitachse
133
+ * @param a2 - Istwert a2 der Zeitachse
134
+ * @param b1 - Sollwert b1 der Wertachse
135
+ * @param b2 - Sollwert b2 der Wertachse
136
+ * @param sollA3 - Sollwert soll_A3 der Zeitachse
137
+ * @returns Zwischenwert
138
+ */
139
+ function trend (a1,a2,b1,b2,sollA3) {
140
+ return (sollA3-a1)*(b2-b1)/(a2-a1)+b1;
141
+ }
142
+
143
+
144
+ module.exports = {
145
+ addTime,
146
+ formatTime,
147
+ trend
148
+ };