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.
- package/README.md +34 -8
- package/lib/models/action/handleChangeAction.d.ts +12 -0
- package/lib/models/action/handleChangeAction.js +15 -0
- package/lib/models/action/index.d.ts +1 -0
- package/lib/models/action/index.js +3 -1
- package/lib/models/command/commandType.d.ts +1 -0
- package/lib/models/command/commandType.js +1 -0
- package/lib/models/deviceSettings/dachsSettings.d.ts +8 -0
- package/lib/models/deviceSettings/dachsSettings.js +12 -1
- package/lib/models/deviceSettings/heaterSettings.d.ts +4 -0
- package/lib/models/deviceSettings/heaterSettings.js +14 -8
- package/lib/server/devices/baseDeviceInterfaces/iHandleSensor.d.ts +6 -0
- package/lib/server/devices/baseDeviceInterfaces/iHeater.d.ts +12 -15
- package/lib/server/devices/baseDeviceInterfaces/index.d.ts +1 -0
- package/lib/server/devices/baseDeviceInterfaces/index.js +1 -0
- package/lib/server/devices/dachs/dachs.d.ts +3 -1
- package/lib/server/devices/dachs/dachs.js +19 -5
- package/lib/server/devices/dachs/lib/dachsHttpClient.js +4 -0
- package/lib/server/devices/device-cluster.js +6 -0
- package/lib/server/devices/deviceType.d.ts +1 -0
- package/lib/server/devices/deviceType.js +1 -0
- package/lib/server/devices/devices.js +3 -0
- package/lib/server/devices/groups/Window.d.ts +7 -1
- package/lib/server/devices/groups/Window.js +15 -1
- package/lib/server/devices/groups/heatGroup.js +22 -5
- package/lib/server/devices/groups/windowGroup.d.ts +11 -1
- package/lib/server/devices/groups/windowGroup.js +18 -0
- package/lib/server/devices/hmIPDevices/hmIpGriff.d.ts +3 -0
- package/lib/server/devices/hmIPDevices/hmIpGriff.js +4 -0
- package/lib/server/devices/hmIPDevices/hmIpHeizgruppe.d.ts +7 -1
- package/lib/server/devices/hmIPDevices/hmIpHeizgruppe.js +24 -0
- package/lib/server/devices/sharedFunctions/handleSensor.d.ts +3 -2
- package/lib/server/devices/sharedFunctions/handleSensor.js +8 -0
- package/lib/server/devices/sharedFunctions/temperatureSensor.d.ts +6 -0
- package/lib/server/devices/sharedFunctions/temperatureSensor.js +12 -2
- package/lib/server/devices/shelly/shellyTrv.d.ts +16 -5
- package/lib/server/devices/shelly/shellyTrv.js +40 -6
- package/lib/server/devices/zigbee/BaseDevices/zigbeeHeater.d.ts +15 -5
- package/lib/server/devices/zigbee/BaseDevices/zigbeeHeater.js +45 -14
- package/lib/server/devices/zigbee/BaseDevices/zigbeeWindowHandle.d.ts +3 -0
- package/lib/server/devices/zigbee/BaseDevices/zigbeeWindowHandle.js +4 -0
- package/lib/server/devices/zigbee/index.d.ts +1 -0
- package/lib/server/devices/zigbee/index.js +3 -0
- package/lib/server/devices/zigbee/zigbeeEuroHeater.d.ts +1 -1
- package/lib/server/devices/zigbee/zigbeeEuroHeater.js +5 -5
- package/lib/server/devices/zigbee/zigbeeSodaHandle.d.ts +4 -0
- package/lib/server/devices/zigbee/zigbeeSodaHandle.js +7 -2
- package/lib/server/devices/zigbee/zigbeeTuyaMotion.d.ts +7 -0
- package/lib/server/devices/zigbee/zigbeeTuyaMotion.js +18 -0
- package/lib/server/devices/zigbee/zigbeeTuyaValve.d.ts +2 -1
- package/lib/server/devices/zigbee/zigbeeTuyaValve.js +7 -4
- package/lib/server/services/Sonos/mp3-server.js +6 -0
- package/lib/server/services/Telegram/telegram-service.js +9 -0
- package/lib/server/services/dbo/postgreSqlPersist.js +90 -66
- package/lib/server/services/https-service.js +3 -0
- package/lib/server/services/weather/weather-service.js +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- 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
|
|
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
|
|
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
|
|
54
|
-
|
|
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.
|
|
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.
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
36
|
-
|
|
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.
|
|
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.
|
|
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}'
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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}',
|
|
33
|
-
|
|
34
|
-
DO
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
48
|
-
|
|
49
|
-
|
|
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}'
|
|
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"
|
|
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(
|
|
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"
|
|
380
|
-
|
|
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},
|
|
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
|
-
|
|
462
|
-
values ('${new Date(calc.startMs).toISOString()}','${new Date(calc.endMs).toISOString()}',
|
|
463
|
-
|
|
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
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
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}`);
|