homebridge-valor-fireplace 2.0.0

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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +94 -0
  3. package/config.schema.json +50 -0
  4. package/dist/controllers/fireplaceController.d.ts +58 -0
  5. package/dist/controllers/fireplaceController.d.ts.map +1 -0
  6. package/dist/controllers/fireplaceController.js +264 -0
  7. package/dist/controllers/fireplaceController.js.map +1 -0
  8. package/dist/controllers/requestController.d.ts +36 -0
  9. package/dist/controllers/requestController.d.ts.map +1 -0
  10. package/dist/controllers/requestController.js +82 -0
  11. package/dist/controllers/requestController.js.map +1 -0
  12. package/dist/controllers/serviceController.d.ts +34 -0
  13. package/dist/controllers/serviceController.d.ts.map +1 -0
  14. package/dist/controllers/serviceController.js +76 -0
  15. package/dist/controllers/serviceController.js.map +1 -0
  16. package/dist/index.d.ts +7 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +7 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/models/auxMode.d.ts +7 -0
  21. package/dist/models/auxMode.d.ts.map +1 -0
  22. package/dist/models/auxMode.js +13 -0
  23. package/dist/models/auxMode.js.map +1 -0
  24. package/dist/models/deviceConfig.d.ts +5 -0
  25. package/dist/models/deviceConfig.d.ts.map +1 -0
  26. package/dist/models/deviceConfig.js +3 -0
  27. package/dist/models/deviceConfig.js.map +1 -0
  28. package/dist/models/fireplaceStatus.d.ts +13 -0
  29. package/dist/models/fireplaceStatus.d.ts.map +1 -0
  30. package/dist/models/fireplaceStatus.js +55 -0
  31. package/dist/models/fireplaceStatus.js.map +1 -0
  32. package/dist/models/flameHeight.d.ts +20 -0
  33. package/dist/models/flameHeight.d.ts.map +1 -0
  34. package/dist/models/flameHeight.js +36 -0
  35. package/dist/models/flameHeight.js.map +1 -0
  36. package/dist/models/operationMode.d.ts +17 -0
  37. package/dist/models/operationMode.d.ts.map +1 -0
  38. package/dist/models/operationMode.js +80 -0
  39. package/dist/models/operationMode.js.map +1 -0
  40. package/dist/models/request.d.ts +9 -0
  41. package/dist/models/request.d.ts.map +1 -0
  42. package/dist/models/request.js +3 -0
  43. package/dist/models/request.js.map +1 -0
  44. package/dist/models/temperatureRange.d.ts +4 -0
  45. package/dist/models/temperatureRange.d.ts.map +1 -0
  46. package/dist/models/temperatureRange.js +23 -0
  47. package/dist/models/temperatureRange.js.map +1 -0
  48. package/dist/platform.d.ts +20 -0
  49. package/dist/platform.d.ts.map +1 -0
  50. package/dist/platform.js +78 -0
  51. package/dist/platform.js.map +1 -0
  52. package/dist/platformAccessory.d.ts +35 -0
  53. package/dist/platformAccessory.d.ts.map +1 -0
  54. package/dist/platformAccessory.js +239 -0
  55. package/dist/platformAccessory.js.map +1 -0
  56. package/dist/settings.d.ts +9 -0
  57. package/dist/settings.d.ts.map +1 -0
  58. package/dist/settings.js +12 -0
  59. package/dist/settings.js.map +1 -0
  60. package/package.json +45 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Omar Shahine
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,94 @@
1
+ # homebridge-valor-fireplace
2
+
3
+ [![npm](https://img.shields.io/npm/v/homebridge-valor-fireplace.svg)](https://www.npmjs.com/package/homebridge-valor-fireplace)
4
+ [![npm](https://img.shields.io/npm/dt/homebridge-valor-fireplace.svg)](https://www.npmjs.com/package/homebridge-valor-fireplace)
5
+
6
+ [Homebridge](https://github.com/homebridge/homebridge) plugin for controlling Valor fireplaces with WiFi controllers through Apple HomeKit.
7
+
8
+ <p align="center">
9
+ <img src="https://raw.githubusercontent.com/omarshahine/homebridge-valor-fireplace/master/images/homekit-screenshot.png" alt="HomeKit Screenshot" width="300">
10
+ </p>
11
+
12
+ ## Features
13
+
14
+ Control your Valor fireplace using Siri and schedule automations with HomeKit scenes. The plugin exposes a Heater accessory with the following features:
15
+
16
+ | Feature | Description |
17
+ |---------|-------------|
18
+ | Lock Controls | Lock access to fireplace controls (turn off is always available for safety) |
19
+ | Temperature Mode | Set to HEAT in HomeKit for temperature-controlled operation |
20
+ | Manual Mode | Direct flame control |
21
+ | Eco Mode | Set to COOL in HomeKit for eco mode |
22
+ | Auxiliary | Toggle auxiliary features using the Oscillate switch |
23
+
24
+ ## Installation
25
+
26
+ ### Via Homebridge UI (Recommended)
27
+
28
+ Search for "valor-fireplace" in the Homebridge UI plugin search and install.
29
+
30
+ ### Via Command Line
31
+
32
+ ```bash
33
+ npm install -g homebridge-valor-fireplace
34
+ ```
35
+
36
+ ## Configuration
37
+
38
+ ### Via Homebridge UI
39
+
40
+ Configure the plugin through the Homebridge UI settings panel.
41
+
42
+ ### Manual Configuration
43
+
44
+ Add the following to your Homebridge `config.json`:
45
+
46
+ ```json
47
+ {
48
+ "platforms": [
49
+ {
50
+ "platform": "ValorFireplace",
51
+ "fireplaces": [
52
+ {
53
+ "name": "Living Room Fireplace",
54
+ "ip": "192.168.1.100"
55
+ }
56
+ ]
57
+ }
58
+ ]
59
+ }
60
+ ```
61
+
62
+ ### Configuration Options
63
+
64
+ | Key | Required | Description |
65
+ |-----|----------|-------------|
66
+ | `platform` | Yes | Must be `"ValorFireplace"` |
67
+ | `debug` | No | Enable debug mode to log all status updates (default: false) |
68
+ | `temperatureUnit` | No | Temperature unit for logs: `"C"` for Celsius, `"F"` for Fahrenheit (default: `"C"`) |
69
+ | `fireplaces` | Yes | Array of fireplace configurations |
70
+ | `name` | Yes | Display name for the fireplace (also used as serial number) |
71
+ | `ip` | Yes | Static IP address of the fireplace WiFi controller |
72
+
73
+ ## Requirements
74
+
75
+ - **Tested with:** Valor Linear L1 fireplace
76
+ - **WiFi Hardware:** [GV60 WiFi Module](https://www.valorfireplaces.com/media/Remote/GV60WIFI-Upgrade-Instructions.pdf) installed in your fireplace
77
+ - **Valor10 Remote App:** Your fireplace must be compatible with the [Valor10 Remote App](https://www.valorfireplaces.com/features/valor10-remote-app.php) - see link for list of compatible fireplaces
78
+ - Static IP address assigned to the fireplace controller
79
+ - Homebridge 1.3.5 or later
80
+ - Node.js 14.18.1 or later
81
+
82
+ ## Credits
83
+
84
+ This plugin is based on [homebridge-mertik-fireplace](https://github.com/tritter/homebridge-mertik-fireplace) by [@tritter](https://github.com/tritter).
85
+
86
+ ## Legal
87
+
88
+ *Valor* is a registered trademark of Valor Fireplaces.
89
+
90
+ This project is not affiliated with, authorized, maintained, sponsored, or endorsed by Valor Fireplaces or any of its affiliates or subsidiaries.
91
+
92
+ ## License
93
+
94
+ MIT
@@ -0,0 +1,50 @@
1
+ {
2
+ "pluginAlias": "ValorFireplace",
3
+ "pluginType": "platform",
4
+ "singular": true,
5
+ "headerDisplay": "Fireplaces are exposed as separate accessories. Each fireplace needs a static IP address configured on your network.",
6
+ "schema": {
7
+ "type": "object",
8
+ "properties": {
9
+ "debug": {
10
+ "title": "Debug Mode",
11
+ "type": "boolean",
12
+ "default": false,
13
+ "description": "Enable to log all status updates. When disabled, only logs status changes."
14
+ },
15
+ "temperatureUnit": {
16
+ "title": "Temperature Unit",
17
+ "type": "string",
18
+ "default": "C",
19
+ "oneOf": [
20
+ { "title": "Celsius", "enum": ["C"] },
21
+ { "title": "Fahrenheit", "enum": ["F"] }
22
+ ],
23
+ "description": "Temperature unit for log output."
24
+ },
25
+ "fireplaces": {
26
+ "title": "Fireplaces",
27
+ "type": "array",
28
+ "items": {
29
+ "title": "Fireplace",
30
+ "type": "object",
31
+ "properties": {
32
+ "name": {
33
+ "title": "Name",
34
+ "type": "string",
35
+ "placeholder": "Fireplace",
36
+ "required": true
37
+ },
38
+ "ip": {
39
+ "title": "IP Address",
40
+ "type": "string",
41
+ "placeholder": "192.168.x.x",
42
+ "required": true,
43
+ "description": "Static IP address of the fireplace WiFi controller"
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,58 @@
1
+ /// <reference types="node" />
2
+ import EventEmitter from 'events';
3
+ import { FireplaceStatus } from '../models/fireplaceStatus';
4
+ import { FlameHeight } from '../models/flameHeight';
5
+ import { Logger, PlatformAccessory } from 'homebridge';
6
+ import { IRequest } from '../models/request';
7
+ export interface IFireplaceController extends EventEmitter {
8
+ request(request: IRequest): Promise<boolean>;
9
+ status(): FireplaceStatus | undefined;
10
+ getFlameHeight(): FlameHeight;
11
+ reachable(): boolean;
12
+ setTemperature(temperature: number): void;
13
+ }
14
+ export interface IFireplaceEvents {
15
+ on(event: 'status', listener: (status: FireplaceStatus) => void): this;
16
+ on(event: 'reachable', listener: (reachable: boolean) => void): this;
17
+ }
18
+ export declare class FireplaceController extends EventEmitter implements IFireplaceController, IFireplaceEvents {
19
+ readonly log: Logger;
20
+ readonly accessory: PlatformAccessory;
21
+ private readonly config;
22
+ private height;
23
+ private statusTimer;
24
+ private client;
25
+ private lastContact;
26
+ private lastStatus;
27
+ private igniting;
28
+ private shuttingDown;
29
+ private lostConnection;
30
+ private static UNREACHABLE_TIMEOUT;
31
+ private static REFRESH_TIMEOUT;
32
+ private static STATUS_PACKET_LENGTH;
33
+ constructor(log: Logger, accessory: PlatformAccessory);
34
+ private startStatusSubscription;
35
+ private stopStatusSubscription;
36
+ private refreshStatus;
37
+ private processStatusResponse;
38
+ private igniteFireplace;
39
+ private standBy;
40
+ private guardFlameOff;
41
+ private setEcoMode;
42
+ private setManualMode;
43
+ private setTemperatureMode;
44
+ private ensureClient;
45
+ private sendCommand;
46
+ reachable(): boolean;
47
+ status(): FireplaceStatus | undefined;
48
+ delay: (ms: any) => Promise<unknown>;
49
+ resetFlameHeight(): void;
50
+ setFlameHeight(temperature: number): Promise<void>;
51
+ getFlameHeight(): FlameHeight;
52
+ setTemperature(temperature: number): Promise<void>;
53
+ private setTemperatureValue;
54
+ setMode(request: IRequest): Promise<boolean>;
55
+ setAux(on: boolean): void;
56
+ request(request: IRequest): Promise<boolean>;
57
+ }
58
+ //# sourceMappingURL=fireplaceController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fireplaceController.d.ts","sourceRoot":"","sources":["../../src/controllers/fireplaceController.ts"],"names":[],"mappings":";AACA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAoB,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,IAAI,eAAe,GAAG,SAAS,CAAC;IACtC,cAAc,IAAI,WAAW,CAAC;IAC9B,SAAS,IAAI,OAAO,CAAC;IACrB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI,CAAC;IACvE,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;CACtE;AAED,qBAAa,mBAAoB,SAAQ,YAAa,YAAW,oBAAoB,EAAE,gBAAgB;aAenF,GAAG,EAAE,MAAM;aACX,SAAS,EAAE,iBAAiB;IAf9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAiB;IACnD,OAAO,CAAC,MAAM,CAAC,eAAe,CAAa;IAC3C,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAO;gBAGxB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,iBAAiB;IAM9C,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,qBAAqB;YAaf,eAAe;YAWf,OAAO;YAOP,aAAa;IAW3B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,YAAY;IAyBpB,OAAO,CAAC,WAAW;IAOnB,SAAS,IAAI,OAAO;IAMpB,MAAM,IAAI,eAAe,GAAG,SAAS;IAIrC,KAAK,gCAAiD;IAEtD,gBAAgB,IAAI,IAAI;IAKlB,cAAc,CAAC,WAAW,EAAE,MAAM;IAajC,cAAc,IAAI,WAAW;IAIvB,cAAc,CAAC,WAAW,EAAE,MAAM;YAajC,mBAAmB;IAO3B,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAqClD,MAAM,CAAC,EAAE,EAAE,OAAO;IAKZ,OAAO,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;CAgCnD"}
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FireplaceController = void 0;
7
+ const events_1 = __importDefault(require("events"));
8
+ const net_1 = __importDefault(require("net"));
9
+ const fireplaceStatus_1 = require("../models/fireplaceStatus");
10
+ const operationMode_1 = require("../models/operationMode");
11
+ const flameHeight_1 = require("../models/flameHeight");
12
+ const temperatureRange_1 = require("../models/temperatureRange");
13
+ class FireplaceController extends events_1.default {
14
+ constructor(log, accessory) {
15
+ super();
16
+ this.log = log;
17
+ this.accessory = accessory;
18
+ this.height = flameHeight_1.FlameHeight.Step11;
19
+ this.client = null;
20
+ this.lastContact = new Date();
21
+ this.igniting = false;
22
+ this.shuttingDown = false;
23
+ this.lostConnection = false;
24
+ this.delay = ms => new Promise(res => setTimeout(res, ms));
25
+ this.config = this.accessory.context.device;
26
+ this.startStatusSubscription();
27
+ }
28
+ startStatusSubscription() {
29
+ this.stopStatusSubscription();
30
+ this.log.debug('Start requesting status');
31
+ this.client = null;
32
+ this.statusTimer = setInterval((e) => e.refreshStatus(), FireplaceController.REFRESH_TIMEOUT, this);
33
+ }
34
+ stopStatusSubscription() {
35
+ this.log.debug('Stop requesting status');
36
+ if (this.statusTimer) {
37
+ clearInterval(this.statusTimer);
38
+ this.statusTimer = undefined;
39
+ }
40
+ }
41
+ refreshStatus() {
42
+ const isReachable = this.reachable();
43
+ this.emit('reachable', isReachable);
44
+ if (this.lastStatus) {
45
+ // Security mechanisnm to turn off fireplace when we had contcat before.
46
+ this.lostConnection = !isReachable;
47
+ if (this.lostConnection) {
48
+ this.log.error('Lost contact!');
49
+ }
50
+ }
51
+ try {
52
+ this.sendCommand('303303');
53
+ }
54
+ catch (_a) {
55
+ this.log.error('Failed to refresh!');
56
+ }
57
+ }
58
+ processStatusResponse(response) {
59
+ const newStatus = new fireplaceStatus_1.FireplaceStatus(response);
60
+ this.lastContact = new Date();
61
+ this.igniting = newStatus.igniting;
62
+ this.shuttingDown = newStatus.shuttingDown;
63
+ this.lastStatus = newStatus;
64
+ this.emit('status', this.lastStatus);
65
+ if (this.lostConnection) {
66
+ // Make sure to turn it off, as we are not sure which state we are in.
67
+ this.guardFlameOff();
68
+ }
69
+ }
70
+ async igniteFireplace() {
71
+ if (this.igniting) {
72
+ this.log.debug('Ignore already igniting!');
73
+ return;
74
+ }
75
+ this.igniting = true;
76
+ this.sendCommand('314103');
77
+ await this.delay(40000);
78
+ this.refreshStatus();
79
+ }
80
+ async standBy() {
81
+ this.log.info('Standby');
82
+ await this.setTemperatureValue(0);
83
+ const msg = '3136303003';
84
+ return this.sendCommand(msg);
85
+ }
86
+ async guardFlameOff() {
87
+ if (this.shuttingDown) {
88
+ this.log.debug('Ignore already shutting down!');
89
+ return;
90
+ }
91
+ this.log.info('GuardFlame Off');
92
+ this.shuttingDown = true;
93
+ this.sendCommand('313003');
94
+ await this.delay(30000);
95
+ }
96
+ setEcoMode() {
97
+ return this.sendCommand('4233303103');
98
+ }
99
+ setManualMode() {
100
+ return this.sendCommand('423003');
101
+ }
102
+ setTemperatureMode() {
103
+ return this.sendCommand('4232303103');
104
+ }
105
+ ensureClient() {
106
+ const ip = this.config.ip;
107
+ this.log.debug(`Using ip:'${ip}'`);
108
+ if (!this.client
109
+ || (typeof (this.client) === 'undefined') || (typeof (this.client.destroyed) !== 'boolean') || (this.client.destroyed === true)) {
110
+ this.log.debug('Created socket');
111
+ this.client = new net_1.default.Socket();
112
+ this.client.connect(2000, ip);
113
+ this.client.setTimeout(FireplaceController.REFRESH_TIMEOUT);
114
+ this.client.on('data', (data) => {
115
+ const tempData = data.toString().substring(1, data.length - 1);
116
+ if (tempData.length === FireplaceController.STATUS_PACKET_LENGTH) {
117
+ this.processStatusResponse(tempData);
118
+ }
119
+ });
120
+ this.client.on('error', (err) => {
121
+ this.log.debug('Socket error: ' + err.message);
122
+ if (this.client && typeof (this.client.destroy) === 'function') {
123
+ this.client.destroy();
124
+ }
125
+ });
126
+ }
127
+ return this.client;
128
+ }
129
+ sendCommand(command) {
130
+ const prefix = '0233303330333033303830';
131
+ const packet = Buffer.from(prefix + command, 'hex');
132
+ this.log.debug('Sending packet: ' + prefix + command);
133
+ return this.ensureClient().write(packet);
134
+ }
135
+ reachable() {
136
+ const now = new Date().getTime();
137
+ const last = this.lastContact.getTime();
138
+ return (now - last) < FireplaceController.UNREACHABLE_TIMEOUT;
139
+ }
140
+ status() {
141
+ return this.lastStatus;
142
+ }
143
+ resetFlameHeight() {
144
+ const msg = '3136' + flameHeight_1.FlameHeight.Step11 + '03';
145
+ this.sendCommand(msg);
146
+ }
147
+ async setFlameHeight(temperature) {
148
+ const percentage = ((temperature) - 5) / 31;
149
+ this.log.debug(`Set flame height to percentage: ${percentage}`);
150
+ const height = flameHeight_1.FlameHeightUtils.ofPercentage(percentage);
151
+ this.log.info(`Set flame height to ${height.toString()}`);
152
+ this.height = height;
153
+ this.resetFlameHeight();
154
+ await this.delay(10000);
155
+ const msg = '3136' + height + '03';
156
+ this.sendCommand(msg);
157
+ await this.delay(1000);
158
+ }
159
+ getFlameHeight() {
160
+ return this.height;
161
+ }
162
+ async setTemperature(temperature) {
163
+ var _a;
164
+ this.log.info(`Set temperature to ${temperature}`);
165
+ this.setManualMode();
166
+ await this.delay(1000);
167
+ this.resetFlameHeight();
168
+ await this.delay(5000);
169
+ this.setTemperatureMode();
170
+ if (((_a = this === null || this === void 0 ? void 0 : this.lastStatus) === null || _a === void 0 ? void 0 : _a.targetTemperature) !== temperature) {
171
+ await this.delay(5000);
172
+ await this.setTemperatureValue(temperature);
173
+ }
174
+ }
175
+ async setTemperatureValue(temperature) {
176
+ const value = temperatureRange_1.TemperatureRangeUtils.toBits(temperature);
177
+ const msg = '42324644303' + value + '03';
178
+ this.sendCommand(msg);
179
+ await this.delay(1000);
180
+ }
181
+ async setMode(request) {
182
+ var _a, _b, _c, _d, _e;
183
+ const mode = request.mode;
184
+ const currentMode = ((_a = this.lastStatus) === null || _a === void 0 ? void 0 : _a.mode) || operationMode_1.OperationMode.Off;
185
+ if (this.igniting) {
186
+ this.log.debug('Ignore as we are igniting the fireplace first!');
187
+ return false;
188
+ }
189
+ if (operationMode_1.OperationModeUtils.needsIgnite(mode) && currentMode === operationMode_1.OperationMode.Off && !((_b = this.lastStatus) === null || _b === void 0 ? void 0 : _b.guardFlameOn)) {
190
+ this.log.info('Ignite fireplace');
191
+ await this.igniteFireplace();
192
+ return false;
193
+ }
194
+ if (currentMode === mode) {
195
+ this.log.debug('Ignore same mode!');
196
+ return true;
197
+ }
198
+ this.log.info(`Set mode to: ${operationMode_1.OperationMode[mode]}`);
199
+ const targetTemperature = (_e = (_c = request.temperature) !== null && _c !== void 0 ? _c : (_d = this.lastStatus) === null || _d === void 0 ? void 0 : _d.targetTemperature) !== null && _e !== void 0 ? _e : 20;
200
+ switch (mode) {
201
+ case operationMode_1.OperationMode.Manual:
202
+ this.setManualMode();
203
+ this.setFlameHeight(targetTemperature);
204
+ break;
205
+ case operationMode_1.OperationMode.Eco:
206
+ this.setFlameHeight(targetTemperature);
207
+ this.setEcoMode();
208
+ break;
209
+ case operationMode_1.OperationMode.Temperature:
210
+ this.setTemperature(targetTemperature);
211
+ break;
212
+ case operationMode_1.OperationMode.Off:
213
+ await this.guardFlameOff();
214
+ break;
215
+ }
216
+ return true;
217
+ }
218
+ setAux(on) {
219
+ this.log.info(`Set aux mode to ${on}`);
220
+ this.sendCommand(on ? '32303031030a' : '32303030030a');
221
+ }
222
+ async request(request) {
223
+ var _a, _b, _c, _d;
224
+ let succeeds = true;
225
+ const currentMode = ((_a = this.lastStatus) === null || _a === void 0 ? void 0 : _a.mode) || operationMode_1.OperationMode.Off;
226
+ this.stopStatusSubscription();
227
+ if (request.mode !== undefined
228
+ && request.mode !== currentMode) {
229
+ succeeds = await this.setMode(request);
230
+ }
231
+ else if (request.temperature !== undefined
232
+ && (request.mode === operationMode_1.OperationMode.Temperature || ((_b = this.lastStatus) === null || _b === void 0 ? void 0 : _b.mode) === operationMode_1.OperationMode.Temperature)) {
233
+ if (request.temperature <= 0.0) {
234
+ await this.standBy();
235
+ }
236
+ else {
237
+ await this.setTemperature(request.temperature);
238
+ }
239
+ }
240
+ else if (request.temperature !== undefined
241
+ && (request.mode === operationMode_1.OperationMode.Manual || request.mode === operationMode_1.OperationMode.Eco
242
+ || ((_c = this.lastStatus) === null || _c === void 0 ? void 0 : _c.mode) === operationMode_1.OperationMode.Manual || ((_d = this.lastStatus) === null || _d === void 0 ? void 0 : _d.mode) === operationMode_1.OperationMode.Eco)) {
243
+ if (request.temperature <= 0.0) {
244
+ await this.standBy();
245
+ }
246
+ else {
247
+ await this.setFlameHeight(request.temperature);
248
+ }
249
+ }
250
+ await this.delay(5000);
251
+ if ((!request.temperature || request.temperature > 0.0) && request.auxOn !== undefined) {
252
+ await this.delay(8000);
253
+ this.setAux(request.auxOn);
254
+ await this.delay(5000);
255
+ }
256
+ this.startStatusSubscription();
257
+ return succeeds;
258
+ }
259
+ }
260
+ exports.FireplaceController = FireplaceController;
261
+ FireplaceController.UNREACHABLE_TIMEOUT = 1000 * 60 * 5; //5 min
262
+ FireplaceController.REFRESH_TIMEOUT = 1000 * 15; //15 seconds
263
+ FireplaceController.STATUS_PACKET_LENGTH = 106; //characters
264
+ //# sourceMappingURL=fireplaceController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fireplaceController.js","sourceRoot":"","sources":["../../src/controllers/fireplaceController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { Logger } from 'homebridge';
2
+ import { OperationMode } from '../models/operationMode';
3
+ import { IRequest } from '../models/request';
4
+ import { IFireplaceController } from './fireplaceController';
5
+ export interface IRequestController {
6
+ isLocked(): boolean;
7
+ unlock(): void;
8
+ lock(): void;
9
+ setAux(on: boolean): void;
10
+ setMode(mode: OperationMode): void;
11
+ setTemperature(temperature: number): void;
12
+ currentRequest(): IRequest | undefined;
13
+ }
14
+ export declare class RequestController implements IRequestController {
15
+ readonly log: Logger;
16
+ readonly fireplace: IFireplaceController;
17
+ locked: boolean;
18
+ private busy;
19
+ private scheduledRequest?;
20
+ private sendTask?;
21
+ private lockTask?;
22
+ constructor(log: Logger, fireplace: IFireplaceController, locked?: boolean);
23
+ isLocked(): boolean;
24
+ private isAllowed;
25
+ currentRequest(): IRequest | undefined;
26
+ clearScheduledLock(): void;
27
+ lock(): void;
28
+ unlock(): void;
29
+ setAux(on: boolean): void;
30
+ setMode(mode: OperationMode): void;
31
+ setTemperature(temperature: number): void;
32
+ clearScheduledTask(): void;
33
+ private scheduleRequest;
34
+ private sendRequest;
35
+ }
36
+ //# sourceMappingURL=requestController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestController.d.ts","sourceRoot":"","sources":["../../src/controllers/requestController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,IAAI,OAAO,CAAC;IACpB,MAAM,IAAI,IAAI,CAAC;IACf,IAAI,IAAI,IAAI,CAAC;IACb,MAAM,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,cAAc,IAAI,QAAQ,GAAG,SAAS,CAAC;CACxC;AAED,qBAAa,iBAAkB,YAAW,kBAAkB;aAOxC,GAAG,EAAE,MAAM;aACX,SAAS,EAAE,oBAAoB;IACxC,MAAM;IARf,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,gBAAgB,CAAC,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,CAAe;gBAGd,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,oBAAoB,EACxC,MAAM,UAAQ;IAIhB,QAAQ,IAAI,OAAO;IAI1B,OAAO,CAAC,SAAS;IAIjB,cAAc;IAId,kBAAkB;IAKlB,IAAI;IASJ,MAAM;IAON,MAAM,CAAC,EAAE,EAAE,OAAO;IAIlB,OAAO,CAAC,IAAI,EAAE,aAAa;IAI3B,cAAc,CAAC,WAAW,EAAE,MAAM;IAIlC,kBAAkB;IAKlB,OAAO,CAAC,eAAe;YAUT,WAAW;CAuB1B"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RequestController = void 0;
4
+ class RequestController {
5
+ constructor(log, fireplace, locked = false) {
6
+ this.log = log;
7
+ this.fireplace = fireplace;
8
+ this.locked = locked;
9
+ this.busy = false;
10
+ }
11
+ isLocked() {
12
+ return this.locked || this.lockTask !== undefined;
13
+ }
14
+ isAllowed() {
15
+ return !this.locked;
16
+ }
17
+ currentRequest() {
18
+ return this.scheduledRequest;
19
+ }
20
+ clearScheduledLock() {
21
+ clearInterval(this.lockTask);
22
+ this.lockTask = undefined;
23
+ }
24
+ lock() {
25
+ this.clearScheduledLock();
26
+ this.log.info('Lock control after 1 minute (makes sure that automations still run through.');
27
+ this.lockTask = setTimeout(() => {
28
+ this.locked = true;
29
+ this.log.info('Locked controls');
30
+ }, 60000);
31
+ }
32
+ unlock() {
33
+ this.clearScheduledLock();
34
+ this.locked = false;
35
+ this.log.info('Unlocked controls');
36
+ }
37
+ setAux(on) {
38
+ this.scheduleRequest({ auxOn: on });
39
+ }
40
+ setMode(mode) {
41
+ this.scheduleRequest({ mode });
42
+ }
43
+ setTemperature(temperature) {
44
+ this.scheduleRequest({ temperature });
45
+ }
46
+ clearScheduledTask() {
47
+ clearInterval(this.sendTask);
48
+ this.sendTask = undefined;
49
+ }
50
+ scheduleRequest(request) {
51
+ if (this.sendTask) {
52
+ this.clearScheduledTask();
53
+ }
54
+ const mergedRequest = this.scheduledRequest ? { ...this.scheduledRequest, ...request } : request;
55
+ this.scheduledRequest = mergedRequest;
56
+ this.sendTask = setTimeout(() => this.sendRequest(mergedRequest), 10000);
57
+ }
58
+ async sendRequest(request, retry = false) {
59
+ if (!this.busy) {
60
+ this.clearScheduledTask();
61
+ }
62
+ if (!this.isAllowed()) {
63
+ if (!retry) {
64
+ setTimeout(() => this.sendRequest(request, true), 10000);
65
+ return;
66
+ }
67
+ this.log.info('Parental controls active, action is not allowed!');
68
+ this.scheduledRequest = undefined;
69
+ return;
70
+ }
71
+ this.log.debug(`Request: ${JSON.stringify(request)}`);
72
+ this.busy = true;
73
+ const success = await this.fireplace.request(request);
74
+ if (!success) {
75
+ this.scheduleRequest(request);
76
+ }
77
+ this.scheduledRequest = undefined;
78
+ this.busy = false;
79
+ }
80
+ }
81
+ exports.RequestController = RequestController;
82
+ //# sourceMappingURL=requestController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestController.js","sourceRoot":"","sources":["../../src/controllers/requestController.ts"],"names":[],"mappings":"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"}