hoffmation-base 1.1.4 → 1.1.7

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 (41) hide show
  1. package/lib/models/persistence/DesiredShutterPosition.d.ts +4 -0
  2. package/lib/models/persistence/DesiredShutterPosition.js +9 -0
  3. package/lib/models/persistence/index.d.ts +1 -0
  4. package/lib/models/persistence/index.js +1 -0
  5. package/lib/models/rooms/RoomBase.d.ts +2 -2
  6. package/lib/models/rooms/RoomBase.js +5 -5
  7. package/lib/server/devices/Griffe.js +2 -2
  8. package/lib/server/devices/baseDeviceInterfaces/iHandleSensor.d.ts +2 -2
  9. package/lib/server/devices/baseDeviceInterfaces/iShutter.d.ts +3 -3
  10. package/lib/server/devices/groups/{Fenster.d.ts → Window.d.ts} +3 -3
  11. package/lib/server/devices/groups/{Fenster.js → Window.js} +8 -8
  12. package/lib/server/devices/groups/index.d.ts +2 -2
  13. package/lib/server/devices/groups/index.js +2 -2
  14. package/lib/server/devices/groups/praesenzGroup.js +3 -3
  15. package/lib/server/devices/groups/tasterGroup.js +4 -4
  16. package/lib/server/devices/groups/{fensterGroup.d.ts → windowGroup.d.ts} +4 -4
  17. package/lib/server/devices/groups/{fensterGroup.js → windowGroup.js} +15 -15
  18. package/lib/server/devices/hmIPDevices/hmIpGriff.d.ts +6 -6
  19. package/lib/server/devices/hmIPDevices/hmIpGriff.js +11 -11
  20. package/lib/server/devices/hmIPDevices/hmIpRoll.d.ts +5 -5
  21. package/lib/server/devices/hmIPDevices/hmIpRoll.js +23 -15
  22. package/lib/server/devices/models/{FensterPosition.d.ts → WindowPosition.d.ts} +1 -1
  23. package/lib/server/devices/models/WindowPosition.js +9 -0
  24. package/lib/server/devices/models/index.d.ts +1 -1
  25. package/lib/server/devices/models/index.js +1 -1
  26. package/lib/server/devices/zigbee/BaseDevices/ZigbeeActuator.js +1 -0
  27. package/lib/server/devices/zigbee/BaseDevices/zigbeeShutter.d.ts +5 -5
  28. package/lib/server/devices/zigbee/BaseDevices/zigbeeShutter.js +22 -16
  29. package/lib/server/devices/zigbee/zigbeeAquaraVibra.js +2 -2
  30. package/lib/server/devices/zigbee/zigbeeIlluLampe.js +0 -1
  31. package/lib/server/devices/zigbee/zigbeeIlluShutter.js +0 -1
  32. package/lib/server/services/ShutterService.d.ts +5 -5
  33. package/lib/server/services/ShutterService.js +3 -3
  34. package/lib/server/services/Telegram/telegram-Commands.js +2 -2
  35. package/lib/server/services/dbo/iPersist.d.ts +2 -1
  36. package/lib/server/services/dbo/postgreSqlPersist.d.ts +2 -1
  37. package/lib/server/services/dbo/postgreSqlPersist.js +18 -2
  38. package/lib/server/services/room-service/room-service.js +2 -2
  39. package/lib/tsconfig.tsbuildinfo +1 -1
  40. package/package.json +1 -1
  41. package/lib/server/devices/models/FensterPosition.js +0 -9
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WindowPosition = void 0;
4
+ var WindowPosition;
5
+ (function (WindowPosition) {
6
+ WindowPosition[WindowPosition["geschlossen"] = 0] = "geschlossen";
7
+ WindowPosition[WindowPosition["kipp"] = 1] = "kipp";
8
+ WindowPosition[WindowPosition["offen"] = 2] = "offen";
9
+ })(WindowPosition = exports.WindowPosition || (exports.WindowPosition = {}));
@@ -1,2 +1,2 @@
1
- export * from './FensterPosition';
1
+ export * from './WindowPosition';
2
2
  export * from './MagnetPosition';
