homebridge-melcloud-control 4.6.3 → 4.6.4

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 CHANGED
@@ -24,6 +24,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
24
24
  - For plugin < v4.6.0 use Homebridge UI <= v5.5.0
25
25
  - For plugin >= v4.6.0 use Homebridge UI >= v5.13.0
26
26
 
27
+ # [4.6.4] - (10.01.2026)
28
+
29
+ ## Changes
30
+
31
+ - config schema updated
32
+ - fix hide log success and dev info
33
+ - bump dependencies
34
+ - cleanup
35
+
27
36
  # [4.6.3] - (01.01.2026)
28
37
 
29
38
  ## Changes
@@ -2341,13 +2341,13 @@
2341
2341
  "description": "This enable MQTT client."
2342
2342
  },
2343
2343
  "host": {
2344
- "title": "IP / Hostname",
2344
+ "title": "IP/Hostname",
2345
2345
  "type": "string",
2346
2346
  "placeholder": "ip or hostname",
2347
2347
  "format": "hostname",
2348
- "description": "Here set the IP / Hostname of MQTT Broker.",
2348
+ "description": "Here set the IP/Hostname of MQTT Broker.",
2349
2349
  "condition": {
2350
- "functionBody": "return model.accounts[arrayIndices].mqtt.enable === true;"
2350
+ "functionBody": "return model.devices[arrayIndices].mqtt.enable === true;"
2351
2351
  }
2352
2352
  },
2353
2353
  "port": {
@@ -2356,16 +2356,16 @@
2356
2356
  "placeholder": 1883,
2357
2357
  "description": "Here set the port of MQTT Broker.",
2358
2358
  "condition": {
2359
- "functionBody": "return model.accounts[arrayIndices].mqtt.enable === true;"
2359
+ "functionBody": "return model.devices[arrayIndices].mqtt.enable === true;"
2360
2360
  }
2361
2361
  },
2362
2362
  "clientId": {
2363
- "title": "Client Id",
2363
+ "title": "Client ID",
2364
2364
  "type": "string",
2365
2365
  "placeholder": "client id",
2366
- "description": "Here optional set the Client Id of MQTT Broker.",
2366
+ "description": "Here optional set the Client ID of MQTT Broker.",
2367
2367
  "condition": {
2368
- "functionBody": "return model.accounts[arrayIndices].mqtt.enable === true"
2368
+ "functionBody": "return model.devices[arrayIndices].mqtt.enable === true"
2369
2369
  }
2370
2370
  },
2371
2371
  "prefix": {
@@ -2374,7 +2374,7 @@
2374
2374
  "placeholder": "home",
2375
2375
  "description": "Here set the prefix.",
2376
2376
  "condition": {
2377
- "functionBody": "return model.accounts[arrayIndices].mqtt.enable === true;"
2377
+ "functionBody": "return model.devices[arrayIndices].mqtt.enable === true;"
2378
2378
  }
2379
2379
  },
2380
2380
  "auth": {
@@ -2392,7 +2392,7 @@
2392
2392
  "placeholder": "user",
2393
2393
  "description": "Here set the user of MQTT Broker.",
2394
2394
  "condition": {
2395
- "functionBody": "return model.accounts[arrayIndices].mqtt.auth.enable === true;"
2395
+ "functionBody": "return model.devices[arrayIndices].mqtt.auth.enable === true;"
2396
2396
  }
2397
2397
  },
2398
2398
  "passwd": {
@@ -2402,13 +2402,33 @@
2402
2402
  "description": "Here set the password of MQTT Broker.",
2403
2403
  "format": "password",
2404
2404
  "condition": {
2405
- "functionBody": "return model.accounts[arrayIndices].mqtt.auth.enable === true;"
2405
+ "functionBody": "return model.devices[arrayIndices].mqtt.auth.enable === true;"
2406
2406
  }
2407
2407
  }
2408
2408
  },
2409
2409
  "condition": {
2410
- "functionBody": "return model.accounts[arrayIndices].mqtt.enable === true;"
2411
- }
2410
+ "functionBody": "return model.devices[arrayIndices].mqtt.enable === true;"
2411
+ },
2412
+ "allOf": [
2413
+ {
2414
+ "if": {
2415
+ "required": [
2416
+ "enable"
2417
+ ],
2418
+ "properties": {
2419
+ "enable": {
2420
+ "const": true
2421
+ }
2422
+ }
2423
+ },
2424
+ "then": {
2425
+ "required": [
2426
+ "user",
2427
+ "passwd"
2428
+ ]
2429
+ }
2430
+ }
2431
+ ]
2412
2432
  }
