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.
- package/.eslintrc.js +27 -27
- package/.github/workflows/npm-publish.yml +50 -0
- package/.prettierrc.js +9 -9
- package/LICENSE +21 -21
- package/index.js +1 -1
- package/models/connectionCallbacks.ts +13 -13
- package/models/daytime.ts +3 -3
- package/models/deviceConfig.ts +8 -8
- package/models/dimmerSettings.ts +5 -5
- package/models/iTemperaturDataPoint.ts +9 -9
- package/models/lampSettings.ts +5 -5
- package/models/ledSettings.ts +19 -19
- package/models/logLevel.ts +9 -9
- package/models/persistence/BasicRoomInfo.ts +3 -3
- package/models/persistence/DailyMovementCount.ts +3 -3
- package/models/persistence/RoomDetailInfo.ts +4 -4
- package/models/persistence/temperaturDataPoint.ts +12 -12
- package/models/persistence/todaysCount.ts +3 -3
- package/models/rooms/RoomBase.ts +357 -357
- package/models/rooms/RoomSettings/RoomSettings.ts +159 -159
- package/models/rooms/RoomSettings/hmIPRoomSettings.ts +53 -53
- package/models/rooms/RoomSettings/iRoomDefaultSettings.ts +17 -17
- package/models/rooms/RoomSettings/readme.md +17 -17
- package/models/rooms/RoomSettings/zigbeeRoomSettings.ts +51 -51
- package/models/rooms/iRoomImportEnforcer.ts +3 -3
- package/models/rooms/readme.md +11 -11
- package/models/temperaturSettings.ts +22 -22
- package/models/timeCallback.ts +90 -90
- package/package.json +1 -1
- package/server/config/config-readme.md +19 -19
- package/server/config/iConfig.ts +53 -53
- package/server/config/private/mainConfig.json +64 -64
- package/server/devices/DeviceInfo.ts +66 -66
- package/server/devices/Griffe.ts +31 -31
- package/server/devices/Heizgruppen.ts +91 -91
- package/server/devices/Rollos.ts +48 -48
- package/server/devices/deviceUpdater.ts +72 -72
- package/server/devices/devices.ts +189 -189
- package/server/devices/groups/fensterGroup.ts +175 -175
- package/server/devices/groups/heatGroup.ts +32 -32
- package/server/devices/groups/lampenGroup.ts +88 -88
- package/server/devices/groups/praesenzGroup.ts +182 -182
- package/server/devices/groups/smokeGroup.ts +16 -16
- package/server/devices/groups/sonosGroup.ts +33 -33
- package/server/devices/groups/tasterGroup.ts +48 -48
- package/server/devices/groups/waterGroup.ts +16 -16
- package/server/devices/hmIPDevices/Fenster.ts +114 -114
- package/server/devices/hmIPDevices/FensterPosition.ts +5 -5
- package/server/devices/hmIPDevices/TuerPosition.ts +4 -4
- package/server/devices/hmIPDevices/hmIpBewegung.ts +126 -126
- package/server/devices/hmIPDevices/hmIpDevice.ts +90 -90
- package/server/devices/hmIPDevices/hmIpDeviceType.ts +14 -14
- package/server/devices/hmIPDevices/hmIpGriff.ts +143 -143
- package/server/devices/hmIPDevices/hmIpHeizgruppe.ts +172 -172
- package/server/devices/hmIPDevices/hmIpHeizung.ts +69 -69
- package/server/devices/hmIPDevices/hmIpLampe.ts +119 -119
- package/server/devices/hmIPDevices/hmIpPraezenz.ts +99 -99
- package/server/devices/hmIPDevices/hmIpRoll.ts +133 -133
- package/server/devices/hmIPDevices/hmIpTaster.ts +82 -73
- package/server/devices/hmIPDevices/hmIpTherm.ts +19 -19
- package/server/devices/hmIPDevices/hmIpTuer.ts +115 -115
- package/server/devices/hmIPDevices/hmIpWippe.ts +55 -55
- package/server/devices/iDeviceUpdater.ts +4 -4
- package/server/devices/iIoBrokerDevice.ts +44 -44
- package/server/devices/iTaster.ts +6 -0
- package/server/devices/{hmIPDevices/hmIpTaste.ts → taste.ts} +84 -72
- package/server/devices/wledDevice.ts +124 -124
- package/server/devices/zigbee/ZigbeeActuator.ts +113 -113
- package/server/devices/zigbee/zigbeeAquaraVibra.ts +171 -171
- package/server/devices/zigbee/zigbeeAquaraWater.ts +94 -94
- package/server/devices/zigbee/zigbeeBlitzShp.ts +77 -77
- package/server/devices/zigbee/zigbeeDevice.ts +115 -115
- package/server/devices/zigbee/zigbeeDeviceType.ts +13 -13
- package/server/devices/zigbee/zigbeeHeimanSmoke.ts +99 -99
- package/server/devices/zigbee/zigbeeIkeaSteckdose.ts +31 -31
- package/server/devices/zigbee/zigbeeIlluActuator.ts +37 -37
- package/server/devices/zigbee/zigbeeIlluDimmer.ts +165 -165
- package/server/devices/zigbee/zigbeeIlluLampe.ts +33 -33
- package/server/devices/zigbee/zigbeeIlluLedRGBCCT.ts +137 -137
- package/server/ioBroker/connection.ts +1655 -1655
- package/server/ioBroker/ioBroker.main.ts +99 -99
- package/server/ioBroker/socketIOAuthInfo.ts +5 -5
- package/server/ioBroker/socketIOConnectOptions.ts +6 -6
- package/server/ioBroker/socketIOLogging.ts +29 -29
- package/server/ioBroker/socketIOVisCommand.ts +11 -11
- package/server/services/HTTPSOptions.ts +14 -14
- package/server/services/Sonos/OwnSonosDevices.ts +9 -0
- package/server/services/Sonos/mp3-server.ts +75 -75
- package/server/services/Sonos/polly-service.ts +100 -100
- package/server/services/Sonos/sonos-service.ts +194 -199
- package/server/services/Telegram/telegram-Commands.ts +237 -215
- package/server/services/Telegram/telegram-service.ts +171 -171
- package/server/services/Telegram/telegramMessageCalback.ts +11 -11
- package/server/services/calendar/muell-tonne.ts +82 -83
- package/server/services/calendar/m/303/274ll-service.ts +147 -146
- package/server/services/dbo/persist.ts +125 -125
- package/server/services/https-service.ts +71 -71
- package/server/services/log-service.ts +69 -69
- package/server/services/news-service.ts +81 -81
- package/server/services/settings-service.ts +15 -15
- package/server/services/time-callback-service.ts +223 -223
- package/server/services/utils/ringstorage.ts +24 -24
- package/server/services/utils/utils.ts +52 -52
- package/server/services/weather/weather-alert.ts +7 -7
- package/server/services/weather/weather-current.ts +26 -26
- package/server/services/weather/weather-daily.ts +22 -22
- package/server/services/weather/weather-feelsLike.ts +6 -6
- package/server/services/weather/weather-hourly.ts +17 -17
- package/server/services/weather/weather-item.ts +6 -6
- package/server/services/weather/weather-minutes.ts +4 -4
- package/server/services/weather/weather-service.ts +277 -277
- package/server/services/weather/weather-temp.ts +8 -8
- 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
|
+
}
|