device.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. demeter service
  5. name:device.py 处理设备
  6. author:rabin
  7. """
  8. from demeter.core import *
  9. from demeter.mqtt import *
  10. class Device(object):
  11. # 新增网关时,增加状态和电源
  12. def upGatewayStatus(self, farm_id, gateway_id, hardware_id):
  13. if hardware_id and gateway_id > 0:
  14. info = Demeter.service('common').list('device_info', search={'hardware_id':hardware_id})
  15. if not info:
  16. # 网关状态
  17. insert = {}
  18. insert['farm_id'] = farm_id
  19. insert['name'] = '网关状态'
  20. insert['hardware_id'] = hardware_id
  21. insert['gateway_id'] = gateway_id
  22. insert['hardware_type'] = 5
  23. insert['value'] = '2'
  24. insert['type_id'] = 0
  25. insert['status'] = False
  26. Demeter.service('common').update('device_info', None, insert)
  27. # 电源
  28. insert = {}
  29. insert['farm_id'] = farm_id
  30. insert['name'] = '电源状态'
  31. insert['hardware_id'] = hardware_id
  32. insert['gateway_id'] = gateway_id
  33. insert['hardware_type'] = 4
  34. insert['value'] = '2'
  35. insert['type_id'] = 8
  36. insert['status'] = False
  37. Demeter.service('common').update('device_info', None, insert)
  38. # 批量处理开关
  39. def switchMul(self, value):
  40. if value['devices']:
  41. model = Demeter.model('device_info')
  42. value['devices'] = tuple(eval(value['devices']))
  43. if value['oper'] == 1:
  44. switch = 1
  45. else:
  46. switch = 2
  47. for v in value['devices']:
  48. self.switch(v, switch)
  49. # 处理开关-向设备发送请求
  50. def switch(self, device_id, switch=1, mul=False):
  51. model = Demeter.model('device_info')
  52. model.id = device_id
  53. info = model.select(type='fetchone')
  54. # 如果有批量控制,还要保存mul的id
  55. if mul:
  56. queue_model = Demeter.model('device_mul_queue')
  57. queue_model.mul_id = mul
  58. queue_model.device_id = info['id']
  59. queue_model.status = 1
  60. queue_model.value = switch
  61. queue_model.insert()
  62. return
  63. if info and info['status'] == True:
  64. # 设置为loading状态,cxnum保存当前的值
  65. model.id = device_id
  66. model.update(exp='-1', cxnum=switch, oper=True)
  67. model = Demeter.model('device_gateway')
  68. model.id = info['gateway_id']
  69. gateway_info = model.select(type='fetchone')
  70. if info['type_id'] > 0:
  71. model = Demeter.model('device_type')
  72. model.id = info['type_id']
  73. type_info = model.select(type='fetchone')
  74. if type_info:
  75. info['hardware_id'] = str(info['hardware_id'])
  76. switch = str(switch)
  77. gateway_info['hardware_id'] = str(gateway_info['hardware_id'])
  78. # 这里要向服务器发送pub请求了,暂时使用临时文件代替
  79. #Demeter.temp(key=type_info['key'], name=info['hardware_id'], value=switch)
  80. #pub
  81. pub = Pub()
  82. key = type_info['key'] + '/' + gateway_info['hardware_id'] + '/' + info['hardware_id']
  83. update = 'update/' + key
  84. feedback = 'status/' + key
  85. value = switch
  86. #pub.push(update, value, qos=0, callback=self.switchAction, param={'info':info, 'key':feedback, 'switch':switch}, feedback=True)
  87. pub.push(update, value)
  88. else:
  89. msg = self.notice('offline')
  90. model.id = device_id
  91. model.update(exp=msg, cxnum=switch)
  92. self.mul(info['id'], info['type_id'], info['name'], switch, '失败:' + msg, False)
  93. #Demeter.error('offline')
  94. # 处理开关-响应
  95. def switchAction(self, param, client, userdata, mid, msg='ok'):
  96. info = param['info']
  97. if info and info['status'] == True:
  98. param['switch'] = info['cxnum']
  99. model = Demeter.model('device_gateway')
  100. model.id = info['gateway_id']
  101. gateway = model.select(type='fetchone')
  102. if msg == 'ok':
  103. model = Demeter.model('device_info')
  104. model.id = info['id']
  105. model.update(value=param['switch'], exp='1', oper=False)
  106. # 如果有批量控制
  107. self.mul(info['id'], info['type_id'], info['name'], param['switch'], '成功', True)
  108. else:
  109. msg = self.notice(msg)
  110. model = Demeter.model('device_info')
  111. model.id = info['id']
  112. model.update(exp=msg, oper=False)
  113. # 如果有批量控制
  114. oper = self.mul(info['id'], info['type_id'], info['name'], param['switch'], '失败:' + msg, False)
  115. content = oper + gateway['name'] + '下的'+ info['name'] + '失败,错误提示:' + msg
  116. Demeter.service('record').msg(info['id'], content, info['farm_id'], 3)
  117. #Demeter.error(msg)
  118. def notice(self, msg):
  119. model = Demeter.model('notice_type')
  120. model.key = msg
  121. info = model.select(type='fetchone')
  122. if info:
  123. msg = info['name']
  124. return msg
  125. def mul(self, id, type_id, name, switch, msg, state):
  126. model = Demeter.model('device_mul_queue')
  127. model.device_id = id
  128. model.status = 1
  129. queue = model.select()
  130. if queue:
  131. model.device_id = id
  132. if state:
  133. model.update(status=2)
  134. #model.device_id = id
  135. #model.delete()
  136. else:
  137. model.update(status=3)
  138. mul_model = Demeter.model('device_mul')
  139. type_model = Demeter.model('device_type')
  140. type_model.id = type_id
  141. type_info = type_model.select(type='fetchone')
  142. if type_info['unit'] == 'button':
  143. if switch == '1':
  144. oper = '升起'
  145. elif switch == '2':
  146. oper = '降下'
  147. elif switch == '5':
  148. oper = '停止'
  149. else:
  150. if switch == '1':
  151. oper = '开启'
  152. else:
  153. oper = '关闭'
  154. if msg:
  155. for v in queue:
  156. # 判断是否全部失败,全部失败,则将回执状态值
  157. old = False
  158. if state == False:
  159. mul_model.id = v['mul_id']
  160. info = mul_model.select(type='fetchone')
  161. model.mul_id = v['mul_id']
  162. model.status = 3
  163. queueMulNum = len(model.select())
  164. devicesNum = len(tuple(eval(info['devices'])))
  165. if queueMulNum == devicesNum:
  166. old = info['old']
  167. mul_model.id = v['mul_id']
  168. oper = oper + name + msg
  169. if old:
  170. mul_model.update(oper=oper, value=old)
  171. else:
  172. mul_model.update(oper=oper)
  173. return oper