hainiaoNew.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import time
  4. from apilib.utils_datetime import timestamp_to_dt
  5. from apps.web.constant import Const, DeviceCmdCode, MQTT_TIMEOUT
  6. from apps.web.core.adapter.base import SmartBox, fill_2_hexByte
  7. from apps.web.core.exceptions import ServiceException
  8. from apps.web.core.networking import MessageSender
  9. from apps.web.device.models import Device
  10. class ChargingHaiNiaoNewBox(SmartBox):
  11. def __init__(self, device):
  12. super(ChargingHaiNiaoNewBox, self).__init__(device)
  13. def translate_funcode(self, funCode):
  14. funCodeDict = {
  15. '01': u'获取端口状态',
  16. '02': u'获取设备参数',
  17. '03': u'操作端口',
  18. '04': u'设置参数',
  19. }
  20. return funCodeDict.get(funCode, '')
  21. def translate_event_cmdcode(self, cmdCode):
  22. cmdDict = {
  23. '86': u'设备上报信息',
  24. }
  25. return cmdDict.get(cmdCode, '')
  26. def __verify_setting_uart(self, devInfo):
  27. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  28. if devInfo['rst'] == -1:
  29. raise ServiceException(
  30. {'result': 2, 'description': u'充电桩正在玩命找网络,请您稍候再试'})
  31. elif devInfo['rst'] == 1:
  32. raise ServiceException(
  33. {'result': 2, 'description': u'充电桩忙,无响应,请您稍候再试。也可能是您的设备版本过低,暂时不支持此功能'})
  34. if devInfo['data'][14:16] == '01':
  35. raise ServiceException(
  36. {'result': 2, 'description': u'设置失败'})
  37. @staticmethod
  38. def _get_port_status_from_81(data):
  39. port2Status = int(data['data'][8:10], 16) # 通道9~10的状态
  40. port8Status = int(data['data'][10:12], 16) # 通道1~8的状态
  41. bin2Str = str(bin(port2Status))[2:]
  42. while len(bin2Str) < 8:
  43. bin2Str = '0' + bin2Str
  44. bin8Str = str(bin(port8Status))[2:]
  45. while len(bin8Str) < 8:
  46. bin8Str = '0' + bin8Str
  47. result = {}
  48. if bin2Str[6] == '1':
  49. result[str(10 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING}
  50. elif bin2Str[6] == '0':
  51. result[str(10 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE}
  52. if bin2Str[7] == '1':
  53. result[str(9 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING}
  54. elif bin2Str[7] == '0':
  55. result[str(9 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE}
  56. if bin8Str[0] == '1':
  57. result[str(8 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING}
  58. elif bin8Str[0] == '0':
  59. result[str(8 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE}
  60. if bin8Str[1] == '1':
  61. result[str(7 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING}
  62. elif bin8Str[1] == '0':
  63. result[str(7 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE}
  64. if bin8Str[2] == '1':
  65. result[str(6 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING}
  66. elif bin8Str[2] == '0':
  67. result[str(6 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE}
  68. if bin8Str[3] == '1':
  69. result[str(5 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING}
  70. elif bin8Str[3] == '0':
  71. result[str(5 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE}
  72. if bin8Str[4] == '1':
  73. result[str(4 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING}
  74. elif bin8Str[4] == '0':
  75. result[str(4 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE}
  76. if bin8Str[5] == '1':
  77. result[str(3 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING}
  78. elif bin8Str[5] == '0':
  79. result[str(3 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE}
  80. if bin8Str[6] == '1':
  81. result[str(2 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING}
  82. elif bin8Str[6] == '0':
  83. result[str(2 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE}
  84. if bin8Str[7] == '1':
  85. result[str(1 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING}
  86. elif bin8Str[7] == '0':
  87. result[str(1 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE}
  88. return result
  89. @staticmethod
  90. def _get_dev_settings_from_82(data):
  91. result = {}
  92. tempD1 = data[0:2]
  93. binTempD1 = str(bin(int(tempD1, 16)))[2:]
  94. while len(binTempD1) < 8:
  95. binTempD1 = '0' + binTempD1
  96. # 空载自停
  97. isNoLoadPowerOff = True if binTempD1[-1] == '1' else False
  98. result.update({'isNoLoadPowerOff': isNoLoadPowerOff})
  99. # 档位模式
  100. gearMode = '4gear' if binTempD1[-2] == '1' else '2gear'
  101. result.update({'gearMode': gearMode})
  102. # 清除设备充电时间
  103. clearChargeTime = ''
  104. result.update({'clearChargeTime': clearChargeTime})
  105. # 恢复出厂设置
  106. resetFactorySettings = ''
  107. result.update({'resetFactorySettings': resetFactorySettings})
  108. # 充满自停
  109. isFullChargeStop = True if binTempD1[-5] == '1' else False
  110. result.update({'isFullChargeStop': isFullChargeStop})
  111. # 免费充电
  112. freeMode = True if binTempD1[-6] == '1' else False
  113. result.update({'freeMode': freeMode})
  114. # 倒计时模式
  115. countDownMode = 'power' if binTempD1[-7] == '1' else 'clock'
  116. result.update({'countDownMode': countDownMode})
  117. # 数码管显示模式
  118. ledDisplayMode = '10port' if binTempD1[-8] == '1' else '2port'
  119. result.update({'ledDisplayMode': ledDisplayMode})
  120. # 2档限定电流值
  121. t2ElecCurrent = float(int(data[2:4], 16)) / 10
  122. result.update({'t2ElecCurrent': t2ElecCurrent})
  123. # 2档充电时间
  124. t2ChargeTime = int(data[4:8], 16)
  125. result.update({'t2ChargeTime': t2ChargeTime})
  126. # 4档模式第1档限定电流
  127. t4ElecCurrent1 = float(int(data[8:10], 16)) / 10
  128. result.update({'t4ElecCurrent1': t4ElecCurrent1})
  129. # 4档模式第1档充电时间
  130. t4ChargeTime1 = int(data[10:14], 16)
  131. result.update({'t4ChargeTime1': t4ChargeTime1})
  132. # 4档模式第2档限定电流
  133. t4ElecCurrent2 = float(int(data[14:16], 16)) / 10
  134. result.update({'t4ElecCurrent2': t4ElecCurrent2})
  135. # 4档模式第2档充电时间
  136. t4ChargeTime2 = int(data[16:20], 16)
  137. result.update({'t4ChargeTime2': t4ChargeTime2})
  138. # 4档模式第3档限定电流
  139. t4ElecCurrent3 = float(int(data[20:22], 16)) / 10
  140. result.update({'t4ElecCurrent3': t4ElecCurrent3})
  141. # 4档模式第3档充电时间
  142. t4ChargeTime3 = int(data[22:26], 16)
  143. result.update({'t4ChargeTime3': t4ChargeTime3})
  144. # 4档模式第4档充电时间
  145. t4ChargeTime4 = int(data[28:32], 16)
  146. result.update({'t4ChargeTime4': t4ChargeTime4})
  147. # 累计投币次数
  148. accumulativeTotalCoins = int(data[32:40], 16)
  149. result.update({'accumulativeTotalCoins': accumulativeTotalCoins})
  150. # 主板版本号
  151. boardVersion = data[40:44]
  152. result.update({'boardVersion': boardVersion})
  153. return result
  154. def get_port_status_from_dev(self): # 获取端口状态
  155. devInfo = MessageSender.send(self.device, self.make_random_cmdcode(),
  156. {'IMEI': self._device['devNo'], "funCode": '01', 'data': '00'})
  157. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  158. if devInfo['rst'] == -1:
  159. raise ServiceException(
  160. {'result': 2, 'description': u'充电桩正在玩命找网络,请您稍候再试'})
  161. elif devInfo['rst'] == 1:
  162. raise ServiceException(
  163. {'result': 2, 'description': u'充电桩忙,无响应,请您稍候再试。也可能是您的设备版本过低,暂时不支持此功能'})
  164. portStatusInfo = devInfo['data'][112:-2]
  165. result = self._get_port_status_from_81(devInfo)
  166. ii = 0
  167. while ii < 10:
  168. statusTemp = portStatusInfo[ii * 2:ii * 2 + 2]
  169. if statusTemp != '00':
  170. result[str(ii)] = {'status': Const.DEV_WORK_STATUS_FAULT}
  171. ii += 1
  172. allPorts, usedPorts, usePorts = self.get_port_static_info(result)
  173. Device.update_dev_control_cache(self._device['devNo'],
  174. {'allPorts': allPorts, 'usedPorts': usedPorts, 'usePorts': usePorts})
  175. # 这里存在多线程更新缓存的场景,可能性比较低,但是必须先取出来,然后逐个更新状态,然后再记录缓存
  176. ctrInfo = Device.get_dev_control_cache(self._device['devNo'])
  177. for strPort, info in result.items():
  178. if ctrInfo.has_key(strPort):
  179. ctrInfo[strPort].update({'status': info['status']})
  180. else:
  181. ctrInfo[strPort] = info
  182. Device.update_dev_control_cache(self._device['devNo'], ctrInfo)
  183. return result
  184. def get_port_status(self, force=False): # 获取端口状态(缓存)
  185. if force:
  186. return self.get_port_status_from_dev()
  187. ctrInfo = Device.get_dev_control_cache(self._device['devNo'])
  188. statusDict = {}
  189. allPorts = ctrInfo.get('allPorts', 10)
  190. if allPorts == 0:
  191. allPorts = 10
  192. for ii in range(allPorts):
  193. tempDict = ctrInfo.get(str(ii), {})
  194. if tempDict.has_key('status'):
  195. statusDict[str(ii)] = {'status': tempDict.get('status')}
  196. elif tempDict.has_key('isStart'):
  197. if tempDict['isStart']:
  198. statusDict[str(ii)] = {'status': Const.DEV_WORK_STATUS_WORKING}
  199. else:
  200. statusDict[str(ii)] = {'status': Const.DEV_WORK_STATUS_IDLE}
  201. else:
  202. statusDict[str(ii)] = {'status': Const.DEV_WORK_STATUS_IDLE}
  203. allPorts, usedPorts, usePorts = self.get_port_static_info(statusDict)
  204. Device.update_dev_control_cache(self._device['devNo'],
  205. {'allPorts': allPorts, 'usedPorts': usedPorts, 'usePorts': usePorts})
  206. return statusDict
  207. def get_dev_setting(self):
  208. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  209. {'IMEI': self._device['devNo'], "funCode": '02', 'data': '00'})
  210. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  211. if devInfo['rst'] == -1:
  212. raise ServiceException(
  213. {'result': 2, 'description': u'充电桩正在玩命找网络,请您稍候再试'})
  214. elif devInfo['rst'] == 1:
  215. raise ServiceException(
  216. {'result': 2, 'description': u'充电桩忙,无响应,请您稍候再试。也可能是您的设备版本过低,暂时不支持此功能'})
  217. confData = devInfo['data'][8::]
  218. result = self._get_dev_settings_from_82(confData)
  219. device = Device.objects(devNo=self._device['devNo']).first()
  220. device.otherConf = result
  221. device.save()
  222. return result
  223. def start_device(self, package, openId, attachParas):
  224. if attachParas is None:
  225. raise ServiceException({'result': 2, 'description': u'请您选择合适的充电线路、电池类型信息'})
  226. if not attachParas.has_key('chargeIndex'):
  227. raise ServiceException({'result': 2, 'description': u'请您选择合适的充电线路'})
  228. port = hex(int(attachParas['chargeIndex']) + 1)
  229. hexPort = fill_2_hexByte(port, 4)
  230. if hexPort == '0009':
  231. hexPort = '0100'
  232. elif hexPort == '000A':
  233. hexPort = '0200'
  234. elif hexPort == '0003':
  235. hexPort = '0004'
  236. elif hexPort == '0004':
  237. hexPort = '0008'
  238. elif hexPort == '0005':
  239. hexPort = '0010'
  240. elif hexPort == '0006':
  241. hexPort = '0020'
  242. elif hexPort == '0007':
  243. hexPort = '0040'
  244. elif hexPort == '0008':
  245. hexPort = '0080'
  246. needTime = int(package['time'])
  247. needCoins = int(package['coins'])
  248. unit = package.get('unit', u'分钟')
  249. if unit == u'小时':
  250. needTime = int(package['time']) * 60
  251. elif unit == u'天':
  252. needTime = int(package['time']) * 1440
  253. hexTime = fill_2_hexByte(hex(needTime))
  254. data = hexPort + '01' + hexTime
  255. devInfo = MessageSender.send(device=self.device, cmd=DeviceCmdCode.OPERATE_DEV_SYNC, payload={
  256. 'IMEI': self._device['devNo'],
  257. "funCode": '03',
  258. 'data': data
  259. }, timeout=MQTT_TIMEOUT.START_DEVICE)
  260. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  261. if devInfo['rst'] == -1:
  262. raise ServiceException(
  263. {'result': 2, 'description': u'充电桩正在玩命找网络,您的金币还在,重试不需要重新付款,建议您试试旁边其他设备,或者稍后再试哦'})
  264. elif devInfo['rst'] == 1:
  265. raise ServiceException({'result': 2, 'description': u'充电桩正在忙,无响应,您的金币还在,请试试其他线路,或者请稍后再试哦'})
  266. data = devInfo['data'][8::]
  267. usePort = int(attachParas['chargeIndex'])
  268. result = data[4:8]
  269. if result == '0000': # 代表失败
  270. newValue = {str(usePort): {'status': Const.DEV_WORK_STATUS_FAULT, 'statusInfo': u'充电站故障'}}
  271. Device.update_dev_control_cache(self._device['devNo'], newValue)
  272. raise ServiceException({'result': 2, 'description': u'充电站故障'})
  273. start_timestamp = int(time.time())
  274. finishedTime = start_timestamp + needTime * 60
  275. portDict = {
  276. 'startTime': timestamp_to_dt(start_timestamp).strftime('%Y-%m-%d %H:%M:%S'),
  277. 'status': Const.DEV_WORK_STATUS_WORKING,
  278. 'finishedTime': finishedTime,
  279. 'coins': float(needCoins),
  280. 'isStart': True,
  281. 'needTime': needTime,
  282. 'openId': openId,
  283. 'refunded': False,
  284. 'vCardId': self._vcard_id
  285. }
  286. if 'linkedRechargeRecordId' in attachParas and attachParas.get('isQuickPay', False):
  287. item = {
  288. 'rechargeRcdId': str(attachParas['linkedRechargeRecordId'])
  289. }
  290. portDict['payInfo'] = [item]
  291. Device.update_dev_control_cache(self._device['devNo'], {str(usePort): portDict})
  292. return devInfo
  293. def analyze_event_data(self, data):
  294. cmdCode = data[6:8]
  295. if cmdCode == '86':
  296. portData = data[8:12]
  297. if portData == '0001':
  298. port = '1'
  299. reason = data[16:18]
  300. leftTime = int(data[36:44], 16) / 60
  301. spendElec = str(float(int(data[116:120], 16)) / 100)
  302. elif portData == '0002':
  303. port = '2'
  304. reason = data[18:20]
  305. leftTime = int(data[44:52], 16) / 60
  306. spendElec = str(float(int(data[120:124], 16)) / 100)
  307. elif portData == '0004':
  308. port = '3'
  309. reason = data[20:22]
  310. leftTime = int(data[52:60], 16) / 60
  311. spendElec = str(float(int(data[124:128], 16)) / 100)
  312. elif portData == '0008':
  313. port = '4'
  314. reason = data[22:24]
  315. leftTime = int(data[60:68], 16) / 60
  316. spendElec = str(float(int(data[128:132], 16)) / 100)
  317. elif portData == '0010':
  318. port = '5'
  319. reason = data[24:26]
  320. leftTime = int(data[68:76], 16) / 60
  321. spendElec = str(float(int(data[132:136], 16)) / 100)
  322. elif portData == '0020':
  323. port = '6'
  324. reason = data[26:28]
  325. leftTime = int(data[76:84], 16) / 60
  326. spendElec = str(float(int(data[136:140], 16)) / 100)
  327. elif portData == '0040':
  328. port = '7'
  329. reason = data[28:30]
  330. leftTime = int(data[84:92], 16) / 60
  331. spendElec = str(float(int(data[140:144], 16)) / 100)
  332. elif portData == '0080':
  333. port = '8'
  334. reason = data[30:32]
  335. leftTime = int(data[92:100], 16) / 60
  336. spendElec = str(float(int(data[144:148], 16)) / 100)
  337. elif portData == '0100':
  338. port = '9'
  339. reason = data[32:34]
  340. leftTime = int(data[100:108], 16) / 60
  341. spendElec = str(float(int(data[148:152], 16)) / 100)
  342. elif portData == '0200':
  343. port = '10'
  344. reason = data[34:36]
  345. leftTime = int(data[108:116], 16) / 60
  346. spendElec = str(float(int(data[152:156], 16)) / 100)
  347. else:
  348. return {}
  349. status = Const.DEV_WORK_STATUS_IDLE
  350. if reason == '00':
  351. desc = u'购买的充电时间用完了。'
  352. elif reason in ['04', '06', '07']:
  353. desc = u'管理人员可能远程断电了,或是插头被拔掉, 建议您根据已经充电的时间评估是否需要到现场换到其他端口充电。'
  354. elif reason in ['02', '03']:
  355. desc = u'警告!您的电池超功率,已经停止充电,为了公共安全,不建议您在该充电桩充电!提醒您,为了安全大功率的电池不要放入楼道、室内等位置充电哦。'
  356. elif reason == '05':
  357. desc = u'空载。'
  358. elif reason == '01':
  359. desc = u'电池没有充满!原因未知。'
  360. else:
  361. desc = u'成功!'
  362. status = Const.DEV_WORK_STATUS_WORKING
  363. return {'status': status, 'cmdCode': cmdCode, 'port': str(int(port) - 1),
  364. 'reason': desc, 'leftTime': leftTime, 'elec': spendElec}
  365. @property
  366. def isHaveStopEvent(self):
  367. return True
  368. def stop(self, port=None):
  369. self.stop_charging_port(port)
  370. infoDict = dict()
  371. infoDict['remainder_time'] = 0
  372. return infoDict
  373. def stop_charging_port(self, port):
  374. self.active_deactive_port(port, False)
  375. # 远程停止某个端口的使用
  376. def active_deactive_port(self, port, active):
  377. hexPort = fill_2_hexByte(hex(int(port) + 1), 4)
  378. if hexPort == '0009':
  379. hexPort = '0100'
  380. elif hexPort == '000A':
  381. hexPort = '0200'
  382. elif hexPort == '0003':
  383. hexPort = '0004'
  384. elif hexPort == '0004':
  385. hexPort = '0008'
  386. elif hexPort == '0005':
  387. hexPort = '0010'
  388. elif hexPort == '0006':
  389. hexPort = '0020'
  390. elif hexPort == '0007':
  391. hexPort = '0040'
  392. elif hexPort == '0008':
  393. hexPort = '0080'
  394. if active:
  395. return
  396. else:
  397. data = hexPort + '00'
  398. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  399. {'IMEI': self._device['devNo'], "funCode": '03', 'data': data + '0000'})
  400. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  401. if devInfo['rst'] == -1:
  402. raise ServiceException(
  403. {'result': 2, 'description': u'充电桩正在玩命找网络,请您稍候再试'})
  404. elif devInfo['rst'] == 1:
  405. raise ServiceException(
  406. {'result': 2, 'description': u'充电桩忙,无响应,请您稍候再试。也可能是您的设备版本过低,暂时不支持此功能'})
  407. def get_port_info(self, line):
  408. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  409. {'IMEI': self._device['devNo'], "funCode": '01', 'data': '00'})
  410. if devInfo.has_key('rst') and devInfo['rst'] != 0:
  411. if devInfo['rst'] == -1:
  412. raise ServiceException(
  413. {'result': 2, 'description': u'充电桩正在玩命找网络,请您稍候再试'})
  414. elif devInfo['rst'] == 1:
  415. raise ServiceException(
  416. {'result': 2, 'description': u'充电桩忙,无响应,请您稍候再试。也可能是您的设备版本过低,暂时不支持此功能'})
  417. leftTimeData = devInfo['data'][32:112]
  418. elecData = devInfo['data'][12:32]
  419. spendElecData = devInfo['data'][132:172]
  420. ii = int(line)
  421. leftTime = int(int(leftTimeData[ii * 8:ii * 8 + 8], 16) / 60)
  422. electricity = float(int(elecData[ii * 2:ii * 2 + 2], 16)) / 10
  423. spendElec = float(int(spendElecData[ii * 4:ii * 4 + 4], 16)) / 100
  424. return {'port': str(int(line)), 'leftTime': leftTime, 'electricity': electricity, 'elec': spendElec}
  425. def set_device_function_param(self, postData, lastSetConf):
  426. postData = postData['POST']
  427. device = Device.objects(devNo=self._device['devNo']).first()
  428. originData = device.otherConf
  429. if originData == {}:
  430. needResetSettings = postData
  431. else:
  432. needResetSettings = {}
  433. for k, v in originData.items():
  434. if k in ['resetFactorySettings', 'clearChargeTime', 'countDownMode', 'ledDisplayMode']:
  435. continue
  436. if postData[k] != v:
  437. needResetSettings[k] = postData[k]
  438. needResetSettingsList = needResetSettings.keys()
  439. if 'isFullChargeStop' in needResetSettingsList:
  440. self._set_is_full_charge_stop(needResetSettings['isFullChargeStop'])
  441. if 'freeMode' in needResetSettingsList:
  442. self._set_free_mode(needResetSettings['freeMode'])
  443. if 'isNoLoadPowerOff' in needResetSettingsList:
  444. self._set_is_no_load_power_off(needResetSettings['isNoLoadPowerOff'])
  445. if 'gearMode' in needResetSettingsList:
  446. self._set_gear_mode(needResetSettings['gearMode'])
  447. if 'countDownMode' in needResetSettingsList:
  448. self._set_countdown_mode(needResetSettings['countDownMode'])
  449. if 't2ElecCurrent' in needResetSettingsList:
  450. self._set_t2_elec_current(needResetSettings['t2ElecCurrent'])
  451. if 't2ChargeTime' in needResetSettingsList:
  452. self._set_t2_charge_time(needResetSettings['t2ChargeTime'])
  453. if 't4ElecCurrent1' in needResetSettingsList:
  454. self._set_t4_elec_current_1(needResetSettings['t4ElecCurrent1'])
  455. if 't4ChargeTime1' in needResetSettingsList:
  456. self._set_t4_charge_time_1(needResetSettings['t4ChargeTime1'])
  457. if 't4ElecCurrent2' in needResetSettingsList:
  458. self._set_t4_elec_current_2(needResetSettings['t4ElecCurrent2'])
  459. if 't4ChargeTime2' in needResetSettingsList:
  460. self._set_t4_charge_time_2(needResetSettings['t4ChargeTime2'])
  461. if 't4ElecCurrent3' in needResetSettingsList:
  462. self._set_t4_elec_current_3(needResetSettings['t4ElecCurrent3'])
  463. if 't4ChargeTime3' in needResetSettingsList:
  464. self._set_t4_charge_time_3(needResetSettings['t4ChargeTime3'])
  465. if 't4ChargeTime4' in needResetSettingsList:
  466. self._set_t4_charge_time_4(needResetSettings['t4ChargeTime4'])
  467. for _ in needResetSettingsList:
  468. device.otherConf.update({_: needResetSettings[_]})
  469. device.save()
  470. def set_device_function(self, request, lastSetConf):
  471. if 'clearChargeTime' in request.POST:
  472. self._clear_charge_time()
  473. if 'resetFactorySettings' in request.POST:
  474. self._reset_factory_settings()
  475. def _clear_charge_time(self):
  476. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  477. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '08' + '0000'})
  478. self.__verify_setting_uart(devInfo)
  479. def _reset_factory_settings(self):
  480. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  481. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '09' + '0000'})
  482. self.__verify_setting_uart(devInfo)
  483. device = Device.objects(devNo=self._device['devNo']).first()
  484. device.otherConf = {}
  485. device.save()
  486. def _set_is_full_charge_stop(self, setConf):
  487. data = '0001' if setConf is True else '0000'
  488. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  489. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '0A' + data})
  490. self.__verify_setting_uart(devInfo)
  491. def _set_free_mode(self, setConf):
  492. data = '0001' if setConf is True else '0000'
  493. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  494. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '0B' + data})
  495. self.__verify_setting_uart(devInfo)
  496. def _set_is_no_load_power_off(self, setConf):
  497. data = '0001' if setConf is True else '0000'
  498. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  499. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '0F' + data})
  500. self.__verify_setting_uart(devInfo)
  501. def _set_gear_mode(self, setConf):
  502. data = '0001' if setConf == '4gear' else '0000'
  503. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  504. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '10' + data})
  505. self.__verify_setting_uart(devInfo)
  506. def _set_countdown_mode(self, setConf):
  507. data = '0001' if setConf == 'power' else '0000'
  508. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  509. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '11' + data})
  510. self.__verify_setting_uart(devInfo)
  511. def _set_t2_elec_current(self, setConf):
  512. data = fill_2_hexByte(hex(int((float(setConf) * 10))))
  513. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  514. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '12' + data})
  515. self.__verify_setting_uart(devInfo)
  516. def _set_t2_charge_time(self, setConf):
  517. data = fill_2_hexByte(hex(int(setConf)))
  518. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  519. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '13' + data})
  520. self.__verify_setting_uart(devInfo)
  521. def _set_t4_elec_current_1(self, setConf):
  522. data = fill_2_hexByte(hex(int((float(setConf) * 10))))
  523. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  524. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '14' + data})
  525. self.__verify_setting_uart(devInfo)
  526. def _set_t4_charge_time_1(self, setConf):
  527. data = fill_2_hexByte(hex(int(setConf)))
  528. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  529. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '15' + data})
  530. self.__verify_setting_uart(devInfo)
  531. def _set_t4_elec_current_2(self, setConf):
  532. data = fill_2_hexByte(hex(int((float(setConf) * 10))))
  533. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  534. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '16' + data})
  535. self.__verify_setting_uart(devInfo)
  536. def _set_t4_charge_time_2(self, setConf):
  537. data = fill_2_hexByte(hex(int(setConf)))
  538. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  539. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '17' + data})
  540. self.__verify_setting_uart(devInfo)
  541. def _set_t4_elec_current_3(self, setConf):
  542. data = fill_2_hexByte(hex(int((float(setConf) * 10))))
  543. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  544. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '18' + data})
  545. self.__verify_setting_uart(devInfo)
  546. def _set_t4_charge_time_3(self, setConf):
  547. data = fill_2_hexByte(hex(int(setConf)))
  548. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  549. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '19' + data})
  550. self.__verify_setting_uart(devInfo)
  551. def _set_t4_charge_time_4(self, setConf):
  552. data = fill_2_hexByte(hex(int(setConf)))
  553. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  554. {'IMEI': self._device['devNo'], "funCode": '04', 'data': '1B' + data})
  555. self.__verify_setting_uart(devInfo)