homebridge-midea-platform 1.2.5 → 1.2.6-beta.1

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.
@@ -36,7 +36,18 @@
36
36
  "title": "Device Type",
37
37
  "type": "string",
38
38
  "required": true,
39
- "enum": ["Air Conditioner", "Dehumidifier", "Dishwasher", "Electric Water Heater", "Fan", "Front Load Washer", "Gas Water Heater", "Heat Pump WiFi Controller", "Humidifier"],
39
+ "enum": [
40
+ "Air Conditioner",
41
+ "Dehumidifier",
42
+ "Dishwasher",
43
+ "Electric Water Heater",
44
+ "Fan",
45
+ "Fresh Air Appliance",
46
+ "Front Load Washer",
47
+ "Gas Water Heater",
48
+ "Heat Pump WiFi Controller",
49
+ "Humidifier"
50
+ ],
40
51
  "description": "Select the type of device you are adding."
41
52
  },
42
53
  "name": {
@@ -331,14 +342,46 @@
331
342
  }
332
343
  }
333
344
  },
345
+ "CE_options": {
346
+ "title": "Top Load Washer Options",
347
+ "type": "object",
348
+ "condition": {
349
+ "functionBody": "return model.devices && model.devices[arrayIndices].type === 'Top Load Washer';"
350
+ },
351
+ "properties": {
352
+ "silentMode": {
353
+ "title": "Silent Mode",
354
+ "description": "Toggles if the silent mode switch alongside the level slider is created with the accessory.",
355
+ "type": "boolean"
356
+ },
357
+ "minTemp": {
358
+ "title": "Minimum Temperature (°C)",
359
+ "type": "number"
360
+ },
361
+ "maxTemp": {
362
+ "title": "Maximum Temperature (°C)",
363
+ "type": "number"
364
+ },
365
+ "tempStep": {
366
+ "title": "Temperature Step (°C)",
367
+ "type": "number",
368
+ "required": true,
369
+ "enum": [0.5, 1]
370
+ },
371
+ "autoSetModeSwitch": {
372
+ "title": "Auto Set Mode Switch",
373
+ "description": "Toggles if the auto set mode switch is created with the accessory.",
374
+ "type": "boolean"
375
+ }
376
+ }
377
+ },
334
378
  "DB_options": {
335
379
  "title": "Front Load Washer Options",
336
380
  "type": "object",
337
381
  "condition": {
338
382
  "functionBody": "return model.devices && model.devices[arrayIndices].type === 'Front Load Washer';"
339
383
  },
340
- "properties": {
341
- }
384
+ "properties": {}
342
385
  },
343
386
  "E1_options": {
344
387
  "title": "Dishwasher Options",
@@ -346,8 +389,7 @@
346
389
  "condition": {
347
390
  "functionBody": "return model.devices && model.devices[arrayIndices].type === 'Dishwasher';"
348
391
  },
349
- "properties": {
350
- }
392
+ "properties": {}
351
393
  },
352
394
  "E2_options": {
353
395
  "title": "Electric Water Heater Options",
@@ -448,8 +490,7 @@
448
490
  "condition": {
449
491
  "functionBody": "return model.devices && model.devices[arrayIndices].type === 'Fan';"
450
492
  },
451
- "properties": {
452
- }
493
+ "properties": {}
453
494
  },
454
495
  "FD_options": {
455
496
  "title": "Humidifier Options",
@@ -457,8 +498,7 @@
457
498
  "condition": {
458
499
  "functionBody": "return model.devices && model.devices[arrayIndices].type === 'Humidifier';"
459
500
  },
460
- "properties": {
461
- }
501
+ "properties": {}
462
502
  }
463
503
  }
464
504
  }
@@ -521,11 +561,7 @@
521
561
  "items": [
522
562
  {
523
563
  "key": "devices[].AC_options.swing",
524
- "items": [
525
- "devices[].AC_options.swing.mode",
526
- "devices[].AC_options.swing.angleAccessory",
527
- "devices[].AC_options.swing.angleMainControl"
528
- ]
564
+ "items": ["devices[].AC_options.swing.mode", "devices[].AC_options.swing.angleAccessory", "devices[].AC_options.swing.angleMainControl"]
529
565
  },
530
566
  "devices[].AC_options.heatingCapable",
531
567
  "devices[].AC_options.outDoorTemp",
@@ -565,6 +601,12 @@
565
601
  "devices[].C3_options.disinfectSwitch"
566
602
  ]
567
603
  },
