homebridge-melcloud-control 3.8.4-beta.3 → 3.8.4-beta.5

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/deviceata.js +91 -61
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "displayName": "MELCloud Control",
3
3
  "name": "homebridge-melcloud-control",
4
- "version": "3.8.4-beta.3",
4
+ "version": "3.8.4-beta.5",
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/deviceata.js CHANGED
@@ -86,7 +86,7 @@ class DeviceAta extends EventEmitter {
86
86
 
87
87
  //accessory
88
88
  this.accessory = {};
89
- this.accessory.useFahrenheit = useFahrenheit ? 1 : 0;
89
+ this.useFahrenheit = useFahrenheit ? 1 : 0;
90
90
  };
91
91
 
92
92
  async externalIntegrations() {
@@ -1012,7 +1012,7 @@ class DeviceAta extends EventEmitter {
1012
1012
  const outdoorTemperature = deviceData.Device.OutdoorTemperature;
1013
1013
 
1014
1014
  //accessory
1015
- this.accessory = {
1015
+ const obj = {
1016
1016
  presets: presetsOnServer,
1017
1017
  hasAutomaticFanSpeed: hasAutomaticFanSpeed,
1018
1018
  airDirectionFunction: airDirectionFunction,
@@ -1031,6 +1031,8 @@ class DeviceAta extends EventEmitter {
1031
1031
  power: power ? 1 : 0,
1032
1032
  inStandbyMode: inStandbyMode,
1033
1033
  operationMode: operationMode,
1034
+ currentOperationMode: 0,
1035
+ targetOperationMode: 0,
1034
1036
  roomTemperature: roomTemperature,
1035
1037
  outdoorTemperature: outdoorTemperature,
1036
1038
  setTemperature: setTemperature,
@@ -1043,7 +1045,7 @@ class DeviceAta extends EventEmitter {
1043
1045
  swingMode: swingFunction && vaneHorizontalDirection === 12 && vaneVerticalDirection === 7 ? 1 : 0,
1044
1046
  lockPhysicalControl: prohibitSetTemperature && prohibitOperationMode && prohibitPower ? 1 : 0,
1045
1047
  temperatureIncrement: temperatureIncrement,
1046
- temperatureUnit: TemperatureDisplayUnits[this.accessory.useFahrenheit],
1048
+ temperatureUnit: TemperatureDisplayUnits[this.useFahrenheit]
1047
1049
  };
1048
1050
 
1049
1051
  //operating mode 0, HEAT, DRY, COOL, 4, 5, 6, FAN, AUTO, ISEE HEAT, ISEE DRY, ISEE COOL
@@ -1051,119 +1053,147 @@ class DeviceAta extends EventEmitter {
1051
1053
  case 1: //Heater Cooler
1052
1054
  switch (operationMode) {
1053
1055
  case 1: //HEAT
1054
- this.accessory.currentOperationMode = roomTemperature > setTemperature ? 1 : 2; //INACTIVE, IDLE, HEATING, COOLING
1055
- this.accessory.targetOperationMode = 1; //AUTO, HEAT, COOL
1056
+ obj.currentOperationMode = roomTemperature > setTemperature ? 1 : 2; //INACTIVE, IDLE, HEATING, COOLING
1057
+ obj.targetOperationMode = 1; //AUTO, HEAT, COOL
1056
1058
  break;
1057
1059
  case 2: //DRY
1058
- this.accessory.currentOperationMode = 1;
1059
- this.accessory.targetOperationMode = this.autoDryFanMode === 2 ? 0 : this.heatDryFanMode === 2 ? 1 : this.coolDryFanMode === 2 ? 2 : this.accessory.targetOperationMode ?? 0;
1060
+ obj.currentOperationMode = 1;
1061
+ obj.targetOperationMode = this.autoDryFanMode === 2 ? 0 : this.heatDryFanMode === 2 ? 1 : this.coolDryFanMode === 2 ? 2 : obj.targetOperationMode ?? 0;
1060
1062
  break;
1061
1063
  case 3: //COOL
1062
- this.accessory.currentOperationMode = roomTemperature < setTemperature ? 1 : 3;
1063
- this.accessory.targetOperationMode = 2;
1064
+ obj.currentOperationMode = roomTemperature < setTemperature ? 1 : 3;
1065
+ obj.targetOperationMode = 2;
1064
1066
  break;
1065
1067
  case 7: //FAN
1066
- this.accessory.currentOperationMode = 1;
1067
- this.accessory.targetOperationMode = this.autoDryFanMode === 3 ? 0 : this.heatDryFanMode === 3 ? 1 : this.coolDryFanMode === 3 ? 2 : this.accessory.targetOperationMode ?? 0;
1068
+ obj.currentOperationMode = 1;
1069
+ obj.targetOperationMode = this.autoDryFanMode === 3 ? 0 : this.heatDryFanMode === 3 ? 1 : this.coolDryFanMode === 3 ? 2 : obj.targetOperationMode ?? 0;
1068
1070
  break;
1069
1071
  case 8: //AUTO
1070
- this.accessory.currentOperationMode = roomTemperature > setTemperature ? 3 : roomTemperature < setTemperature ? 2 : 1;
1071
- this.accessory.targetOperationMode = 0;
1072
+ obj.currentOperationMode = roomTemperature > setTemperature ? 3 : roomTemperature < setTemperature ? 2 : 1;
1073
+ obj.targetOperationMode = 0;
1072
1074
  break;
1073
1075
  case 9: //ISEE HEAT
1074
- this.accessory.currentOperationMode = roomTemperature > setTemperature ? 1 : 2
1075
- this.accessory.targetOperationMode = 1;
1076
+ obj.currentOperationMode = roomTemperature > setTemperature ? 1 : 2
1077
+ obj.targetOperationMode = 1;
1076
1078
  break;
1077
1079
  case 10: //ISEE DRY
1078
- this.accessory.currentOperationMode = 1;
1079
- this.accessory.targetOperationMode = this.autoDryFanMode === 2 ? 0 : this.heatDryFanMode === 2 ? 1 : this.coolDryFanMode === 2 ? 2 : this.accessory.targetOperationMode ?? 0;
1080
+ obj.currentOperationMode = 1;
1081
+ obj.targetOperationMode = this.autoDryFanMode === 2 ? 0 : this.heatDryFanMode === 2 ? 1 : this.coolDryFanMode === 2 ? 2 : obj.targetOperationMode ?? 0;
1080
1082
  break;
1081
1083
  case 11: //ISEE COOL;
1082
- this.accessory.currentOperationMode = roomTemperature < setTemperature ? 1 : 3;
1083
- this.accessory.targetOperationMode = 2;
1084
+ obj.currentOperationMode = roomTemperature < setTemperature ? 1 : 3;
1085
+ obj.targetOperationMode = 2;
1084
1086
  break;
1085
1087
  default:
1086
1088
  this.emit('warn', `Unknown operating mode: ${operationMode}`);
1087
1089
  return
1088
1090
  };
1089
1091
 
1090
- this.accessory.currentOperationMode = !power ? 0 : inStandbyMode ? 1 : this.accessory.currentOperationMode;
1091
- this.accessory.operationModeSetPropsMinValue = modelSupportsAuto && modelSupportsHeat ? 0 : !modelSupportsAuto && modelSupportsHeat ? 1 : modelSupportsAuto && !modelSupportsHeat ? 0 : 2;
1092
- this.accessory.operationModeSetPropsMaxValue = 2
1093
- this.accessory.operationModeSetPropsValidValues = modelSupportsAuto && modelSupportsHeat ? [0, 1, 2] : !modelSupportsAuto && modelSupportsHeat ? [1, 2] : modelSupportsAuto && !modelSupportsHeat ? [0, 2] : [2];
1092
+ obj.currentOperationMode = !power ? 0 : inStandbyMode ? 1 : obj.currentOperationMode;
1093
+ obj.operationModeSetPropsMinValue = modelSupportsAuto && modelSupportsHeat ? 0 : !modelSupportsAuto && modelSupportsHeat ? 1 : modelSupportsAuto && !modelSupportsHeat ? 0 : 2;
1094
+ obj.operationModeSetPropsMaxValue = 2
1095
+ obj.operationModeSetPropsValidValues = modelSupportsAuto && modelSupportsHeat ? [0, 1, 2] : !modelSupportsAuto && modelSupportsHeat ? [1, 2] : modelSupportsAuto && !modelSupportsHeat ? [0, 2] : [2];
1096
+
1097
+ //fan speed mode
1098
+ if (modelSupportsFanSpeed) {
1099
+ switch (numberOfFanSpeeds) {
1100
+ case 2: //Fan speed mode 2
1101
+ obj.fanSpeed = hasAutomaticFanSpeed ? [3, 1, 2][fanSpeed] : [0, 1, 2][fanSpeed];
1102
+ obj.fanSpeedSetPropsMaxValue = hasAutomaticFanSpeed ? 3 : 2;
1103
+ break;
1104
+ case 3: //Fan speed mode 3
1105
+ obj.fanSpeed = hasAutomaticFanSpeed ? [4, 1, 2, 3][fanSpeed] : [0, 1, 2, 3][fanSpeed];
1106
+ obj.fanSpeedSetPropsMaxValue = hasAutomaticFanSpeed ? 4 : 3;
1107
+ break;
1108
+ case 4: //Fan speed mode 4
1109
+ obj.fanSpeed = hasAutomaticFanSpeed ? [5, 1, 2, 3, 4][fanSpeed] : [0, 1, 2, 3, 4][fanSpeed];
1110
+ obj.fanSpeedSetPropsMaxValue = hasAutomaticFanSpeed ? 5 : 4;
1111
+ break;
1112
+ case 5: //Fan speed mode 5
1113
+ obj.fanSpeed = hasAutomaticFanSpeed ? [6, 1, 2, 3, 4, 5][fanSpeed] : [0, 1, 2, 3, 4, 5][fanSpeed];
1114
+ obj.fanSpeedSetPropsMaxValue = hasAutomaticFanSpeed ? 6 : 5;
1115
+ break;
1116
+ case 6: //Fan speed mode 6
1117
+ obj.fanSpeed = hasAutomaticFanSpeed ? [7, 1, 2, 3, 4, 5, 6][fanSpeed] : [0, 1, 2, 3, 4, 5, 6][fanSpeed];
1118
+ obj.fanSpeedSetPropsMaxValue = hasAutomaticFanSpeed ? 7 : 6;
1119
+ break;
1120
+ };
1121
+ };
1094
1122
 
1095
1123
  //update characteristics
1096
1124
  if (this.melCloudService) {
1097
1125
  this.melCloudService
1098
1126
  .updateCharacteristic(Characteristic.Active, power ? 1 : 0)
1099
- .updateCharacteristic(Characteristic.CurrentHeaterCoolerState, this.accessory.currentOperationMode)
1100
- .updateCharacteristic(Characteristic.TargetHeaterCoolerState, this.accessory.targetOperationMode)
1127
+ .updateCharacteristic(Characteristic.CurrentHeaterCoolerState, obj.currentOperationMode)
1128
+ .updateCharacteristic(Characteristic.TargetHeaterCoolerState, obj.targetOperationMode)
1101
1129
  .updateCharacteristic(Characteristic.CurrentTemperature, roomTemperature)
1102
- .updateCharacteristic(Characteristic.LockPhysicalControls, this.accessory.lockPhysicalControl)
1103
- .updateCharacteristic(Characteristic.TemperatureDisplayUnits, this.accessory.useFahrenheit)
1130
+ .updateCharacteristic(Characteristic.LockPhysicalControls, obj.lockPhysicalControl)
1131
+ .updateCharacteristic(Characteristic.TemperatureDisplayUnits, obj.useFahrenheit)
1104
1132
  .updateCharacteristic(Characteristic.CoolingThresholdTemperature, defaultCoolingSetTemperature);
1105
1133
  const updateDefHeat = modelSupportsHeat ? this.melCloudService.updateCharacteristic(Characteristic.HeatingThresholdTemperature, defaultHeatingSetTemperature) : false;
1106
- const updateRS = modelSupportsFanSpeed ? this.melCloudService.updateCharacteristic(Characteristic.RotationSpeed, this.accessory.fanSpeed) : false;
1107
- const updateSM = swingFunction ? this.melCloudService.updateCharacteristic(Characteristic.SwingMode, this.accessory.swingMode) : false;
1134
+ const updateRS = modelSupportsFanSpeed ? this.melCloudService.updateCharacteristic(Characteristic.RotationSpeed, obj.fanSpeed) : false;
1135
+ const updateSM = swingFunction ? this.melCloudService.updateCharacteristic(Characteristic.SwingMode, obj.swingMode) : false;
1108
1136
  };
1109
1137
  break;
1110
1138
  case 2: //Thermostat
1111
1139
  switch (operationMode) {
1112
1140
  case 1: //HEAT
1113
- this.accessory.currentOperationMode = roomTemperature > setTemperature ? 0 : 1; //OFF, HEATING, COOLING
1114
- this.accessory.targetOperationMode = 1; //OFF, HEAT, COOL, AUTO
1141
+ obj.currentOperationMode = roomTemperature > setTemperature ? 0 : 1; //OFF, HEATING, COOLING
1142
+ obj.targetOperationMode = 1; //OFF, HEAT, COOL, AUTO
1115
1143
  break;
1116
1144
  case 2: //DRY
1117
- this.accessory.currentOperationMode = 0;
1118
- this.accessory.targetOperationMode = this.autoDryFanMode === 2 ? 3 : this.heatDryFanMode === 2 ? 1 : this.coolDryFanMode === 2 ? 2 : this.accessory.targetOperationMode ?? 0;
1145
+ obj.currentOperationMode = 0;
1146
+ obj.targetOperationMode = this.autoDryFanMode === 2 ? 3 : this.heatDryFanMode === 2 ? 1 : this.coolDryFanMode === 2 ? 2 : obj.targetOperationMode ?? 0;
1119
1147
  break;
1120
1148
  case 3: //COOL
1121
- this.accessory.currentOperationMode = roomTemperature < setTemperature ? 0 : 2;
1122
- this.accessory.targetOperationMode = 2;
1149
+ obj.currentOperationMode = roomTemperature < setTemperature ? 0 : 2;
1150
+ obj.targetOperationMode = 2;
1123
1151
  break;
1124
1152
  case 7: //FAN
1125
- this.accessory.currentOperationMode = 0;
1126
- this.accessory.targetOperationMode = this.autoDryFanMode === 3 ? 3 : this.heatDryFanMode === 3 ? 1 : this.coolDryFanMode === 3 ? 2 : this.accessory.targetOperationMode ?? 0;
1153
+ obj.currentOperationMode = 0;
1154
+ obj.targetOperationMode = this.autoDryFanMode === 3 ? 3 : this.heatDryFanMode === 3 ? 1 : this.coolDryFanMode === 3 ? 2 : obj.targetOperationMode ?? 0;
1127
1155
  break;
1128
1156
  case 8: //AUTO
1129
- this.accessory.currentOperationMode = roomTemperature < setTemperature ? 1 : roomTemperature > setTemperature ? 2 : 0;
1130
- this.accessory.targetOperationMode = 3;
1157
+ obj.currentOperationMode = roomTemperature < setTemperature ? 1 : roomTemperature > setTemperature ? 2 : 0;
1158
+ obj.targetOperationMode = 3;
1131
1159
  break;
1132
1160
  case 9: //ISEE HEAT
1133
- this.accessory.currentOperationMode = roomTemperature > setTemperature ? 0 : 1;
1134
- this.accessory.targetOperationMode = 1;
1161
+ obj.currentOperationMode = roomTemperature > setTemperature ? 0 : 1;
1162
+ obj.targetOperationMode = 1;
1135
1163
  break;
1136
1164
  case 10: //ISEE DRY
1137
- this.accessory.currentOperationMode = 0;
1138
- this.accessory.targetOperationMode = this.autoDryFanMode === 2 ? 3 : this.heatDryFanMode === 2 ? 1 : this.coolDryFanMode === 2 ? 2 : this.accessory.targetOperationMode ?? 0;
1165
+ obj.currentOperationMode = 0;
1166
+ obj.targetOperationMode = this.autoDryFanMode === 2 ? 3 : this.heatDryFanMode === 2 ? 1 : this.coolDryFanMode === 2 ? 2 : obj.targetOperationMode ?? 0;
1139
1167
  break;
1140
1168
  case 11: //ISEE COOL;
1141
- this.accessory.currentOperationMode = roomTemperature < setTemperature ? 0 : 2;
1142
- this.accessory.targetOperationMode = 2;
1169
+ obj.currentOperationMode = roomTemperature < setTemperature ? 0 : 2;
1170
+ obj.targetOperationMode = 2;
1143
1171
  break;
1144
1172
  default:
1145
1173
  this.emit('warn', `Unknown operating mode: ${operationMode}`);
1146
1174
  break;
1147
1175
  };
1148
1176
 
1149
- this.accessory.currentOperationMode = !power ? 0 : this.accessory.currentOperationMode;
1150
- this.accessory.targetOperationMode = !power ? 0 : this.accessory.targetOperationMode;
1151
- this.accessory.operationModeSetPropsMinValue = 0
1152
- this.accessory.operationModeSetPropsMaxValue = modelSupportsAuto && modelSupportsHeat ? 3 : !modelSupportsAuto && modelSupportsHeat ? 2 : modelSupportsAuto && !modelSupportsHeat ? 3 : 2;
1153
- this.accessory.operationModeSetPropsValidValues = modelSupportsAuto && modelSupportsHeat ? [0, 1, 2, 3] : !modelSupportsAuto && modelSupportsHeat ? [0, 1, 2] : modelSupportsAuto && !modelSupportsHeat ? [0, 2, 3] : [0, 2];
1177
+ obj.currentOperationMode = !power ? 0 : obj.currentOperationMode;
1178
+ obj.targetOperationMode = !power ? 0 : obj.targetOperationMode;
1179
+ obj.operationModeSetPropsMinValue = 0
1180
+ obj.operationModeSetPropsMaxValue = modelSupportsAuto && modelSupportsHeat ? 3 : !modelSupportsAuto && modelSupportsHeat ? 2 : modelSupportsAuto && !modelSupportsHeat ? 3 : 2;
1181
+ obj.operationModeSetPropsValidValues = modelSupportsAuto && modelSupportsHeat ? [0, 1, 2, 3] : !modelSupportsAuto && modelSupportsHeat ? [0, 1, 2] : modelSupportsAuto && !modelSupportsHeat ? [0, 2, 3] : [0, 2];
1154
1182
 
1155
1183
  //update characteristics
1156
1184
  if (this.melCloudService) {
1157
1185
  this.melCloudService
1158
- .updateCharacteristic(Characteristic.CurrentHeatingCoolingState, this.accessory.currentOperationMode)
1159
- .updateCharacteristic(Characteristic.TargetHeatingCoolingState, this.accessory.targetOperationMode)
1186
+ .updateCharacteristic(Characteristic.CurrentHeatingCoolingState, obj.currentOperationMode)
1187
+ .updateCharacteristic(Characteristic.TargetHeatingCoolingState, obj.targetOperationMode)
1160
1188
  .updateCharacteristic(Characteristic.CurrentTemperature, roomTemperature)
1161
1189
  .updateCharacteristic(Characteristic.TargetTemperature, setTemperature)
1162
- .updateCharacteristic(Characteristic.TemperatureDisplayUnits, this.accessory.useFahrenheit);
1190
+ .updateCharacteristic(Characteristic.TemperatureDisplayUnits, obj.useFahrenheit);
1163
1191
  };
1164
1192
  break;
1165
1193
  };
1166
1194
 
1195
+ this.accessory = obj;
1196
+
1167
1197
  if (this.roomTemperatureSensorService) {
1168
1198
  this.roomTemperatureSensorService
1169
1199
  .updateCharacteristic(Characteristic.CurrentTemperature, roomTemperature)
@@ -1293,7 +1323,7 @@ class DeviceAta extends EventEmitter {
1293
1323
  button.state = power ? (fanSpeed === 6) : false;
1294
1324
  break;
1295
1325
  case 37: //PHYSICAL LOCK CONTROLS ALL
1296
- button.state = (this.accessory.lockPhysicalControl === 1);
1326
+ button.state = (obj.lockPhysicalControl === 1);
1297
1327
  break;
1298
1328
  case 38: //PHYSICAL LOCK CONTROLS POWER
1299
1329
  button.state = (prohibitPower === true);
@@ -1322,17 +1352,17 @@ class DeviceAta extends EventEmitter {
1322
1352
  if (!this.disableLogInfo) {
1323
1353
  this.emit('info', `Power: ${power ? 'ON' : 'OFF'}`);
1324
1354
  this.emit('info', `Target operation mode: ${AirConditioner.DriveMode[operationMode]}`);
1325
- this.emit('info', `Current operation mode: ${this.displayMode === 1 ? AirConditioner.CurrentOperationModeHeatherCooler[this.accessory.currentOperationMode] : AirConditioner.CurrentOperationModeThermostat[this.accessory.currentOperationMode]}`);
1326
- this.emit('info', `Target temperature: ${setTemperature}${this.accessory.temperatureUnit}`);
1327
- this.emit('info', `Current temperature: ${roomTemperature}${this.accessory.temperatureUnit}`);
1328
- const info = hasOutdoorTemperature && outdoorTemperature !== null ? this.emit('info', `Outdoor temperature: ${outdoorTemperature}${this.accessory.temperatureUnit}`) : false;
1355
+ this.emit('info', `Current operation mode: ${this.displayMode === 1 ? AirConditioner.CurrentOperationModeHeatherCooler[obj.currentOperationMode] : AirConditioner.CurrentOperationModeThermostat[obj.currentOperationMode]}`);
1356
+ this.emit('info', `Target temperature: ${setTemperature}${obj.temperatureUnit}`);
1357
+ this.emit('info', `Current temperature: ${roomTemperature}${obj.temperatureUnit}`);
1358
+ const info = hasOutdoorTemperature && outdoorTemperature !== null ? this.emit('info', `Outdoor temperature: ${outdoorTemperature}${obj.temperatureUnit}`) : false;
1329
1359
  const info3 = modelSupportsFanSpeed ? this.emit('info', `Target fan speed: ${AirConditioner.FanSpeed[fanSpeed]}`) : false;
1330
1360
  const info4 = modelSupportsFanSpeed ? this.emit('info', `Current fan speed: ${AirConditioner.FanSpeed[actualFanSpeed]}`) : false;
1331
1361
  const info5 = vaneHorizontalDirection !== null ? this.emit('info', `Vane horizontal: ${AirConditioner.HorizontalVane[vaneHorizontalDirection] ?? vaneHorizontalDirection}`) : false;
1332
1362
  const info6 = vaneVerticalDirection !== null ? this.emit('info', `Vane vertical: ${AirConditioner.VerticalVane[vaneVerticalDirection] ?? vaneVerticalDirection}`) : false;
1333
- const info7 = swingFunction ? this.emit('info', `Air direction: ${AirConditioner.AirDirection[this.accessory.swingMode]}`) : false;
1334
- this.emit('info', `Temperature display unit: ${this.accessory.temperatureUnit}`);
1335
- this.emit('info', `Lock physical controls: ${this.accessory.lockPhysicalControl ? 'LOCKED' : 'UNLOCKED'}`);
1363
+ const info7 = swingFunction ? this.emit('info', `Air direction: ${AirConditioner.AirDirection[obj.swingMode]}`) : false;
1364
+ this.emit('info', `Temperature display unit: ${obj.temperatureUnit}`);
1365
+ this.emit('info', `Lock physical controls: ${obj.lockPhysicalControl ? 'LOCKED' : 'UNLOCKED'}`);
1336
1366
  };
1337
1367
 
1338
1368
  //prepare accessory