homebridge-midea-platform 1.2.0-beta.2 → 1.2.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.husky/pre-commit +0 -0
- package/AC_ori.lua +5140 -0
- package/config.schema.json +14 -2
- package/dist/accessory/AccessoryFactory.d.ts +13 -12
- package/dist/accessory/AccessoryFactory.d.ts.map +1 -1
- package/dist/accessory/AccessoryFactory.js +37 -31
- package/dist/accessory/AccessoryFactory.js.map +1 -1
- package/dist/accessory/AirConditionerAccessory.d.ts +98 -92
- package/dist/accessory/AirConditionerAccessory.d.ts.map +1 -1
- package/dist/accessory/AirConditionerAccessory.js +662 -607
- package/dist/accessory/AirConditionerAccessory.js.map +1 -1
- package/dist/accessory/BaseAccessory.d.ts +11 -11
- package/dist/accessory/BaseAccessory.js +21 -21
- package/dist/accessory/DehumidifierAccessory.d.ts +45 -45
- package/dist/accessory/DehumidifierAccessory.js +344 -344
- package/dist/accessory/DishwasherAccessory.d.ts +30 -30
- package/dist/accessory/DishwasherAccessory.js +63 -63
- package/dist/accessory/ElectricWaterHeaterAccessory.d.ts +44 -44
- package/dist/accessory/ElectricWaterHeaterAccessory.js +176 -176
- package/dist/accessory/FanAccessory.d.ts +39 -39
- package/dist/accessory/FanAccessory.js +123 -123
- package/dist/accessory/FrontLoadWasherAccessory.d.ts +30 -30
- package/dist/accessory/FrontLoadWasherAccessory.js +66 -66
- package/dist/accessory/GasWaterHeaterAccessory.d.ts +51 -51
- package/dist/accessory/GasWaterHeaterAccessory.js +216 -216
- package/dist/core/MideaCloud.d.ts +35 -35
- package/dist/core/MideaCloud.js +350 -350
- package/dist/core/MideaConstants.d.ts +50 -50
- package/dist/core/MideaConstants.js +58 -58
- package/dist/core/MideaDevice.d.ts +76 -76
- package/dist/core/MideaDevice.js +409 -409
- package/dist/core/MideaDiscover.d.ts +35 -35
- package/dist/core/MideaDiscover.js +212 -212
- package/dist/core/MideaMessage.d.ts +75 -75
- package/dist/core/MideaMessage.js +184 -184
- package/dist/core/MideaPacketBuilder.d.ts +10 -10
- package/dist/core/MideaPacketBuilder.js +60 -60
- package/dist/core/MideaSecurity.d.ts +63 -63
- package/dist/core/MideaSecurity.js +251 -251
- package/dist/core/MideaUtils.d.ts +32 -32
- package/dist/core/MideaUtils.js +181 -181
- package/dist/devices/DeviceFactory.d.ts +13 -13
- package/dist/devices/DeviceFactory.d.ts.map +1 -1
- package/dist/devices/DeviceFactory.js +37 -36
- package/dist/devices/DeviceFactory.js.map +1 -1
- package/dist/devices/a1/MideaA1Device.d.ts +76 -76
- package/dist/devices/a1/MideaA1Device.js +145 -145
- package/dist/devices/a1/MideaA1Message.d.ts +40 -40
- package/dist/devices/a1/MideaA1Message.js +198 -198
- package/dist/devices/ac/MideaACDevice.d.ts +106 -104
- package/dist/devices/ac/MideaACDevice.d.ts.map +1 -1
- package/dist/devices/ac/MideaACDevice.js +400 -384
- package/dist/devices/ac/MideaACDevice.js.map +1 -1
- package/dist/devices/ac/MideaACMessage.d.ts +95 -94
- package/dist/devices/ac/MideaACMessage.d.ts.map +1 -1
- package/dist/devices/ac/MideaACMessage.js +619 -611
- package/dist/devices/ac/MideaACMessage.js.map +1 -1
- package/dist/devices/db/MideaDBDevice.d.ts +29 -29
- package/dist/devices/db/MideaDBDevice.js +100 -100
- package/dist/devices/db/MideaDBMessage.d.ts +32 -32
- package/dist/devices/db/MideaDBMessage.js +101 -101
- package/dist/devices/e1/MideaE1Device.d.ts +56 -56
- package/dist/devices/e1/MideaE1Device.js +128 -128
- package/dist/devices/e1/MideaE1Message.d.ts +28 -28
- package/dist/devices/e1/MideaE1Message.js +107 -107
- package/dist/devices/e2/MideaE2Device.d.ts +44 -44
- package/dist/devices/e2/MideaE2Device.js +129 -129
- package/dist/devices/e2/MideaE2Message.d.ts +33 -33
- package/dist/devices/e2/MideaE2Message.js +132 -132
- package/dist/devices/e3/MideaE3Device.d.ts +43 -43
- package/dist/devices/e3/MideaE3Device.js +137 -137
- package/dist/devices/e3/MideaE3Message.d.ts +51 -51
- package/dist/devices/e3/MideaE3Message.js +136 -136
- package/dist/devices/fa/MideaFADevice.d.ts +36 -36
- package/dist/devices/fa/MideaFADevice.js +106 -106
- package/dist/devices/fa/MideaFAMessage.d.ts +38 -38
- package/dist/devices/fa/MideaFAMessage.js +98 -98
- package/dist/index.d.ts +6 -6
- package/dist/index.js +6 -6
- package/dist/platform.d.ts +60 -60
- package/dist/platform.js +212 -212
- package/dist/platformUtils.d.ts +108 -106
- package/dist/platformUtils.d.ts.map +1 -1
- package/dist/platformUtils.js +103 -101
- package/dist/platformUtils.js.map +1 -1
- package/dist/settings.d.ts +8 -8
- package/dist/settings.js +11 -11
- package/docs/ac.md +6 -0
- package/package.json +1 -1
|
@@ -1,199 +1,199 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MessageA1Response = exports.MessageNewProtocolSet = exports.MessageSet = exports.MessageNewProtocolQuery = exports.MessageQuery = void 0;
|
|
4
|
-
/***********************************************************************
|
|
5
|
-
* Midea Dehumidifier Device message handler class
|
|
6
|
-
*
|
|
7
|
-
* Copyright (c) 2023 David Kerr, https://github.com/dkerr64
|
|
8
|
-
*
|
|
9
|
-
* With thanks to https://github.com/kovapatrik/homebridge-midea-platform
|
|
10
|
-
* And https://github.com/georgezhao2010/midea_ac_lan
|
|
11
|
-
*
|
|
12
|
-
*/
|
|
13
|
-
const MideaConstants_1 = require("../../core/MideaConstants");
|
|
14
|
-
const MideaMessage_1 = require("../../core/MideaMessage");
|
|
15
|
-
const MideaUtils_1 = require("../../core/MideaUtils");
|
|
16
|
-
var NewProtocolTags;
|
|
17
|
-
(function (NewProtocolTags) {
|
|
18
|
-
NewProtocolTags[NewProtocolTags["LIGHT"] = 91] = "LIGHT";
|
|
19
|
-
})(NewProtocolTags || (NewProtocolTags = {}));
|
|
20
|
-
class MessageA1Base extends MideaMessage_1.MessageRequest {
|
|
21
|
-
constructor(device_protocol_version, message_type, body_type) {
|
|
22
|
-
super(MideaConstants_1.DeviceType.DEHUMIDIFIER, message_type, body_type, device_protocol_version);
|
|
23
|
-
MessageA1Base.message_serial += 1;
|
|
24
|
-
// I don't know why dehumidifier wraps at 100, air conditioner wraps at 254
|
|
25
|
-
if (MessageA1Base.message_serial >= 100) {
|
|
26
|
-
MessageA1Base.message_serial = 1;
|
|
27
|
-
}
|
|
28
|
-
this.message_id = MessageA1Base.message_serial;
|
|
29
|
-
}
|
|
30
|
-
get body() {
|
|
31
|
-
let body = Buffer.concat([Buffer.from([this.body_type]), this._body, Buffer.from([this.message_id])]);
|
|
32
|
-
body = Buffer.concat([body, Buffer.from([(0, MideaUtils_1.calculate)(body)])]);
|
|
33
|
-
return body;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
MessageA1Base.message_serial = 0;
|
|
37
|
-
class MessageQuery extends MessageA1Base {
|
|
38
|
-
constructor(device_protocol_version) {
|
|
39
|
-
super(device_protocol_version, MideaMessage_1.MessageType.QUERY, 0x41);
|
|
40
|
-
}
|
|
41
|
-
get _body() {
|
|
42
|
-
return Buffer.from([0x81, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
exports.MessageQuery = MessageQuery;
|
|
46
|
-
class MessageNewProtocolQuery extends MessageA1Base {
|
|
47
|
-
constructor(device_protocol_version, alternate_display = false) {
|
|
48
|
-
super(device_protocol_version, MideaMessage_1.MessageType.QUERY, 0xb1);
|
|
49
|
-
this.alternate_display = alternate_display;
|
|
50
|
-
}
|
|
51
|
-
get _body() {
|
|
52
|
-
const query_params = [NewProtocolTags.LIGHT];
|
|
53
|
-
let body = Buffer.from([query_params.length]);
|
|
54
|
-
for (const param of query_params) {
|
|
55
|
-
if (param) {
|
|
56
|
-
body = Buffer.concat([body, Buffer.from([param & 0xff, param >> 8])]);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return body;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
exports.MessageNewProtocolQuery = MessageNewProtocolQuery;
|
|
63
|
-
class MessageSet extends MessageA1Base {
|
|
64
|
-
constructor(device_protocol_version) {
|
|
65
|
-
super(device_protocol_version, MideaMessage_1.MessageType.SET, 0x48);
|
|
66
|
-
this.power = false;
|
|
67
|
-
this.prompt_tone = true;
|
|
68
|
-
this.mode = 1;
|
|
69
|
-
this.fan_speed = 40;
|
|
70
|
-
this.child_lock = false;
|
|
71
|
-
this.target_humidity = 40;
|
|
72
|
-
this.swing = false;
|
|
73
|
-
this.anion = false;
|
|
74
|
-
this.water_level_set = 50;
|
|
75
|
-
}
|
|
76
|
-
get _body() {
|
|
77
|
-
// byte1, power, prompt_tone
|
|
78
|
-
const power = this.power ? 0x01 : 0x00;
|
|
79
|
-
const prompt_tone = this.prompt_tone ? 0x40 : 0x00;
|
|
80
|
-
// byte2 mode
|
|
81
|
-
const mode = this.mode;
|
|
82
|
-
// byte3 fan_speed
|
|
83
|
-
const fan_speed = this.fan_speed;
|
|
84
|
-
// byte7 target_humidity
|
|
85
|
-
const target_humidity = this.target_humidity;
|
|
86
|
-
// byte8 child_lock
|
|
87
|
-
const child_lock = this.child_lock ? 0x80 : 0x00;
|
|
88
|
-
// byte9 anion
|
|
89
|
-
const anion = this.anion ? 0x40 : 0x00;
|
|
90
|
-
// byte10 swing
|
|
91
|
-
const swing = this.swing ? 0x08 : 0x00;
|
|
92
|
-
// byte 13 water_level_set
|
|
93
|
-
const water_level_set = this.water_level_set;
|
|
94
|
-
return Buffer.from([
|
|
95
|
-
power | prompt_tone | 0x02,
|
|
96
|
-
mode,
|
|
97
|
-
fan_speed,
|
|
98
|
-
0x00,
|
|
99
|
-
0x00,
|
|
100
|
-
0x00,
|
|
101
|
-
target_humidity,
|
|
102
|
-
child_lock,
|
|
103
|
-
anion,
|
|
104
|
-
swing,
|
|
105
|
-
0x00,
|
|
106
|
-
0x00,
|
|
107
|
-
water_level_set,
|
|
108
|
-
0x00,
|
|
109
|
-
0x00,
|
|
110
|
-
0x00,
|
|
111
|
-
0x00,
|
|
112
|
-
0x00,
|
|
113
|
-
0x00,
|
|
114
|
-
0x00,
|
|
115
|
-
]);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
exports.MessageSet = MessageSet;
|
|
119
|
-
class MessageNewProtocolSet extends MessageA1Base {
|
|
120
|
-
constructor(device_protocol_version) {
|
|
121
|
-
super(device_protocol_version, MideaMessage_1.MessageType.SET, 0xb0);
|
|
122
|
-
this.light = false;
|
|
123
|
-
}
|
|
124
|
-
get _body() {
|
|
125
|
-
let pack_count = 0;
|
|
126
|
-
let payload = Buffer.from([0x00]);
|
|
127
|
-
if (this.light !== undefined) {
|
|
128
|
-
pack_count += 1;
|
|
129
|
-
payload = Buffer.concat([
|
|
130
|
-
payload,
|
|
131
|
-
// original python code at:
|
|
132
|
-
// https://github.com/georgezhao2010/midea_ac_lan/blob/master/custom_components/midea_ac_lan/midea/devices/a1/message.py
|
|
133
|
-
// used "NewProtocolTags.INDIRECT_WIND" but that is/was not defined so assumed to be a bug and should be LIGHT
|
|
134
|
-
MideaMessage_1.NewProtocolMessageBody.packet(NewProtocolTags.LIGHT, Buffer.from([this.light ? 0x01 : 0x00])),
|
|
135
|
-
]);
|
|
136
|
-
}
|
|
137
|
-
payload[0] = pack_count;
|
|
138
|
-
return payload;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
exports.MessageNewProtocolSet = MessageNewProtocolSet;
|
|
142
|
-
class A1GeneralMessageBody extends MideaMessage_1.MessageBody {
|
|
143
|
-
constructor(body) {
|
|
144
|
-
super(body);
|
|
145
|
-
this.power = (body[1] & 0x01) > 0;
|
|
146
|
-
this.mode = body[2] & 0x0f;
|
|
147
|
-
this.fan_speed = body[3] & 0x7f;
|
|
148
|
-
// Target humidity between 35% and 85%
|
|
149
|
-
this.target_humidity = body[7] < 35 ? 35 : body[7] > 85 ? 85 : body[7];
|
|
150
|
-
this.child_lock = (body[8] & 0x80) > 0;
|
|
151
|
-
this.filter_indicator = (body[9] & 0x80) > 0;
|
|
152
|
-
this.anion = (body[9] & 0x40) > 0;
|
|
153
|
-
this.sleep_mode = (body[9] & 0x20) > 0;
|
|
154
|
-
this.pump_switch_flag = (body[9] & 0x10) > 0;
|
|
155
|
-
this.pump = (body[9] & 0x08) > 0;
|
|
156
|
-
this.defrosting = (body[10] & 0x80) > 0;
|
|
157
|
-
this.tank_level = body[10] & 0x7f;
|
|
158
|
-
this.tank_full = this.tank_level >= 100;
|
|
159
|
-
this.water_level_set = body[15];
|
|
160
|
-
this.current_humidity = body[16];
|
|
161
|
-
this.current_temperature = (body[17] - 50) / 2;
|
|
162
|
-
// vertical swing or horizontal swing
|
|
163
|
-
this.swing = (body[19] & 0x20) > 0 || (body[19] & 0x10) > 0;
|
|
164
|
-
// Not sure the purpose of thisfan speed check, but it is part of the original python code at
|
|
165
|
-
// https://github.com/georgezhao2010/midea_ac_lan/blob/master/custom_components/midea_ac_lan/midea/devices/a1/message.py
|
|
166
|
-
if (this.fan_speed < 5) {
|
|
167
|
-
this.fan_speed = 1;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
class A1NewProtocolMessageBody extends MideaMessage_1.NewProtocolMessageBody {
|
|
172
|
-
constructor(body, body_type) {
|
|
173
|
-
super(body, body_type);
|
|
174
|
-
this.light = false;
|
|
175
|
-
const params = this.parse();
|
|
176
|
-
if (NewProtocolTags.LIGHT in params) {
|
|
177
|
-
this.light = params[NewProtocolTags.LIGHT][0] > 0;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
class MessageA1Response extends MideaMessage_1.MessageResponse {
|
|
182
|
-
constructor(message) {
|
|
183
|
-
super(message);
|
|
184
|
-
this.message = message;
|
|
185
|
-
if ([MideaMessage_1.MessageType.QUERY, MideaMessage_1.MessageType.SET, MideaMessage_1.MessageType.NOTIFY2].includes(this.message_type)) {
|
|
186
|
-
if ([0xb0, 0xb1, 0xb5].includes(this.body_type)) {
|
|
187
|
-
this.set_body(new A1NewProtocolMessageBody(this.body, this.body_type));
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
this.set_body(new A1GeneralMessageBody(this.body));
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
else if (this.message_type === MideaMessage_1.MessageType.NOTIFY2 && this.body_type === 0xa0) {
|
|
194
|
-
this.set_body(new A1GeneralMessageBody(this.body));
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
exports.MessageA1Response = MessageA1Response;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MessageA1Response = exports.MessageNewProtocolSet = exports.MessageSet = exports.MessageNewProtocolQuery = exports.MessageQuery = void 0;
|
|
4
|
+
/***********************************************************************
|
|
5
|
+
* Midea Dehumidifier Device message handler class
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2023 David Kerr, https://github.com/dkerr64
|
|
8
|
+
*
|
|
9
|
+
* With thanks to https://github.com/kovapatrik/homebridge-midea-platform
|
|
10
|
+
* And https://github.com/georgezhao2010/midea_ac_lan
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
13
|
+
const MideaConstants_1 = require("../../core/MideaConstants");
|
|
14
|
+
const MideaMessage_1 = require("../../core/MideaMessage");
|
|
15
|
+
const MideaUtils_1 = require("../../core/MideaUtils");
|
|
16
|
+
var NewProtocolTags;
|
|
17
|
+
(function (NewProtocolTags) {
|
|
18
|
+
NewProtocolTags[NewProtocolTags["LIGHT"] = 91] = "LIGHT";
|
|
19
|
+
})(NewProtocolTags || (NewProtocolTags = {}));
|
|
20
|
+
class MessageA1Base extends MideaMessage_1.MessageRequest {
|
|
21
|
+
constructor(device_protocol_version, message_type, body_type) {
|
|
22
|
+
super(MideaConstants_1.DeviceType.DEHUMIDIFIER, message_type, body_type, device_protocol_version);
|
|
23
|
+
MessageA1Base.message_serial += 1;
|
|
24
|
+
// I don't know why dehumidifier wraps at 100, air conditioner wraps at 254
|
|
25
|
+
if (MessageA1Base.message_serial >= 100) {
|
|
26
|
+
MessageA1Base.message_serial = 1;
|
|
27
|
+
}
|
|
28
|
+
this.message_id = MessageA1Base.message_serial;
|
|
29
|
+
}
|
|
30
|
+
get body() {
|
|
31
|
+
let body = Buffer.concat([Buffer.from([this.body_type]), this._body, Buffer.from([this.message_id])]);
|
|
32
|
+
body = Buffer.concat([body, Buffer.from([(0, MideaUtils_1.calculate)(body)])]);
|
|
33
|
+
return body;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
MessageA1Base.message_serial = 0;
|
|
37
|
+
class MessageQuery extends MessageA1Base {
|
|
38
|
+
constructor(device_protocol_version) {
|
|
39
|
+
super(device_protocol_version, MideaMessage_1.MessageType.QUERY, 0x41);
|
|
40
|
+
}
|
|
41
|
+
get _body() {
|
|
42
|
+
return Buffer.from([0x81, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.MessageQuery = MessageQuery;
|
|
46
|
+
class MessageNewProtocolQuery extends MessageA1Base {
|
|
47
|
+
constructor(device_protocol_version, alternate_display = false) {
|
|
48
|
+
super(device_protocol_version, MideaMessage_1.MessageType.QUERY, 0xb1);
|
|
49
|
+
this.alternate_display = alternate_display;
|
|
50
|
+
}
|
|
51
|
+
get _body() {
|
|
52
|
+
const query_params = [NewProtocolTags.LIGHT];
|
|
53
|
+
let body = Buffer.from([query_params.length]);
|
|
54
|
+
for (const param of query_params) {
|
|
55
|
+
if (param) {
|
|
56
|
+
body = Buffer.concat([body, Buffer.from([param & 0xff, param >> 8])]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return body;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.MessageNewProtocolQuery = MessageNewProtocolQuery;
|
|
63
|
+
class MessageSet extends MessageA1Base {
|
|
64
|
+
constructor(device_protocol_version) {
|
|
65
|
+
super(device_protocol_version, MideaMessage_1.MessageType.SET, 0x48);
|
|
66
|
+
this.power = false;
|
|
67
|
+
this.prompt_tone = true;
|
|
68
|
+
this.mode = 1;
|
|
69
|
+
this.fan_speed = 40;
|
|
70
|
+
this.child_lock = false;
|
|
71
|
+
this.target_humidity = 40;
|
|
72
|
+
this.swing = false;
|
|
73
|
+
this.anion = false;
|
|
74
|
+
this.water_level_set = 50;
|
|
75
|
+
}
|
|
76
|
+
get _body() {
|
|
77
|
+
// byte1, power, prompt_tone
|
|
78
|
+
const power = this.power ? 0x01 : 0x00;
|
|
79
|
+
const prompt_tone = this.prompt_tone ? 0x40 : 0x00;
|
|
80
|
+
// byte2 mode
|
|
81
|
+
const mode = this.mode;
|
|
82
|
+
// byte3 fan_speed
|
|
83
|
+
const fan_speed = this.fan_speed;
|
|
84
|
+
// byte7 target_humidity
|
|
85
|
+
const target_humidity = this.target_humidity;
|
|
86
|
+
// byte8 child_lock
|
|
87
|
+
const child_lock = this.child_lock ? 0x80 : 0x00;
|
|
88
|
+
// byte9 anion
|
|
89
|
+
const anion = this.anion ? 0x40 : 0x00;
|
|
90
|
+
// byte10 swing
|
|
91
|
+
const swing = this.swing ? 0x08 : 0x00;
|
|
92
|
+
// byte 13 water_level_set
|
|
93
|
+
const water_level_set = this.water_level_set;
|
|
94
|
+
return Buffer.from([
|
|
95
|
+
power | prompt_tone | 0x02,
|
|
96
|
+
mode,
|
|
97
|
+
fan_speed,
|
|
98
|
+
0x00,
|
|
99
|
+
0x00,
|
|
100
|
+
0x00,
|
|
101
|
+
target_humidity,
|
|
102
|
+
child_lock,
|
|
103
|
+
anion,
|
|
104
|
+
swing,
|
|
105
|
+
0x00,
|
|
106
|
+
0x00,
|
|
107
|
+
water_level_set,
|
|
108
|
+
0x00,
|
|
109
|
+
0x00,
|
|
110
|
+
0x00,
|
|
111
|
+
0x00,
|
|
112
|
+
0x00,
|
|
113
|
+
0x00,
|
|
114
|
+
0x00,
|
|
115
|
+
]);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.MessageSet = MessageSet;
|
|
119
|
+
class MessageNewProtocolSet extends MessageA1Base {
|
|
120
|
+
constructor(device_protocol_version) {
|
|
121
|
+
super(device_protocol_version, MideaMessage_1.MessageType.SET, 0xb0);
|
|
122
|
+
this.light = false;
|
|
123
|
+
}
|
|
124
|
+
get _body() {
|
|
125
|
+
let pack_count = 0;
|
|
126
|
+
let payload = Buffer.from([0x00]);
|
|
127
|
+
if (this.light !== undefined) {
|
|
128
|
+
pack_count += 1;
|
|
129
|
+
payload = Buffer.concat([
|
|
130
|
+
payload,
|
|
131
|
+
// original python code at:
|
|
132
|
+
// https://github.com/georgezhao2010/midea_ac_lan/blob/master/custom_components/midea_ac_lan/midea/devices/a1/message.py
|
|
133
|
+
// used "NewProtocolTags.INDIRECT_WIND" but that is/was not defined so assumed to be a bug and should be LIGHT
|
|
134
|
+
MideaMessage_1.NewProtocolMessageBody.packet(NewProtocolTags.LIGHT, Buffer.from([this.light ? 0x01 : 0x00])),
|
|
135
|
+
]);
|
|
136
|
+
}
|
|
137
|
+
payload[0] = pack_count;
|
|
138
|
+
return payload;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
exports.MessageNewProtocolSet = MessageNewProtocolSet;
|
|
142
|
+
class A1GeneralMessageBody extends MideaMessage_1.MessageBody {
|
|
143
|
+
constructor(body) {
|
|
144
|
+
super(body);
|
|
145
|
+
this.power = (body[1] & 0x01) > 0;
|
|
146
|
+
this.mode = body[2] & 0x0f;
|
|
147
|
+
this.fan_speed = body[3] & 0x7f;
|
|
148
|
+
// Target humidity between 35% and 85%
|
|
149
|
+
this.target_humidity = body[7] < 35 ? 35 : body[7] > 85 ? 85 : body[7];
|
|
150
|
+
this.child_lock = (body[8] & 0x80) > 0;
|
|
151
|
+
this.filter_indicator = (body[9] & 0x80) > 0;
|
|
152
|
+
this.anion = (body[9] & 0x40) > 0;
|
|
153
|
+
this.sleep_mode = (body[9] & 0x20) > 0;
|
|
154
|
+
this.pump_switch_flag = (body[9] & 0x10) > 0;
|
|
155
|
+
this.pump = (body[9] & 0x08) > 0;
|
|
156
|
+
this.defrosting = (body[10] & 0x80) > 0;
|
|
157
|
+
this.tank_level = body[10] & 0x7f;
|
|
158
|
+
this.tank_full = this.tank_level >= 100;
|
|
159
|
+
this.water_level_set = body[15];
|
|
160
|
+
this.current_humidity = body[16];
|
|
161
|
+
this.current_temperature = (body[17] - 50) / 2;
|
|
162
|
+
// vertical swing or horizontal swing
|
|
163
|
+
this.swing = (body[19] & 0x20) > 0 || (body[19] & 0x10) > 0;
|
|
164
|
+
// Not sure the purpose of thisfan speed check, but it is part of the original python code at
|
|
165
|
+
// https://github.com/georgezhao2010/midea_ac_lan/blob/master/custom_components/midea_ac_lan/midea/devices/a1/message.py
|
|
166
|
+
if (this.fan_speed < 5) {
|
|
167
|
+
this.fan_speed = 1;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
class A1NewProtocolMessageBody extends MideaMessage_1.NewProtocolMessageBody {
|
|
172
|
+
constructor(body, body_type) {
|
|
173
|
+
super(body, body_type);
|
|
174
|
+
this.light = false;
|
|
175
|
+
const params = this.parse();
|
|
176
|
+
if (NewProtocolTags.LIGHT in params) {
|
|
177
|
+
this.light = params[NewProtocolTags.LIGHT][0] > 0;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
class MessageA1Response extends MideaMessage_1.MessageResponse {
|
|
182
|
+
constructor(message) {
|
|
183
|
+
super(message);
|
|
184
|
+
this.message = message;
|
|
185
|
+
if ([MideaMessage_1.MessageType.QUERY, MideaMessage_1.MessageType.SET, MideaMessage_1.MessageType.NOTIFY2].includes(this.message_type)) {
|
|
186
|
+
if ([0xb0, 0xb1, 0xb5].includes(this.body_type)) {
|
|
187
|
+
this.set_body(new A1NewProtocolMessageBody(this.body, this.body_type));
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
this.set_body(new A1GeneralMessageBody(this.body));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else if (this.message_type === MideaMessage_1.MessageType.NOTIFY2 && this.body_type === 0xa0) {
|
|
194
|
+
this.set_body(new A1GeneralMessageBody(this.body));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
exports.MessageA1Response = MessageA1Response;
|
|
199
199
|
//# sourceMappingURL=MideaA1Message.js.map
|
|
@@ -1,105 +1,107 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/***********************************************************************
|
|
3
|
-
* Midea Air Conditioner Device class
|
|
4
|
-
*
|
|
5
|
-
* Copyright (c) 2023 Kovalovszky Patrik, https://github.com/kovapatrik
|
|
6
|
-
*
|
|
7
|
-
* With thanks to https://github.com/georgezhao2010/midea_ac_lan
|
|
8
|
-
*
|
|
9
|
-
*/
|
|
10
|
-
import { Logger } from 'homebridge';
|
|
11
|
-
import { DeviceInfo } from '../../core/MideaConstants';
|
|
12
|
-
import MideaDevice, { DeviceAttributeBase } from '../../core/MideaDevice';
|
|
13
|
-
import { MessageGeneralSet, MessageNewProtocolQuery, MessagePowerQuery, MessageQuery, MessageSubProtocolSet } from './MideaACMessage';
|
|
14
|
-
import { Config, DeviceConfig, SwingAngle } from '../../platformUtils';
|
|
15
|
-
export interface ACAttributes extends DeviceAttributeBase {
|
|
16
|
-
PROMPT_TONE: boolean;
|
|
17
|
-
POWER: boolean | undefined;
|
|
18
|
-
MODE: number;
|
|
19
|
-
TARGET_TEMPERATURE: number;
|
|
20
|
-
FAN_SPEED: number;
|
|
21
|
-
FAN_AUTO: boolean;
|
|
22
|
-
SWING_VERTICAL: boolean | undefined;
|
|
23
|
-
WIND_SWING_UD_ANGLE: number;
|
|
24
|
-
SWING_HORIZONTAL: boolean | undefined;
|
|
25
|
-
WIND_SWING_LR_ANGLE: number;
|
|
26
|
-
SMART_EYE: boolean;
|
|
27
|
-
DRY: boolean;
|
|
28
|
-
AUX_HEATING: boolean;
|
|
29
|
-
BOOST_MODE: boolean;
|
|
30
|
-
SLEEP_MODE: boolean;
|
|
31
|
-
FROST_PROTECT: boolean;
|
|
32
|
-
COMFORT_MODE: boolean;
|
|
33
|
-
ECO_MODE: boolean;
|
|
34
|
-
NATURAL_WIND: boolean;
|
|
35
|
-
TEMP_FAHRENHEIT: boolean;
|
|
36
|
-
SCREEN_DISPLAY: boolean | undefined;
|
|
37
|
-
SCREEN_DISPLAY_NEW: boolean;
|
|
38
|
-
FULL_DUST: boolean;
|
|
39
|
-
INDOOR_TEMPERATURE?: number;
|
|
40
|
-
OUTDOOR_TEMPERATURE?: number;
|
|
41
|
-
INDIRECT_WIND: boolean;
|
|
42
|
-
INDOOR_HUMIDITY: number | undefined;
|
|
43
|
-
BREEZELESS: boolean;
|
|
44
|
-
TOTAL_ENERGY_CONSUMPTION?: number;
|
|
45
|
-
CURRENT_ENERGY_CONSUMPTION?: number;
|
|
46
|
-
REALTIME_POWER: number;
|
|
47
|
-
FRESH_AIR_POWER: boolean;
|
|
48
|
-
FRESH_AIR_FAN_SPEED: number;
|
|
49
|
-
FRESH_AIR_MODE?: string;
|
|
50
|
-
FRESH_AIR_1: boolean;
|
|
51
|
-
FRESH_AIR_2: boolean;
|
|
52
|
-
RATE_SELECT?: number;
|
|
53
|
-
SELF_CLEAN?: boolean;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
private
|
|
75
|
-
private
|
|
76
|
-
private
|
|
77
|
-
private
|
|
78
|
-
private
|
|
79
|
-
private
|
|
80
|
-
private
|
|
81
|
-
private
|
|
82
|
-
private
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/***********************************************************************
|
|
3
|
+
* Midea Air Conditioner Device class
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2023 Kovalovszky Patrik, https://github.com/kovapatrik
|
|
6
|
+
*
|
|
7
|
+
* With thanks to https://github.com/georgezhao2010/midea_ac_lan
|
|
8
|
+
*
|
|
9
|
+
*/
|
|
10
|
+
import { Logger } from 'homebridge';
|
|
11
|
+
import { DeviceInfo } from '../../core/MideaConstants';
|
|
12
|
+
import MideaDevice, { DeviceAttributeBase } from '../../core/MideaDevice';
|
|
13
|
+
import { MessageGeneralSet, MessageNewProtocolQuery, MessagePowerQuery, MessageQuery, MessageSubProtocolSet } from './MideaACMessage';
|
|
14
|
+
import { Config, DeviceConfig, SwingAngle } from '../../platformUtils';
|
|
15
|
+
export interface ACAttributes extends DeviceAttributeBase {
|
|
16
|
+
PROMPT_TONE: boolean;
|
|
17
|
+
POWER: boolean | undefined;
|
|
18
|
+
MODE: number;
|
|
19
|
+
TARGET_TEMPERATURE: number;
|
|
20
|
+
FAN_SPEED: number;
|
|
21
|
+
FAN_AUTO: boolean;
|
|
22
|
+
SWING_VERTICAL: boolean | undefined;
|
|
23
|
+
WIND_SWING_UD_ANGLE: number;
|
|
24
|
+
SWING_HORIZONTAL: boolean | undefined;
|
|
25
|
+
WIND_SWING_LR_ANGLE: number;
|
|
26
|
+
SMART_EYE: boolean;
|
|
27
|
+
DRY: boolean;
|
|
28
|
+
AUX_HEATING: boolean;
|
|
29
|
+
BOOST_MODE: boolean;
|
|
30
|
+
SLEEP_MODE: boolean;
|
|
31
|
+
FROST_PROTECT: boolean;
|
|
32
|
+
COMFORT_MODE: boolean;
|
|
33
|
+
ECO_MODE: boolean;
|
|
34
|
+
NATURAL_WIND: boolean;
|
|
35
|
+
TEMP_FAHRENHEIT: boolean;
|
|
36
|
+
SCREEN_DISPLAY: boolean | undefined;
|
|
37
|
+
SCREEN_DISPLAY_NEW: boolean;
|
|
38
|
+
FULL_DUST: boolean;
|
|
39
|
+
INDOOR_TEMPERATURE?: number;
|
|
40
|
+
OUTDOOR_TEMPERATURE?: number;
|
|
41
|
+
INDIRECT_WIND: boolean;
|
|
42
|
+
INDOOR_HUMIDITY: number | undefined;
|
|
43
|
+
BREEZELESS: boolean;
|
|
44
|
+
TOTAL_ENERGY_CONSUMPTION?: number;
|
|
45
|
+
CURRENT_ENERGY_CONSUMPTION?: number;
|
|
46
|
+
REALTIME_POWER: number;
|
|
47
|
+
FRESH_AIR_POWER: boolean;
|
|
48
|
+
FRESH_AIR_FAN_SPEED: number;
|
|
49
|
+
FRESH_AIR_MODE?: string;
|
|
50
|
+
FRESH_AIR_1: boolean;
|
|
51
|
+
FRESH_AIR_2: boolean;
|
|
52
|
+
RATE_SELECT?: number;
|
|
53
|
+
SELF_CLEAN?: boolean;
|
|
54
|
+
ION?: boolean;
|
|
55
|
+
}
|
|
56
|
+
export default class MideaACDevice extends MideaDevice {
|
|
57
|
+
readonly FRESH_AIR_FAN_SPEEDS: {
|
|
58
|
+
0: string;
|
|
59
|
+
20: string;
|
|
60
|
+
40: string;
|
|
61
|
+
60: string;
|
|
62
|
+
80: string;
|
|
63
|
+
100: string;
|
|
64
|
+
};
|
|
65
|
+
readonly FRESH_AIR_FAN_SPEEDS_REVERSE: {
|
|
66
|
+
100: string;
|
|
67
|
+
80: string;
|
|
68
|
+
60: string;
|
|
69
|
+
40: string;
|
|
70
|
+
20: string;
|
|
71
|
+
0: string;
|
|
72
|
+
};
|
|
73
|
+
attributes: ACAttributes;
|
|
74
|
+
private fresh_air_version?;
|
|
75
|
+
private used_subprotocol;
|
|
76
|
+
private bb_sn8_flag;
|
|
77
|
+
private bb_timer;
|
|
78
|
+
private readonly DEFAULT_POWER_ANALYSIS_METHOD;
|
|
79
|
+
private power_analysis_method?;
|
|
80
|
+
private alternate_switch_display;
|
|
81
|
+
private last_fan_speed;
|
|
82
|
+
private defaultFahrenheit;
|
|
83
|
+
private defaultScreenOff;
|
|
84
|
+
/*********************************************************************
|
|
85
|
+
* Constructor initializes all the attributes. We set some to invalid
|
|
86
|
+
* values so that they are detected as "changed" on the first status
|
|
87
|
+
* refresh... and passed back to the Homebridge/HomeKit accessory callback
|
|
88
|
+
* function to set their initial values.
|
|
89
|
+
*/
|
|
90
|
+
constructor(logger: Logger, device_info: DeviceInfo, config: Config, deviceConfig: DeviceConfig);
|
|
91
|
+
build_query(): (MessageQuery | MessagePowerQuery | MessageNewProtocolQuery)[];
|
|
92
|
+
process_message(msg: Buffer): void;
|
|
93
|
+
make_message_set(): MessageGeneralSet;
|
|
94
|
+
make_subprotocol_message_set(): MessageSubProtocolSet;
|
|
95
|
+
make_message_unique_set(): MessageGeneralSet | MessageSubProtocolSet;
|
|
96
|
+
set_attribute(attributes: Partial<ACAttributes>): Promise<void>;
|
|
97
|
+
set_alternate_switch_display(value: boolean): void;
|
|
98
|
+
set_target_temperature(target_temperature: number, mode?: number): Promise<void>;
|
|
99
|
+
set_swing(swing_horizontal: boolean, swing_vertical: boolean): Promise<void>;
|
|
100
|
+
set_fan_auto(fan_auto: boolean): Promise<void>;
|
|
101
|
+
set_swing_angle(swing_direction: SwingAngle, swing_angle: number): Promise<void>;
|
|
102
|
+
set_self_clean(self_clean: boolean): Promise<void>;
|
|
103
|
+
set_ion(ion: boolean): Promise<void>;
|
|
104
|
+
set_rate_select(rate_select: number): Promise<void>;
|
|
105
|
+
protected set_subtype(): void;
|
|
106
|
+
}
|
|
105
107
|
//# sourceMappingURL=MideaACDevice.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MideaACDevice.d.ts","sourceRoot":"","sources":["../../../src/devices/ac/MideaACDevice.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,WAAW,EAAE,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAEL,iBAAiB,EACjB,uBAAuB,EAEvB,iBAAiB,EACjB,YAAY,EAEZ,qBAAqB,EAEtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAIvE,MAAM,WAAW,YAAa,SAAQ,mBAAmB;IACvD,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAE3B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;IAEpC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAC;IAEtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,OAAO,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"MideaACDevice.d.ts","sourceRoot":"","sources":["../../../src/devices/ac/MideaACDevice.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,WAAW,EAAE,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAEL,iBAAiB,EACjB,uBAAuB,EAEvB,iBAAiB,EACjB,YAAY,EAEZ,qBAAqB,EAEtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAIvE,MAAM,WAAW,YAAa,SAAQ,mBAAmB;IACvD,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAE3B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;IAEpC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAC;IAEtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,OAAO,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,QAAQ,CAAC,oBAAoB;;;;;;;MAO3B;IAEF,QAAQ,CAAC,4BAA4B;;;;;;;MAOnC;IAEK,UAAU,EAAE,YAAY,CAAC;IAEhC,OAAO,CAAC,iBAAiB,CAAC,CAAS;IACnC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAK;IACnD,OAAO,CAAC,qBAAqB,CAAC,CAAS;IAEvC,OAAO,CAAC,wBAAwB,CAAS;IACzC,OAAO,CAAC,cAAc,CAAK;IAE3B,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,gBAAgB,CAAU;IAElC;;;;;OAKG;gBACS,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY;IAgD/F,WAAW;IAeX,eAAe,CAAC,GAAG,EAAE,MAAM;IAsE3B,gBAAgB;IAsBhB,4BAA4B;IAiB5B,uBAAuB,IAAI,iBAAiB,GAAG,qBAAqB;IAI9D,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC;IAoGrD,4BAA4B,CAAC,KAAK,EAAE,OAAO;IAIrC,sBAAsB,CAAC,kBAAkB,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IAehE,SAAS,CAAC,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO;IAY5D,YAAY,CAAC,QAAQ,EAAE,OAAO;IAc9B,eAAe,CAAC,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM;IAmBhE,cAAc,CAAC,UAAU,EAAE,OAAO;IASlC,OAAO,CAAC,GAAG,EAAE,OAAO;IAkBpB,eAAe,CAAC,WAAW,EAAE,MAAM;IASzC,SAAS,CAAC,WAAW,IAAI,IAAI;CAG9B"}
|