homebridge-melcloud-control 4.4.1-beta.4 → 4.4.1-beta.40
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 +10 -0
- package/README.md +55 -55
- package/config.schema.json +54 -54
- package/homebridge-ui/public/index.html +131 -118
- package/index.js +18 -6
- package/package.json +2 -2
- package/src/constants.js +62 -50
- package/src/deviceata.js +25 -18
- package/src/deviceatw.js +6 -10
- package/src/deviceerv.js +61 -60
- package/src/functions.js +105 -111
- package/src/melcloud.js +10 -8
- package/src/melcloudata.js +41 -10
- package/src/melcloudatw.js +25 -9
- package/src/melclouderv.js +24 -8
- package/src/melcloudhome.js +40 -36
|
@@ -204,19 +204,22 @@
|
|
|
204
204
|
}
|
|
205
205
|
});
|
|
206
206
|
|
|
207
|
-
//
|
|
208
|
-
function
|
|
209
|
-
const
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
for (let i =
|
|
213
|
-
const
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
207
|
+
// Generic remove function
|
|
208
|
+
function removeStaleEntities(configEntities, MelcloudEntities, getConfigId, getMelcloudId) {
|
|
209
|
+
const serverIds = new Set(MelcloudEntities.map(item => String(getMelcloudId(item))));
|
|
210
|
+
const removedEntities = [];
|
|
211
|
+
|
|
212
|
+
for (let i = configEntities.length - 1; i >= 0; i--) {
|
|
213
|
+
const entity = configEntities[i];
|
|
214
|
+
const entityId = String(getConfigId(entity));
|
|
215
|
+
|
|
216
|
+
if (!serverIds.has(entityId)) {
|
|
217
|
+
removedEntities.push(entity);
|
|
218
|
+
configEntities.splice(i, 1);
|
|
217
219
|
}
|
|
218
220
|
}
|
|
219
|
-
|
|
221
|
+
|
|
222
|
+
return removedEntities;
|
|
220
223
|
}
|
|
221
224
|
|
|
222
225
|
function updateInfo(id, text, color) {
|
|
@@ -227,10 +230,10 @@
|
|
|
227
230
|
}
|
|
228
231
|
}
|
|
229
232
|
|
|
233
|
+
// Login & Sync Logic
|
|
230
234
|
document.getElementById('logIn').addEventListener('click', async () => {
|
|
231
235
|
homebridge.showSpinner();
|
|
232
|
-
|
|
233
|
-
document.getElementById(`logIn`).className = "btn btn-primary";
|
|
236
|
+
document.getElementById('logIn').className = "btn btn-primary";
|
|
234
237
|
updateInfo('info', '', 'white');
|
|
235
238
|
updateInfo('info1', '', 'white');
|
|
236
239
|
updateInfo('info2', '', 'white');
|
|
@@ -238,16 +241,17 @@
|
|
|
238
241
|
try {
|
|
239
242
|
const account = this.account;
|
|
240
243
|
const response = await homebridge.request('/connect', account);
|
|
244
|
+
|
|
241
245
|
if (!response.State) {
|
|
242
246
|
homebridge.hideSpinner();
|
|
243
|
-
updateInfo('info', response.Info);
|
|
247
|
+
updateInfo('info', response.Info, 'red');
|
|
244
248
|
return;
|
|
245
249
|
}
|
|
246
250
|
|
|
247
|
-
//
|
|
248
|
-
const newInMelCloud = { ata: [], ataPresets: [], ataSchedules: [], atw: [], atwPresets: [], atwSchedules: [], erv: [], ervPresets: [], ervSchedules: [], scenes: [] };
|
|
251
|
+
// Prepare MELCloud data
|
|
252
|
+
const newInMelCloud = { ata: [], ataPresets: [], ataSchedules: [], ataScenes: [], atw: [], atwPresets: [], atwSchedules: [], atwScenes: [], erv: [], ervPresets: [], ervSchedules: [], ervScenes: [], scenes: [] };
|
|
249
253
|
const devicesInMelCloudByType = { ata: [], atw: [], erv: [] };
|
|
250
|
-
const scenesInMelCloud = response.Scenes ?? []
|
|
254
|
+
const scenesInMelCloud = response.Scenes ?? [];
|
|
251
255
|
|
|
252
256
|
response.Devices.forEach(device => {
|
|
253
257
|
if (device.Type === 0) devicesInMelCloudByType.ata.push(device);
|
|
@@ -259,118 +263,122 @@
|
|
|
259
263
|
account.atwDevices = (account.atwDevices ?? []).filter(d => String(d.id) !== '0');
|
|
260
264
|
account.ervDevices = (account.ervDevices ?? []).filter(d => String(d.id) !== '0');
|
|
261
265
|
|
|
262
|
-
const
|
|
263
|
-
const
|
|
264
|
-
const
|
|
266
|
+
const removedFromConfigAta = removeStaleEntities(account.ataDevices, devicesInMelCloudByType.ata, d => d.id, d => d.DeviceID);
|
|
267
|
+
const removedFromConfigAtw = removeStaleEntities(account.atwDevices, devicesInMelCloudByType.atw, d => d.id, d => d.DeviceID);
|
|
268
|
+
const removedFromConfigErv = removeStaleEntities(account.ervDevices, devicesInMelCloudByType.erv, d => d.id, d => d.DeviceID);
|
|
269
|
+
const removedFromConfig = { ataPresets: [], atwPresets: [], ervPresets: [], ataSchedules: [], atwSchedules: [], ervSchedules: [], scenes: [] };
|
|
270
|
+
|
|
265
271
|
|
|
272
|
+
// Handle Devices
|
|
266
273
|
const handleDevices = (devicesInMelCloud, devicesInConfig, deviceTypeString, newDevices, newPresets, newSchedules, newScenes) => {
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
return devicesInConfig;
|
|
358
|
-
} catch (error) {
|
|
359
|
-
updateInfo('info', `Error while processing device: ${JSON.stringify(error)}`, 'red');
|
|
360
|
-
}
|
|
274
|
+
const configDevicesMap = new Map(devicesInConfig.map(dev => [String(dev.id), dev]));
|
|
275
|
+
|
|
276
|
+
devicesInMelCloud.forEach(device => {
|
|
277
|
+
const deviceId = String(device.DeviceID); // Make sure this matches MelCloud data
|
|
278
|
+
let deviceInConfig = configDevicesMap.get(deviceId);
|
|
279
|
+
|
|
280
|
+
if (!deviceInConfig) {
|
|
281
|
+
deviceInConfig = {
|
|
282
|
+
id: deviceId,
|
|
283
|
+
type: device.Type,
|
|
284
|
+
deviceTypeString,
|
|
285
|
+
displayType: 0,
|
|
286
|
+
name: device.DeviceName,
|
|
287
|
+
};
|
|
288
|
+
devicesInConfig.push(deviceInConfig);
|
|
289
|
+
newDevices.push(deviceInConfig);
|
|
290
|
+
configDevicesMap.set(deviceId, deviceInConfig);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
//ONLY MELCLOUD - PRESETS
|
|
294
|
+
if (account.type === 'melcloud') {
|
|
295
|
+
deviceInConfig.presets = deviceInConfig.presets ?? [];
|
|
296
|
+
const presetsInMelCloud = device.Presets || [];
|
|
297
|
+
removedFromConfig.ataPresets.push(...removeStaleEntities(deviceInConfig.presets, presetsInMelCloud, p => p.id, p => p.ID));
|
|
298
|
+
const presetIds = new Set(deviceInConfig.presets.map(p => String(p.id)));
|
|
299
|
+
presetsInMelCloud.forEach((preset, index) => {
|
|
300
|
+
const presetId = String(preset.ID);
|
|
301
|
+
if (!presetIds.has(presetId)) {
|
|
302
|
+
const presetObj = {
|
|
303
|
+
id: presetId,
|
|
304
|
+
displayType: 0,
|
|
305
|
+
name: preset.NumberDescription || `Preset ${index}`,
|
|
306
|
+
namePrefix: false
|
|
307
|
+
};
|
|
308
|
+
deviceInConfig.presets.push(presetObj);
|
|
309
|
+
newPresets.push(presetObj);
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
//ONLY MELCLOUD HOME - SCHEDULES & SCENES
|
|
315
|
+
if (account.type === 'melcloudhome') {
|
|
316
|
+
// SCHEDULES
|
|
317
|
+
deviceInConfig.schedules = deviceInConfig.schedules ?? [];
|
|
318
|
+
const schedulesInMelCloud = device.Schedule || [];
|
|
319
|
+
removedFromConfig.ataSchedules.push(...removeStaleEntities(deviceInConfig.schedules, schedulesInMelCloud, s => s.id, s => s.Id));
|
|
320
|
+
const scheduleIds = new Set(deviceInConfig.schedules.map(s => String(s.id)));
|
|
321
|
+
schedulesInMelCloud.forEach((schedule, index) => {
|
|
322
|
+
const scheduleId = String(schedule.Id);
|
|
323
|
+
if (!scheduleIds.has(scheduleId)) {
|
|
324
|
+
const scheduleObj = {
|
|
325
|
+
id: scheduleId,
|
|
326
|
+
displayType: 0,
|
|
327
|
+
name: `Schedule ${index}`,
|
|
328
|
+
namePrefix: false
|
|
329
|
+
};
|
|
330
|
+
deviceInConfig.schedules.push(scheduleObj);
|
|
331
|
+
newSchedules.push(scheduleObj);
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
// SCENES
|
|
336
|
+
deviceInConfig.scenes = deviceInConfig.scenes ?? [];
|
|
337
|
+
|
|
338
|
+
// Usuwanie nieaktualnych scen
|
|
339
|
+
removedFromConfig.scenes.push(...removeStaleEntities(deviceInConfig.scenes, scenesInMelCloud, s => s.id, s => s.Id));
|
|
340
|
+
const sceneIds = new Set(deviceInConfig.scenes.map(s => String(s.id)));
|
|
341
|
+
scenesInMelCloud.forEach((scene, index) => {
|
|
342
|
+
const sceneId = String(scene.Id);
|
|
343
|
+
|
|
344
|
+
// Sprawdzamy, czy scena dotyczy danego urządzenia w AtaSceneSettings lub AtwSceneSettings
|
|
345
|
+
const appliesToDevice = (scene.AtaSceneSettings ?? []).some(s => s.UnitId === deviceInConfig.id) || (scene.AtwSceneSettings ?? []).some(s => s.UnitId === deviceInConfig.id) || (scene.ErvSceneSettings ?? []).some(s => s.UnitId === deviceInConfig.id);
|
|
346
|
+
|
|
347
|
+
if (appliesToDevice && !sceneIds.has(sceneId)) {
|
|
348
|
+
const sceneObj = {
|
|
349
|
+
id: sceneId,
|
|
350
|
+
displayType: 0,
|
|
351
|
+
name: scene.Name || `Scene ${index}`,
|
|
352
|
+
namePrefix: false
|
|
353
|
+
};
|
|
354
|
+
deviceInConfig.scenes.push(sceneObj);
|
|
355
|
+
newScenes.push(sceneObj);
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
return devicesInConfig;
|
|
361
364
|
};
|
|
362
365
|
|
|
366
|
+
// Execute device handlers
|
|
363
367
|
account.ataDevices = handleDevices(devicesInMelCloudByType.ata, account.ataDevices, "Air Conditioner", newInMelCloud.ata, newInMelCloud.ataPresets, newInMelCloud.ataSchedules, newInMelCloud.scenes);
|
|
364
368
|
account.atwDevices = handleDevices(devicesInMelCloudByType.atw, account.atwDevices, "Heat Pump", newInMelCloud.atw, newInMelCloud.atwPresets, newInMelCloud.atwSchedules, newInMelCloud.scenes);
|
|
365
369
|
account.ervDevices = handleDevices(devicesInMelCloudByType.erv, account.ervDevices, "Energy Recovery Ventilation", newInMelCloud.erv, newInMelCloud.ervPresets, newInMelCloud.ervSchedules, newInMelCloud.scenes);
|
|
366
370
|
|
|
371
|
+
// Summary
|
|
367
372
|
const newDevicesCount = newInMelCloud.ata.length + newInMelCloud.atw.length + newInMelCloud.erv.length;
|
|
368
373
|
const newPresetsCount = newInMelCloud.ataPresets.length + newInMelCloud.atwPresets.length + newInMelCloud.ervPresets.length;
|
|
369
374
|
const newSchedulesCount = newInMelCloud.ataSchedules.length + newInMelCloud.atwSchedules.length + newInMelCloud.ervSchedules.length;
|
|
370
375
|
const newScenesCount = newInMelCloud.scenes.length;
|
|
371
|
-
const removedDevicesCount =
|
|
376
|
+
const removedDevicesCount = removedFromConfigAta.length + removedFromConfigAtw.length + removedFromConfigErv.length;
|
|
377
|
+
const removedPresetsCount = removedFromConfig.ataPresets.length + removedFromConfig.atwPresets.length + removedFromConfig.ervPresets.length;
|
|
378
|
+
const removedSchedulesCount = removedFromConfig.ataSchedules.length + removedFromConfig.atwSchedules.length + removedFromConfig.ervSchedules.length;
|
|
379
|
+
const removedScenesCount = removedFromConfig.scenes.length
|
|
372
380
|
|
|
373
|
-
if (!newDevicesCount && !newPresetsCount && !newSchedulesCount && !newScenesCount && !removedDevicesCount) {
|
|
381
|
+
if (!newDevicesCount && !newPresetsCount && !newSchedulesCount && !newScenesCount && !removedDevicesCount && !removedPresetsCount && !removedSchedulesCount && !removedScenesCount) {
|
|
374
382
|
updateInfo('info', 'No changes detected.', 'white');
|
|
375
383
|
} else {
|
|
376
384
|
if (newDevicesCount)
|
|
@@ -380,19 +388,24 @@
|
|
|
380
388
|
if (newScenesCount || newSchedulesCount)
|
|
381
389
|
updateInfo('info1', `Found new ${newSchedulesCount ? `schedules:` : ''} ${newInMelCloud.ataSchedules.length ? `ATA: ${newInMelCloud.ataSchedules.length},` : ''} ${newInMelCloud.atwSchedules.length ? `ATW: ${newInMelCloud.atwSchedules.length},` : ''} ${newInMelCloud.ervSchedules.length ? `ERV: ${newInMelCloud.ervSchedules.length},` : ''} ${newScenesCount ? `scenes: ${newScenesCount}` : ''}.`, 'green');
|
|
382
390
|
if (removedDevicesCount)
|
|
383
|
-
updateInfo('
|
|
391
|
+
updateInfo('info', `Removed devices: ${removedFromConfigAta.length ? `ATA: ${removedFromConfigAta.length},` : ''} ${removedFromConfigAtw.length ? `ATW: ${removedFromConfigAtw.length},` : ''} ${removedFromConfigErv.length ? `ERV: ${removedFromConfigErv.length}` : ''}.`, 'orange');
|
|
392
|
+
if (removedPresetsCount)
|
|
393
|
+
updateInfo('info1', `Rempved presets: ${removedFromConfig.ataPresets.length ? `ATA: ${removedFromConfig.ataPresets.length},` : ''} ${removedFromConfig.atwPresets.length ? `ATW: ${removedFromConfig.atwPresets.length},` : ''} ${removedFromConfig.ervPresets.length ? `ERV: ${removedFromConfig.ervPresets.length}` : ''}.`, 'orange');
|
|
394
|
+
if (removedSchedulesCount || removedScenesCount)
|
|
395
|
+
updateInfo('info1', `Rempved ${removedScenesCount ? `schedules:` : ''} ${removedFromConfig.ataSchedules.length ? `ATA: ${removedFromConfig.ataSchedules.length},` : ''} ${removedFromConfig.atwSchedules.length ? `ATW: ${removedFromConfig.atwSchedules.length},` : ''} ${removedFromConfig.ervSchedules.length ? `ERV: ${removedFromConfig.ervSchedules.length},` : ''} ${removedScenesCount ? `scenes: ${removedScenesCount}` : ''}.`, 'orange');
|
|
384
396
|
}
|
|
385
397
|
|
|
386
398
|
await homebridge.updatePluginConfig(pluginConfig);
|
|
387
399
|
await homebridge.savePluginConfig(pluginConfig);
|
|
400
|
+
|
|
388
401
|
} catch (error) {
|
|
389
402
|
updateInfo('info', `Prepare config error ${JSON.stringify(error)}`, 'red');
|
|
390
|
-
document.getElementById('logIn').className = "btn btn-secondary";
|
|
391
403
|
} finally {
|
|
392
404
|
document.getElementById('logIn').className = "btn btn-secondary";
|
|
393
405
|
homebridge.hideSpinner();
|
|
394
406
|
}
|
|
395
407
|
});
|
|
396
408
|
|
|
409
|
+
|
|
397
410
|
})();
|
|
398
411
|
</script>
|
package/index.js
CHANGED
|
@@ -137,16 +137,28 @@ class MelCloudPlatform {
|
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
//chack device from config exist on melcloud
|
|
140
|
-
const
|
|
141
|
-
if (!
|
|
140
|
+
const deviceInMelCloud = melcloudDevicesList.Devices.find(d => d.DeviceID === device.id);
|
|
141
|
+
if (!deviceInMelCloud) {
|
|
142
142
|
if (logLevel.warn) log.warn(`${name}, ${deviceTypeString}, ${deviceName}, not exist on server, please login to MELCLoud from plugin UI to fix this issue.`);
|
|
143
143
|
continue;
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
+
//presets
|
|
147
|
+
const presetIds = (deviceInMelCloud.Presets ?? []).map(p => String(p.ID));
|
|
148
|
+
const presets = account.type === 'melcloud' ? (device.presets || []).filter(p => (p.displayType ?? 0) > 0 && p.id !== '0' && presetIds.includes(p.id)) : [];
|
|
149
|
+
|
|
150
|
+
//schedules
|
|
151
|
+
const schedulesIds = (deviceInMelCloud.Schedule ?? []).map(s => String(s.Id));
|
|
152
|
+
const schedules = account.type === 'melcloudhome' ? (device.schedules || []).filter(s => (s.displayType ?? 0) > 0 && s.id !== '0' && schedulesIds.includes(s.id)) : [];
|
|
153
|
+
|
|
154
|
+
//scenes
|
|
155
|
+
const scenesIds = (melcloudDevicesList.Scenes ?? []).map(s => String(s.Id));
|
|
156
|
+
const scenes = account.type === 'melcloudhome' ? (device.scenes || []).filter(s => (s.displayType ?? 0) > 0 && s.id !== '0' && scenesIds.includes(s.id)) : [];
|
|
157
|
+
|
|
146
158
|
// set rest ful port
|
|
147
159
|
account.restFul.port = (device.id).slice(-4).replace(/^0/, '9');
|
|
148
160
|
|
|
149
|
-
if (
|
|
161
|
+
if (type === 'melcloudhome') {
|
|
150
162
|
account.restFul.port = `${3000}${index}`;
|
|
151
163
|
|
|
152
164
|
try {
|
|
@@ -168,15 +180,15 @@ class MelCloudPlatform {
|
|
|
168
180
|
let configuredDevice;
|
|
169
181
|
switch (deviceType) {
|
|
170
182
|
case 0: //ATA
|
|
171
|
-
configuredDevice = new DeviceAta(api, account, device, defaultTempsFile, accountInfo, accountFile, melcloud, melcloudDevicesList);
|
|
183
|
+
configuredDevice = new DeviceAta(api, account, device, presets, schedules, scenes, defaultTempsFile, accountInfo, accountFile, melcloud, melcloudDevicesList);
|
|
172
184
|
break;
|
|
173
185
|
case 1: //ATW
|
|
174
|
-
configuredDevice = new DeviceAtw(api, account, device, defaultTempsFile, accountInfo, accountFile, melcloud, melcloudDevicesList);
|
|
186
|
+
configuredDevice = new DeviceAtw(api, account, device, presets, schedules, scenes, defaultTempsFile, accountInfo, accountFile, melcloud, melcloudDevicesList);
|
|
175
187
|
break;
|
|
176
188
|
case 2:
|
|
177
189
|
break;
|
|
178
190
|
case 3: //ERV
|
|
179
|
-
configuredDevice = new DeviceErv(api, account, device, defaultTempsFile, accountInfo, accountFile, melcloud, melcloudDevicesList);
|
|
191
|
+
configuredDevice = new DeviceErv(api, account, device, presets, schedules, scenes, defaultTempsFile, accountInfo, accountFile, melcloud, melcloudDevicesList);
|
|
180
192
|
break;
|
|
181
193
|
default:
|
|
182
194
|
if (logLevel.warn) log.warn(`${name}, ${deviceTypeString}, ${deviceName}, unknown device: ${deviceType}.`);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"displayName": "MELCloud Control",
|
|
3
3
|
"name": "homebridge-melcloud-control",
|
|
4
|
-
"version": "4.4.1-beta.
|
|
4
|
+
"version": "4.4.1-beta.40",
|
|
5
5
|
"description": "Homebridge plugin to control Mitsubishi Air Conditioner, Heat Pump and Energy Recovery Ventilation.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "grzegorz914",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"mqtt": "^5.14.1",
|
|
40
40
|
"axios": "^1.13.2",
|
|
41
41
|
"express": "^5.2.1",
|
|
42
|
-
"puppeteer": "^24.
|
|
42
|
+
"puppeteer": "^24.33.1",
|
|
43
43
|
"ws": "^8.18.3"
|
|
44
44
|
},
|
|
45
45
|
"keywords": [
|
package/src/constants.js
CHANGED
|
@@ -2,60 +2,67 @@ export const PlatformName = "melcloudcontrol";
|
|
|
2
2
|
export const PluginName = "homebridge-melcloud-control";
|
|
3
3
|
|
|
4
4
|
export const ApiUrls = {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
SetAtw: "/Device/SetAtw",
|
|
14
|
-
SetErv: "/Device/SetErv",
|
|
15
|
-
GetRefreshUnit: "/Device/RequestRefresh?id=deviceid",
|
|
16
|
-
UpdateApplicationOptions: "/User/UpdateApplicationOptions",
|
|
17
|
-
HolidayModeUpdate: "/HolidayMode/Update",
|
|
18
|
-
EnergyCostReport: "/EnergyCost/Report",
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
export const ApiUrlsHome = {
|
|
22
|
-
BaseURL: "https://melcloudhome.com",
|
|
23
|
-
GetConfiguration: "https://melcloudhome.com/api/configuration",
|
|
24
|
-
GetUserContext: "/api/user/context",
|
|
25
|
-
GetUserScenes: "/api/user/scenes",
|
|
26
|
-
PostSchedule: "/api/cloudschedule/deviceid", // POST {"days":[2],"time":"17:59:00","enabled":true,"id":"53c5e804-0663-47d0-85c2-2d8ccd2573de","power":false,"operationMode":null,"setPoint":null,"vaneVerticalDirection":null,"vaneHorizontalDirection":null,"setFanSpeed":null}
|
|
27
|
-
PostProtectionFrost: "/api/protection/frost", // POST {"enabled":true,"min":13,"max":16,"units":{"ATA":["ef333525-2699-4290-af5a-2922566676da"]}}
|
|
28
|
-
PostProtectionOverheat: "/api/protection/overheat", // POST {"enabled":true,"min":32,"max":35,"units":{"ATA":["ef333525-2699-4290-af5a-2922566676da"]}}
|
|
29
|
-
PostHolidayMode: " /api/holidaymode", // POST {"enabled":true,"startDate":"2025-11-11T17:42:24.913","endDate":"2026-06-01T09:18:00","units":{"ATA":["ef333525-2699-4290-af5a-2922566676da"]}}
|
|
30
|
-
PutAta: "/api/ataunit/deviceid",
|
|
31
|
-
PutAtw: "/api/atwunit/deviceid",
|
|
32
|
-
PutErv: "/api/ervunit/deviceid",
|
|
33
|
-
PutScheduleEnabled: "/api/cloudschedule/deviceid/enabled", // PUT {"enabled":true}
|
|
34
|
-
PutScene: {
|
|
35
|
-
Enable: "/api/scene/sceneid/enable",
|
|
36
|
-
Disable: "/api/scene/sceneid/disable",
|
|
5
|
+
Base: "https://app.melcloud.com/Mitsubishi.Wifi.Client",
|
|
6
|
+
Get: {
|
|
7
|
+
UserDetails: "/User/GetUserDetails",
|
|
8
|
+
ListDevices: "/User/ListDevices",
|
|
9
|
+
ListDeviceUnits: "/Device/ListDeviceUnits",
|
|
10
|
+
RefreshUnit: "/Device/RequestRefresh?id=deviceid",
|
|
11
|
+
DeviceState: "/Device/Get?id=DID&buildingID=BID",
|
|
12
|
+
TileState: "/Tile/Get2?id=DID&buildingID=BID",
|
|
37
13
|
},
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
14
|
+
Post: {
|
|
15
|
+
ClientLogin: "/Login/ClientLogin",
|
|
16
|
+
Ata: "/Device/SetAta",
|
|
17
|
+
Atw: "/Device/SetAtw",
|
|
18
|
+
Erv: "/Device/SetErv",
|
|
19
|
+
UpdateApplicationOptions: "/User/UpdateApplicationOptions",
|
|
20
|
+
HolidayMode: "/HolidayMode/Update",
|
|
21
|
+
EnergyCostReport: "/EnergyCost/Report",
|
|
46
22
|
},
|
|
47
|
-
|
|
48
|
-
|
|
23
|
+
Home: {
|
|
24
|
+
Base: "https://melcloudhome.com",
|
|
25
|
+
WebSocket: "wss://ws.melcloudhome.com/?hash=",
|
|
26
|
+
Get: {
|
|
27
|
+
Configuration: "/api/configuration",
|
|
28
|
+
ListDevices: "/api/user/context",
|
|
29
|
+
Scenes: "/api/user/scenes",
|
|
30
|
+
},
|
|
31
|
+
Post: {
|
|
32
|
+
ProtectionFrost: "/api/protection/frost", //{"enabled":true,"min":13,"max":16,"units":{"ATA":["deviceid"]}}
|
|
33
|
+
ProtectionOverheat: "/api/protection/overheat", //{"enabled":true,"min":32,"max":35,"units":{"ATA":["deviceid"]}}
|
|
34
|
+
HolidayMode: "/api/holidaymode", //{"enabled":true,"startDate":"2025-11-11T17:42:24.913","endDate":"2026-06-01T09:18:00","units":{"ATA":["deviceid"]}}
|
|
35
|
+
Schedule: "/api/cloudschedule/deviceid", //{"days":[2],"time":"17:59:00","enabled":true,"id":"scheduleid","power":false,"operationMode":null,"setPoint":null,"vaneVerticalDirection":null,"vaneHorizontalDirection":null,"setFanSpeed":null}
|
|
36
|
+
Scene: "/api/scene", //{"id": "sceneid", "userId": "userid","name": "Poza domem","enabled": false,"icon": "AwayIcon","ataSceneSettings": [{"unitId": "deviceid","ataSettings": { "power": false, "operationMode": "heat","setFanSpeed": "auto","vaneHorizontalDirection": "auto", "vaneVerticalDirection": "auto", "setTemperature": 21,"temperatureIncrementOverride": null,"inStandbyMode": null},"previousSettings": null}],"atwSceneSettings": []}
|
|
37
|
+
},
|
|
38
|
+
Put: {
|
|
39
|
+
Ata: "/api/ataunit/deviceid", //{ power: true,setTemperature: 22, setFanSpeed: "auto", operationMode: "heat", vaneHorizontalDirection: "auto",vaneVerticalDirection: "auto", temperatureIncrementOverride: null, inStandbyMode: null}
|
|
40
|
+
Atw: "/api/atwunit/deviceid",
|
|
41
|
+
Erv: "/api/ervunit/deviceid",
|
|
42
|
+
ScheduleEnableDisable: "/api/cloudschedule/deviceid/enabled", // {"enabled": true}
|
|
43
|
+
SceneEnableDisable: "/api/scene/sceneid/enabledisable",
|
|
44
|
+
},
|
|
45
|
+
Delete: {
|
|
46
|
+
Schedule: "/api/cloudschedule/deviceid/scheduleid",
|
|
47
|
+
Scene: "/api/scene/sceneid"
|
|
48
|
+
},
|
|
49
|
+
Referers: {
|
|
50
|
+
GetPutScenes: "https://melcloudhome.com/scenes",
|
|
51
|
+
PostHolidayMode: "https://melcloudhome.com/ata/deviceid/holidaymode",
|
|
52
|
+
PostProtectionFrost: "https://melcloudhome.com/ata/deviceid/frostprotection",
|
|
53
|
+
PostProtectionOverheat: "https://melcloudhome.com/ata/deviceid/overheatprotection",
|
|
54
|
+
PutDeviceSettings: "https://melcloudhome.com/dashboard",
|
|
55
|
+
PutScheduleEnabled: "https://melcloudhome.com/ata/deviceid/schedule",
|
|
56
|
+
}
|
|
57
|
+
}
|
|
49
58
|
};
|
|
50
59
|
|
|
51
|
-
export const DeviceType =
|
|
52
|
-
"Air Conditioner",
|
|
53
|
-
"Heat Pump",
|
|
54
|
-
"Unknown",
|
|
55
|
-
"Energy Recovery Ventilation"
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
export const TemperatureDisplayUnits = ["°C", "°F"];
|
|
60
|
+
export const DeviceType = {
|
|
61
|
+
0: "Air Conditioner",
|
|
62
|
+
1: "Heat Pump",
|
|
63
|
+
2: "Unknown",
|
|
64
|
+
3: "Energy Recovery Ventilation"
|
|
65
|
+
};
|
|
59
66
|
|
|
60
67
|
export const AirConditioner = {
|
|
61
68
|
SystemMapEnumToString: { 0: "Air Conditioner Off", 1: "Air Conditioner On", 2: "Air Conditioner Offline" },
|
|
@@ -183,6 +190,11 @@ export const Ventilation = {
|
|
|
183
190
|
}
|
|
184
191
|
};
|
|
185
192
|
|
|
193
|
+
export const TemperatureDisplayUnits = {
|
|
194
|
+
0: "°C",
|
|
195
|
+
1: "°F"
|
|
196
|
+
};
|
|
197
|
+
|
|
186
198
|
export const AccessLevel = {
|
|
187
199
|
Quest: 3,
|
|
188
200
|
Owner: 4
|