2413
2433
  }
2414
2434
  }
package/index.js CHANGED
@@ -89,7 +89,7 @@ class MelCloudPlatform {
89
89
  if (logLevel.warn) log.warn(`Unknown account type: ${account.type}.`);
90
90
  return;
91
91
  }
92
- melcloud.on('success', (msg) => log.success(`${name}, ${msg}`))
92
+ melcloud.on('success', (msg) => logLevel.success && log.success(`${name}, ${msg}`))
93
93
  .on('info', (msg) => log.info(`${name}, ${msg}`))
94
94
  .on('debug', (msg) => log.info(`${name}, debug: ${msg}`))
95
95
  .on('warn', (msg) => log.warn(`${name}, ${msg}`))
@@ -190,7 +190,7 @@ class MelCloudPlatform {
190
190
  }
191
191
 
192
192
  configuredDevice.on('devInfo', (info) => logLevel.devInfo && log.info(info))
193
- .on('success', (msg) => log.success(`${name}, ${deviceTypeString}, ${deviceName}, ${msg}`))
193
+ .on('success', (msg) => logLevel.success && log.success(`${name}, ${deviceTypeString}, ${deviceName}, ${msg}`))
194
194
  .on('info', (msg) => log.info(`${name}, ${deviceTypeString}, ${deviceName}, ${msg}`))
195
195
  .on('debug', (msg) => log.info(`${name}, ${deviceTypeString}, ${deviceName}, debug: ${msg}`))
196
196
  .on('warn', (msg) => log.warn(`${name}, ${deviceTypeString}, ${deviceName}, ${msg}`))
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "displayName": "MELCloud Control",
3
3
  "name": "homebridge-melcloud-control",
4
- "version": "4.6.3",
4
+ "version": "4.6.4",
5
5
  "description": "Homebridge plugin to control Mitsubishi Air Conditioner, Heat Pump and Energy Recovery Ventilation.",
6
6
  "license": "MIT",
7
7
  "author": "grzegorz914",
@@ -31,7 +31,7 @@
31
31
  "LICENSE"
32
32
  ],
33
33
  "engines": {
34
- "homebridge": "^1.8.0 || ^2.0.0 || ^2.0.0-beta.65 || ^2.0.0-alpha.60",
34
+ "homebridge": "^1.8.0 || ^2.0.0 || ^2.0.0-beta.68 || ^2.0.0-alpha.81",
35
35
  "node": "^20 || ^22 || ^24 || ^25"
36
36
  },
37
37
  "dependencies": {
@@ -40,7 +40,7 @@
40
40
  "axios": "^1.13.2",
41
41
  "express": "^5.2.1",
42
42
  "puppeteer": "^24.34.0",
43
- "ws": "^8.18.3"
43
+ "ws": "^8.19.0"
44
44
  },
