homebridge-econet-rheem 1.4.7 → 1.4.9
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/config.schema.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"type": "string",
|
|
16
16
|
"format": "email",
|
|
17
17
|
"required": true,
|
|
18
|
-
"description": "Rheem/Econet account email"
|
|
18
|
+
"description": "Rheem/Econet account email (Homebridge dedicated account recommnded)"
|
|
19
19
|
},
|
|
20
20
|
"password": {
|
|
21
21
|
"title": "Password",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"title": "Disable Water Heater Temperature Simulator",
|
|
28
28
|
"type": "boolean",
|
|
29
29
|
"required": false,
|
|
30
|
-
"description": "See
|
|
30
|
+
"description": "See documentation for details"
|
|
31
31
|
},
|
|
32
32
|
"verbose": {
|
|
33
33
|
"title": "Verbose",
|
|
@@ -4,6 +4,8 @@ export declare class RecoverySimulator {
|
|
|
4
4
|
private readonly api;
|
|
5
5
|
private readonly onUpdate;
|
|
6
6
|
private readonly recoveryRatesFilePath;
|
|
7
|
+
private readonly minRecoveryRate;
|
|
8
|
+
private readonly defaultRecoveryRate;
|
|
7
9
|
private recoveryRates;
|
|
8
10
|
private recoveryTimer;
|
|
9
11
|
private readonly serialNumber;
|
|
@@ -21,7 +23,6 @@ export declare class RecoverySimulator {
|
|
|
21
23
|
private _startRecoveryTimer;
|
|
22
24
|
private _stopRecoveryTimer;
|
|
23
25
|
private _updateSimulatedTemp;
|
|
24
|
-
private _endRecovery;
|
|
25
26
|
private _recordRecoveryRate;
|
|
26
27
|
private _loadRecoveryRates;
|
|
27
28
|
private _saveRecoveryRates;
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { HOUR, MINUTE, safeGetItem, safeSetItem } from './utils.js';
|
|
3
|
+
import { TemperatureUnits } from './enums.js';
|
|
4
|
+
const VERSION = 1;
|
|
5
|
+
const RECOVERY_FILE_NAME = 'econetWHRecoveryRates.json';
|
|
4
6
|
// in degrees Celsius per hour
|
|
5
7
|
const DEFAULT_RECOVERY_RATE = 20;
|
|
6
|
-
const MINIMUM_RECOVERY_RATE =
|
|
8
|
+
const MINIMUM_RECOVERY_RATE = 1;
|
|
7
9
|
const RECOVERY_TIMER_INTERVAL = 2 * MINUTE;
|
|
8
10
|
export class RecoverySimulator {
|
|
9
11
|
api;
|
|
10
12
|
onUpdate;
|
|
11
13
|
recoveryRatesFilePath;
|
|
14
|
+
minRecoveryRate;
|
|
15
|
+
defaultRecoveryRate;
|
|
12
16
|
recoveryRates;
|
|
13
17
|
recoveryTimer = null;
|
|
14
18
|
serialNumber;
|
|
@@ -26,10 +30,10 @@ export class RecoverySimulator {
|
|
|
26
30
|
this.setPoint = waterHeater.setPoint;
|
|
27
31
|
this.previousSetPoint = this.setPoint;
|
|
28
32
|
this.simulatedTemp = this.setPoint;
|
|
29
|
-
this.recoveryRatesFilePath = path.join(api.storagePath,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
this.recoveryRates = this._loadRecoveryRates()
|
|
33
|
+
this.recoveryRatesFilePath = path.join(api.storagePath, RECOVERY_FILE_NAME);
|
|
34
|
+
this.minRecoveryRate = MINIMUM_RECOVERY_RATE * (waterHeater.units === TemperatureUnits.FAHRENHEIT ? 1.8 : 1);
|
|
35
|
+
this.defaultRecoveryRate = DEFAULT_RECOVERY_RATE * (waterHeater.units === TemperatureUnits.FAHRENHEIT ? 1.8 : 1);
|
|
36
|
+
this.recoveryRates = this._loadRecoveryRates() ?? [this.defaultRecoveryRate];
|
|
33
37
|
}
|
|
34
38
|
currentTemp(inputTemp) {
|
|
35
39
|
if (this.availability === 0 && !this.isRecovering) {
|
|
@@ -46,7 +50,12 @@ export class RecoverySimulator {
|
|
|
46
50
|
this.setPoint = waterHeater.setPoint;
|
|
47
51
|
}
|
|
48
52
|
this.availability = waterHeater.availability;
|
|
49
|
-
if (
|
|
53
|
+
if (waterHeater.isRunning && !this.isRecovering &&
|
|
54
|
+
(this.availability === 0 || this.setPoint > this.previousSetPoint)) {
|
|
55
|
+
this._startRecoveryTimer();
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (!waterHeater.isRunning && this.availability === 0) {
|
|
50
59
|
this._stopRecoveryTimer();
|
|
51
60
|
this.onUpdate();
|
|
52
61
|
return;
|
|
@@ -57,18 +66,11 @@ export class RecoverySimulator {
|
|
|
57
66
|
this.onUpdate();
|
|
58
67
|
return;
|
|
59
68
|
}
|
|
60
|
-
if (waterHeater.isRunning && !this.isRecovering &&
|
|
61
|
-
(this.availability === 0 || this.setPoint > this.previousSetPoint)) {
|
|
62
|
-
this._startRecoveryTimer();
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
69
|
if (!waterHeater.isRunning && this.isRecovering) {
|
|
66
70
|
if (this.simulatedTemp >= this.setPoint) {
|
|
67
|
-
this.
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
this._stopRecoveryTimer();
|
|
71
|
+
this._recordRecoveryRate();
|
|
71
72
|
}
|
|
73
|
+
this._stopRecoveryTimer();
|
|
72
74
|
this.simulatedTemp = this.setPoint;
|
|
73
75
|
this.onUpdate();
|
|
74
76
|
return;
|
|
@@ -99,15 +101,8 @@ export class RecoverySimulator {
|
|
|
99
101
|
}
|
|
100
102
|
const tempIncrease = this.recoveryRate * (RECOVERY_TIMER_INTERVAL / HOUR);
|
|
101
103
|
this.simulatedTemp = Math.min(this.simulatedTemp + tempIncrease, this.setPoint);
|
|
102
|
-
if (this.simulatedTemp === this.setPoint) {
|
|
103
|
-
this._endRecovery();
|
|
104
|
-
}
|
|
105
104
|
this.onUpdate();
|
|
106
105
|
}
|
|
107
|
-
_endRecovery() {
|
|
108
|
-
this._recordRecoveryRate();
|
|
109
|
-
this._stopRecoveryTimer();
|
|
110
|
-
}
|
|
111
106
|
_recordRecoveryRate() {
|
|
112
107
|
if (!this.recoveryStartTime || !this.recoveryStartTemp) {
|
|
113
108
|
return;
|
|
@@ -120,22 +115,22 @@ export class RecoverySimulator {
|
|
|
120
115
|
return;
|
|
121
116
|
}
|
|
122
117
|
const rate = tempDifference / timeElapsed;
|
|
123
|
-
if (rate <
|
|
118
|
+
if (rate < this.minRecoveryRate) {
|
|
124
119
|
return;
|
|
125
120
|
}
|
|
126
121
|
this.recoveryRates.push(rate);
|
|
127
|
-
if (this.recoveryRates.length > 3) {
|
|
122
|
+
if (this.recoveryRates.length > 3 || (this.recoveryRates.length >= 2 && this.recoveryRates[0] === this.defaultRecoveryRate)) {
|
|
128
123
|
this.recoveryRates.shift();
|
|
129
124
|
}
|
|
130
125
|
this._saveRecoveryRates();
|
|
131
126
|
}
|
|
132
127
|
_loadRecoveryRates() {
|
|
133
|
-
const key = `${
|
|
128
|
+
const key = `${VERSION}_${this.serialNumber}`;
|
|
134
129
|
const stored = safeGetItem(this.recoveryRatesFilePath, key);
|
|
135
130
|
return stored ? JSON.parse(stored) : null;
|
|
136
131
|
}
|
|
137
132
|
_saveRecoveryRates() {
|
|
138
|
-
const key = `${
|
|
133
|
+
const key = `${VERSION}_${this.serialNumber}`;
|
|
139
134
|
safeSetItem(this.recoveryRatesFilePath, key, JSON.stringify(this.recoveryRates));
|
|
140
135
|
}
|
|
141
136
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recoverySimulator.js","sourceRoot":"","sources":["../../src/model/recoverySimulator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"recoverySimulator.js","sourceRoot":"","sources":["../../src/model/recoverySimulator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"displayName": "Homebridge Econet Rheem",
|
|
5
5
|
"description": "Homebridge plugin based on pyeconet for control of Rheem water heaters",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"version": "1.4.
|
|
7
|
+
"version": "1.4.9",
|
|
8
8
|
"homepage": "https://github.com/mpatfield/homebridge-econet-rheem#readme",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|