trane-thermostat-api 1.0.0 → 1.0.2
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/LICENSE +1 -1
- package/README.md +11 -20
- package/dist/client/auth.d.ts.map +1 -1
- package/dist/client/auth.js +27 -13
- package/dist/client/auth.js.map +1 -1
- package/dist/client/nexia-client.d.ts +3 -3
- package/dist/client/trane-client.d.ts +49 -0
- package/dist/client/trane-client.d.ts.map +1 -0
- package/dist/client/trane-client.js +332 -0
- package/dist/client/trane-client.js.map +1 -0
- package/dist/devices/nexia-thermostat.d.ts +2 -2
- package/dist/devices/nexia-zone.d.ts +3 -3
- package/dist/devices/trane-automation.d.ts +15 -0
- package/dist/devices/trane-automation.d.ts.map +1 -0
- package/dist/devices/trane-automation.js +39 -0
- package/dist/devices/trane-automation.js.map +1 -0
- package/dist/devices/trane-sensor.d.ts +34 -0
- package/dist/devices/trane-sensor.d.ts.map +1 -0
- package/dist/devices/trane-sensor.js +152 -0
- package/dist/devices/trane-sensor.js.map +1 -0
- package/dist/devices/trane-thermostat.d.ts +74 -0
- package/dist/devices/trane-thermostat.d.ts.map +1 -0
- package/dist/devices/trane-thermostat.js +457 -0
- package/dist/devices/trane-thermostat.js.map +1 -0
- package/dist/devices/trane-zone.d.ts +61 -0
- package/dist/devices/trane-zone.d.ts.map +1 -0
- package/dist/devices/trane-zone.js +370 -0
- package/dist/devices/trane-zone.js.map +1 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +11 -11
- package/dist/types/api.d.ts +36 -6
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/constants.d.ts +2 -5
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/constants.js +3 -6
- package/dist/types/constants.js.map +1 -1
- package/dist/types/interfaces.d.ts +23 -23
- package/dist/utils/errors.d.ts +13 -13
- package/dist/utils/errors.js +21 -21
- package/dist/utils/validation.d.ts +1 -1
- package/dist/utils/validation.js +3 -3
- package/package.json +4 -8
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Trane Thermostat API
|
|
2
2
|
|
|
3
|
-
A TypeScript/Node.js library for controlling
|
|
3
|
+
A TypeScript/Node.js library for controlling Trane thermostats via the Trane Home API.
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
7
|
-
This library provides
|
|
7
|
+
This library provides:
|
|
8
8
|
|
|
9
9
|
- **Full TypeScript support** with comprehensive type definitions
|
|
10
10
|
- **Homebridge-optimized** architecture for seamless HomeKit integration
|
|
@@ -15,9 +15,7 @@ This library provides a complete rewrite of the Python Nexia library in TypeScri
|
|
|
15
15
|
|
|
16
16
|
## Supported Devices
|
|
17
17
|
|
|
18
|
-
- **
|
|
19
|
-
- **Trane Thermostats**: Compatible with Nexia API
|
|
20
|
-
- **American Standard**: Compatible with Nexia API
|
|
18
|
+
- **Trane Thermostats**: XL850, XL950, XL1050, XL824, and other Trane Home compatible models
|
|
21
19
|
|
|
22
20
|
## Features
|
|
23
21
|
|
|
@@ -45,7 +43,6 @@ This library provides a complete rewrite of the Python Nexia library in TypeScri
|
|
|
45
43
|
- ETag-based caching for efficient API usage
|
|
46
44
|
- Automatic session management and re-authentication
|
|
47
45
|
- Rate-limited login attempts to prevent account lockout
|
|
48
|
-
- Brand-specific URL handling (Nexia, Trane, American Standard)
|
|
49
46
|
- Comprehensive device capability detection
|
|
50
47
|
|
|
51
48
|
## Installation
|
|
@@ -57,12 +54,11 @@ npm install trane-thermostat-api
|
|
|
57
54
|
## Quick Start
|
|
58
55
|
|
|
59
56
|
```typescript
|
|
60
|
-
import {
|
|
57
|
+
import { TraneClient } from 'trane-thermostat-api';
|
|
61
58
|
|
|
62
|
-
const client = new
|
|
59
|
+
const client = new TraneClient({
|
|
63
60
|
username: 'your-email@example.com',
|
|
64
|
-
password: 'your-password'
|
|
65
|
-
brand: BrandType.NEXIA
|
|
61
|
+
password: 'your-password'
|
|
66
62
|
});
|
|
67
63
|
|
|
68
64
|
// Authenticate and discover devices
|
|
@@ -85,16 +81,16 @@ await zone.setTemperatures({
|
|
|
85
81
|
|
|
86
82
|
### Core Classes
|
|
87
83
|
|
|
88
|
-
####
|
|
84
|
+
#### TraneClient
|
|
89
85
|
Main HTTP client for API communication and device discovery.
|
|
90
86
|
|
|
91
|
-
####
|
|
87
|
+
#### TraneThermostat
|
|
92
88
|
Represents a physical thermostat with full feature detection and control.
|
|
93
89
|
|
|
94
|
-
####
|
|
90
|
+
#### TraneZone
|
|
95
91
|
Represents a zone/room within a thermostat with independent temperature control.
|
|
96
92
|
|
|
97
|
-
####
|
|
93
|
+
#### TraneSensor
|
|
98
94
|
RoomIQ temperature and humidity sensor with battery monitoring.
|
|
99
95
|
|
|
100
96
|
## Homebridge Integration
|
|
@@ -127,7 +123,6 @@ The test suite includes:
|
|
|
127
123
|
- Mock HTTP responses for API testing
|
|
128
124
|
- Validation logic testing
|
|
129
125
|
- Error handling scenarios
|
|
130
|
-
- Integration tests with real API endpoints
|
|
131
126
|
|
|
132
127
|
```bash
|
|
133
128
|
npm run test:coverage
|
|
@@ -144,7 +139,3 @@ npm run test:coverage
|
|
|
144
139
|
## License
|
|
145
140
|
|
|
146
141
|
MIT License - see LICENSE file for details.
|
|
147
|
-
|
|
148
|
-
## Acknowledgments
|
|
149
|
-
|
|
150
|
-
Based on the original Python Nexia library architecture, rewritten for modern TypeScript/Node.js environments with Homebridge-specific optimizations.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/client/auth.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAgC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAgD,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAUjD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,SAAS,CAAY;gBAEjB,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU;IAazC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IA6CzC,cAAc,IAAI,OAAO;IAYnB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrC,SAAS,IAAI,MAAM,GAAG,IAAI;IAO1B,WAAW,IAAI,MAAM,GAAG,IAAI;IAO5B,aAAa,IAAI,MAAM;IAOvB,mBAAmB,IAAI,OAAO;IAOxB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAYvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/client/auth.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAgC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAgD,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAUjD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,SAAS,CAAY;gBAEjB,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU;IAazC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IA6CzC,cAAc,IAAI,OAAO;IAYnB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrC,SAAS,IAAI,MAAM,GAAG,IAAI;IAO1B,WAAW,IAAI,MAAM,GAAG,IAAI;IAO5B,aAAa,IAAI,MAAM;IAOvB,mBAAmB,IAAI,OAAO;IAOxB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAYvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAmE9E,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,gBAAgB;YAaV,SAAS;YA4BT,SAAS;YAiBT,qBAAqB;IAQnC,OAAO,CAAC,cAAc;YA8BR,YAAY;IAuB1B,OAAO,CAAC,kBAAkB;IAQnB,oBAAoB,IAAI,IAAI;CAMpC"}
|
package/dist/client/auth.js
CHANGED
|
@@ -29,17 +29,17 @@ class AuthManager {
|
|
|
29
29
|
this.checkRateLimit();
|
|
30
30
|
try {
|
|
31
31
|
const response = await this.performLogin();
|
|
32
|
-
if (response.success && response.api_key && response.mobile_id) {
|
|
33
|
-
this.authState.apiKey = response.api_key;
|
|
34
|
-
this.authState.mobileId = response.mobile_id;
|
|
32
|
+
if (response.success && response.result?.api_key && response.result?.mobile_id) {
|
|
33
|
+
this.authState.apiKey = response.result.api_key;
|
|
34
|
+
this.authState.mobileId = String(response.result.mobile_id);
|
|
35
35
|
this.authState.loginAttempts = 0;
|
|
36
36
|
this.authState.lastLoginAttempt = Date.now();
|
|
37
37
|
this.authState.sessionExpiry = Date.now() + (24 * 60 * 60 * 1000);
|
|
38
|
-
this.httpClient.setAuthHeaders(response.api_key, response.mobile_id, this.config.brand);
|
|
38
|
+
this.httpClient.setAuthHeaders(response.result.api_key, String(response.result.mobile_id), this.config.brand);
|
|
39
39
|
await this.saveState();
|
|
40
40
|
return {
|
|
41
|
-
apiKey: response.api_key,
|
|
42
|
-
mobileId: response.mobile_id,
|
|
41
|
+
apiKey: response.result.api_key,
|
|
42
|
+
mobileId: String(response.result.mobile_id),
|
|
43
43
|
success: true
|
|
44
44
|
};
|
|
45
45
|
}
|
|
@@ -53,8 +53,8 @@ class AuthManager {
|
|
|
53
53
|
if (error instanceof errors_1.AuthenticationError) {
|
|
54
54
|
throw error;
|
|
55
55
|
}
|
|
56
|
-
const
|
|
57
|
-
throw new errors_1.AuthenticationError(`Login failed: ${
|
|
56
|
+
const traneError = errors_1.ErrorHandler.handle(error);
|
|
57
|
+
throw new errors_1.AuthenticationError(`Login failed: ${traneError.message}`);
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
isSessionValid() {
|
|
@@ -103,8 +103,22 @@ class AuthManager {
|
|
|
103
103
|
}
|
|
104
104
|
try {
|
|
105
105
|
const response = await this.httpClient.post(constants_1.API_ENDPOINTS.SESSION, {});
|
|
106
|
-
if (response.data.success && response.data.result
|
|
107
|
-
const
|
|
106
|
+
if (response.data.success && response.data.result) {
|
|
107
|
+
const result = response.data.result;
|
|
108
|
+
const homes = [];
|
|
109
|
+
if (result._links?.child) {
|
|
110
|
+
for (const child of result._links.child) {
|
|
111
|
+
if (child.type === 'application/vnd.nexia.location+json' && child.data?.id) {
|
|
112
|
+
homes.push({
|
|
113
|
+
house_id: child.data.id,
|
|
114
|
+
name: child.data.name || 'Home'
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (homes.length === 0 && result.homes) {
|
|
120
|
+
homes.push(...result.homes);
|
|
121
|
+
}
|
|
108
122
|
if (homes.length === 0) {
|
|
109
123
|
throw new errors_1.AuthenticationError('No homes found in account');
|
|
110
124
|
}
|
|
@@ -127,8 +141,8 @@ class AuthManager {
|
|
|
127
141
|
if (error instanceof errors_1.AuthenticationError) {
|
|
128
142
|
throw error;
|
|
129
143
|
}
|
|
130
|
-
const
|
|
131
|
-
throw new errors_1.AuthenticationError(`Session discovery failed: ${
|
|
144
|
+
const traneError = errors_1.ErrorHandler.handle(error);
|
|
145
|
+
throw new errors_1.AuthenticationError(`Session discovery failed: ${traneError.message}`);
|
|
132
146
|
}
|
|
133
147
|
}
|
|
134
148
|
validateConfig(config) {
|
|
@@ -151,7 +165,7 @@ class AuthManager {
|
|
|
151
165
|
return this.config.stateFile;
|
|
152
166
|
}
|
|
153
167
|
const homeDir = process.env['HOME'] || process.env['USERPROFILE'] || process.cwd();
|
|
154
|
-
return (0, path_1.join)(homeDir, '.
|
|
168
|
+
return (0, path_1.join)(homeDir, '.trane', 'auth-state.json');
|
|
155
169
|
}
|
|
156
170
|
async loadState() {
|
|
157
171
|
try {
|
package/dist/client/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/client/auth.ts"],"names":[],"mappings":";;;AAKA,2BAAoC;AACpC,+BAAqC;AACrC,+BAAoC;AACpC,kDAA6E;AAG7E,4CAOyB;AAoBzB,MAAa,WAAW;IAMtB,YAAY,UAAsB,EAAE,MAAkB;QACpD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC7C,IAAI,CAAC,SAAS,GAAG;YACf,UAAU,EAAE,IAAA,SAAM,GAAE;YACpB,aAAa,EAAE,CAAC;SACjB,CAAC;IACJ,CAAC;IAKM,KAAK,CAAC,UAAU;QACrB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEf,OAAO,CAAC,IAAI,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;YAClE,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAKM,KAAK,CAAC,YAAY;QAEvB,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAE3C,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBAE/
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/client/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BrandType } from '../types/constants';
|
|
2
2
|
import { NexiaClientConfig, UpdateOptions } from '../types/api';
|
|
3
|
-
import { INexiaClient,
|
|
3
|
+
import { INexiaClient, ITraneThermostat, INexiaAutomation } from '../types/interfaces';
|
|
4
4
|
export declare class NexiaClient implements INexiaClient {
|
|
5
5
|
private readonly httpClient;
|
|
6
6
|
private readonly authManager;
|
|
@@ -16,9 +16,9 @@ export declare class NexiaClient implements INexiaClient {
|
|
|
16
16
|
login(): Promise<void>;
|
|
17
17
|
logout(): Promise<void>;
|
|
18
18
|
isAuthenticated(): boolean;
|
|
19
|
-
getThermostats(): Promise<
|
|
19
|
+
getThermostats(): Promise<ITraneThermostat[]>;
|
|
20
20
|
getAutomations(): Promise<INexiaAutomation[]>;
|
|
21
|
-
getThermostatById(id: string):
|
|
21
|
+
getThermostatById(id: string): ITraneThermostat | undefined;
|
|
22
22
|
getAutomationById(id: string): INexiaAutomation | undefined;
|
|
23
23
|
update(options?: UpdateOptions): Promise<void>;
|
|
24
24
|
get<T>(url: string, headers?: Record<string, string>): Promise<T>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { BrandType } from '../types/constants';
|
|
2
|
+
import { TraneClientConfig, UpdateOptions } from '../types/api';
|
|
3
|
+
import { ITraneClient, ITraneThermostat, ITraneAutomation } from '../types/interfaces';
|
|
4
|
+
export declare class TraneClient implements ITraneClient {
|
|
5
|
+
private readonly httpClient;
|
|
6
|
+
private readonly authManager;
|
|
7
|
+
private readonly config;
|
|
8
|
+
private _houseId?;
|
|
9
|
+
private _houseName?;
|
|
10
|
+
private thermostats;
|
|
11
|
+
private automations;
|
|
12
|
+
private _lastUpdate;
|
|
13
|
+
private isInitialized;
|
|
14
|
+
constructor(config: TraneClientConfig);
|
|
15
|
+
initialize(): Promise<void>;
|
|
16
|
+
login(): Promise<void>;
|
|
17
|
+
logout(): Promise<void>;
|
|
18
|
+
isAuthenticated(): boolean;
|
|
19
|
+
getThermostats(): Promise<ITraneThermostat[]>;
|
|
20
|
+
getAutomations(): Promise<ITraneAutomation[]>;
|
|
21
|
+
getThermostatById(id: string): ITraneThermostat | undefined;
|
|
22
|
+
getAutomationById(id: string): ITraneAutomation | undefined;
|
|
23
|
+
update(options?: UpdateOptions): Promise<void>;
|
|
24
|
+
get<T>(url: string, headers?: Record<string, string>): Promise<T>;
|
|
25
|
+
post<T>(url: string, data: unknown, headers?: Record<string, string>): Promise<T>;
|
|
26
|
+
put<T>(url: string, data: unknown, headers?: Record<string, string>): Promise<T>;
|
|
27
|
+
get brand(): BrandType;
|
|
28
|
+
get username(): string;
|
|
29
|
+
getHouseId(): number | undefined;
|
|
30
|
+
get lastUpdate(): Date | null;
|
|
31
|
+
getThermostatIds(): string[];
|
|
32
|
+
getAutomationIds(): string[];
|
|
33
|
+
clearCache(): void;
|
|
34
|
+
private validateConfig;
|
|
35
|
+
private ensureAuthenticated;
|
|
36
|
+
private processHouseData;
|
|
37
|
+
private isThermostatItem;
|
|
38
|
+
private processThermostat;
|
|
39
|
+
private processAutomation;
|
|
40
|
+
private clearDeviceCache;
|
|
41
|
+
private isSessionExpiredError;
|
|
42
|
+
private handleSessionExpiry;
|
|
43
|
+
delayedUpdate(delayMs?: number): Promise<void>;
|
|
44
|
+
getBaseUrl(): string;
|
|
45
|
+
getMobileUrl(): string;
|
|
46
|
+
getUpdateUrl(): string | null;
|
|
47
|
+
getHouseName(): string | undefined;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=trane-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trane-client.d.ts","sourceRoot":"","sources":["../../src/client/trane-client.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAA0C,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAIL,iBAAiB,EACjB,aAAa,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAavF,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAE3C,OAAO,CAAC,QAAQ,CAAC,CAAS;IAE1B,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,aAAa,CAAkB;gBAE3B,MAAM,EAAE,iBAAiB;IA8BxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBtB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAS7B,eAAe,IAAI,OAAO;IAOpB,cAAc,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAQ7C,cAAc,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAQnD,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAO3D,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAOrD,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmClD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAoBjE,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAoBjF,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAkB7F,IAAW,KAAK,IAAI,SAAS,CAE5B;IAED,IAAW,QAAQ,IAAI,MAAM,CAE5B;IAEM,UAAU,IAAI,MAAM,GAAG,SAAS;IAIvC,IAAW,UAAU,IAAI,IAAI,GAAG,IAAI,CAEnC;IAKM,gBAAgB,IAAI,MAAM,EAAE;IAO5B,gBAAgB,IAAI,MAAM,EAAE;IAO5B,UAAU,IAAI,IAAI;IAOzB,OAAO,CAAC,cAAc;YAwBR,mBAAmB;YAanB,gBAAgB;IAqE9B,OAAO,CAAC,gBAAgB;YAeV,iBAAiB;YAiBjB,iBAAiB;IAiB/B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,qBAAqB;YAWf,mBAAmB;IAqBpB,aAAa,CAAC,OAAO,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB1D,UAAU,IAAI,MAAM;IAOpB,YAAY,IAAI,MAAM;IAOtB,YAAY,IAAI,MAAM,GAAG,IAAI;IAO7B,YAAY,IAAI,MAAM,GAAG,SAAS;CAG1C"}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TraneClient = void 0;
|
|
4
|
+
const constants_1 = require("../types/constants");
|
|
5
|
+
const http_utils_1 = require("../utils/http-utils");
|
|
6
|
+
const auth_1 = require("./auth");
|
|
7
|
+
const trane_thermostat_1 = require("../devices/trane-thermostat");
|
|
8
|
+
const trane_automation_1 = require("../devices/trane-automation");
|
|
9
|
+
const errors_1 = require("../utils/errors");
|
|
10
|
+
const validation_1 = require("../utils/validation");
|
|
11
|
+
class TraneClient {
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.thermostats = new Map();
|
|
14
|
+
this.automations = new Map();
|
|
15
|
+
this._lastUpdate = null;
|
|
16
|
+
this.isInitialized = false;
|
|
17
|
+
this.config = this.validateConfig(config);
|
|
18
|
+
const baseURL = constants_1.BRAND_URLS[this.config.brand];
|
|
19
|
+
this.httpClient = (0, http_utils_1.createHttpClient)({
|
|
20
|
+
baseURL,
|
|
21
|
+
timeout: this.config.timeout || 30000,
|
|
22
|
+
retryAttempts: this.config.retryAttempts || 3,
|
|
23
|
+
headers: {
|
|
24
|
+
'Content-Type': 'application/json'
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
const authConfig = {
|
|
28
|
+
username: this.config.username,
|
|
29
|
+
password: this.config.password,
|
|
30
|
+
brand: this.config.brand,
|
|
31
|
+
deviceName: this.config.deviceName,
|
|
32
|
+
stateFile: this.config.stateFile,
|
|
33
|
+
houseId: this.config.houseId
|
|
34
|
+
};
|
|
35
|
+
this.authManager = new auth_1.AuthManager(this.httpClient, authConfig);
|
|
36
|
+
}
|
|
37
|
+
async initialize() {
|
|
38
|
+
if (this.isInitialized) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
await this.authManager.initialize();
|
|
42
|
+
if (!this.authManager.isSessionValid()) {
|
|
43
|
+
await this.login();
|
|
44
|
+
}
|
|
45
|
+
this.isInitialized = true;
|
|
46
|
+
}
|
|
47
|
+
async login() {
|
|
48
|
+
try {
|
|
49
|
+
await this.authManager.authenticate();
|
|
50
|
+
const sessionInfo = await this.authManager.getSessionInfo();
|
|
51
|
+
this._houseId = sessionInfo.houseId;
|
|
52
|
+
this._houseName = sessionInfo.houseName;
|
|
53
|
+
await this.update({ forceUpdate: true });
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (error instanceof errors_1.AuthenticationError) {
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
const traneError = errors_1.ErrorHandler.handle(error);
|
|
60
|
+
throw new errors_1.AuthenticationError(`Login failed: ${traneError.message}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async logout() {
|
|
64
|
+
await this.authManager.logout();
|
|
65
|
+
this.clearDeviceCache();
|
|
66
|
+
this.isInitialized = false;
|
|
67
|
+
}
|
|
68
|
+
isAuthenticated() {
|
|
69
|
+
return this.authManager.isSessionValid();
|
|
70
|
+
}
|
|
71
|
+
async getThermostats() {
|
|
72
|
+
await this.ensureAuthenticated();
|
|
73
|
+
return Array.from(this.thermostats.values());
|
|
74
|
+
}
|
|
75
|
+
async getAutomations() {
|
|
76
|
+
await this.ensureAuthenticated();
|
|
77
|
+
return Array.from(this.automations.values());
|
|
78
|
+
}
|
|
79
|
+
getThermostatById(id) {
|
|
80
|
+
return this.thermostats.get(id);
|
|
81
|
+
}
|
|
82
|
+
getAutomationById(id) {
|
|
83
|
+
return this.automations.get(id);
|
|
84
|
+
}
|
|
85
|
+
async update(options = {}) {
|
|
86
|
+
await this.ensureAuthenticated();
|
|
87
|
+
if (!this._houseId) {
|
|
88
|
+
throw new errors_1.ApiError('House ID not available. Please ensure login was successful.');
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const { forceUpdate = false } = options;
|
|
92
|
+
const houseUrl = `${constants_1.API_ENDPOINTS.HOUSES}/${this._houseId}`;
|
|
93
|
+
const response = forceUpdate
|
|
94
|
+
? await this.httpClient.get(houseUrl)
|
|
95
|
+
: await this.httpClient.getWithETag(houseUrl);
|
|
96
|
+
if (!('fromCache' in response) || !response.fromCache || forceUpdate) {
|
|
97
|
+
await this.processHouseData(response.data);
|
|
98
|
+
this._lastUpdate = new Date();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (this.isSessionExpiredError(error)) {
|
|
103
|
+
await this.handleSessionExpiry();
|
|
104
|
+
return this.update(options);
|
|
105
|
+
}
|
|
106
|
+
throw errors_1.ErrorHandler.handle(error);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async get(url, headers) {
|
|
110
|
+
await this.ensureAuthenticated();
|
|
111
|
+
try {
|
|
112
|
+
const response = await this.httpClient.get(url, { headers });
|
|
113
|
+
return response.data;
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (this.isSessionExpiredError(error)) {
|
|
117
|
+
await this.handleSessionExpiry();
|
|
118
|
+
const response = await this.httpClient.get(url, { headers });
|
|
119
|
+
return response.data;
|
|
120
|
+
}
|
|
121
|
+
throw errors_1.ErrorHandler.handle(error);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async post(url, data, headers) {
|
|
125
|
+
await this.ensureAuthenticated();
|
|
126
|
+
try {
|
|
127
|
+
const response = await this.httpClient.post(url, data, { headers });
|
|
128
|
+
return response.data;
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
if (this.isSessionExpiredError(error)) {
|
|
132
|
+
await this.handleSessionExpiry();
|
|
133
|
+
const response = await this.httpClient.post(url, data, { headers });
|
|
134
|
+
return response.data;
|
|
135
|
+
}
|
|
136
|
+
throw errors_1.ErrorHandler.handle(error);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async put(url, data, headers) {
|
|
140
|
+
await this.ensureAuthenticated();
|
|
141
|
+
try {
|
|
142
|
+
const response = await this.httpClient.put(url, data, { headers });
|
|
143
|
+
return response.data;
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
if (this.isSessionExpiredError(error)) {
|
|
147
|
+
await this.handleSessionExpiry();
|
|
148
|
+
const response = await this.httpClient.put(url, data, { headers });
|
|
149
|
+
return response.data;
|
|
150
|
+
}
|
|
151
|
+
throw errors_1.ErrorHandler.handle(error);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
get brand() {
|
|
155
|
+
return this.config.brand;
|
|
156
|
+
}
|
|
157
|
+
get username() {
|
|
158
|
+
return this.config.username;
|
|
159
|
+
}
|
|
160
|
+
getHouseId() {
|
|
161
|
+
return this._houseId;
|
|
162
|
+
}
|
|
163
|
+
get lastUpdate() {
|
|
164
|
+
return this._lastUpdate;
|
|
165
|
+
}
|
|
166
|
+
getThermostatIds() {
|
|
167
|
+
return Array.from(this.thermostats.keys());
|
|
168
|
+
}
|
|
169
|
+
getAutomationIds() {
|
|
170
|
+
return Array.from(this.automations.keys());
|
|
171
|
+
}
|
|
172
|
+
clearCache() {
|
|
173
|
+
this.httpClient.clearETagCache();
|
|
174
|
+
}
|
|
175
|
+
validateConfig(config) {
|
|
176
|
+
const username = validation_1.GeneralValidator.validateRequiredString(config.username, 'username');
|
|
177
|
+
const password = validation_1.GeneralValidator.validateRequiredString(config.password, 'password');
|
|
178
|
+
const brand = validation_1.GeneralValidator.validateOptional(config.brand, (b) => validation_1.GeneralValidator.validateEnum(b, constants_1.BrandType, 'brand'), constants_1.BrandType.TRANE);
|
|
179
|
+
return {
|
|
180
|
+
...config,
|
|
181
|
+
username,
|
|
182
|
+
password,
|
|
183
|
+
brand,
|
|
184
|
+
deviceName: config.deviceName || 'Homebridge',
|
|
185
|
+
timeout: config.timeout || 30000,
|
|
186
|
+
retryAttempts: config.retryAttempts || 3
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
async ensureAuthenticated() {
|
|
190
|
+
if (!this.isInitialized) {
|
|
191
|
+
await this.initialize();
|
|
192
|
+
}
|
|
193
|
+
if (!this.isAuthenticated()) {
|
|
194
|
+
await this.login();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async processHouseData(houseData) {
|
|
198
|
+
if (!houseData.success || !houseData.result) {
|
|
199
|
+
throw new errors_1.ApiError('Invalid house data received');
|
|
200
|
+
}
|
|
201
|
+
const result = houseData.result;
|
|
202
|
+
this.clearDeviceCache();
|
|
203
|
+
if (result._links?.child) {
|
|
204
|
+
for (const childLink of result._links.child) {
|
|
205
|
+
try {
|
|
206
|
+
if (childLink.type === 'thermostat' || childLink.href.includes('xxl_thermostats')) {
|
|
207
|
+
await this.processThermostat(childLink);
|
|
208
|
+
}
|
|
209
|
+
else if (childLink.type === 'automation' || childLink.href.includes('automation')) {
|
|
210
|
+
await this.processAutomation(childLink);
|
|
211
|
+
}
|
|
212
|
+
else if (childLink.type === 'application/vnd.nexia.collection+json' && childLink.data?.items) {
|
|
213
|
+
for (const item of childLink.data.items) {
|
|
214
|
+
try {
|
|
215
|
+
if (this.isThermostatItem(item)) {
|
|
216
|
+
const thermostat = new trane_thermostat_1.TraneThermostat(this, item);
|
|
217
|
+
this.thermostats.set(thermostat.id, thermostat);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
console.warn(`Failed to process device item ${item.id}:`, error);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
console.warn(`Failed to process child link:`, error);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (result.devices) {
|
|
232
|
+
for (const device of result.devices) {
|
|
233
|
+
try {
|
|
234
|
+
const thermostat = new trane_thermostat_1.TraneThermostat(this, device);
|
|
235
|
+
this.thermostats.set(thermostat.id, thermostat);
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
console.warn('Failed to create thermostat from device data:', error);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (result.automations) {
|
|
243
|
+
for (const automation of result.automations) {
|
|
244
|
+
try {
|
|
245
|
+
const automationObj = new trane_automation_1.TraneAutomation(this, automation);
|
|
246
|
+
this.automations.set(automationObj.id, automationObj);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
console.warn('Failed to create automation from data:', error);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
isThermostatItem(item) {
|
|
255
|
+
if (!item || !item.features) {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
return item.features.some((f) => f.name === 'thermostat' ||
|
|
259
|
+
f.name === 'thermostat_mode' ||
|
|
260
|
+
f.name === 'advanced_info');
|
|
261
|
+
}
|
|
262
|
+
async processThermostat(deviceLink) {
|
|
263
|
+
try {
|
|
264
|
+
const thermostatData = await this.get(deviceLink.href);
|
|
265
|
+
const thermostat = new trane_thermostat_1.TraneThermostat(this, thermostatData);
|
|
266
|
+
this.thermostats.set(thermostat.id, thermostat);
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
console.warn(`Failed to load thermostat ${deviceLink.id || 'unknown'}:`, error);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
async processAutomation(deviceLink) {
|
|
273
|
+
try {
|
|
274
|
+
const automationData = await this.get(deviceLink.href);
|
|
275
|
+
const automation = new trane_automation_1.TraneAutomation(this, automationData);
|
|
276
|
+
this.automations.set(automation.id, automation);
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
console.warn(`Failed to load automation ${deviceLink.id || 'unknown'}:`, error);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
clearDeviceCache() {
|
|
283
|
+
this.thermostats.clear();
|
|
284
|
+
this.automations.clear();
|
|
285
|
+
}
|
|
286
|
+
isSessionExpiredError(error) {
|
|
287
|
+
return (error instanceof errors_1.SessionExpiredError ||
|
|
288
|
+
(error instanceof errors_1.ApiError && error.statusCode === constants_1.HTTP_STATUS.REDIRECT) ||
|
|
289
|
+
(error instanceof errors_1.AuthenticationError && error.message.includes('session')));
|
|
290
|
+
}
|
|
291
|
+
async handleSessionExpiry() {
|
|
292
|
+
console.info('Session expired, refreshing authentication...');
|
|
293
|
+
try {
|
|
294
|
+
this.authManager.handleSessionExpired();
|
|
295
|
+
await this.authManager.authenticate();
|
|
296
|
+
const sessionInfo = await this.authManager.getSessionInfo();
|
|
297
|
+
this._houseId = sessionInfo.houseId;
|
|
298
|
+
this._houseName = sessionInfo.houseName;
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
this.clearDeviceCache();
|
|
302
|
+
throw new errors_1.AuthenticationError('Failed to refresh expired session');
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
async delayedUpdate(delayMs = 7000) {
|
|
306
|
+
return new Promise((resolve, reject) => {
|
|
307
|
+
setTimeout(async () => {
|
|
308
|
+
try {
|
|
309
|
+
await this.update();
|
|
310
|
+
resolve();
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
reject(error);
|
|
314
|
+
}
|
|
315
|
+
}, delayMs);
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
getBaseUrl() {
|
|
319
|
+
return constants_1.BRAND_URLS[this.config.brand];
|
|
320
|
+
}
|
|
321
|
+
getMobileUrl() {
|
|
322
|
+
return `${this.getBaseUrl()}/mobile`;
|
|
323
|
+
}
|
|
324
|
+
getUpdateUrl() {
|
|
325
|
+
return this._houseId ? `${constants_1.API_ENDPOINTS.HOUSES}/${this._houseId}` : null;
|
|
326
|
+
}
|
|
327
|
+
getHouseName() {
|
|
328
|
+
return this._houseName;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
exports.TraneClient = TraneClient;
|
|
332
|
+
//# sourceMappingURL=trane-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trane-client.js","sourceRoot":"","sources":["../../src/client/trane-client.ts"],"names":[],"mappings":"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"}
|