homebridge-melcloud-control 4.0.0-beta.18 → 4.0.0-beta.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/index.js +3 -3
- package/package.json +1 -1
- package/src/melcloud.js +61 -50
package/index.js
CHANGED
|
@@ -76,7 +76,7 @@ class MelCloudPlatform {
|
|
|
76
76
|
const accountFile = `${prefDir}/${accountName}_Account`;
|
|
77
77
|
const buildingsFile = `${prefDir}/${accountName}_Buildings`;
|
|
78
78
|
const devicesFile = `${prefDir}/${accountName}_Devices`;
|
|
79
|
-
const
|
|
79
|
+
const coociesFile = `${prefDir}/${accountName}_Coocies`;
|
|
80
80
|
|
|
81
81
|
|
|
82
82
|
//set account refresh interval
|
|
@@ -88,14 +88,14 @@ class MelCloudPlatform {
|
|
|
88
88
|
.on('start', async () => {
|
|
89
89
|
try {
|
|
90
90
|
//melcloud account
|
|
91
|
-
const melCloud = new MelCloud(user, passwd, language, accountFile, buildingsFile, devicesFile,
|
|
91
|
+
const melCloud = new MelCloud(user, passwd, language, accountFile, buildingsFile, devicesFile, coociesFile, logLevel.warn, logLevel.debug, false)
|
|
92
92
|
.on('success', (msg) => logLevel.success && log.success(`${accountName}, ${msg}`))
|
|
93
93
|
.on('info', (msg) => logLevel.info && log.info(`${accountName}, ${msg}`))
|
|
94
94
|
.on('debug', (msg) => logLevel.debug && log.info(`${accountName}, debug: ${msg}`))
|
|
95
95
|
.on('warn', (msg) => logLevel.warn && log.warn(`${accountName}, ${msg}`))
|
|
96
96
|
.on('error', (msg) => logLevel.error && log.error(`${accountName}, ${msg}`));
|
|
97
97
|
|
|
98
|
-
await melCloud.
|
|
98
|
+
await melCloud.connectHomeCoocies()
|
|
99
99
|
return;
|
|
100
100
|
|
|
101
101
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"displayName": "MELCloud Control",
|
|
3
3
|
"name": "homebridge-melcloud-control",
|
|
4
|
-
"version": "4.0.0-beta.
|
|
4
|
+
"version": "4.0.0-beta.2",
|
|
5
5
|
"description": "Homebridge plugin to control Mitsubishi Air Conditioner, Heat Pump and Energy Recovery Ventilation.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "grzegorz914",
|
package/src/melcloud.js
CHANGED
|
@@ -7,7 +7,7 @@ import Functions from './functions.js';
|
|
|
7
7
|
import { ApiUrls, ApiUrlsHome } from './constants.js';
|
|
8
8
|
|
|
9
9
|
class MelCloud extends EventEmitter {
|
|
10
|
-
constructor(user, passwd, language, accountFile, buildingsFile, devicesFile,
|
|
10
|
+
constructor(user, passwd, language, accountFile, buildingsFile, devicesFile, coociesFile, logWarn, logDebug, requestConfig) {
|
|
11
11
|
super();
|
|
12
12
|
this.user = user;
|
|
13
13
|
this.passwd = passwd;
|
|
@@ -15,7 +15,7 @@ class MelCloud extends EventEmitter {
|
|
|
15
15
|
this.accountFile = accountFile;
|
|
16
16
|
this.buildingsFile = buildingsFile;
|
|
17
17
|
this.devicesFile = devicesFile;
|
|
18
|
-
this.
|
|
18
|
+
this.coociesFile = coociesFile;
|
|
19
19
|
this.logWarn = logWarn;
|
|
20
20
|
this.logDebug = logDebug;
|
|
21
21
|
this.requestConfig = requestConfig;
|
|
@@ -213,61 +213,72 @@ class MelCloud extends EventEmitter {
|
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
-
async
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
216
|
+
async connectHomeCoocies() {
|
|
217
|
+
const loginUrl = new URL('https://live-melcloudhome.auth.eu-west-1.amazoncognito.com/login');
|
|
218
|
+
loginUrl.searchParams.set('client_id', '3g4d5l5kivuqi7oia68gib7uso');
|
|
219
|
+
loginUrl.searchParams.set('redirect_uri', 'https://auth.melcloudhome.com/signin-oidc-meu');
|
|
220
|
+
loginUrl.searchParams.set('response_type', 'code');
|
|
221
|
+
loginUrl.searchParams.set('scope', 'openid profile');
|
|
222
|
+
loginUrl.searchParams.set('response_mode', 'form_post');
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
const browser = await puppeteer.launch({
|
|
227
|
+
headless: true,
|
|
228
|
+
args: ['--no-sandbox', '--disable-setuid-sandbox']
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
const page = await browser.newPage();
|
|
232
|
+
|
|
233
|
+
// Otwórz stronę logowania
|
|
234
|
+
this.emit('warn', `Opening login page...`);
|
|
235
|
+
await page.goto(loginUrl, { waitUntil: 'networkidle2' });
|
|
236
|
+
|
|
237
|
+
// Wpisz login i hasło
|
|
238
|
+
this.emit('warn', `Typing credentials...`);
|
|
239
|
+
await page.type('input[name="username"]', this.user, { delay: 50 });
|
|
240
|
+
await page.type('input[name="password"]', this.passwd, { delay: 50 });
|
|
241
|
+
|
|
242
|
+
// Kliknij "Sign in" (przycisk AWS Cognito)
|
|
243
|
+
let buttonFound = false;
|
|
244
|
+
for (const selector of buttonSelectors) {
|
|
245
|
+
const button = await page.$(selector);
|
|
246
|
+
if (button) {
|
|
247
|
+
console.log(`Found submit button: ${selector}`);
|
|
248
|
+
await Promise.all([
|
|
249
|
+
button.click(),
|
|
250
|
+
page.waitForNavigation({ waitUntil: 'networkidle2', timeout: 15000 })
|
|
251
|
+
]);
|
|
252
|
+
buttonFound = true;
|
|
253
|
+
break;
|
|
248
254
|
}
|
|
255
|
+
}
|
|
249
256
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
}
|
|
257
|
+
if (!buttonFound) {
|
|
258
|
+
throw new Error('❌ Could not find login button on the page.');
|
|
259
|
+
}
|
|
254
260
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
261
|
+
// Poczekaj aż załaduje się MELCloud Home
|
|
262
|
+
this.emit('warn', `Waiting for redirect to melcloudhome.com...`);
|
|
263
|
+
await page.waitForTimeout(5000);
|
|
258
264
|
|
|
259
|
-
|
|
260
|
-
|
|
265
|
+
// Pobierz cookies dla domeny melcloudhome.com
|
|
266
|
+
const cookies = await page.cookies();
|
|
261
267
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
}
|
|
268
|
-
|
|
268
|
+
// Znajdź __Secure-monitorandcontrolC1 i C2
|
|
269
|
+
const c1 = cookies.find(c => c.name === '__Secure-monitorandcontrolC1')?.value || null;
|
|
270
|
+
const c2 = cookies.find(c => c.name === '__Secure-monitorandcontrolC2')?.value || null;
|
|
271
|
+
|
|
272
|
+
// Zapisz do pliku
|
|
273
|
+
const data = { C1: c1, C2: c2, date: new Date().toISOString() };
|
|
274
|
+
await this.functions.saveData(this.coociesFile, data);
|
|
269
275
|
|
|
276
|
+
await browser.close();
|
|
270
277
|
|
|
278
|
+
this.emit('warn', `Login successful.`);
|
|
279
|
+
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
271
282
|
|
|
272
283
|
async send(accountInfo) {
|
|
273
284
|
try {
|