dc_plug_gateway.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. # -*- coding: utf-8 -*-
  2. #!/usr/bin/env python
  3. from apps.web.constant import DeviceCmdCode, Const
  4. from apps.web.core.adapter.base import SmartBox
  5. from apps.web.core.exceptions import ServiceException
  6. from apps.web.core.networking import MessageSender
  7. from apps.web.device.models import Device
  8. class ChargingPlugBox(SmartBox):
  9. def __init__(self, device):
  10. super(ChargingPlugBox, self).__init__(device)
  11. def translate_funcode(self, fun_code):
  12. fun_codeDict = {
  13. '01': u'查询所有子设备状态',
  14. '02': u'查询全部端口详情',
  15. '03': u'绑定设备',
  16. '04': u'重启设备',
  17. '05': u'解绑设备',
  18. '07': u'启动端口',
  19. '08': u'查询设备信息',
  20. '09': u'查询端口信息',
  21. '0B': u'设置设备配置',
  22. '0C': u'查询设备配置',
  23. }
  24. return fun_codeDict.get(fun_code, '')
  25. def translate_event_cmdcode(self, cmdCode):
  26. cmdDict = {
  27. }
  28. return cmdDict.get(cmdCode, '')
  29. def test(self, coins):
  30. data = {'fun_code':0x07,'order_id':'1111','chrmt':0,'port_id':0,'amount':60}
  31. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  32. {'IMEI': self._device['devNo'], 'data': data})
  33. return devInfo
  34. def check_feedback_result(self,devInfo):
  35. if not devInfo.has_key('rst'):
  36. raise ServiceException({'result': 2, 'description': u'报文异常'})
  37. if devInfo['rst'] == -1:
  38. raise ServiceException({'result': 2, 'description': u'网关正在玩命找网络,请您稍候再试'})
  39. if devInfo['rst'] == 1:
  40. raise ServiceException({'result': 2, 'description': u'串口通讯失败,您稍候再试,或者联系客服'})
  41. if devInfo['rst'] == 2:
  42. raise ServiceException({'result': 2, 'description': u'操作失败'})
  43. if devInfo['rst'] == 5:
  44. raise ServiceException({'result': 2, 'description': u'设备正在自检'})
  45. # result = devInfo['data']['result']
  46. # if result == 0:
  47. # return
  48. # else:#等待设备的错误码进行细化
  49. # raise ServiceException({'result': 2, 'description': u'网关返回了错误,请您重试看看能否解决问题'})
  50. def start_device(self, package, openId, attachParas):
  51. return None
  52. def analyze_event_data(self, data):
  53. if data['fun_code'] == '34':#如果是结束事件,需要把reason翻译出来
  54. descDict = {
  55. '5':u'支付的金额已经使用完毕',
  56. '6':u'用户手工停止了充电',
  57. '7':u'电池充满自停',
  58. '8':u'故障导致充电停止',
  59. '9':u'本端口功率过载,主动关闭',
  60. '10':u'没有连接充电器,主动关闭',
  61. '11':u'远程关闭',
  62. '12':u'检测到烟雾告警,主动关闭'
  63. }
  64. order = data['order']
  65. order['reason'] = descDict.get(str(order['closeType']),u'')
  66. data['order'] = order
  67. return data
  68. def get_node_list(self):
  69. devInfo = MessageSender.send(self.device, self.make_random_cmdcode(),
  70. {'IMEI': self._device['devNo'], 'data': {'fun_code': 0x01}})
  71. self.check_feedback_result(devInfo)
  72. result = []
  73. for nodeId,nodeInfo in devInfo['data']['subdevs_status'].items():
  74. if nodeInfo['status'] == 1:
  75. nodeInfo['online'] = True
  76. else:
  77. nodeInfo['online'] = False
  78. nodeInfo.update({'devNo':str(int(nodeId))})
  79. result.append(nodeInfo)
  80. return result
  81. def get_node(self,nodeDevNo):
  82. devInfo = MessageSender.send(self.device, self.make_random_cmdcode(),
  83. {'IMEI': self._device['devNo'], 'data': {'fun_code': 0x01}})
  84. self.check_feedback_result(devInfo)
  85. return devInfo['data']['subdevs_status'].get(nodeDevNo,None)
  86. def __translate_status_from_str(self,status):
  87. dictConf = {
  88. '0':Const.DEV_WORK_STATUS_IDLE,
  89. '1':Const.DEV_WORK_STATUS_WORKING,
  90. '2':Const.DEV_WORK_STATUS_FAULT,
  91. '3':Const.DEV_WORK_STATUS_FAULT,
  92. }
  93. return dictConf.get(status,Const.DEV_WORK_STATUS_IDLE)
  94. def add_node(self,nodeDevNo):
  95. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  96. {'IMEI': self._device['devNo'], 'data': {'fun_code': 0x03, 'dev_id': nodeDevNo}})
  97. self.check_feedback_result(devInfo)
  98. # 子节点的父节点也要更新
  99. try:
  100. devObj = Device.objects.get(devNo = nodeDevNo)
  101. devObj.gatewayNode = self._device['devNo']
  102. devObj.save()
  103. except Exception,e:
  104. raise ServiceException({'result': 2, 'description': u'请先扫码注册子设备插座,然后再加入网关'})
  105. def remove_node(self,nodeDevNo):
  106. devInfo = MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  107. {'IMEI': self._device['devNo'], 'data': {'fun_code': 0x05, 'dev_id': nodeDevNo}})
  108. self.check_feedback_result(devInfo)
  109. # 子节点的父节点也要更新
  110. try:
  111. devObj = Device.objects.get(devNo = nodeDevNo)
  112. devObj.gatewayNode = ''
  113. devObj.save()
  114. except Exception,e:
  115. pass
  116. def ack_event(self,orderNo,funCode):
  117. devInfo = MessageSender.send(self.device, DeviceCmdCode.PASSTHROUGH_OPERATE_DEV_NO_RESPONSE,
  118. {'IMEI': self._device['devNo'], 'data': {'fun_code':funCode,'order_id':orderNo}})
  119. self.check_feedback_result(devInfo)
  120. def reboot_device(self):
  121. MessageSender.send(self.device, DeviceCmdCode.OPERATE_DEV_SYNC,
  122. {'IMEI': self._device['devNo'], 'data': {'fun_code':0x04}})