homebridge-midea-platform 1.3.0-beta.4 → 1.3.1-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.
- package/.luarc.json +4 -4
- package/config.schema.json +29 -1
- package/dist/core/MideaDevice.d.ts +1 -1
- package/dist/devices/cc/MideaCCDevice.d.ts +4 -1
- package/dist/devices/cc/MideaCCDevice.js +51 -40
- package/dist/devices/cc/MideaCCDevice.js.map +1 -1
- package/dist/devices/cc/MideaCCMessage.d.ts +105 -26
- package/dist/devices/cc/MideaCCMessage.js +207 -122
- package/dist/devices/cc/MideaCCMessage.js.map +1 -1
- package/dist/devices/cc/MideaCCTLV.d.ts +50 -0
- package/dist/devices/cc/MideaCCTLV.js +105 -0
- package/dist/devices/cc/MideaCCTLV.js.map +1 -0
- package/dist/platformUtils.d.ts +7 -0
- package/dist/platformUtils.js +1 -0
- package/dist/platformUtils.js.map +1 -1
- package/homebridge-ui/public/index.html +217 -0
- package/homebridge-ui/server.js +78 -1
- package/package.json +1 -1
package/.luarc.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
2
|
+
"diagnostics": {
|
|
3
|
+
"enable": false
|
|
4
|
+
}
|
|
5
|
+
}
|
package/config.schema.json
CHANGED
|
@@ -435,6 +435,33 @@
|
|
|
435
435
|
"title": "Fan Auto Switch",
|
|
436
436
|
"description": "Toggles if the fan auto switch is created with the accessory.",
|
|
437
437
|
"type": "boolean"
|
|
438
|
+
},
|
|
439
|
+
"indoor_units": {
|
|
440
|
+
"title": "Indoor Units",
|
|
441
|
+
"type": "array",
|
|
442
|
+
"items": {
|
|
443
|
+
"type": "object",
|
|
444
|
+
"properties": {
|
|
445
|
+
"addr": {
|
|
446
|
+
"title": "Address",
|
|
447
|
+
"type": "number"
|
|
448
|
+
},
|
|
449
|
+
"name": {
|
|
450
|
+
"title": "Name",
|
|
451
|
+
"type": "string"
|
|
452
|
+
},
|
|
453
|
+
"fanAccessory": {
|
|
454
|
+
"title": "Fan Accessory",
|
|
455
|
+
"description": "Create a separate Fan accessory for this indoor unit.",
|
|
456
|
+
"type": "boolean"
|
|
457
|
+
},
|
|
458
|
+
"swingAccessory": {
|
|
459
|
+
"title": "Swing Accessory",
|
|
460
|
+
"description": "Create a separate swing angle accessory for this indoor unit.",
|
|
461
|
+
"type": "boolean"
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
438
465
|
}
|
|
439
466
|
}
|
|
440
467
|
},
|
|
@@ -765,7 +792,8 @@
|
|
|
765
792
|
"devices[].CC_options.nightLightSwitch",
|
|
766
793
|
"devices[].CC_options.sleepModeSwitch",
|
|
767
794
|
"devices[].CC_options.fanSpeedMode",
|
|
768
|
-
"devices[].CC_options.fanAutoSwitch"
|
|
795
|
+
"devices[].CC_options.fanAutoSwitch",
|
|
796
|
+
"devices[].CC_options.indoor_units"
|
|
769
797
|
]
|
|
770
798
|
},
|
|
771
799
|
{
|
|
@@ -14,7 +14,7 @@ import { type DeviceInfo, type DeviceType, ParseMessageResult, ProtocolVersion }
|
|
|
14
14
|
import { type MessageRequest, MessageType } from './MideaMessage.js';
|
|
15
15
|
import { type KeyToken, LocalSecurity } from './MideaSecurity.js';
|
|
16
16
|
export type DeviceAttributeBase = {
|
|
17
|
-
[key: string]: number | number[] | string | boolean | boolean[] | Buffer | undefined;
|
|
17
|
+
[key: string]: number | number[] | string | boolean | boolean[] | Buffer | object | undefined;
|
|
18
18
|
};
|
|
19
19
|
export default abstract class MideaDevice extends EventEmitter {
|
|
20
20
|
protected readonly logger: Logger;
|
|
@@ -11,7 +11,7 @@ import type { DeviceInfo } from '../../core/MideaConstants.js';
|
|
|
11
11
|
import MideaDevice, { type DeviceAttributeBase } from '../../core/MideaDevice.js';
|
|
12
12
|
import type { MessageRequest } from '../../core/MideaMessage.js';
|
|
13
13
|
import type { Config, DeviceConfig } from '../../platformUtils.js';
|
|
14
|
-
import { FanSpeed, HeatStatus, MessageSet, Mode, PurifierMode, SwingAngle } from './MideaCCMessage.js';
|
|
14
|
+
import { FanSpeed, HeatStatus, type IndoorUnitStatus, MessageSet, Mode, PurifierMode, SwingAngle } from './MideaCCMessage.js';
|
|
15
15
|
export interface CCAttributes extends DeviceAttributeBase {
|
|
16
16
|
POWER: boolean;
|
|
17
17
|
MODE: Mode;
|
|
@@ -35,11 +35,14 @@ export interface CCAttributes extends DeviceAttributeBase {
|
|
|
35
35
|
export default class MideaCCDevice extends MideaDevice {
|
|
36
36
|
attributes: CCAttributes;
|
|
37
37
|
private _is_fe_format;
|
|
38
|
+
get is_fe_format(): boolean;
|
|
39
|
+
indoor_units: IndoorUnitStatus[];
|
|
38
40
|
constructor(logger: Logger, device_info: DeviceInfo, config: Config, deviceConfig: DeviceConfig);
|
|
39
41
|
build_query(): MessageRequest[];
|
|
40
42
|
process_message(msg: Buffer): void;
|
|
41
43
|
set_subtype(): void;
|
|
42
44
|
make_message_set(): MessageSet;
|
|
43
45
|
private _make_fe_controls;
|
|
46
|
+
set_unit_attribute(addr: number, attributes: Partial<Omit<IndoorUnitStatus, 'addr' | 'room_temperature'>>): Promise<void>;
|
|
44
47
|
set_attribute(attributes: Partial<CCAttributes>): Promise<void>;
|
|
45
48
|
}
|
|
@@ -7,11 +7,16 @@
|
|
|
7
7
|
*
|
|
8
8
|
*/
|
|
9
9
|
import MideaDevice from '../../core/MideaDevice.js';
|
|
10
|
-
import {
|
|
10
|
+
import { FanSpeed, HeatStatus, MessageCCResponse, MessageFEControl, MessageQuery, MessageSet, Mode, PurifierMode, SwingAngle, } from './MideaCCMessage.js';
|
|
11
11
|
export default class MideaCCDevice extends MideaDevice {
|
|
12
12
|
attributes;
|
|
13
13
|
// Set once a TLV/FE-format response is received; selects the VRF control path.
|
|
14
14
|
_is_fe_format = false;
|
|
15
|
+
get is_fe_format() {
|
|
16
|
+
return this._is_fe_format;
|
|
17
|
+
}
|
|
18
|
+
// Per-indoor-unit status, populated from FE branch responses.
|
|
19
|
+
indoor_units = [];
|
|
15
20
|
constructor(logger, device_info, config, deviceConfig) {
|
|
16
21
|
super(logger, device_info, config, deviceConfig);
|
|
17
22
|
this.attributes = {
|
|
@@ -59,6 +64,12 @@ export default class MideaCCDevice extends MideaDevice {
|
|
|
59
64
|
this.attributes[status] = value;
|
|
60
65
|
}
|
|
61
66
|
}
|
|
67
|
+
// Update per-unit status from FE branch responses.
|
|
68
|
+
const mcsUnits = message.get_body_attribute('mcs_units');
|
|
69
|
+
if (mcsUnits !== undefined) {
|
|
70
|
+
this.indoor_units = mcsUnits;
|
|
71
|
+
changed.mcs_units = mcsUnits;
|
|
72
|
+
}
|
|
62
73
|
if (Object.keys(changed).length > 0) {
|
|
63
74
|
this.update(changed);
|
|
64
75
|
}
|
|
@@ -86,48 +97,48 @@ export default class MideaCCDevice extends MideaDevice {
|
|
|
86
97
|
_make_fe_controls(attributes) {
|
|
87
98
|
const controls = [];
|
|
88
99
|
for (const [k, v] of Object.entries(attributes)) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
case 'AUX_HEAT_MODE': {
|
|
121
|
-
const byte = v === HeatStatus.On ? 1 : v === HeatStatus.Off ? 2 : 0;
|
|
122
|
-
controls.push([ControlId.AUX_HEAT_MODE, byte]);
|
|
123
|
-
break;
|
|
100
|
+
controls.push({ kind: k, value: v });
|
|
101
|
+
}
|
|
102
|
+
return controls;
|
|
103
|
+
}
|
|
104
|
+
async set_unit_attribute(addr, attributes) {
|
|
105
|
+
if (!this._is_fe_format) {
|
|
106
|
+
this.logger.warn(`[${this.name}] Per-unit control requires FE format device`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
const controls = [];
|
|
111
|
+
for (const [k, v] of Object.entries(attributes)) {
|
|
112
|
+
switch (k) {
|
|
113
|
+
case 'power':
|
|
114
|
+
controls.push({ kind: 'CTRL_POWER', addr, value: v });
|
|
115
|
+
break;
|
|
116
|
+
case 'mode':
|
|
117
|
+
controls.push({ kind: 'CTRL_MODE', addr, value: v });
|
|
118
|
+
break;
|
|
119
|
+
case 'fan_speed':
|
|
120
|
+
controls.push({ kind: 'CTRL_WIND_SPEED', addr, value: v });
|
|
121
|
+
break;
|
|
122
|
+
case 'target_temperature':
|
|
123
|
+
controls.push({ kind: 'CTRL_TEMP', addr, value: v });
|
|
124
|
+
break;
|
|
125
|
+
case 'vertical_swing_angle':
|
|
126
|
+
controls.push({ kind: 'CTRL_LOUVER_VERTICAL', addr, value: v });
|
|
127
|
+
break;
|
|
128
|
+
case 'horizontal_swing_angle':
|
|
129
|
+
controls.push({ kind: 'CTRL_LOUVER_HORIZONTAL', addr, value: v });
|
|
130
|
+
break;
|
|
124
131
|
}
|
|
125
|
-
case 'PURIFIER_MODE':
|
|
126
|
-
controls.push([ControlId.PURIFIER_MODE, v]);
|
|
127
|
-
break;
|
|
128
132
|
}
|
|
133
|
+
if (controls.length <= 1)
|
|
134
|
+
return; // only CTRL_ADDR, no actual controls
|
|
135
|
+
this.logger.debug(`[${this.name}] Unit ${addr} FE controls: ${JSON.stringify(controls)}`);
|
|
136
|
+
await this.build_send(new MessageFEControl(this.device_protocol_version, controls));
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
const msg = err instanceof Error ? err.stack : err;
|
|
140
|
+
this.logger.debug(`[${this.name}] Error in set_unit_attribute (${this.ip}:${this.port}):\n${msg}`);
|
|
129
141
|
}
|
|
130
|
-
return controls;
|
|
131
142
|
}
|
|
132
143
|
async set_attribute(attributes) {
|
|
133
144
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MideaCCDevice.js","sourceRoot":"","sources":["../../../src/devices/cc/MideaCCDevice.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,WAAyC,MAAM,2BAA2B,CAAC;AAGlF,OAAO,
|
|
1
|
+
{"version":3,"file":"MideaCCDevice.js","sourceRoot":"","sources":["../../../src/devices/cc/MideaCCDevice.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,21 +45,103 @@ export declare enum PurifierMode {
|
|
|
45
45
|
On = 1,
|
|
46
46
|
Off = 2
|
|
47
47
|
}
|
|
48
|
-
export
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
SLEEP_MODE = 44,// idu_sleep_status
|
|
58
|
-
PURIFIER_MODE = 58,// sterilize_status
|
|
59
|
-
NIGHT_LIGHT = 64,// idu_light
|
|
60
|
-
AUX_HEAT_RUNNING = 65,// ptc_enable
|
|
61
|
-
AUX_HEAT_MODE = 67
|
|
48
|
+
export interface IndoorUnitStatus {
|
|
49
|
+
addr: number;
|
|
50
|
+
power: boolean;
|
|
51
|
+
mode: Mode;
|
|
52
|
+
fan_speed: FanSpeed;
|
|
53
|
+
target_temperature: number;
|
|
54
|
+
room_temperature?: number;
|
|
55
|
+
vertical_swing_angle: SwingAngle;
|
|
56
|
+
horizontal_swing_angle: SwingAngle;
|
|
62
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Each variant carries a correctly-typed value. buildTLVSection() handles the
|
|
60
|
+
* wire encoding centrally, so call sites never deal with raw byte math.
|
|
61
|
+
*
|
|
62
|
+
* Per-unit (CTRL_*) variants embed the target unit address — both in the
|
|
63
|
+
* wire value bytes (need_addr fields) and in the variant itself so the caller
|
|
64
|
+
* doesn't need to track it separately. Always precede CTRL_* fields with a
|
|
65
|
+
* CTRL_ADDR field for the same addr.
|
|
66
|
+
*/
|
|
67
|
+
export type ControlField = {
|
|
68
|
+
kind: 'POWER';
|
|
69
|
+
value: boolean;
|
|
70
|
+
} | {
|
|
71
|
+
kind: 'TARGET_TEMPERATURE';
|
|
72
|
+
value: number;
|
|
73
|
+
} | {
|
|
74
|
+
kind: 'MODE';
|
|
75
|
+
value: Mode;
|
|
76
|
+
} | {
|
|
77
|
+
kind: 'FAN_SPEED';
|
|
78
|
+
value: FanSpeed;
|
|
79
|
+
} | {
|
|
80
|
+
kind: 'VERTICAL_SWING_ANGLE';
|
|
81
|
+
value: SwingAngle;
|
|
82
|
+
} | {
|
|
83
|
+
kind: 'HORIZONTAL_SWING_ANGLE';
|
|
84
|
+
value: SwingAngle;
|
|
85
|
+
} | {
|
|
86
|
+
kind: 'ECO_MODE';
|
|
87
|
+
value: boolean;
|
|
88
|
+
} | {
|
|
89
|
+
kind: 'SILENT_MODE';
|
|
90
|
+
value: boolean;
|
|
91
|
+
} | {
|
|
92
|
+
kind: 'SLEEP_MODE';
|
|
93
|
+
value: boolean;
|
|
94
|
+
} | {
|
|
95
|
+
kind: 'PURIFIER_MODE';
|
|
96
|
+
value: PurifierMode;
|
|
97
|
+
} | {
|
|
98
|
+
kind: 'NIGHT_LIGHT';
|
|
99
|
+
value: boolean;
|
|
100
|
+
} | {
|
|
101
|
+
kind: 'AUX_HEAT_RUNNING';
|
|
102
|
+
value: boolean;
|
|
103
|
+
} | {
|
|
104
|
+
kind: 'AUX_HEAT_MODE';
|
|
105
|
+
value: HeatStatus;
|
|
106
|
+
} | {
|
|
107
|
+
kind: 'TEMP_FAHRENHEIT';
|
|
108
|
+
value: boolean;
|
|
109
|
+
} | {
|
|
110
|
+
kind: 'TEMPERATURE_PRECISION';
|
|
111
|
+
value: 1 | 0.5;
|
|
112
|
+
} | {
|
|
113
|
+
kind: 'CTRL_ADDR';
|
|
114
|
+
addr: number;
|
|
115
|
+
} | {
|
|
116
|
+
kind: 'CTRL_POWER';
|
|
117
|
+
addr: number;
|
|
118
|
+
value: boolean;
|
|
119
|
+
} | {
|
|
120
|
+
kind: 'CTRL_MODE';
|
|
121
|
+
addr: number;
|
|
122
|
+
value: Mode;
|
|
123
|
+
} | {
|
|
124
|
+
kind: 'CTRL_WIND_SPEED';
|
|
125
|
+
addr: number;
|
|
126
|
+
value: FanSpeed;
|
|
127
|
+
} | {
|
|
128
|
+
kind: 'CTRL_TEMP';
|
|
129
|
+
addr: number;
|
|
130
|
+
value: number;
|
|
131
|
+
} | {
|
|
132
|
+
kind: 'CTRL_LOUVER_VERTICAL';
|
|
133
|
+
addr: number;
|
|
134
|
+
value: SwingAngle;
|
|
135
|
+
} | {
|
|
136
|
+
kind: 'CTRL_LOUVER_HORIZONTAL';
|
|
137
|
+
addr: number;
|
|
138
|
+
value: SwingAngle;
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Encode a ControlField into a single TLV section buffer.
|
|
142
|
+
* Field IDs are the key_maps indices from T_0000_CC_10011006_2025033001.lua.
|
|
143
|
+
*/
|
|
144
|
+
export declare function buildTLVSection(field: ControlField): Buffer;
|
|
63
145
|
declare abstract class MessageCCBase extends MessageRequest {
|
|
64
146
|
constructor(device_protocol_version: number, message_type: MessageType, body_type: number);
|
|
65
147
|
}
|
|
@@ -83,31 +165,26 @@ export declare class MessageSet extends MessageCCBase {
|
|
|
83
165
|
constructor(device_protocol_version: number);
|
|
84
166
|
get _body(): Buffer;
|
|
85
167
|
}
|
|
86
|
-
export declare const FE_MODE_TO_BYTE: Partial<Record<Mode, number>>;
|
|
87
|
-
export declare const FE_FAN_TO_BYTE: Partial<Record<FanSpeed, number>>;
|
|
88
168
|
/**
|
|
89
169
|
* Control message for 0xFE VRF panel controllers (86X Controller).
|
|
90
170
|
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
* engineered by the msmart-ng project (https://github.com/mill1000/midea-ac-py).
|
|
171
|
+
* Each ControlField is encoded into a TLV section by buildTLVSection(), then
|
|
172
|
+
* the sections are concatenated with an incrementing message id and CRC8.
|
|
94
173
|
*/
|
|
95
174
|
export declare class MessageFEControl extends MessageRequest {
|
|
96
175
|
private static _message_id;
|
|
97
176
|
private readonly _controls;
|
|
98
|
-
constructor(device_protocol_version: number, controls: [
|
|
177
|
+
constructor(device_protocol_version: number, controls: ControlField[]);
|
|
99
178
|
private _next_message_id;
|
|
100
179
|
get _body(): Buffer;
|
|
101
180
|
}
|
|
102
181
|
/**
|
|
103
|
-
* Response body for both legacy binary and
|
|
182
|
+
* Response body for both legacy binary and FE-format CC devices.
|
|
104
183
|
*
|
|
105
184
|
* When body[1] === 0xFE the response comes from a 86X Controller (VRF panel)
|
|
106
|
-
* using the
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
* This approach mirrors midea-local's _parse_fe_body (fixed offsets instead of
|
|
110
|
-
* a runtime TLV map).
|
|
185
|
+
* using the compact-range format parsed by parseFEBranch(). The same field-size
|
|
186
|
+
* registry covers both the main controller attributes and the per-unit mcs_idxN
|
|
187
|
+
* blocks, so no hardcoded byte offsets are needed.
|
|
111
188
|
*/
|
|
112
189
|
export declare class CCGeneralMessageBody extends MessageBody {
|
|
113
190
|
readonly is_fe_format: boolean;
|
|
@@ -129,6 +206,8 @@ export declare class CCGeneralMessageBody extends MessageBody {
|
|
|
129
206
|
horizontal_swing_angle: SwingAngle;
|
|
130
207
|
error_code: number;
|
|
131
208
|
temp_fahrenheit: boolean;
|
|
209
|
+
mcs_num: number;
|
|
210
|
+
mcs_units: IndoorUnitStatus[];
|
|
132
211
|
constructor(body: Buffer);
|
|
133
212
|
private _parse_legacy_body;
|
|
134
213
|
private _parse_fe_body;
|