hoffmation-base 3.0.0-beta.0 → 3.0.0-beta.10

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 (58) hide show
  1. package/README.md +34 -8
  2. package/lib/models/action/handleChangeAction.d.ts +12 -0
  3. package/lib/models/action/handleChangeAction.js +15 -0
  4. package/lib/models/action/index.d.ts +1 -0
  5. package/lib/models/action/index.js +3 -1
  6. package/lib/models/command/commandType.d.ts +1 -0
  7. package/lib/models/command/commandType.js +1 -0
  8. package/lib/models/deviceSettings/dachsSettings.d.ts +8 -0
  9. package/lib/models/deviceSettings/dachsSettings.js +12 -1
  10. package/lib/models/deviceSettings/heaterSettings.d.ts +4 -0
  11. package/lib/models/deviceSettings/heaterSettings.js +14 -8
  12. package/lib/server/devices/baseDeviceInterfaces/iHandleSensor.d.ts +6 -0
  13. package/lib/server/devices/baseDeviceInterfaces/iHeater.d.ts +12 -15
  14. package/lib/server/devices/baseDeviceInterfaces/index.d.ts +1 -0
  15. package/lib/server/devices/baseDeviceInterfaces/index.js +1 -0
  16. package/lib/server/devices/dachs/dachs.d.ts +3 -1
  17. package/lib/server/devices/dachs/dachs.js +19 -5
  18. package/lib/server/devices/dachs/lib/dachsHttpClient.js +4 -0
  19. package/lib/server/devices/device-cluster.js +6 -0
  20. package/lib/server/devices/deviceType.d.ts +1 -0
  21. package/lib/server/devices/deviceType.js +1 -0
  22. package/lib/server/devices/devices.js +3 -0
  23. package/lib/server/devices/groups/Window.d.ts +7 -1
  24. package/lib/server/devices/groups/Window.js +15 -1
  25. package/lib/server/devices/groups/heatGroup.js +22 -5
  26. package/lib/server/devices/groups/windowGroup.d.ts +11 -1
  27. package/lib/server/devices/groups/windowGroup.js +18 -0
  28. package/lib/server/devices/hmIPDevices/hmIpGriff.d.ts +3 -0
  29. package/lib/server/devices/hmIPDevices/hmIpGriff.js +4 -0
  30. package/lib/server/devices/hmIPDevices/hmIpHeizgruppe.d.ts +7 -1
  31. package/lib/server/devices/hmIPDevices/hmIpHeizgruppe.js +24 -0
  32. package/lib/server/devices/sharedFunctions/handleSensor.d.ts +3 -2
  33. package/lib/server/devices/sharedFunctions/handleSensor.js +8 -0
  34. package/lib/server/devices/sharedFunctions/temperatureSensor.d.ts +6 -0
  35. package/lib/server/devices/sharedFunctions/temperatureSensor.js +12 -2
  36. package/lib/server/devices/shelly/shellyTrv.d.ts +16 -5
  37. package/lib/server/devices/shelly/shellyTrv.js +40 -6
  38. package/lib/server/devices/zigbee/BaseDevices/zigbeeHeater.d.ts +15 -5
  39. package/lib/server/devices/zigbee/BaseDevices/zigbeeHeater.js +45 -14
  40. package/lib/server/devices/zigbee/BaseDevices/zigbeeWindowHandle.d.ts +3 -0
  41. package/lib/server/devices/zigbee/BaseDevices/zigbeeWindowHandle.js +4 -0
  42. package/lib/server/devices/zigbee/index.d.ts +1 -0
  43. package/lib/server/devices/zigbee/index.js +3 -0
  44. package/lib/server/devices/zigbee/zigbeeEuroHeater.d.ts +1 -1
  45. package/lib/server/devices/zigbee/zigbeeEuroHeater.js +5 -5
  46. package/lib/server/devices/zigbee/zigbeeSodaHandle.d.ts +4 -0
  47. package/lib/server/devices/zigbee/zigbeeSodaHandle.js +7 -2
  48. package/lib/server/devices/zigbee/zigbeeTuyaMotion.d.ts +7 -0
  49. package/lib/server/devices/zigbee/zigbeeTuyaMotion.js +18 -0
  50. package/lib/server/devices/zigbee/zigbeeTuyaValve.d.ts +2 -1
  51. package/lib/server/devices/zigbee/zigbeeTuyaValve.js +7 -4
  52. package/lib/server/services/Sonos/mp3-server.js +6 -0
  53. package/lib/server/services/Telegram/telegram-service.js +9 -0
  54. package/lib/server/services/dbo/postgreSqlPersist.js +90 -66
  55. package/lib/server/services/https-service.js +3 -0
  56. package/lib/server/services/weather/weather-service.js +1 -0
  57. package/lib/tsconfig.tsbuildinfo +1 -1
  58. package/package.json +1 -1