@@ -14,5 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./FensterPosition"), exports);
17
+ __exportStar(require("./WindowPosition"), exports);
18
18
  __exportStar(require("./MagnetPosition"), exports);
@@ -28,6 +28,7 @@ class ZigbeeActuator extends zigbeeDevice_1.ZigbeeDevice {
28
28
  this.log(models_1.LogLevel.Trace, `Aktor Update für ${this.info.customName} auf ${state.val}`);
29
29
  }
30
30
  this.actuatorOn = state.val;
31
+ this.persist();
31
32
  break;
32
33
  }
33
34
  }
@@ -4,7 +4,7 @@ import { DeviceType } from '../../deviceType';
4
4
  import { ShutterCalibration, ShutterSettings } from '../../../../models';
5
5
  import { ZigbeeDevice } from './zigbeeDevice';
6
6
  import { iShutter } from '../../baseDeviceInterfaces';
7
- import { Fenster } from '../../groups';
7
+ import { Window } from '../../groups';
8
8
  import { IoBrokerBaseDevice } from '../../IoBrokerBaseDevice';
9
9
  import { IoBrokerDeviceInfo } from '../../IoBrokerDeviceInfo';
10
10
  export declare class ZigbeeShutter extends ZigbeeDevice implements iShutter {
@@ -18,10 +18,10 @@ export declare class ZigbeeShutter extends ZigbeeDevice implements iShutter {
18
18
  protected _currentLevel: number;
19
19
  get currentLevel(): number;
20
20
  set currentLevel(value: number);
21
- protected _fenster?: Fenster;
22
- get fenster(): Fenster | undefined;
23
- set fenster(value: Fenster | undefined);
24
- get desiredFensterLevel(): number;
21
+ protected _window?: Window;
22
+ get window(): Window | undefined;
23
+ set window(value: Window | undefined);
24
+ get desiredWindowShutterLevel(): number;
25
25
  persist(): void;
26
26
  update(idSplit: string[], state: ioBroker.State, initial?: boolean, pOverride?: boolean): void;
27
27
  setLevel(pPosition: number, initial?: boolean, skipOpenWarning?: boolean): void;
@@ -12,7 +12,7 @@ const lodash_1 = __importDefault(require("lodash"));
12
12
  const DeviceCapability_1 = require("../../DeviceCapability");
13
13
  class ZigbeeShutter extends zigbeeDevice_1.ZigbeeDevice {
14
14
  constructor(pInfo, pType) {
15
- var _a;
15
+ var _a, _b;
16
16
  super(pInfo, pType);
17
17
  this.settings = new models_1.ShutterSettings();
18
18
  this._iMovementFinishTimeout = null;
@@ -29,6 +29,12 @@ class ZigbeeShutter extends zigbeeDevice_1.ZigbeeDevice {
29
29
  var _a;
30
30
  this.log(models_1.LogLevel.Warn, `Failed to initialize Calibration data, err ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
31
31
  });
32
+ (_b = services_1.Utils.dbo) === null || _b === void 0 ? void 0 : _b.getLastDesiredPosition(this).then((val) => {
33
+ var _a;
34
+ if (val.desiredPosition >= -1) {
35
+ (_a = this._window) === null || _a === void 0 ? void 0 : _a.setDesiredPosition(val.desiredPosition);
36
+ }
37
+ });
32
38
  }
33
39
  get currentLevel() {
34
40
  if (this._setLevel !== -1 && this._currentLevel !== this._setLevel) {
@@ -40,26 +46,26 @@ class ZigbeeShutter extends zigbeeDevice_1.ZigbeeDevice {
40
46
  if (value !== this._setLevel && services_1.Utils.nowMS() - this._setLevelTime < 60 * 10000) {
41
47
  value = this._setLevel;
42
48
  }
43
- if (value !== this._currentLevel && this._fenster) {
49
+ if (value !== this._currentLevel && this._window) {
44
50
  services_1.Utils.guardedNewThread(() => {
45
51
  var _a;
46
- (_a = this._fenster) === null || _a === void 0 ? void 0 : _a.rolloPositionChange(value);
52
+ (_a = this._window) === null || _a === void 0 ? void 0 : _a.rolloPositionChange(value);
47
53
  }, this);
48
54
  this.persist();
49
55
  }
50
56
  this._currentLevel = value;
51
57
  }
52
- get fenster() {
53
- return this._fenster;
58
+ get window() {
59
+ return this._window;
54
60
  }
55
- set fenster(value) {
56
- this._fenster = value;
61
+ set window(value) {
62
+ this._window = value;
57
63
  }
58
- get desiredFensterLevel() {
59
- if (this._fenster === undefined) {
64
+ get desiredWindowShutterLevel() {
65
+ if (this._window === undefined) {
60
66
  return -1;
61
67
  }
62
- return this._fenster.desiredPosition;
68
+ return this._window.desiredPosition;
63
69
  }
64
70
  persist() {
65
71
  var _a;
@@ -80,17 +86,17 @@ class ZigbeeShutter extends zigbeeDevice_1.ZigbeeDevice {
80
86
  this.log(models_1.LogLevel.Debug, `Skip Rollo command to Position ${pPosition} as this is the current one`, services_1.LogDebugType.SkipUnchangedRolloPosition);
81
87
  return;
82
88
  }
83
- if (this._fenster !== undefined) {
84
- if (this._fenster.griffeInPosition(models_2.FensterPosition.offen) > 0 && pPosition < 100) {
89
+ if (this._window !== undefined) {
90
+ if (this._window.griffeInPosition(models_2.WindowPosition.offen) > 0 && pPosition < 100) {
85
91
  if (!skipOpenWarning) {
86
- this.log(models_1.LogLevel.Alert, `Fahre Rollo nicht runter, weil das Fenster offen ist!`);
92
+ this.log(models_1.LogLevel.Alert, `Not closing the shutter, as the window is open!`);
87
93
  }
88
94
  return;
89
95
  }
90
- if (this._fenster.griffeInPosition(models_2.FensterPosition.kipp) > 0 && pPosition < 50) {
96
+ if (this._window.griffeInPosition(models_2.WindowPosition.kipp) > 0 && pPosition < 50) {
91
97
  pPosition = 50;
92
98
  if (!skipOpenWarning) {
93
- this.log(models_1.LogLevel.Alert, `Fahre Rollo nicht runter, weil das Fenster auf Kipp ist!`);
99
+ this.log(models_1.LogLevel.Alert, `Not closing the shutter, as the window is half open!`);
94
100
  }
95
101
  }
96
102
  }
@@ -99,7 +105,7 @@ class ZigbeeShutter extends zigbeeDevice_1.ZigbeeDevice {
99
105
  this.moveToPosition(pPosition);
100
106
  }
101
107
  toJSON() {
102
- return lodash_1.default.omit(super.toJSON(), ['_fenster']);
108
+ return lodash_1.default.omit(super.toJSON(), ['_window']);
103
109
  }
104
110
  moveToPosition(pPosition) {
105
111
  this.log(models_1.LogLevel.Error, `Implement own moveToPosition(${pPosition}) Function`);
@@ -35,7 +35,7 @@ class ZigbeeAquaraVibra extends BaseDevices_1.ZigbeeDevice {
35
35
  return this._vibrationBlockedByGriff;
36
36
  }
37
37
  set vibrationBlockedByGriff(pVal) {
38
- this.log(models_1.LogLevel.Debug, `${pVal ? 'Dea' : 'A'}ktiviere Vibrationsalarm für ${this.info.customName} in Bezug auf den Fenstergriff`);
38
+ this.log(models_1.LogLevel.Debug, `${pVal ? 'disa' : 'a'}rming vibration alarm for ${this.info.customName} due to handle`);
39
39
  if (pVal) {
40
40
  this.vibrationBlockedByGriffTimeStamp = new Date().getTime();
41
41
  }
@@ -126,7 +126,7 @@ class ZigbeeAquaraVibra extends BaseDevices_1.ZigbeeDevice {
126
126
  alarmCheck() {
127
127
  this.log(models_1.LogLevel.Debug, `Alarmcheck für ${this.info.customName} Alarmblock Wert: ${this._vibrationBlockedByGriff}`);
128
128
  if (this._vibrationBlockedByGriff) {
129
- this.log(models_1.LogLevel.Debug, `Fenster offen, ignoriere Vibrationsalarm bei ${this.info.customName}`);
129
+ this.log(models_1.LogLevel.Debug, `Window is open; ignoring vibration alarm.`);
130
130
  return;
131
131
  }
132
132
  if (this._vibrationBlockedByMotion) {
@@ -19,7 +19,6 @@ class ZigbeeIlluLampe extends zigbeeIlluActuator_1.ZigbeeIlluActuator {
19
19
  switch (idSplit[3]) {
20
20
  case 'state':
21
21
  this.log(models_1.LogLevel.Trace, `Lampen Update für ${this.info.customName} auf ${state.val}`);
22
- this.persist();
23
22
  break;
24
23
  }
25
24
  }
@@ -18,7 +18,6 @@ class ZigbeeIlluShutter extends BaseDevices_1.ZigbeeShutter {
18
18
  this._movementStartMs = -1;
19
19
  this._movementStartPos = -1;
20
20
  this._movementStateId = `${this.info.fullID}.position`;
21
- // this.presenceStateID = `${this.info.fullID}.1.${HmIpPraezenz.PRESENCE_DETECTION}`;
22
21
  }
23
22
  update(idSplit, state, initial = false) {
24
23
  switch (idSplit[3]) {
@@ -1,4 +1,4 @@
1
- import { Fenster, iShutter } from '../devices';
1
+ import { iShutter, Window } from '../devices';
2
2
  export declare class ShutterService {
3
3
  static anyRolloDown(rollo: iShutter[]): boolean;
4
4
  static getRolladenPosition(): string;
@@ -6,8 +6,8 @@ export declare class ShutterService {
6
6
  static down(shutter: iShutter, initial?: boolean): void;
7
7
  static middle(shutter: iShutter): void;
8
8
  static up(shutter: iShutter, initial?: boolean): void;
9
- static windowAllDown(f: Fenster, initial?: boolean): void;
10
- static windowAllMiddle(f: Fenster, initial?: boolean): void;
11
- static windowAllUp(f: Fenster, initial?: boolean): void;
12
- static windowAllToPosition(f: Fenster, position: number, initial?: boolean, skipOpenWarning?: boolean): void;
9
+ static windowAllDown(f: Window, initial?: boolean): void;
10
+ static windowAllMiddle(f: Window, initial?: boolean): void;
11
+ static windowAllUp(f: Window, initial?: boolean): void;
12
+ static windowAllToPosition(f: Window, position: number, initial?: boolean, skipOpenWarning?: boolean): void;
13
13
  }
@@ -19,15 +19,15 @@ class ShutterService {
19
19
  });
20
20
  const response = [`Dies sind die aktuellen Rollo Positionen:`];
21
21
  for (const r of rollos) {
22
- response.push(`${r.currentLevel}% Rollo: "${r.info.customName}" Gewünschte Position: ${r.desiredFensterLevel}`);
22
+ response.push(`${r.currentLevel}% Rollo: "${r.info.customName}" Gewünschte Position: ${r.desiredWindowShutterLevel}`);
23
23
  }
24
24
  response.push(`\nDie nächsten Zeiten zum Hochfahren:`);
25
25
  const down = [`\nDie nächsten Zeiten zum Runterfahren:`];
26
26
  for (const r of api_1.API.getRooms().values()) {
27
- if (!r.FensterGroup) {
27
+ if (!r.WindowGroup) {
28
28
  continue;
29
29
  }
30
- for (const f of r.FensterGroup.fenster) {
30
+ for (const f of r.WindowGroup.windows) {
31
31
  f.getShutter().forEach((shutter) => {
32
32
  var _a, _b, _c, _d;
33
33
  response.push(`Rollo: "${shutter.info.customName}"\t${f.noRolloOnSunrise ? 'Hochfahren inaktiv' : (_b = (_a = r.sonnenAufgangCallback) === null || _a === void 0 ? void 0 : _a.nextToDo) === null || _b === void 0 ? void 0 : _b.toLocaleTimeString()}`);
@@ -54,12 +54,12 @@ class TelegramCommands {
54
54
  telegram_service_1.TelegramService.sendMessage([m.chat.id], ShutterService_1.ShutterService.getRolladenPosition());
55
55
  return true;
56
56
  }, 'Gibt die Positionen der Rollos aus, warnt über offene Rollos und nennt die nächsten Fahrten'));
57
- telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('FensterCheck', /\/check_fenster/, async (m) => {
57
+ telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('WindowCheck', /\/check_windows/, async (m) => {
58
58
  if (m.from === undefined)
59
59
  return false;
60
60
  telegram_service_1.TelegramService.sendMessage([m.chat.id], devices_1.Griffe.getGriffPosition());
61
61
  return true;
62
- }, 'Gibt die Positionen der Fenstergriffe aus und warnt somit über offene Fenster'));
62
+ }, 'Returns the handle positions and warns about open windows.'));
63
63
  telegram_service_1.TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('BatteryCheck', /\/check_battery/, async (m) => {
64
64
  if (m.from === undefined)
65
65
  return Promise.resolve(false);
@@ -1,11 +1,12 @@
1
1
  import { ButtonPressType, iAcDevice, iActuator, iBaseDevice, iButtonSwitch, iHeater, iMotionSensor, IoBrokerBaseDevice, iShutter } from '../../devices';
2
- import { CountToday, CurrentIlluminationDataPoint, EnergyCalculation, RoomBase, ShutterCalibration, TemperaturDataPoint } from '../../../models';
2
+ import { CountToday, CurrentIlluminationDataPoint, DesiredShutterPosition, EnergyCalculation, RoomBase, ShutterCalibration, TemperaturDataPoint } from '../../../models';
3
3
  export interface iPersist {
4
4
  initialized: boolean;
5
5
  addTemperaturDataPoint(heater: iHeater): void;
6
6
  addRoom(room: RoomBase): void;
7
7
  addDevice(device: iBaseDevice): void;
8
8
  motionSensorTodayCount(device: iMotionSensor): Promise<CountToday>;
9
+ getLastDesiredPosition(device: iShutter): Promise<DesiredShutterPosition>;
9
10
  getShutterCalibration(device: IoBrokerBaseDevice): Promise<ShutterCalibration>;
10
11
  initialize(): Promise<void>;
11
12
  persistShutterCalibration(data: ShutterCalibration): void;
@@ -1,5 +1,5 @@
1
1
  import { iPersist } from './iPersist';
2
- import { CountToday, CurrentIlluminationDataPoint, EnergyCalculation, RoomBase, ShutterCalibration, TemperaturDataPoint } from '../../../models';
2
+ import { CountToday, CurrentIlluminationDataPoint, DesiredShutterPosition, EnergyCalculation, RoomBase, ShutterCalibration, TemperaturDataPoint } from '../../../models';
3
3
  import { ButtonPressType, iAcDevice, iActuator, iBaseDevice, iButtonSwitch, iHeater, iMotionSensor, IoBrokerBaseDevice, iShutter } from '../../devices';
4
4
  import { iPersistenceSettings } from '../../config';
5
5
  export declare class PostgreSqlPersist implements iPersist {
@@ -9,6 +9,7 @@ export declare class PostgreSqlPersist implements iPersist {
9
9
  addRoom(room: RoomBase): void;
10
10
  addDevice(device: iBaseDevice): void;
11
11
  addTemperaturDataPoint(heater: iHeater): void;
12
+ getLastDesiredPosition(device: iShutter): Promise<DesiredShutterPosition>;
12
13
  motionSensorTodayCount(device: iMotionSensor): Promise<CountToday>;
13
14
  getShutterCalibration(_device: IoBrokerBaseDevice): Promise<ShutterCalibration>;
14
15
  initialize(): Promise<void>;
@@ -52,6 +52,19 @@ values ('${new Date().toISOString()}',${heater.humidity},${heater.iTemperature},
52
52
  ;
53
53
  `);
54
54
  }
55
+ async getLastDesiredPosition(device) {
56
+ const dbResult = await this.query(`SELECT position
57
+ from hoffmation_schema."ShutterDeviceData"
58
+ WHERE "deviceID" = '${device.id}'
59
+ and date >= CURRENT_DATE AND date < CURRENT_DATE + INTERVAL '1 DAY'
60
+ ORDER BY date desc
61
+ Limit 1`);
62
+ if (dbResult !== null && dbResult.length > 0) {
63
+ return dbResult[0];
64
+ }
65
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Debug, `Es gibt noch keine persistierten Bewegungen für ${device.info.fullName}`);
66
+ return new models_1.DesiredShutterPosition(-1);
67
+ }
55
68
  async motionSensorTodayCount(device) {
56
69
  const dbResult = await this.query(`SELECT Count(*)
57
70
  from hoffmation_schema."MotionSensorDeviceData"
@@ -236,6 +249,7 @@ IF (SELECT to_regclass('hoffmation_schema."ShutterDeviceData"') IS NULL) Then
236
249
  on delete set null,
237
250
  "position" double precision,
238
251
  date timestamp not null,
252
+ "desiredPosition" double precision,
239
253
  constraint shutterdevicedata_pk
240
254
  primary key ("deviceID", date)
241
255
  );
@@ -294,9 +308,11 @@ values ('${device.id}', ${device.movementDetected}, '${new Date().toISOString()}
294
308
  `);
295
309
  }
296
310
  persistShutter(device) {
311
+ const currentLevel = device.currentLevel >= 0 ? device.currentLevel : null;
312
+ const desiredLevel = device.desiredWindowShutterLevel >= 0 ? device.desiredWindowShutterLevel : null;
297
313
  this.query(`
298
- insert into hoffmation_schema."ShutterDeviceData" ("deviceID", "position", "date")
299
- values ('${device.id}', ${device.currentLevel}, '${new Date().toISOString()}');
314
+ insert into hoffmation_schema."ShutterDeviceData" ("deviceID", "position", "date", "desiredPosition")
315
+ values ('${device.id}', ${currentLevel}, '${new Date().toISOString()}', ${desiredLevel});
300
316
  `);
301
317
  }
302
318
  persistCurrentIllumination(data) {
@@ -24,7 +24,7 @@ class RoomService {
24
24
  var _a;
25
25
  const rooms = floor > -1 ? this.getAllRoomsOfFloor(floor) : this.Rooms.entries();
26
26
  for (const [_name, room] of rooms) {
27
- (_a = room.FensterGroup) === null || _a === void 0 ? void 0 : _a.allRolloToLevel(position, true);
27
+ (_a = room.WindowGroup) === null || _a === void 0 ? void 0 : _a.allRolloToLevel(position, true);
28
28
  }
29
29
  }
30
30
  /**
@@ -181,7 +181,7 @@ class RoomService {
181
181
  static restoreRolloPosition() {
182
182
  var _a;
183
183
  for (const room of this.Rooms.values()) {
184
- (_a = room.FensterGroup) === null || _a === void 0 ? void 0 : _a.restoreRolloPosition();
184
+ (_a = room.WindowGroup) === null || _a === void 0 ? void 0 : _a.restoreRolloPosition();
185
185
  }
186
186
  }
187
187
  static restoreLight() {