homebridge-melcloud-control 4.2.5-beta.2 → 4.2.5-beta.3

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/src/deviceatw.js CHANGED
@@ -89,8 +89,8 @@ class DeviceAtw extends EventEmitter {
89
89
  //buttons configured
90
90
  for (const button of this.buttons) {
91
91
  button.name = button.name || 'Button'
92
- button.serviceType = [null, Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][button.displayType];
93
- button.characteristicType = [null, Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][button.displayType];
92
+ button.serviceType = serviceType[button.displayType];
93
+ button.characteristicType = characteristicType[button.displayType];
94
94
  button.state = false;
95
95
  button.previousValue = null;
96
96
  }
@@ -1371,8 +1371,9 @@ class DeviceAtw extends EventEmitter {
1371
1371
 
1372
1372
  //buttons services
1373
1373
  if (this.buttons.length > 0) {
1374
- if (this.logDebug) this.emit('debug', `Prepare buttons services`);
1375
- this.buttonsServices = [];
1374
+ if (this.logDebug) this.emit('debug', `Prepare buttons / sensors services`);
1375
+ this.buttonControlServices = [];
1376
+ this.buttonControlSensorServices = [];
1376
1377
  this.buttons.lengthforEach((button, i) => {
1377
1378
  //get button mode
1378
1379
  const mode = button.mode;
@@ -1389,160 +1390,178 @@ class DeviceAtw extends EventEmitter {
1389
1390
  const serviceName1 = namePrefix ? `${accessoryName} ${name}` : name;
1390
1391
  const serviceType = button.serviceType;
1391
1392
  const characteristicType = button.characteristicType;
1392
- const buttonService = new serviceType(serviceName, `Button ${deviceId} ${i}`);
1393
- buttonService.addOptionalCharacteristic(Characteristic.ConfiguredName);
1394
- buttonService.setCharacteristic(Characteristic.ConfiguredName, serviceName1);
1395
- buttonService.getCharacteristic(characteristicType)
1393
+
1394
+ //control
1395
+ if (button.displayType > 3) {
1396
+ if (this.logDebug) this.emit('debug', `Prepare button control ${name} service`);
1397
+ const buttonControlService = new serviceType(serviceName, `buttonControlService${deviceId} ${i}`);
1398
+ buttonControlService.addOptionalCharacteristic(Characteristic.ConfiguredName);
1399
+ buttonControlService.setCharacteristic(Characteristic.ConfiguredName, serviceName1);
1400
+ buttonControlService.getCharacteristic(characteristicType)
1401
+ .onGet(async () => {
1402
+ const state = button.state;
1403
+ return state;
1404
+ })
1405
+ .onSet(async (state) => {
1406
+ if (displayType > 0 && displayType < 3) {
1407
+ try {
1408
+ let flag = null;
1409
+ switch (mode) {
1410
+ case 0: //POWER ON,OFF
1411
+ deviceData.Device.Power = state;
1412
+ flag = HeatPump.EffectiveFlags.Power;
1413
+ break;
1414
+ case 1: //HEAT PUMP HEAT
1415
+ button.previousValue = state ? deviceData.Device.UnitStatus : button.previousValue ?? deviceData.Device.UnitStatus;
1416
+ deviceData.Device.Power = true;
1417
+ deviceData.Device.UnitStatus = state ? 0 : button.previousValue;
1418
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationMode;
1419
+ break;
1420
+ case 2: //COOL
1421
+ button.previousValue = state ? deviceData.Device.UnitStatus : button.previousValue ?? deviceData.Device.UnitStatus;
1422
+ deviceData.Device.Power = true;
1423
+ deviceData.Device.UnitStatus = state ? 1 : button.previousValue;
1424
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationMode;
1425
+ break;
1426
+ case 3: //HOLIDAY
1427
+ if (this.accountType === 'melcloud') {
1428
+ deviceData.Device.HolidayMode = state;
1429
+ flag = HeatPump.EffectiveFlags.HolidayMode;
1430
+ }
1431
+
1432
+ if (this.accountType === 'melcloudhome') {
1433
+ deviceData.Device.HolidayMode.Enabled = state;
1434
+ flag = 'holidaymode';
1435
+ }
1436
+ break;
1437
+ case 10: //ALL ZONES PHYSICAL LOCK CONTROL
1438
+ deviceData.Device.ProhibitZone1 = state;
1439
+ deviceData.Device.ProhibitHotWater = state;
1440
+ deviceData.Device.ProhibitZone2 = state;
1441
+ flag = HeatPump.EffectiveFlags.ProhibitHeatingZone1 + HeatPump.EffectiveFlags.ProhibitHotWater + HeatPump.EffectiveFlags.ProhibitHeatingZone2;
1442
+ break;
1443
+ case 20: //ZONE 1 HEAT THERMOSTAT
1444
+ button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue ?? deviceData.Device.OperationModeZone1;
1445
+ deviceData.Device.Power = true;
1446
+ deviceData.Device.OperationModeZone1 = state ? 0 : button.previousValue;
1447
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone1;
1448
+ break;
1449
+ case 21: //HEAT FLOW
1450
+ button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue ?? deviceData.Device.OperationModeZone1;
1451
+ deviceData.Device.Power = true;
1452
+ deviceData.Device.OperationModeZone1 = state ? 1 : button.previousValue;
1453
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone1;
1454
+ break;
1455
+ case 22: //HEAT CURVE
1456
+ button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue ?? deviceData.Device.OperationModeZone1;
1457
+ deviceData.Device.Power = true;
1458
+ deviceData.Device.OperationModeZone1 = state ? 2 : button.previousValue;
1459
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone1;
1460
+ break;
1461
+ case 23: //COOL THERMOSTAT
1462
+ button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue ?? deviceData.Device.OperationModeZone1;
1463
+ deviceData.Device.Power = true;
1464
+ deviceData.Device.OperationModeZone1 = state ? 3 : button.previousValue;
1465
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone1;
1466
+ break;
1467
+ case 24: //COOL FLOW
1468
+ button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue ?? deviceData.Device.OperationModeZone1;
1469
+ deviceData.Device.Power = true;
1470
+ deviceData.Device.OperationModeZone1 = state ? 4 : button.previousValue;
1471
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone1;
1472
+ break;
1473
+ case 25: //FLOOR DRY UP
1474
+ button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue ?? deviceData.Device.OperationModeZone1;
1475
+ deviceData.Device.Power = true;
1476
+ deviceData.Device.OperationModeZone1 = state ? 5 : button.previousValue;
1477
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone1;
1478
+ break;
1479
+ case 30: //PHYSICAL LOCK CONTROL
1480
+ deviceData.Device.ProhibitZone1 = state;
1481
+ flag = HeatPump.EffectiveFlags.ProhibitHeatingZone1;
1482
+ break;
1483
+ case 40: //HOT WATER NORMAL/FORCE HOT WATER
1484
+ deviceData.Device.Power = true;
1485
+ deviceData.Device.ForcedHotWaterMode = state;
1486
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.ForcedHotWaterMode;
1487
+ break;
1488
+ case 41: //NORMAL/ECO
1489
+ deviceData.Device.Power = true;
1490
+ deviceData.Device.EcoHotWater = state;
1491
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.EcoHotWater;
1492
+ break;
1493
+ case 50: //PHYSICAL LOCK CONTROL
1494
+ deviceData.Device.ProhibitHotWater = state;
1495
+ flag = HeatPump.EffectiveFlags.ProhibitHotWater;
1496
+ break;
1497
+ case 60: //ZONE 2 HEAT THERMOSTAT
1498
+ button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue ?? deviceData.Device.OperationModeZone2;
1499
+ deviceData.Device.Power = true;
1500
+ deviceData.Device.OperationModeZone2 = state ? 0 : button.previousValue;
1501
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone2;
1502
+ break;
1503
+ case 61: // HEAT FLOW
1504
+ button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue ?? deviceData.Device.OperationModeZone2;
1505
+ deviceData.Device.Power = true;
1506
+ deviceData.Device.OperationModeZone2 = state ? 1 : button.previousValue;
1507
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone2;
1508
+ break;
1509
+ case 62: //HEAT CURVE
1510
+ button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue ?? deviceData.Device.OperationModeZone2;
1511
+ deviceData.Device.Power = true;
1512
+ deviceData.Device.OperationModeZone2 = state ? 2 : button.previousValue;
1513
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone2;
1514
+ break;
1515
+ case 63: //COOL THERMOSTAT
1516
+ button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue ?? deviceData.Device.OperationModeZone2;
1517
+ deviceData.Device.Power = true;
1518
+ deviceData.Device.OperationModeZone2 = state ? 3 : button.previousValue;
1519
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone2;
1520
+ break;
1521
+ case 64: //COOL FLOW
1522
+ button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue ?? deviceData.Device.OperationModeZone2;
1523
+ deviceData.Device.Power = true;
1524
+ deviceData.Device.OperationModeZone2 = state ? 4 : button.previousValue;
1525
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone2;
1526
+ break;
1527
+ case 65: //FLOOR DRY UP
1528
+ button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue ?? deviceData.Device.OperationModeZone2;
1529
+ deviceData.Device.Power = true;
1530
+ deviceData.Device.OperationModeZone2 = state ? 5 : button.previousValue;
1531
+ flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone2;
1532
+ break;
1533
+ case 70: //PHYSICAL LOCK CONTROL
1534
+ deviceData.Device.ProhibitZone2 = state;
1535
+ HeatPump.EffectiveFlags.ProhibitHeatingZone2;
1536
+ break;
1537
+ default:
1538
+ if (this.logWarn) this.emit('warn', `Unknown button mode: ${mode}`);
1539
+ break;
1540
+ };
1541
+
1542
+ if (this.logInfo) this.emit('info', `${state ? `Set: ${name}` : `Unset: ${name}, Set: ${button.previousValue}`}`);
1543
+ await this.melCloudAtw.send(this.accountType, this.displayType, deviceData, flag);
1544
+ } catch (error) {
1545
+ if (this.logWarn) this.emit('warn', `Set button error: ${error}`);
1546
+ };
1547
+ };
1548
+ });
1549
+ this.buttonControlServices.push(buttonControlService);
1550
+ accessory.addService(buttonControlService)
1551
+ }
1552
+
1553
+ //sensor
1554
+ if (this.logDebug) this.emit('debug', `Prepare button control sensor ${name} service`);
1555
+ const buttonControlSensorService = new serviceType(serviceName, `buttonControlSensorService${deviceId} ${i}`);
1556
+ buttonControlSensorService.addOptionalCharacteristic(Characteristic.ConfiguredName);
1557
+ buttonControlSensorService.setCharacteristic(Characteristic.ConfiguredName, serviceName);
1558
+ buttonControlSensorService.getCharacteristic(characteristicType)
1396
1559
  .onGet(async () => {
1397
1560
  const state = button.state;
1398
1561
  return state;
1399
1562
  })
1400
- .onSet(async (state) => {
1401
- if (displayType > 0 && displayType < 3) {
1402
- try {
1403
- let flag = null;
1404
- switch (mode) {
1405
- case 0: //POWER ON,OFF
1406
- deviceData.Device.Power = state;
1407
- flag = HeatPump.EffectiveFlags.Power;
1408
- break;
1409
- case 1: //HEAT PUMP HEAT
1410
- button.previousValue = state ? deviceData.Device.UnitStatus : button.previousValue ?? deviceData.Device.UnitStatus;
1411
- deviceData.Device.Power = true;
1412
- deviceData.Device.UnitStatus = state ? 0 : button.previousValue;
1413
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationMode;
1414
- break;
1415
- case 2: //COOL
1416
- button.previousValue = state ? deviceData.Device.UnitStatus : button.previousValue ?? deviceData.Device.UnitStatus;
1417
- deviceData.Device.Power = true;
1418
- deviceData.Device.UnitStatus = state ? 1 : button.previousValue;
1419
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationMode;
1420
- break;
1421
- case 3: //HOLIDAY
1422
- if (this.accountType === 'melcloud') {
1423
- deviceData.Device.HolidayMode = state;
1424
- flag = HeatPump.EffectiveFlags.HolidayMode;
1425
- }
1426
-
1427
- if (this.accountType === 'melcloudhome') {
1428
- deviceData.Device.HolidayMode.Enabled = state;
1429
- flag = 'holidaymode';
1430
- }
1431
- break;
1432
- case 10: //ALL ZONES PHYSICAL LOCK CONTROL
1433
- deviceData.Device.ProhibitZone1 = state;
1434
- deviceData.Device.ProhibitHotWater = state;
1435
- deviceData.Device.ProhibitZone2 = state;
1436
- flag = HeatPump.EffectiveFlags.ProhibitHeatingZone1 + HeatPump.EffectiveFlags.ProhibitHotWater + HeatPump.EffectiveFlags.ProhibitHeatingZone2;
1437
- break;
1438
- case 20: //ZONE 1 HEAT THERMOSTAT
1439
- button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue ?? deviceData.Device.OperationModeZone1;
1440
- deviceData.Device.Power = true;
1441
- deviceData.Device.OperationModeZone1 = state ? 0 : button.previousValue;
1442
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone1;
1443
- break;
1444
- case 21: //HEAT FLOW
1445
- button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue ?? deviceData.Device.OperationModeZone1;
1446
- deviceData.Device.Power = true;
1447
- deviceData.Device.OperationModeZone1 = state ? 1 : button.previousValue;
1448
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone1;
1449
- break;
1450
- case 22: //HEAT CURVE
1451
- button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue ?? deviceData.Device.OperationModeZone1;
1452
- deviceData.Device.Power = true;
1453
- deviceData.Device.OperationModeZone1 = state ? 2 : button.previousValue;
1454
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone1;
1455
- break;
1456
- case 23: //COOL THERMOSTAT
1457
- button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue ?? deviceData.Device.OperationModeZone1;
1458
- deviceData.Device.Power = true;
1459
- deviceData.Device.OperationModeZone1 = state ? 3 : button.previousValue;
1460
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone1;
1461
- break;
1462
- case 24: //COOL FLOW
1463
- button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue ?? deviceData.Device.OperationModeZone1;
1464
- deviceData.Device.Power = true;
1465
- deviceData.Device.OperationModeZone1 = state ? 4 : button.previousValue;
1466
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone1;
1467
- break;
1468
- case 25: //FLOOR DRY UP
1469
- button.previousValue = state ? deviceData.Device.OperationModeZone1 : button.previousValue ?? deviceData.Device.OperationModeZone1;
1470
- deviceData.Device.Power = true;
1471
- deviceData.Device.OperationModeZone1 = state ? 5 : button.previousValue;
1472
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone1;
1473
- break;
1474
- case 30: //PHYSICAL LOCK CONTROL
1475
- deviceData.Device.ProhibitZone1 = state;
1476
- flag = HeatPump.EffectiveFlags.ProhibitHeatingZone1;
1477
- break;
1478
- case 40: //HOT WATER NORMAL/FORCE HOT WATER
1479
- deviceData.Device.Power = true;
1480
- deviceData.Device.ForcedHotWaterMode = state;
1481
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.ForcedHotWaterMode;
1482
- break;
1483
- case 41: //NORMAL/ECO
1484
- deviceData.Device.Power = true;
1485
- deviceData.Device.EcoHotWater = state;
1486
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.EcoHotWater;
1487
- break;
1488
- case 50: //PHYSICAL LOCK CONTROL
1489
- deviceData.Device.ProhibitHotWater = state;
1490
- flag = HeatPump.EffectiveFlags.ProhibitHotWater;
1491
- break;
1492
- case 60: //ZONE 2 HEAT THERMOSTAT
1493
- button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue ?? deviceData.Device.OperationModeZone2;
1494
- deviceData.Device.Power = true;
1495
- deviceData.Device.OperationModeZone2 = state ? 0 : button.previousValue;
1496
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone2;
1497
- break;
1498
- case 61: // HEAT FLOW
1499
- button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue ?? deviceData.Device.OperationModeZone2;
1500
- deviceData.Device.Power = true;
1501
- deviceData.Device.OperationModeZone2 = state ? 1 : button.previousValue;
1502
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone2;
1503
- break;
1504
- case 62: //HEAT CURVE
1505
- button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue ?? deviceData.Device.OperationModeZone2;
1506
- deviceData.Device.Power = true;
1507
- deviceData.Device.OperationModeZone2 = state ? 2 : button.previousValue;
1508
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone2;
1509
- break;
1510
- case 63: //COOL THERMOSTAT
1511
- button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue ?? deviceData.Device.OperationModeZone2;
1512
- deviceData.Device.Power = true;
1513
- deviceData.Device.OperationModeZone2 = state ? 3 : button.previousValue;
1514
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone2;
1515
- break;
1516
- case 64: //COOL FLOW
1517
- button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue ?? deviceData.Device.OperationModeZone2;
1518
- deviceData.Device.Power = true;
1519
- deviceData.Device.OperationModeZone2 = state ? 4 : button.previousValue;
1520
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone2;
1521
- break;
1522
- case 65: //FLOOR DRY UP
1523
- button.previousValue = state ? deviceData.Device.OperationModeZone2 : button.previousValue ?? deviceData.Device.OperationModeZone2;
1524
- deviceData.Device.Power = true;
1525
- deviceData.Device.OperationModeZone2 = state ? 5 : button.previousValue;
1526
- flag = HeatPump.EffectiveFlags.Power + HeatPump.EffectiveFlags.OperationModeZone2;
1527
- break;
1528
- case 70: //PHYSICAL LOCK CONTROL
1529
- deviceData.Device.ProhibitZone2 = state;
1530
- HeatPump.EffectiveFlags.ProhibitHeatingZone2;
1531
- break;
1532
- default:
1533
- if (this.logWarn) this.emit('warn', `Unknown button mode: ${mode}`);
1534
- break;
1535
- };
1536
-
1537
- if (this.logInfo) this.emit('info', `${state ? `Set: ${name}` : `Unset: ${name}, Set: ${button.previousValue}`}`);
1538
- await this.melCloudAtw.send(this.accountType, this.displayType, deviceData, flag);
1539
- } catch (error) {
1540
- if (this.logWarn) this.emit('warn', `Set button error: ${error}`);
1541
- };
1542
- };
1543
- });
1544
- this.buttonsServices.push(buttonService);
1545
- accessory.addService(buttonService)
1563
+ this.buttonControlSensorServices.push(buttonControlSensorService);
1564
+ accessory.addService(buttonControlSensorService);
1546
1565
  });
1547
1566
  };
1548
1567
 
@@ -2245,9 +2264,14 @@ class DeviceAtw extends EventEmitter {
2245
2264
  break;
2246
2265
  };
2247
2266
 
2248
- //update services
2249
- const characteristicType = button.characteristicType;
2250
- this.buttonsServices?.[i]?.updateCharacteristic(characteristicType, button.state);
2267
+ //control
2268
+ if (button.displayType > 3) {
2269
+ this.buttonControlServices?.[i]?.updateCharacteristic(Characteristic.On, button.state);
2270
+ }
2271
+
2272
+ //sensor
2273
+ const characteristicType = scene.characteristicType;
2274
+ this.buttonControlSensorServices?.[i]?.updateCharacteristic(characteristicType, button.state);
2251
2275
  });
2252
2276
  };
