homebridge-econet-rheem 1.5.11 → 1.5.12-beta.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 (54) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/homebridge/platform.d.ts +4 -1
  3. package/dist/homebridge/platform.js +57 -59
  4. package/dist/homebridge/platform.js.map +1 -1
  5. package/dist/homebridge/thermostatAccessory.js +11 -6
  6. package/dist/homebridge/thermostatAccessory.js.map +1 -1
  7. package/dist/homebridge/waterHeaterAccessory.js +9 -5
  8. package/dist/homebridge/waterHeaterAccessory.js.map +1 -1
  9. package/dist/lang/en.d.ts +50 -0
  10. package/dist/lang/en.js +62 -0
  11. package/dist/lang/en.js.map +1 -0
  12. package/dist/model/api.d.ts +21 -30
  13. package/dist/model/api.js +261 -226
  14. package/dist/model/api.js.map +1 -1
  15. package/dist/model/auth.d.ts +11 -0
  16. package/dist/model/auth.js +51 -0
  17. package/dist/model/auth.js.map +1 -0
  18. package/dist/model/{enums.d.ts → constants.d.ts} +4 -0
  19. package/dist/model/{enums.js → constants.js} +6 -1
  20. package/dist/model/constants.js.map +1 -0
  21. package/dist/model/equipment.d.ts +8 -8
  22. package/dist/model/equipment.js +18 -32
  23. package/dist/model/equipment.js.map +1 -1
  24. package/dist/model/recoverySimulator.d.ts +2 -1
  25. package/dist/model/recoverySimulator.js +13 -12
  26. package/dist/model/recoverySimulator.js.map +1 -1
  27. package/dist/model/thermostat.d.ts +5 -5
  28. package/dist/model/thermostat.js +70 -70
  29. package/dist/model/thermostat.js.map +1 -1
  30. package/dist/model/types.d.ts +83 -0
  31. package/dist/model/types.js +23 -0
  32. package/dist/model/types.js.map +1 -0
  33. package/dist/model/waterHeater.d.ts +6 -4
  34. package/dist/model/waterHeater.js +39 -39
  35. package/dist/model/waterHeater.js.map +1 -1
  36. package/dist/tools/storage.d.ts +6 -0
  37. package/dist/tools/storage.js +25 -0
  38. package/dist/tools/storage.js.map +1 -0
  39. package/dist/tools/temperature.d.ts +3 -0
  40. package/dist/tools/temperature.js +14 -0
  41. package/dist/tools/temperature.js.map +1 -0
  42. package/dist/tools/time.d.ts +4 -0
  43. package/dist/tools/time.js +5 -0
  44. package/dist/tools/time.js.map +1 -0
  45. package/dist/tools/version.d.ts +1 -0
  46. package/dist/tools/version.js +18 -0
  47. package/dist/tools/version.js.map +1 -0
  48. package/example_responses/auth.json +45 -0
  49. package/example_responses/locations.json +1656 -0
  50. package/package.json +3 -1
  51. package/dist/model/enums.js.map +0 -1
  52. package/dist/model/utils.d.ts +0 -9
  53. package/dist/model/utils.js +0 -53
  54. package/dist/model/utils.js.map +0 -1
