# -*- coding: utf-8 -*- #!/usr/bin/env python from apps.web.constant import DeviceCmdCode, Const from apps.web.core.adapter.base import SmartBox from apps.web.core.exceptions import ServiceException from apps.web.core.networking import MessageSender from apps.web.device.models import Device class ChargingPlugBox(SmartBox): def __init__(self, device): super(ChargingPlugBox, self).__init__(device) def translate_funcode(self, fun_code): fun_codeDict = { '01': u'查询所有子设备状态', '02': u'查询全部端口详情', '03': u'绑定设备', '04': u'重启设备', '05': u'解绑设备', '07': u'启动端口', '08': u'查询设备信息', '09': u'查询端口信息', '0B': u'设置设备配置', '0C': u'查询设备配置', } return fun_codeDict.get(fun_code, '') def translate_event_cmdcode(self, cmdCode): cmdDict = { } return cmdDict.get(cmdCode, '') def test(self, coins): data = {'fun_code':0x07,'order_id':'1111','chrmt':0,'port_id':0,'amount':60} devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], 'data': data}) return devInfo def check_feedback_result(self,devInfo): if not devInfo.has_key('rst'): raise ServiceException({'result': 2, 'description': u'报文异常'}) if devInfo['rst'] == -1: raise ServiceException({'result': 2, 'description': u'网关正在玩命找网络,请您稍候再试'}) if devInfo['rst'] == 1: raise ServiceException({'result': 2, 'description': u'串口通讯失败,您稍候再试,或者联系客服'}) if devInfo['rst'] == 2: raise ServiceException({'result': 2, 'description': u'操作失败'}) if devInfo['rst'] == 5: raise ServiceException({'result': 2, 'description': u'设备正在自检'}) # result = devInfo['data']['result'] # if result == 0: # return # else:#等待设备的错误码进行细化 # raise ServiceException({'result': 2, 'description': u'网关返回了错误,请您重试看看能否解决问题'}) def start_device(self, package, openId, attachParas): return None def analyze_event_data(self, data): if data['fun_code'] == '34':#如果是结束事件,需要把reason翻译出来 descDict = { '5':u'支付的金额已经使用完毕', '6':u'用户手工停止了充电', '7':u'电池充满自停', '8':u'故障导致充电停止', '9':u'本端口功率过载,主动关闭', '10':u'没有连接充电器,主动关闭', '11':u'远程关闭', '12':u'检测到烟雾告警,主动关闭' } order = data['order'] order['reason'] = descDict.get(str(order['closeType']),u'') data['order'] = order return data def get_node_list(self): devInfo = MessageSender.send(self.device, self.make_random_cmdcode(), {'IMEI': self._device['devNo'], 'data': {'fun_code': 0x01}}) self.check_feedback_result(devInfo) result = [] for nodeId,nodeInfo in devInfo['data']['subdevs_status'].items(): if nodeInfo['status'] == 1: nodeInfo['online'] = True else: nodeInfo['online'] = False nodeInfo.update({'devNo':str(int(nodeId))}) result.append(nodeInfo) return result def get_node(self,nodeDevNo): devInfo = MessageSender.send(self.device, self.make_random_cmdcode(), {'IMEI': self._device['devNo'], 'data': {'fun_code': 0x01}}) self.check_feedback_result(devInfo) return devInfo['data']['subdevs_status'].get(nodeDevNo,None) def __translate_status_from_str(self,status): dictConf = { '0':Const.DEV_WORK_STATUS_IDLE, '1':Const.DEV_WORK_STATUS_WORKING, '2':Const.DEV_WORK_STATUS_FAULT, '3':Const.DEV_WORK_STATUS_FAULT, } return dictConf.get(status,Const.DEV_WORK_STATUS_IDLE) def add_node(self,nodeDevNo): devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], 'data': {'fun_code': 0x03, 'dev_id': nodeDevNo}}) self.check_feedback_result(devInfo) # 子节点的父节点也要更新 try: devObj = Device.objects.get(devNo = nodeDevNo) devObj.gatewayNode = self._device['devNo'] devObj.save() except Exception,e: raise ServiceException({'result': 2, 'description': u'请先扫码注册子设备插座,然后再加入网关'}) def remove_node(self,nodeDevNo): devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], 'data': {'fun_code': 0x05, 'dev_id': nodeDevNo}}) self.check_feedback_result(devInfo) # 子节点的父节点也要更新 try: devObj = Device.objects.get(devNo = nodeDevNo) devObj.gatewayNode = '' devObj.save() except Exception,e: pass def ack_event(self,orderNo,funCode): devInfo = MessageSender.send(self.device, DeviceCmdCode.PASSTHROUGH_OPERATE_DEV_NO_RESPONSE, {'IMEI': self._device['devNo'], 'data': {'fun_code':funCode,'order_id':orderNo}}) self.check_feedback_result(devInfo) def reboot_device(self): MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC, {'IMEI': self._device['devNo'], 'data': {'fun_code':0x04}})