hoffmation-base 0.0.1

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 (108) hide show
  1. package/.eslintrc.js +27 -0
  2. package/.prettierrc.js +9 -0
  3. package/LICENSE +21 -0
  4. package/README.md +1 -0
  5. package/index.js +1 -0
  6. package/models/connectionCallbacks.ts +13 -0
  7. package/models/daytime.ts +3 -0
  8. package/models/deviceConfig.ts +8 -0
  9. package/models/dimmerSettings.ts +5 -0
  10. package/models/lampSettings.ts +5 -0
  11. package/models/ledSettings.ts +19 -0
  12. package/models/logLevel.ts +9 -0
  13. package/models/persistence/BasicRoomInfo.ts +3 -0
  14. package/models/persistence/DailyMovementCount.ts +3 -0
  15. package/models/persistence/RoomDetailInfo.ts +4 -0
  16. package/models/persistence/temperaturDataPoint.ts +12 -0
  17. package/models/persistence/todaysCount.ts +3 -0
  18. package/models/rooms/RoomBase.ts +357 -0
  19. package/models/rooms/RoomSettings/RoomSettings.ts +159 -0
  20. package/models/rooms/RoomSettings/hmIPRoomSettings.ts +53 -0
  21. package/models/rooms/RoomSettings/iRoomDefaultSettings.ts +17 -0
  22. package/models/rooms/RoomSettings/readme.md +18 -0
  23. package/models/rooms/RoomSettings/zigbeeRoomSettings.ts +51 -0
  24. package/models/rooms/iRoomImportEnforcer.ts +3 -0
  25. package/models/rooms/readme.md +11 -0
  26. package/models/temperaturSettings.ts +22 -0
  27. package/models/timeCallback.ts +90 -0
  28. package/package.json +57 -0
  29. package/server/config/config-readme.md +19 -0
  30. package/server/config/iConfig.ts +53 -0
  31. package/server/devices/DeviceInfo.ts +66 -0
  32. package/server/devices/Griffe.ts +31 -0
  33. package/server/devices/Heizgruppen.ts +91 -0
  34. package/server/devices/Rollos.ts +48 -0
  35. package/server/devices/deviceUpdater.ts +72 -0
  36. package/server/devices/devices.ts +189 -0
  37. package/server/devices/groups/fensterGroup.ts +175 -0
  38. package/server/devices/groups/heatGroup.ts +32 -0
  39. package/server/devices/groups/lampenGroup.ts +88 -0
  40. package/server/devices/groups/praesenzGroup.ts +182 -0
  41. package/server/devices/groups/smokeGroup.ts +16 -0
  42. package/server/devices/groups/sonosGroup.ts +33 -0
  43. package/server/devices/groups/tasterGroup.ts +48 -0
  44. package/server/devices/groups/waterGroup.ts +16 -0
  45. package/server/devices/hmIPDevices/Fenster.ts +114 -0
  46. package/server/devices/hmIPDevices/FensterPosition.ts +5 -0
  47. package/server/devices/hmIPDevices/TuerPosition.ts +4 -0
  48. package/server/devices/hmIPDevices/hmIpBewegung.ts +126 -0
  49. package/server/devices/hmIPDevices/hmIpDevice.ts +90 -0
  50. package/server/devices/hmIPDevices/hmIpDeviceType.ts +14 -0
  51. package/server/devices/hmIPDevices/hmIpGriff.ts +143 -0
  52. package/server/devices/hmIPDevices/hmIpHeizgruppe.ts +172 -0
  53. package/server/devices/hmIPDevices/hmIpHeizung.ts +69 -0
  54. package/server/devices/hmIPDevices/hmIpLampe.ts +119 -0
  55. package/server/devices/hmIPDevices/hmIpPraezenz.ts +99 -0
  56. package/server/devices/hmIPDevices/hmIpRoll.ts +133 -0
  57. package/server/devices/hmIPDevices/hmIpTaste.ts +72 -0
  58. package/server/devices/hmIPDevices/hmIpTaster.ts +73 -0
  59. package/server/devices/hmIPDevices/hmIpTherm.ts +19 -0
  60. package/server/devices/hmIPDevices/hmIpTuer.ts +115 -0
  61. package/server/devices/hmIPDevices/hmIpWippe.ts +55 -0
  62. package/server/devices/iDeviceUpdater.ts +4 -0
  63. package/server/devices/iIoBrokerDevice.ts +44 -0
  64. package/server/devices/wledDevice.ts +124 -0
  65. package/server/devices/zigbee/ZigbeeActuator.ts +113 -0
  66. package/server/devices/zigbee/zigbeeAquaraVibra.ts +171 -0
  67. package/server/devices/zigbee/zigbeeAquaraWater.ts +94 -0
  68. package/server/devices/zigbee/zigbeeBlitzShp.ts +77 -0
  69. package/server/devices/zigbee/zigbeeDevice.ts +115 -0
  70. package/server/devices/zigbee/zigbeeDeviceType.ts +13 -0
  71. package/server/devices/zigbee/zigbeeHeimanSmoke.ts +99 -0
  72. package/server/devices/zigbee/zigbeeIkeaSteckdose.ts +31 -0
  73. package/server/devices/zigbee/zigbeeIlluActuator.ts +37 -0
  74. package/server/devices/zigbee/zigbeeIlluDimmer.ts +165 -0
  75. package/server/devices/zigbee/zigbeeIlluLampe.ts +33 -0
  76. package/server/devices/zigbee/zigbeeIlluLedRGBCCT.ts +137 -0
  77. package/server/ioBroker/connection.ts +1655 -0
  78. package/server/ioBroker/ioBroker.main.ts +99 -0
  79. package/server/ioBroker/socketIOAuthInfo.ts +5 -0
  80. package/server/ioBroker/socketIOConnectOptions.ts +6 -0
  81. package/server/ioBroker/socketIOLogging.ts +29 -0
  82. package/server/ioBroker/socketIOVisCommand.ts +11 -0
  83. package/server/services/HTTPSOptions.ts +14 -0
  84. package/server/services/Sonos/mp3-server.ts +75 -0
  85. package/server/services/Sonos/polly-service.ts +100 -0
  86. package/server/services/Sonos/sonos-service.ts +199 -0
  87. package/server/services/Telegram/telegram-Commands.ts +215 -0
  88. package/server/services/Telegram/telegram-service.ts +171 -0
  89. package/server/services/Telegram/telegramMessageCalback.ts +11 -0
  90. package/server/services/calendar/m/303/274ll-service.ts +224 -0
  91. package/server/services/dbo/persist.ts +125 -0
  92. package/server/services/https-service.ts +71 -0
  93. package/server/services/log-service.ts +69 -0
  94. package/server/services/news-service.ts +81 -0
  95. package/server/services/settings-service.ts +23 -0
  96. package/server/services/time-callback-service.ts +223 -0
  97. package/server/services/utils/ringstorage.ts +24 -0
  98. package/server/services/utils/utils.ts +52 -0
  99. package/server/services/weather/weather-alert.ts +7 -0
  100. package/server/services/weather/weather-current.ts +26 -0
  101. package/server/services/weather/weather-daily.ts +22 -0
  102. package/server/services/weather/weather-feelsLike.ts +6 -0
  103. package/server/services/weather/weather-hourly.ts +17 -0
  104. package/server/services/weather/weather-item.ts +6 -0
  105. package/server/services/weather/weather-minutes.ts +4 -0
  106. package/server/services/weather/weather-service.ts +277 -0
  107. package/server/services/weather/weather-temp.ts +8 -0
  108. package/tsconfig.json +59 -0
