# -*- coding: utf-8 -*- # !/usr/bin/env python import time from apilib.utils_datetime import timestamp_to_dt from apps.web.constant import Const, DeviceCmdCode, MQTT_TIMEOUT from apps.web.core.adapter.base import SmartBox, fill_2_hexByte from apps.web.core.exceptions import ServiceException from apps.web.core.networking import MessageSender from apps.web.device.models import Device class ChargingHaiNiaoNewBox(SmartBox): def __init__(self, device): super(ChargingHaiNiaoNewBox, self).__init__(device) def translate_funcode(self, funCode): funCodeDict = { '01': u'获取端口状态', '02': u'获取设备参数', '03': u'操作端口', '04': u'设置参数', } return funCodeDict.get(funCode, '') def translate_event_cmdcode(self, cmdCode): cmdDict = { '86': u'设备上报信息', } return cmdDict.get(cmdCode, '') def __verify_setting_uart(self, devInfo): if devInfo.has_key('rst') and devInfo['rst'] != 0: if devInfo['rst'] == -1: raise ServiceException( {'result': 2, 'description': u'充电桩正在玩命找网络,请您稍候再试'}) elif devInfo['rst'] == 1: raise ServiceException( {'result': 2, 'description': u'充电桩忙,无响应,请您稍候再试。也可能是您的设备版本过低,暂时不支持此功能'}) if devInfo['data'][14:16] == '01': raise ServiceException( {'result': 2, 'description': u'设置失败'}) @staticmethod def _get_port_status_from_81(data): port2Status = int(data['data'][8:10], 16) # 通道9~10的状态 port8Status = int(data['data'][10:12], 16) # 通道1~8的状态 bin2Str = str(bin(port2Status))[2:] while len(bin2Str) < 8: bin2Str = '0' + bin2Str bin8Str = str(bin(port8Status))[2:] while len(bin8Str) < 8: bin8Str = '0' + bin8Str result = {} if bin2Str[6] == '1': result[str(10 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING} elif bin2Str[6] == '0': result[str(10 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE} if bin2Str[7] == '1': result[str(9 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING} elif bin2Str[7] == '0': result[str(9 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE} if bin8Str[0] == '1': result[str(8 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING} elif bin8Str[0] == '0': result[str(8 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE} if bin8Str[1] == '1': result[str(7 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING} elif bin8Str[1] == '0': result[str(7 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE} if bin8Str[2] == '1': result[str(6 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING} elif bin8Str[2] == '0': result[str(6 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE} if bin8Str[3] == '1': result[str(5 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING} elif bin8Str[3] == '0': result[str(5 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE} if bin8Str[4] == '1': result[str(4 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING} elif bin8Str[4] == '0': result[str(4 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE} if bin8Str[5] == '1': result[str(3 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING} elif bin8Str[5] == '0': result[str(3 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE} if bin8Str[6] == '1': result[str(2 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING} elif bin8Str[6] == '0': result[str(2 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE} if bin8Str[7] == '1': result[str(1 - 1)] = {'status': Const.DEV_WORK_STATUS_WORKING} elif bin8Str[7] == '0': result[str(1 - 1)] = {'status': Const.DEV_WORK_STATUS_IDLE} return result @staticmethod def _get_dev_settings_from_82(data): result = {} tempD1 = data[0:2] binTempD1 = str(bin(int(tempD1, 16)))[2:] while len(binTempD1) < 8: binTempD1 = '0' + binTempD1 # 空载自停 isNoLoadPowerOff = True if binTempD1[-1] == '1' else False result.update({'isNoLoadPowerOff': isNoLoadPowerOff}) # 档位模式 gearMode = '4gear' if binTempD1[-2] == '1' else '2gear' result.update({'gearMode': gearMode}) # 清除设备充电时间 clearChargeTime = '' result.update({'clearChargeTime': clearChargeTime}) # 恢复出厂设置 resetFactorySettings = '' result.update({'resetFactorySettings': resetFactorySettings}) # 充满自停 isFullChargeStop = True if binTempD1[-5] == '1' else False result.update({'isFullChargeStop': isFullChargeStop}) # 免费充电 freeMode = True if binTempD1[-6] == '1' else False result.update({'freeMode': freeMode}) # 倒计时模式 countDownMode = 'power' if binTempD1[-7] == '1' else 'clock' result.update({'countDownMode': countDownMode}) # 数码管显示模式 ledDisplayMode = '10port' if binTempD1[-8] == '1' else '2port' result.update({'ledDisplayMode': ledDisplayMode}) # 2档限定电流值 t2ElecCurrent = float(int(data[2:4], 16)) / 10 result.update({'t2ElecCurrent': t2ElecCurrent}) # 2档充电时间 t2ChargeTime = int(data[4:8], 16) result.update({'t2ChargeTime': t2ChargeTime}) # 4档模式第1档限定电流 t4ElecCurrent1 = float(int(data[8:10], 16)) / 10 result.update({'t4ElecCurrent1': t4ElecCurrent1}) # 4档模式第1档充电时间 t4ChargeTime1 = int(data[10:14], 16) result.update({'t4ChargeTime1': t4ChargeTime1}) # 4档模式第2档限定电流 t4ElecCurrent2 = float(int(data[14:16], 16)) / 10 result.update({'t4ElecCurrent2': t4ElecCurrent2}) # 4档模式第2档充电时间 t4ChargeTime2 = int(data[16:20], 16) result.update({'t4ChargeTime2': t4ChargeTime2}) # 4档模式第3档限定电流 t4ElecCurrent3 = float(int(data[20:22], 16)) / 10 result.update({'t4ElecCurrent3': t4ElecCurrent3}) # 4档模式第3档充电时间 t4ChargeTime3 = int(data[22:26], 16) result.update({'t4ChargeTime3': t4ChargeTime3}) # 4档模式第4档充电时间 t4ChargeTime4 = int(data[28:32], 16) result.update({'t4ChargeTime4': t4ChargeTime4}) # 累计投币次数 accumulativeTotalCoins = int(data[32:40], 16) result.update({'accumulativeTotalCoins': accumulativeTotalCoins}) # 主板版本号 boardVersion = data[40:44] result.update({'boardVersion': boardVersion}) return result def get_port_status_from_dev(self): # 获取端口状态 devInfo = MessageSender.send(self.device, self.make_random_cmdcode(), {'IMEI': self._device['devNo'], "funCode": '01', 'data': '00'}) if devInfo.has_key('rst') and devInfo['rst'] != 0: if devInfo['rst'] == -1: raise ServiceException( {'result': 2, 'description': u'充电桩正在玩命找网络,请您稍候再试'}) elif devInfo['rst'] == 1: raise ServiceException( {'result': 2, 'description': u'充电桩忙,无响应,请您稍候再试。也可能是您的设备版本过低,暂时不支持此功能'}) portStatusInfo = devInfo['data'][112:-2] result = self._get_port_status_from_81(devInfo) ii = 0 while ii < 10: statusTemp = portStatusInfo[ii * 2:ii * 2 + 2] if statusTemp != '00': result[str(ii)] = {'status': Const.DEV_WORK_STATUS_FAULT} ii += 1 allPorts, usedPorts, usePorts = self.get_port_static_info(result) Device.update_dev_control_cache(self._device['devNo'], {'allPorts': allPorts, 'usedPorts': usedPorts, 'usePorts': usePorts}) # 这里存在多线程更新缓存的场景,可能性比较低,但是必须先取出来,然后逐个更新状态,然后再记录缓存 ctrInfo = Device.get_dev_control_cache(self._device['devNo']) for strPort, info in result.items(): if ctrInfo.has_key(strPort): ctrInfo[strPort].update({'status': info['status']}) else: ctrInfo[strPort] = info Device.update_dev_control_cache(self._device['devNo'], ctrInfo) return result def get_port_status(self, force=False): # 获取端口状态(缓存) if force: return self.get_port_status_from_dev() ctrInfo = Device.get_dev_control_cache(self._device['devNo']) statusDict = {} allPorts = ctrInfo.get('allPorts', 10) if allPorts == 0: allPorts = 10 for ii in range(allPorts): tempDict = ctrInfo.get(str(ii), {}) if tempDict.has_key('status'): statusDict[str(ii)] = {'status': tempDict.get('status')} elif tempDict.has_key('isStart'): if tempDict['isStart']: statusDict[str(ii)] = {'status': Const.DEV_WORK_STATUS_WORKING} else: statusDict[str(ii)] = {'status': Const.DEV_WORK_STATUS_IDLE} else: statusDict[str(ii)] = {'status': Const.DEV_WORK_STATUS_IDLE} allPorts, usedPorts, usePorts = self.get_port_static_info(statusDict) Device.update_dev_control_cache(self._device['devNo'], {'allPorts': allPorts, 'usedPorts': usedPorts, 'usePorts': usePorts}) return statusDict def get_dev_setting(self): devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '02', 'data': '00'}) if devInfo.has_key('rst') and devInfo['rst'] != 0: if devInfo['rst'] == -1: raise ServiceException( {'result': 2, 'description': u'充电桩正在玩命找网络,请您稍候再试'}) elif devInfo['rst'] == 1: raise ServiceException( {'result': 2, 'description': u'充电桩忙,无响应,请您稍候再试。也可能是您的设备版本过低,暂时不支持此功能'}) confData = devInfo['data'][8::] result = self._get_dev_settings_from_82(confData) device = Device.objects(devNo=self._device['devNo']).first() device.otherConf = result device.save() return result def start_device(self, package, openId, attachParas): if attachParas is None: raise ServiceException({'result': 2, 'description': u'请您选择合适的充电线路、电池类型信息'}) if not attachParas.has_key('chargeIndex'): raise ServiceException({'result': 2, 'description': u'请您选择合适的充电线路'}) port = hex(int(attachParas['chargeIndex']) + 1) hexPort = fill_2_hexByte(port, 4) if hexPort == '0009': hexPort = '0100' elif hexPort == '000A': hexPort = '0200' elif hexPort == '0003': hexPort = '0004' elif hexPort == '0004': hexPort = '0008' elif hexPort == '0005': hexPort = '0010' elif hexPort == '0006': hexPort = '0020' elif hexPort == '0007': hexPort = '0040' elif hexPort == '0008': hexPort = '0080' needTime = int(package['time']) needCoins = int(package['coins']) unit = package.get('unit', u'分钟') if unit == u'小时': needTime = int(package['time']) * 60 elif unit == u'天': needTime = int(package['time']) * 1440 hexTime = fill_2_hexByte(hex(needTime)) data = hexPort + '01' + hexTime devInfo = MessageSender.send(device=self.device, cmd=DeviceCmdCode.OPERATE_DEV_SYNC, payload={ 'IMEI': self._device['devNo'], "funCode": '03', 'data': data }, timeout=MQTT_TIMEOUT.START_DEVICE) if devInfo.has_key('rst') and devInfo['rst'] != 0: if devInfo['rst'] == -1: raise ServiceException( {'result': 2, 'description': u'充电桩正在玩命找网络,您的金币还在,重试不需要重新付款,建议您试试旁边其他设备,或者稍后再试哦'}) elif devInfo['rst'] == 1: raise ServiceException({'result': 2, 'description': u'充电桩正在忙,无响应,您的金币还在,请试试其他线路,或者请稍后再试哦'}) data = devInfo['data'][8::] usePort = int(attachParas['chargeIndex']) result = data[4:8] if result == '0000': # 代表失败 newValue = {str(usePort): {'status': Const.DEV_WORK_STATUS_FAULT, 'statusInfo': u'充电站故障'}} Device.update_dev_control_cache(self._device['devNo'], newValue) raise ServiceException({'result': 2, 'description': u'充电站故障'}) start_timestamp = int(time.time()) finishedTime = start_timestamp + needTime * 60 portDict = { 'startTime': timestamp_to_dt(start_timestamp).strftime('%Y-%m-%d %H:%M:%S'), 'status': Const.DEV_WORK_STATUS_WORKING, 'finishedTime': finishedTime, 'coins': float(needCoins), 'isStart': True, 'needTime': needTime, 'openId': openId, 'refunded': False, 'vCardId': self._vcard_id } if 'linkedRechargeRecordId' in attachParas and attachParas.get('isQuickPay', False): item = { 'rechargeRcdId': str(attachParas['linkedRechargeRecordId']) } portDict['payInfo'] = [item] Device.update_dev_control_cache(self._device['devNo'], {str(usePort): portDict}) return devInfo def analyze_event_data(self, data): cmdCode = data[6:8] if cmdCode == '86': portData = data[8:12] if portData == '0001': port = '1' reason = data[16:18] leftTime = int(data[36:44], 16) / 60 spendElec = str(float(int(data[116:120], 16)) / 100) elif portData == '0002': port = '2' reason = data[18:20] leftTime = int(data[44:52], 16) / 60 spendElec = str(float(int(data[120:124], 16)) / 100) elif portData == '0004': port = '3' reason = data[20:22] leftTime = int(data[52:60], 16) / 60 spendElec = str(float(int(data[124:128], 16)) / 100) elif portData == '0008': port = '4' reason = data[22:24] leftTime = int(data[60:68], 16) / 60 spendElec = str(float(int(data[128:132], 16)) / 100) elif portData == '0010': port = '5' reason = data[24:26] leftTime = int(data[68:76], 16) / 60 spendElec = str(float(int(data[132:136], 16)) / 100) elif portData == '0020': port = '6' reason = data[26:28] leftTime = int(data[76:84], 16) / 60 spendElec = str(float(int(data[136:140], 16)) / 100) elif portData == '0040': port = '7' reason = data[28:30] leftTime = int(data[84:92], 16) / 60 spendElec = str(float(int(data[140:144], 16)) / 100) elif portData == '0080': port = '8' reason = data[30:32] leftTime = int(data[92:100], 16) / 60 spendElec = str(float(int(data[144:148], 16)) / 100) elif portData == '0100': port = '9' reason = data[32:34] leftTime = int(data[100:108], 16) / 60 spendElec = str(float(int(data[148:152], 16)) / 100) elif portData == '0200': port = '10' reason = data[34:36] leftTime = int(data[108:116], 16) / 60 spendElec = str(float(int(data[152:156], 16)) / 100) else: return {} status = Const.DEV_WORK_STATUS_IDLE if reason == '00': desc = u'购买的充电时间用完了。' elif reason in ['04', '06', '07']: desc = u'管理人员可能远程断电了,或是插头被拔掉, 建议您根据已经充电的时间评估是否需要到现场换到其他端口充电。' elif reason in ['02', '03']: desc = u'警告!您的电池超功率,已经停止充电,为了公共安全,不建议您在该充电桩充电!提醒您,为了安全大功率的电池不要放入楼道、室内等位置充电哦。' elif reason == '05': desc = u'空载。' elif reason == '01': desc = u'电池没有充满!原因未知。' else: desc = u'成功!' status = Const.DEV_WORK_STATUS_WORKING return {'status': status, 'cmdCode': cmdCode, 'port': str(int(port) - 1), 'reason': desc, 'leftTime': leftTime, 'elec': spendElec} @property def isHaveStopEvent(self): return True def stop(self, port=None): self.stop_charging_port(port) infoDict = dict() infoDict['remainder_time'] = 0 return infoDict def stop_charging_port(self, port): self.active_deactive_port(port, False) # 远程停止某个端口的使用 def active_deactive_port(self, port, active): hexPort = fill_2_hexByte(hex(int(port) + 1), 4) if hexPort == '0009': hexPort = '0100' elif hexPort == '000A': hexPort = '0200' elif hexPort == '0003': hexPort = '0004' elif hexPort == '0004': hexPort = '0008' elif hexPort == '0005': hexPort = '0010' elif hexPort == '0006': hexPort = '0020' elif hexPort == '0007': hexPort = '0040' elif hexPort == '0008': hexPort = '0080' if active: return else: data = hexPort + '00' devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '03', 'data': data + '0000'}) if devInfo.has_key('rst') and devInfo['rst'] != 0: if devInfo['rst'] == -1: raise ServiceException( {'result': 2, 'description': u'充电桩正在玩命找网络,请您稍候再试'}) elif devInfo['rst'] == 1: raise ServiceException( {'result': 2, 'description': u'充电桩忙,无响应,请您稍候再试。也可能是您的设备版本过低,暂时不支持此功能'}) def get_port_info(self, line): devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '01', 'data': '00'}) if devInfo.has_key('rst') and devInfo['rst'] != 0: if devInfo['rst'] == -1: raise ServiceException( {'result': 2, 'description': u'充电桩正在玩命找网络,请您稍候再试'}) elif devInfo['rst'] == 1: raise ServiceException( {'result': 2, 'description': u'充电桩忙,无响应,请您稍候再试。也可能是您的设备版本过低,暂时不支持此功能'}) leftTimeData = devInfo['data'][32:112] elecData = devInfo['data'][12:32] spendElecData = devInfo['data'][132:172] ii = int(line) leftTime = int(int(leftTimeData[ii * 8:ii * 8 + 8], 16) / 60) electricity = float(int(elecData[ii * 2:ii * 2 + 2], 16)) / 10 spendElec = float(int(spendElecData[ii * 4:ii * 4 + 4], 16)) / 100 return {'port': str(int(line)), 'leftTime': leftTime, 'electricity': electricity, 'elec': spendElec} def set_device_function_param(self, postData, lastSetConf): postData = postData['POST'] device = Device.objects(devNo=self._device['devNo']).first() originData = device.otherConf if originData == {}: needResetSettings = postData else: needResetSettings = {} for k, v in originData.items(): if k in ['resetFactorySettings', 'clearChargeTime', 'countDownMode', 'ledDisplayMode']: continue if postData[k] != v: needResetSettings[k] = postData[k] needResetSettingsList = needResetSettings.keys() if 'isFullChargeStop' in needResetSettingsList: self._set_is_full_charge_stop(needResetSettings['isFullChargeStop']) if 'freeMode' in needResetSettingsList: self._set_free_mode(needResetSettings['freeMode']) if 'isNoLoadPowerOff' in needResetSettingsList: self._set_is_no_load_power_off(needResetSettings['isNoLoadPowerOff']) if 'gearMode' in needResetSettingsList: self._set_gear_mode(needResetSettings['gearMode']) if 'countDownMode' in needResetSettingsList: self._set_countdown_mode(needResetSettings['countDownMode']) if 't2ElecCurrent' in needResetSettingsList: self._set_t2_elec_current(needResetSettings['t2ElecCurrent']) if 't2ChargeTime' in needResetSettingsList: self._set_t2_charge_time(needResetSettings['t2ChargeTime']) if 't4ElecCurrent1' in needResetSettingsList: self._set_t4_elec_current_1(needResetSettings['t4ElecCurrent1']) if 't4ChargeTime1' in needResetSettingsList: self._set_t4_charge_time_1(needResetSettings['t4ChargeTime1']) if 't4ElecCurrent2' in needResetSettingsList: self._set_t4_elec_current_2(needResetSettings['t4ElecCurrent2']) if 't4ChargeTime2' in needResetSettingsList: self._set_t4_charge_time_2(needResetSettings['t4ChargeTime2']) if 't4ElecCurrent3' in needResetSettingsList: self._set_t4_elec_current_3(needResetSettings['t4ElecCurrent3']) if 't4ChargeTime3' in needResetSettingsList: self._set_t4_charge_time_3(needResetSettings['t4ChargeTime3']) if 't4ChargeTime4' in needResetSettingsList: self._set_t4_charge_time_4(needResetSettings['t4ChargeTime4']) for _ in needResetSettingsList: device.otherConf.update({_: needResetSettings[_]}) device.save() def set_device_function(self, request, lastSetConf): if 'clearChargeTime' in request.POST: self._clear_charge_time() if 'resetFactorySettings' in request.POST: self._reset_factory_settings() def _clear_charge_time(self): devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '08' + '0000'}) self.__verify_setting_uart(devInfo) def _reset_factory_settings(self): devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '09' + '0000'}) self.__verify_setting_uart(devInfo) device = Device.objects(devNo=self._device['devNo']).first() device.otherConf = {} device.save() def _set_is_full_charge_stop(self, setConf): data = '0001' if setConf is True else '0000' devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '0A' + data}) self.__verify_setting_uart(devInfo) def _set_free_mode(self, setConf): data = '0001' if setConf is True else '0000' devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '0B' + data}) self.__verify_setting_uart(devInfo) def _set_is_no_load_power_off(self, setConf): data = '0001' if setConf is True else '0000' devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '0F' + data}) self.__verify_setting_uart(devInfo) def _set_gear_mode(self, setConf): data = '0001' if setConf == '4gear' else '0000' devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '10' + data}) self.__verify_setting_uart(devInfo) def _set_countdown_mode(self, setConf): data = '0001' if setConf == 'power' else '0000' devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '11' + data}) self.__verify_setting_uart(devInfo) def _set_t2_elec_current(self, setConf): data = fill_2_hexByte(hex(int((float(setConf) * 10)))) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '12' + data}) self.__verify_setting_uart(devInfo) def _set_t2_charge_time(self, setConf): data = fill_2_hexByte(hex(int(setConf))) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '13' + data}) self.__verify_setting_uart(devInfo) def _set_t4_elec_current_1(self, setConf): data = fill_2_hexByte(hex(int((float(setConf) * 10)))) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '14' + data}) self.__verify_setting_uart(devInfo) def _set_t4_charge_time_1(self, setConf): data = fill_2_hexByte(hex(int(setConf))) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '15' + data}) self.__verify_setting_uart(devInfo) def _set_t4_elec_current_2(self, setConf): data = fill_2_hexByte(hex(int((float(setConf) * 10)))) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '16' + data}) self.__verify_setting_uart(devInfo) def _set_t4_charge_time_2(self, setConf): data = fill_2_hexByte(hex(int(setConf))) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '17' + data}) self.__verify_setting_uart(devInfo) def _set_t4_elec_current_3(self, setConf): data = fill_2_hexByte(hex(int((float(setConf) * 10)))) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '18' + data}) self.__verify_setting_uart(devInfo) def _set_t4_charge_time_3(self, setConf): data = fill_2_hexByte(hex(int(setConf))) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '19' + data}) self.__verify_setting_uart(devInfo) def _set_t4_charge_time_4(self, setConf): data = fill_2_hexByte(hex(int(setConf))) devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], "funCode": '04', 'data': '1B' + data}) self.__verify_setting_uart(devInfo)