homebridge-carrier-infinity 1.8.1 → 1.9.0-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.
- package/.devcontainer/.uix-hb-service-homebridge-startup.json.example +5 -0
- package/.devcontainer/config.json.example +2 -1
- package/.devcontainer/setup-homebridge.sh +6 -0
- package/CLAUDE.md +28 -21
- package/dist/accessory_base.d.ts +2 -2
- package/dist/accessory_base.d.ts.map +1 -1
- package/dist/accessory_base.js.map +1 -1
- package/dist/api/graphql_client.d.ts +71 -0
- package/dist/api/graphql_client.d.ts.map +1 -0
- package/dist/api/graphql_client.js +261 -0
- package/dist/api/graphql_client.js.map +1 -0
- package/dist/api/graphql_operations.d.ts +56 -0
- package/dist/api/graphql_operations.d.ts.map +1 -0
- package/dist/api/graphql_operations.js +325 -0
- package/dist/api/graphql_operations.js.map +1 -0
- package/dist/api/interface_graphql_mutations.d.ts +149 -0
- package/dist/api/interface_graphql_mutations.d.ts.map +1 -0
- package/dist/api/interface_graphql_mutations.js +8 -0
- package/dist/api/interface_graphql_mutations.js.map +1 -0
- package/dist/api/interface_graphql_system.d.ts +287 -0
- package/dist/api/interface_graphql_system.d.ts.map +1 -0
- package/dist/api/interface_graphql_system.js +9 -0
- package/dist/api/interface_graphql_system.js.map +1 -0
- package/dist/api/models_graphql.d.ts +167 -0
- package/dist/api/models_graphql.d.ts.map +1 -0
- package/dist/api/models_graphql.js +590 -0
- package/dist/api/models_graphql.js.map +1 -0
- package/dist/api/oauth2.d.ts +45 -0
- package/dist/api/oauth2.d.ts.map +1 -0
- package/dist/api/oauth2.js +35 -0
- package/dist/api/oauth2.js.map +1 -0
- package/dist/characteristics_base.d.ts +2 -2
- package/dist/characteristics_base.d.ts.map +1 -1
- package/dist/characteristics_base.js.map +1 -1
- package/dist/platform.d.ts +4 -4
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +7 -12
- package/dist/platform.js.map +1 -1
- package/dist/settings.d.ts +6 -3
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +7 -4
- package/dist/settings.js.map +1 -1
- package/eslint.config.mjs +93 -2
- package/package.json +3 -6
- package/dist/api/comodo-aaa-root.pem +0 -25
- package/dist/api/interface_config.d.ts +0 -185
- package/dist/api/interface_config.d.ts.map +0 -1
- package/dist/api/interface_config.js +0 -5
- package/dist/api/interface_config.js.map +0 -1
- package/dist/api/interface_locations.d.ts +0 -45
- package/dist/api/interface_locations.d.ts.map +0 -1
- package/dist/api/interface_locations.js +0 -5
- package/dist/api/interface_locations.js.map +0 -1
- package/dist/api/interface_profile.d.ts +0 -80
- package/dist/api/interface_profile.d.ts.map +0 -1
- package/dist/api/interface_profile.js +0 -5
- package/dist/api/interface_profile.js.map +0 -1
- package/dist/api/interface_status.d.ts +0 -90
- package/dist/api/interface_status.d.ts.map +0 -1
- package/dist/api/interface_status.js +0 -5
- package/dist/api/interface_status.js.map +0 -1
- package/dist/api/models.d.ts +0 -111
- package/dist/api/models.d.ts.map +0 -1
- package/dist/api/models.js +0 -572
- package/dist/api/models.js.map +0 -1
- package/dist/api/oauth.d.ts +0 -6
- package/dist/api/oauth.d.ts.map +0 -1
- package/dist/api/oauth.js +0 -49
- package/dist/api/oauth.js.map +0 -1
- package/dist/api/rest_client.d.ts +0 -15
- package/dist/api/rest_client.d.ts.map +0 -1
- package/dist/api/rest_client.js +0 -135
- package/dist/api/rest_client.js.map +0 -1
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GraphQL-based Models for Carrier Infinity API
|
|
4
|
+
*
|
|
5
|
+
* This file implements the same model interfaces as models.ts but uses
|
|
6
|
+
* the GraphQL API instead of the REST API. The public API remains unchanged
|
|
7
|
+
* to maintain backward compatibility with accessory and characteristic code.
|
|
8
|
+
*/
|
|
9
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
10
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
11
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
12
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
13
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
14
|
+
};
|
|
15
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
16
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.SystemModelGraphQL = exports.SystemConfigModelGraphQL = exports.SystemConfigModelReadOnlyGraphQL = exports.SystemStatusModelGraphQL = exports.SystemProfileModelGraphQL = exports.LocationsModelGraphQL = void 0;
|
|
20
|
+
const helpers_1 = require("../helpers");
|
|
21
|
+
const typescript_memoize_1 = require("typescript-memoize");
|
|
22
|
+
const async_mutex_1 = require("async-mutex");
|
|
23
|
+
const object_hash_1 = __importDefault(require("object-hash"));
|
|
24
|
+
const helper_logging_1 = require("../helper_logging");
|
|
25
|
+
const axios_1 = __importDefault(require("axios"));
|
|
26
|
+
const events_1 = __importDefault(require("events"));
|
|
27
|
+
const graphql_operations_1 = require("./graphql_operations");
|
|
28
|
+
const constants_1 = require("./constants");
|
|
29
|
+
/**
|
|
30
|
+
* Base model for GraphQL API interactions
|
|
31
|
+
*
|
|
32
|
+
* Similar to the old BaseModel but works with GraphQL and JSON instead of REST and XML
|
|
33
|
+
*/
|
|
34
|
+
class BaseModelGraphQL {
|
|
35
|
+
constructor(graphql_client) {
|
|
36
|
+
this.graphql_client = graphql_client;
|
|
37
|
+
this.HASH_IGNORE_KEYS = new Set();
|
|
38
|
+
this.log = new helper_logging_1.PrefixLogger(this.graphql_client.log, 'API');
|
|
39
|
+
this.write_lock = new async_mutex_1.Mutex();
|
|
40
|
+
}
|
|
41
|
+
hashDataObject(data) {
|
|
42
|
+
return (0, object_hash_1.default)(data || this.data_object, { excludeKeys: (key) => {
|
|
43
|
+
return this.HASH_IGNORE_KEYS.has(key);
|
|
44
|
+
} });
|
|
45
|
+
}
|
|
46
|
+
async fetch() {
|
|
47
|
+
// If push is ongoing, skip this update fetch. The push will do a fetch.
|
|
48
|
+
try {
|
|
49
|
+
await (0, async_mutex_1.tryAcquire)(this.write_lock).runExclusive(async () => {
|
|
50
|
+
await this.forceFetch();
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
if (e === async_mutex_1.E_ALREADY_LOCKED) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
else if (e === async_mutex_1.E_TIMEOUT || e === async_mutex_1.E_CANCELED) {
|
|
58
|
+
this.log.error(`Deadlock on fetch ${e}. Report bug: https://bit.ly/3igbU7D`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const errorMessage = axios_1.default.isAxiosError(e) ? e.message : String(e);
|
|
62
|
+
this.log.error('Failed to fetch updates: ', errorMessage);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
__decorate([
|
|
68
|
+
(0, typescript_memoize_1.MemoizeExpiring)(10 * 1000)
|
|
69
|
+
], BaseModelGraphQL.prototype, "fetch", null);
|
|
70
|
+
/**
|
|
71
|
+
* Locations Model - GraphQL Version
|
|
72
|
+
*
|
|
73
|
+
* Fetches user information and discovers available systems
|
|
74
|
+
*/
|
|
75
|
+
class LocationsModelGraphQL extends BaseModelGraphQL {
|
|
76
|
+
async forceFetch() {
|
|
77
|
+
const response = await this.graphql_client.query(graphql_operations_1.GET_USER, { userName: this.graphql_client.username });
|
|
78
|
+
this.data_object = response;
|
|
79
|
+
this.data_object_hash = this.hashDataObject(response);
|
|
80
|
+
}
|
|
81
|
+
async getSystems() {
|
|
82
|
+
await this.fetch();
|
|
83
|
+
const systems = [];
|
|
84
|
+
// Extract serial numbers from user locations
|
|
85
|
+
for (const location of this.data_object.user.locations) {
|
|
86
|
+
for (const system of location.systems) {
|
|
87
|
+
systems.push(system.profile.serial);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return systems;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.LocationsModelGraphQL = LocationsModelGraphQL;
|
|
94
|
+
/**
|
|
95
|
+
* Unified System Model - GraphQL Version
|
|
96
|
+
*
|
|
97
|
+
* This model fetches all system data (profile + status + config) in a single GraphQL query.
|
|
98
|
+
* The old REST API required 3 separate calls. This unified approach is more efficient.
|
|
99
|
+
*/
|
|
100
|
+
class UnifiedSystemModelGraphQL extends BaseModelGraphQL {
|
|
101
|
+
constructor(graphql_client, serialNumber, log, events) {
|
|
102
|
+
super(graphql_client);
|
|
103
|
+
this.graphql_client = graphql_client;
|
|
104
|
+
this.serialNumber = serialNumber;
|
|
105
|
+
this.log = log;
|
|
106
|
+
this.events = events;
|
|
107
|
+
this.HASH_IGNORE_KEYS = new Set(['timestamp', 'localTime', 'etag']);
|
|
108
|
+
this.last_updated = 0;
|
|
109
|
+
}
|
|
110
|
+
async forceFetch() {
|
|
111
|
+
const old_hash = this.data_object_hash;
|
|
112
|
+
// Single GraphQL query fetches profile, status, AND config
|
|
113
|
+
const response = await this.graphql_client.query(graphql_operations_1.GET_INFINITY_SYSTEMS, { userName: this.graphql_client.username });
|
|
114
|
+
// Find our system in the response
|
|
115
|
+
const system = response.infinitySystems.find(s => s.profile.serial === this.serialNumber);
|
|
116
|
+
if (!system) {
|
|
117
|
+
throw new Error(`System ${this.serialNumber} not found in GraphQL response`);
|
|
118
|
+
}
|
|
119
|
+
this.data_object = system;
|
|
120
|
+
const new_hash = this.hashDataObject(system);
|
|
121
|
+
this.data_object_hash = new_hash;
|
|
122
|
+
// Update timestamp
|
|
123
|
+
if (system.status.localTime) {
|
|
124
|
+
this.last_updated = Date.parse(system.status.localTime);
|
|
125
|
+
this.log.debug(`TIMESTAMP reports ${system.status.localTime} (${this.last_updated})`);
|
|
126
|
+
}
|
|
127
|
+
// Emit events if data changed (for backward compatibility with old model)
|
|
128
|
+
if (old_hash !== new_hash) {
|
|
129
|
+
// Emit granular events for each section
|
|
130
|
+
// Accessories subscribe to these specific events
|
|
131
|
+
this.events.emit('updated_system_profile');
|
|
132
|
+
this.events.emit('updated_status');
|
|
133
|
+
this.events.emit('updated_config');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Direct accessors for internal use by facade models
|
|
137
|
+
getProfile() {
|
|
138
|
+
return this.data_object.profile;
|
|
139
|
+
}
|
|
140
|
+
getStatus() {
|
|
141
|
+
return this.data_object.status;
|
|
142
|
+
}
|
|
143
|
+
getConfig() {
|
|
144
|
+
return this.data_object.config;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* System Profile Model - GraphQL Facade
|
|
149
|
+
*
|
|
150
|
+
* Maintains the same public API as the old SystemProfileModel but delegates
|
|
151
|
+
* to the UnifiedSystemModelGraphQL internally. No changes needed in accessory code.
|
|
152
|
+
*/
|
|
153
|
+
class SystemProfileModelGraphQL {
|
|
154
|
+
constructor(unified) {
|
|
155
|
+
this.unified = unified;
|
|
156
|
+
}
|
|
157
|
+
async fetch() {
|
|
158
|
+
await this.unified.fetch();
|
|
159
|
+
}
|
|
160
|
+
async getName() {
|
|
161
|
+
await this.fetch();
|
|
162
|
+
return this.unified.getProfile().name;
|
|
163
|
+
}
|
|
164
|
+
async getBrand() {
|
|
165
|
+
await this.fetch();
|
|
166
|
+
return this.unified.getProfile().brand;
|
|
167
|
+
}
|
|
168
|
+
async getModel() {
|
|
169
|
+
await this.fetch();
|
|
170
|
+
return this.unified.getProfile().model;
|
|
171
|
+
}
|
|
172
|
+
async getFirmware() {
|
|
173
|
+
await this.fetch();
|
|
174
|
+
return this.unified.getProfile().firmware;
|
|
175
|
+
}
|
|
176
|
+
async getZones() {
|
|
177
|
+
await this.fetch();
|
|
178
|
+
const status = this.unified.getStatus();
|
|
179
|
+
// Return zones that are enabled
|
|
180
|
+
return status.zones
|
|
181
|
+
.filter(zone => zone.enabled === constants_1.STATUS.ON)
|
|
182
|
+
.map(zone => zone.id);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
exports.SystemProfileModelGraphQL = SystemProfileModelGraphQL;
|
|
186
|
+
/**
|
|
187
|
+
* System Status Model - GraphQL Facade
|
|
188
|
+
*
|
|
189
|
+
* Maintains the same public API as the old SystemStatusModel
|
|
190
|
+
*/
|
|
191
|
+
class SystemStatusModelGraphQL {
|
|
192
|
+
constructor(unified) {
|
|
193
|
+
this.unified = unified;
|
|
194
|
+
}
|
|
195
|
+
async fetch() {
|
|
196
|
+
await this.unified.fetch();
|
|
197
|
+
}
|
|
198
|
+
async getUnits() {
|
|
199
|
+
await this.fetch();
|
|
200
|
+
return this.unified.getStatus().cfgem;
|
|
201
|
+
}
|
|
202
|
+
async getOutdoorTemp() {
|
|
203
|
+
await this.fetch();
|
|
204
|
+
return Number(this.unified.getStatus().oat);
|
|
205
|
+
}
|
|
206
|
+
async getFilterUsed() {
|
|
207
|
+
await this.fetch();
|
|
208
|
+
return Number(this.unified.getStatus().filtrlvl);
|
|
209
|
+
}
|
|
210
|
+
async getMode() {
|
|
211
|
+
await this.fetch();
|
|
212
|
+
const raw_mode = this.unified.getStatus().mode;
|
|
213
|
+
switch (raw_mode) {
|
|
214
|
+
case 'gasheat':
|
|
215
|
+
case 'electric':
|
|
216
|
+
case 'hpheat':
|
|
217
|
+
return constants_1.SYSTEM_MODE.HEAT;
|
|
218
|
+
case 'dehumidify':
|
|
219
|
+
return constants_1.SYSTEM_MODE.COOL;
|
|
220
|
+
default:
|
|
221
|
+
return raw_mode;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
getZone(zone) {
|
|
225
|
+
const zones = this.unified.getStatus().zones;
|
|
226
|
+
const found = zones.find(z => z.id === zone.toString());
|
|
227
|
+
if (!found) {
|
|
228
|
+
throw new Error(`Zone ${zone} not found in status`);
|
|
229
|
+
}
|
|
230
|
+
return found;
|
|
231
|
+
}
|
|
232
|
+
async getZoneConditioning(zone) {
|
|
233
|
+
await this.fetch();
|
|
234
|
+
const raw_mode = this.getZone(zone).zoneconditioning;
|
|
235
|
+
switch (raw_mode) {
|
|
236
|
+
case 'active_heat':
|
|
237
|
+
case 'prep_heat':
|
|
238
|
+
case 'pending_heat':
|
|
239
|
+
return constants_1.SYSTEM_MODE.HEAT;
|
|
240
|
+
case 'active_cool':
|
|
241
|
+
case 'prep_cool':
|
|
242
|
+
case 'pending_cool':
|
|
243
|
+
return constants_1.SYSTEM_MODE.COOL;
|
|
244
|
+
case 'idle':
|
|
245
|
+
return constants_1.SYSTEM_MODE.OFF;
|
|
246
|
+
default:
|
|
247
|
+
return raw_mode;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async getZoneFan(zone) {
|
|
251
|
+
await this.fetch();
|
|
252
|
+
const zone_obj = this.getZone(zone);
|
|
253
|
+
// Note: In GraphQL API, damperposition is not in status, check fan directly
|
|
254
|
+
return zone_obj.fan;
|
|
255
|
+
}
|
|
256
|
+
async getZoneOpen(zone) {
|
|
257
|
+
await this.fetch();
|
|
258
|
+
const zone_obj = this.getZone(zone);
|
|
259
|
+
// Zone is open if enabled
|
|
260
|
+
return zone_obj.enabled === constants_1.STATUS.ON;
|
|
261
|
+
}
|
|
262
|
+
async getZoneTemp(zone) {
|
|
263
|
+
await this.fetch();
|
|
264
|
+
return Number(this.getZone(zone).rt);
|
|
265
|
+
}
|
|
266
|
+
async getZoneHumidity(zone) {
|
|
267
|
+
await this.fetch();
|
|
268
|
+
return Number(this.getZone(zone).rh);
|
|
269
|
+
}
|
|
270
|
+
async getZoneActivity(zone) {
|
|
271
|
+
await this.fetch();
|
|
272
|
+
return this.getZone(zone).currentActivity;
|
|
273
|
+
}
|
|
274
|
+
async getZoneCoolSetpoint(zone) {
|
|
275
|
+
await this.fetch();
|
|
276
|
+
return Number(this.getZone(zone).clsp);
|
|
277
|
+
}
|
|
278
|
+
async getZoneHeatSetpoint(zone) {
|
|
279
|
+
await this.fetch();
|
|
280
|
+
return Number(this.getZone(zone).htsp);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
exports.SystemStatusModelGraphQL = SystemStatusModelGraphQL;
|
|
284
|
+
/**
|
|
285
|
+
* System Config Model (Read-Only) - GraphQL Facade
|
|
286
|
+
*
|
|
287
|
+
* Maintains the same public API as the old SystemConfigModelReadOnly
|
|
288
|
+
*/
|
|
289
|
+
class SystemConfigModelReadOnlyGraphQL {
|
|
290
|
+
constructor(unified, log) {
|
|
291
|
+
this.unified = unified;
|
|
292
|
+
this.log = log;
|
|
293
|
+
}
|
|
294
|
+
async fetch() {
|
|
295
|
+
await this.unified.fetch();
|
|
296
|
+
}
|
|
297
|
+
async getUnits() {
|
|
298
|
+
await this.fetch();
|
|
299
|
+
return this.unified.getConfig().cfgem;
|
|
300
|
+
}
|
|
301
|
+
async getTempBounds() {
|
|
302
|
+
await this.fetch();
|
|
303
|
+
// GraphQL API may not have utilityEvent, use sensible defaults
|
|
304
|
+
// TODO: Find where temperature bounds are in GraphQL schema
|
|
305
|
+
return [50, 90]; // Default bounds in Fahrenheit
|
|
306
|
+
}
|
|
307
|
+
async getMode() {
|
|
308
|
+
await this.fetch();
|
|
309
|
+
return this.unified.getConfig().mode;
|
|
310
|
+
}
|
|
311
|
+
getZone(zone) {
|
|
312
|
+
const zones = this.unified.getConfig().zones;
|
|
313
|
+
const found = zones.find(z => z.id === zone.toString());
|
|
314
|
+
if (!found) {
|
|
315
|
+
throw new Error(`Zone ${zone} not found in config`);
|
|
316
|
+
}
|
|
317
|
+
return found;
|
|
318
|
+
}
|
|
319
|
+
async getZoneName(zone) {
|
|
320
|
+
await this.fetch();
|
|
321
|
+
return this.getZone(zone).name;
|
|
322
|
+
}
|
|
323
|
+
async getZoneHoldStatus(zone) {
|
|
324
|
+
await this.fetch();
|
|
325
|
+
const zone_obj = this.getZone(zone);
|
|
326
|
+
return [zone_obj.hold, zone_obj.otmr || ''];
|
|
327
|
+
}
|
|
328
|
+
getZoneActivityInternal(zone) {
|
|
329
|
+
const zone_obj = this.getZone(zone);
|
|
330
|
+
if (zone_obj.hold === constants_1.STATUS.ON) {
|
|
331
|
+
return zone_obj.holdActivity || constants_1.ACTIVITY.HOME;
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
const now = new Date();
|
|
335
|
+
const program_obj = zone_obj.program;
|
|
336
|
+
const today_schedule = program_obj.day[now.getDay()].period
|
|
337
|
+
.filter(period => period.enabled === constants_1.STATUS.ON)
|
|
338
|
+
.reverse();
|
|
339
|
+
for (const period of today_schedule) {
|
|
340
|
+
const time = period.time;
|
|
341
|
+
const [hours, minutes] = time.split(':').map(Number);
|
|
342
|
+
if (hours < now.getHours() ||
|
|
343
|
+
(hours === now.getHours() && minutes < now.getMinutes())) {
|
|
344
|
+
return period.activity;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// If we got to the end, activity is the last from yesterday
|
|
348
|
+
const yesterday_schedule = program_obj.day[(now.getDay() + 6) % 7].period
|
|
349
|
+
.filter(period => period.enabled === constants_1.STATUS.ON)
|
|
350
|
+
.reverse();
|
|
351
|
+
return yesterday_schedule[0].activity;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
async getZoneActivity(zone) {
|
|
355
|
+
await this.fetch();
|
|
356
|
+
return this.getZoneActivityInternal(zone);
|
|
357
|
+
}
|
|
358
|
+
getZoneActivityConfig(zone, activity_name) {
|
|
359
|
+
const config = this.unified.getConfig();
|
|
360
|
+
// Vacation is stored at system level
|
|
361
|
+
if (activity_name === constants_1.ACTIVITY.VACATION) {
|
|
362
|
+
return {
|
|
363
|
+
id: constants_1.ACTIVITY.VACATION,
|
|
364
|
+
zoneId: zone,
|
|
365
|
+
type: constants_1.ACTIVITY.VACATION,
|
|
366
|
+
clsp: config.vacmaxt,
|
|
367
|
+
htsp: config.vacmint,
|
|
368
|
+
fan: config.vacfan,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
const zone_obj = this.getZone(zone);
|
|
372
|
+
const activity = zone_obj.activities.find(a => a.type === activity_name);
|
|
373
|
+
if (!activity) {
|
|
374
|
+
throw new Error(`Activity ${activity_name} not found for zone ${zone}`);
|
|
375
|
+
}
|
|
376
|
+
return activity;
|
|
377
|
+
}
|
|
378
|
+
async getZoneActivityFan(zone, activity) {
|
|
379
|
+
await this.fetch();
|
|
380
|
+
return this.getZoneActivityConfig(zone, activity).fan;
|
|
381
|
+
}
|
|
382
|
+
async getZoneActivityCoolSetpoint(zone, activity) {
|
|
383
|
+
await this.fetch();
|
|
384
|
+
return Number(this.getZoneActivityConfig(zone, activity).clsp);
|
|
385
|
+
}
|
|
386
|
+
async getZoneActivityHeatSetpoint(zone, activity) {
|
|
387
|
+
await this.fetch();
|
|
388
|
+
return Number(this.getZoneActivityConfig(zone, activity).htsp);
|
|
389
|
+
}
|
|
390
|
+
async getZoneNextActivityTime(zone) {
|
|
391
|
+
await this.fetch();
|
|
392
|
+
const now = new Date();
|
|
393
|
+
const program_obj = this.getZone(zone).program;
|
|
394
|
+
const day_obj = program_obj.day[now.getDay()];
|
|
395
|
+
for (const period of day_obj.period) {
|
|
396
|
+
const time = period.time;
|
|
397
|
+
const [hours, minutes] = time.split(':').map(Number);
|
|
398
|
+
if (hours > now.getHours() ||
|
|
399
|
+
(hours === now.getHours() && minutes > now.getMinutes())) {
|
|
400
|
+
return time;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// Next activity is first from tomorrow
|
|
404
|
+
const tomorrow_obj = program_obj.day[(now.getDay() + 1) % 7];
|
|
405
|
+
return tomorrow_obj.period[0].time;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
exports.SystemConfigModelReadOnlyGraphQL = SystemConfigModelReadOnlyGraphQL;
|
|
409
|
+
/**
|
|
410
|
+
* System Config Model (Writable) - GraphQL Version
|
|
411
|
+
*
|
|
412
|
+
* Handles mutations to system configuration via GraphQL mutations
|
|
413
|
+
*/
|
|
414
|
+
class SystemConfigModelGraphQL extends SystemConfigModelReadOnlyGraphQL {
|
|
415
|
+
constructor(unified, graphql_client, log, events) {
|
|
416
|
+
super(unified, log);
|
|
417
|
+
this.unified = unified;
|
|
418
|
+
this.graphql_client = graphql_client;
|
|
419
|
+
this.log = log;
|
|
420
|
+
this.events = events;
|
|
421
|
+
this.mutations = [];
|
|
422
|
+
}
|
|
423
|
+
// Skip fetching new data when we have a dirty local state
|
|
424
|
+
async fetch() {
|
|
425
|
+
if (this.mutations.length > 0) {
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
await super.fetch();
|
|
429
|
+
}
|
|
430
|
+
async push() {
|
|
431
|
+
// Emit local mutation event for immediate HK updates
|
|
432
|
+
this.events.emit(constants_1.SUBSCRIPTION.CONFIG_MUTATE);
|
|
433
|
+
// Wait a bit to batch mutations
|
|
434
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
435
|
+
// Cancel any pending pushes
|
|
436
|
+
const write_lock = this.unified.write_lock;
|
|
437
|
+
write_lock.cancel();
|
|
438
|
+
try {
|
|
439
|
+
await write_lock.runExclusive(async () => {
|
|
440
|
+
if (this.mutations.length === 0) {
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
// Refresh data first
|
|
444
|
+
await this.unified.fetch();
|
|
445
|
+
const config = this.unified.getConfig();
|
|
446
|
+
const status = this.unified.getStatus();
|
|
447
|
+
// Apply all queued mutations
|
|
448
|
+
while (this.mutations.length > 0) {
|
|
449
|
+
const mutation = this.mutations.shift();
|
|
450
|
+
if (mutation) {
|
|
451
|
+
const input = mutation(config, status);
|
|
452
|
+
await this.executeMutation(input);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
this.log.info('... pushing changes complete.');
|
|
456
|
+
// Wait for propagation
|
|
457
|
+
await new Promise(r => setTimeout(r, 5000));
|
|
458
|
+
// Refresh to confirm
|
|
459
|
+
if (this.mutations.length === 0) {
|
|
460
|
+
await this.unified.fetch();
|
|
461
|
+
this.log.debug('Successful propagation to carrier api is confirmed.');
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
catch (e) {
|
|
466
|
+
if (e === async_mutex_1.E_CANCELED) {
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
else if (e === async_mutex_1.E_TIMEOUT || e === async_mutex_1.E_ALREADY_LOCKED) {
|
|
470
|
+
this.log.error(`Deadlock on push ${e}. Report bug: https://bit.ly/3igbU7D`);
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
const errorMessage = axios_1.default.isAxiosError(e) ? e.message : String(e);
|
|
474
|
+
this.log.error('Failed to push updates: ', errorMessage);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
async executeMutation(input) {
|
|
479
|
+
// Determine mutation type based on input properties
|
|
480
|
+
if ('mode' in input && !('zoneId' in input)) {
|
|
481
|
+
// System config mutation
|
|
482
|
+
await this.graphql_client.mutate(graphql_operations_1.UPDATE_INFINITY_CONFIG, { input });
|
|
483
|
+
this.log.info('Executed updateInfinityConfig mutation');
|
|
484
|
+
}
|
|
485
|
+
else if ('activityType' in input) {
|
|
486
|
+
// Zone activity mutation
|
|
487
|
+
await this.graphql_client.mutate(graphql_operations_1.UPDATE_INFINITY_ZONE_ACTIVITY, { input });
|
|
488
|
+
this.log.info('Executed updateInfinityZoneActivity mutation');
|
|
489
|
+
}
|
|
490
|
+
else if ('zoneId' in input) {
|
|
491
|
+
// Zone config mutation
|
|
492
|
+
await this.graphql_client.mutate(graphql_operations_1.UPDATE_INFINITY_ZONE_CONFIG, { input });
|
|
493
|
+
this.log.info('Executed updateInfinityZoneConfig mutation');
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
this.log.error('Unknown mutation type:', input);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
async setMode(mode) {
|
|
500
|
+
this.log.debug('Setting mode to ' + mode);
|
|
501
|
+
const m = (config, status) => {
|
|
502
|
+
return {
|
|
503
|
+
serial: this.unified.serialNumber,
|
|
504
|
+
mode,
|
|
505
|
+
};
|
|
506
|
+
};
|
|
507
|
+
this.mutations.push(m);
|
|
508
|
+
this.push();
|
|
509
|
+
}
|
|
510
|
+
async setZoneActivityHold(zone, activity, hold_until) {
|
|
511
|
+
this.log.debug(`Setting zone ${zone} activity to ${activity} until ${hold_until}`);
|
|
512
|
+
const m = (config, status) => {
|
|
513
|
+
return {
|
|
514
|
+
serial: this.unified.serialNumber,
|
|
515
|
+
zoneId: zone,
|
|
516
|
+
hold: activity ? constants_1.STATUS.ON : constants_1.STATUS.OFF,
|
|
517
|
+
holdActivity: activity || null,
|
|
518
|
+
otmr: activity ? hold_until : null,
|
|
519
|
+
};
|
|
520
|
+
};
|
|
521
|
+
this.mutations.push(m);
|
|
522
|
+
this.push();
|
|
523
|
+
}
|
|
524
|
+
async setZoneActivityManualHold(zone, clsp, htsp, hold_until, fan = null) {
|
|
525
|
+
this.log.debug(`Setting zone ${zone} to`, clsp ? `clsp=${clsp}` : '', htsp ? `htsp=${htsp}` : '', fan ? `fan=${fan}` : '', '.');
|
|
526
|
+
// First, update the MANUAL activity setpoints
|
|
527
|
+
const m1 = (config, status) => {
|
|
528
|
+
const zone_obj = config.zones.find(z => z.id === zone);
|
|
529
|
+
const manual_activity = zone_obj === null || zone_obj === void 0 ? void 0 : zone_obj.activities.find(a => a.type === constants_1.ACTIVITY.MANUAL);
|
|
530
|
+
if (!manual_activity) {
|
|
531
|
+
throw new Error(`MANUAL activity not found for zone ${zone}`);
|
|
532
|
+
}
|
|
533
|
+
// Get current setpoints as defaults
|
|
534
|
+
let current_htsp = Number(manual_activity.htsp);
|
|
535
|
+
let current_clsp = Number(manual_activity.clsp);
|
|
536
|
+
const current_fan = manual_activity.fan;
|
|
537
|
+
// Apply deadband processing
|
|
538
|
+
[current_htsp, current_clsp] = (0, helpers_1.processSetpointDeadband)(htsp !== null ? htsp : current_htsp, clsp !== null ? clsp : current_clsp, config.cfgem, htsp === null);
|
|
539
|
+
return {
|
|
540
|
+
serial: this.unified.serialNumber,
|
|
541
|
+
zoneId: zone,
|
|
542
|
+
activityType: constants_1.ACTIVITY.MANUAL,
|
|
543
|
+
htsp: current_htsp.toFixed(1),
|
|
544
|
+
clsp: current_clsp.toFixed(1),
|
|
545
|
+
fan: fan || current_fan,
|
|
546
|
+
};
|
|
547
|
+
};
|
|
548
|
+
// Then, set hold to MANUAL activity
|
|
549
|
+
const m2 = (config, status) => {
|
|
550
|
+
return {
|
|
551
|
+
serial: this.unified.serialNumber,
|
|
552
|
+
zoneId: zone,
|
|
553
|
+
hold: constants_1.STATUS.ON,
|
|
554
|
+
holdActivity: constants_1.ACTIVITY.MANUAL,
|
|
555
|
+
otmr: hold_until,
|
|
556
|
+
};
|
|
557
|
+
};
|
|
558
|
+
this.mutations.push(m1, m2);
|
|
559
|
+
this.push();
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
exports.SystemConfigModelGraphQL = SystemConfigModelGraphQL;
|
|
563
|
+
/**
|
|
564
|
+
* System Model - GraphQL Version
|
|
565
|
+
*
|
|
566
|
+
* Top-level facade that combines profile, status, and config models
|
|
567
|
+
* Maintains the same public API as the old SystemModel
|
|
568
|
+
*/
|
|
569
|
+
class SystemModelGraphQL {
|
|
570
|
+
constructor(graphql_client, serialNumber) {
|
|
571
|
+
this.graphql_client = graphql_client;
|
|
572
|
+
this.serialNumber = serialNumber;
|
|
573
|
+
this.log = new helper_logging_1.PrefixLogger(this.graphql_client.log, this.serialNumber);
|
|
574
|
+
this.events = new events_1.default().setMaxListeners(100);
|
|
575
|
+
const api_logger = new helper_logging_1.PrefixLogger(this.log, 'API');
|
|
576
|
+
// Create unified model that fetches all data
|
|
577
|
+
this.unified = new UnifiedSystemModelGraphQL(graphql_client, serialNumber, api_logger, this.events);
|
|
578
|
+
// Create facade models that delegate to unified model
|
|
579
|
+
this.status = new SystemStatusModelGraphQL(this.unified);
|
|
580
|
+
this.profile = new SystemProfileModelGraphQL(this.unified);
|
|
581
|
+
this.config = new SystemConfigModelGraphQL(this.unified, graphql_client, api_logger, this.events);
|
|
582
|
+
// Periodically fetch to keep data fresh
|
|
583
|
+
// Note: No activate() call needed with GraphQL API
|
|
584
|
+
setInterval(() => {
|
|
585
|
+
this.status.fetch();
|
|
586
|
+
}, 30 * 60 * 1000); // every 30 min
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
exports.SystemModelGraphQL = SystemModelGraphQL;
|
|
590
|
+
//# sourceMappingURL=models_graphql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models_graphql.js","sourceRoot":"","sources":["../../src/api/models_graphql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.0 Authentication Helpers for Carrier Infinity GraphQL API
|
|
3
|
+
*
|
|
4
|
+
* This replaces the old OAuth 1.0 HMAC signature-based authentication
|
|
5
|
+
* with simple OAuth 2.0 Bearer token authentication via Okta.
|
|
6
|
+
*/
|
|
7
|
+
import { InternalAxiosRequestConfig } from 'axios';
|
|
8
|
+
/**
|
|
9
|
+
* OAuth 2.0 token response from assistedLogin mutation
|
|
10
|
+
*/
|
|
11
|
+
export interface OAuth2TokenResponse {
|
|
12
|
+
token_type: string;
|
|
13
|
+
expires_in: number;
|
|
14
|
+
access_token: string;
|
|
15
|
+
scope: string;
|
|
16
|
+
refresh_token: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* OAuth 2.0 token refresh response from Okta endpoint
|
|
20
|
+
*/
|
|
21
|
+
export interface OAuth2RefreshResponse {
|
|
22
|
+
token_type: string;
|
|
23
|
+
expires_in: number;
|
|
24
|
+
access_token: string;
|
|
25
|
+
scope: string;
|
|
26
|
+
refresh_token?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* OAuth2Headers - Simple Bearer token injection for authenticated requests
|
|
30
|
+
*
|
|
31
|
+
* This is much simpler than the old OAuth 1.0 implementation which required
|
|
32
|
+
* HMAC-SHA1 signatures, nonces, timestamps, and complex header generation.
|
|
33
|
+
*/
|
|
34
|
+
export declare class OAuth2Headers {
|
|
35
|
+
/**
|
|
36
|
+
* Inject Bearer token into Axios request config
|
|
37
|
+
*
|
|
38
|
+
* @param config - Axios request configuration
|
|
39
|
+
* @param access_token - OAuth 2.0 access token
|
|
40
|
+
* @param token_type - OAuth 2.0 token type (usually "Bearer")
|
|
41
|
+
* @returns Modified request config with Authorization header
|
|
42
|
+
*/
|
|
43
|
+
static intercept(config: InternalAxiosRequestConfig, access_token: string, token_type?: string): InternalAxiosRequestConfig;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=oauth2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth2.d.ts","sourceRoot":"","sources":["../../src/api/oauth2.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,qBAAa,aAAa;IACxB;;;;;;;OAOG;IACH,MAAM,CAAC,SAAS,CACd,MAAM,EAAE,0BAA0B,EAClC,YAAY,EAAE,MAAM,EACpB,UAAU,GAAE,MAAiB,GAC5B,0BAA0B;CAU9B"}
|