@@ -0,0 +1,26 @@
1
+ import { WeatherItem } from './weather-item';
2
+
3
+ export interface WeatherCurrent {
4
+ /**
5
+ * Zeit der Anfrage
6
+ * @type {number}
7
+ * @memberof WeatherCurrent
8
+ */
9
+ dt: number;
10
+ sunrise: number;
11
+ sunset: number;
12
+ temp: number;
13
+ feels_like: number;
14
+ pressure: number;
15
+ humidity: number;
16
+ dew_point: number;
17
+ uvi: number;
18
+ clouds: number;
19
+ rain?: number;
20
+ snow?: number;
21
+ visibility: number;
22
+ wind_speed: number;
23
+ wind_deg: number;
24
+ wind_gust: number;
25
+ weather: WeatherItem[];
26
+ }
@@ -0,0 +1,22 @@
1
+ import { WeatherFeelsLike } from './weather-feelsLike';
2
+ import { WeatherItem } from './weather-item';
3
+ import { WeatherTemp } from './weather-temp';
4
+
5
+ export interface WeatherDaily {
6
+ dt: number;
7
+ sunrise: number;
8
+ sunset: number;
9
+ pressure: number;
10
+ humidity: number;
11
+ dew_point: number;
12
+ wind_speed: number;
13
+ wind_deg: number;
14
+ clouds: number;
15
+ pop: number;
16
+ rain?: number;
17
+ snow?: number;
18
+ uvi: number;
19
+ temp: WeatherTemp;
20
+ feels_like: WeatherFeelsLike;
21
+ weather: WeatherItem[];
22
+ }
@@ -0,0 +1,6 @@
1
+ export interface WeatherFeelsLike {
2
+ day: number;
3
+ night: number;
4
+ eve: number;
5
+ morn: number;
6
+ }
@@ -0,0 +1,17 @@
1
+ import { WeatherItem } from './weather-item';
2
+
3
+ export interface WeatherHourly {
4
+ dt: number;
5
+ temp: number;
6
+ feels_like: number;
7
+ pressure: number;
8
+ humidity: number;
9
+ dew_point: number;
10
+ uvi: number;
11
+ clouds: number;
12
+ visibility: number;
13
+ wind_speed: number;
14
+ wind_deg: number;
15
+ weather: WeatherItem[];
16
+ pop: number;
17
+ }
@@ -0,0 +1,6 @@
1
+ export interface WeatherItem {
2
+ id: number;
3
+ main: string;
4
+ description: string;
5
+ icon: string;
6
+ }
@@ -0,0 +1,4 @@
1
+ export interface WeatherMinutes {
2
+ dt: number;
3
+ precipitation: number;
4
+ }
@@ -0,0 +1,277 @@
1
+ import { HTTPSService } from '../https-service';
2
+ import { HTTPSOptions } from '../HTTPSOptions';
3
+ import { ServerLogService } from '../log-service';
4
+ import { OwnSonosDevice, SonosService } from '../Sonos/sonos-service';
5
+ import { WeatherAlert } from './weather-alert';
6
+ import { WeatherCurrent } from './weather-current';
7
+ import { WeatherDaily } from './weather-daily';
8
+ import { WeatherHourly } from './weather-hourly';
9
+ import { WeatherMinutes } from './weather-minutes';
10
+ import { LogLevel } from '../../../models/logLevel';
11
+ import { iWeatherSettings } from '../../config/iConfig';
12
+ import { Utils } from '../utils/utils';
13
+
14
+ export interface WeatherResponse {
15
+ lat: number;
16
+ lon: number;
17
+ timezone: string;
18
+ timezone_offset: number;
19
+ current: WeatherCurrent;
20
+ minutely: WeatherMinutes[];
21
+ hourly: WeatherHourly[];
22
+ daily: WeatherDaily[];
23
+ alerts?: WeatherAlert[];
24
+ }
25
+
26
+ export class WeatherService {
27
+ public static active: boolean = false;
28
+ public static oneDay: number = 1000 * 60 * 60 * 24;
29
+ public static lastResponse: WeatherResponse;
30
+ private static _refreshInterval: NodeJS.Timeout;
31
+ private static latitude: string;
32
+ private static longitude: string;
33
+ private static appID: string;
34
+
35
+ public static initialize(config: iWeatherSettings): void {
36
+ this.active = true;
37
+ this.longitude = config.longitude;
38
+ this.latitude = config.lattitude;
39
+ this.appID = config.appid;
40
+
41
+ this._refreshInterval = Utils.guardedInterval(WeatherService.getWeatherData, 10 * 60 * 1000, WeatherService, true);
42
+ }
43
+
44
+ public static playWeatherInfo(
45
+ sonosDevice: OwnSonosDevice,
46
+ volume: number = 30,
47
+ short: boolean = false,
48
+ retries = 5,
49
+ ): void {
50
+ const wData: WeatherResponse = WeatherService.lastResponse;
51
+ if (wData === undefined) {
52
+ if (retries > 0) {
53
+ ServerLogService.writeLog(
54
+ LogLevel.Warn,
55
+ `WeatherService.playWeatherInfo(): Der Wetterbericht ist noch nicht bereit --> warten`,
56
+ );
57
+ setTimeout(() => {
58
+ WeatherService.playWeatherInfo(sonosDevice, volume, short, retries - 1);
59
+ }, 1000);
60
+ } else {
61
+ ServerLogService.writeLog(
62
+ LogLevel.Error,
63
+ `WeatherService.playWeatherInfo(): Der Wetterbericht ist vorhanden --> Abbruch`,
64
+ );
65
+ }
66
+ return;
67
+ }
68
+
69
+ SonosService.speakOnDevice(short ? `Kurze Wetterinfo:` : `HoffMation Wetter-Bericht:`, sonosDevice, volume, false);
70
+ SonosService.speakOnDevice(
71
+ `Wetterbeschreibung für heute: ${wData.daily[0].weather[0].description}`,
72
+ sonosDevice,
73
+ volume,
74
+ false,
75
+ );
76
+ SonosService.speakOnDevice(`Aktuell sind es ${Math.round(wData.current.temp)} Grad.`, sonosDevice, volume, false);
77
+ if (!short) {
78
+ SonosService.speakOnDevice(
79
+ `Heute sollen es im Durchschnitt ${Math.round(wData.daily[0].temp.day)} Grad sein.`,
80
+ sonosDevice,
81
+ volume,
82
+ false,
83
+ );
84
+ SonosService.speakOnDevice(
85
+ `Die Höchsttemperatur liegt heute bei ${Math.round(wData.daily[0].temp.max)} Grad.`,
86
+ sonosDevice,
87
+ volume,
88
+ false,
89
+ );
90
+ SonosService.speakOnDevice(
91
+ `Die Tiefsttemperatur soll heute ${Math.round(wData.daily[0].temp.min)} Grad betragen.`,
92
+ sonosDevice,
93
+ volume,
94
+ false,
95
+ );
96
+ if (wData.daily[0].rain !== undefined) {
97
+ SonosService.speakOnDevice(
98
+ `Es sollen heute etwa ${Math.round(wData.daily[0].rain)} Millimeter Regen fallen.`,
99
+ sonosDevice,
100
+ volume,
101
+ false,
102
+ );
103
+ }
104
+ }
105
+ if (wData.daily[0].snow !== undefined && wData.daily[0].snow > 0) {
106
+ SonosService.speakOnDevice(
107
+ `Heute wird es Schneien! Es werden etwa ${Math.round(wData.daily[0].snow)} Millimeter Schnee erwartet.`,
108
+ sonosDevice,
109
+ volume,
110
+ false,
111
+ );
112
+ }
113
+
114
+ const { minutes, precipitation } = WeatherService.getRainNextMinutes();
115
+ const ratio: number = minutes <= 0 ? 0 : (precipitation / minutes) * 60;
116
+ let message = `In der nächsten Zeit `;
117
+ switch (true) {
118
+ case ratio > 12:
119
+ message += `wird es kräftig regnen`;
120
+ break;
121
+ case ratio > 4:
122
+ message += `wird es ordentlich regnen`;
123
+ break;
124
+ case ratio > 1:
125
+ message += `wird es regnen`;
126
+ break;
127
+ case ratio > 0.5:
128
+ message += `wird es mäßig regnen`;
129
+ break;
130
+ case ratio > 0.1:
131
+ message += `wird es nieseln regnen`;
132
+ break;
133
+ default:
134
+ message += `bleibt es trocken.`;
135
+ break;
136
+ }
137
+ SonosService.speakOnDevice(message, sonosDevice, volume, false);
138
+ !short &&
139
+ precipitation > 0 &&
140
+ SonosService.speakOnDevice(
141
+ `Es werden etwa ${precipitation} Millimeter Niederschlag in den nächsten ${minutes} Minuten fallen`,
142
+ sonosDevice,
143
+ volume,
144
+ false,
145
+ );
146
+
147
+ const alerts: WeatherAlert[] = WeatherService.getActiveAlerts();
148
+ if (alerts.length > 0) {
149
+ const alertMessage: string[] = [`Achtung, vorliegende Wetterwarnungen:`];
150
+ alerts.forEach((element) => {
151
+ alertMessage.push(
152
+ `${element.event} von ${new Date(element.start * 1000).toLocaleString('de-DE')} bis ${new Date(
153
+ element.end * 1000,
154
+ ).toLocaleString('de-DE')}`,
155
+ );
156
+ // } bis ${new Date(element.end * 1000).toLocaleString("de-DE")}; Beschreibung: ${element.description} Herausgeber: ${element.sender_name}`)
157
+ });
158
+ SonosService.speakOnDevice(alertMessage.join('\n'), sonosDevice, volume, false);
159
+ } else if (!short) {
160
+ SonosService.speakOnDevice(`Für heute liegt keine Unwetterwarnungen vor`, sonosDevice, volume, false);
161
+ }
162
+ }
163
+
164
+ private static getRainNextMinutes(): { minutes: number; precipitation: number } {
165
+ const minutes: WeatherMinutes[] = WeatherService.lastResponse.minutely;
166
+ let minutesUsed = 0;
167
+ let precipitation = 0;
168
+ if (minutes !== undefined) {
169
+ const now: number = new Date().getTime();
170
+ minutes.forEach((element) => {
171
+ if (element.dt * 1000 > now) {
172
+ minutesUsed++;
173
+ precipitation += element.precipitation;
174
+ }
175
+ });
176
+ }
177
+
178
+ return { minutes: minutesUsed, precipitation: precipitation };
179
+ }
180
+
181
+ private static getActiveAlerts(): WeatherAlert[] {
182
+ const result: WeatherAlert[] = [];
183
+ if (WeatherService.lastResponse.alerts === undefined || WeatherService.lastResponse.alerts.length === 0) {
184
+ return result;
185
+ }
186
+ const now: number = new Date().getTime();
187
+ const todayMidnight: number = new Date().setHours(0, 0, 0, 0);
188
+ const tomorowMidnight: number = todayMidnight + WeatherService.oneDay;
189
+
190
+ WeatherService.lastResponse.alerts.forEach((element) => {
191
+ const timestampStart: number = element.start * 1000;
192
+ if (
193
+ (timestampStart > todayMidnight && timestampStart < tomorowMidnight) ||
194
+ (timestampStart < now && element.end * 1000 > now)
195
+ ) {
196
+ result.push(element);
197
+ }
198
+ });
199
+ return result;
200
+ }
201
+
202
+ private static getWeatherData(): void {
203
+ HTTPSService.request(
204
+ new HTTPSOptions(
205
+ 'api.openweathermap.org',
206
+ `/data/2.5/onecall?lat=${WeatherService.latitude}&lon=${WeatherService.longitude}&appid=${WeatherService.appID}&units=metric&lang=de`,
207
+ {},
208
+ 'GET',
209
+ 443,
210
+ ),
211
+ '',
212
+ 5,
213
+ (response: string) => {
214
+ ServerLogService.writeLog(LogLevel.Debug, `WeatherAPi Response erhalten`);
215
+ ServerLogService.writeLog(LogLevel.DeepTrace, `WeatherAPi Response: ${response}`);
216
+ Utils.guardedFunction(() => {
217
+ WeatherService.lastResponse = JSON.parse(response);
218
+ WeatherService.processHourlyWeather();
219
+ }, this);
220
+ },
221
+ );
222
+ }
223
+
224
+ public static processHourlyWeather(): void {
225
+ ServerLogService.writeLog(
226
+ LogLevel.Info,
227
+ `Es sind gerade ${this.lastResponse.current.temp} Grad (gefühlt ${this.lastResponse.current.feels_like}).`,
228
+ );
229
+ if (this.lastResponse.alerts !== undefined && this.lastResponse.alerts.length > 0) {
230
+ const message: string[] = [`Es gibt folgende Wetterwarnungen:`];
231
+ this.lastResponse.alerts.forEach((element) => {
232
+ message.push(
233
+ `${element.event} von ${new Date(element.start * 1000)} bis ${new Date(element.end * 1000)}; Beschreibung: ${
234
+ element.description
235
+ } Herausgeber: ${element.sender_name}`,
236
+ );
237
+ });
238
+ ServerLogService.writeLog(LogLevel.Info, message.join('\n'));
239
+ }
240
+ }
241
+
242
+ public static getCurrentTemp(): number {
243
+ const wData: WeatherResponse = WeatherService.lastResponse;
244
+ if (wData === undefined || wData.current === undefined) {
245
+ ServerLogService.writeLog(LogLevel.Info, `WeatherService.isOutsideWarmer(): There are no data yet`);
246
+ return -99;
247
+ }
248
+ return wData.current.temp;
249
+ }
250
+
251
+ public static isOutsideWarmer(currentTemperatur: number): boolean {
252
+ const wData: WeatherResponse = WeatherService.lastResponse;
253
+ if (wData === undefined || wData.current === undefined) {
254
+ ServerLogService.writeLog(LogLevel.Info, `WeatherService.isOutsideWarmer(): There are no data yet`);
255
+ return false;
256
+ }
257
+ ServerLogService.writeLog(
258
+ LogLevel.Info,
259
+ `isOutsideWarmer(${currentTemperatur}) --> Aktuelle Temperatur: ${wData.current.temp}`,
260
+ );
261
+ return currentTemperatur < wData.current.temp;
262
+ }
263
+
264
+ public static weatherRolloPosition(normalPos: number, desiredTemperatur: number, currentTemperatur: number): number {
265
+ let result: number = normalPos;
266
+ if (currentTemperatur > desiredTemperatur && this.isOutsideWarmer(currentTemperatur) && normalPos > 30) {
267
+ // Draußen ist wärmer also runter
268
+ result = 30;
269
+ }
270
+
271
+ ServerLogService.writeLog(
272
+ LogLevel.Info,
273
+ `weatherRolloPosition(${normalPos}, ${desiredTemperatur}, ${currentTemperatur}) --> Target: ${result}`,
274
+ );
275
+ return result;
276
+ }
277
+ }
@@ -0,0 +1,8 @@
1
+ export interface WeatherTemp {
2
+ day: number;
3
+ min: number;
4
+ max: number;
5
+ night: number;
6
+ eve: number;
7
+ morn: number;
8
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "compilerOptions": {
3
+ /* Basic Options */
4
+ "target": "es2018",
5
+ "module": "esNext",
6
+ "lib": ["esnext", "dom"],
7
+ "allowJs": true,
8
+ "checkJs": false,
9
+ "jsx": "react",
10
+ "incremental": true,
11
+ "noEmit": true,
12
+
13
+ /* Strict Type-Checking Options */
14
+ "strict": true,
15
+ "noImplicitAny": true,
16
+ "strictNullChecks": true,
17
+
18
+ /* Additional Checks */
19
+ "noUnusedLocals": true,
20
+ "noUnusedParameters": true,
21
+ "noImplicitReturns": false,
22
+ "noFallthroughCasesInSwitch": false,
23
+
24
+ /* Module Resolution Options */
25
+ "baseUrl": ".",
26
+ "paths": {
27
+ /* Support absolute /imports/* with a leading '/' */
28
+ "/*": ["*"]
29
+ },
30
+ "moduleResolution": "node",
31
+ "resolveJsonModule": true,
32
+ "typeRoots": ["./node_modules/@types", "./types"],
33
+ "types": [
34
+ "bson",
35
+ "connect",
36
+ "iobroker",
37
+ "meteor",
38
+ "meteor-roles",
39
+ "mocha",
40
+ "mongodb",
41
+ "node",
42
+ "node-telegram-bot-api",
43
+ "prop-types",
44
+ "react",
45
+ "react-dom",
46
+ "react-router",
47
+ "react-router-dom",
48
+ "socket.io-client",
49
+ "underscore",
50
+ "ws",
51
+ ],
52
+ "esModuleInterop": true,
53
+ "preserveSymlinks": true
54
+ },
55
+ "exclude": [
56
+ "./.meteor/**",
57
+ "./packages/**"
58
+ ]
59
+ }