45
45
  "keywords": [
46
46
  "homebridge",
package/src/deviceata.js CHANGED
@@ -988,7 +988,6 @@ class DeviceAta extends EventEmitter {
988
988
  this.presetControlServices = [];
989
989
  this.presetControlSensorServices = [];
990
990
  this.presets.forEach((preset, i) => {
991
- const presetData = presetsOnServer.find(p => p.ID === preset.id);
992
991
 
993
992
  //get name
994
993
  const name = preset.name || `Preset ${i}`;
@@ -1016,6 +1015,8 @@ class DeviceAta extends EventEmitter {
1016
1015
  switch (state) {
1017
1016
  case true:
1018
1017
  preset.previousSettings = deviceData.Device;
1018
+
1019
+ const presetData = presetsOnServer.find(p => String(p.ID) === preset.id);
1019
1020
  deviceData.Device.Power = presetData.Power;
1020
1021
  deviceData.Device.OperationMode = presetData.OperationMode;
1021
1022
  deviceData.Device.SetTemperature = presetData.SetTemperature;
@@ -1065,7 +1066,6 @@ class DeviceAta extends EventEmitter {
1065
1066
  if (this.logDebug) this.emit('debug', `Prepare schedules services`);
1066
1067
  this.scheduleSensorServices = [];
1067
1068
  this.schedules.forEach((schedule, i) => {
1068
- const scheduleData = schedulesOnServer.find(s => s.Id === schedule.id);
1069
1069
 
1070
1070
  //get name
1071
1071
  const name = schedule.name || `Schedule ${i}`;
@@ -1092,6 +1092,7 @@ class DeviceAta extends EventEmitter {
1092
1092
  })
1093
1093
  .onSet(async (state) => {
1094
1094
  try {
1095
+ const scheduleData = schedulesOnServer.find(s => s.Id === schedule.id);
1095
1096
  deviceData.ScheduleEnabled = state;
1096
1097
  if (this.logInfo) this.emit('info', `Schedules: ${state ? 'Enabled' : 'Disabled'}`);
1097
1098
  await this.melCloudAta.send(this.accountType, this.displayType, deviceData, 'schedule', scheduleData);
@@ -1140,7 +1141,6 @@ class DeviceAta extends EventEmitter {
1140
1141
  this.sceneControlServices = [];
1141
1142
  this.sceneControlSensorServices = [];
1142
1143
  this.scenes.forEach((scene, i) => {
1143
- const sceneData = scenesOnServer.find(s => s.Id === scene.id);
1144
1144
 
1145
1145
  //get preset name
1146
1146
  const name = scene.name || `Scene ${i}`;
@@ -1165,6 +1165,7 @@ class DeviceAta extends EventEmitter {
1165
1165
  })
1166
1166
  .onSet(async (state) => {
1167
1167
  try {
1168
+ const sceneData = scenesOnServer.find(s => s.Id === scene.id);
1168
1169
  sceneData.Enabled = state;
1169
1170
  if (this.logInfo) this.emit('info', `Scene ${name}: ${state ? 'Set' : 'Unset'}`);
1170
1171
  await this.melCloudAta.send(this.accountType, this.displayType, deviceData, 'scene', sceneData);
@@ -1816,7 +1817,7 @@ class DeviceAta extends EventEmitter {
1816
1817
  //presets
1817
1818
  if (this.presets.length > 0) {
1818
1819
  this.presets.forEach((preset, i) => {
1819
- const presetData = presetsOnServer.find(p => p.ID === preset.id);
1820
+ const presetData = presetsOnServer.find(p => String(p.ID) === preset.id);
1820
1821
  if (!presetData) return;
1821
1822
 
1822
1823
  const characteristicType = preset.characteristicType;
package/src/deviceatw.js CHANGED
@@ -1221,7 +1221,6 @@ class DeviceAtw extends EventEmitter {
1221
1221
  this.presetControlServices = [];
1222
1222
  this.presetControlSensorServices = [];
1223
1223
  this.presets.forEach((preset, i) => {
1224
- const presetData = presetsOnServer.find(p => p.ID === preset.id);
1225
1224
 
1226
1225
  //get name
1227
1226
  const name = preset.name || `Preset ${i}`;
@@ -1249,6 +1248,8 @@ class DeviceAtw extends EventEmitter {
1249
1248
  switch (state) {
1250
1249
  case true:
1251
1250
  preset.previousSettings = deviceData.Device;
1251
+
1252
+ const presetData = presetsOnServer.find(p => String(p.ID) === preset.id);
1252
1253
  deviceData.Device.Power = presetData.Power;
1253
1254
  deviceData.Device.OperationMode = presetData.OperationMode;
1254
1255
  deviceData.Device.SetTemperature = presetData.SetTemperature;
@@ -1298,7 +1299,6 @@ class DeviceAtw extends EventEmitter {
1298
1299
  if (this.logDebug) this.emit('debug', `Prepare schedules services`);
1299
1300
  this.scheduleSensorServices = [];
1300
1301
  this.schedules.forEach((schedule, i) => {
1301
- const scheduleData = schedulesOnServer.find(s => s.Id === schedule.id);
1302
1302
 
1303
1303
  //get name
1304
1304
  const name = schedule.name || `Schedule ${i}`;
@@ -1325,6 +1325,7 @@ class DeviceAtw extends EventEmitter {
1325
1325
  })
1326
1326
  .onSet(async (state) => {
1327
1327
  try {
1328
+ const scheduleData = schedulesOnServer.find(s => s.Id === schedule.id);
1328
1329
  deviceData.ScheduleEnabled = state;
1329
1330
  if (this.logInfo) this.emit('info', `Schedules: ${state ? 'Enabled' : 'Disabled'}`);
1330
1331
  await this.melCloudAtw.send(this.accountType, this.displayType, deviceData, 'schedule', scheduleData);
@@ -1373,7 +1374,6 @@ class DeviceAtw extends EventEmitter {
1373
1374
  this.sceneControlServices = [];
1374
1375
  this.sceneControlSensorServices = [];
1375
1376
  this.scenes.forEach((scene, i) => {
1376
- const sceneData = scenesOnServer.find(s => s.Id === scene.id);
1377
1377
 
1378
1378
  //get name
1379
1379
  const name = scene.name || `Scens ${i}`;
@@ -1398,6 +1398,7 @@ class DeviceAtw extends EventEmitter {
1398
1398
  })
1399
1399
  .onSet(async (state) => {
1400
1400
  try {
1401
+ const sceneData = scenesOnServer.find(s => s.Id === scene.id);
1401
1402
  sceneData.Enabled = state;
1402
1403
  if (this.logInfo) this.emit('info', `Scene ${name}: ${state ? 'Set' : 'Unset'}`);
1403
1404
  await this.melCloudAtw.send(this.accountType, this.displayType, deviceData, 'scene', sceneData);
@@ -2203,7 +2204,7 @@ class DeviceAtw extends EventEmitter {
2203
2204
  //presets
2204
2205
  if (this.presets.length > 0) {
2205
2206
  this.presets.forEach((preset, i) => {
2206
- const presetData = presetsOnServer.find(p => p.ID === preset.id);
2207
+ const presetData = presetsOnServer.find(p => String(p.ID) === preset.id);
2207
2208
  if (!presetData) return;
2208
2209
 
2209
2210
  const characteristicType = preset.characteristicType;
package/src/deviceerv.js CHANGED
@@ -761,7 +761,6 @@ class DeviceErv extends EventEmitter {
761
761
  this.presetControlServices = [];
762
762
  this.presetControlSensorServices = [];
763
763
  this.presets.forEach((preset, i) => {
764
- const presetData = presetsOnServer.find(p => p.ID === preset.id);
765
764
 
766
765
  //get name
767
766
  const name = preset.name || `Preset ${i}`;
@@ -789,6 +788,8 @@ class DeviceErv extends EventEmitter {
789
788
  switch (state) {
790
789
  case true:
791
790
  preset.previousSettings = deviceData.Device;
791
+
792
+ const presetData = presetsOnServer.find(p => String(p.ID) === preset.id);
792
793
  deviceData.Device.Power = presetData.Power;
793
794
  deviceData.Device.OperationMode = presetData.OperationMode;
794
795
  deviceData.Device.SetTemperature = presetData.SetTemperature;
@@ -838,7 +839,6 @@ class DeviceErv extends EventEmitter {
838
839
  if (this.logDebug) this.emit('debug', `Prepare schedules services`);
839
840
  this.scheduleSensorServices = [];
840
841
  this.schedules.forEach((schedule, i) => {
841
- const scheduleData = schedulesOnServer.find(s => s.Id === schedule.id);
842
842
 
843
843
  //get name
844
844
  const name = schedule.name || `Schedule ${i}`;
@@ -865,6 +865,7 @@ class DeviceErv extends EventEmitter {
865
865
  })
866
866
  .onSet(async (state) => {
867
867
  try {
868
+ const scheduleData = schedulesOnServer.find(s => s.Id === schedule.id);
868
869
  deviceData.ScheduleEnabled = state;
869
870
  if (this.logInfo) this.emit('info', `Schedules: ${state ? 'Enabled' : 'Disabled'}`);
870
871
  await this.melCloudErv.send(this.accountType, this.displayType, deviceData, 'schedule', scheduleData);
@@ -913,7 +914,6 @@ class DeviceErv extends EventEmitter {
913
914
  this.sceneControlServices = [];
914
915
  this.sceneControlSensorServices = [];
915
916
  this.scenes.forEach((scene, i) => {
916
- const sceneData = scenesOnServer.find(s => s.Id === scene.id);
917
917
 
918
918
  //get name
919
919
  const name = scene.name || `Scene ${i}`;
@@ -938,6 +938,7 @@ class DeviceErv extends EventEmitter {
938
938
  })
939
939
  .onSet(async (state) => {
940
940
  try {
941
+ const sceneData = scenesOnServer.find(s => s.Id === scene.id);
941
942
  sceneData.Enabled = state;
942
943
  if (this.logInfo) this.emit('info', `Scene ${name}: ${state ? 'Set' : 'Unset'}`);
943
944
  await this.melCloudErv.send(this.accountType, this.displayType, deviceData, 'scene', sceneData);
@@ -1423,7 +1424,7 @@ class DeviceErv extends EventEmitter {
1423
1424
  //presets
1424
1425
  if (this.presets.length > 0) {
1425
1426
  this.presets.forEach((preset, i) => {
1426
- const presetData = presetsOnServer.find(p => p.ID === preset.id);
1427
+ const presetData = presetsOnServer.find(p => String(p.ID) === preset.id);
1427
1428
  if (!presetData) return;
1428
1429
 
1429
1430
  const characteristicType = preset.characteristicType;