@@ -0,0 +1,51 @@
1
+ import crypto from 'crypto';
2
+ import { safeGetItem, safeSetItem, STORAGE_KEY_AUTH } from '../tools/storage.js';
3
+ export class Auth {
4
+ data;
5
+ constructor(data) {
6
+ this.data = data;
7
+ }
8
+ get token() {
9
+ return this.data.user_token;
10
+ }
11
+ get userId() {
12
+ return this.data.user_id;
13
+ }
14
+ get accountId() {
15
+ return this.data.options.account_id;
16
+ }
17
+ static digest(encryptionKey) {
18
+ return crypto.createHash('sha256').update(encryptionKey).digest();
19
+ }
20
+ save(filePath, encryptionKey) {
21
+ const serailzed = JSON.stringify({
22
+ data: this.data,
23
+ });
24
+ const digest = Auth.digest(encryptionKey);
25
+ const iv = crypto.randomBytes(16);
26
+ const cipher = crypto.createCipheriv('aes-256-cbc', digest, iv);
27
+ const encrypted = Buffer.concat([cipher.update(serailzed, 'utf8'), cipher.final()]);
28
+ const final = iv.toString('hex') + ':' + encrypted.toString('hex');
29
+ safeSetItem(filePath, STORAGE_KEY_AUTH, final);
30
+ }
31
+ static load(filePath, encryptionKey) {
32
+ const final = safeGetItem(filePath, STORAGE_KEY_AUTH);
33
+ if (!final) {
34
+ return null;
35
+ }
36
+ try {
37
+ const digest = Auth.digest(encryptionKey);
38
+ const [ivHex, encryptedHex] = final.split(':');
39
+ const iv = Buffer.from(ivHex, 'hex');
40
+ const encrypted = Buffer.from(encryptedHex, 'hex');
41
+ const decipher = crypto.createDecipheriv('aes-256-cbc', digest, iv);
42
+ const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]).toString('utf8');
43
+ const obj = JSON.parse(decrypted);
44
+ return new Auth(obj.data);
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ }
51
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/model/auth.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAI5B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEjF,MAAM,OAAO,IAAI;IAGI;IADnB,YACmB,IAAe;QAAf,SAAI,GAAJ,IAAI,CAAW;IAChC,CAAC;IAEH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;IAC9B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;IACtC,CAAC;IAEO,MAAM,CAAC,MAAM,CAAC,aAAqB;QACzC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,CAAC;IACpE,CAAC;IAED,IAAI,CAAC,QAAgB,EAAE,aAAqB;QAE1C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC1C,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpF,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEnE,WAAW,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,QAAgB,EAAE,aAAqB;QAEjD,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACrC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YACpE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAEjG,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAyC,CAAC;YAC1E,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAE5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -1,3 +1,7 @@
1
+ export declare enum EquipmentType {
2
+ THERMOSTAT = "HVAC",
3
+ WATER_HEATER = "WH"
4
+ }
1
5
  export declare enum ThermostatOperationMode {
2
6
  OFF = 1,
3
7
  HEATING = 2,
@@ -1,3 +1,8 @@
1
+ export var EquipmentType;
2
+ (function (EquipmentType) {
3
+ EquipmentType["THERMOSTAT"] = "HVAC";
4
+ EquipmentType["WATER_HEATER"] = "WH";
5
+ })(EquipmentType || (EquipmentType = {}));
1
6
  export var ThermostatOperationMode;
2
7
  (function (ThermostatOperationMode) {
3
8
  ThermostatOperationMode[ThermostatOperationMode["OFF"] = 1] = "OFF";
@@ -13,4 +18,4 @@ export var TemperatureUnits;
13
18
  TemperatureUnits[TemperatureUnits["FAHRENHEIT"] = 1] = "FAHRENHEIT";
14
19
  TemperatureUnits[TemperatureUnits["CELSIUS"] = 2] = "CELSIUS";
15
20
  })(TemperatureUnits || (TemperatureUnits = {}));
16
- //# sourceMappingURL=enums.js.map
21
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/model/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,oCAAmB,CAAA;AACrB,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AAED,MAAM,CAAN,IAAY,uBAQX;AARD,WAAY,uBAAuB;IACjC,mEAAO,CAAA;IACP,2EAAW,CAAA;IACX,2EAAW,CAAA;IACX,qEAAQ,CAAA;IACR,6EAAY,CAAA;IACZ,yFAAkB,CAAA;IAClB,4EAAY,CAAA;AACd,CAAC,EARW,uBAAuB,KAAvB,uBAAuB,QAQlC;AAED,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,mEAAc,CAAA;IACd,6DAAW,CAAA;AACb,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,QAG3B"}
@@ -1,24 +1,24 @@
1
1
  import { EconetApi } from './api.js';
2
- import { TemperatureUnits } from './enums.js';
2
+ import { EquipmentType, TemperatureUnits } from './constants.js';
3
+ import { EquipmentData, MQTTData } from './types.js';
3
4
  export declare abstract class Equipment {
5
+ readonly api: EconetApi;
4
6
  private device_id?;
5
7
  private serial_number?;
6
8
  private device_name?;
7
- private alertCount;
9
+ private alert_count;
8
10
  private temp_units;
9
- private running;
10
- protected _api: EconetApi;
11
+ protected running: boolean;
11
12
  private _onUpdateCallback;
12
- constructor(api: EconetApi);
13
+ constructor(api: EconetApi, data: EquipmentData);
14
+ abstract get type(): EquipmentType;
13
15
  get deviceId(): string;
14
16
  get serialNumber(): string;
15
17
  get deviceName(): string;
16
18
  get hasAlert(): boolean;
17
19
  get units(): TemperatureUnits;
18
- protected abstract get runningKey(): string;
19
20
  get isRunning(): boolean;
20
21
  setOnUpdateCallback(callback: (serialNumber: string) => void): void;
21
22
  protected didUpdate(): void;
22
- protected updateFromREST(update: any): void;
23
- updateFromMQTT(update: any): void;
23
+ updateFromMQTT(update: MQTTData): void;
24
24
  }
@@ -1,27 +1,33 @@
1
- import { TemperatureUnits } from './enums.js';
1
+ import { TemperatureUnits } from './constants.js';
2
+ import strings from '../lang/en.js';
2
3
  export class Equipment {
4
+ api;
3
5
  device_id;
4
6
  serial_number;
5
7
  device_name;
6
- alertCount = 0;
8
+ alert_count = 0;
7
9
  temp_units = TemperatureUnits.CELSIUS;
8
10
  running = false;
9
- _api;
10
11
  _onUpdateCallback = null;
11
- constructor(api) {
12
- this._api = api;
12
+ constructor(api, data) {
13
+ this.api = api;
14
+ this.device_id = data.device_name;
15
+ this.serial_number = data.serial_number;
16
+ this.device_name = data['@NAME']?.value ?? strings.brand;
17
+ this.alert_count = data['@ALERTCOUNT'] ?? 0;
18
+ this.temp_units = data['@SETPOINT']?.constraints?.units?.includes('F') ? TemperatureUnits.FAHRENHEIT : TemperatureUnits.CELSIUS;
13
19
  }
14
20
  get deviceId() {
15
- return this.device_id || 'undefined';
21
+ return this.device_id || strings.undefined;
16
22
  }
17
23
  get serialNumber() {
18
- return this.serial_number || 'undefined';
24
+ return this.serial_number || strings.undefined;
19
25
  }
20
26
  get deviceName() {
21
- return this.device_name || 'undefined';
27
+ return this.device_name || strings.undefined;
22
28
  }
23
29
  get hasAlert() {
24
- return this.alertCount > 0;
30
+ return this.alert_count > 0;
25
31
  }
26
32
  get units() {
27
33
  return this.temp_units;
@@ -37,30 +43,10 @@ export class Equipment {
37
43
  this._onUpdateCallback(this.serialNumber);
38
44
  }
39
45
  }
40
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
- updateFromREST(update) {
42
- this.device_id = update.device_name;
43
- this.serial_number = update.serial_number;
44
- this.device_name = update['@NAME'].value ?? '';
45
- if ('@ALERTCOUNT' in update) {
46
- this.alertCount = update['@ALERTCOUNT'] ?? 0;
47
- }
48
- if ('@SETPOINT' in update) {
49
- this.temp_units = update['@SETPOINT'].constraints.units.includes('F') ? TemperatureUnits.FAHRENHEIT : TemperatureUnits.CELSIUS;
50
- }
51
- if (this.runningKey in update) {
52
- this.running = update[this.runningKey].replace(/\s/g, '').length > 0;
53
- }
54
- }
55
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
56
46
  updateFromMQTT(update) {
57
- if ('@ALERTCOUNT' in update) {
58
- this.alertCount = update['@ALERTCOUNT'] ?? 0;
59
- this._api.log.debug(`${this.deviceName} alert count = ${this.alertCount}`);
60
- }
61
- if (this.runningKey in update) {
62
- this.running = update[this.runningKey].replace(/\s/g, '').length > 0;
63
- this._api.log.debug(`${this.deviceName} running = ${this.running}`);
47
+ if (update['@ALERTCOUNT'] !== undefined) {
48
+ this.alert_count = update['@ALERTCOUNT'];
49
+ this.api.log.debug(strings.alertCount, this.deviceName, this.alert_count);
64
50
  }
65
51
  }
66
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"equipment.js","sourceRoot":"","sources":["../../src/model/equipment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"equipment.js","sourceRoot":"","sources":["../../src/model/equipment.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,OAAO,MAAM,eAAe,CAAC;AAEpC,MAAM,OAAgB,SAAS;IAUR;IATb,SAAS,CAAiB;IAC1B,aAAa,CAAiB;IAC9B,WAAW,CAAiB;IAC5B,WAAW,GAAW,CAAC,CAAC;IACxB,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC;IACpC,OAAO,GAAY,KAAK,CAAC;IAE3B,iBAAiB,GAA4C,IAAI,CAAC;IAE1E,YAAqB,GAAc,EAAE,IAAmB;QAAnC,QAAG,GAAH,GAAG,CAAW;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;QACzD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC;IAClI,CAAC;IAID,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;IAC7C,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC;IACjD,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC;IAC/C,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,mBAAmB,CAAC,QAAwC;QAC1D,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;IACpC,CAAC;IAES,SAAS;QACjB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,cAAc,CAAC,MAAgB;QAE7B,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;CACF"}
@@ -2,8 +2,8 @@ import { EconetApi } from './api.js';
2
2
  import { WaterHeater } from './waterHeater.js';
3
3
  export declare class RecoverySimulator {
4
4
  private readonly api;
5
+ readonly waterHeater: WaterHeater;
5
6
  private readonly onUpdate;
6
- private readonly recoveryRatesFilePath;
7
7
  private readonly minRecoveryRate;
8
8
  private readonly defaultRecoveryRate;
9
9
  private recoveryRates;
@@ -24,6 +24,7 @@ export declare class RecoverySimulator {
24
24
  private _stopRecoveryTimer;
25
25
  private _updateSimulatedTemp;
26
26
  private _recordRecoveryRate;
27
+ private get recoveryRatesMap();
27
28
  private _loadRecoveryRates;
28
29
  private _saveRecoveryRates;
29
30
  }
@@ -1,16 +1,14 @@
1
- import path from 'path';
2
- import { TemperatureUnits } from './enums.js';
3
- import { HOUR, MINUTE, safeGetItem, safeSetItem } from './utils.js';
4
- const VERSION = 1;
5
- const RECOVERY_FILE_NAME = 'econetWHRecoveryRates.json';
1
+ import { TemperatureUnits } from './constants.js';
2
+ import { HOUR, MINUTE } from '../tools/time.js';
3
+ import { safeGetItem, safeSetItem, STORAGE_KEY_RECOVERY_RATES } from '../tools/storage.js';
6
4
  // in degrees Celsius per hour
7
5
  const DEFAULT_RECOVERY_RATE = 20;
8
6
  const MINIMUM_RECOVERY_RATE = 1;
9
7
  const RECOVERY_TIMER_INTERVAL = 2 * MINUTE;
10
8
  export class RecoverySimulator {
11
9
  api;
10
+ waterHeater;
12
11
  onUpdate;
13
- recoveryRatesFilePath;
14
12
  minRecoveryRate;
15
13
  defaultRecoveryRate;
16
14
  recoveryRates;
@@ -24,13 +22,13 @@ export class RecoverySimulator {
24
22
  recoveryStartTemp = null;
25
23
  constructor(api, waterHeater, onUpdate) {
26
24
  this.api = api;
25
+ this.waterHeater = waterHeater;
27
26
  this.onUpdate = onUpdate;
28
27
  this.serialNumber = waterHeater.serialNumber;
29
28
  this.availability = waterHeater.availability;
30
29
  this.setPoint = waterHeater.setPoint;
31
30
  this.previousSetPoint = this.setPoint;
32
31
  this.simulatedTemp = this.setPoint;
33
- this.recoveryRatesFilePath = path.join(api.storagePath, RECOVERY_FILE_NAME);
34
32
  this.minRecoveryRate = MINIMUM_RECOVERY_RATE * (waterHeater.units === TemperatureUnits.FAHRENHEIT ? 1.8 : 1);
35
33
  this.defaultRecoveryRate = DEFAULT_RECOVERY_RATE * (waterHeater.units === TemperatureUnits.FAHRENHEIT ? 1.8 : 1);
36
34
  this.recoveryRates = this._loadRecoveryRates() ?? [this.defaultRecoveryRate];
@@ -122,14 +120,17 @@ export class RecoverySimulator {
122
120
  }
123
121
  this._saveRecoveryRates();
124
122
  }
123
+ get recoveryRatesMap() {
124
+ const mapString = safeGetItem(this.waterHeater.storageFilePath, STORAGE_KEY_RECOVERY_RATES);
125
+ return mapString ? JSON.parse(mapString) : null;
126
+ }
125
127
  _loadRecoveryRates() {
126
- const key = `${VERSION}_${this.serialNumber}`;
127
- const stored = safeGetItem(this.recoveryRatesFilePath, key);
128
- return stored ? JSON.parse(stored) : null;
128
+ return this.recoveryRatesMap?.get(this.serialNumber);
129
129
  }
130
130
  _saveRecoveryRates() {
131
- const key = `${VERSION}_${this.serialNumber}`;
132
- safeSetItem(this.recoveryRatesFilePath, key, JSON.stringify(this.recoveryRates));
131
+ const ratesMap = this.recoveryRatesMap ?? new Map();
132
+ ratesMap.set(this.serialNumber, this.recoveryRates);
133
+ safeSetItem(this.waterHeater.storageFilePath, STORAGE_KEY_RECOVERY_RATES, JSON.stringify(ratesMap));
133
134
  }
134
135
  }
135
136
  //# sourceMappingURL=recoverySimulator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recoverySimulator.js","sourceRoot":"","sources":["../../src/model/recoverySimulator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recoverySimulator.js","sourceRoot":"","sources":["../../src/model/recoverySimulator.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { EconetApi } from './api.js';
2
- import { ThermostatOperationMode } from './enums.js';
2
+ import { EquipmentType, ThermostatOperationMode } from './constants.js';
3
3
  import { Equipment } from './equipment.js';
4
+ import { MQTTData, ThermostatData } from './types.js';
4
5
  export declare class Thermostat extends Equipment {
5
6
  private current_humidity;
6
7
  private current_temp;
@@ -13,8 +14,8 @@ export declare class Thermostat extends Equipment {
13
14
  private dead_band;
14
15
  private modes;
15
16
  private current_mode;
16
- constructor(api: EconetApi, restUpdate: any);
17
- protected get runningKey(): string;
17
+ constructor(api: EconetApi, data: ThermostatData);
18
+ get type(): EquipmentType;
18
19
  get humidity(): number;
19
20
  get currentTemp(): number;
20
21
  get coolSetPoint(): number;
@@ -23,8 +24,7 @@ export declare class Thermostat extends Equipment {
23
24
  get heatSetPointLimits(): [number, number];
24
25
  get deadband(): number;
25
26
  get mode(): ThermostatOperationMode;
26
- protected updateFromREST(update: any): void;
27
- updateFromMQTT(update: any): void;
27
+ updateFromMQTT(data: MQTTData): void;
28
28
  private _modeFromString;
29
29
  private _stringFromMode;
30
30
  setMode(mode: ThermostatOperationMode): void;
@@ -1,5 +1,12 @@
1
- import { ThermostatOperationMode } from './enums.js';
1
+ import { EquipmentType, ThermostatOperationMode } from './constants.js';
2
2
  import { Equipment } from './equipment.js';
3
+ import { getValue } from './types.js';
4
+ import strings from '../lang/en.js';
5
+ import { fromCelsius } from '../tools/temperature.js';
6
+ const DEFAULT_HUMIDITY = 50;
7
+ const DEFAULT_LOWER_LIMIT = 10;
8
+ const DEFAULT_UPPER_LIMIT = 30;
9
+ const DEFAULT_SETPOINT = 20;
3
10
  export class Thermostat extends Equipment {
4
11
  current_humidity = 0;
5
12
  current_temp = 0;
@@ -12,13 +19,36 @@ export class Thermostat extends Equipment {
12
19
  dead_band = 0;
13
20
  modes = new Map();
14
21
  current_mode = ThermostatOperationMode.UNKNOWN;
15
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
- constructor(api, restUpdate) {
17
- super(api);
18
- this.updateFromREST(restUpdate);
22
+ constructor(api, data) {
23
+ super(api, data);
24
+ const defaultLowerLimit = fromCelsius(DEFAULT_LOWER_LIMIT, this.units);
25
+ const defaultUpperLimit = fromCelsius(DEFAULT_UPPER_LIMIT, this.units);
26
+ const defaultSetpoint = fromCelsius(DEFAULT_SETPOINT, this.units);
27
+ this.running = data['@RUNNINGSTATUS'] ? data['@RUNNINGSTATUS']?.replace(/\s/g, '').length > 0 : false;
28
+ this.current_humidity = data['@HUMIDITY']?.value ?? DEFAULT_HUMIDITY;
29
+ this.current_temp = data['@SETPOINT']?.value ?? defaultSetpoint;
30
+ this.cool_lower_limit = data['@COOLSETPOINT']?.constraints.lowerLimit ?? defaultLowerLimit;
31
+ this.cool_upper_limit = data['@COOLSETPOINT']?.constraints.upperLimit ?? defaultUpperLimit;
32
+ this.cool_set_point = data['@COOLSETPOINT']?.value ?? defaultSetpoint;
33
+ this.heat_lower_limit = data['@HEATSETPOINT']?.constraints.lowerLimit ?? defaultLowerLimit;
34
+ this.heat_upper_limit = data['@HEATSETPOINT']?.constraints.upperLimit ?? defaultUpperLimit;
35
+ this.heat_set_point = data['@HEATSETPOINT']?.value ?? defaultSetpoint;
36
+ this.dead_band = data['@DEADBAND']?.value ?? 0;
37
+ const text_modes = data['@MODE']?.constraints?.enumText ?? [];
38
+ this.modes.clear();
39
+ if (text_modes) {
40
+ text_modes.forEach((textMode, index) => {
41
+ const mode = this._modeFromString(textMode);
42
+ if (mode !== ThermostatOperationMode.UNKNOWN) {
43
+ this.modes.set(index, mode);
44
+ }
45
+ });
46
+ }
47
+ this.current_mode = this.modes.get(data['@MODE']?.value ?? -1) ?? ThermostatOperationMode.UNKNOWN;
48
+ this.didUpdate();
19
49
  }
20
- get runningKey() {
21
- return '@RUNNINGSTATUS';
50
+ get type() {
51
+ return EquipmentType.THERMOSTAT;
22
52
  }
23
53
  get humidity() {
24
54
  return this.current_humidity;
@@ -44,62 +74,32 @@ export class Thermostat extends Equipment {
44
74
  get mode() {
45
75
  return this.current_mode;
46
76
  }
47
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
- updateFromREST(update) {
49
- super.updateFromREST(update);
50
- if ('@HUMIDITY' in update) {
51
- this.current_humidity = update['@HUMIDITY'].value || 0;
52
- }
53
- if ('@SETPOINT' in update) {
54
- this.current_temp = update['@SETPOINT'].value || 70;
55
- }
56
- if ('@COOLSETPOINT' in update) {
57
- this.cool_lower_limit = update['@COOLSETPOINT'].constraints.lowerLimit || 50;
58
- this.cool_upper_limit = update['@COOLSETPOINT'].constraints.upperLimit || 90;
59
- this.cool_set_point = update['@COOLSETPOINT'].value || 70;
60
- }
61
- if ('@HEATSETPOINT' in update) {
62
- this.heat_lower_limit = update['@HEATSETPOINT'].constraints.lowerLimit || 50;
63
- this.heat_upper_limit = update['@HEATSETPOINT'].constraints.upperLimit || 90;
64
- this.heat_set_point = update['@HEATSETPOINT'].value || 70;
65
- }
66
- this.dead_band = update['@DEADBAND']?.value || 0;
67
- const text_modes = update['@MODE']?.constraints.enumText;
68
- this.modes.clear();
69
- if (text_modes) {
70
- text_modes.forEach((textMode, index) => {
71
- const mode = this._modeFromString(textMode);
72
- if (mode !== ThermostatOperationMode.UNKNOWN) {
73
- this.modes.set(index, mode);
74
- }
75
- });
77
+ updateFromMQTT(data) {
78
+ super.updateFromMQTT(data);
79
+ if (data['@HUMIDITY'] !== undefined) {
80
+ this.current_humidity = data['@HUMIDITY'];
81
+ this.api.log.debug(strings.humidityState, this.deviceName, this.current_humidity);
76
82
  }
77
- this.current_mode = this.modes.get(update['@MODE']?.value) ?? ThermostatOperationMode.UNKNOWN;
78
- this.didUpdate();
79
- }
80
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
81
- updateFromMQTT(update) {
82
- super.updateFromMQTT(update);
83
- if ('@HUMIDITY' in update) {
84
- this.current_humidity = update['@HUMIDITY'] || 0;
85
- this._api.log.debug(`${this.deviceName} humidity = ${this.current_humidity}`);
86
- }
87
- if ('@SETPOINT' in update) {
88
- this.current_temp = update['@SETPOINT'] || 70;
89
- this._api.log.debug(`${this.deviceName} current temp = ${this.current_temp}`);
90
- }
91
- if ('@COOLSETPOINT' in update) {
92
- this.cool_set_point = update['@COOLSETPOINT'] || 70;
93
- this._api.log.debug(`${this.deviceName} cool setpoint = ${this.cool_set_point}`);
94
- }
95
- if ('@HEATSETPOINT' in update) {
96
- this.heat_set_point = update['@HEATSETPOINT'] || 70;
97
- this._api.log.debug(`${this.deviceName} heat setpoint = ${this.heat_set_point}`);
98
- }
99
- if ('@MODE' in update) {
100
- const modeIndex = update['@MODE'] ?? update['@MODE'].value;
83
+ if (data['@SETPOINT'] !== undefined) {
84
+ this.current_temp = data['@SETPOINT'];
85
+ this.api.log.debug(strings.currentTempState, this.deviceName, this.current_temp);
86
+ }
87
+ if (data['@COOLSETPOINT'] !== undefined) {
88
+ this.cool_set_point = data['@COOLSETPOINT'];
89
+ this.api.log.debug(strings.coolSetpoint, this.deviceName, this.cool_set_point);
90
+ }
91
+ if (data['@HEATSETPOINT'] !== undefined) {
92
+ this.heat_set_point = data['@HEATSETPOINT'];
93
+ this.api.log.debug(strings.heatSetpoint, this.deviceName, this.heat_set_point);
94
+ }
95
+ if (data['@MODE'] !== undefined) {
96
+ const modeIndex = getValue(data['@MODE']);
101
97
  this.current_mode = this.modes.get(modeIndex) ?? ThermostatOperationMode.UNKNOWN;
102
- this._api.log.debug(`${this.deviceName} mode = ${this._stringFromMode(this.current_mode) ?? 'UNKNOWN'}`);
98
+ this.api.log.debug(strings.modeState, this.deviceName, this._stringFromMode(this.current_mode) ?? 'UNKNOWN');
99
+ }
100
+ if (data['@RUNNINGSTATUS'] !== undefined) {
101
+ this.running = data['@RUNNINGSTATUS'].replace(/\s/g, '').length > 0;
102
+ this.api.log.debug(strings.runningState, this.deviceName, this.running);
103
103
  }
104
104
  this.didUpdate();
105
105
  }
@@ -119,7 +119,7 @@ export class Thermostat extends Equipment {
119
119
  case 'EMERGENCYHEAT':
120
120
  return ThermostatOperationMode.EMERGENCY_HEAT;
121
121
  default:
122
- this._api.log.error('Unknown thermostat mode:', strValue);
122
+ this.api.log.error(strings.unknownMode, strValue);
123
123
  return ThermostatOperationMode.UNKNOWN;
124
124
  }
125
125
  }
@@ -149,10 +149,10 @@ export class Thermostat extends Equipment {
149
149
  }
150
150
  }
151
151
  if (Object.keys(payload).length > 0) {
152
- this._api.publish(payload, this.deviceId, this.serialNumber);
152
+ this.api.publish(payload, this.deviceId, this.serialNumber);
153
153
  }
154
154
  else {
155
- this._api.log.error('Unknown thermostat mode:', mode);
155
+ this.api.log.error(strings.unknownMode, mode);
156
156
  }
157
157
  }
158
158
  setSetPoint(targetTemp, targetTempCool, targetTempHeat) {
@@ -165,7 +165,7 @@ export class Thermostat extends Equipment {
165
165
  coolPayload['@COOLSETPOINT'] = temp;
166
166
  }
167
167
  else {
168
- this._api.log.error(`Cool set point out of range. Lower: ${lower}, Upper: ${upper}, Set point: ${temp}`);
168
+ this.api.log.error(strings.outOfRangeCool, lower, upper, temp);
169
169
  }
170
170
  }
171
171
  if (targetTempHeat || (targetTemp && [ThermostatOperationMode.HEATING, ThermostatOperationMode.EMERGENCY_HEAT].includes(this.mode))) {
@@ -175,16 +175,16 @@ export class Thermostat extends Equipment {
175
175
  heatPayload['@HEATSETPOINT'] = temp;
176
176
  }
177
177
  else {
178
- this._api.log.error(`Heat set point out of range. Lower: ${lower}, Upper: ${upper}, Set point: ${temp}`);
178
+ this.api.log.error(strings.outOfRangeHeat, lower, upper, temp);
179
179
  }
180
180
  }
181
181
  let hasSetTemp = false;
182
182
  if (coolPayload && [ThermostatOperationMode.AUTO, ThermostatOperationMode.COOLING].includes(this.mode)) {
183
- this._api.publish(coolPayload, this.deviceId, this.serialNumber);
183
+ this.api.publish(coolPayload, this.deviceId, this.serialNumber);
184
184
  hasSetTemp = true;
185
185
  }
186
186
  if (heatPayload && [ThermostatOperationMode.AUTO, ThermostatOperationMode.HEATING, ThermostatOperationMode.EMERGENCY_HEAT].includes(this.mode)) {
187
- this._api.publish(heatPayload, this.deviceId, this.serialNumber);
187
+ this.api.publish(heatPayload, this.deviceId, this.serialNumber);
188
188
  hasSetTemp = true;
189
189
  }
190
190
  if (targetTemp && !hasSetTemp) {
@@ -196,10 +196,10 @@ export class Thermostat extends Equipment {
196
196
  payload = heatPayload;
197
197
  }
198
198
  else {
199
- this._api.log.error(`Can't auto determine set point to set when mode is: ${this.mode}`);
199
+ this.api.log.error(strings.setpointUnknown, this.mode);
200
200
  }
201
201
  if (Object.keys(payload).length > 0) {
202
- this._api.publish(payload, this.deviceId, this.serialNumber);
202
+ this.api.publish(payload, this.deviceId, this.serialNumber);
203
203
  }
204
204
  }
205
205
  }
@@ -1 +1 @@
1
- {"version":3,"file":"thermostat.js","sourceRoot":"","sources":["../../src/model/thermostat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"thermostat.js","sourceRoot":"","sources":["../../src/model/thermostat.ts"],"names":[],"mappings":"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"}