bolai_gateway.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import logging
  4. import random
  5. from typing import TYPE_CHECKING
  6. from apps.web.core.adapter.base import SmartBox, start_error_timer
  7. from apps.web.core.device_define.baolai import send_request
  8. from apps.web.core.exceptions import ServiceException
  9. from apps.web.device.models import Device
  10. if TYPE_CHECKING:
  11. pass
  12. logger = logging.getLogger(__name__)
  13. class ChargingGatewayBox(SmartBox):
  14. """
  15. """
  16. def __init__(self, device):
  17. super(ChargingGatewayBox, self).__init__(device)
  18. devObj = self.device.my_obj
  19. self.nodeDict = devObj.nodeDict
  20. @property
  21. def isHaveStopEvent(self):
  22. return True
  23. def translate_funcode(self, funCode):
  24. funCodeDict = {
  25. }
  26. return funCodeDict.get(funCode, '')
  27. def translate_event_cmdcode(self, cmdCode):
  28. cmdDict = {}
  29. return cmdDict.get(cmdCode, '')
  30. def send_request(self, cmdPath, jsonPara):
  31. return send_request(self.device.devNo, self.device.devNo, cmdPath, jsonPara)
  32. def test(self, coins, port = 1):
  33. return self.send_request('device/plug/list', {})
  34. @start_error_timer(missMessages = [u"请您选择合适的充电线路、电池类型信息", u"请您选择合适的充电线路", u"该端口正在使用中"])
  35. def start_device(self, package, openId, attachParas):
  36. pass
  37. def analyze_event_data(self, data):
  38. return None
  39. # 此接口 柏来已经不维护,去掉
  40. # def get_node_list_from_dev(self):
  41. # devInfo = self.send_request('device/plug/list', {})
  42. # return devInfo['data']['data']['plug_list']
  43. def get_node(self, node):
  44. nodeInfo = {
  45. 'signal':node.get('signal',0),
  46. 'rssi':node.get('rssi',39),
  47. 'online':node.get('online',False),
  48. }
  49. if 'suid' in node:
  50. nodeInfo.update({
  51. 'devNo':node['suid'],
  52. 'suid':node['suid'],
  53. })
  54. if 'devNo' in node:
  55. nodeInfo.update({
  56. 'devNo':node['devNo'],
  57. 'suid':node['devNo'],
  58. })
  59. # cmdPath = 'cmd/get-status'
  60. # jsonPara = {
  61. # 'node_index': node['node_index']
  62. # }
  63. #
  64. # devInfo = self.send_request(cmdPath, jsonPara)
  65. #
  66. # nodeInfo = {'signal': calc_signal_from_rssi(devInfo['data']['data']['rssi']),
  67. # 'temp': devInfo['data']['data']['temperature'],
  68. # 'rssi': devInfo['data']['data']['rssi'],
  69. # 'devNo': node['suid'],
  70. # 'volt': max(devInfo['data']['data']['port_list'][0]['voltage'],
  71. # devInfo['data']['data']['port_list'][1]['voltage'])}
  72. #
  73. # # 这里插座离线后,rssi不准确,以插口状态为准
  74. # if devInfo['data']['data']['port_list'][0]['online'] and devInfo['data']['data']['port_list'][1]['online']:
  75. # nodeInfo.update({'online': True})
  76. # else:
  77. # nodeInfo.update({'online': False})
  78. # nodeInfo.update({'signal': 0})
  79. return nodeInfo
  80. # 获取设备配置参数
  81. def get_dev_setting(self):
  82. devInfo = self.send_request('cmd/get-gateway-config', {})
  83. if devInfo['data']['code'] != 0:
  84. raise ServiceException({'result': 2, 'description': u'设备服务器返回错误,建议您重试,或者联系客服'})
  85. return devInfo['data']
  86. # 设置设备配置参数
  87. def set_dev_setting(self, setConf):
  88. setConf.update({})
  89. devInfo = self.send_request('cmd/set-gateway-config', setConf)
  90. if devInfo['data']['code'] != 0:
  91. raise ServiceException({'result': 2, 'description': u'设备服务器返回错误,建议您重试,或者联系客服'})
  92. return devInfo
  93. def set_device_function_param(self, request, lastSetConf):
  94. pass
  95. def get_dev_online_status(self):
  96. devInfo = self.send_request('device/gateway/detail', {})
  97. return devInfo['data']['plug_gateway']['is_online']
  98. def update_dev_info(self):
  99. devInfo = self.send_request('device/gateway/update',
  100. {'province': '', 'city': '', 'county': '',
  101. 'address': '', 'longitude': 0.0, 'latitude': 0.0})
  102. if devInfo['data']['code'] != 0:
  103. raise ServiceException({'result': 2, 'description': u'设备服务器返回错误,建议您重试,或者联系客服'})
  104. def add_node(self, nodeDevNo):
  105. # 首先检查子节点是否已经注册了
  106. devObj = Device.objects.filter(devNo = nodeDevNo).first()
  107. if devObj is None:
  108. raise ServiceException({'result': 2, 'description': u'请先扫码注册子设备插座,然后再加入网关'})
  109. # 检查是否绑定在其他主节点,如果绑定了其他主节点,必须提示
  110. if devObj.gatewayNode and devObj.gatewayNode != self._device['devNo']:
  111. raise ServiceException({'result': 2, 'description': u'该子节点已经绑定在其他主节点下,请先解绑后,再重新添加'})
  112. nodeList = self.get_node_list()
  113. # 首先检查是否已经添加进来了
  114. exist = devObj.gatewayNode == self._device['devNo']
  115. sendList = [{'node_index': node['node_index'], 'plug_id': node['suid']} for node in nodeList]
  116. if exist: # 如果已经存在了,直接下发就Ok
  117. pass
  118. else:
  119. nodeIndexList = [node['node_index'] for node in nodeList]
  120. ii = 1
  121. for ii in range(1, 50):
  122. if ii not in nodeIndexList:
  123. break
  124. else:
  125. continue
  126. sendList.append({'node_index': ii, 'plug_id': nodeDevNo})
  127. devInfo = self.send_request('cmd/build-network',
  128. {'channel': random.randint(1, 8),
  129. 'plug_list': sendList, 'timeout': 15})
  130. if devInfo['data']['code'] != 0:
  131. raise ServiceException({'result': 2, 'description': u'设备服务器返回错误,建议您重试,或者联系客服'})
  132. # 主节点内容更新
  133. devObj = Device.objects.get(devNo = self._device['devNo'])
  134. devObj.nodeDict.update({str(ii):nodeDevNo})
  135. devObj.save()
  136. # 子节点的也要更新
  137. devObj = Device.objects.get(devNo = nodeDevNo)
  138. devObj.gatewayNode = self._device['devNo']
  139. devObj.save()
  140. def remove_node(self, nodeDevNo):
  141. nodeList = self.get_node_list()
  142. sendList = []
  143. index = -1
  144. nodeDict = {}
  145. for node in nodeList:
  146. if node['suid'] != nodeDevNo:
  147. sendList.append({'node_index': node['node_index'], 'plug_id': node['suid']})
  148. nodeDict[node['node_index']] = node['suid']
  149. else:
  150. index = node['node_index']
  151. if index == -1:
  152. return
  153. devInfo = self.send_request('cmd/build-network',
  154. {'channel': random.randint(1, 8),
  155. 'plug_list': sendList, 'timeout': 5})
  156. if devInfo['data']['code'] != 0:
  157. raise ServiceException({'result': 2, 'description': u'设备服务器返回错误,建议您重试,或者联系客服'})
  158. # 主节点更新
  159. try:
  160. devObj = Device.objects.get(devNo = self._device['devNo'])
  161. devObj.nodeDict = nodeDict
  162. devObj.save()
  163. except Exception, e:
  164. pass
  165. # 子节点更新
  166. try:
  167. devObj = Device.objects.get(devNo = nodeDevNo)
  168. devObj.gatewayNode = ''
  169. devObj.save()
  170. except Exception, e:
  171. return
  172. def set_batch_ports_config(self, maxCurrent, maxPower):
  173. if maxCurrent <= 0 or maxCurrent >= 20:
  174. raise ServiceException({'result': 2, 'description': u'电流允许的范围是0-20安'})
  175. if maxPower <= 0 or maxPower >= 2500:
  176. raise ServiceException({'result': 2, 'description': u'功率允许的范围是0-2500瓦'})
  177. devInfo = self.send_request('cmd/set-node-config/batch',
  178. {'max_current': maxCurrent,
  179. 'max_power': maxCurrent})
  180. if devInfo['data']['code'] != 0:
  181. raise ServiceException({'result': 2, 'description': u'设备服务器返回错误,建议您重试,或者联系客服'})
  182. return devInfo
  183. def get_node_config(self, nodeIndex):
  184. devInfo = self.send_request('cmd/get-node-system-config',
  185. {'node_index': nodeIndex})
  186. return devInfo['data']
  187. def set_node_config(self, nodeIndex, config):
  188. config.update({'node_index': nodeIndex, 'timeout': 10})
  189. devInfo = self.send_request('cmd/set-node-config', config)
  190. if devInfo['data']['code'] != 0:
  191. raise ServiceException({'result': 2, 'description': u'设备服务器返回错误,建议您重试,或者联系客服'})
  192. return devInfo
  193. def get_signal(self):
  194. devInfo = self.send_request('device/gateway/detail', {})
  195. devInfo.update({'signal': devInfo['data']['data']['gateway']['rssi']})
  196. if devInfo['signal'] > 5:
  197. Device.update_online_cache(self._device['devNo'], True, devInfo['signal'])
  198. return devInfo
  199. def get_node_list(self):
  200. result = []
  201. for index,nodeDevNo in self.nodeDict.items():
  202. nodeDevInfo = Device.get_dev(nodeDevNo)
  203. nodeInfo = self.get_node(nodeDevInfo)
  204. nodeInfo.update({'node_index':int(index)})
  205. result.append(nodeInfo)
  206. return result
  207. # nodeList = self.get_node_list_from_dev()
  208. # result = []
  209. # for node in nodeList:
  210. # nodeInfo = self.get_node(node)
  211. # result.append(nodeInfo)
  212. # return result
  213. def get_node_devNo(self, nodeIndex):
  214. return self.nodeDict.get(str(nodeIndex))