2253
2277
  })
package/src/deviceerv.js CHANGED
@@ -82,8 +82,8 @@ class DeviceErv extends EventEmitter {
82
82
  //buttons configured
83
83
  for (const button of this.buttons) {
84
84
  button.name = button.name || 'Button'
85
- button.serviceType = [null, Service.Outlet, Service.Switch, Service.MotionSensor, Service.OccupancySensor, Service.ContactSensor][button.displayType];
86
- button.characteristicType = [null, Characteristic.On, Characteristic.On, Characteristic.MotionDetected, Characteristic.OccupancyDetected, Characteristic.ContactSensorState][button.displayType];
85
+ button.serviceType = serviceType[button.displayType];
86
+ button.characteristicType = characteristicType[button.displayType];
87
87
  button.state = false;
88
88
  button.previousValue = null;
89
89
  }
@@ -975,8 +975,9 @@ class DeviceErv extends EventEmitter {
975
975
 
976
976
  //buttons services
977
977
  if (this.buttons.length > 0) {
978
- if (this.logDebug) this.emit('debug', `Prepare buttons services`);
979
- this.buttonsServices = [];
978
+ if (this.logDebug) this.emit('debug', `Prepare buttons / sensors services`);
979
+ this.buttonControlServices = [];
980
+ this.buttonControlSensorServices = [];
980
981
  this.buttons.forEach((button, i) => {
981
982
  //get button mode
982
983
  const mode = button.mode;
@@ -990,101 +991,119 @@ class DeviceErv extends EventEmitter {
990
991
  const serviceName1 = namePrefix ? `${accessoryName} ${buttonName}` : buttonName;
991
992
  const serviceType = button.serviceType;
992
993
  const characteristicType = button.characteristicType;
993
- const buttonService = new serviceType(serviceName1, `Button ${deviceId} ${i}`);
994
- buttonService.addOptionalCharacteristic(Characteristic.ConfiguredName);
995
- buttonService.setCharacteristic(Characteristic.ConfiguredName, serviceName1);
996
- buttonService.getCharacteristic(characteristicType)
994
+
995
+ //control
996
+ if (button.displayType > 3) {
997
+ if (this.logDebug) this.emit('debug', `Prepare button control ${name} service`);
998
+ const buttonControlService = new serviceType(serviceName1, `buttonControlService${deviceId} ${i}`);
999
+ buttonControlService.addOptionalCharacteristic(Characteristic.ConfiguredName);
1000
+ buttonControlService.setCharacteristic(Characteristic.ConfiguredName, serviceName1);
1001
+ buttonControlService.getCharacteristic(Characteristic.On)
1002
+ .onGet(async () => {
1003
+ const state = button.state;
1004
+ return state;
1005
+ })
1006
+ .onSet(async (state) => {
1007
+ try {
1008
+ let flag = null;
1009
+ switch (mode) {
1010
+ case 0: //POWER ON,OFF
1011
+ deviceData.Device.Power = state;
1012
+ flag = Ventilation.EffectiveFlags.Power;
1013
+ break;
1014
+ case 1: //OPERATING MODE RECOVERY
1015
+ button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue ?? deviceData.Device.VentilationMode;
1016
+ deviceData.Device.Power = true;
1017
+ deviceData.Device.VentilationMode = state ? 0 : button.previousValue;
1018
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.VentilationMode;
1019
+ break;
1020
+ case 2: //OPERATING MODE BYPASS
1021
+ button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue ?? deviceData.Device.VentilationMode;
1022
+ deviceData.Device.Power = true;
1023
+ deviceData.Device.VentilationMode = state ? 1 : button.previousValue;
1024
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.VentilationMode;
1025
+ break
1026
+ case 3: //OPERATING MODE AUTO
1027
+ button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue ?? deviceData.Device.VentilationMode;
1028
+ deviceData.Device.Power = true;
1029
+ deviceData.Device.VentilationMode = state ? 2 : button.previousValue;
1030
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.VentilationMode;
1031
+ break;
1032
+ case 4: //NIGHT PURGE MODE
1033
+ deviceData.Device.Power = true;
1034
+ deviceData.Device.NightPurgeMode = state;
1035
+ flag = Ventilation.EffectiveFlags.Power
1036
+ break;
1037
+ case 10: //FAN SPEED MODE AUTO
1038
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1039
+ deviceData.Device.Power = true;
1040
+ deviceData.Device.SetFanSpeed = state ? 0 : button.previousValue;
1041
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1042
+ break;
1043
+ case 11: //FAN SPEED MODE 1
1044
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1045
+ deviceData.Device.Power = true;
1046
+ deviceData.Device.SetFanSpeed = state ? 1 : button.previousValue;
1047
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1048
+ break;
1049
+ case 12: //FAN SPEED MODE 2
1050
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1051
+ deviceData.Device.Power = true;
1052
+ deviceData.Device.SetFanSpeed = state ? 2 : button.previousValue;
1053
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1054
+ break;
1055
+ case 13: //FAN SPEED MODE 3
1056
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1057
+ deviceData.Device.Power = true;
1058
+ deviceData.Device.SetFanSpeed = state ? 3 : button.previousValue;
1059
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1060
+ break;
1061
+ case 14: //FAN MODE 4
1062
+ button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1063
+ deviceData.Device.Power = true;
1064
+ deviceData.Device.SetFanSpeed = state ? 4 : button.previousValue;
1065
+ flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1066
+ break;
1067
+ case 15: //PHYSICAL LOCK CONTROLS
1068
+ deviceData.Device = deviceData.Device;
1069
+ flag = Ventilation.EffectiveFlags.Prohibit;
1070
+ break;
1071
+ case 16: //ROOM TEMP HIDE
1072
+ deviceData.HideRoomTemperature = state;
1073
+ break;
1074
+ case 17: //SUPPLY TEMP HIDE
1075
+ deviceData.HideSupplyTemperature = state;
1076
+ break;
1077
+ case 18: //OUTDOOR EMP HIDE
1078
+ deviceData.hideOutdoorTemperature = state;
1079
+ break;
1080
+ default:
1081
+ if (this.logWarn) this.emit('warn', `Unknown button mode: ${mode}`);
1082
+ break;
1083
+ };
1084
+
1085
+ if (this.logInfo) this.emit('info', `${state ? `Set: ${buttonName}` : `Unset: ${buttonName}, Set: ${button.previousValue}`}`);
1086
+ await this.melCloudErv.send(this.accountType, this.displayType, deviceData, flag);
1087
+ } catch (error) {
1088
+ if (this.logWarn) this.emit('warn', `Set button error: ${error}`);
1089
+ };
1090
+ });
1091
+ this.buttonControlServices.push(buttonControlService);
1092
+ accessory.addService(buttonControlService);
1093
+ }
1094
+
1095
+ //sensor
1096
+ if (this.logDebug) this.emit('debug', `Prepare button control sensor ${name} service`);
1097
+ const buttonControlSensorService = new serviceType(serviceName, `buttonControlSensorService${deviceId} ${i}`);
1098
+ buttonControlSensorService.addOptionalCharacteristic(Characteristic.ConfiguredName);
1099
+ buttonControlSensorService.setCharacteristic(Characteristic.ConfiguredName, serviceName);
1100
+ buttonControlSensorService.getCharacteristic(characteristicType)
997
1101
  .onGet(async () => {
998
1102
  const state = button.state;
999
1103
  return state;
1000
1104
  })
1001
- .onSet(async (state) => {
1002
- try {
1003
- let flag = null;
1004
- switch (mode) {
1005
- case 0: //POWER ON,OFF
1006
- deviceData.Device.Power = state;
1007
- flag = Ventilation.EffectiveFlags.Power;
1008
- break;
1009
- case 1: //OPERATING MODE RECOVERY
1010
- button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue ?? deviceData.Device.VentilationMode;
1011
- deviceData.Device.Power = true;
1012
- deviceData.Device.VentilationMode = state ? 0 : button.previousValue;
1013
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.VentilationMode;
1014
- break;
1015
- case 2: //OPERATING MODE BYPASS
1016
- button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue ?? deviceData.Device.VentilationMode;
1017
- deviceData.Device.Power = true;
1018
- deviceData.Device.VentilationMode = state ? 1 : button.previousValue;
1019
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.VentilationMode;
1020
- break
1021
- case 3: //OPERATING MODE AUTO
1022
- button.previousValue = state ? deviceData.Device.VentilationMode : button.previousValue ?? deviceData.Device.VentilationMode;
1023
- deviceData.Device.Power = true;
1024
- deviceData.Device.VentilationMode = state ? 2 : button.previousValue;
1025
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.VentilationMode;
1026
- break;
1027
- case 4: //NIGHT PURGE MODE
1028
- deviceData.Device.Power = true;
1029
- deviceData.Device.NightPurgeMode = state;
1030
- flag = Ventilation.EffectiveFlags.Power
1031
- break;
1032
- case 10: //FAN SPEED MODE AUTO
1033
- button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1034
- deviceData.Device.Power = true;
1035
- deviceData.Device.SetFanSpeed = state ? 0 : button.previousValue;
1036
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1037
- break;
1038
- case 11: //FAN SPEED MODE 1
1039
- button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1040
- deviceData.Device.Power = true;
1041
- deviceData.Device.SetFanSpeed = state ? 1 : button.previousValue;
1042
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1043
- break;
1044
- case 12: //FAN SPEED MODE 2
1045
- button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1046
- deviceData.Device.Power = true;
1047
- deviceData.Device.SetFanSpeed = state ? 2 : button.previousValue;
1048
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1049
- break;
1050
- case 13: //FAN SPEED MODE 3
1051
- button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1052
- deviceData.Device.Power = true;
1053
- deviceData.Device.SetFanSpeed = state ? 3 : button.previousValue;
1054
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1055
- break;
1056
- case 14: //FAN MODE 4
1057
- button.previousValue = state ? deviceData.Device.SetFanSpeed : button.previousValue ?? deviceData.Device.SetFanSpeed;
1058
- deviceData.Device.Power = true;
1059
- deviceData.Device.SetFanSpeed = state ? 4 : button.previousValue;
1060
- flag = Ventilation.EffectiveFlags.Power + Ventilation.EffectiveFlags.SetFanSpeed;
1061
- break;
1062
- case 15: //PHYSICAL LOCK CONTROLS
1063
- deviceData.Device = deviceData.Device;
1064
- flag = Ventilation.EffectiveFlags.Prohibit;
1065
- break;
1066
- case 16: //ROOM TEMP HIDE
1067
- deviceData.HideRoomTemperature = state;
1068
- break;
1069
- case 17: //SUPPLY TEMP HIDE
1070
- deviceData.HideSupplyTemperature = state;
1071
- break;
1072
- case 18: //OUTDOOR EMP HIDE
1073
- deviceData.hideOutdoorTemperature = state;
1074
- break;
1075
- default:
1076
- if (this.logWarn) this.emit('warn', `Unknown button mode: ${mode}`);
1077
- break;
1078
- };
1079
-
1080
- if (this.logInfo) this.emit('info', `${state ? `Set: ${buttonName}` : `Unset: ${buttonName}, Set: ${button.previousValue}`}`);
1081
- await this.melCloudErv.send(this.accountType, this.displayType, deviceData, flag);
1082
- } catch (error) {
1083
- if (this.logWarn) this.emit('warn', `Set button error: ${error}`);
1084
- };
1085
- });
1086
- this.buttonsServices.push(buttonService);
1087
- accessory.addService(buttonService);
1105
+ this.buttonControlSensorServices.push(buttonControlSensorService);
1106
+ accessory.addService(buttonControlSensorService);
1088
1107
  });
1089
1108
  };
1090
1109
 
@@ -1500,9 +1519,14 @@ class DeviceErv extends EventEmitter {
1500
1519
  break;
1501
1520
  };
1502
1521
 
1503
- //update services
1504
- const characteristicType = button.characteristicType;
1505
- this.buttonsServices?.[i]?.updateCharacteristic(characteristicType, button.state);
1522
+ //control
1523
+ if (button.displayType > 3) {
1524
+ this.buttonControlServices?.[i]?.updateCharacteristic(Characteristic.On, button.state);
1525
+ }
1526
+
1527
+ //sensor
1528
+ const characteristicType = scene.characteristicType;
1529
+ this.buttonControlSensorServices?.[i]?.updateCharacteristic(characteristicType, button.state);
1506
1530
  });
1507
1531
  };
1508
1532