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,113 @@
1
+ import { ZigbeeDevice } from '/server/devices/zigbee/zigbeeDevice';
2
+ import { DeviceInfo } from '/server/devices/DeviceInfo';
3
+ import { ZigbeeDeviceType } from '/server/devices/zigbee/zigbeeDeviceType';
4
+ import { ServerLogService } from '/server/services/log-service';
5
+ import { LogLevel } from '/models/logLevel';
6
+ import { Utils } from '/server/services/utils/utils';
7
+ import { LampSettings } from '/models/lampSettings';
8
+
9
+ export class ZigbeeActuator extends ZigbeeDevice {
10
+ public settings: LampSettings = new LampSettings();
11
+ protected readonly actuatorOnSwitchID: string;
12
+ protected queuedValue: boolean | null = null;
13
+ protected actuatorOn: boolean = false;
14
+ private turnOffTimeout: NodeJS.Timeout | undefined = undefined;
15
+ private turnOffTime: number = 0;
16
+
17
+ public constructor(pInfo: DeviceInfo, type: ZigbeeDeviceType, actuatorOnSwitchID: string) {
18
+ super(pInfo, type);
19
+ this.actuatorOnSwitchID = actuatorOnSwitchID;
20
+ }
21
+
22
+ public update(
23
+ idSplit: string[],
24
+ state: ioBroker.State,
25
+ initial: boolean = false,
26
+ handledByChildObject: boolean = false,
27
+ ): void {
28
+ if (!handledByChildObject) {
29
+ ServerLogService.writeLog(
30
+ LogLevel.DeepTrace,
31
+ `Aktuator Update für "${this.info.customName}": ID: ${idSplit.join('.')} JSON: ${JSON.stringify(state)}`,
32
+ );
33
+ }
34
+ this.queuedValue = null;
35
+ super.update(idSplit, state, initial, true);
36
+ switch (idSplit[3]) {
37
+ case 'state':
38
+ !handledByChildObject &&
39
+ ServerLogService.writeLog(LogLevel.Trace, `Aktor Update für ${this.info.customName} auf ${state.val}`);
40
+ this.actuatorOn = state.val as boolean;
41
+ break;
42
+ }
43
+ }
44
+
45
+ public setActuator(pValue: boolean, timeout: number = -1, force: boolean = false): void {
46
+ if (this.actuatorOnSwitchID === '') {
47
+ ServerLogService.writeLog(LogLevel.Error, `Keine Switch ID für "${this.info.customName}" bekannt.`);
48
+ return;
49
+ }
50
+
51
+ if (!force && Utils.nowMS() < this.turnOffTime) {
52
+ ServerLogService.writeLog(
53
+ LogLevel.Debug,
54
+ `Skip automatic command for "${this.info.customName}" to ${pValue} as it is locked until ${new Date(
55
+ this.turnOffTime,
56
+ ).toLocaleTimeString()}`,
57
+ );
58
+ return;
59
+ }
60
+
61
+ if (!this.ioConn) {
62
+ ServerLogService.writeLog(LogLevel.Error, `Keine Connection für "${this.info.customName}" bekannt.`);
63
+ return;
64
+ }
65
+
66
+ if (!force && pValue === this.actuatorOn && this.queuedValue === null) {
67
+ ServerLogService.writeLog(
68
+ LogLevel.Debug,
69
+ `Skip actuator command for "${this.info.customName}" as it is already ${pValue}`,
70
+ );
71
+ return;
72
+ }
73
+
74
+ ServerLogService.writeLog(LogLevel.Debug, `Stecker schalten: "${this.info.customName}" Wert: ${pValue}`);
75
+ this.ioConn.setState(this.actuatorOnSwitchID, pValue, (err) => {
76
+ if (err) {
77
+ console.log(`Stecker schalten ergab Fehler: ${err}`);
78
+ }
79
+ });
80
+ this.queuedValue = pValue;
81
+
82
+ if (this.turnOffTimeout !== undefined) {
83
+ clearTimeout(this.turnOffTimeout);
84
+ this.turnOffTimeout = undefined;
85
+ }
86
+
87
+ if (timeout < 0 || !pValue) {
88
+ return;
89
+ }
90
+
91
+ this.turnOffTime = Utils.nowMS() + timeout;
92
+ this.turnOffTimeout = Utils.guardedTimeout(
93
+ () => {
94
+ ServerLogService.writeLog(LogLevel.Debug, `Delayed Turnoff for "${this.info.customName}" initiated`);
95
+ this.turnOffTimeout = undefined;
96
+ if (!this.room) {
97
+ this.setActuator(false, -1, true);
98
+ } else {
99
+ this.room.setLightTimeBased(true);
100
+ }
101
+ },
102
+ timeout,
103
+ this,
104
+ );
105
+ }
106
+
107
+ public toggleActuator(force: boolean = false): boolean {
108
+ const newVal = this.queuedValue !== null ? !this.queuedValue : !this.actuatorOn;
109
+ const timeout: number = newVal && force ? 30 * 60 * 1000 : -1;
110
+ this.setActuator(newVal, timeout, force);
111
+ return newVal;
112
+ }
113
+ }
@@ -0,0 +1,171 @@
1
+ import { DeviceInfo } from '../DeviceInfo';
2
+ import { ZigbeeDevice } from './zigbeeDevice';
3
+ import { ZigbeeDeviceType } from './zigbeeDeviceType';
4
+ import { LogLevel } from '/models/logLevel';
5
+ import { ServerLogService } from '/server/services/log-service';
6
+ import { SonosService } from '/server/services/Sonos/sonos-service';
7
+ import { Utils } from '/server/services/utils/utils';
8
+ import { PollyService } from '/server/services/Sonos/polly-service';
9
+
10
+ export class ZigbeeAquaraVibra extends ZigbeeDevice {
11
+ public sensitivity: string = '';
12
+ public tiltAngle: number = 0;
13
+ public tiltAngleX: number = 0;
14
+ public tiltAngleXAbs: number = 0;
15
+ public tiltAngleY: number = 0;
16
+ public tiltAngleYAbs: number = 0;
17
+ public tiltAngleZ: number = 0;
18
+ public tilt: boolean = false;
19
+ public vibration: boolean = false;
20
+ public vibrationBlockedTimeStamp: number = 0;
21
+ private _idSensitivity: string = '';
22
+ private _vibrationBlocked: boolean = false;
23
+ private _alarmMessage: string;
24
+ // TODO Set Sensitivity
25
+
26
+ public constructor(pInfo: DeviceInfo) {
27
+ super(pInfo, ZigbeeDeviceType.ZigbeeAquaraVibra);
28
+ this._alarmMessage = `Alarm bei ${this.info.customName}. Ich wiederhole: Alarm bei ${this.info.customName}`;
29
+ PollyService.preloadTTS(this._alarmMessage);
30
+ this._idSensitivity = `${this.info.fullID}.sensitivity`;
31
+ }
32
+
33
+ public set vibrationBlocked(pVal: boolean) {
34
+ ServerLogService.writeLog(
35
+ LogLevel.Debug,
36
+ `${pVal ? 'Dea' : 'A'}ktiviere Vibrationsalarm für ${this.info.customName}`,
37
+ );
38
+ if (pVal) {
39
+ this.vibrationBlockedTimeStamp = new Date().getTime();
40
+ }
41
+ this._vibrationBlocked = pVal;
42
+ }
43
+
44
+ public update(idSplit: string[], state: ioBroker.State, initial: boolean = false): void {
45
+ ServerLogService.writeLog(
46
+ LogLevel.DeepTrace,
47
+ `Stecker Update für "${this.info.customName}": ID: ${idSplit.join('.')} JSON: ${JSON.stringify(state)}`,
48
+ );
49
+ super.update(idSplit, state, initial, true);
50
+ switch (idSplit[3]) {
51
+ case 'sensitivity':
52
+ ServerLogService.writeLog(
53
+ LogLevel.Trace,
54
+ `Vibrationssensor Update für ${this.info.customName} auf Sensitivity: ${state.val}`,
55
+ );
56
+ this.tiltAngleZ = state.val as number;
57
+ break;
58
+ case 'tilt_angle_z':
59
+ ServerLogService.writeLog(
60
+ LogLevel.Trace,
61
+ `Vibrationssensor Update für ${this.info.customName} auf Winkel Z: ${state.val}`,
62
+ );
63
+ this.tiltAngleZ = state.val as number;
64
+ break;
65
+ case 'tilt_angle_y':
66
+ ServerLogService.writeLog(
67
+ LogLevel.Trace,
68
+ `Vibrationssensor Update für ${this.info.customName} auf Winkel Y: ${state.val}`,
69
+ );
70
+ this.tiltAngleY = state.val as number;
71
+ break;
72
+ case 'tilt_angle_x':
73
+ ServerLogService.writeLog(
74
+ LogLevel.Trace,
75
+ `Vibrationssensor Update für ${this.info.customName} auf Winkel X: ${state.val}`,
76
+ );
77
+ this.tiltAngleX = state.val as number;
78
+ break;
79
+ case 'vibration':
80
+ ServerLogService.writeLog(
81
+ LogLevel.Trace,
82
+ `Vibrationssensor Update für ${this.info.customName} auf Vibration erkannt: ${state.val}`,
83
+ );
84
+ this.vibration = state.val as boolean;
85
+ if (this.vibration) {
86
+ Utils.guardedTimeout(
87
+ () => {
88
+ this.alarmCheck();
89
+ },
90
+ 8500,
91
+ this,
92
+ );
93
+ }
94
+ break;
95
+ case 'tilt_angle_y_abs':
96
+ ServerLogService.writeLog(
97
+ LogLevel.Trace,
98
+ `Vibrationssensor Update für ${this.info.customName} auf absoluten Winkel Y: ${state.val}`,
99
+ );
100
+ this.tiltAngleYAbs = state.val as number;
101
+ break;
102
+ case 'tilt_angle_X_abs':
103
+ ServerLogService.writeLog(
104
+ LogLevel.Trace,
105
+ `Vibrationssensor Update für ${this.info.customName} auf absoluten Winkel X: ${state.val}`,
106
+ );
107
+ this.tiltAngleXAbs = state.val as number;
108
+ break;
109
+ case 'tilt_angle':
110
+ ServerLogService.writeLog(
111
+ LogLevel.Trace,
112
+ `Vibrationssensor Update für ${this.info.customName} auf Winkel: ${state.val}`,
113
+ );
114
+ this.tiltAngle = state.val as number;
115
+ break;
116
+ case 'tilt':
117
+ ServerLogService.writeLog(
118
+ LogLevel.Trace,
119
+ `Vibrationssensor Update für ${this.info.customName} auf Winkel: ${state.val}`,
120
+ );
121
+ this.tilt = state.val as boolean;
122
+ break;
123
+ }
124
+ }
125
+
126
+ public setSensitivity(pVal: number): void {
127
+ let result = 'high';
128
+ switch (pVal) {
129
+ case 0:
130
+ result = 'low';
131
+ break;
132
+ case 1:
133
+ result = 'medium';
134
+ break;
135
+ }
136
+ if (this._idSensitivity === '') {
137
+ ServerLogService.writeLog(LogLevel.Error, `Keine Switch ID für "${this.info.customName}" bekannt.`);
138
+ return;
139
+ }
140
+
141
+ if (!this.ioConn) {
142
+ ServerLogService.writeLog(LogLevel.Error, `Keine Connection für "${this.info.customName}" bekannt.`);
143
+ return;
144
+ }
145
+
146
+ ServerLogService.writeLog(
147
+ LogLevel.Debug,
148
+ `Vibration Sensitivität schalten: "${this.info.customName}" Wert: ${result}`,
149
+ );
150
+ this.ioConn.setState(this._idSensitivity, result, (err) => {
151
+ if (err) {
152
+ console.log(`Stecker schalten ergab Fehler: ${err}`);
153
+ }
154
+ });
155
+ }
156
+
157
+ private alarmCheck(): void {
158
+ ServerLogService.writeLog(
159
+ LogLevel.Debug,
160
+ `Alarmcheck für ${this.info.customName} Alarmblock Wert: ${this._vibrationBlocked}`,
161
+ );
162
+ if (this._vibrationBlocked) {
163
+ ServerLogService.writeLog(LogLevel.Debug, `Fenster offen, ignoriere Vibrationsalarm bei ${this.info.customName}`);
164
+ return;
165
+ }
166
+
167
+ const message = this._alarmMessage;
168
+ SonosService.speakOnAll(message);
169
+ ServerLogService.writeLog(LogLevel.Alert, message);
170
+ }
171
+ }
@@ -0,0 +1,94 @@
1
+ import { DeviceInfo } from '../DeviceInfo';
2
+ import { ZigbeeDevice } from './zigbeeDevice';
3
+ import { ZigbeeDeviceType } from './zigbeeDeviceType';
4
+ import { LogLevel } from '/models/logLevel';
5
+ import { ServerLogService } from '/server/services/log-service';
6
+ import { SonosService } from '/server/services/Sonos/sonos-service';
7
+ import { Utils } from '/server/services/utils/utils';
8
+ import { PollyService } from '/server/services/Sonos/polly-service';
9
+
10
+ export class ZigbeeAquaraWater extends ZigbeeDevice {
11
+ public water: boolean = false;
12
+ private _roomName: string = '';
13
+ public iAlarm: NodeJS.Timeout | undefined = undefined;
14
+ private _messageAlarmFirst: string = '';
15
+ private _messageAlarm: string = '';
16
+ private _messageAlarmEnd: string = '';
17
+
18
+ public set roomName(val: string) {
19
+ this._roomName = val;
20
+ this._messageAlarmFirst = `${this.info.customName} erkennt Wasser. Möglicher Rohrbruch in ${this._roomName}`;
21
+ this._messageAlarm = `${this.info.customName} hat ausgelöst. Poolparty in ${this._roomName}`;
22
+ this._messageAlarmEnd = `Wasser Alarm Ende: Überflutung in ${this._roomName} zu Ende.`;
23
+ PollyService.preloadTTS(this._messageAlarmFirst);
24
+ PollyService.preloadTTS(this._messageAlarm);
25
+ PollyService.preloadTTS(this._messageAlarmEnd);
26
+ }
27
+
28
+ public constructor(pInfo: DeviceInfo) {
29
+ super(pInfo, ZigbeeDeviceType.ZigbeeAquaraWater);
30
+ this._messageAlarmFirst = `${this.info.customName} erkennt Wasser. Möglicher Rohrbruch in ${this._roomName}`;
31
+ this._messageAlarm = `${this.info.customName} hat ausgelöst. Poolparty in ${this._roomName}`;
32
+ this._messageAlarmEnd = `Wasser Alarm Ende: Überflutung in ${this._roomName} zu Ende.`;
33
+ }
34
+
35
+ public update(idSplit: string[], state: ioBroker.State, initial: boolean = false): void {
36
+ ServerLogService.writeLog(
37
+ LogLevel.DeepTrace,
38
+ `Water Update für "${this.info.customName}": ID: ${idSplit.join('.')} JSON: ${JSON.stringify(state)}`,
39
+ );
40
+ super.update(idSplit, state, initial, true);
41
+ switch (idSplit[3]) {
42
+ case 'detected':
43
+ ServerLogService.writeLog(LogLevel.Debug, `Wasser Update für ${this.info.customName} auf Wasser: ${state.val}`);
44
+ const newVal: boolean = state.val === true;
45
+ if (this.water === true && !newVal) {
46
+ this.stopAlarm();
47
+ } else if (newVal) {
48
+ this.startAlarm();
49
+ }
50
+ this.water = newVal;
51
+ break;
52
+ }
53
+ }
54
+
55
+ private startAlarm(): void {
56
+ if (this.iAlarm !== undefined) {
57
+ clearInterval(this.iAlarm);
58
+ }
59
+ this.iAlarm = Utils.guardedInterval(
60
+ () => {
61
+ this.alarm();
62
+ },
63
+ 15000,
64
+ this,
65
+ );
66
+ this.alarm(true);
67
+ }
68
+
69
+ public stopAlarm(quiet: boolean = false): void {
70
+ if (this.iAlarm) {
71
+ clearInterval(this.iAlarm);
72
+ }
73
+ if (quiet) {
74
+ return;
75
+ }
76
+ const message = this._messageAlarmEnd;
77
+ Utils.guardedNewThread(() => {
78
+ ServerLogService.writeLog(LogLevel.Alert, message);
79
+ });
80
+ Utils.guardedNewThread(() => {
81
+ SonosService.speakOnAll(message);
82
+ });
83
+ }
84
+
85
+ private alarm(first: boolean = false): void {
86
+ const message = first ? this._messageAlarmFirst : this._messageAlarm;
87
+ Utils.guardedNewThread(() => {
88
+ ServerLogService.writeLog(LogLevel.Alert, message);
89
+ });
90
+ Utils.guardedNewThread(() => {
91
+ SonosService.speakOnAll(message, 80);
92
+ });
93
+ }
94
+ }
@@ -0,0 +1,77 @@
1
+ import { DeviceInfo } from '../DeviceInfo';
2
+ import { ZigbeeDevice } from './zigbeeDevice';
3
+ import { ZigbeeDeviceType } from './zigbeeDeviceType';
4
+ import { LampSettings } from '/models/lampSettings';
5
+ import { LogLevel } from '/models/logLevel';
6
+ import { ServerLogService } from '/server/services/log-service';
7
+
8
+ export class ZigbeeBlitzShp extends ZigbeeDevice {
9
+ public steckerOn: boolean = false;
10
+ public current: number = 0;
11
+ public energy: number = 0;
12
+ public loadPower: number = 0;
13
+ public settings: LampSettings = new LampSettings();
14
+ private steckerOnSwitchID: string = '';
15
+
16
+ public constructor(pInfo: DeviceInfo) {
17
+ super(pInfo, ZigbeeDeviceType.ZigbeeBlitzShp);
18
+ this.steckerOnSwitchID = `${this.info.fullID}.state`;
19
+ }
20
+
21
+ public update(idSplit: string[], state: ioBroker.State, initial: boolean = false): void {
22
+ ServerLogService.writeLog(
23
+ LogLevel.DeepTrace,
24
+ `Stecker Update für "${this.info.customName}": ID: ${idSplit.join('.')} JSON: ${JSON.stringify(state)}`,
25
+ );
26
+ super.update(idSplit, state, initial, true);
27
+ switch (idSplit[3]) {
28
+ case 'state':
29
+ ServerLogService.writeLog(LogLevel.Trace, `Stecker Update für ${this.info.customName} auf ${state.val}`);
30
+ this.steckerOn = state.val as boolean;
31
+ break;
32
+ case 'energy':
33
+ ServerLogService.writeLog(
34
+ LogLevel.Trace,
35
+ `Stecker Update für ${this.info.customName} auf Energie: ${state.val}`,
36
+ );
37
+ this.energy = state.val as number;
38
+ break;
39
+ case 'current':
40
+ ServerLogService.writeLog(LogLevel.Trace, `Stecker Update für ${this.info.customName} auf Strom: ${state.val}`);
41
+ this.current = state.val as number;
42
+ break;
43
+ case 'load_power':
44
+ ServerLogService.writeLog(
45
+ LogLevel.Trace,
46
+ `Stecker Update für ${this.info.customName} auf Leistungsaufnahme: ${state.val}`,
47
+ );
48
+ this.loadPower = state.val as number;
49
+ break;
50
+ }
51
+ }
52
+
53
+ public setStecker(pValue: boolean): void {
54
+ if (this.steckerOnSwitchID === '') {
55
+ ServerLogService.writeLog(LogLevel.Error, `Keine Switch ID für "${this.info.customName}" bekannt.`);
56
+ return;
57
+ }
58
+
59
+ if (!this.ioConn) {
60
+ ServerLogService.writeLog(LogLevel.Error, `Keine Connection für "${this.info.customName}" bekannt.`);
61
+ return;
62
+ }
63
+
64
+ ServerLogService.writeLog(LogLevel.Debug, `Stecker schalten: "${this.info.customName}" Wert: ${pValue}`);
65
+ this.ioConn.setState(this.steckerOnSwitchID, pValue, (err) => {
66
+ if (err) {
67
+ console.log(`Stecker schalten ergab Fehler: ${err}`);
68
+ }
69
+ });
70
+ }
71
+
72
+ public toggleStecker(): boolean {
73
+ const newVal = !this.steckerOn;
74
+ this.setStecker(newVal);
75
+ return newVal;
76
+ }
77
+ }
@@ -0,0 +1,115 @@
1
+ import { ZigbeeDeviceType } from './zigbeeDeviceType';
2
+ import { DeviceInfo } from '../DeviceInfo';
3
+ import { LogLevel } from '/models/logLevel';
4
+ import { ZigbeeAddDeviceItem, ZigbeeRoomSettings } from '/models/rooms/RoomSettings/zigbeeRoomSettings';
5
+ import { ServerLogService } from '/server/services/log-service';
6
+ import { ioBrokerBaseDevice } from '/server/devices/iIoBrokerDevice';
7
+ import { RoomBase } from '/models/rooms/RoomBase';
8
+
9
+ export class ZigbeeDevice extends ioBrokerBaseDevice {
10
+ private static roomSettings: { [id: string]: ZigbeeRoomSettings } = {};
11
+ public room: RoomBase | undefined = undefined;
12
+ public deviceType: ZigbeeDeviceType;
13
+ public available: boolean = false;
14
+ public linkQuality: number = 0;
15
+ public battery: number = -1;
16
+ public voltage: string = '';
17
+
18
+ public static addRoom(shortName: string, settings: ZigbeeRoomSettings): void {
19
+ if (this.roomSettings[shortName] !== undefined) {
20
+ ServerLogService.writeLog(
21
+ LogLevel.Alert,
22
+ `Es gibt bereits ein Registrat für ZigbeeRoomsettings für den Raumnamen "${shortName}"`,
23
+ );
24
+ return;
25
+ }
26
+ this.roomSettings[shortName] = settings;
27
+ }
28
+
29
+ public static checkMissing(): void {
30
+ for (const rName in this.roomSettings) {
31
+ this.roomSettings[rName].checkMissing();
32
+ }
33
+ }
34
+
35
+ public constructor(pInfo: DeviceInfo, pType: ZigbeeDeviceType) {
36
+ super(pInfo);
37
+ this.deviceType = pType;
38
+ this.addToCorrectRoom();
39
+ }
40
+
41
+ protected addToCorrectRoom(): void {
42
+ const settings: ZigbeeRoomSettings | undefined = ZigbeeDevice.roomSettings[this.info.room];
43
+ if (settings !== undefined) {
44
+ if (settings.devices[this.deviceType] === undefined) {
45
+ ServerLogService.missingZigbeeRoomHandling(settings.RoomName, this.deviceType);
46
+ return;
47
+ }
48
+ const deviceSettings: ZigbeeAddDeviceItem | undefined =
49
+ settings.devices[this.deviceType][this.info.deviceRoomIndex];
50
+ if (deviceSettings === undefined) {
51
+ ServerLogService.missingZigbeeRoomIndexHandling(settings.RoomName, this.info.deviceRoomIndex, this.deviceType);
52
+ return;
53
+ }
54
+
55
+ if (deviceSettings.customName !== undefined) {
56
+ this.info.customName = deviceSettings.customName;
57
+ }
58
+ deviceSettings.setID(this.info.devID);
59
+ deviceSettings.added = true;
60
+ ServerLogService.addedZigbeeDeviceToRoom(settings.RoomName, this.deviceType, this.info.deviceRoomIndex);
61
+ return;
62
+ }
63
+ ServerLogService.writeLog(LogLevel.Warn, `${this.info.room} ist noch kein bekannter Raum für Zigbee Geräte`);
64
+ }
65
+
66
+ public update(idSplit: string[], state: ioBroker.State, initial: boolean = false, pOverride: boolean = false): void {
67
+ ServerLogService.writeLog(
68
+ LogLevel.DeepTrace,
69
+ `Zigbee:Update für "${this.info.customName}": ID: ${idSplit.join('.')} JSON: ${JSON.stringify(state)}`,
70
+ );
71
+ if (!pOverride) {
72
+ ServerLogService.writeLog(
73
+ LogLevel.Warn,
74
+ `Keine Update Überschreibung für "${this.info.customName}":\n\tID: ${idSplit.join(
75
+ '.',
76
+ )}\n\tData: ${JSON.stringify(state)}`,
77
+ );
78
+ }
79
+
80
+ switch (idSplit[3]) {
81
+ case 'available':
82
+ this.available = state.val as boolean;
83
+ if (!this.available) {
84
+ ServerLogService.writeLog(
85
+ LogLevel.Debug,
86
+ `Das Zigbee Gerät mit dem Namen "${this.info.customName}" ist nicht erreichbar.`,
87
+ );
88
+ }
89
+ break;
90
+ case 'battery':
91
+ this.battery = state.val as number;
92
+ if (this.battery < 20) {
93
+ ServerLogService.writeLog(
94
+ LogLevel.Alert,
95
+ `Das Zigbee Gerät mit dem Namen "${this.info.customName}" hat unter 20% Batterie.`,
96
+ );
97
+ }
98
+ break;
99
+
100
+ case 'link_quality':
101
+ this.linkQuality = state.val as number;
102
+ if (this.linkQuality < 5) {
103
+ ServerLogService.writeLog(
104
+ LogLevel.Debug,
105
+ `Das Zigbee Gerät mit dem Namen "${this.info.customName}" hat eine schlechte Verbindung (${this.linkQuality}).`,
106
+ );
107
+ }
108
+ break;
109
+
110
+ case 'voltage':
111
+ this.voltage = state.val as string;
112
+ break;
113
+ }
114
+ }
115
+ }
@@ -0,0 +1,13 @@
1
+ export enum ZigbeeDeviceType {
2
+ unknown = 0,
3
+ ZigbeeIkeaFernbedienung = 1,
4
+ ZigbeeIkeaSteckdose = 2,
5
+ ZigbeeIlluLedRGBCCT = 3,
6
+ ZigbeeAquaraVibra = 4,
7
+ ZigbeeIlluDimmer = 5,
8
+ ZigbeeHeimanSmoke = 6,
9
+ ZigbeeAquaraWater = 7,
10
+ ZigbeeBlitzShp = 8,
11
+ ZigbeeIlluLampe = 9,
12
+ ZigbeeIlluActuator = 10,
13
+ }
@@ -0,0 +1,99 @@
1
+ import { DeviceInfo } from '../DeviceInfo';
2
+ import { ZigbeeDevice } from './zigbeeDevice';
3
+ import { ZigbeeDeviceType } from './zigbeeDeviceType';
4
+ import { LogLevel } from '/models/logLevel';
5
+ import { ServerLogService } from '/server/services/log-service';
6
+ import { SonosService } from '/server/services/Sonos/sonos-service';
7
+ import { RoomBase } from '/models/rooms/RoomBase';
8
+ import { Utils } from '/server/services/utils/utils';
9
+ import { PollyService } from '/server/services/Sonos/polly-service';
10
+
11
+ export class ZigbeeHeimanSmoke extends ZigbeeDevice {
12
+ public smoke: boolean = false;
13
+ private _roomName: string = '';
14
+ public iAlarm: NodeJS.Timeout | undefined = undefined;
15
+ private _messageAlarmFirst: string = '';
16
+ private _messageAlarm: string = '';
17
+ private _messageAlarmEnd: string = '';
18
+
19
+ public set roomName(val: string) {
20
+ this._roomName = val;
21
+ this._messageAlarmFirst = `Rauchmelder in ${this._roomName} ausgelöst. Möglicher Brand in ${this._roomName}`;
22
+ this._messageAlarm = `Rauchmelder in ${this._roomName} aktiv. Möglicher Brand in ${this._roomName}`;
23
+ this._messageAlarmEnd = `Rauchmelder Alarm Ende: Gefahr in ${this._roomName} zu Ende.`;
24
+ PollyService.preloadTTS(this._messageAlarmFirst);
25
+ PollyService.preloadTTS(this._messageAlarm);
26
+ PollyService.preloadTTS(this._messageAlarmEnd);
27
+ }
28
+
29
+ public constructor(pInfo: DeviceInfo) {
30
+ super(pInfo, ZigbeeDeviceType.ZigbeeHeimanSmoke);
31
+ this._messageAlarmFirst = `Rauchmelder in ${this._roomName} ausgelöst. Möglicher Brand in ${this._roomName}`;
32
+ this._messageAlarm = `Rauchmelder in ${this._roomName} aktiv. Möglicher Brand in ${this._roomName}`;
33
+ this._messageAlarmEnd = `Rauchmelder Alarm Ende: Gefahr in ${this._roomName} zu Ende.`;
34
+ }
35
+
36
+ public update(idSplit: string[], state: ioBroker.State, initial: boolean = false): void {
37
+ ServerLogService.writeLog(
38
+ LogLevel.DeepTrace,
39
+ `Smoke Update für "${this.info.customName}": ID: ${idSplit.join('.')} JSON: ${JSON.stringify(state)}`,
40
+ );
41
+ super.update(idSplit, state, initial, true);
42
+ switch (idSplit[3]) {
43
+ case 'smoke':
44
+ ServerLogService.writeLog(LogLevel.Debug, `Smoke Update für ${this.info.customName} auf Rauch: ${state.val}`);
45
+ const newVal: boolean = state.val === true;
46
+ if (this.smoke === true && !newVal) {
47
+ this.stopAlarm();
48
+ } else if (newVal) {
49
+ this.startAlarm();
50
+ }
51
+ this.smoke = newVal;
52
+ break;
53
+ }
54
+ }
55
+
56
+ private startAlarm(): void {
57
+ if (this.iAlarm !== undefined) {
58
+ clearInterval(this.iAlarm);
59
+ }
60
+ this.iAlarm = Utils.guardedInterval(
61
+ () => {
62
+ this.alarm();
63
+ },
64
+ 15000,
65
+ this,
66
+ );
67
+ this.alarm(true);
68
+ }
69
+
70
+ public stopAlarm(quiet: boolean = false): void {
71
+ if (this.iAlarm) {
72
+ clearInterval(this.iAlarm);
73
+ }
74
+ if (quiet) {
75
+ return;
76
+ }
77
+ const message = this._messageAlarmEnd;
78
+ Utils.guardedNewThread(() => {
79
+ ServerLogService.writeLog(LogLevel.Alert, message);
80
+ });
81
+ Utils.guardedNewThread(() => {
82
+ SonosService.speakOnAll(message);
83
+ });
84
+ }
85
+
86
+ private alarm(first: boolean = false): void {
87
+ const message = first ? this._messageAlarmFirst : this._messageAlarm;
88
+ Utils.guardedNewThread(() => {
89
+ ServerLogService.writeLog(LogLevel.Alert, message);
90
+ });
91
+ Utils.guardedNewThread(() => {
92
+ SonosService.speakOnAll(message, 100);
93
+ });
94
+ Utils.guardedNewThread(() => {
95
+ // Roll all Rollos up, to ensure free sight for firefighters
96
+ RoomBase.setAllRolloOfFloor(-1, 100);
97
+ });
98
+ }
99
+ }