@@ -14,6 +14,7 @@ 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
+ exports.ZigbeeTuyaMotion = void 0;
17
18
  __exportStar(require("./BaseDevices/index"), exports);
18
19
  __exportStar(require("./zigbeeAqaraMagnetContact"), exports);
19
20
  __exportStar(require("./zigbeeAqaraOpple3Switch"), exports);
@@ -41,3 +42,5 @@ __exportStar(require("./zigbeeTuyaValve"), exports);
41
42
  __exportStar(require("./zigbeeUbisysActuator"), exports);
42
43
  __exportStar(require("./zigbeeUbisysLampe"), exports);
43
44
  __exportStar(require("./zigbeeUbisysShutter"), exports);
45
+ var zigbeeTuyaMotion_1 = require("./zigbeeTuyaMotion");
46
+ Object.defineProperty(exports, "ZigbeeTuyaMotion", { enumerable: true, get: function () { return zigbeeTuyaMotion_1.ZigbeeTuyaMotion; } });
@@ -22,7 +22,7 @@ export declare class ZigbeeEuroHeater extends ZigbeeHeater implements iDisposabl
22
22
  get desiredTemperature(): number;
23
23
  /** @inheritDoc */
24
24
  set desiredTemperature(val: number);
25
- protected set roomTemperatur(value: number);
25
+ protected set roomTemperature(value: number);
26
26
  private get tempDiff();
27
27
  /** @inheritDoc */
28
28
  update(idSplit: string[], state: ioBroker.State, initial?: boolean): void;
@@ -39,7 +39,7 @@ class ZigbeeEuroHeater extends BaseDevices_1.ZigbeeHeater {
39
39
  }
40
40
  /** @inheritDoc */
41
41
  get roomTemperature() {
42
- return this._roomTemperature;
42
+ return super.roomTemperature;
43
43
  }
44
44
  /** @inheritDoc */
