homebridge-midea-platform 1.2.10-beta.4 → 1.2.10-beta.6
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/CHANGELOG.md +4 -0
- package/T_0000_CC_6.lua +988 -0
- package/dist/accessory/AirConditionerAccessory.d.ts +2 -0
- package/dist/accessory/AirConditionerAccessory.js +16 -0
- package/dist/accessory/AirConditionerAccessory.js.map +1 -1
- package/dist/accessory/DehumidifierAccessory.js +1 -0
- package/dist/accessory/DehumidifierAccessory.js.map +1 -1
- package/dist/platformUtils.d.ts +1 -0
- package/dist/platformUtils.js +1 -0
- package/dist/platformUtils.js.map +1 -1
- package/package.json +1 -1
package/T_0000_CC_6.lua
ADDED
|
@@ -0,0 +1,988 @@
|
|
|
1
|
+
local JSON = require 'cjson'
|
|
2
|
+
local KEY_VERSION = 'version'
|
|
3
|
+
local KEY_CMD_TYPE = 'cmd_type'
|
|
4
|
+
local KEY_POWER = 'power'
|
|
5
|
+
local KEY_MODE = 'mode'
|
|
6
|
+
local KEY_WIND_SPEED = 'wind_speed'
|
|
7
|
+
local KEY_TEMPERATURE = 'temperature'
|
|
8
|
+
local KEY_SMALL_TEMPERATURE = 'small_temperature'
|
|
9
|
+
local KEY_CONTROL_FAN_SPEED = 'control_fan_speed'
|
|
10
|
+
local KEY_PTC_SETTING = 'ptc_setting'
|
|
11
|
+
local KEY_PTC_POWER = 'ptc'
|
|
12
|
+
local KEY_EXHAUST = 'exhaust'
|
|
13
|
+
local KEY_WIND_UD = 'wind_swing_ud'
|
|
14
|
+
local KEY_ECO = 'eco'
|
|
15
|
+
local KEY_WIND_SWING_LR = 'wind_swing_lr'
|
|
16
|
+
local KEY_WIND_SWING_UD_SITE = 'wind_swing_ud_site'
|
|
17
|
+
local KEY_WIND_SWING_LR_SITE = 'wind_swing_lr_site'
|
|
18
|
+
local KEY_POWER_OFF_TIME = 'power_off_time_value'
|
|
19
|
+
local KEY_POWER_ON_TIME = 'power_on_time_value'
|
|
20
|
+
local KEY_SLEEP_SWITCH = 'sleep_switch'
|
|
21
|
+
local KEY_DIGIT_DISPLAY_SWITCH = 'digit_display_switch'
|
|
22
|
+
local KEY_INDOOR_TEMPERATURE = 'indoor_temperature'
|
|
23
|
+
local KEY_EVAPORATOR_ENTRANCE_TEMPERATURE = 'evaporator_entrance_temperature'
|
|
24
|
+
local KEY_EVAPORATOR_EXIT_TEMPERATURE = 'evaporator_exit_temperature'
|
|
25
|
+
local KEY_ERROR_FROM_MACHINE_STYLE = 'error_from_machine_style'
|
|
26
|
+
local KEY_ERROR_CODE = 'error_code'
|
|
27
|
+
|
|
28
|
+
local VALUE_VERSION = '6'
|
|
29
|
+
local VALUE_CMD_COMMON = 'cmd_common'
|
|
30
|
+
local VALUE_CMD_LOCK = 'cmd_lock'
|
|
31
|
+
local VALUE_CMD_SMART = 'cmd_smart'
|
|
32
|
+
local VALUE_CMD_QUERY_COMMON = 'cmd_query_common'
|
|
33
|
+
local VALUE_CMD_NOT_SUPPORT = 'cmd_not_support'
|
|
34
|
+
local VALUE_MODE_AUTO = 'auto'
|
|
35
|
+
local VALUE_MODE_COOL = 'cool'
|
|
36
|
+
local VALUE_MODE_HEAT = 'heat'
|
|
37
|
+
local VALUE_MODE_DRY = 'dry'
|
|
38
|
+
local VALUE_MODE_FAN = 'fan'
|
|
39
|
+
local VALUE_WIND_AUTO = 'auto'
|
|
40
|
+
local VALUE_WIND_POWER = 'power'
|
|
41
|
+
local VALUE_WIND_SUPER_HIGH = 'super_high'
|
|
42
|
+
local VALUE_WIND_HIGH = 'high'
|
|
43
|
+
local VALUE_WIND_MIDDLE = 'middle'
|
|
44
|
+
local VALUE_WIND_LOW = 'low'
|
|
45
|
+
local VALUE_WIND_MICRON = 'micron'
|
|
46
|
+
local VALUE_WIND_SLEEP = 'sleep'
|
|
47
|
+
local VALUE_PTC_SETTING_AUTO = 'ptc_setting_auto'
|
|
48
|
+
local VALUE_PTC_SETTING_ON = 'ptc_setting_on'
|
|
49
|
+
local VALUE_PTC_SETTING_OFF = 'ptc_setting_off'
|
|
50
|
+
local VALUE_ON = 'on'
|
|
51
|
+
local VALUE_OFF = 'off'
|
|
52
|
+
local VALUE_SWING_UD_NO_SITE = 'swing_ud_no_site'
|
|
53
|
+
local VALUE_SWING_UD_SITE1 = 'swing_ud_site_1'
|
|
54
|
+
local VALUE_SWING_UD_SITE2 = 'swing_ud_site_2'
|
|
55
|
+
local VALUE_SWING_UD_SITE3 = 'swing_ud_site_3'
|
|
56
|
+
local VALUE_SWING_UD_SITE4 = 'swing_ud_site_4'
|
|
57
|
+
local VALUE_SWING_UD_SITE5 = 'swing_ud_site_5'
|
|
58
|
+
local VALUE_SWING_UD_SITE6 = 'swing_ud_site_6'
|
|
59
|
+
local VALUE_SWING_LR_NO_SITE = 'swing_lr_no_site'
|
|
60
|
+
local VALUE_SWING_LR_SITE1 = 'swing_lr_site_1'
|
|
61
|
+
local VALUE_SWING_LR_SITE2 = 'swing_lr_site_2'
|
|
62
|
+
local VALUE_SWING_LR_SITE3 = 'swing_lr_site_3'
|
|
63
|
+
local VALUE_SWING_LR_SITE4 = 'swing_lr_site_4'
|
|
64
|
+
local VALUE_SWING_LR_SITE5 = 'swing_lr_site_5'
|
|
65
|
+
local VALUE_SWING_LR_SITE6 = 'swing_lr_site_6'
|
|
66
|
+
local VALUE_ERROR_FROM_OUTSIDE_MACHINE = 'error_from_outside_machine'
|
|
67
|
+
local VALUE_ERROR_FROM_INSIDE_MACHINE = 'error_from_inside_machine'
|
|
68
|
+
|
|
69
|
+
local BYTE_DEVICE_TYPE = 0xCC
|
|
70
|
+
local BYTE_CONTROL_REQUEST = 0x02
|
|
71
|
+
local BYTE_QUERY_STATUS_REQUEST = 0x03
|
|
72
|
+
local BYTE_PROTOCOL_HEAD = 0xAA
|
|
73
|
+
local BYTE_PROTOCOL_LENGTH = 0x0A
|
|
74
|
+
local BYTE_CMD_COMMON = 0xC3
|
|
75
|
+
local BYTE_CMD_LOCK = 0xB0
|
|
76
|
+
local BYTE_CMD_SMART = 0xE0
|
|
77
|
+
local BYTE_CMD_QUERY_COMMON = 0x01
|
|
78
|
+
local BYTE_CMD_NOT_SUPPORT = 0xD0
|
|
79
|
+
local BYTE_POWER_ON = 0x80
|
|
80
|
+
local BYTE_POWER_OFF = 0x00
|
|
81
|
+
local BYTE_MODE_AUTO = 0x10
|
|
82
|
+
local BYTE_MODE_COOL = 0x08
|
|
83
|
+
local BYTE_MODE_HEAT = 0x04
|
|
84
|
+
local BYTE_MODE_DRY = 0x02
|
|
85
|
+
local BYTE_MODE_FAN = 0x01
|
|
86
|
+
local BYTE_FANSPEED_AUTO = 0x80
|
|
87
|
+
local BYTE_FANSPEED_POWER = 0x40
|
|
88
|
+
local BYTE_FANSPEED_SUPER_HIGH = 0x20
|
|
89
|
+
local BYTE_FANSPEED_HIGH = 0x10
|
|
90
|
+
local BYTE_FANSPEED_MID = 0x08
|
|
91
|
+
local BYTE_FANSPEED_LOW = 0x04
|
|
92
|
+
local BYTE_FANSPEED_MICRON = 0x02
|
|
93
|
+
local BYTE_FANSPEED_SLEEP = 0x01
|
|
94
|
+
local BYTE_TEMPERATURE_MIN = 0x11
|
|
95
|
+
local BYTE_TEMPERATURE_MAX = 0x1E
|
|
96
|
+
local BYTE_PTC_SETTING_AUTO = 0x00
|
|
97
|
+
local BYTE_PTC_SETTING_ON = 0x10
|
|
98
|
+
local BYTE_PTC_SETTING_OFF = 0x20
|
|
99
|
+
local BYTE_PTC_POWER_ON = 0x02
|
|
100
|
+
local BYTE_PTC_POWER_OFF = 0x00
|
|
101
|
+
local BYTE_EXHAUST_ON = 0x08
|
|
102
|
+
local BYTE_EXHAUST_OFF = 0x00
|
|
103
|
+
local BYTE_SWING_UD_ON = 0x04
|
|
104
|
+
local BYTE_SWING_UD_OFF = 0x00
|
|
105
|
+
local BYTE_SWING_UD_NO_SITE = 0x00
|
|
106
|
+
local BYTE_SWING_UD_SITE1 = 0x01
|
|
107
|
+
local BYTE_SWING_UD_SITE2 = 0x02
|
|
108
|
+
local BYTE_SWING_UD_SITE3 = 0x03
|
|
109
|
+
local BYTE_SWING_UD_SITE4 = 0x04
|
|
110
|
+
local BYTE_SWING_UD_SITE5 = 0x05
|
|
111
|
+
local BYTE_SWING_UD_SITE6 = 0x06
|
|
112
|
+
local BYTE_ECO_ON = 0x01
|
|
113
|
+
local BYTE_ECO_OFF = 0x00
|
|
114
|
+
local BYTE_SWING_LR_ON = 0x01
|
|
115
|
+
local BYTE_SWING_LR_OFF = 0x00
|
|
116
|
+
local BYTE_SWING_LR_NO_SITE = 0x00
|
|
117
|
+
local BYTE_SWING_LR_SITE1 = 0x01
|
|
118
|
+
local BYTE_SWING_LR_SITE2 = 0x02
|
|
119
|
+
local BYTE_SWING_LR_SITE3 = 0x03
|
|
120
|
+
local BYTE_SWING_LR_SITE4 = 0x04
|
|
121
|
+
local BYTE_SWING_LR_SITE5 = 0x05
|
|
122
|
+
local BYTE_SWING_LR_SITE6 = 0x06
|
|
123
|
+
local BYTE_SLEEP_ON = 0x10
|
|
124
|
+
local BYTE_SLEEP_OFF = 0x00
|
|
125
|
+
local BYTE_DIGIT_DISPLAY_ON = 0x08
|
|
126
|
+
local BYTE_DIGIT_DISPLAY_OFF = 0x00
|
|
127
|
+
|
|
128
|
+
local cmdType
|
|
129
|
+
local powerValue
|
|
130
|
+
local modeValue
|
|
131
|
+
local fanspeedValue
|
|
132
|
+
local controlFanspeedValue
|
|
133
|
+
local temperatureValue
|
|
134
|
+
local swingUDSwitchValue
|
|
135
|
+
local ecoSwitchValue
|
|
136
|
+
local swingLRSwitchValue
|
|
137
|
+
local swingUDSiteValue = 0
|
|
138
|
+
local swingLRSiteValue = 0
|
|
139
|
+
local temperatureDecimals
|
|
140
|
+
local totlaTemperature
|
|
141
|
+
local PTCSettingValue = 0
|
|
142
|
+
local PTCValue = 0
|
|
143
|
+
local ecoValue = 0
|
|
144
|
+
local exhaustValue = 0
|
|
145
|
+
local sleepSwitchValue
|
|
146
|
+
local digitDisplaySwitchValue
|
|
147
|
+
local closeTime
|
|
148
|
+
local openTime
|
|
149
|
+
local indoorTemperature
|
|
150
|
+
local evaporatorEntranceTemp
|
|
151
|
+
local evaporatorExitTemp
|
|
152
|
+
local errorCodeMachineStyle
|
|
153
|
+
local errorHigh
|
|
154
|
+
local errorLow
|
|
155
|
+
local errorCode = 0
|
|
156
|
+
local isCanDecimals = 0
|
|
157
|
+
local dataType = 0
|
|
158
|
+
|
|
159
|
+
function jsonToModel(jsonCmd)
|
|
160
|
+
local streams = jsonCmd
|
|
161
|
+
if (streams[KEY_CMD_TYPE] == VALUE_CMD_COMMON) then
|
|
162
|
+
cmdType = BYTE_CMD_COMMON
|
|
163
|
+
elseif (streams[KEY_CMD_TYPE] == VALUE_CMD_LOCK) then
|
|
164
|
+
cmdType = BYTE_CMD_LOCK
|
|
165
|
+
elseif (streams[KEY_CMD_TYPE] == VALUE_CMD_SMART) then
|
|
166
|
+
cmdType = BYTE_CMD_SMART
|
|
167
|
+
end
|
|
168
|
+
if (streams[KEY_POWER] == VALUE_ON) then
|
|
169
|
+
powerValue = BYTE_POWER_ON
|
|
170
|
+
elseif (streams[KEY_POWER] == VALUE_OFF) then
|
|
171
|
+
powerValue = BYTE_POWER_OFF
|
|
172
|
+
end
|
|
173
|
+
if (streams[KEY_MODE] == VALUE_MODE_AUTO) then
|
|
174
|
+
modeValue = BYTE_MODE_AUTO
|
|
175
|
+
elseif (streams[KEY_MODE] == VALUE_MODE_COOL) then
|
|
176
|
+
modeValue = BYTE_MODE_COOL
|
|
177
|
+
elseif (streams[KEY_MODE] == VALUE_MODE_HEAT) then
|
|
178
|
+
modeValue = BYTE_MODE_HEAT
|
|
179
|
+
elseif (streams[KEY_MODE] == VALUE_MODE_DRY) then
|
|
180
|
+
modeValue = BYTE_MODE_DRY
|
|
181
|
+
elseif (streams[KEY_MODE] == VALUE_MODE_FAN) then
|
|
182
|
+
modeValue = BYTE_MODE_FAN
|
|
183
|
+
end
|
|
184
|
+
if (streams[KEY_PTC_SETTING] == VALUE_PTC_SETTING_AUTO) then
|
|
185
|
+
PTCSettingValue = BYTE_PTC_SETTING_AUTO
|
|
186
|
+
elseif (streams[KEY_PTC_SETTING] == VALUE_PTC_SETTING_ON) then
|
|
187
|
+
PTCSettingValue = BYTE_PTC_SETTING_ON
|
|
188
|
+
elseif (streams[KEY_PTC_SETTING] == VALUE_PTC_SETTING_OFF) then
|
|
189
|
+
PTCSettingValue = BYTE_PTC_SETTING_OFF
|
|
190
|
+
end
|
|
191
|
+
if (streams[KEY_EXHAUST] == VALUE_ON) then
|
|
192
|
+
exhaustValue = BYTE_EXHAUST_ON
|
|
193
|
+
elseif (streams[KEY_EXHAUST] == VALUE_OFF) then
|
|
194
|
+
exhaustValue = BYTE_EXHAUST_OFF
|
|
195
|
+
end
|
|
196
|
+
if (streams[KEY_ECO] == VALUE_ON) then
|
|
197
|
+
ecoValue = BYTE_ECO_ON
|
|
198
|
+
elseif (streams[KEY_ECO] == VALUE_OFF) then
|
|
199
|
+
ecoValue = BYTE_ECO_OFF
|
|
200
|
+
end
|
|
201
|
+
if (streams[KEY_WIND_UD] == VALUE_ON) then
|
|
202
|
+
swingUDSwitchValue = BYTE_SWING_UD_ON
|
|
203
|
+
elseif (streams[KEY_WIND_UD] == VALUE_OFF) then
|
|
204
|
+
swingUDSwitchValue = BYTE_SWING_UD_OFF
|
|
205
|
+
end
|
|
206
|
+
if (streams[KEY_WIND_SWING_UD_SITE] == VALUE_SWING_UD_NO_SITE) then
|
|
207
|
+
swingUDSiteValue = BYTE_SWING_UD_NO_SITE
|
|
208
|
+
elseif (streams[KEY_WIND_SWING_UD_SITE] == VALUE_SWING_UD_SITE1) then
|
|
209
|
+
swingUDSiteValue = BYTE_SWING_UD_SITE1
|
|
210
|
+
elseif (streams[KEY_WIND_SWING_UD_SITE] == VALUE_SWING_UD_SITE2) then
|
|
211
|
+
swingUDSiteValue = BYTE_SWING_UD_SITE2
|
|
212
|
+
elseif (streams[KEY_WIND_SWING_UD_SITE] == VALUE_SWING_UD_SITE3) then
|
|
213
|
+
swingUDSiteValue = BYTE_SWING_UD_SITE3
|
|
214
|
+
elseif (streams[KEY_WIND_SWING_UD_SITE] == VALUE_SWING_UD_SITE4) then
|
|
215
|
+
swingUDSiteValue = BYTE_SWING_UD_SITE4
|
|
216
|
+
elseif (streams[KEY_WIND_SWING_UD_SITE] == VALUE_SWING_UD_SITE5) then
|
|
217
|
+
swingUDSiteValue = BYTE_SWING_UD_SITE5
|
|
218
|
+
elseif (streams[KEY_WIND_SWING_UD_SITE] == VALUE_SWING_UD_SITE6) then
|
|
219
|
+
swingUDSiteValue = BYTE_SWING_UD_SITE6
|
|
220
|
+
end
|
|
221
|
+
if (streams[KEY_WIND_SWING_LR] == VALUE_ON) then
|
|
222
|
+
swingLRSwitchValue = BYTE_SWING_LR_ON
|
|
223
|
+
elseif (streams[KEY_WIND_SWING_LR] == VALUE_OFF) then
|
|
224
|
+
swingLRSwitchValue = BYTE_SWING_LR_OFF
|
|
225
|
+
end
|
|
226
|
+
if (streams[KEY_WIND_SWING_LR_SITE] == VALUE_SWING_UD_NO_SITE) then
|
|
227
|
+
swingLRSiteValue = BYTE_SWING_LR_NO_SITE
|
|
228
|
+
elseif (streams[KEY_WIND_SWING_LR_SITE] == VALUE_SWING_UD_SITE1) then
|
|
229
|
+
swingLRSiteValue = BYTE_SWING_LR_SITE1
|
|
230
|
+
elseif (streams[KEY_WIND_SWING_LR_SITE] == VALUE_SWING_UD_SITE2) then
|
|
231
|
+
swingLRSiteValue = BYTE_SWING_LR_SITE2
|
|
232
|
+
elseif (streams[KEY_WIND_SWING_LR_SITE] == VALUE_SWING_UD_SITE3) then
|
|
233
|
+
swingLRSiteValue = BYTE_SWING_LR_SITE3
|
|
234
|
+
elseif (streams[KEY_WIND_SWING_LR_SITE] == VALUE_SWING_UD_SITE4) then
|
|
235
|
+
swingLRSiteValue = BYTE_SWING_LR_SITE4
|
|
236
|
+
elseif (streams[KEY_WIND_SWING_LR_SITE] == VALUE_SWING_UD_SITE5) then
|
|
237
|
+
swingLRSiteValue = BYTE_SWING_LR_SITE5
|
|
238
|
+
elseif (streams[KEY_WIND_SWING_LR_SITE] == VALUE_SWING_UD_SITE6) then
|
|
239
|
+
swingLRSiteValue = BYTE_SWING_LR_SITE6
|
|
240
|
+
end
|
|
241
|
+
if (streams[KEY_SLEEP_SWITCH] == VALUE_ON) then
|
|
242
|
+
sleepSwitchValue = BYTE_SLEEP_ON
|
|
243
|
+
elseif (streams[KEY_SLEEP_SWITCH] == VALUE_OFF) then
|
|
244
|
+
sleepSwitchValue = BYTE_SLEEP_OFF
|
|
245
|
+
end
|
|
246
|
+
if (streams[KEY_DIGIT_DISPLAY_SWITCH] == VALUE_ON) then
|
|
247
|
+
digitDisplaySwitchValue = BYTE_DIGIT_DISPLAY_ON
|
|
248
|
+
elseif (streams[KEY_DIGIT_DISPLAY_SWITCH] == VALUE_OFF) then
|
|
249
|
+
digitDisplaySwitchValue = BYTE_DIGIT_DISPLAY_OFF
|
|
250
|
+
end
|
|
251
|
+
if (streams[KEY_WIND_SPEED] == VALUE_WIND_AUTO) then
|
|
252
|
+
fanspeedValue = BYTE_FANSPEED_AUTO
|
|
253
|
+
elseif (streams[KEY_WIND_SPEED] == VALUE_WIND_POWER) then
|
|
254
|
+
fanspeedValue = BYTE_FANSPEED_POWER
|
|
255
|
+
elseif (streams[KEY_WIND_SPEED] == VALUE_WIND_SUPER_HIGH) then
|
|
256
|
+
fanspeedValue = BYTE_FANSPEED_SUPER_HIGH
|
|
257
|
+
elseif (streams[KEY_WIND_SPEED] == VALUE_WIND_HIGH) then
|
|
258
|
+
fanspeedValue = BYTE_FANSPEED_HIGH
|
|
259
|
+
elseif (streams[KEY_WIND_SPEED] == VALUE_WIND_MIDDLE) then
|
|
260
|
+
fanspeedValue = BYTE_FANSPEED_MID
|
|
261
|
+
elseif (streams[KEY_WIND_SPEED] == VALUE_WIND_LOW) then
|
|
262
|
+
fanspeedValue = BYTE_FANSPEED_LOW
|
|
263
|
+
elseif (streams[KEY_WIND_SPEED] == VALUE_WIND_MICRON) then
|
|
264
|
+
fanspeedValue = BYTE_FANSPEED_MICRON
|
|
265
|
+
elseif (streams[KEY_WIND_SPEED] == VALUE_WIND_SLEEP) then
|
|
266
|
+
fanspeedValue = BYTE_FANSPEED_SLEEP
|
|
267
|
+
end
|
|
268
|
+
if (streams[KEY_TEMPERATURE] ~= nil) then
|
|
269
|
+
temperatureValue = checkBoundary(streams[KEY_TEMPERATURE], 17, 30)
|
|
270
|
+
end
|
|
271
|
+
if (streams[KEY_SMALL_TEMPERATURE] ~= nil) then
|
|
272
|
+
temperatureDecimals = checkBoundary(streams[KEY_SMALL_TEMPERATURE], 0, 0.9)
|
|
273
|
+
end
|
|
274
|
+
controlFanspeedValue = 0xFF
|
|
275
|
+
if (streams[KEY_POWER_OFF_TIME] ~= nil) then
|
|
276
|
+
closeTime = string2Int(streams[KEY_POWER_OFF_TIME])
|
|
277
|
+
end
|
|
278
|
+
if (streams[KEY_POWER_ON_TIME] ~= nil) then
|
|
279
|
+
openTime = string2Int(streams[streams[KEY_POWER_ON_TIME]])
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
local function binToModel(binData)
|
|
283
|
+
if (#binData < 23) then
|
|
284
|
+
return nil
|
|
285
|
+
end
|
|
286
|
+
local messageBytes = binData
|
|
287
|
+
if (dataType == 0x02 or dataType == 0x03 or dataType == 0x04 or dataType == 0x05) then
|
|
288
|
+
cmdType = messageBytes[0]
|
|
289
|
+
if ((cmdType == BYTE_CMD_COMMON) or (cmdType == BYTE_CMD_QUERY_COMMON)) then
|
|
290
|
+
powerValue = bit.band(messageBytes[1], 0x80)
|
|
291
|
+
modeValue = bit.band(messageBytes[1], 0x1F)
|
|
292
|
+
fanspeedValue = messageBytes[2]
|
|
293
|
+
temperatureValue = messageBytes[3]
|
|
294
|
+
indoorTemperature = messageBytes[4]
|
|
295
|
+
evaporatorEntranceTemp = messageBytes[5]
|
|
296
|
+
evaporatorExitTemp = messageBytes[6]
|
|
297
|
+
swingUDSiteValue = messageBytes[9]
|
|
298
|
+
openTime = messageBytes[10]
|
|
299
|
+
closeTime = messageBytes[11]
|
|
300
|
+
exhaustValue = bit.band(messageBytes[13], 0x08)
|
|
301
|
+
swingUDSwitchValue = bit.band(messageBytes[13], 0x04)
|
|
302
|
+
PTCValue = bit.band(messageBytes[13], 0x02)
|
|
303
|
+
ecoValue = bit.band(messageBytes[13], 0x01)
|
|
304
|
+
PTCSettingValue = bit.band(messageBytes[14], 0x60)
|
|
305
|
+
sleepSwitchValue = bit.band(messageBytes[14], 0x10)
|
|
306
|
+
digitDisplaySwitchValue = bit.band(messageBytes[14], 0x08)
|
|
307
|
+
swingLRSwitchValue = bit.band(messageBytes[14], 0x01)
|
|
308
|
+
controlFanspeedValue = 0xFF
|
|
309
|
+
swingLRSiteValue = messageBytes[17]
|
|
310
|
+
temperatureDecimals = messageBytes[19]
|
|
311
|
+
errorCodeMachineStyle = bit.band(messageBytes[18], 0x80)
|
|
312
|
+
errorHigh = bit.band(messageBytes[18], 0x7F)
|
|
313
|
+
errorLow = messageBytes[15]
|
|
314
|
+
isCanDecimals = bit.rshift(bit.band(messageBytes[14], 0x80), 7)
|
|
315
|
+
elseif (cmdType == BYTE_CMD_LOCK) then
|
|
316
|
+
lockWindLevel = messageBytes[1]
|
|
317
|
+
errorCode = messageBytes[4]
|
|
318
|
+
if (messageBytes[5] ~= 0xFF) then
|
|
319
|
+
lockCoolTemp = messageBytes[5]
|
|
320
|
+
end
|
|
321
|
+
if (messageBytes[6] ~= 0xFF) then
|
|
322
|
+
lockCoolTemp = messageBytes[6]
|
|
323
|
+
end
|
|
324
|
+
elseif (cmdType == BYTE_CMD_SMART) then
|
|
325
|
+
smartFunction = messageBytes[1]
|
|
326
|
+
elseif (cmdType == BYTE_CMD_NOT_SUPPORT) then
|
|
327
|
+
return nil
|
|
328
|
+
end
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
function jsonToData(jsonCmd)
|
|
333
|
+
if (#jsonCmd == 0) then
|
|
334
|
+
return nil
|
|
335
|
+
end
|
|
336
|
+
local infoM = {}
|
|
337
|
+
local bodyBytes = {}
|
|
338
|
+
local json = decode(jsonCmd)
|
|
339
|
+
local deviceSubType = json['deviceinfo']['deviceSubType']
|
|
340
|
+
if (deviceSubType == 1) then
|
|
341
|
+
end
|
|
342
|
+
local query = json['query']
|
|
343
|
+
local control = json['control']
|
|
344
|
+
local status = json['status']
|
|
345
|
+
if (query) then
|
|
346
|
+
for i = 0, 23 do
|
|
347
|
+
bodyBytes[i] = 0
|
|
348
|
+
end
|
|
349
|
+
bodyBytes[0] = 0x01
|
|
350
|
+
math.randomseed(tostring(os.time()):reverse():sub(1, 6))
|
|
351
|
+
bodyBytes[22] = math.random(0, 100)
|
|
352
|
+
bodyBytes[23] = crc8_854(bodyBytes, 0, 22)
|
|
353
|
+
infoM = getTotalMsg(bodyBytes, BYTE_QUERY_STATUS_REQUEST)
|
|
354
|
+
elseif (control) then
|
|
355
|
+
if (status) then
|
|
356
|
+
jsonToModel(status)
|
|
357
|
+
end
|
|
358
|
+
if (control) then
|
|
359
|
+
jsonToModel(control)
|
|
360
|
+
end
|
|
361
|
+
for i = 0, 23 do
|
|
362
|
+
bodyBytes[i] = 0
|
|
363
|
+
end
|
|
364
|
+
bodyBytes[0] = 0xC3
|
|
365
|
+
bodyBytes[1] = bit.bor(bit.band(powerValue, 0x80), bit.band(modeValue, 0x1F))
|
|
366
|
+
bodyBytes[2] = fanspeedValue
|
|
367
|
+
bodyBytes[3] = temperatureValue
|
|
368
|
+
if ((openTime == nil) or (openTime == 3825)) then
|
|
369
|
+
openTime = 0
|
|
370
|
+
end
|
|
371
|
+
bodyBytes[4] = math.floor(openTime / 15)
|
|
372
|
+
if ((closeTime == nil) or (closeTime == 3825)) then
|
|
373
|
+
closeTime = 0
|
|
374
|
+
end
|
|
375
|
+
bodyBytes[5] = math.floor(closeTime / 15)
|
|
376
|
+
bodyBytes[6] = bit.bor(
|
|
377
|
+
bit.bor(bit.band(ecoValue, 0x01), bit.band(swingUDSwitchValue, 0x04)),
|
|
378
|
+
bit.bor(bit.band(exhaustValue, 0x08), bit.band(PTCSettingValue, 0x30))
|
|
379
|
+
)
|
|
380
|
+
bodyBytes[7] = 0xFF
|
|
381
|
+
bodyBytes[8] = bit.bor(
|
|
382
|
+
bit.bor(bit.band(sleepSwitchValue, 0x10), bit.band(digitDisplaySwitchValue, 0x08)),
|
|
383
|
+
bit.band(swingLRSwitchValue, 0x01)
|
|
384
|
+
)
|
|
385
|
+
bodyBytes[9] = swingLRSiteValue
|
|
386
|
+
bodyBytes[10] = swingUDSiteValue
|
|
387
|
+
bodyBytes[11] = temperatureDecimals * 10
|
|
388
|
+
math.randomseed(tostring(os.time()):reverse():sub(1, 6))
|
|
389
|
+
bodyBytes[22] = math.random(0, 100)
|
|
390
|
+
bodyBytes[23] = crc8_854(bodyBytes, 0, 22)
|
|
391
|
+
infoM = getTotalMsg(bodyBytes, BYTE_CONTROL_REQUEST)
|
|
392
|
+
end
|
|
393
|
+
local ret = table2string(infoM)
|
|
394
|
+
ret = string2hexstring(ret)
|
|
395
|
+
return ret
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
function getTotalMsg(bodyData, cType)
|
|
399
|
+
local bodyLength = #bodyData
|
|
400
|
+
local msgLength = bodyLength + BYTE_PROTOCOL_LENGTH + 1
|
|
401
|
+
local msgBytes = {}
|
|
402
|
+
for i = 0, msgLength do
|
|
403
|
+
msgBytes[i] = 0
|
|
404
|
+
end
|
|
405
|
+
msgBytes[0] = BYTE_PROTOCOL_HEAD
|
|
406
|
+
msgBytes[1] = bodyLength + BYTE_PROTOCOL_LENGTH + 1
|
|
407
|
+
msgBytes[2] = BYTE_DEVICE_TYPE
|
|
408
|
+
msgBytes[9] = cType
|
|
409
|
+
for i = 0, bodyLength do
|
|
410
|
+
msgBytes[i + BYTE_PROTOCOL_LENGTH] = bodyData[i]
|
|
411
|
+
end
|
|
412
|
+
msgBytes[msgLength] = makeSum(msgBytes, 1, msgLength - 1)
|
|
413
|
+
local msgFinal = {}
|
|
414
|
+
for i = 1, msgLength + 1 do
|
|
415
|
+
msgFinal[i] = msgBytes[i - 1]
|
|
416
|
+
end
|
|
417
|
+
return msgFinal
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
function dataToJson(jsonCmd)
|
|
421
|
+
if (not jsonCmd) then
|
|
422
|
+
return nil
|
|
423
|
+
end
|
|
424
|
+
local json = decode(jsonCmd)
|
|
425
|
+
local deviceinfo = json['deviceinfo']
|
|
426
|
+
local deviceSubType = deviceinfo['deviceSubtype']
|
|
427
|
+
if (deviceSubType == 1) then
|
|
428
|
+
end
|
|
429
|
+
local status = json['status']
|
|
430
|
+
if (status) then
|
|
431
|
+
jsonToModel(status)
|
|
432
|
+
end
|
|
433
|
+
local binData = json['msg']['data']
|
|
434
|
+
local info = {}
|
|
435
|
+
local msgBytes = {}
|
|
436
|
+
local bodyBytes = {}
|
|
437
|
+
local msgLength = 0
|
|
438
|
+
local bodyLength = 0
|
|
439
|
+
info = string2table(binData)
|
|
440
|
+
dataType = info[10]
|
|
441
|
+
for i = 1, #info do
|
|
442
|
+
msgBytes[i - 1] = info[i]
|
|
443
|
+
end
|
|
444
|
+
msgLength = msgBytes[1]
|
|
445
|
+
bodyLength = msgLength - BYTE_PROTOCOL_LENGTH - 1
|
|
446
|
+
for i = 0, bodyLength do
|
|
447
|
+
bodyBytes[i] = msgBytes[i + BYTE_PROTOCOL_LENGTH]
|
|
448
|
+
end
|
|
449
|
+
binToModel(bodyBytes)
|
|
450
|
+
local streams = {}
|
|
451
|
+
streams[KEY_VERSION] = VALUE_VERSION
|
|
452
|
+
if (cmdType == BYTE_CMD_COMMON) then
|
|
453
|
+
streams[KEY_CMD_TYPE] = VALUE_CMD_COMMON
|
|
454
|
+
elseif (cmdType == BYTE_CMD_LOCK) then
|
|
455
|
+
streams[KEY_CMD_TYPE] = VALUE_CMD_LOCK
|
|
456
|
+
elseif (cmdType == BYTE_CMD_SMART) then
|
|
457
|
+
streams[KEY_CMD_TYPE] = VALUE_CMD_SMART
|
|
458
|
+
elseif (cmdType == BYTE_CMD_QUERY_COMMON) then
|
|
459
|
+
streams[KEY_CMD_TYPE] = VALUE_CMD_QUERY_COMMON
|
|
460
|
+
elseif (cmdType == BYTE_CMD_NOT_SUPPORT) then
|
|
461
|
+
streams[KEY_CMD_TYPE] = VALUE_CMD_NOT_SUPPORT
|
|
462
|
+
end
|
|
463
|
+
if ((cmdType == BYTE_CMD_COMMON) or (cmdType == BYTE_CMD_QUERY_COMMON)) then
|
|
464
|
+
if (powerValue == BYTE_POWER_ON) then
|
|
465
|
+
streams[KEY_POWER] = VALUE_ON
|
|
466
|
+
elseif (powerValue == BYTE_POWER_OFF) then
|
|
467
|
+
streams[KEY_POWER] = VALUE_OFF
|
|
468
|
+
end
|
|
469
|
+
if (modeValue == BYTE_MODE_AUTO) then
|
|
470
|
+
streams[KEY_MODE] = VALUE_MODE_AUTO
|
|
471
|
+
elseif (modeValue == BYTE_MODE_COOL) then
|
|
472
|
+
streams[KEY_MODE] = VALUE_MODE_COOL
|
|
473
|
+
elseif (modeValue == BYTE_MODE_HEAT) then
|
|
474
|
+
streams[KEY_MODE] = VALUE_MODE_HEAT
|
|
475
|
+
elseif (modeValue == BYTE_MODE_DRY) then
|
|
476
|
+
streams[KEY_MODE] = VALUE_MODE_DRY
|
|
477
|
+
elseif (modeValue == BYTE_MODE_FAN) then
|
|
478
|
+
streams[KEY_MODE] = VALUE_MODE_FAN
|
|
479
|
+
end
|
|
480
|
+
if (fanspeedValue == BYTE_FANSPEED_AUTO) then
|
|
481
|
+
streams[KEY_WIND_SPEED] = VALUE_WIND_AUTO
|
|
482
|
+
elseif (fanspeedValue == BYTE_FANSPEED_POWER) then
|
|
483
|
+
streams[KEY_WIND_SPEED] = VALUE_WIND_POWER
|
|
484
|
+
elseif (fanspeedValue == BYTE_FANSPEED_SUPER_HIGH) then
|
|
485
|
+
streams[KEY_WIND_SPEED] = VALUE_WIND_SUPER_HIGH
|
|
486
|
+
elseif (fanspeedValue == BYTE_FANSPEED_HIGH) then
|
|
487
|
+
streams[KEY_WIND_SPEED] = VALUE_WIND_HIGH
|
|
488
|
+
elseif (fanspeedValue == BYTE_FANSPEED_MID) then
|
|
489
|
+
streams[KEY_WIND_SPEED] = VALUE_WIND_MIDDLE
|
|
490
|
+
elseif (fanspeedValue == BYTE_FANSPEED_LOW) then
|
|
491
|
+
streams[KEY_WIND_SPEED] = VALUE_WIND_LOW
|
|
492
|
+
elseif (fanspeedValue == BYTE_FANSPEED_MICRON) then
|
|
493
|
+
streams[KEY_WIND_SPEED] = VALUE_WIND_MICRON
|
|
494
|
+
elseif (fanspeedValue == BYTE_FANSPEED_SLEEP) then
|
|
495
|
+
streams[KEY_WIND_SPEED] = VALUE_WIND_SLEEP
|
|
496
|
+
end
|
|
497
|
+
streams[KEY_TEMPERATURE] = int2String(temperatureValue)
|
|
498
|
+
streams[KEY_INDOOR_TEMPERATURE] = int2String((indoorTemperature - 40) / 2)
|
|
499
|
+
streams[KEY_EVAPORATOR_ENTRANCE_TEMPERATURE] = int2String((evaporatorEntranceTemp - 40) / 2)
|
|
500
|
+
streams[KEY_EVAPORATOR_EXIT_TEMPERATURE] = int2String((evaporatorExitTemp - 40) / 2)
|
|
501
|
+
if (swingUDSiteValue == BYTE_SWING_UD_NO_SITE) then
|
|
502
|
+
streams[KEY_WIND_SWING_UD_SITE] = VALUE_SWING_UD_NO_SITE
|
|
503
|
+
elseif (swingUDSiteValue == BYTE_SWING_UD_SITE1) then
|
|
504
|
+
streams[KEY_WIND_SWING_UD_SITE] = VALUE_SWING_UD_SITE1
|
|
505
|
+
elseif (swingUDSiteValue == BYTE_SWING_UD_SITE2) then
|
|
506
|
+
streams[KEY_WIND_SWING_UD_SITE] = VALUE_SWING_UD_SITE2
|
|
507
|
+
elseif (swingUDSiteValue == BYTE_SWING_UD_SITE3) then
|
|
508
|
+
streams[KEY_WIND_SWING_UD_SITE] = VALUE_SWING_UD_SITE3
|
|
509
|
+
elseif (swingUDSiteValue == BYTE_SWING_UD_SITE4) then
|
|
510
|
+
streams[KEY_WIND_SWING_UD_SITE] = VALUE_SWING_UD_SITE4
|
|
511
|
+
elseif (swingUDSiteValue == BYTE_SWING_UD_SITE5) then
|
|
512
|
+
streams[KEY_WIND_SWING_UD_SITE] = VALUE_SWING_UD_SITE5
|
|
513
|
+
elseif (swingUDSiteValue == BYTE_SWING_UD_SITE6) then
|
|
514
|
+
streams[KEY_WIND_SWING_UD_SITE] = VALUE_SWING_UD_SITE6
|
|
515
|
+
end
|
|
516
|
+
streams[KEY_POWER_ON_TIME] = int2String(openTime * 15)
|
|
517
|
+
streams[KEY_POWER_OFF_TIME] = int2String(closeTime * 15)
|
|
518
|
+
if (exhaustValue == BYTE_EXHAUST_ON) then
|
|
519
|
+
streams[KEY_EXHAUST] = VALUE_ON
|
|
520
|
+
elseif (exhaustValue == BYTE_EXHAUST_OFF) then
|
|
521
|
+
streams[KEY_EXHAUST] = VALUE_OFF
|
|
522
|
+
end
|
|
523
|
+
if (swingUDSwitchValue == BYTE_SWING_UD_ON) then
|
|
524
|
+
streams[KEY_WIND_UD] = VALUE_ON
|
|
525
|
+
elseif (swingUDSwitchValue == BYTE_SWING_UD_OFF) then
|
|
526
|
+
streams[KEY_WIND_UD] = VALUE_OFF
|
|
527
|
+
end
|
|
528
|
+
if (ecoValue == BYTE_ECO_ON) then
|
|
529
|
+
streams[KEY_ECO] = VALUE_ON
|
|
530
|
+
elseif (ecoValue == BYTE_ECO_OFF) then
|
|
531
|
+
streams[KEY_ECO] = VALUE_OFF
|
|
532
|
+
end
|
|
533
|
+
if (sleepSwitchValue == BYTE_SLEEP_ON) then
|
|
534
|
+
streams[KEY_SLEEP_SWITCH] = VALUE_ON
|
|
535
|
+
elseif (sleepSwitchValue == BYTE_SLEEP_OFF) then
|
|
536
|
+
streams[KEY_SLEEP_SWITCH] = VALUE_OFF
|
|
537
|
+
end
|
|
538
|
+
if (digitDisplaySwitchValue == BYTE_DIGIT_DISPLAY_ON) then
|
|
539
|
+
streams[KEY_DIGIT_DISPLAY_SWITCH] = VALUE_ON
|
|
540
|
+
elseif (digitDisplaySwitchValue == BYTE_DIGIT_DISPLAY_OFF) then
|
|
541
|
+
streams[KEY_DIGIT_DISPLAY_SWITCH] = VALUE_OFF
|
|
542
|
+
end
|
|
543
|
+
if (swingLRSwitchValue == BYTE_SWING_LR_ON) then
|
|
544
|
+
streams[KEY_WIND_SWING_LR] = VALUE_ON
|
|
545
|
+
elseif (swingLRSwitchValue == BYTE_SWING_LR_OFF) then
|
|
546
|
+
streams[KEY_WIND_SWING_LR] = VALUE_OFF
|
|
547
|
+
end
|
|
548
|
+
streams[KEY_CONTROL_FAN_SPEED] = controlFanspeedValue
|
|
549
|
+
if (swingLRSiteValue == BYTE_SWING_LR_NO_SITE) then
|
|
550
|
+
streams[KEY_WIND_SWING_LR_SITE] = VALUE_SWING_LR_NO_SITE
|
|
551
|
+
elseif (swingLRSiteValue == BYTE_SWING_LR_SITE1) then
|
|
552
|
+
streams[KEY_WIND_SWING_LR_SITE] = VALUE_SWING_LR_SITE1
|
|
553
|
+
elseif (swingLRSiteValue == BYTE_SWING_LR_SITE2) then
|
|
554
|
+
streams[KEY_WIND_SWING_LR_SITE] = VALUE_SWING_LR_SITE2
|
|
555
|
+
elseif (swingLRSiteValue == BYTE_SWING_LR_SITE3) then
|
|
556
|
+
streams[KEY_WIND_SWING_LR_SITE] = VALUE_SWING_LR_SITE3
|
|
557
|
+
elseif (swingLRSiteValue == BYTE_SWING_LR_SITE4) then
|
|
558
|
+
streams[KEY_WIND_SWING_LR_SITE] = VALUE_SWING_LR_SITE4
|
|
559
|
+
elseif (swingLRSiteValue == BYTE_SWING_LR_SITE5) then
|
|
560
|
+
streams[KEY_WIND_SWING_LR_SITE] = VALUE_SWING_LR_SITE5
|
|
561
|
+
elseif (swingLRSiteValue == BYTE_SWING_LR_SITE6) then
|
|
562
|
+
streams[KEY_WIND_SWING_LR_SITE] = VALUE_SWING_LR_SITE6
|
|
563
|
+
end
|
|
564
|
+
streams[KEY_SMALL_TEMPERATURE] = int2String(temperatureDecimals / 10)
|
|
565
|
+
if (isCanDecimals == 0x00) then
|
|
566
|
+
streams['support_decimals'] = 'on'
|
|
567
|
+
elseif (isCanDecimals == 0x01) then
|
|
568
|
+
streams['support_decimals'] = 'off'
|
|
569
|
+
end
|
|
570
|
+
if (errorCodeMachineStyle == 0x80) then
|
|
571
|
+
streams[KEY_ERROR_FROM_MACHINE_STYLE] = VALUE_ERROR_FROM_OUTSIDE_MACHINE
|
|
572
|
+
elseif (errorCodeMachineStyle == 0x00) then
|
|
573
|
+
streams[KEY_ERROR_FROM_MACHINE_STYLE] = VALUE_ERROR_FROM_INSIDE_MACHINE
|
|
574
|
+
end
|
|
575
|
+
streams[KEY_ERROR_CODE] = int2String(errorHigh * 255 + errorLow)
|
|
576
|
+
if (PTCSettingValue == 0x00) then
|
|
577
|
+
streams[KEY_PTC_SETTING] = VALUE_PTC_SETTING_AUTO
|
|
578
|
+
elseif (PTCSettingValue == 0x20) then
|
|
579
|
+
streams[KEY_PTC_SETTING] = VALUE_PTC_SETTING_ON
|
|
580
|
+
elseif (PTCSettingValue == 0x40) then
|
|
581
|
+
streams[KEY_PTC_SETTING] = VALUE_PTC_SETTING_OFF
|
|
582
|
+
end
|
|
583
|
+
if (PTCValue == 0x02) then
|
|
584
|
+
streams[KEY_PTC_POWER] = VALUE_ON
|
|
585
|
+
elseif (PTCValue == 0x00) then
|
|
586
|
+
streams[KEY_PTC_POWER] = VALUE_OFF
|
|
587
|
+
end
|
|
588
|
+
elseif (cmdType == BYTE_CMD_LOCK) then
|
|
589
|
+
elseif (cmdType == BYTE_CMD_SMART) then
|
|
590
|
+
end
|
|
591
|
+
local retTable = {}
|
|
592
|
+
retTable['status'] = streams
|
|
593
|
+
local ret = encode(retTable)
|
|
594
|
+
return ret
|
|
595
|
+
end
|
|
596
|
+
|
|
597
|
+
function print_lua_table(lua_table, indent)
|
|
598
|
+
indent = indent or 0
|
|
599
|
+
for k, v in pairs(lua_table) do
|
|
600
|
+
if type(k) == 'string' then
|
|
601
|
+
k = string.format('%q', k)
|
|
602
|
+
end
|
|
603
|
+
local szSuffix = ''
|
|
604
|
+
if type(v) == 'table' then
|
|
605
|
+
szSuffix = '{'
|
|
606
|
+
end
|
|
607
|
+
local szPrefix = string.rep(' ', indent)
|
|
608
|
+
formatting = szPrefix .. '[' .. k .. ']' .. ' = ' .. szSuffix
|
|
609
|
+
if type(v) == 'table' then
|
|
610
|
+
print(formatting)
|
|
611
|
+
print_lua_table(v, indent + 1)
|
|
612
|
+
print(szPrefix .. '},')
|
|
613
|
+
else
|
|
614
|
+
local szValue = ''
|
|
615
|
+
if type(v) == 'string' then
|
|
616
|
+
szValue = string.format('%q', v)
|
|
617
|
+
else
|
|
618
|
+
szValue = tostring(v)
|
|
619
|
+
end
|
|
620
|
+
print(formatting .. szValue .. ',')
|
|
621
|
+
end
|
|
622
|
+
end
|
|
623
|
+
end
|
|
624
|
+
|
|
625
|
+
function checkBoundary(data, min, max)
|
|
626
|
+
if (not data) then
|
|
627
|
+
data = 0
|
|
628
|
+
end
|
|
629
|
+
data = tonumber(data)
|
|
630
|
+
if (data == nil) then
|
|
631
|
+
data = 0
|
|
632
|
+
end
|
|
633
|
+
if ((data >= min) and (data <= max)) then
|
|
634
|
+
return data
|
|
635
|
+
else
|
|
636
|
+
if (data < min) then
|
|
637
|
+
return min
|
|
638
|
+
else
|
|
639
|
+
return max
|
|
640
|
+
end
|
|
641
|
+
end
|
|
642
|
+
end
|
|
643
|
+
|
|
644
|
+
function string2Int(data)
|
|
645
|
+
if (not data) then
|
|
646
|
+
data = tonumber('0')
|
|
647
|
+
end
|
|
648
|
+
data = tonumber(data)
|
|
649
|
+
if (data == nil) then
|
|
650
|
+
data = 0
|
|
651
|
+
end
|
|
652
|
+
return data
|
|
653
|
+
end
|
|
654
|
+
|
|
655
|
+
function int2String(data)
|
|
656
|
+
if (not data) then
|
|
657
|
+
data = tostring(0)
|
|
658
|
+
end
|
|
659
|
+
data = tostring(data)
|
|
660
|
+
if (data == nil) then
|
|
661
|
+
data = '0'
|
|
662
|
+
end
|
|
663
|
+
return data
|
|
664
|
+
end
|
|
665
|
+
|
|
666
|
+
function table2string(cmd)
|
|
667
|
+
local ret = ''
|
|
668
|
+
local i
|
|
669
|
+
for i = 1, #cmd do
|
|
670
|
+
ret = ret .. string.char(cmd[i])
|
|
671
|
+
end
|
|
672
|
+
return ret
|
|
673
|
+
end
|
|
674
|
+
|
|
675
|
+
function string2table(hexstr)
|
|
676
|
+
local tb = {}
|
|
677
|
+
local i = 1
|
|
678
|
+
local j = 1
|
|
679
|
+
for i = 1, #hexstr - 1, 2 do
|
|
680
|
+
local doublebytestr = string.sub(hexstr, i, i + 1)
|
|
681
|
+
tb[j] = tonumber(doublebytestr, 16)
|
|
682
|
+
j = j + 1
|
|
683
|
+
end
|
|
684
|
+
return tb
|
|
685
|
+
end
|
|
686
|
+
|
|
687
|
+
function string2hexstring(str)
|
|
688
|
+
local ret = ''
|
|
689
|
+
for i = 1, #str do
|
|
690
|
+
ret = ret .. string.format('%02x', str:byte(i))
|
|
691
|
+
end
|
|
692
|
+
return ret
|
|
693
|
+
end
|
|
694
|
+
|
|
695
|
+
function encode(cmd)
|
|
696
|
+
local tb
|
|
697
|
+
if JSON == nil then
|
|
698
|
+
JSON = require 'cjson'
|
|
699
|
+
end
|
|
700
|
+
tb = JSON.encode(cmd)
|
|
701
|
+
return tb
|
|
702
|
+
end
|
|
703
|
+
|
|
704
|
+
function decode(cmd)
|
|
705
|
+
local tb
|
|
706
|
+
if JSON == nil then
|
|
707
|
+
JSON = require 'cjson'
|
|
708
|
+
end
|
|
709
|
+
tb = JSON.decode(cmd)
|
|
710
|
+
return tb
|
|
711
|
+
end
|
|
712
|
+
|
|
713
|
+
function makeSum(tmpbuf, start_pos, end_pos)
|
|
714
|
+
local resVal = 0
|
|
715
|
+
for si = start_pos, end_pos do
|
|
716
|
+
resVal = resVal + tmpbuf[si]
|
|
717
|
+
if resVal > 0xff then
|
|
718
|
+
resVal = bit.band(resVal, 0xff)
|
|
719
|
+
end
|
|
720
|
+
end
|
|
721
|
+
resVal = 255 - resVal + 1
|
|
722
|
+
return resVal
|
|
723
|
+
end
|
|
724
|
+
local crc8_854_table = {
|
|
725
|
+
0,
|
|
726
|
+
94,
|
|
727
|
+
188,
|
|
728
|
+
226,
|
|
729
|
+
97,
|
|
730
|
+
63,
|
|
731
|
+
221,
|
|
732
|
+
131,
|
|
733
|
+
194,
|
|
734
|
+
156,
|
|
735
|
+
126,
|
|
736
|
+
32,
|
|
737
|
+
163,
|
|
738
|
+
253,
|
|
739
|
+
31,
|
|
740
|
+
65,
|
|
741
|
+
157,
|
|
742
|
+
195,
|
|
743
|
+
33,
|
|
744
|
+
127,
|
|
745
|
+
252,
|
|
746
|
+
162,
|
|
747
|
+
64,
|
|
748
|
+
30,
|
|
749
|
+
95,
|
|
750
|
+
1,
|
|
751
|
+
227,
|
|
752
|
+
189,
|
|
753
|
+
62,
|
|
754
|
+
96,
|
|
755
|
+
130,
|
|
756
|
+
220,
|
|
757
|
+
35,
|
|
758
|
+
125,
|
|
759
|
+
159,
|
|
760
|
+
193,
|
|
761
|
+
66,
|
|
762
|
+
28,
|
|
763
|
+
254,
|
|
764
|
+
160,
|
|
765
|
+
225,
|
|
766
|
+
191,
|
|
767
|
+
93,
|
|
768
|
+
3,
|
|
769
|
+
128,
|
|
770
|
+
222,
|
|
771
|
+
60,
|
|
772
|
+
98,
|
|
773
|
+
190,
|
|
774
|
+
224,
|
|
775
|
+
2,
|
|
776
|
+
92,
|
|
777
|
+
223,
|
|
778
|
+
129,
|
|
779
|
+
99,
|
|
780
|
+
61,
|
|
781
|
+
124,
|
|
782
|
+
34,
|
|
783
|
+
192,
|
|
784
|
+
158,
|
|
785
|
+
29,
|
|
786
|
+
67,
|
|
787
|
+
161,
|
|
788
|
+
255,
|
|
789
|
+
70,
|
|
790
|
+
24,
|
|
791
|
+
250,
|
|
792
|
+
164,
|
|
793
|
+
39,
|
|
794
|
+
121,
|
|
795
|
+
155,
|
|
796
|
+
197,
|
|
797
|
+
132,
|
|
798
|
+
218,
|
|
799
|
+
56,
|
|
800
|
+
102,
|
|
801
|
+
229,
|
|
802
|
+
187,
|
|
803
|
+
89,
|
|
804
|
+
7,
|
|
805
|
+
219,
|
|
806
|
+
133,
|
|
807
|
+
103,
|
|
808
|
+
57,
|
|
809
|
+
186,
|
|
810
|
+
228,
|
|
811
|
+
6,
|
|
812
|
+
88,
|
|
813
|
+
25,
|
|
814
|
+
71,
|
|
815
|
+
165,
|
|
816
|
+
251,
|
|
817
|
+
120,
|
|
818
|
+
38,
|
|
819
|
+
196,
|
|
820
|
+
154,
|
|
821
|
+
101,
|
|
822
|
+
59,
|
|
823
|
+
217,
|
|
824
|
+
135,
|
|
825
|
+
4,
|
|
826
|
+
90,
|
|
827
|
+
184,
|
|
828
|
+
230,
|
|
829
|
+
167,
|
|
830
|
+
249,
|
|
831
|
+
27,
|
|
832
|
+
69,
|
|
833
|
+
198,
|
|
834
|
+
152,
|
|
835
|
+
122,
|
|
836
|
+
36,
|
|
837
|
+
248,
|
|
838
|
+
166,
|
|
839
|
+
68,
|
|
840
|
+
26,
|
|
841
|
+
153,
|
|
842
|
+
199,
|
|
843
|
+
37,
|
|
844
|
+
123,
|
|
845
|
+
58,
|
|
846
|
+
100,
|
|
847
|
+
134,
|
|
848
|
+
216,
|
|
849
|
+
91,
|
|
850
|
+
5,
|
|
851
|
+
231,
|
|
852
|
+
185,
|
|
853
|
+
140,
|
|
854
|
+
210,
|
|
855
|
+
48,
|
|
856
|
+
110,
|
|
857
|
+
237,
|
|
858
|
+
179,
|
|
859
|
+
81,
|
|
860
|
+
15,
|
|
861
|
+
78,
|
|
862
|
+
16,
|
|
863
|
+
242,
|
|
864
|
+
172,
|
|
865
|
+
47,
|
|
866
|
+
113,
|
|
867
|
+
147,
|
|
868
|
+
205,
|
|
869
|
+
17,
|
|
870
|
+
79,
|
|
871
|
+
173,
|
|
872
|
+
243,
|
|
873
|
+
112,
|
|
874
|
+
46,
|
|
875
|
+
204,
|
|
876
|
+
146,
|
|
877
|
+
211,
|
|
878
|
+
141,
|
|
879
|
+
111,
|
|
880
|
+
49,
|
|
881
|
+
178,
|
|
882
|
+
236,
|
|
883
|
+
14,
|
|
884
|
+
80,
|
|
885
|
+
175,
|
|
886
|
+
241,
|
|
887
|
+
19,
|
|
888
|
+
77,
|
|
889
|
+
206,
|
|
890
|
+
144,
|
|
891
|
+
114,
|
|
892
|
+
44,
|
|
893
|
+
109,
|
|
894
|
+
51,
|
|
895
|
+
209,
|
|
896
|
+
143,
|
|
897
|
+
12,
|
|
898
|
+
82,
|
|
899
|
+
176,
|
|
900
|
+
238,
|
|
901
|
+
50,
|
|
902
|
+
108,
|
|
903
|
+
142,
|
|
904
|
+
208,
|
|
905
|
+
83,
|
|
906
|
+
13,
|
|
907
|
+
239,
|
|
908
|
+
177,
|
|
909
|
+
240,
|
|
910
|
+
174,
|
|
911
|
+
76,
|
|
912
|
+
18,
|
|
913
|
+
145,
|
|
914
|
+
207,
|
|
915
|
+
45,
|
|
916
|
+
115,
|
|
917
|
+
202,
|
|
918
|
+
148,
|
|
919
|
+
118,
|
|
920
|
+
40,
|
|
921
|
+
171,
|
|
922
|
+
245,
|
|
923
|
+
23,
|
|
924
|
+
73,
|
|
925
|
+
8,
|
|
926
|
+
86,
|
|
927
|
+
180,
|
|
928
|
+
234,
|
|
929
|
+
105,
|
|
930
|
+
55,
|
|
931
|
+
213,
|
|
932
|
+
139,
|
|
933
|
+
87,
|
|
934
|
+
9,
|
|
935
|
+
235,
|
|
936
|
+
181,
|
|
937
|
+
54,
|
|
938
|
+
104,
|
|
939
|
+
138,
|
|
940
|
+
212,
|
|
941
|
+
149,
|
|
942
|
+
203,
|
|
943
|
+
41,
|
|
944
|
+
119,
|
|
945
|
+
244,
|
|
946
|
+
170,
|
|
947
|
+
72,
|
|
948
|
+
22,
|
|
949
|
+
233,
|
|
950
|
+
183,
|
|
951
|
+
85,
|
|
952
|
+
11,
|
|
953
|
+
136,
|
|
954
|
+
214,
|
|
955
|
+
52,
|
|
956
|
+
106,
|
|
957
|
+
43,
|
|
958
|
+
117,
|
|
959
|
+
151,
|
|
960
|
+
201,
|
|
961
|
+
74,
|
|
962
|
+
20,
|
|
963
|
+
246,
|
|
964
|
+
168,
|
|
965
|
+
116,
|
|
966
|
+
42,
|
|
967
|
+
200,
|
|
968
|
+
150,
|
|
969
|
+
21,
|
|
970
|
+
75,
|
|
971
|
+
169,
|
|
972
|
+
247,
|
|
973
|
+
182,
|
|
974
|
+
232,
|
|
975
|
+
10,
|
|
976
|
+
84,
|
|
977
|
+
215,
|
|
978
|
+
137,
|
|
979
|
+
107,
|
|
980
|
+
53
|
|
981
|
+
}
|
|
982
|
+
function crc8_854(dataBuf, start_pos, end_pos)
|
|
983
|
+
local crc = 0
|
|
984
|
+
for si = start_pos, end_pos do
|
|
985
|
+
crc = crc8_854_table[bit.band(bit.bxor(crc, dataBuf[si]), 0xFF) + 1]
|
|
986
|
+
end
|
|
987
|
+
return crc
|
|
988
|
+
end
|