homebridge-midea-platform 0.1.0

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 (72) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +9 -0
  3. package/config.schema.json +137 -0
  4. package/dist/accessory/AccessoryFactory.d.ts +8 -0
  5. package/dist/accessory/AccessoryFactory.d.ts.map +1 -0
  6. package/dist/accessory/AccessoryFactory.js +17 -0
  7. package/dist/accessory/AccessoryFactory.js.map +1 -0
  8. package/dist/accessory/AirConditionerAccessory.d.ts +25 -0
  9. package/dist/accessory/AirConditionerAccessory.d.ts.map +1 -0
  10. package/dist/accessory/AirConditionerAccessory.js +182 -0
  11. package/dist/accessory/AirConditionerAccessory.js.map +1 -0
  12. package/dist/accessory/BaseAccessory.d.ts +9 -0
  13. package/dist/accessory/BaseAccessory.d.ts.map +1 -0
  14. package/dist/accessory/BaseAccessory.js +29 -0
  15. package/dist/accessory/BaseAccessory.js.map +1 -0
  16. package/dist/core/MideaCloud.d.ts +32 -0
  17. package/dist/core/MideaCloud.d.ts.map +1 -0
  18. package/dist/core/MideaCloud.js +152 -0
  19. package/dist/core/MideaCloud.js.map +1 -0
  20. package/dist/core/MideaConstants.d.ts +41 -0
  21. package/dist/core/MideaConstants.d.ts.map +1 -0
  22. package/dist/core/MideaConstants.js +56 -0
  23. package/dist/core/MideaConstants.js.map +1 -0
  24. package/dist/core/MideaDevice.d.ts +58 -0
  25. package/dist/core/MideaDevice.d.ts.map +1 -0
  26. package/dist/core/MideaDevice.js +263 -0
  27. package/dist/core/MideaDevice.js.map +1 -0
  28. package/dist/core/MideaDiscover.d.ts +17 -0
  29. package/dist/core/MideaDiscover.d.ts.map +1 -0
  30. package/dist/core/MideaDiscover.js +129 -0
  31. package/dist/core/MideaDiscover.js.map +1 -0
  32. package/dist/core/MideaMessage.d.ts +76 -0
  33. package/dist/core/MideaMessage.d.ts.map +1 -0
  34. package/dist/core/MideaMessage.js +186 -0
  35. package/dist/core/MideaMessage.js.map +1 -0
  36. package/dist/core/MideaPacketBuilder.d.ts +11 -0
  37. package/dist/core/MideaPacketBuilder.d.ts.map +1 -0
  38. package/dist/core/MideaPacketBuilder.js +60 -0
  39. package/dist/core/MideaPacketBuilder.js.map +1 -0
  40. package/dist/core/MideaSecurity.d.ts +35 -0
  41. package/dist/core/MideaSecurity.d.ts.map +1 -0
  42. package/dist/core/MideaSecurity.js +168 -0
  43. package/dist/core/MideaSecurity.js.map +1 -0
  44. package/dist/core/MideaUtils.d.ts +18 -0
  45. package/dist/core/MideaUtils.d.ts.map +1 -0
  46. package/dist/core/MideaUtils.js +187 -0
  47. package/dist/core/MideaUtils.js.map +1 -0
  48. package/dist/devices/DeviceFactory.d.ts +8 -0
  49. package/dist/devices/DeviceFactory.d.ts.map +1 -0
  50. package/dist/devices/DeviceFactory.js +17 -0
  51. package/dist/devices/DeviceFactory.js.map +1 -0
  52. package/dist/devices/ac/MideaACDevice.d.ts +80 -0
  53. package/dist/devices/ac/MideaACDevice.d.ts.map +1 -0
  54. package/dist/devices/ac/MideaACDevice.js +271 -0
  55. package/dist/devices/ac/MideaACDevice.js.map +1 -0
  56. package/dist/devices/ac/MideaACMessage.d.ts +90 -0
  57. package/dist/devices/ac/MideaACMessage.d.ts.map +1 -0
  58. package/dist/devices/ac/MideaACMessage.js +528 -0
  59. package/dist/devices/ac/MideaACMessage.js.map +1 -0
  60. package/dist/index.d.ts +7 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +7 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/platform.d.ts +20 -0
  65. package/dist/platform.d.ts.map +1 -0
  66. package/dist/platform.js +110 -0
  67. package/dist/platform.js.map +1 -0
  68. package/dist/settings.d.ts +9 -0
  69. package/dist/settings.d.ts.map +1 -0
  70. package/dist/settings.js +12 -0
  71. package/dist/settings.js.map +1 -0
  72. package/package.json +45 -0
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LocalSecurity = exports.CloudSecurity = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const MideaConstants_1 = require("./MideaConstants");
6
+ const MideaUtils_1 = require("./MideaUtils");
7
+ class CloudSecurity {
8
+ constructor(use_china_server = false) {
9
+ this.use_china_server = use_china_server;
10
+ this.HMAC_KEY = 'PROD_VnoClJI9aikS8dyy';
11
+ this.IOT_KEY = 'meicloud';
12
+ this.LOGIN_KEY = 'ac21b9f9cbfe4ca5a88562ef25e2b768';
13
+ this.IOT_KEY_CHINA = 'prod_secret123@muc';
14
+ this.LOGIN_KEY_CHINA = 'ad0ee21d48a64bf49f4fb583ab76e799';
15
+ this.iot_key = this.use_china_server ? this.IOT_KEY_CHINA : this.IOT_KEY;
16
+ this.login_key = this.use_china_server ? this.LOGIN_KEY_CHINA : this.LOGIN_KEY;
17
+ }
18
+ // Generate a HMAC signature for the provided data and random data.
19
+ sign(data, random) {
20
+ const message = `${this.iot_key}${data}${random}`;
21
+ return (0, crypto_1.createHmac)('sha256', this.HMAC_KEY).update(message).digest('hex');
22
+ }
23
+ // Encrypt the password for cloud API password.
24
+ encrpytPassword(loginId, password) {
25
+ const m1 = (0, crypto_1.createHash)('sha256').update(password);
26
+ const login_hash = `${loginId}${m1.digest('hex')}${this.login_key}`;
27
+ const m2 = (0, crypto_1.createHash)('sha256').update(login_hash);
28
+ return m2.digest('hex');
29
+ }
30
+ // Encrypts password for cloud API iampwd field.
31
+ encrpytIAMPassword(loginId, password) {
32
+ const m1 = (0, crypto_1.createHash)('md5').update(password);
33
+ const m2 = (0, crypto_1.createHash)('md5').update(m1.digest('hex'));
34
+ if (this.use_china_server) {
35
+ return m2.digest('hex');
36
+ }
37
+ const login_hash = `${loginId}${m2.digest('hex')}${this.login_key}`;
38
+ const sha = (0, crypto_1.createHash)('sha256').update(login_hash);
39
+ return sha.digest('hex');
40
+ }
41
+ static getUDPID(device_id_buf) {
42
+ const data = (0, crypto_1.createHash)('sha256').update(device_id_buf).digest();
43
+ const output = Buffer.alloc(16);
44
+ for (let i = 0; i < 16; i++) {
45
+ output[i] = data[i] ^ data[i + 16];
46
+ }
47
+ return output.toString('hex');
48
+ }
49
+ }
50
+ exports.CloudSecurity = CloudSecurity;
51
+ class LocalSecurity {
52
+ constructor() {
53
+ // private static readonly SIGN_KEY = Buffer.from('xhdiwjnchekd4d512chdjx5d8e4c394D2D7S', 'utf-8');
54
+ // public static readonly ENC_KEY = createHash('md5').update(this.SIGN_KEY).digest();
55
+ this.aes_key = Buffer.from('6a92ef406bad2f0359baad994171ea6d', 'hex');
56
+ this.salt = Buffer.from('78686469776a6e6368656b6434643531326368646a783564386534633339344432443753', 'hex');
57
+ this.iv = Buffer.alloc(16);
58
+ this.request_count = 0;
59
+ this.response_count = 0;
60
+ }
61
+ aes_cbc_encrpyt(raw, key) {
62
+ const cipher = (0, crypto_1.createCipheriv)('aes-256-cbc', key, this.iv);
63
+ cipher.setAutoPadding(false);
64
+ return Buffer.concat([cipher.update(raw), cipher.final()]);
65
+ }
66
+ aes_cbc_decrypt(raw, key) {
67
+ const decipher = (0, crypto_1.createDecipheriv)('aes-256-cbc', key, this.iv);
68
+ decipher.setAutoPadding(false);
69
+ return Buffer.concat([decipher.update(raw), decipher.final()]);
70
+ }
71
+ aes_encrypt(data) {
72
+ const cipher = (0, crypto_1.createCipheriv)('aes-128-ecb', this.aes_key, null);
73
+ return Buffer.concat([cipher.update(data), cipher.final()]);
74
+ }
75
+ aes_decrypt(data) {
76
+ const decipher = (0, crypto_1.createDecipheriv)('aes-128-ecb', this.aes_key, null);
77
+ return Buffer.concat([decipher.update(data), decipher.final()]);
78
+ }
79
+ encode32_data(raw) {
80
+ return (0, crypto_1.createHash)('md5').update(Buffer.concat([raw, this.salt])).digest();
81
+ }
82
+ tcp_key_from_resp(response, key) {
83
+ if (response.toString() === 'ERROR') {
84
+ throw Error('Authentication response is ERROR, cannot get TCP key.');
85
+ }
86
+ if (response.length !== 64) {
87
+ throw Error('Authentication response has unexpected data length, cannot get TCP key..');
88
+ }
89
+ const payload = response.subarray(0, 32);
90
+ const sign = response.subarray(32, response.length);
91
+ const plain = this.aes_cbc_decrypt(payload, key);
92
+ if ((0, crypto_1.createHash)('sha256').update(plain).digest().compare(sign) !== 0) {
93
+ throw Error('Authentication sign does not match, cannot get TCP key.');
94
+ }
95
+ this.tcp_key = (0, MideaUtils_1.strxor)(plain, key);
96
+ this.request_count = 0;
97
+ this.response_count = 0;
98
+ return this.tcp_key;
99
+ }
100
+ encode_8370(data, message_type) {
101
+ let header = Buffer.from([0x83, 0x70]);
102
+ let size = data.length;
103
+ let padding = 0;
104
+ if (message_type === MideaConstants_1.TCPMessageType.ENCRYPTED_REQUEST || message_type === MideaConstants_1.TCPMessageType.ENCRYPTED_RESPONSE) {
105
+ if ((size + 2) % 16 !== 0) {
106
+ padding = 16 - (size + 2 & 0xf);
107
+ size += padding + 32;
108
+ data = Buffer.concat([data, (0, crypto_1.randomBytes)(padding)]);
109
+ }
110
+ }
111
+ header = Buffer.concat([header, (0, MideaUtils_1.numberToUint8Array)(size, 2, 'big')]);
112
+ header = Buffer.concat([header, Buffer.from([0x20, padding << 4 | message_type])]);
113
+ data = Buffer.concat([(0, MideaUtils_1.numberToUint8Array)(this.request_count, 2, 'big'), data]);
114
+ this.request_count += 1;
115
+ if (this.request_count >= 0xFFFF) {
116
+ this.request_count = 0;
117
+ }
118
+ if (message_type === MideaConstants_1.TCPMessageType.ENCRYPTED_REQUEST || message_type === MideaConstants_1.TCPMessageType.ENCRYPTED_RESPONSE) {
119
+ const sign = (0, crypto_1.createHash)('sha256').update(Buffer.concat([header, data])).digest();
120
+ data = Buffer.concat([this.aes_cbc_encrpyt(data, this.tcp_key), sign]);
121
+ }
122
+ return Buffer.concat([header, data]);
123
+ }
124
+ decode_8370(data) {
125
+ if (data.length < 6) {
126
+ return [[], data];
127
+ }
128
+ const header = data.subarray(0, 6);
129
+ if (header[0] !== 0x83 || header[1] !== 0x70) {
130
+ throw new Error('Not an 8370 message.');
131
+ }
132
+ const size = header.subarray(2, 4).readUInt16BE() + 8;
133
+ let leftover = Buffer.alloc(0);
134
+ if (data.length < size) {
135
+ return [[], data];
136
+ }
137
+ else if (data.length > size) {
138
+ leftover = data.subarray(size, data.length);
139
+ data = data.subarray(0, size);
140
+ }
141
+ if (header[4] !== 0x20) {
142
+ throw new Error('Missing byte 4');
143
+ }
144
+ const padding = header[5] >> 4;
145
+ const message_type_received = header[5] & 0xF;
146
+ data = data.subarray(6, data.length);
147
+ if ([MideaConstants_1.TCPMessageType.ENCRYPTED_RESPONSE, MideaConstants_1.TCPMessageType.ENCRYPTED_REQUEST].includes(message_type_received)) {
148
+ const sign = data.subarray(data.length - 32, data.length);
149
+ data = data.subarray(0, data.length - 32);
150
+ data = this.aes_cbc_decrypt(data, this.tcp_key);
151
+ if ((0, crypto_1.createHash)('sha256').update(Buffer.concat([header, data])).digest().compare(sign) !== 0) {
152
+ throw new Error('Sign does not match');
153
+ }
154
+ if (padding) {
155
+ data = data.subarray(0, data.length - padding);
156
+ }
157
+ }
158
+ this.response_count = data.subarray(0, 2).readUInt16BE();
159
+ data = data.subarray(2, data.length);
160
+ if (leftover.length > 0) {
161
+ const [packets, incomplete] = this.decode_8370(leftover);
162
+ return [[data, ...packets], incomplete];
163
+ }
164
+ return [[data], leftover];
165
+ }
166
+ }
167
+ exports.LocalSecurity = LocalSecurity;
168
+ //# sourceMappingURL=MideaSecurity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MideaSecurity.js","sourceRoot":"","sources":["../../src/core/MideaSecurity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { Logger } from 'homebridge';
4
+ import { Endianness } from './MideaConstants';
5
+ import { Socket } from 'net';
6
+ export declare function numberToUint8Array(num: number, byte_length: number, endianness: Endianness): Uint8Array;
7
+ export declare function strxor(a: Buffer, b: Buffer): Buffer;
8
+ export declare function calculate(data: Buffer): number;
9
+ export declare class PromiseSocket {
10
+ private innerSok;
11
+ private readonly logger;
12
+ constructor(innerSok: Socket, logger: Logger);
13
+ connect(port: number, host: string): Promise<void>;
14
+ write(data: string | Buffer, encoding?: BufferEncoding): Promise<void>;
15
+ read(size: number): Promise<Buffer>;
16
+ readAll(): Promise<Buffer>;
17
+ }
18
+ //# sourceMappingURL=MideaUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MideaUtils.d.ts","sourceRoot":"","sources":["../../src/core/MideaUtils.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAE7B,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,cAO1F;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,UAY1C;AAqCD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,UAarC;AAGD,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAzC,QAAQ,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM;IAE9D,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBnD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc;IA4BpD,IAAI,CAAC,IAAI,EAAE,MAAM;IAsCjB,OAAO;CAiCd"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PromiseSocket = exports.calculate = exports.strxor = exports.numberToUint8Array = void 0;
4
+ function numberToUint8Array(num, byte_length, endianness) {
5
+ const arr = new Uint8Array(byte_length);
6
+ for (let i = 0; i < byte_length; i++) {
7
+ arr[i] = num % 256;
8
+ num = Math.floor(num / 256);
9
+ }
10
+ return endianness === 'big' ? arr.reverse() : arr;
11
+ }
12
+ exports.numberToUint8Array = numberToUint8Array;
13
+ function strxor(a, b) {
14
+ if (a.length !== b.length) {
15
+ throw Error('strxor: a and b must have the same length!');
16
+ }
17
+ const output = Buffer.alloc(a.length);
18
+ for (let i = 0; i < a.length; i++) {
19
+ output[i] = a[i] ^ b[i];
20
+ }
21
+ return output;
22
+ }
23
+ exports.strxor = strxor;
24
+ const CRC8_854_TABLE = [
25
+ 0x00, 0x5E, 0xBC, 0xE2, 0x61, 0x3F, 0xDD, 0x83,
26
+ 0xC2, 0x9C, 0x7E, 0x20, 0xA3, 0xFD, 0x1F, 0x41,
27
+ 0x9D, 0xC3, 0x21, 0x7F, 0xFC, 0xA2, 0x40, 0x1E,
28
+ 0x5F, 0x01, 0xE3, 0xBD, 0x3E, 0x60, 0x82, 0xDC,
29
+ 0x23, 0x7D, 0x9F, 0xC1, 0x42, 0x1C, 0xFE, 0xA0,
30
+ 0xE1, 0xBF, 0x5D, 0x03, 0x80, 0xDE, 0x3C, 0x62,
31
+ 0xBE, 0xE0, 0x02, 0x5C, 0xDF, 0x81, 0x63, 0x3D,
32
+ 0x7C, 0x22, 0xC0, 0x9E, 0x1D, 0x43, 0xA1, 0xFF,
33
+ 0x46, 0x18, 0xFA, 0xA4, 0x27, 0x79, 0x9B, 0xC5,
34
+ 0x84, 0xDA, 0x38, 0x66, 0xE5, 0xBB, 0x59, 0x07,
35
+ 0xDB, 0x85, 0x67, 0x39, 0xBA, 0xE4, 0x06, 0x58,
36
+ 0x19, 0x47, 0xA5, 0xFB, 0x78, 0x26, 0xC4, 0x9A,
37
+ 0x65, 0x3B, 0xD9, 0x87, 0x04, 0x5A, 0xB8, 0xE6,
38
+ 0xA7, 0xF9, 0x1B, 0x45, 0xC6, 0x98, 0x7A, 0x24,
39
+ 0xF8, 0xA6, 0x44, 0x1A, 0x99, 0xC7, 0x25, 0x7B,
40
+ 0x3A, 0x64, 0x86, 0xD8, 0x5B, 0x05, 0xE7, 0xB9,
41
+ 0x8C, 0xD2, 0x30, 0x6E, 0xED, 0xB3, 0x51, 0x0F,
42
+ 0x4E, 0x10, 0xF2, 0xAC, 0x2F, 0x71, 0x93, 0xCD,
43
+ 0x11, 0x4F, 0xAD, 0xF3, 0x70, 0x2E, 0xCC, 0x92,
44
+ 0xD3, 0x8D, 0x6F, 0x31, 0xB2, 0xEC, 0x0E, 0x50,
45
+ 0xAF, 0xF1, 0x13, 0x4D, 0xCE, 0x90, 0x72, 0x2C,
46
+ 0x6D, 0x33, 0xD1, 0x8F, 0x0C, 0x52, 0xB0, 0xEE,
47
+ 0x32, 0x6C, 0x8E, 0xD0, 0x53, 0x0D, 0xEF, 0xB1,
48
+ 0xF0, 0xAE, 0x4C, 0x12, 0x91, 0xCF, 0x2D, 0x73,
49
+ 0xCA, 0x94, 0x76, 0x28, 0xAB, 0xF5, 0x17, 0x49,
50
+ 0x08, 0x56, 0xB4, 0xEA, 0x69, 0x37, 0xD5, 0x8B,
51
+ 0x57, 0x09, 0xEB, 0xB5, 0x36, 0x68, 0x8A, 0xD4,
52
+ 0x95, 0xCB, 0x29, 0x77, 0xF4, 0xAA, 0x48, 0x16,
53
+ 0xE9, 0xB7, 0x55, 0x0B, 0x88, 0xD6, 0x34, 0x6A,
54
+ 0x2B, 0x75, 0x97, 0xC9, 0x4A, 0x14, 0xF6, 0xA8,
55
+ 0x74, 0x2A, 0xC8, 0x96, 0x15, 0x4B, 0xA9, 0xF7,
56
+ 0xB6, 0xE8, 0x0A, 0x54, 0xD7, 0x89, 0x6B, 0x35,
57
+ ];
58
+ function calculate(data) {
59
+ let crc = 0;
60
+ for (let i = 0; i < data.length; i++) {
61
+ let k = crc ^ data[i];
62
+ if (k > 256) {
63
+ k -= 256;
64
+ }
65
+ if (k < 0) {
66
+ k += 256;
67
+ }
68
+ crc = CRC8_854_TABLE[k];
69
+ }
70
+ return crc;
71
+ }
72
+ exports.calculate = calculate;
73
+ class PromiseSocket {
74
+ constructor(innerSok, logger) {
75
+ this.innerSok = innerSok;
76
+ this.logger = logger;
77
+ }
78
+ connect(port, host) {
79
+ return new Promise((resolve, reject) => {
80
+ const errorHandler = (err) => {
81
+ reject(err);
82
+ removeListeners();
83
+ };
84
+ this.innerSok.connect(port, host, () => {
85
+ resolve();
86
+ removeListeners();
87
+ });
88
+ this.innerSok.on('error', errorHandler);
89
+ const removeListeners = () => {
90
+ this.innerSok.removeListener('error', errorHandler);
91
+ };
92
+ });
93
+ }
94
+ async write(data, encoding) {
95
+ return new Promise((resolve, reject) => {
96
+ const errorHandler = (err) => {
97
+ reject(err);
98
+ removeListeners();
99
+ };
100
+ const removeListeners = () => {
101
+ this.innerSok.removeListener('error', errorHandler);
102
+ };
103
+ this.innerSok.on('error', errorHandler);
104
+ try {
105
+ this.innerSok.write(data, encoding, (err) => {
106
+ if (err) {
107
+ reject(err);
108
+ removeListeners();
109
+ return;
110
+ }
111
+ resolve();
112
+ removeListeners();
113
+ });
114
+ }
115
+ catch (err) {
116
+ reject(err);
117
+ removeListeners();
118
+ }
119
+ });
120
+ }
121
+ async read(size) {
122
+ return new Promise((resolve, reject) => {
123
+ let buf = Buffer.alloc(0);
124
+ const dataHandler = (data) => {
125
+ buf = Buffer.concat([buf, data]);
126
+ if (buf.length >= size) {
127
+ resolve(buf);
128
+ removeListeners();
129
+ }
130
+ };
131
+ const timeoutHandler = () => {
132
+ resolve(buf);
133
+ removeListeners();
134
+ };
135
+ const endHandler = () => {
136
+ resolve(buf);
137
+ removeListeners();
138
+ };
139
+ const errorHandler = (err) => {
140
+ reject(err);
141
+ removeListeners();
142
+ };
143
+ this.innerSok.on('data', dataHandler);
144
+ this.innerSok.on('timeout', timeoutHandler);
145
+ this.innerSok.on('end', endHandler);
146
+ this.innerSok.on('error', errorHandler);
147
+ const removeListeners = () => {
148
+ this.innerSok.removeListener('data', dataHandler);
149
+ this.innerSok.removeListener('timeout', timeoutHandler);
150
+ this.innerSok.removeListener('end', endHandler);
151
+ this.innerSok.removeListener('error', errorHandler);
152
+ };
153
+ });
154
+ }
155
+ async readAll() {
156
+ return new Promise((resolve, reject) => {
157
+ let buf = Buffer.alloc(0);
158
+ const dataHandler = (data) => {
159
+ buf = Buffer.concat([buf, data]);
160
+ };
161
+ const endHandler = () => {
162
+ resolve(buf);
163
+ removeListeners();
164
+ };
165
+ const errorHandler = (err) => {
166
+ reject(err);
167
+ removeListeners();
168
+ };
169
+ const timeoutHandler = () => {
170
+ resolve(buf);
171
+ removeListeners();
172
+ };
173
+ this.innerSok.on('data', dataHandler);
174
+ this.innerSok.on('timeout', timeoutHandler);
175
+ this.innerSok.on('end', endHandler);
176
+ this.innerSok.on('error', errorHandler);
177
+ const removeListeners = () => {
178
+ this.innerSok.removeListener('data', dataHandler);
179
+ this.innerSok.removeListener('timeout', timeoutHandler);
180
+ this.innerSok.removeListener('end', endHandler);
181
+ this.innerSok.removeListener('error', errorHandler);
182
+ };
183
+ });
184
+ }
185
+ }
186
+ exports.PromiseSocket = PromiseSocket;
187
+ //# sourceMappingURL=MideaUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MideaUtils.js","sourceRoot":"","sources":["../../src/core/MideaUtils.ts"],"names":[],"mappings":";;;AAIA,SAAgB,kBAAkB,CAAC,GAAW,EAAE,WAAmB,EAAE,UAAsB;IACzF,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;QACpC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;QACnB,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;KAC7B;IACD,OAAO,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC;AAPD,gDAOC;AAED,SAAgB,MAAM,CAAC,CAAS,EAAE,CAAS;IAEzC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE;QACzB,MAAM,KAAK,CAAC,4CAA4C,CAAC,CAAC;KAC3D;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KACzB;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAZD,wBAYC;AAED,MAAM,cAAc,GAAG;IACrB,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE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"}
@@ -0,0 +1,8 @@
1
+ import { Logger } from 'homebridge';
2
+ import { DeviceInfo } from '../core/MideaConstants';
3
+ import MideaACDevice from './ac/MideaACDevice';
4
+ import { KeyToken } from '../core/MideaSecurity';
5
+ export default class DeviceFactory {
6
+ static createDevice(logger: Logger, device_info: DeviceInfo, token: KeyToken, key: KeyToken): MideaACDevice | undefined;
7
+ }
8
+ //# sourceMappingURL=DeviceFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceFactory.d.ts","sourceRoot":"","sources":["../../src/devices/DeviceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,UAAU,EAAc,MAAM,wBAAwB,CAAC;AAChE,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,aAAa;WAClB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ;CAMnG"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const MideaConstants_1 = require("../core/MideaConstants");
7
+ const MideaACDevice_1 = __importDefault(require("./ac/MideaACDevice"));
8
+ class DeviceFactory {
9
+ static createDevice(logger, device_info, token, key) {
10
+ switch (device_info.type) {
11
+ case MideaConstants_1.DeviceType.AIR_CONDITIONER:
12
+ return new MideaACDevice_1.default(logger, device_info, token, key);
13
+ }
14
+ }
15
+ }
16
+ exports.default = DeviceFactory;
17
+ //# sourceMappingURL=DeviceFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceFactory.js","sourceRoot":"","sources":["../../src/devices/DeviceFactory.ts"],"names":[],"mappings":";;;;;AACA,2DAAgE;AAChE,uEAA+C;AAG/C,MAAqB,aAAa;IACzB,MAAM,CAAC,YAAY,CAAC,MAAc,EAAE,WAAuB,EAAE,KAAe,EAAE,GAAa;QAChG,QAAQ,WAAW,CAAC,IAAI,EAAE;YACxB,KAAK,2BAAU,CAAC,eAAe;gBAC7B,OAAO,IAAI,uBAAa,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;SAC7D;IACH,CAAC;CACF;AAPD,gCAOC"}
@@ -0,0 +1,80 @@
1
+ /// <reference types="node" />
2
+ import { Logger } from 'homebridge';
3
+ import { DeviceInfo } from '../../core/MideaConstants';
4
+ import MideaDevice, { DeviceAttributesBase } from '../../core/MideaDevice';
5
+ import { KeyToken } from '../../core/MideaSecurity';
6
+ import { MessageGeneralSet, MessageNewProtocolQuery, MessagePowerQuery, MessageQuery, MessageSubProtocolSet } from './MideaACMessage';
7
+ interface DeviceAttributes extends DeviceAttributesBase {
8
+ PROMPT_TONE: boolean;
9
+ POWER: boolean;
10
+ MODE: number;
11
+ TARGET_TEMPERATURE: number;
12
+ FAN_SPEED: number;
13
+ SWING_VERTICAL: boolean;
14
+ SWING_HORIZONTAL: boolean;
15
+ SMART_EYE: boolean;
16
+ DRY: boolean;
17
+ AUX_HEATING: boolean;
18
+ BOOST_MODE: boolean;
19
+ SLEEP_MODE: boolean;
20
+ FROST_PROTECT: boolean;
21
+ COMFORT_MODE: boolean;
22
+ ECO_MODE: boolean;
23
+ NATURAL_WIND: boolean;
24
+ TEMP_FAHRENHEIT: boolean;
25
+ SCREEN_DISPLAY: boolean;
26
+ SCREEN_DISPLAY_NEW: boolean;
27
+ FULL_DUST: boolean;
28
+ INDOOR_TEMPERATURE?: number;
29
+ OUTDOOR_TEMPERATURE?: number;
30
+ INDIRECT_WIND: boolean;
31
+ INDOOR_HUMIDITY?: number;
32
+ BREEZELESS: boolean;
33
+ TOTAL_ENERGY_CONSUMPTION?: number;
34
+ CURRENT_ENERGY_CONSUMPTION?: number;
35
+ REALTIME_POWER: number;
36
+ FRESH_AIR_POWER: boolean;
37
+ FRESH_AIR_FAN_SPEED: number;
38
+ FRESH_AIR_MODE?: string;
39
+ FRESH_AIR_1: boolean;
40
+ FRESH_AIR_2: boolean;
41
+ }
42
+ export default class MideaACDevice extends MideaDevice {
43
+ readonly FRESH_AIR_FAN_SPEEDS: {
44
+ 0: string;
45
+ 20: string;
46
+ 40: string;
47
+ 60: string;
48
+ 80: string;
49
+ 100: string;
50
+ };
51
+ readonly FRESH_AIR_FAN_SPEEDS_REVERSE: {
52
+ 100: string;
53
+ 80: string;
54
+ 60: string;
55
+ 40: string;
56
+ 20: string;
57
+ 0: string;
58
+ };
59
+ attributes: DeviceAttributes;
60
+ private fresh_air_version?;
61
+ private readonly DEFAULT_TEMPERATURE_STEP;
62
+ private temperature_step?;
63
+ private used_subprotocol;
64
+ private bb_sn8_flag;
65
+ private bb_timer;
66
+ private readonly DEFAULT_POWER_ANALYSIS_METHOD;
67
+ private power_analysis_method?;
68
+ constructor(logger: Logger, device_info: DeviceInfo, token: KeyToken, key: KeyToken);
69
+ build_query(): (MessageQuery | MessagePowerQuery | MessageNewProtocolQuery)[];
70
+ process_message(msg: Buffer): void;
71
+ make_message_set(): MessageGeneralSet;
72
+ make_subprotocol_message_set(): MessageSubProtocolSet;
73
+ make_message_unique_set(): MessageGeneralSet | MessageSubProtocolSet;
74
+ set_attribute(attributes: Partial<DeviceAttributes>): Promise<void>;
75
+ set_target_temperature(target_temperature: number, mode: number): Promise<void>;
76
+ set_swing(swing_horizontal: boolean, swing_vertical: boolean): Promise<void>;
77
+ protected set_subtype(): void;
78
+ }
79
+ export {};
80
+ //# sourceMappingURL=MideaACDevice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MideaACDevice.d.ts","sourceRoot":"","sources":["../../../src/devices/ac/MideaACDevice.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,WAAW,EAAE,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAqB,iBAAiB,EAAE,uBAAuB,EAAyB,iBAAiB,EAAE,YAAY,EAA+C,qBAAqB,EAAwB,MAAM,kBAAkB,CAAC;AAEnP,UAAU,gBAAiB,SAAQ,oBAAoB;IACrD,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IAEf,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,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,CAAC;IACxB,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,CAAC,EAAE,MAAM,CAAC;IACzB,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;CACtB;AAED,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IAEpD,QAAQ,CAAC,oBAAoB;;;;;;;MAO3B;IAEF,QAAQ,CAAC,4BAA4B;;;;;;;MAOnC;IAEK,UAAU,EAAE,gBAAgB,CAAC;IAEpC,OAAO,CAAC,iBAAiB,CAAC,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAO;IAChD,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAClC,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;gBAGrC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,UAAU,EACvB,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,QAAQ;IAwCf,WAAW;IAeX,eAAe,CAAC,GAAG,EAAE,MAAM;IAqD3B,gBAAgB;IAsBhB,4BAA4B;IAiB5B,uBAAuB,IAAI,iBAAiB,GAAG,qBAAqB;IAI9D,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAuEnD,sBAAsB,CAAC,kBAAkB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAc/D,SAAS,CAAC,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO;IASlE,SAAS,CAAC,WAAW,IAAI,IAAI;CAG9B"}