45
45
  get desiredTemperature() {
@@ -50,8 +50,8 @@ class ZigbeeEuroHeater extends BaseDevices_1.ZigbeeHeater {
50
50
  this._desiredTemperatur = val;
51
51
  this.recalcLevel();
52
52
  }
53
- set roomTemperatur(value) {
54
- this._roomTemperature = value;
53
+ set roomTemperature(value) {
54
+ super.roomTemperature = value;
55
55
  if (this.settings.useOwnTemperatur) {
56
56
  return;
57
57
  }
@@ -134,7 +134,7 @@ class ZigbeeEuroHeater extends BaseDevices_1.ZigbeeHeater {
134
134
  return;
135
135
  }
136
136
  this._lastRecalc = services_1.Utils.nowMS();
137
- const desiredDiff = services_1.Utils.round(this.desiredTemperature - this._roomTemperature, 1);
137
+ const desiredDiff = services_1.Utils.round(this.desiredTemperature - this.roomTemperature, 1);
138
138
  const currentDiff = this.tempDiff;
139
139
  const missingDiff = services_1.Utils.round(desiredDiff - currentDiff, 1);
140
140
  if (Math.abs(missingDiff) < 0.15) {
@@ -150,7 +150,7 @@ class ZigbeeEuroHeater extends BaseDevices_1.ZigbeeHeater {
150
150
  }
151
151
  const newLocalDiff = Math.sign(desiredDiff) * -9;
152
152
  this.setLocalDiff(newLocalDiff);
153
- this.setTargetTemperatur(this._temperatur + this._roomTemperature + newLocalDiff + this.desiredTemperature);
153
+ this.setTargetTemperatur(this._temperatur + this.roomTemperature + newLocalDiff + this.desiredTemperature);
154
154
  }
155
155
  setLocalDiff(newLocalDiff) {
156
156
  this.log(models_1.LogLevel.Debug, `Setting new Local Calibration Diff (${newLocalDiff}) for Euro Valve`);
@@ -3,6 +3,10 @@ import { iHumiditySensor, iTemperatureSensor } from '../baseDeviceInterfaces';
3
3
  import { IoBrokerDeviceInfo } from '../IoBrokerDeviceInfo';
4
4
  import { HumiditySensor, TemperatureSensor } from '../sharedFunctions';
5
5
  import { HumiditySensorChangeAction, TemperatureSensorChangeAction } from '../../../models';
6
+ /**
7
+ * A smart window handle with integrated temperature and humidity sensor.
8
+ * As the temperature sensor is so close to the window it might be off, which is why the correction coefficient is set to 0.21°C per outdoor diff to 21°C
9
+ */
6
10
  export declare class ZigbeeSodaHandle extends ZigbeeWindowHandle implements iTemperatureSensor, iHumiditySensor {
7
11
  /** @inheritDoc */
8
12
  temperatureSensor: TemperatureSensor;
@@ -6,6 +6,10 @@ const deviceType_1 = require("../deviceType");
6
6
  const DeviceCapability_1 = require("../DeviceCapability");
7
7
  const sharedFunctions_1 = require("../sharedFunctions");
8
8
  const models_1 = require("../../../models");
9
+ /**
10
+ * A smart window handle with integrated temperature and humidity sensor.
11
+ * As the temperature sensor is so close to the window it might be off, which is why the correction coefficient is set to 0.21°C per outdoor diff to 21°C
12
+ */
9
13
  class ZigbeeSodaHandle extends BaseDevices_1.ZigbeeWindowHandle {
10
14
  constructor(pInfo) {
11
15
  super(pInfo, deviceType_1.DeviceType.ZigbeeSodaHandle);
@@ -15,6 +19,7 @@ class ZigbeeSodaHandle extends BaseDevices_1.ZigbeeWindowHandle {
15
19
  this.humiditySensor = new sharedFunctions_1.HumiditySensor(this);
16
20
  this.deviceCapabilities.push(DeviceCapability_1.DeviceCapability.humiditySensor);
17
21
  this.deviceCapabilities.push(DeviceCapability_1.DeviceCapability.temperatureSensor);
22
+ this.temperatureSensor.outdoorTemperatureCorrectionCoefficient = 0.21;
18
23
  }
19
24
  /** @inheritDoc */
20
25
  get roomTemperature() {
@@ -81,7 +86,7 @@ class ZigbeeSodaHandle extends BaseDevices_1.ZigbeeWindowHandle {
81
86
  if (!this.window) {
82
87
  return;
83
88
  }
84
- const command = new models_1.WindowSetDesiredPositionCommand(models_1.CommandSource.Manual, 0, 'Button on handle was pressed');
89
+ const command = new models_1.WindowSetDesiredPositionCommand(models_1.CommandSource.Manual, 100, 'Button on handle was pressed');
85
90
  this.window.setDesiredPosition(command);
86
91
  }
87
92
  onButtonRightPressed() {
@@ -89,7 +94,7 @@ class ZigbeeSodaHandle extends BaseDevices_1.ZigbeeWindowHandle {
89
94
  if (!this.window) {
90
95
  return;
91
96
  }
92
- const command = new models_1.WindowSetDesiredPositionCommand(models_1.CommandSource.Manual, 100, 'Button on handle was pressed');
97
+ const command = new models_1.WindowSetDesiredPositionCommand(models_1.CommandSource.Manual, 0, 'Button on handle was pressed');
93
98
  this.window.setDesiredPosition(command);
94
99
  }
95
100
  }
@@ -0,0 +1,7 @@
1
+ import { ZigbeeMotionSensor } from './BaseDevices';
2
+ import { IoBrokerDeviceInfo } from '../IoBrokerDeviceInfo';
3
+ export declare class ZigbeeTuyaMotion extends ZigbeeMotionSensor {
4
+ constructor(pInfo: IoBrokerDeviceInfo);
5
+ /** @inheritDoc */
6
+ update(idSplit: string[], state: ioBroker.State, initial?: boolean): void;
7
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ZigbeeTuyaMotion = void 0;
4
+ const BaseDevices_1 = require("./BaseDevices");
5
+ const deviceType_1 = require("../deviceType");
6
+ const models_1 = require("../../../models");
7
+ class ZigbeeTuyaMotion extends BaseDevices_1.ZigbeeMotionSensor {
8
+ constructor(pInfo) {
9
+ super(pInfo, deviceType_1.DeviceType.ZigbeeTuyaMotion);
10
+ this._needsMovementResetFallback = false;
11
+ }
12
+ /** @inheritDoc */
13
+ update(idSplit, state, initial = false) {
14
+ this.log(models_1.LogLevel.DeepTrace, `Motion update: ID: ${idSplit.join('.')} JSON: ${JSON.stringify(state)}`);
15
+ super.update(idSplit, state, initial, true);
16
+ }
17
+ }
18
+ exports.ZigbeeTuyaMotion = ZigbeeTuyaMotion;
@@ -16,8 +16,9 @@ export declare class ZigbeeTuyaValve extends ZigbeeHeater {
16
16
  set seasonTurnOff(value: boolean);
17
17
  /** @inheritDoc */
18
18
  set desiredTemperature(val: number);
19
+ get roomTemperature(): number;
19
20
  /** @inheritDoc */
20
- protected set roomTemperatur(value: number);
21
+ protected set roomTemperature(value: number);
21
22
  private get tempDiff();
22
23
  /** @inheritDoc */
23
24
  update(idSplit: string[], state: ioBroker.State, initial?: boolean): void;
@@ -31,9 +31,12 @@ class ZigbeeTuyaValve extends BaseDevices_1.ZigbeeHeater {
31
31
  this._desiredTemperatur = val;
32
32
  this.checkTempDiff();
33
33
  }
34
+ get roomTemperature() {
35
+ return super.roomTemperature;
36
+ }
34
37
  /** @inheritDoc */
35
- set roomTemperatur(value) {
36
- this._roomTemperature = value;
38
+ set roomTemperature(value) {
39
+ super.roomTemperature = value;
37
40
  if (this.settings.useOwnTemperatur) {
38
41
  return;
39
42
  }
@@ -81,7 +84,7 @@ class ZigbeeTuyaValve extends BaseDevices_1.ZigbeeHeater {
81
84
  if (this.settings.useOwnTemperatur) {
82
85
  return;
83
86
  }
84
- const desiredDiff = services_1.Utils.round(this.desiredTemperature - this._roomTemperature, 1);
87
+ const desiredDiff = services_1.Utils.round(this.desiredTemperature - this.roomTemperature, 1);
85
88
  const currentDiff = this.tempDiff;
86
89
  const missingDiff = services_1.Utils.round(desiredDiff - currentDiff, 1);
87
90
  if (Math.abs(missingDiff) < 0.15) {
@@ -97,7 +100,7 @@ class ZigbeeTuyaValve extends BaseDevices_1.ZigbeeHeater {
97
100
  }
98
101
  const newLocalDiff = Math.sign(desiredDiff) * -9;
99
102
  this.setLocalDiff(newLocalDiff);
100
- this.setTargetTemperatur(this._localTempVal + this._roomTemperature + newLocalDiff + this.desiredTemperature);
103
+ this.setTargetTemperatur(this._localTempVal + this.roomTemperature + newLocalDiff + this.desiredTemperature);
101
104
  }
102
105
  setLocalDiff(newLocalDiff) {
103
106
  this.log(models_1.LogLevel.Debug, `Setting new Local Calibration Diff (${newLocalDiff}) for Tuya Valve`);
@@ -44,6 +44,12 @@ class MP3Server {
44
44
  response.end('ungültige Anfrage', 'utf-8');
45
45
  return;
46
46
  }
47
+ req.on('error', (e) => {
48
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Warn, `MP3-Server HTTP Error: ${e}`);
49
+ });
50
+ response.on('error', (e) => {
51
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Warn, `MP3-Server HTTP Error: ${e}`);
52
+ });
47
53
  const q = url.parse(req.url, true).query;
48
54
  const fName = q.fname;
49
55
  if (!fName || fName.indexOf('.') >= 0) {
@@ -45,6 +45,15 @@ class TelegramService {
45
45
  log_service_1.ServerLogService.writeLog(models_1.LogLevel.Debug, `Telegram Polling Error: ${e.message}`);
46
46
  log_service_1.ServerLogService.writeLog(models_1.LogLevel.Trace, `Telegram Polling Error stack: ${e.stack}`);
47
47
  });
48
+ this.bot.on('webhook_error', (e) => {
49
+ /*
50
+ if (!this.reinitiliazeWithTimeout()) {
51
+ return;
52
+ }
53
+ */
54
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Debug, `Telegram Webhook Error: ${e.message}`);
55
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Trace, `Telegram Webhook Error stack: ${e.stack}`);
56
+ });
48
57
  TelegramService.addMessageCallback(new telegramMessageCalback_1.TelegramMessageCallback('helpCommand', /\/help/, async (m) => {
49
58
  if (m.from === undefined)
50
59
  return true;
@@ -5,7 +5,6 @@ const models_1 = require("../../../models");
5
5
  const devices_1 = require("../../devices");
6
6
  const pg_1 = require("pg");
7
7
  const log_service_1 = require("../log-service");
8
- const DeviceCapability_1 = require("../../devices/DeviceCapability");
9
8
  const utils_1 = require("../utils");
10
9
  class PostgreSqlPersist {
11
10
  constructor(conf) {
@@ -17,36 +16,39 @@ class PostgreSqlPersist {
17
16
  /** @inheritDoc */
18
17
  addRoom(room) {
19
18
  this.query(`
20
- insert into hoffmation_schema."BasicRooms" (name, etage)
21
- values ('${room.roomName}',${room.etage})
22
- ON CONFLICT (name)
23
- DO UPDATE SET
24
- etage = ${room.etage}
25
- ;
19
+ insert into hoffmation_schema."BasicRooms" (name, etage)
20
+ values ('${room.roomName}', ${room.etage}) ON CONFLICT (name)
21
+ DO
22
+ UPDATE SET
23
+ etage = ${room.etage}
24
+ ;
26
25
  `);
27
26
  }
28
27
  /** @inheritDoc */
29
28
  addDevice(device) {
30
29
  this.query(`
31
- insert into hoffmation_schema."DeviceInfo" ("deviceid", "roomname", "alldeviceskey", "customname", "devtype")
32
- values ('${device.id}','${device.info.room}','${device.info.allDevicesKey}','${device.info.customName}', ${device.deviceType})
33
- ON CONFLICT ("deviceid")
34
- DO UPDATE SET
35
- "roomname" = '${device.info.room}',
36
- "alldeviceskey" = '${device.info.allDevicesKey}',
37
- "customname" = '${device.info.customName}',
38
- "devtype" = ${device.deviceType}
39
- ;
30
+ insert into hoffmation_schema."DeviceInfo" ("deviceid", "roomname", "alldeviceskey", "customname", "devtype")
31
+ values ('${device.id}', '${device.info.room}', '${device.info.allDevicesKey}', '${device.info.customName}',
32
+ ${device.deviceType}) ON CONFLICT ("deviceid")
33
+ DO
34
+ UPDATE SET
35
+ "roomname" = '${device.info.room}',
36
+ "alldeviceskey" = '${device.info.allDevicesKey}',
37
+ "customname" = '${device.info.customName}',
38
+ "devtype" = ${device.deviceType}
39
+ ;
40
40
  `);
41
41
  }
42
42
  /** @inheritDoc */
43
43
  async getLastDesiredPosition(device) {
44
44
  const dbResult = await this.query(`SELECT position
45
- from hoffmation_schema."ShutterDeviceData"
46
- WHERE "deviceID" = '${device.id}'
47
- and date >= CURRENT_DATE AND date < CURRENT_DATE + INTERVAL '1 DAY'
48
- ORDER BY date desc
49
- Limit 1`);
45
+ from hoffmation_schema."ShutterDeviceData"
46
+ WHERE "deviceID" = '${device.id}'
47
+ and date >= CURRENT_DATE
48
+ AND date
49
+ < CURRENT_DATE + INTERVAL '1 DAY'
50
+ ORDER BY date desc
51
+ Limit 1`);
50
52
  if (dbResult !== null && dbResult.length > 0) {
51
53
  return dbResult[0];
52
54
  }
@@ -55,9 +57,13 @@ Limit 1`);
55
57
  }
56
58
  /** @inheritDoc */
57
59
  async motionSensorTodayCount(device) {
58
- const dbResult = await this.query(`SELECT Count(*)
59
- from hoffmation_schema."MotionSensorDeviceData"
60
- WHERE "deviceID" = '${device.id}' and "movementDetected" and date >= CURRENT_DATE AND date < CURRENT_DATE + INTERVAL '1 DAY'`);
60
+ const dbResult = await this.query(`SELECT Count(*)
61
+ from hoffmation_schema."MotionSensorDeviceData"
62
+ WHERE "deviceID" = '${device.id}'
63
+ and "movementDetected"
64
+ and date >= CURRENT_DATE
65
+ AND date
66
+ < CURRENT_DATE + INTERVAL '1 DAY'`);
61
67
  if (dbResult !== null && dbResult.length > 0) {
62
68
  const result = dbResult[0];
63
69
  result.count = Number(result.count);
@@ -318,7 +324,7 @@ BEGIN
318
324
  create table if not exists hoffmation_schema."Settings"
319
325
  (
320
326
  "id" varchar(60) not null,
321
- "settings" varchar not null,
327
+ "settings" jsonb not null,
322
328
  "customname" varchar(100) not null,
323
329
  date timestamp not null,
324
330
  constraint settings_pk
@@ -335,6 +341,15 @@ BEGIN
335
341
  add "batteryStoredKwH" double precision;
336
342
  END IF;
337
343
 
344
+ IF (SELECT COUNT(column_name) = 0
345
+ FROM information_schema.columns
346
+ WHERE table_name = 'HeaterDeviceData'
347
+ and column_name = 'windowOpen') Then
348
+ alter table hoffmation_schema."HeaterDeviceData"
349
+ add "windowOpen" boolean;
350
+ END IF;
351
+
352
+
338
353
  IF (SELECT COUNT(column_name) = 0
339
354
  FROM information_schema.columns
340
355
  WHERE table_name = 'EnergyCalculation'
@@ -342,6 +357,12 @@ BEGIN
342
357
  alter table hoffmation_schema."EnergyCalculation"
343
358
  add "batteryLevel" double precision;
344
359
  END IF;
360
+ IF (SELECT pg_typeof(settings) = to_regtype('varchar')
361
+ FROM hoffmation_schema."Settings"
362
+ LIMIT 1) THEN
363
+ alter table hoffmation_schema."Settings"
364
+ alter column settings type jsonb using settings::jsonb;
365
+ END IF;
345
366
  END
346
367
  $$;`);
347
368
  this.initialized = true;
@@ -350,19 +371,19 @@ $$;`);
350
371
  /** @inheritDoc */
351
372
  persistAC(device) {
352
373
  this.query(`
353
- insert into hoffmation_schema."AcDeviceData" ("deviceID", "on", "date", "roomTemperature")
354
- values ('${device.id}', ${device.on}, '${new Date().toISOString()}', ${device.temperature});
374
+ insert into hoffmation_schema."AcDeviceData" ("deviceID", "on", "date", "roomTemperature")
375
+ values ('${device.id}', ${device.on}, '${new Date().toISOString()}', ${device.temperature});
355
376
  `);
356
377
  }
357
378
  /** @inheritDoc */
358
379
  persistActuator(device) {
359
380
  let percentage = undefined;
360
- if (device.deviceCapabilities.includes(DeviceCapability_1.DeviceCapability.dimmablelamp)) {
381
+ if (device.deviceCapabilities.includes(devices_1.DeviceCapability.dimmablelamp)) {
361
382
  percentage = device.brightness;
362
383
  }
363
384
  this.query(`
364
- insert into hoffmation_schema."ActuatorDeviceData" ("deviceID", "on", "date", "percentage")
365
- values ('${device.id}', ${device.actuatorOn}, '${new Date().toISOString()}', ${percentage !== null && percentage !== void 0 ? percentage : 'null'});
385
+ insert into hoffmation_schema."ActuatorDeviceData" ("deviceID", "on", "date", "percentage")
386
+ values ('${device.id}', ${device.actuatorOn}, '${new Date().toISOString()}', ${percentage !== null && percentage !== void 0 ? percentage : 'null'});
366
387
  `);
367
388
  }
368
389
  /** @inheritDoc */
@@ -376,30 +397,31 @@ values ('${device.id}', ${device.actuatorOn}, '${new Date().toISOString()}', ${p
376
397
  desiredTemperature = null;
377
398
  }
378
399
  void this.query(`
379
- insert into hoffmation_schema."HeaterDeviceData" ("deviceID", "level", "date", "roomTemperature", "desiredTemperature", "seasonTurnOff")
380
- values ('${device.id}', ${device.iLevel}, '${new Date().toISOString()}', ${roomTemp !== null && roomTemp !== void 0 ? roomTemp : 'null'}, ${desiredTemperature !== null && desiredTemperature !== void 0 ? desiredTemperature : 'null'}, ${device.seasonTurnOff});
400
+ insert into hoffmation_schema."HeaterDeviceData"
401
+ ("deviceID", "level", "date", "roomTemperature", "desiredTemperature", "seasonTurnOff", "windowOpen")
402
+ values ('${device.id}', ${device.iLevel}, '${new Date().toISOString()}', ${roomTemp !== null && roomTemp !== void 0 ? roomTemp : 'null'}, ${desiredTemperature !== null && desiredTemperature !== void 0 ? desiredTemperature : 'null'}, ${device.seasonTurnOff}, ${device.windowOpen});
381
403
  `);
382
404
  }
383
405
  /** @inheritDoc */
384
406
  persistHandleSensor(device) {
385
407
  const currentPos = device.position;
386
408
  this.query(`
387
- insert into hoffmation_schema."HandleDeviceData" ("deviceID", "position", "date")
388
- values ('${device.id}', ${currentPos}, '${new Date().toISOString()}');
409
+ insert into hoffmation_schema."HandleDeviceData" ("deviceID", "position", "date")
410
+ values ('${device.id}', ${currentPos}, '${new Date().toISOString()}');
389
411
  `);
390
412
  }
391
413
  /** @inheritDoc */
392
414
  persistSwitchInput(device, pressType, buttonName) {
393
415
  this.query(`
394
- insert into hoffmation_schema."ButtonSwitchPresses" ("deviceID", "pressType", "buttonName", "date")
395
- values ('${device.id}', ${pressType}, '${buttonName}', '${new Date().toISOString()}');
416
+ insert into hoffmation_schema."ButtonSwitchPresses" ("deviceID", "pressType", "buttonName", "date")
417
+ values ('${device.id}', ${pressType}, '${buttonName}', '${new Date().toISOString()}');
396
418
  `);
397
419
  }
398
420
  /** @inheritDoc */
399
421
  persistMotionSensor(device) {
400
422
  this.query(`
401
- insert into hoffmation_schema."MotionSensorDeviceData" ("deviceID", "movementDetected", "date")
402
- values ('${device.id}', ${device.movementDetected}, '${new Date().toISOString()}');
423
+ insert into hoffmation_schema."MotionSensorDeviceData" ("deviceID", "movementDetected", "date")
424
+ values ('${device.id}', ${device.movementDetected}, '${new Date().toISOString()}');
403
425
  `);
404
426
  }
405
427
  /** @inheritDoc */
@@ -407,8 +429,8 @@ values ('${device.id}', ${device.movementDetected}, '${new Date().toISOString()}
407
429
  const currentLevel = device.currentLevel >= 0 ? device.currentLevel : null;
408
430
  const desiredLevel = device.desiredWindowShutterLevel >= 0 ? device.desiredWindowShutterLevel : null;
409
431
  this.query(`
410
- insert into hoffmation_schema."ShutterDeviceData" ("deviceID", "position", "date", "desiredPosition")
411
- values ('${device.id}', ${currentLevel}, '${new Date().toISOString()}', ${desiredLevel});
432
+ insert into hoffmation_schema."ShutterDeviceData" ("deviceID", "position", "date", "desiredPosition")
433
+ values ('${device.id}', ${currentLevel}, '${new Date().toISOString()}', ${desiredLevel});
412
434
  `);
413
435
  }
414
436
  /** @inheritDoc */
@@ -418,37 +440,38 @@ values ('${device.id}', ${currentLevel}, '${new Date().toISOString()}', ${desire
418
440
  roomTemp = null;
419
441
  }
420
442
  this.query(`
421
- insert into hoffmation_schema."TemperatureSensorDeviceData" ("deviceID", "temperature", "date", "roomTemperature")
422
- values ('${device.id}', ${device.iTemperature}, '${new Date().toISOString()}', ${roomTemp !== null && roomTemp !== void 0 ? roomTemp : 'null'});
443
+ insert into hoffmation_schema."TemperatureSensorDeviceData" ("deviceID", "temperature", "date", "roomTemperature")
444
+ values ('${device.id}', ${device.iTemperature}, '${new Date().toISOString()}', ${roomTemp !== null && roomTemp !== void 0 ? roomTemp : 'null'});
423
445
  `);
424
446
  }
425
447
  /** @inheritDoc */
426
448
  persistHumiditySensor(device) {
427
449
  this.query(`
428
- insert into hoffmation_schema."HumiditySensorDeviceData" ("deviceID", "humidity", "date")
429
- values ('${device.id}', ${device.humidity}, '${new Date().toISOString()}');
450
+ insert into hoffmation_schema."HumiditySensorDeviceData" ("deviceID", "humidity", "date")
451
+ values ('${device.id}', ${device.humidity}, '${new Date().toISOString()}');
430
452
  `);
431
453
  }
432
454
  /** @inheritDoc */
433
455
  persistBatteryDevice(device) {
434
456
  this.query(`
435
- insert into hoffmation_schema."BatteryDeviceData" ("deviceID", "battery", "date")
436
- values ('${device.id}', ${utils_1.Utils.round(device.batteryLevel, 1)}, '${new Date().toISOString()}');
457
+ insert into hoffmation_schema."BatteryDeviceData" ("deviceID", "battery", "date")
458
+ values ('${device.id}', ${utils_1.Utils.round(device.batteryLevel, 1)}, '${new Date().toISOString()}');
437
459
  `);
438
460
  }
439
461
  /** @inheritDoc */
440
462
  persistZigbeeDevice(device) {
441
463
  const dateValue = device.lastUpdate.getTime() > 0 ? `'${device.lastUpdate.toISOString()}'` : 'null';
442
464
  this.query(`
443
- insert into hoffmation_schema."ZigbeeDeviceData" ("deviceID", "date", "available", "linkQuality", "lastUpdate")
444
- values ('${device.id}', '${new Date().toISOString()}', ${device.available}, ${device.linkQuality}, ${dateValue});
465
+ insert into hoffmation_schema."ZigbeeDeviceData" ("deviceID", "date", "available", "linkQuality", "lastUpdate")
466
+ values ('${device.id}', '${new Date().toISOString()}', ${device.available}, ${device.linkQuality},
467
+ ${dateValue});
445
468
  `);
446
469
  }
447
470
  /** @inheritDoc */
448
471
  persistIlluminationSensor(device) {
449
472
  this.query(`
450
- insert into hoffmation_schema."IlluminationSensorDeviceData" ("deviceID", "illumination", "date")
451
- values ('${device.id}', ${device.currentIllumination}, '${new Date().toISOString()}');`);
473
+ insert into hoffmation_schema."IlluminationSensorDeviceData" ("deviceID", "illumination", "date")
474
+ values ('${device.id}', ${device.currentIllumination}, '${new Date().toISOString()}');`);
452
475
  }
453
476
  /** @inheritDoc */
454
477
  persistShutterCalibration(_data) {
@@ -457,31 +480,32 @@ values ('${device.id}', ${device.currentIllumination}, '${new Date().toISOString
457
480
  /** @inheritDoc */
458
481
  persistEnergyManager(calc) {
459
482
  this.query(`
460
- insert into hoffmation_schema."EnergyCalculation" ("startDate", "endDate", "selfConsumedKwH", "injectedKwH",
461
- "drawnKwH", "batteryStoredKwH", "batteryLevel")
462
- values ('${new Date(calc.startMs).toISOString()}','${new Date(calc.endMs).toISOString()}',
463
- ${calc.selfConsumedKwH}, ${calc.injectedKwH}, ${calc.drawnKwH}, ${calc.batteryStoredKwH}, ${calc.batteryLevel});
483
+ insert into hoffmation_schema."EnergyCalculation" ("startDate", "endDate", "selfConsumedKwH", "injectedKwH",
484
+ "drawnKwH", "batteryStoredKwH", "batteryLevel")
485
+ values ('${new Date(calc.startMs).toISOString()}', '${new Date(calc.endMs).toISOString()}',
486
+ ${calc.selfConsumedKwH}, ${calc.injectedKwH}, ${calc.drawnKwH}, ${calc.batteryStoredKwH},
487
+ ${calc.batteryLevel});
464
488
  `);
465
489
  }
466
490
  /** @inheritDoc */
467
491
  persistSettings(id, settings, customName) {
468
492
  this.query(`
469
- insert into hoffmation_schema."Settings" (id, settings, customname, date)
470
- values ('${id}','${settings}','${customName}', '${new Date().toISOString()}')
471
- ON CONFLICT (id, date)
472
- DO UPDATE SET
473
- settings = '${settings}',
474
- customname = '${customName}'
475
- ;
493
+ insert into hoffmation_schema."Settings" (id, settings, customname, date)
494
+ values ('${id}', '${settings}', '${customName}', '${new Date().toISOString()}') ON CONFLICT (id, date)
495
+ DO
496
+ UPDATE SET
497
+ settings = '${settings}',
498
+ customname = '${customName}'
499
+ ;
476
500
  `);
477
501
  }
478
502
  /** @inheritDoc */
479
503
  async loadSettings(id) {
480
- const dbResult = await this.query(`SELECT settings, id, date
481
- from hoffmation_schema."Settings"
482
- WHERE "id" = '${id}'
483
- ORDER BY "date" DESC
484
- LIMIT 1`);
504
+ const dbResult = await this.query(`SELECT settings::text, id, date
505
+ from hoffmation_schema."Settings"
506
+ WHERE "id" = '${id}'
507
+ ORDER BY "date" DESC
508
+ LIMIT 1`);
485
509
  if (dbResult !== null && dbResult.length > 0) {
486
510
  return dbResult[0].settings;
487
511
  }
@@ -44,6 +44,9 @@ class HTTPSService {
44
44
  var _a;
45
45
  responseCallback(responseData.join(''), (_a = res.statusCode) !== null && _a !== void 0 ? _a : 0);
46
46
  });
47
+ res.on('error', (e) => {
48
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Error, `HTTPS Error: ${e}`);
49
+ });
47
50
  });
48
51
  req.on('error', (e) => {
49
52
  log_service_1.ServerLogService.writeLog(models_1.LogLevel.DeepTrace, `HTTPS Error: ${e}`);
@@ -219,6 +219,7 @@ class WeatherService {
219
219
  }
220
220
  const host = 'api.openweathermap.org';
221
221
  const path = `/data/3.0/onecall?lat=${WeatherService.latitude}&lon=${WeatherService.longitude}&appid=${WeatherService.appID}&units=metric&lang=de`;
222
+ log_service_1.ServerLogService.writeLog(models_1.LogLevel.Debug, 'Send WeatherAPi Request for data update.');
222
223
  https_service_1.HTTPSService.request(new HTTPSOptions_1.HTTPSOptions(host, path, {}, 'GET', 443), '', 5, (response) => {
223
224
  log_service_1.ServerLogService.writeLog(models_1.LogLevel.Debug, 'WeatherAPi Response erhalten');
224
225
  log_service_1.ServerLogService.writeLog(models_1.LogLevel.DeepTrace, `WeatherAPi Response: ${response}`);