@homebridge-plugins/homebridge-smarthq 0.4.12 → 0.4.14
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/CHANGELOG.md +150 -0
- package/dist/getAccessToken.d.ts.map +1 -1
- package/dist/getAccessToken.js +186 -4
- package/dist/getAccessToken.js.map +1 -1
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +36 -2
- package/dist/platform.js.map +1 -1
- package/docs/assets/icons.js +1 -1
- package/docs/assets/icons.svg +1 -1
- package/docs/classes/SmartHQPlatform.html +8 -8
- package/docs/index.html +12 -6
- package/docs/interfaces/DeviceOptions.html +2 -2
- package/docs/interfaces/SmartHQPlatformConfig.html +2 -2
- package/docs/interfaces/SmartHqContext.html +2 -2
- package/docs/interfaces/SmartHqERDResponse.html +2 -2
- package/docs/interfaces/credentials.html +2 -2
- package/docs/interfaces/devicesConfig.html +2 -2
- package/docs/interfaces/options.html +2 -2
- package/docs/variables/API_URL.html +1 -1
- package/docs/variables/ERD_CODES.html +1 -1
- package/docs/variables/ERD_TYPES.html +1 -1
- package/docs/variables/KEEPALIVE_TIMEOUT.html +1 -1
- package/docs/variables/LOGIN_URL.html +1 -1
- package/docs/variables/OAUTH2_CLIENT_ID.html +1 -1
- package/docs/variables/OAUTH2_CLIENT_SECRET.html +1 -1
- package/docs/variables/OAUTH2_REDIRECT_URI.html +1 -1
- package/docs/variables/PLATFORM_NAME.html +1 -1
- package/docs/variables/PLUGIN_NAME.html +1 -1
- package/docs/variables/SECURE_URL.html +1 -1
- package/docs/variables/default.html +1 -1
- package/eslint.config.js +1 -19
- package/package.json +9 -21
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,156 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. This project uses [Semantic Versioning](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## [0.4.13](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.12...v0.4.13) (2026-01-14)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## [0.4.12](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.11...v0.4.12) (2026-01-14)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* handle undefined values for fan speed and light level in SmartHQ… ([#74](https://github.com/homebridge-plugins/homebridge-smarthq/issues/74)) ([777a8a0](https://github.com/homebridge-plugins/homebridge-smarthq/commit/777a8a0cb3096068c8193b49c5b90447bcc82929))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
## [0.4.11](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.10...v0.4.11) (2025-12-22)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
## [0.4.10](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.9...v0.4.10) (2025-12-22)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## [0.4.9](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.8...v0.4.9) (2025-12-22)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
## [0.4.8](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.7...v0.4.8) (2025-12-22)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## [0.4.7](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.6...v0.4.7) (2025-12-22)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
## [0.4.6](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.4...v0.4.6) (2025-12-22)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
## [0.4.4](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.3...v0.4.4) (2025-12-22)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
### Reverts
|
|
46
|
+
|
|
47
|
+
* Revert "update dependenices" ([b3fe90e](https://github.com/homebridge-plugins/homebridge-smarthq/commit/b3fe90ea172fb78b8acd360695cbc3c6b97f0326))
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
## [0.4.3](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.1...v0.4.3) (2025-12-22)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
### Features
|
|
55
|
+
|
|
56
|
+
* support hood ([#57](https://github.com/homebridge-plugins/homebridge-smarthq/issues/57)) ([2659b21](https://github.com/homebridge-plugins/homebridge-smarthq/commit/2659b21a0a483cb15e0622733f58d75603d99cab))
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
## [0.4.1](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.0...v0.4.1) (2025-09-18)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
### Bug Fixes
|
|
64
|
+
|
|
65
|
+
* **air conditioner:** fix temperature setting and update switch display names ([#38](https://github.com/homebridge-plugins/homebridge-smarthq/issues/38)) ([1675205](https://github.com/homebridge-plugins/homebridge-smarthq/commit/16752059c93d6a5b26b782f2b42246e622b4b830))
|
|
66
|
+
* **air conditioner:** preserve decimal precision when converting Celsius to Fahrenheit ([#40](https://github.com/homebridge-plugins/homebridge-smarthq/issues/40)) ([38c8285](https://github.com/homebridge-plugins/homebridge-smarthq/commit/38c82852015d8ea0ceb0f4dd4b9ddf0622f57963))
|
|
67
|
+
* **air conditioner:** report all operating modes off when unit is off ([#42](https://github.com/homebridge-plugins/homebridge-smarthq/issues/42)) ([d44ebe3](https://github.com/homebridge-plugins/homebridge-smarthq/commit/d44ebe34590a2da6645e30db0db269e1dbbe4f3b))
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
### Features
|
|
71
|
+
|
|
72
|
+
* add Portable AC as supported device ([#45](https://github.com/homebridge-plugins/homebridge-smarthq/issues/45)) ([50d83b1](https://github.com/homebridge-plugins/homebridge-smarthq/commit/50d83b1e003d8d238485459a5c882f357e1c61fb))
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
# [0.4.0](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.2.0...v0.4.0) (2025-06-27)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# 0.2.0 (2025-02-23)
|
|
81
|
+
|
|
82
|
+
## [0.4.12](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.11...v0.4.12) (2026-01-14)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
### Bug Fixes
|
|
86
|
+
|
|
87
|
+
* handle undefined values for fan speed and light level in SmartHQ… ([#74](https://github.com/homebridge-plugins/homebridge-smarthq/issues/74)) ([777a8a0](https://github.com/homebridge-plugins/homebridge-smarthq/commit/777a8a0cb3096068c8193b49c5b90447bcc82929))
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
## [0.4.11](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.10...v0.4.11) (2025-12-22)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
## [0.4.10](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.9...v0.4.10) (2025-12-22)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
## [0.4.9](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.8...v0.4.9) (2025-12-22)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
## [0.4.8](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.7...v0.4.8) (2025-12-22)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
## [0.4.7](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.6...v0.4.7) (2025-12-22)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
## [0.4.6](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.4...v0.4.6) (2025-12-22)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
## [0.4.4](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.3...v0.4.4) (2025-12-22)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
### Reverts
|
|
119
|
+
|
|
120
|
+
* Revert "update dependenices" ([b3fe90e](https://github.com/homebridge-plugins/homebridge-smarthq/commit/b3fe90ea172fb78b8acd360695cbc3c6b97f0326))
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
## [0.4.3](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.1...v0.4.3) (2025-12-22)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
### Features
|
|
128
|
+
|
|
129
|
+
* support hood ([#57](https://github.com/homebridge-plugins/homebridge-smarthq/issues/57)) ([2659b21](https://github.com/homebridge-plugins/homebridge-smarthq/commit/2659b21a0a483cb15e0622733f58d75603d99cab))
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
## [0.4.1](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.0...v0.4.1) (2025-09-18)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
### Bug Fixes
|
|
137
|
+
|
|
138
|
+
* **air conditioner:** fix temperature setting and update switch display names ([#38](https://github.com/homebridge-plugins/homebridge-smarthq/issues/38)) ([1675205](https://github.com/homebridge-plugins/homebridge-smarthq/commit/16752059c93d6a5b26b782f2b42246e622b4b830))
|
|
139
|
+
* **air conditioner:** preserve decimal precision when converting Celsius to Fahrenheit ([#40](https://github.com/homebridge-plugins/homebridge-smarthq/issues/40)) ([38c8285](https://github.com/homebridge-plugins/homebridge-smarthq/commit/38c82852015d8ea0ceb0f4dd4b9ddf0622f57963))
|
|
140
|
+
* **air conditioner:** report all operating modes off when unit is off ([#42](https://github.com/homebridge-plugins/homebridge-smarthq/issues/42)) ([d44ebe3](https://github.com/homebridge-plugins/homebridge-smarthq/commit/d44ebe34590a2da6645e30db0db269e1dbbe4f3b))
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
### Features
|
|
144
|
+
|
|
145
|
+
* add Portable AC as supported device ([#45](https://github.com/homebridge-plugins/homebridge-smarthq/issues/45)) ([50d83b1](https://github.com/homebridge-plugins/homebridge-smarthq/commit/50d83b1e003d8d238485459a5c882f357e1c61fb))
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
# [0.4.0](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.2.0...v0.4.0) (2025-06-27)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
# 0.2.0 (2025-02-23)
|
|
154
|
+
|
|
5
155
|
## [0.4.11](https://github.com/homebridge-plugins/homebridge-smarthq/compare/v0.4.10...v0.4.11) (2025-12-22)
|
|
6
156
|
|
|
7
157
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAccessToken.d.ts","sourceRoot":"","sources":["../src/getAccessToken.ts"],"names":[],"mappings":"AAoBA,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,6CAG7D;AAED,wBAA8B,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"getAccessToken.d.ts","sourceRoot":"","sources":["../src/getAccessToken.ts"],"names":[],"mappings":"AAoBA,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,6CAG7D;AAED,wBAA8B,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,6CAoN9E"}
|
package/dist/getAccessToken.js
CHANGED
|
@@ -4,7 +4,7 @@ import * as cheerio from 'cheerio';
|
|
|
4
4
|
import pkg from 'lodash';
|
|
5
5
|
import { Issuer } from 'openid-client';
|
|
6
6
|
import { CookieJar } from 'tough-cookie';
|
|
7
|
-
import { OAUTH2_CLIENT_ID, OAUTH2_CLIENT_SECRET, OAUTH2_REDIRECT_URI } from './settings.js';
|
|
7
|
+
import { OAUTH2_CLIENT_ID, OAUTH2_CLIENT_SECRET, OAUTH2_REDIRECT_URI, LOGIN_URL } from './settings.js';
|
|
8
8
|
const { keyBy, mapValues } = pkg;
|
|
9
9
|
const oidcClient = Issuer.discover('https://accounts.brillion.geappliances.com/').then(geData => new geData.Client({
|
|
10
10
|
client_id: OAUTH2_CLIENT_ID,
|
|
@@ -35,10 +35,192 @@ export default async function getAccessToken(username, password) {
|
|
|
35
35
|
maxRedirects: 0,
|
|
36
36
|
validateStatus: () => true,
|
|
37
37
|
});
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
// If the initial POST did not return a redirect with the code, the login
|
|
39
|
+
// flow may have hit an intermediate page (MFA enrollment or Terms acceptance).
|
|
40
|
+
// Attempt to handle those pages automatically; fall back to an error with
|
|
41
|
+
// guidance if not possible.
|
|
42
|
+
const tryExtractCodeFromLocation = (location) => {
|
|
43
|
+
if (!location)
|
|
44
|
+
return null;
|
|
45
|
+
try {
|
|
46
|
+
return new URL(location).searchParams.get('code');
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
// Handle relative URLs
|
|
50
|
+
try {
|
|
51
|
+
const full = location.startsWith('/') ? `${LOGIN_URL}${location}` : location;
|
|
52
|
+
return new URL(full).searchParams.get('code');
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
let code = tryExtractCodeFromLocation(res.headers.location);
|
|
60
|
+
if (!code) {
|
|
61
|
+
// Try to handle HTML response pages (MFA or Terms)
|
|
62
|
+
const asyncHandleOkResponse = async (respText) => {
|
|
63
|
+
// MFA enrollment page
|
|
64
|
+
if (respText.includes('Add Multi-Factor Authentication') || respText.includes('addMfaForm')) {
|
|
65
|
+
try {
|
|
66
|
+
const $ = cheerio.load(respText);
|
|
67
|
+
const mfaForm = $('#addMfaForm');
|
|
68
|
+
if (!mfaForm || mfaForm.length === 0) {
|
|
69
|
+
throw new Error('MFA form not found');
|
|
70
|
+
}
|
|
71
|
+
const formData = {};
|
|
72
|
+
mfaForm.find('input').each((i, el) => {
|
|
73
|
+
const name = $(el).attr('name');
|
|
74
|
+
if (!name)
|
|
75
|
+
return;
|
|
76
|
+
formData[name] = $(el).val() || '';
|
|
77
|
+
});
|
|
78
|
+
// Try meta tag for CSRF if not present
|
|
79
|
+
if (!formData['_csrf']) {
|
|
80
|
+
const csrfMeta = $('meta[name="_csrf"]').attr('content');
|
|
81
|
+
if (csrfMeta)
|
|
82
|
+
formData['_csrf'] = csrfMeta;
|
|
83
|
+
}
|
|
84
|
+
const postData = new URLSearchParams(formData);
|
|
85
|
+
const skipResp = await aclient({
|
|
86
|
+
method: 'POST',
|
|
87
|
+
url: `${LOGIN_URL}/account/active/redirect`,
|
|
88
|
+
data: postData,
|
|
89
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
90
|
+
maxRedirects: 0,
|
|
91
|
+
validateStatus: () => true,
|
|
92
|
+
});
|
|
93
|
+
const loc = skipResp.headers.location;
|
|
94
|
+
const gotCode = tryExtractCodeFromLocation(loc);
|
|
95
|
+
if (gotCode)
|
|
96
|
+
return gotCode;
|
|
97
|
+
// Follow redirect manually if provided
|
|
98
|
+
if (loc) {
|
|
99
|
+
const resolved = loc.startsWith('/') ? `${LOGIN_URL}${loc}` : loc;
|
|
100
|
+
const redirectResp = await aclient.get(resolved, { maxRedirects: 0, validateStatus: () => true });
|
|
101
|
+
const finalLoc = redirectResp.headers.location;
|
|
102
|
+
const finalCode = tryExtractCodeFromLocation(finalLoc);
|
|
103
|
+
if (finalCode)
|
|
104
|
+
return finalCode;
|
|
105
|
+
if (redirectResp.status === 200)
|
|
106
|
+
return await asyncHandleOkResponse(await redirectResp.data);
|
|
107
|
+
}
|
|
108
|
+
if (skipResp.status === 200)
|
|
109
|
+
return await asyncHandleOkResponse(await skipResp.data);
|
|
110
|
+
throw new Error('MFA skip failed');
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
throw new Error(`MFA handling failed: ${e.message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Terms acceptance page
|
|
117
|
+
if (respText.includes('Almost Finished') && respText.includes('/oauth2/terms/accept')) {
|
|
118
|
+
try {
|
|
119
|
+
const $ = cheerio.load(respText);
|
|
120
|
+
let termsForm = $('#termsform');
|
|
121
|
+
if (!termsForm || termsForm.length === 0) {
|
|
122
|
+
termsForm = $("form[name='termsform']");
|
|
123
|
+
}
|
|
124
|
+
if (!termsForm || termsForm.length === 0) {
|
|
125
|
+
// Fallback: try to extract required fields with regex
|
|
126
|
+
const formData = {};
|
|
127
|
+
const sigMatch = respText.match(/name="signature"\\s+value="([^\"]+)"/);
|
|
128
|
+
if (sigMatch)
|
|
129
|
+
formData['signature'] = sigMatch[1];
|
|
130
|
+
const lasMatch = respText.match(/name="login_actions_signature"[^>]*value=([^>\\s>]+)/);
|
|
131
|
+
if (lasMatch)
|
|
132
|
+
formData['login_actions_signature'] = lasMatch[1].replace(/>$/, '');
|
|
133
|
+
const devMatch = respText.match(/name="isDeveloper"\\s+value="([^\"]+)"/);
|
|
134
|
+
if (devMatch)
|
|
135
|
+
formData['isDeveloper'] = devMatch[1];
|
|
136
|
+
const csrfMatch = respText.match(/name="_csrf"\\s+value="([^\"]+)"/);
|
|
137
|
+
if (csrfMatch)
|
|
138
|
+
formData['_csrf'] = csrfMatch[1];
|
|
139
|
+
formData['developerTerms'] = 'on';
|
|
140
|
+
formData['connected_terms'] = 'on';
|
|
141
|
+
const headers = {};
|
|
142
|
+
if (formData['_csrf'])
|
|
143
|
+
headers['X-CSRF-TOKEN'] = formData['_csrf'];
|
|
144
|
+
const termsResp = await aclient({
|
|
145
|
+
method: 'POST',
|
|
146
|
+
url: `${LOGIN_URL}/oauth2/terms/accept`,
|
|
147
|
+
data: new URLSearchParams(formData),
|
|
148
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded', ...headers },
|
|
149
|
+
maxRedirects: 0,
|
|
150
|
+
validateStatus: () => true,
|
|
151
|
+
});
|
|
152
|
+
const loc = termsResp.headers.location;
|
|
153
|
+
const gotCode = tryExtractCodeFromLocation(loc);
|
|
154
|
+
if (gotCode)
|
|
155
|
+
return gotCode;
|
|
156
|
+
if (loc) {
|
|
157
|
+
const resolved = loc.startsWith('/') ? `${LOGIN_URL}${loc}` : loc;
|
|
158
|
+
const redirectResp = await aclient.get(resolved, { maxRedirects: 0, validateStatus: () => true });
|
|
159
|
+
const finalCode = tryExtractCodeFromLocation(redirectResp.headers.location);
|
|
160
|
+
if (finalCode)
|
|
161
|
+
return finalCode;
|
|
162
|
+
if (redirectResp.status === 200)
|
|
163
|
+
return await asyncHandleOkResponse(await redirectResp.data);
|
|
164
|
+
}
|
|
165
|
+
if (termsResp.status === 200)
|
|
166
|
+
return await asyncHandleOkResponse(await termsResp.data);
|
|
167
|
+
throw new Error('Terms acceptance failed');
|
|
168
|
+
}
|
|
169
|
+
// Collect inputs from the form
|
|
170
|
+
const formData = {};
|
|
171
|
+
termsForm.find('input').each((i, el) => {
|
|
172
|
+
const name = $(el).attr('name');
|
|
173
|
+
if (!name)
|
|
174
|
+
return;
|
|
175
|
+
formData[name] = $(el).val() || '';
|
|
176
|
+
});
|
|
177
|
+
// Set checkboxes to accepted
|
|
178
|
+
formData['developerTerms'] = 'on';
|
|
179
|
+
formData['connected_terms'] = 'on';
|
|
180
|
+
if (!formData['_csrf']) {
|
|
181
|
+
const csrfMeta = $('meta[name="_csrf"]').attr('content');
|
|
182
|
+
if (csrfMeta)
|
|
183
|
+
formData['_csrf'] = csrfMeta;
|
|
184
|
+
}
|
|
185
|
+
const headers = {};
|
|
186
|
+
if (formData['_csrf'])
|
|
187
|
+
headers['X-CSRF-TOKEN'] = formData['_csrf'];
|
|
188
|
+
const termsResp = await aclient({
|
|
189
|
+
method: 'POST',
|
|
190
|
+
url: `${LOGIN_URL}/oauth2/terms/accept`,
|
|
191
|
+
data: new URLSearchParams(formData),
|
|
192
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded', ...headers },
|
|
193
|
+
maxRedirects: 0,
|
|
194
|
+
validateStatus: () => true,
|
|
195
|
+
});
|
|
196
|
+
const loc = termsResp.headers.location;
|
|
197
|
+
const gotCode = tryExtractCodeFromLocation(loc);
|
|
198
|
+
if (gotCode)
|
|
199
|
+
return gotCode;
|
|
200
|
+
if (loc) {
|
|
201
|
+
const resolved = loc.startsWith('/') ? `${LOGIN_URL}${loc}` : loc;
|
|
202
|
+
const redirectResp = await aclient.get(resolved, { maxRedirects: 0, validateStatus: () => true });
|
|
203
|
+
const finalCode = tryExtractCodeFromLocation(redirectResp.headers.location);
|
|
204
|
+
if (finalCode)
|
|
205
|
+
return finalCode;
|
|
206
|
+
if (redirectResp.status === 200)
|
|
207
|
+
return await asyncHandleOkResponse(await redirectResp.data);
|
|
208
|
+
}
|
|
209
|
+
if (termsResp.status === 200)
|
|
210
|
+
return await asyncHandleOkResponse(await termsResp.data);
|
|
211
|
+
throw new Error('Terms acceptance failed');
|
|
212
|
+
}
|
|
213
|
+
catch (e) {
|
|
214
|
+
throw new Error(`Terms handling failed: ${e.message}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
throw new Error('Authentication failed: No authorization code received and no known intermediate page detected');
|
|
218
|
+
};
|
|
219
|
+
// If we have HTML in the response, try to handle it
|
|
220
|
+
if (res.data && typeof res.data === 'string') {
|
|
221
|
+
code = await asyncHandleOkResponse(res.data);
|
|
222
|
+
}
|
|
40
223
|
}
|
|
41
|
-
const code = new URL(res.headers.location).searchParams.get('code');
|
|
42
224
|
if (!code) {
|
|
43
225
|
throw new Error('Authentication failed: No authorization code received');
|
|
44
226
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAccessToken.js","sourceRoot":"","sources":["../src/getAccessToken.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACjD,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"getAccessToken.js","sourceRoot":"","sources":["../src/getAccessToken.ts"],"names":[],"mappings":"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"}
|
package/dist/platform.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,qBAAqB,EAAE,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAG7F,OAAO,KAAK,EAA8B,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AA+B/G;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,qBAAqB;IACpD,WAAW,EAAE,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAA;IACvD,SAAgB,GAAG,EAAE,GAAG,CAAA;IACxB,SAAgB,GAAG,EAAE,OAAO,CAAA;IAC5B,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;IACpB,MAAM,EAAG,qBAAqB,CAAA;IAE9B,OAAO,EAAG,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAA;IACrC,cAAc,EAAG,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAA;IAC1D,OAAO,CAAC,QAAQ,CAAW;IAE3B,cAAc,EAAG,qBAAqB,CAAA;IACtC,eAAe,EAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IACpC,mBAAmB,EAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IAC5C,gBAAgB,EAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACtC,kBAAkB,EAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IAC1C,SAAS,EAAG,OAAO,CAAA;IACnB,OAAO,EAAG,MAAM,CAAA;gBAGd,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,qBAAqB,EAC7B,GAAG,EAAE,GAAG;IA0DV;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,iBAAiB;IAO/C;;OAEG;IACG,YAAY;IAaZ,sBAAsB;
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
|
package/dist/platform.js
CHANGED
|
@@ -130,8 +130,41 @@ export class SmartHQPlatform {
|
|
|
130
130
|
this.tokenSet = await refreshAccessToken(this.tokenSet.refresh_token);
|
|
131
131
|
}
|
|
132
132
|
catch (e) {
|
|
133
|
-
await this.
|
|
134
|
-
|
|
133
|
+
await this.debugErrorLog(`Failed to refresh Access Token, Error Message: ${e.message ?? e}`);
|
|
134
|
+
// Handle invalid_grant error (expired/revoked refresh token)
|
|
135
|
+
if (e.error === 'invalid_grant' || e.message?.includes('invalid_grant') || e.message?.includes('Invalid refresh token')) {
|
|
136
|
+
await this.debugWarnLog('Refresh token is invalid or expired. Attempting to re-authenticate with username and password...');
|
|
137
|
+
// Try to get a new token using username/password
|
|
138
|
+
const { username, password } = this.config.credentials ?? {};
|
|
139
|
+
if (username && password) {
|
|
140
|
+
try {
|
|
141
|
+
this.tokenSet = await getAccessToken(username, password);
|
|
142
|
+
await this.successLog('Successfully re-authenticated with credentials');
|
|
143
|
+
// Set up axios with new token
|
|
144
|
+
if (this.tokenSet.access_token) {
|
|
145
|
+
axios.defaults.headers.common = {
|
|
146
|
+
Authorization: `Bearer ${this.tokenSet.access_token}`,
|
|
147
|
+
};
|
|
148
|
+
// Schedule next refresh
|
|
149
|
+
if (this.tokenSet.expires_in) {
|
|
150
|
+
setTimeout(this.startRefreshTokenLogic.bind(this), 1000 * (this.tokenSet.expires_in - 2000));
|
|
151
|
+
}
|
|
152
|
+
return; // Successfully recovered
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (reAuthError) {
|
|
156
|
+
await this.errorLog(`Failed to re-authenticate: ${reAuthError.message ?? reAuthError}`);
|
|
157
|
+
await this.errorLog('Please verify your SmartHQ credentials are correct in the Homebridge config');
|
|
158
|
+
await this.errorLog('You may need to log in to the GE SmartHQ app to ensure your account is active');
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
await this.errorLog('No credentials available for re-authentication');
|
|
163
|
+
await this.errorLog('Please ensure username and password are set in your Homebridge config');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
await this.errorLog('Submit Bugs Here: https://bit.ly/smarthq-bug-report');
|
|
167
|
+
throw e; // Re-throw to stop execution only if recovery failed
|
|
135
168
|
}
|
|
136
169
|
}
|
|
137
170
|
else {
|
|
@@ -243,6 +276,7 @@ export class SmartHQPlatform {
|
|
|
243
276
|
case 'Air Conditioner':
|
|
244
277
|
case 'Portable AC':
|
|
245
278
|
case 'Split Air Conditioner':
|
|
279
|
+
case 'Through Wall AC':
|
|
246
280
|
await this.createSmartHQAirConditioner(userId, device, details, features);
|
|
247
281
|
break;
|
|
248
282
|
case 'Hood':
|