604
+ {
605
+ "key": "devices[].CE_options",
606
+ "expandable": true,
607
+ "expanded": false,
608
+ "items": []
609
+ },
568
610
  {
569
611
  "key": "devices[].DB_options",
570
612
  "expandable": true,
@@ -8,8 +8,9 @@ import FanAccessory from './FanAccessory.js';
8
8
  import DishwasherAccessory from './DishwasherAccessory.js';
9
9
  import HeatPumpWiFiControllerAccessory from './HeatPumpWiFiControllerAccessory.js';
10
10
  import HumidifierAccessory from './HumidifierAccessory.js';
11
+ import FreshAirApplianceAccessory from './FreshAirApplianceAccessory.js';
11
12
  import type MideaDevice from '../core/MideaDevice.js';
12
13
  import type { DeviceConfig } from '../platformUtils.js';
13
14
  export default class AccessoryFactory {
14
- static createAccessory<T extends MideaDevice>(platform: MideaPlatform, accessory: MideaAccessory, device: T, configDev: DeviceConfig): AirConditionerAccessory | DehumidifierAccessory | FrontLoadWasherAccessory | ElectricWaterHeaterAccessory | GasWaterHeaterAccessory | FanAccessory | DishwasherAccessory | HeatPumpWiFiControllerAccessory | HumidifierAccessory;
15
+ static createAccessory<T extends MideaDevice>(platform: MideaPlatform, accessory: MideaAccessory, device: T, configDev: DeviceConfig): AirConditionerAccessory | DehumidifierAccessory | FrontLoadWasherAccessory | ElectricWaterHeaterAccessory | GasWaterHeaterAccessory | FanAccessory | DishwasherAccessory | HeatPumpWiFiControllerAccessory | HumidifierAccessory | FreshAirApplianceAccessory;
15
16
  }
@@ -8,6 +8,7 @@ import FanAccessory from './FanAccessory.js';
8
8
  import DishwasherAccessory from './DishwasherAccessory.js';
9
9
  import HeatPumpWiFiControllerAccessory from './HeatPumpWiFiControllerAccessory.js';
10
10
  import HumidifierAccessory from './HumidifierAccessory.js';
11
+ import FreshAirApplianceAccessory from './FreshAirApplianceAccessory.js';
11
12
  // biome-ignore lint/complexity/noStaticOnlyClass: static class is used for factory
12
13
  export default class AccessoryFactory {
13
14
  static createAccessory(platform, accessory, device, configDev) {
@@ -30,6 +31,8 @@ export default class AccessoryFactory {
30
31
  return new FanAccessory(platform, accessory, device, configDev);
31
32
  case DeviceType.HUMIDIFIER:
32
33
  return new HumidifierAccessory(platform, accessory, device, configDev);
34
+ case DeviceType.FRESH_AIR_APPLIANCE:
35
+ return new FreshAirApplianceAccessory(platform, accessory, device, configDev);
33
36
  default:
34
37
  throw new Error(`Unsupported device type: ${device.type}`);
35
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AccessoryFactory.js","sourceRoot":"","sources":["../../src/accessory/AccessoryFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAIvD,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAGnE,OAAO,qBAAqB,MAAM,4BAA4B,CAAC;AAG/D,OAAO,wBAAwB,MAAM,+BAA+B,CAAC;AAGrE,OAAO,4BAA4B,MAAM,mCAAmC,CAAC;AAG7E,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAGnE,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAG7C,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;AAG3D,OAAO,+BAA+B,MAAM,sCAAsC,CAAC;AAGnF,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;AAK3D,mFAAmF;AACnF,MAAM,CAAC,OAAO,OAAO,gBAAgB;IAC5B,MAAM,CAAC,eAAe,CAAwB,QAAuB,EAAE,SAAyB,EAAE,MAAS,EAAE,SAAuB;QACzI,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,UAAU,CAAC,YAAY;gBAC1B,OAAO,IAAI,qBAAqB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YACvG,KAAK,UAAU,CAAC,eAAe;gBAC7B,OAAO,IAAI,uBAAuB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YACzG,KAAK,UAAU,CAAC,yBAAyB;gBACvC,OAAO,IAAI,+BAA+B,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YACjH,KAAK,UAAU,CAAC,iBAAiB;gBAC/B,OAAO,IAAI,wBAAwB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YAC1G,KAAK,UAAU,CAAC,UAAU;gBACxB,OAAO,IAAI,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YACrG,KAAK,UAAU,CAAC,qBAAqB;gBACnC,OAAO,IAAI,4BAA4B,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YAC9G,KAAK,UAAU,CAAC,gBAAgB;gBAC9B,OAAO,IAAI,uBAAuB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YACzG,KAAK,UAAU,CAAC,GAAG;gBACjB,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YAC9F,KAAK,UAAU,CAAC,UAAU;gBACxB,OAAO,IAAI,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YACrG;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"AccessoryFactory.js","sourceRoot":"","sources":["../../src/accessory/AccessoryFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAIvD,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAGnE,OAAO,qBAAqB,MAAM,4BAA4B,CAAC;AAG/D,OAAO,wBAAwB,MAAM,+BAA+B,CAAC;AAGrE,OAAO,4BAA4B,MAAM,mCAAmC,CAAC;AAG7E,OAAO,uBAAuB,MAAM,8BAA8B,CAAC;AAGnE,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAG7C,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;AAG3D,OAAO,+BAA+B,MAAM,sCAAsC,CAAC;AAGnF,OAAO,mBAAmB,MAAM,0BAA0B,CAAC;AAG3D,OAAO,0BAA0B,MAAM,iCAAiC,CAAC;AAKzE,mFAAmF;AACnF,MAAM,CAAC,OAAO,OAAO,gBAAgB;IAC5B,MAAM,CAAC,eAAe,CAAwB,QAAuB,EAAE,SAAyB,EAAE,MAAS,EAAE,SAAuB;QACzI,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,UAAU,CAAC,YAAY;gBAC1B,OAAO,IAAI,qBAAqB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YACvG,KAAK,UAAU,CAAC,eAAe;gBAC7B,OAAO,IAAI,uBAAuB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YACzG,KAAK,UAAU,CAAC,yBAAyB;gBACvC,OAAO,IAAI,+BAA+B,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YACjH,KAAK,UAAU,CAAC,iBAAiB;gBAC/B,OAAO,IAAI,wBAAwB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YAC1G,KAAK,UAAU,CAAC,UAAU;gBACxB,OAAO,IAAI,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YACrG,KAAK,UAAU,CAAC,qBAAqB;gBACnC,OAAO,IAAI,4BAA4B,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YAC9G,KAAK,UAAU,CAAC,gBAAgB;gBAC9B,OAAO,IAAI,uBAAuB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YACzG,KAAK,UAAU,CAAC,GAAG;gBACjB,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YAC9F,KAAK,UAAU,CAAC,UAAU;gBACxB,OAAO,IAAI,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YACrG,KAAK,UAAU,CAAC,mBAAmB;gBACjC,OAAO,IAAI,0BAA0B,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAkC,EAAE,SAAS,CAAC,CAAC;YAC5G;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ /***********************************************************************
2
+ * Midea Platform Fresh Air Appliance Accessory class
3
+ *
4
+ * Copyright (c) 2025 Kovalovszky Patrik, https://github.com/kovapatrik
5
+ *
6
+ * Based on https://github.com/homebridge/homebridge-plugin-template
7
+ *
8
+ * An instance of this class is created for each accessory the platform registers.
9
+ *
10
+ */
11
+ import type { CharacteristicValue, Service } from 'homebridge';
12
+ import type MideaCEDevice from '../devices/ce/MideaCEDevice.js';
13
+ import type { CEAttributes } from '../devices/ce/MideaCEDevice.js';
14
+ import type { MideaAccessory, MideaPlatform } from '../platform.js';
15
+ import type { DeviceConfig } from '../platformUtils.js';
16
+ import BaseAccessory from './BaseAccessory.js';
17
+ export default class FreshAirApplianceAccessory extends BaseAccessory<MideaCEDevice> {
18
+ protected readonly device: MideaCEDevice;
19
+ protected readonly configDev: DeviceConfig;
20
+ protected service: Service;
21
+ private silentModeService?;
22
+ private autoSetModeService?;
23
+ /*********************************************************************
24
+ * Constructor registers all the service types with Homebridge, registers
25
+ * a callback function with the MideaDevice class, and requests device status.
26
+ */
27
+ constructor(platform: MideaPlatform, accessory: MideaAccessory, device: MideaCEDevice, configDev: DeviceConfig);
28
+ updateCharacteristics(attributes: Partial<CEAttributes>): Promise<void>;
29
+ getActive(): CharacteristicValue;
30
+ setActive(value: CharacteristicValue): Promise<void>;
31
+ getCurrentHeaterCoolerState(): CharacteristicValue;
32
+ getTargetHeaterCoolerState(): CharacteristicValue;
33
+ setTargetHeaterCoolerState(value: CharacteristicValue): Promise<void>;
34
+ getCurrentTemperature(): CharacteristicValue;
35
+ getTargetTemperature(): CharacteristicValue;
36
+ setTargetTemperature(value: CharacteristicValue): Promise<void>;
37
+ }
@@ -0,0 +1,140 @@
1
+ import BaseAccessory from './BaseAccessory.js';
2
+ export default class FreshAirApplianceAccessory extends BaseAccessory {
3
+ device;
4
+ configDev;
5
+ service;
6
+ silentModeService;
7
+ autoSetModeService;
8
+ /*********************************************************************
9
+ * Constructor registers all the service types with Homebridge, registers
10
+ * a callback function with the MideaDevice class, and requests device status.
11
+ */
12
+ constructor(platform, accessory, device, configDev) {
13
+ super(platform, accessory, device, configDev);
14
+ this.device = device;
15
+ this.configDev = configDev;
16
+ this.service =
17
+ this.accessory.getService(this.platform.Service.HumidifierDehumidifier) || this.accessory.addService(this.platform.Service.HumidifierDehumidifier);
18
+ this.service.setCharacteristic(this.platform.Characteristic.Name, this.device.name);
19
+ this.service.getCharacteristic(this.platform.Characteristic.Active).onGet(this.getActive.bind(this)).onSet(this.setActive.bind(this));
20
+ this.service.getCharacteristic(this.platform.Characteristic.CurrentHeaterCoolerState).onGet(this.getCurrentHeaterCoolerState.bind(this));
21
+ this.service
22
+ .getCharacteristic(this.platform.Characteristic.TargetHeaterCoolerState)
23
+ .onGet(this.getTargetHeaterCoolerState.bind(this))
24
+ .onSet(this.setTargetHeaterCoolerState.bind(this));
25
+ this.service.getCharacteristic(this.platform.Characteristic.CurrentTemperature).onGet(this.getCurrentTemperature.bind(this));
26
+ this.service
27
+ .getCharacteristic(this.platform.Characteristic.CoolingThresholdTemperature)
28
+ .onGet(this.getTargetTemperature.bind(this))
29
+ .onSet(this.setTargetTemperature.bind(this))
30
+ .setProps({
31
+ minValue: this.configDev.CE_options.minTemp,
32
+ maxValue: this.configDev.CE_options.maxTemp,
33
+ minStep: this.configDev.CE_options.tempStep,
34
+ });
35
+ this.service
36
+ .getCharacteristic(this.platform.Characteristic.HeatingThresholdTemperature)
37
+ .onGet(this.getTargetTemperature.bind(this))
38
+ .onSet(this.setTargetTemperature.bind(this))
39
+ .setProps({
40
+ minValue: this.configDev.CE_options.minTemp,
41
+ maxValue: this.configDev.CE_options.maxTemp,
42
+ minStep: this.configDev.CE_options.tempStep,
43
+ });
44
+ }
45
+ async updateCharacteristics(attributes) {
46
+ for (const [k, v] of Object.entries(attributes)) {
47
+ this.platform.log.debug(`[${this.device.name}] Set attribute ${k} to: ${v}`);
48
+ let updateState = false;
49
+ switch (k.toLowerCase()) {
50
+ case 'power':
51
+ updateState = true;
52
+ break;
53
+ case 'mode':
54
+ updateState = true;
55
+ break;
56
+ case 'target_temperature':
57
+ // If MODE is 2 then device is heating. Therefore target temperature value must be heating target? Right?
58
+ if (this.device.attributes.MODE === 2) {
59
+ this.service.updateCharacteristic(this.platform.Characteristic.HeatingThresholdTemperature, this.getTargetTemperature());
60
+ }
61
+ else {
62
+ this.service.updateCharacteristic(this.platform.Characteristic.CoolingThresholdTemperature, this.getTargetTemperature());
63
+ }
64
+ updateState = true;
65
+ break;
66
+ case 'current_temperature':
67
+ this.service.updateCharacteristic(this.platform.Characteristic.CurrentTemperature, this.getCurrentTemperature());
68
+ break;
69
+ case 'error_code':
70
+ this.service.updateCharacteristic(this.platform.Characteristic.StatusFault, this.device.attributes.ERROR_CODE > 0 ? this.platform.Characteristic.StatusFault.GENERAL_FAULT : this.platform.Characteristic.StatusFault.NO_FAULT);
71
+ break;
72
+ default:
73
+ this.platform.log.debug(`[${this.device.name}] Attempt to set unsupported attribute ${k} to ${v}`);
74
+ break;
75
+ }
76
+ if (updateState) {
77
+ this.service.updateCharacteristic(this.platform.Characteristic.Active, this.getActive());
78
+ this.service.updateCharacteristic(this.platform.Characteristic.TargetHeaterCoolerState, this.getTargetHeaterCoolerState());
79
+ this.service.updateCharacteristic(this.platform.Characteristic.CurrentHeaterCoolerState, this.getCurrentHeaterCoolerState());
80
+ }
81
+ }
82
+ }
83
+ getActive() {
84
+ return this.device.attributes.POWER ? this.platform.Characteristic.Active.ACTIVE : this.platform.Characteristic.Active.INACTIVE;
85
+ }
86
+ async setActive(value) {
87
+ await this.device.set_attribute({ POWER: value === this.platform.Characteristic.Active.ACTIVE });
88
+ }
89
+ getCurrentHeaterCoolerState() {
90
+ // 1 - COOL, 2 - HEAT, 3 - FAN, 4 - AUTO
91
+ if (!this.device.attributes.POWER || this.device.attributes.MODE === 0) {
92
+ return this.platform.Characteristic.CurrentHeaterCoolerState.INACTIVE;
93
+ }
94
+ if (this.device.attributes.TARGET_TEMPERATURE < this.device.attributes.CURRENT_TEMPERATURE) {
95
+ // COOL or AUTO
96
+ if (this.device.attributes.MODE === 1 || this.device.attributes.MODE === 4) {
97
+ return this.platform.Characteristic.CurrentHeaterCoolerState.COOLING;
98
+ }
99
+ return this.platform.Characteristic.CurrentHeaterCoolerState.IDLE;
100
+ }
101
+ if (this.device.attributes.MODE === 2 || this.device.attributes.MODE === 4) {
102
+ return this.platform.Characteristic.CurrentHeaterCoolerState.HEATING;
103
+ }
104
+ return this.platform.Characteristic.CurrentHeaterCoolerState.IDLE;
105
+ }
106
+ getTargetHeaterCoolerState() {
107
+ // 1 - COOL, 2 - HEAT, 3 - FAN, 4 - AUTO
108
+ if (this.device.attributes.MODE === 1) {
109
+ return this.platform.Characteristic.TargetHeaterCoolerState.COOL;
110
+ }
111
+ if (this.device.attributes.MODE === 2) {
112
+ return this.platform.Characteristic.TargetHeaterCoolerState.HEAT;
113
+ }
114
+ return this.platform.Characteristic.TargetHeaterCoolerState.AUTO;
115
+ }
116
+ async setTargetHeaterCoolerState(value) {
117
+ switch (value) {
118
+ case this.platform.Characteristic.TargetHeaterCoolerState.COOL:
119
+ await this.device.set_attribute({ POWER: true, MODE: 1 });
120
+ break;
121
+ case this.platform.Characteristic.TargetHeaterCoolerState.HEAT:
122
+ await this.device.set_attribute({ POWER: true, MODE: 2 });
123
+ break;
124
+ case this.platform.Characteristic.TargetHeaterCoolerState.AUTO:
125
+ await this.device.set_attribute({ POWER: true, MODE: 4 });
126
+ break;
127
+ }
128
+ }
129
+ getCurrentTemperature() {
130
+ return this.device.attributes.CURRENT_TEMPERATURE;
131
+ }
132
+ getTargetTemperature() {
133
+ return this.device.attributes.TARGET_TEMPERATURE;
134
+ }
135
+ async setTargetTemperature(value) {
136
+ const limitedValue = Math.max(this.configDev.CE_options.minTemp, Math.min(this.configDev.CE_options.maxTemp, value));
137
+ await this.device.set_attribute({ POWER: true, TARGET_TEMPERATURE: limitedValue });
138
+ }
139
+ }
140
+ //# sourceMappingURL=FreshAirApplianceAccessory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FreshAirApplianceAccessory.js","sourceRoot":"","sources":["../../src/accessory/FreshAirApplianceAccessory.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export declare enum DeviceType {
5
5
  AIR_CONDITIONER = 172,
6
6
  DEHUMIDIFIER = 161,
7
7
  HEAT_PUMP_WIFI_CONTROLLER = 195,
8
+ FRESH_AIR_APPLIANCE = 206,
8
9
  FRONT_LOAD_WASHER = 219,
9
10
  DISHWASHER = 225,
10
11
  ELECTRIC_WATER_HEATER = 226,
@@ -12,6 +13,9 @@ export declare enum DeviceType {
12
13
  FAN = 250,
13
14
  HUMIDIFIER = 253
14
15
  }
16
+ export declare const DeviceTypeToName: {
17
+ readonly [K in DeviceType]: string;
18
+ };
15
19
  export declare enum ParseMessageResult {
16
20
  SUCCESS = 0,
17
21
  PADDING = 1,
@@ -14,6 +14,7 @@ export var DeviceType;
14
14
  DeviceType[DeviceType["AIR_CONDITIONER"] = 172] = "AIR_CONDITIONER";
15
15
  DeviceType[DeviceType["DEHUMIDIFIER"] = 161] = "DEHUMIDIFIER";
16
16
  DeviceType[DeviceType["HEAT_PUMP_WIFI_CONTROLLER"] = 195] = "HEAT_PUMP_WIFI_CONTROLLER";
17
+ DeviceType[DeviceType["FRESH_AIR_APPLIANCE"] = 206] = "FRESH_AIR_APPLIANCE";
17
18
  DeviceType[DeviceType["FRONT_LOAD_WASHER"] = 219] = "FRONT_LOAD_WASHER";
18
19
  DeviceType[DeviceType["DISHWASHER"] = 225] = "DISHWASHER";
19
20
  DeviceType[DeviceType["ELECTRIC_WATER_HEATER"] = 226] = "ELECTRIC_WATER_HEATER";
@@ -21,6 +22,19 @@ export var DeviceType;
21
22
  DeviceType[DeviceType["FAN"] = 250] = "FAN";
22
23
  DeviceType[DeviceType["HUMIDIFIER"] = 253] = "HUMIDIFIER";
23
24
  })(DeviceType || (DeviceType = {}));
25
+ export const DeviceTypeToName = {
26
+ [DeviceType.UNKNOWN]: 'Unknown',
27
+ [DeviceType.AIR_CONDITIONER]: 'Air Conditioner',
28
+ [DeviceType.DEHUMIDIFIER]: 'Dehumidifier',
29
+ [DeviceType.HEAT_PUMP_WIFI_CONTROLLER]: 'Heat Pump Wifi Controller',
30
+ [DeviceType.FRESH_AIR_APPLIANCE]: 'Fresh Air Appliance',
31
+ [DeviceType.FRONT_LOAD_WASHER]: 'Front Load Washer',
32
+ [DeviceType.DISHWASHER]: 'Dishwasher',
33
+ [DeviceType.ELECTRIC_WATER_HEATER]: 'Electric Water Heater',
34
+ [DeviceType.GAS_WATER_HEATER]: 'Gas Water Heater',
35
+ [DeviceType.FAN]: 'Fan',
36
+ [DeviceType.HUMIDIFIER]: 'Humidifier',
37
+ };
24
38
  export var ParseMessageResult;
25
39
  (function (ParseMessageResult) {
26
40
  ParseMessageResult[ParseMessageResult["SUCCESS"] = 0] = "SUCCESS";
@@ -1 +1 @@
1
- {"version":3,"file":"MideaConstants.js","sourceRoot":"","sources":["../../src/core/MideaConstants.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MideaConstants.js","sourceRoot":"","sources":["../../src/core/MideaConstants.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import type { Config, DeviceConfig } from '../platformUtils.js';
4
4
  import MideaA1Device from './a1/MideaA1Device.js';
5
5
  import MideaACDevice from './ac/MideaACDevice.js';
6
6
  import MideaC3Device from './c3/MideaC3Device.js';
7
+ import MideaCEDevice from './ce/MideaCEDevice.js';
7
8
  import MideaDBDevice from './db/MideaDBDevice.js';
8
9
  import MideaE1Device from './e1/MideaE1Device.js';
9
10
  import MideaE2Device from './e2/MideaE2Device.js';
@@ -11,5 +12,5 @@ import MideaE3Device from './e3/MideaE3Device.js';
11
12
  import MideaFADevice from './fa/MideaFADevice.js';
12
13
  import MideaFDDevice from './fd/MideaFDDevice.js';
13
14
  export default class DeviceFactory {
14
- static createDevice(logger: Logger, device_info: DeviceInfo, config: Config, deviceConfig: DeviceConfig): MideaACDevice | MideaA1Device | MideaDBDevice | MideaE2Device | MideaE3Device | MideaFADevice | MideaE1Device | MideaC3Device | MideaFDDevice | null;
15
+ static createDevice(logger: Logger, device_info: DeviceInfo, config: Config, deviceConfig: DeviceConfig): MideaACDevice | MideaA1Device | MideaDBDevice | MideaE2Device | MideaE3Device | MideaFADevice | MideaE1Device | MideaC3Device | MideaFDDevice | MideaCEDevice | null;
15
16
  }
@@ -2,6 +2,7 @@ import { DeviceType } from '../core/MideaConstants.js';
2
2
  import MideaA1Device from './a1/MideaA1Device.js';
3
3
  import MideaACDevice from './ac/MideaACDevice.js';
4
4
  import MideaC3Device from './c3/MideaC3Device.js';
5
+ import MideaCEDevice from './ce/MideaCEDevice.js';
5
6
  import MideaDBDevice from './db/MideaDBDevice.js';
6
7
  import MideaE1Device from './e1/MideaE1Device.js';
7
8
  import MideaE2Device from './e2/MideaE2Device.js';
@@ -30,6 +31,8 @@ export default class DeviceFactory {
30
31
  return new MideaFADevice(logger, device_info, config, deviceConfig);
31
32
  case DeviceType.HUMIDIFIER:
32
33
  return new MideaFDDevice(logger, device_info, config, deviceConfig);
34
+ case DeviceType.FRESH_AIR_APPLIANCE:
35
+ return new MideaCEDevice(logger, device_info, config, deviceConfig);
33
36
  default:
34
37
  return null;
35
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DeviceFactory.js","sourceRoot":"","sources":["../../src/devices/DeviceFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAElD,mFAAmF;AACnF,MAAM,CAAC,OAAO,OAAO,aAAa;IACzB,MAAM,CAAC,YAAY,CAAC,MAAc,EAAE,WAAuB,EAAE,MAAc,EAAE,YAA0B;QAC5G,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;YACzB,KAAK,UAAU,CAAC,YAAY;gBAC1B,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,eAAe;gBAC7B,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,yBAAyB;gBACvC,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,iBAAiB;gBAC/B,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,UAAU;gBACxB,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,qBAAqB;gBACnC,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,gBAAgB;gBAC9B,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,GAAG;gBACjB,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,UAAU;gBACxB,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"DeviceFactory.js","sourceRoot":"","sources":["../../src/devices/DeviceFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAElD,mFAAmF;AACnF,MAAM,CAAC,OAAO,OAAO,aAAa;IACzB,MAAM,CAAC,YAAY,CAAC,MAAc,EAAE,WAAuB,EAAE,MAAc,EAAE,YAA0B;QAC5G,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;YACzB,KAAK,UAAU,CAAC,YAAY;gBAC1B,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,eAAe;gBAC7B,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,yBAAyB;gBACvC,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,iBAAiB;gBAC/B,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,UAAU;gBACxB,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,qBAAqB;gBACnC,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,gBAAgB;gBAC9B,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,GAAG;gBACjB,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,UAAU;gBACxB,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE,KAAK,UAAU,CAAC,mBAAmB;gBACjC,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACtE;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ /***********************************************************************
2
+ * Midea Fresh Air Appliance Device class
3
+ *
4
+ * Copyright (c) 2025 Kovalovszky Patrik, https://github.com/kovapatrik
5
+ *
6
+ * With thanks to https://github.com/georgezhao2010/midea_ac_lan
7
+ *
8
+ */
9
+ import type { Logger } from 'homebridge';
10
+ import type { DeviceInfo } from '../../core/MideaConstants.js';
11
+ import MideaDevice, { type DeviceAttributeBase } from '../../core/MideaDevice.js';
12
+ import type { MessageRequest } from '../../core/MideaMessage.js';
13
+ import type { Config, DeviceConfig } from '../../platformUtils.js';
14
+ import { MessageSet } from './MideaCEMessage.js';
15
+ export interface CEAttributes extends DeviceAttributeBase {
16
+ POWER: boolean;
17
+ AUTO_SET_MODE: boolean;
18
+ SILENT_MODE: boolean;
19
+ MODE: number;
20
+ SILENT_MODE_LEVEL: number;
21
+ TARGET_TEMPERATURE: number;
22
+ CURRENT_TEMPERATURE: number;
23
+ ERROR_CODE: number;
24
+ RUN_MODE_UNDER_AUTO_CONTROL: number;
25
+ }
26
+ export default class MideaCEDevice extends MideaDevice {
27
+ attributes: CEAttributes;
28
+ constructor(logger: Logger, device_info: DeviceInfo, config: Config, deviceConfig: DeviceConfig);
29
+ build_query(): MessageRequest[];
30
+ process_message(msg: Buffer): void;
31
+ set_subtype(): void;
32
+ make_message_set(): MessageSet;
33
+ set_attribute(attributes: Partial<CEAttributes>): Promise<void>;
34
+ }
@@ -0,0 +1,98 @@
1
+ /***********************************************************************
2
+ * Midea Fresh Air Appliance Device class
3
+ *
4
+ * Copyright (c) 2025 Kovalovszky Patrik, https://github.com/kovapatrik
5
+ *
6
+ * With thanks to https://github.com/georgezhao2010/midea_ac_lan
7
+ *
8
+ */
9
+ import MideaDevice from '../../core/MideaDevice.js';
10
+ import { MessageCEResponse, MessageQuery, MessageSet } from './MideaCEMessage.js';
11
+ export default class MideaCEDevice extends MideaDevice {
12
+ attributes;
13
+ constructor(logger, device_info, config, deviceConfig) {
14
+ super(logger, device_info, config, deviceConfig);
15
+ this.attributes = {
16
+ POWER: false,
17
+ AUTO_SET_MODE: false,
18
+ SILENT_MODE: false,
19
+ MODE: 4,
20
+ SILENT_MODE_LEVEL: 0,
21
+ TARGET_TEMPERATURE: 24,
22
+ CURRENT_TEMPERATURE: 22,
23
+ ERROR_CODE: 0,
24
+ RUN_MODE_UNDER_AUTO_CONTROL: 0,
25
+ };
26
+ }
27
+ build_query() {
28
+ return [new MessageQuery(this.device_protocol_version)];
29
+ }
30
+ process_message(msg) {
31
+ const message = new MessageCEResponse(msg);
32
+ if (this.verbose) {
33
+ this.logger.debug(`[${this.name}] Body:\n${JSON.stringify(message.body)}`);
34
+ }
35
+ const changed = {};
36
+ for (const status of Object.keys(this.attributes)) {
37
+ const value = message.get_body_attribute(status.toLowerCase());
38
+ if (value !== undefined) {
39
+ if (this.attributes[status] !== value) {
40
+ // Track only those attributes that change value. So when we send to the Homebridge /
41
+ // HomeKit accessory we only update values that change. First time through this
42
+ // should be most/all attributes having initialized them to invalid values.
43
+ this.logger.debug(`[${this.name}] Value for ${status} changed from '${this.attributes[status]}' to '${value}'`);
44
+ changed[status] = value;
45
+ }
46
+ this.attributes[status] = value;
47
+ }
48
+ }
49
+ // Now we update Homebridge / Homekit accessory
50
+ if (Object.keys(changed).length > 0) {
51
+ this.update(changed);
52
+ }
53
+ else {
54
+ this.logger.debug(`[${this.name}] Status unchanged`);
55
+ }
56
+ }
57
+ set_subtype() {
58
+ this.logger.debug('No subtype for FA device');
59
+ }
60
+ make_message_set() {
61
+ const message = new MessageSet(this.device_protocol_version);
62
+ message.power = this.attributes.POWER;
63
+ message.mode = this.attributes.MODE;
64
+ message.auto_set_mode = this.attributes.AUTO_SET_MODE;
65
+ message.silent_mode = this.attributes.SILENT_MODE;
66
+ message.silent_mode_level = this.attributes.SILENT_MODE_LEVEL;
67
+ message.target_temperature = this.attributes.TARGET_TEMPERATURE;
68
+ return message;
69
+ }
70
+ async set_attribute(attributes) {
71
+ const messageToSend = {
72
+ SET: undefined,
73
+ };
74
+ try {
75
+ for (const [k, v] of Object.entries(attributes)) {
76
+ if (v === this.attributes[k]) {
77
+ this.logger.info(`[${this.name}] Attribute ${k} already set to ${v}`);
78
+ continue;
79
+ }
80
+ this.logger.info(`[${this.name}] Set device attribute ${k} to: ${v}`);
81
+ this.attributes[k] = v;
82
+ messageToSend.SET ??= this.make_message_set();
83
+ messageToSend.SET[k.toLowerCase()] = v;
84
+ }
85
+ for (const [k, v] of Object.entries(messageToSend)) {
86
+ if (v !== undefined) {
87
+ this.logger.debug(`[${this.name}] Set message ${k}:\n${JSON.stringify(v)}`);
88
+ await this.build_send(v);
89
+ }
90
+ }
91
+ }
92
+ catch (err) {
93
+ const msg = err instanceof Error ? err.stack : err;
94
+ this.logger.debug(`[${this.name}] Error in set_attribute (${this.ip}:${this.port}):\n${msg}`);
95
+ }
96
+ }
97
+ }
98
+ //# sourceMappingURL=MideaCEDevice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MideaCEDevice.js","sourceRoot":"","sources":["../../../src/devices/ce/MideaCEDevice.ts"],"names":[],"mappings":"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"}