hoffmation-base 0.1.1 → 0.1.5

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 (113) hide show
  1. package/.eslintrc.js +27 -27
  2. package/.github/workflows/npm-publish.yml +50 -0
  3. package/.prettierrc.js +9 -9
  4. package/LICENSE +21 -21
  5. package/index.js +1 -1
  6. package/models/connectionCallbacks.ts +13 -13
  7. package/models/daytime.ts +3 -3
  8. package/models/deviceConfig.ts +8 -8
  9. package/models/dimmerSettings.ts +5 -5
  10. package/models/iTemperaturDataPoint.ts +9 -9
  11. package/models/lampSettings.ts +5 -5
  12. package/models/ledSettings.ts +19 -19
  13. package/models/logLevel.ts +9 -9
  14. package/models/persistence/BasicRoomInfo.ts +3 -3
  15. package/models/persistence/DailyMovementCount.ts +3 -3
  16. package/models/persistence/RoomDetailInfo.ts +4 -4
  17. package/models/persistence/temperaturDataPoint.ts +12 -12
  18. package/models/persistence/todaysCount.ts +3 -3
  19. package/models/rooms/RoomBase.ts +357 -357
  20. package/models/rooms/RoomSettings/RoomSettings.ts +159 -159
  21. package/models/rooms/RoomSettings/hmIPRoomSettings.ts +53 -53
  22. package/models/rooms/RoomSettings/iRoomDefaultSettings.ts +17 -17
  23. package/models/rooms/RoomSettings/readme.md +17 -17
  24. package/models/rooms/RoomSettings/zigbeeRoomSettings.ts +51 -51
  25. package/models/rooms/iRoomImportEnforcer.ts +3 -3
  26. package/models/rooms/readme.md +11 -11
  27. package/models/temperaturSettings.ts +22 -22
  28. package/models/timeCallback.ts +90 -90
  29. package/package.json +1 -1
  30. package/server/config/config-readme.md +19 -19
  31. package/server/config/iConfig.ts +53 -53
  32. package/server/config/private/mainConfig.json +64 -64
  33. package/server/devices/DeviceInfo.ts +66 -66
  34. package/server/devices/Griffe.ts +31 -31
  35. package/server/devices/Heizgruppen.ts +91 -91
  36. package/server/devices/Rollos.ts +48 -48
  37. package/server/devices/deviceUpdater.ts +72 -72
  38. package/server/devices/devices.ts +189 -189
  39. package/server/devices/groups/fensterGroup.ts +175 -175
  40. package/server/devices/groups/heatGroup.ts +32 -32
  41. package/server/devices/groups/lampenGroup.ts +88 -88
  42. package/server/devices/groups/praesenzGroup.ts +182 -182
  43. package/server/devices/groups/smokeGroup.ts +16 -16
  44. package/server/devices/groups/sonosGroup.ts +33 -33
  45. package/server/devices/groups/tasterGroup.ts +48 -48
  46. package/server/devices/groups/waterGroup.ts +16 -16
  47. package/server/devices/hmIPDevices/Fenster.ts +114 -114
  48. package/server/devices/hmIPDevices/FensterPosition.ts +5 -5
  49. package/server/devices/hmIPDevices/TuerPosition.ts +4 -4
  50. package/server/devices/hmIPDevices/hmIpBewegung.ts +126 -126
  51. package/server/devices/hmIPDevices/hmIpDevice.ts +90 -90
  52. package/server/devices/hmIPDevices/hmIpDeviceType.ts +14 -14
  53. package/server/devices/hmIPDevices/hmIpGriff.ts +143 -143
  54. package/server/devices/hmIPDevices/hmIpHeizgruppe.ts +172 -172
  55. package/server/devices/hmIPDevices/hmIpHeizung.ts +69 -69
  56. package/server/devices/hmIPDevices/hmIpLampe.ts +119 -119
  57. package/server/devices/hmIPDevices/hmIpPraezenz.ts +99 -99
  58. package/server/devices/hmIPDevices/hmIpRoll.ts +133 -133
  59. package/server/devices/hmIPDevices/hmIpTaster.ts +82 -73
  60. package/server/devices/hmIPDevices/hmIpTherm.ts +19 -19
  61. package/server/devices/hmIPDevices/hmIpTuer.ts +115 -115
  62. package/server/devices/hmIPDevices/hmIpWippe.ts +55 -55
  63. package/server/devices/iDeviceUpdater.ts +4 -4
  64. package/server/devices/iIoBrokerDevice.ts +44 -44
  65. package/server/devices/iTaster.ts +6 -0
  66. package/server/devices/{hmIPDevices/hmIpTaste.ts → taste.ts} +84 -72
  67. package/server/devices/wledDevice.ts +124 -124
  68. package/server/devices/zigbee/ZigbeeActuator.ts +113 -113
  69. package/server/devices/zigbee/zigbeeAquaraVibra.ts +171 -171
  70. package/server/devices/zigbee/zigbeeAquaraWater.ts +94 -94
  71. package/server/devices/zigbee/zigbeeBlitzShp.ts +77 -77
  72. package/server/devices/zigbee/zigbeeDevice.ts +115 -115
  73. package/server/devices/zigbee/zigbeeDeviceType.ts +13 -13
  74. package/server/devices/zigbee/zigbeeHeimanSmoke.ts +99 -99
  75. package/server/devices/zigbee/zigbeeIkeaSteckdose.ts +31 -31
  76. package/server/devices/zigbee/zigbeeIlluActuator.ts +37 -37
  77. package/server/devices/zigbee/zigbeeIlluDimmer.ts +165 -165
  78. package/server/devices/zigbee/zigbeeIlluLampe.ts +33 -33
  79. package/server/devices/zigbee/zigbeeIlluLedRGBCCT.ts +137 -137
  80. package/server/ioBroker/connection.ts +1655 -1655
  81. package/server/ioBroker/ioBroker.main.ts +99 -99
  82. package/server/ioBroker/socketIOAuthInfo.ts +5 -5
  83. package/server/ioBroker/socketIOConnectOptions.ts +6 -6
  84. package/server/ioBroker/socketIOLogging.ts +29 -29
  85. package/server/ioBroker/socketIOVisCommand.ts +11 -11
  86. package/server/services/HTTPSOptions.ts +14 -14
  87. package/server/services/Sonos/OwnSonosDevices.ts +9 -0
  88. package/server/services/Sonos/mp3-server.ts +75 -75
  89. package/server/services/Sonos/polly-service.ts +100 -100
  90. package/server/services/Sonos/sonos-service.ts +194 -199
  91. package/server/services/Telegram/telegram-Commands.ts +237 -215
  92. package/server/services/Telegram/telegram-service.ts +171 -171
  93. package/server/services/Telegram/telegramMessageCalback.ts +11 -11
  94. package/server/services/calendar/muell-tonne.ts +82 -83
  95. package/server/services/calendar/m/303/274ll-service.ts +147 -146
  96. package/server/services/dbo/persist.ts +125 -125
  97. package/server/services/https-service.ts +71 -71
  98. package/server/services/log-service.ts +69 -69
  99. package/server/services/news-service.ts +81 -81
  100. package/server/services/settings-service.ts +15 -15
  101. package/server/services/time-callback-service.ts +223 -223
  102. package/server/services/utils/ringstorage.ts +24 -24
  103. package/server/services/utils/utils.ts +52 -52
  104. package/server/services/weather/weather-alert.ts +7 -7
  105. package/server/services/weather/weather-current.ts +26 -26
  106. package/server/services/weather/weather-daily.ts +22 -22
  107. package/server/services/weather/weather-feelsLike.ts +6 -6
  108. package/server/services/weather/weather-hourly.ts +17 -17
  109. package/server/services/weather/weather-item.ts +6 -6
  110. package/server/services/weather/weather-minutes.ts +4 -4
  111. package/server/services/weather/weather-service.ts +277 -277
  112. package/server/services/weather/weather-temp.ts +8 -8
  113. package/tsconfig.json +58 -58
@@ -1,71 +1,71 @@
1
- import { HTTPSOptions } from './HTTPSOptions';
2
- import { ServerLogService } from './log-service';
3
- import { LogLevel } from '../../models/logLevel';
4
- import * as fs from 'fs';
5
- import HTTPS from 'https';
6
- import { Utils } from './utils/utils';
7
-
8
- export class HTTPSService {
9
- private static defaultCallback(data: string, statuscode: number): void {
10
- ServerLogService.writeLog(LogLevel.DeepTrace, `Response statusCode:"${statuscode}"\nData:"${data}"`);
11
- }
12
-
13
- public static request(
14
- options: HTTPSOptions,
15
- postData: string = '',
16
- retryOnError: number = 5,
17
- responseCallback: (data: string, statuscode: number) => void = HTTPSService.defaultCallback,
18
- ): void {
19
- const responseData: string[] = [];
20
- const req = HTTPS.request(options, (res: any) => {
21
- res.on('data', (data: Buffer) => {
22
- responseData.push(data.toString());
23
- });
24
- res.on('end', () => {
25
- responseCallback(responseData.join(''), res.statusCode);
26
- });
27
- });
28
- req.on('error', (e: any) => {
29
- if (retryOnError > 0) {
30
- ServerLogService.writeLog(LogLevel.DeepTrace, `HTTPS request failed --> ${retryOnError} retries left`);
31
- Utils.guardedTimeout(() => {
32
- HTTPSService.request(options, postData, retryOnError - 1, responseCallback);
33
- }, 100);
34
- } else {
35
- ServerLogService.writeLog(LogLevel.Error, `HTTPS request failed after retries`);
36
- }
37
- });
38
- if (postData !== '') {
39
- req.write(postData);
40
- }
41
- req.end();
42
- }
43
-
44
- public static async downloadFile(url: string, filePath: string): Promise<boolean> {
45
- return new Promise((resolve, reject) => {
46
- const file = fs.createWriteStream(filePath);
47
- let fileInfo = null;
48
-
49
- const request = HTTPS.get(url, (response: any) => {
50
- if (response.statusCode !== 200) {
51
- reject(new Error(`Failed to get '${url}' (${response.statusCode})`));
52
- return;
53
- }
54
-
55
- fileInfo = {
56
- mime: response.headers['content-type'],
57
- size: parseInt(response.headers['content-length'], 10),
58
- };
59
-
60
- response.pipe(file);
61
- });
62
-
63
- // The destination stream is ended by the time it's called
64
- file.on('finish', () => resolve(true));
65
-
66
- request.on('error', (err: any) => {
67
- fs.unlink(filePath, () => resolve(false));
68
- });
69
- });
70
- }
71
- }
1
+ import { HTTPSOptions } from './HTTPSOptions';
2
+ import { ServerLogService } from './log-service';
3
+ import { LogLevel } from '../../models/logLevel';
4
+ import * as fs from 'fs';
5
+ import HTTPS from 'https';
6
+ import { Utils } from './utils/utils';
7
+
8
+ export class HTTPSService {
9
+ private static defaultCallback(data: string, statuscode: number): void {
10
+ ServerLogService.writeLog(LogLevel.DeepTrace, `Response statusCode:"${statuscode}"\nData:"${data}"`);
11
+ }
12
+
13
+ public static request(
14
+ options: HTTPSOptions,
15
+ postData: string = '',
16
+ retryOnError: number = 5,
17
+ responseCallback: (data: string, statuscode: number) => void = HTTPSService.defaultCallback,
18
+ ): void {
19
+ const responseData: string[] = [];
20
+ const req = HTTPS.request(options, (res: any) => {
21
+ res.on('data', (data: Buffer) => {
22
+ responseData.push(data.toString());
23
+ });
24
+ res.on('end', () => {
25
+ responseCallback(responseData.join(''), res.statusCode);
26
+ });
27
+ });
28
+ req.on('error', (e: any) => {
29
+ if (retryOnError > 0) {
30
+ ServerLogService.writeLog(LogLevel.DeepTrace, `HTTPS request failed --> ${retryOnError} retries left`);
31
+ Utils.guardedTimeout(() => {
32
+ HTTPSService.request(options, postData, retryOnError - 1, responseCallback);
33
+ }, 100);
34
+ } else {
35
+ ServerLogService.writeLog(LogLevel.Error, `HTTPS request failed after retries`);
36
+ }
37
+ });
38
+ if (postData !== '') {
39
+ req.write(postData);
40
+ }
41
+ req.end();
42
+ }
43
+
44
+ public static async downloadFile(url: string, filePath: string): Promise<boolean> {
45
+ return new Promise((resolve, reject) => {
46
+ const file = fs.createWriteStream(filePath);
47
+ let fileInfo = null;
48
+
49
+ const request = HTTPS.get(url, (response: any) => {
50
+ if (response.statusCode !== 200) {
51
+ reject(new Error(`Failed to get '${url}' (${response.statusCode})`));
52
+ return;
53
+ }
54
+
55
+ fileInfo = {
56
+ mime: response.headers['content-type'],
57
+ size: parseInt(response.headers['content-length'], 10),
58
+ };
59
+
60
+ response.pipe(file);
61
+ });
62
+
63
+ // The destination stream is ended by the time it's called
64
+ file.on('finish', () => resolve(true));
65
+
66
+ request.on('error', (err: any) => {
67
+ fs.unlink(filePath, () => resolve(false));
68
+ });
69
+ });
70
+ }
71
+ }
@@ -1,69 +1,69 @@
1
- import { HmIpDeviceType } from '../devices/hmIPDevices/hmIpDeviceType';
2
- import { ZigbeeDeviceType } from '../devices/zigbee/zigbeeDeviceType';
3
- import { TelegramService } from './Telegram/telegram-service';
4
- import { LogLevel } from '../../models/logLevel';
5
-
6
- export class ServerLogService {
7
- public static logLevel: number = 4;
8
- public static telegramLevel: number = -1; // Controlled from within Config File
9
- public static writeLog(pLevel: LogLevel, pMessage: string): void {
10
- if (pLevel > ServerLogService.logLevel) {
11
- return;
12
- }
13
-
14
- console.log(pMessage);
15
-
16
- if (pLevel <= ServerLogService.telegramLevel) {
17
- const title: string = LogLevel[pLevel];
18
- TelegramService.sendMessage(TelegramService.subscribedIDs, `${title}: ${pMessage}`);
19
- }
20
- }
21
-
22
- public static addedDeviceToRoom(
23
- pRoomName: string,
24
- pDeviceType: HmIpDeviceType,
25
- pRoomIndex: number,
26
- forceDebug: boolean = false,
27
- ): void {
28
- const logLevel = forceDebug ? LogLevel.Debug : LogLevel.Trace;
29
- ServerLogService.writeLog(
30
- logLevel,
31
- `${HmIpDeviceType[pDeviceType]} (Raumindex: ${pRoomIndex}) zum Raum "${pRoomName}" hinzugefügt"`,
32
- );
33
- }
34
-
35
- public static missingRoomHandling(pRoomName: string, pDeviceType: HmIpDeviceType): void {
36
- ServerLogService.writeLog(
37
- LogLevel.Warn,
38
- `Raum "${pRoomName}" hat keine Definition für den Typ "${HmIpDeviceType[pDeviceType]}"`,
39
- );
40
- }
41
-
42
- public static missingRoomIndexHandling(pRoomName: string, pIndex: number, pDeviceType: HmIpDeviceType): void {
43
- ServerLogService.writeLog(
44
- LogLevel.Warn,
45
- `Raum "${pRoomName}" hat keine Definition für den Typ "${HmIpDeviceType[pDeviceType]} mit Index ${pIndex}"`,
46
- );
47
- }
48
-
49
- public static addedZigbeeDeviceToRoom(pRoomName: string, pDeviceType: ZigbeeDeviceType, pRoomIndex: number): void {
50
- ServerLogService.writeLog(
51
- LogLevel.Trace,
52
- `${ZigbeeDeviceType[pDeviceType]} (Raumindex: ${pRoomIndex}) zum Raum "${pRoomName}" hinzugefügt"`,
53
- );
54
- }
55
-
56
- public static missingZigbeeRoomHandling(pRoomName: string, pDeviceType: ZigbeeDeviceType): void {
57
- ServerLogService.writeLog(
58
- LogLevel.Warn,
59
- `Raum "${pRoomName}" hat keine Definition für den Zigbee Typ "${ZigbeeDeviceType[pDeviceType]}"`,
60
- );
61
- }
62
-
63
- public static missingZigbeeRoomIndexHandling(pRoomName: string, pIndex: number, pDeviceType: ZigbeeDeviceType): void {
64
- ServerLogService.writeLog(
65
- LogLevel.Warn,
66
- `Raum "${pRoomName}" hat keine Definition für den Typ "${ZigbeeDeviceType[pDeviceType]} mit Index ${pIndex}"`,
67
- );
68
- }
69
- }
1
+ import { HmIpDeviceType } from '../devices/hmIPDevices/hmIpDeviceType';
2
+ import { ZigbeeDeviceType } from '../devices/zigbee/zigbeeDeviceType';
3
+ import { TelegramService } from './Telegram/telegram-service';
4
+ import { LogLevel } from '../../models/logLevel';
5
+
6
+ export class ServerLogService {
7
+ public static logLevel: number = 4;
8
+ public static telegramLevel: number = -1; // Controlled from within Config File
9
+ public static writeLog(pLevel: LogLevel, pMessage: string): void {
10
+ if (pLevel > ServerLogService.logLevel) {
11
+ return;
12
+ }
13
+
14
+ console.log(pMessage);
15
+
16
+ if (pLevel <= ServerLogService.telegramLevel) {
17
+ const title: string = LogLevel[pLevel];
18
+ TelegramService.sendMessage(TelegramService.subscribedIDs, `${title}: ${pMessage}`);
19
+ }
20
+ }
21
+
22
+ public static addedDeviceToRoom(
23
+ pRoomName: string,
24
+ pDeviceType: HmIpDeviceType,
25
+ pRoomIndex: number,
26
+ forceDebug: boolean = false,
27
+ ): void {
28
+ const logLevel = forceDebug ? LogLevel.Debug : LogLevel.Trace;
29
+ ServerLogService.writeLog(
30
+ logLevel,
31
+ `${HmIpDeviceType[pDeviceType]} (Raumindex: ${pRoomIndex}) zum Raum "${pRoomName}" hinzugefügt"`,
32
+ );
33
+ }
34
+
35
+ public static missingRoomHandling(pRoomName: string, pDeviceType: HmIpDeviceType): void {
36
+ ServerLogService.writeLog(
37
+ LogLevel.Warn,
38
+ `Raum "${pRoomName}" hat keine Definition für den Typ "${HmIpDeviceType[pDeviceType]}"`,
39
+ );
40
+ }
41
+
42
+ public static missingRoomIndexHandling(pRoomName: string, pIndex: number, pDeviceType: HmIpDeviceType): void {
43
+ ServerLogService.writeLog(
44
+ LogLevel.Warn,
45
+ `Raum "${pRoomName}" hat keine Definition für den Typ "${HmIpDeviceType[pDeviceType]} mit Index ${pIndex}"`,
46
+ );
47
+ }
48
+
49
+ public static addedZigbeeDeviceToRoom(pRoomName: string, pDeviceType: ZigbeeDeviceType, pRoomIndex: number): void {
50
+ ServerLogService.writeLog(
51
+ LogLevel.Trace,
52
+ `${ZigbeeDeviceType[pDeviceType]} (Raumindex: ${pRoomIndex}) zum Raum "${pRoomName}" hinzugefügt"`,
53
+ );
54
+ }
55
+
56
+ public static missingZigbeeRoomHandling(pRoomName: string, pDeviceType: ZigbeeDeviceType): void {
57
+ ServerLogService.writeLog(
58
+ LogLevel.Warn,
59
+ `Raum "${pRoomName}" hat keine Definition für den Zigbee Typ "${ZigbeeDeviceType[pDeviceType]}"`,
60
+ );
61
+ }
62
+
63
+ public static missingZigbeeRoomIndexHandling(pRoomName: string, pIndex: number, pDeviceType: ZigbeeDeviceType): void {
64
+ ServerLogService.writeLog(
65
+ LogLevel.Warn,
66
+ `Raum "${pRoomName}" hat keine Definition für den Typ "${ZigbeeDeviceType[pDeviceType]} mit Index ${pIndex}"`,
67
+ );
68
+ }
69
+ }
@@ -1,81 +1,81 @@
1
- import { HTTPSService } from './https-service';
2
- import { HTTPSOptions } from './HTTPSOptions';
3
- import { ServerLogService } from './log-service';
4
- import { LogLevel } from '../../models/logLevel';
5
- import * as fs from 'fs';
6
- import { OwnSonosDevice, SonosService } from './Sonos/sonos-service';
7
- import { PollyService } from './Sonos/polly-service';
8
- import { Utils } from './utils/utils';
9
- import { SettingsService } from './settings-service';
10
-
11
- export class NewsService {
12
- public static oneDay: number = 1000 * 60 * 60 * 24;
13
- public static lastNewsName: string;
14
- private static hourlyInterval: NodeJS.Timeout;
15
-
16
- public static initialize(): void {
17
- NewsService.hourlyInterval = Utils.guardedInterval(NewsService.getLastNews, 3600000);
18
- NewsService.getLastNews();
19
- }
20
-
21
- public static getLastNews(): void {
22
- HTTPSService.request(
23
- new HTTPSOptions('www1.wdr.de', '/mediathek/audio/wdr-aktuell-news/index.html', {}, 'GET', 443),
24
- '',
25
- 5,
26
- (response: string) => {
27
- try {
28
- const cutAfterDownload: string = response.split(`" title="Audio Download">`)[0];
29
- const cutsPriorDownload: string[] = cutAfterDownload.split(`<a class="button download fsk0" href="`);
30
- const target: string = 'https:' + cutsPriorDownload[cutsPriorDownload.length - 1];
31
- const splits: string[] = target.split('/');
32
- const fileName: string = splits[splits.length - 1];
33
- const filePath = `${SettingsService.settings.mp3Server?.path}${fileName}`;
34
- ServerLogService.writeLog(LogLevel.Debug, `NewsService: Die aktuelle News ist "${target}"`);
35
- if (fs.existsSync(filePath)) {
36
- NewsService.lastNewsName = fileName.split('.mp3')[0];
37
- ServerLogService.writeLog(LogLevel.Debug, `Wir haben bereits die neuste WDR Nachrichten heruntergeladen.`);
38
- return;
39
- }
40
- HTTPSService.downloadFile(target, `//HOMESERVER/Users/Public/Documents/ttsMP3/${fileName}`).then(
41
- (success: boolean) => {
42
- if (!success) {
43
- ServerLogService.writeLog(LogLevel.Debug, `Fehler beim Herunterladen der Nachrichten von WDR`);
44
- return;
45
- }
46
-
47
- NewsService.lastNewsName = fileName.split('.mp3')[0];
48
- },
49
- );
50
- } catch (e) {
51
- ServerLogService.writeLog(LogLevel.Debug, `Fehler beim Parsen der WDR Antwort Error: ${e}`);
52
- return;
53
- }
54
- },
55
- );
56
- }
57
-
58
- public static playLastNews(ownSonosDevice: OwnSonosDevice, volume: number = 30, retries: number = 5): void {
59
- if (!NewsService.lastNewsName) {
60
- if (retries > 0) {
61
- ServerLogService.writeLog(
62
- LogLevel.Warn,
63
- `Der NewsService ist noch nicht bereit --> warten, verbleibende Neuversuche ${retries - 1}`,
64
- );
65
- Utils.guardedTimeout(() => {
66
- NewsService.playLastNews(ownSonosDevice, volume, retries - 1);
67
- }, 1000);
68
- } else {
69
- ServerLogService.writeLog(LogLevel.Error, `Der NewsService ist trotz Warten nicht bereit --> Abbruch`);
70
- }
71
- return;
72
- }
73
-
74
- SonosService.playOnDevice(
75
- ownSonosDevice,
76
- NewsService.lastNewsName,
77
- PollyService.getDuration(NewsService.lastNewsName),
78
- volume,
79
- );
80
- }
81
- }
1
+ import { HTTPSService } from './https-service';
2
+ import { HTTPSOptions } from './HTTPSOptions';
3
+ import { ServerLogService } from './log-service';
4
+ import { LogLevel } from '../../models/logLevel';
5
+ import * as fs from 'fs';
6
+ import { OwnSonosDevice, SonosService } from './Sonos/sonos-service';
7
+ import { PollyService } from './Sonos/polly-service';
8
+ import { Utils } from './utils/utils';
9
+ import { SettingsService } from './settings-service';
10
+
11
+ export class NewsService {
12
+ public static oneDay: number = 1000 * 60 * 60 * 24;
13
+ public static lastNewsName: string;
14
+ private static hourlyInterval: NodeJS.Timeout;
15
+
16
+ public static initialize(): void {
17
+ NewsService.hourlyInterval = Utils.guardedInterval(NewsService.getLastNews, 3600000);
18
+ NewsService.getLastNews();
19
+ }
20
+
21
+ public static getLastNews(): void {
22
+ HTTPSService.request(
23
+ new HTTPSOptions('www1.wdr.de', '/mediathek/audio/wdr-aktuell-news/index.html', {}, 'GET', 443),
24
+ '',
25
+ 5,
26
+ (response: string) => {
27
+ try {
28
+ const cutAfterDownload: string = response.split(`" title="Audio Download">`)[0];
29
+ const cutsPriorDownload: string[] = cutAfterDownload.split(`<a class="button download fsk0" href="`);
30
+ const target: string = 'https:' + cutsPriorDownload[cutsPriorDownload.length - 1];
31
+ const splits: string[] = target.split('/');
32
+ const fileName: string = splits[splits.length - 1];
33
+ const filePath = `${SettingsService.settings.mp3Server?.path}${fileName}`;
34
+ ServerLogService.writeLog(LogLevel.Debug, `NewsService: Die aktuelle News ist "${target}"`);
35
+ if (fs.existsSync(filePath)) {
36
+ NewsService.lastNewsName = fileName.split('.mp3')[0];
37
+ ServerLogService.writeLog(LogLevel.Debug, `Wir haben bereits die neuste WDR Nachrichten heruntergeladen.`);
38
+ return;
39
+ }
40
+ HTTPSService.downloadFile(target, `//HOMESERVER/Users/Public/Documents/ttsMP3/${fileName}`).then(
41
+ (success: boolean) => {
42
+ if (!success) {
43
+ ServerLogService.writeLog(LogLevel.Debug, `Fehler beim Herunterladen der Nachrichten von WDR`);
44
+ return;
45
+ }
46
+
47
+ NewsService.lastNewsName = fileName.split('.mp3')[0];
48
+ },
49
+ );
50
+ } catch (e) {
51
+ ServerLogService.writeLog(LogLevel.Debug, `Fehler beim Parsen der WDR Antwort Error: ${e}`);
52
+ return;
53
+ }
54
+ },
55
+ );
56
+ }
57
+
58
+ public static playLastNews(ownSonosDevice: OwnSonosDevice, volume: number = 30, retries: number = 5): void {
59
+ if (!NewsService.lastNewsName) {
60
+ if (retries > 0) {
61
+ ServerLogService.writeLog(
62
+ LogLevel.Warn,
63
+ `Der NewsService ist noch nicht bereit --> warten, verbleibende Neuversuche ${retries - 1}`,
64
+ );
65
+ Utils.guardedTimeout(() => {
66
+ NewsService.playLastNews(ownSonosDevice, volume, retries - 1);
67
+ }, 1000);
68
+ } else {
69
+ ServerLogService.writeLog(LogLevel.Error, `Der NewsService ist trotz Warten nicht bereit --> Abbruch`);
70
+ }
71
+ return;
72
+ }
73
+
74
+ SonosService.playOnDevice(
75
+ ownSonosDevice,
76
+ NewsService.lastNewsName,
77
+ PollyService.getDuration(NewsService.lastNewsName),
78
+ volume,
79
+ );
80
+ }
81
+ }
@@ -1,15 +1,15 @@
1
- // @ts-ignore
2
- import config from '/server/config/private/mainConfig.json';
3
- import { iConfig } from '../config/iConfig';
4
-
5
- export class SettingsService {
6
- public static settings: iConfig = config as iConfig;
7
-
8
- public static get TelegramActive(): boolean {
9
- return this.settings.telegram !== undefined;
10
- }
11
-
12
- public static get Mp3Active(): boolean {
13
- return this.settings.mp3Server !== undefined;
14
- }
15
- }
1
+ // @ts-ignore
2
+ import config from '/server/config/private/mainConfig.json';
3
+ import { iConfig } from '../config/iConfig';
4
+
5
+ export class SettingsService {
6
+ public static settings: iConfig = config as iConfig;
7
+
8
+ public static get TelegramActive(): boolean {
9
+ return this.settings.telegram !== undefined;
10
+ }
11
+
12
+ public static get Mp3Active(): boolean {
13
+ return this.settings.mp3Server !== undefined;
14
+ }
15
+ }