cron.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. demeter web
  5. name:admin.py
  6. author:rabin
  7. """
  8. import time
  9. from demeter.core import *
  10. from gevent import monkey; monkey.patch_socket()
  11. import gevent
  12. from pic import pic
  13. from demeter.mqtt import *
  14. # 处理定时命令、周期命令、条件控制、消息、设备状态等
  15. timeSleep = 10
  16. # 开关设备
  17. def switch(value):
  18. Demeter.service('device').switchMul(value)
  19. # 更改设备状态(离线)
  20. def device():
  21. while 1:
  22. model = Demeter.model('device_info')
  23. cur = Demeter.time() - 1800
  24. model.cdate.assgin(cur, '<=')
  25. model.status = True
  26. data = model.select()
  27. for v in data:
  28. model.id = v['id']
  29. if v['hardware_type'] == 5:
  30. model.update(value='0', status=False)
  31. elif v['hardware_type'] != 7 and v['hardware_type'] != 6:
  32. model.update(status=False)
  33. gevent.sleep(60)
  34. # 更改控制设备的超时状态
  35. def control():
  36. while 1:
  37. model = Demeter.model('device_info')
  38. cur = Demeter.time() - 10
  39. model.operdate.assgin(cur, '<=')
  40. model.oper = True
  41. model.hardware_type = 3
  42. service = Demeter.service('device')
  43. data = model.select()
  44. if data:
  45. for v in data:
  46. model.id = v['id']
  47. if v['exp'] == '-1':
  48. msg = service.notice('timeout')
  49. service.mul(v, v['name'] + '失败:' + msg, False)
  50. model.update(exp=msg, oper=True, operdate=Demeter.time())
  51. else:
  52. msg = '1'
  53. service.mul(v, '', True)
  54. model.update(exp=msg, oper=False, operdate=Demeter.time())
  55. gevent.sleep(1)
  56. gevent.sleep(1)
  57. # 批量控制的队列 这块有点乱,但时间太紧,只有两天时间,以后改造优化
  58. def mulQueue():
  59. while 1:
  60. mul_model = Demeter.model('device_mul')
  61. device_model = Demeter.model('device_info')
  62. model = Demeter.model('device_mul_queue')
  63. model.status = 1
  64. data = model.select(type='fetchone', order='inorder asc,udate asc,hardware_id asc')
  65. service = Demeter.service('device')
  66. # 查看当前有没有正在执行的设备,如果有,不能继续执行了
  67. msg = service.notice('timeout')
  68. device_model.oper = True
  69. device_model.exp.nq(msg)
  70. device_model.hardware_type = 3
  71. device = device_model.select(type='fetchone')
  72. if not device and data and not data['operstate']:
  73. service.switch(data['device_id'], switch=data['value'], mul=False, queue=data['id'])
  74. model.id = data['id']
  75. model.update(operstate=True)
  76. #mul_model.id = data['mul_id']
  77. #mul_model.update(oper='')
  78. # 将执行完成的进行清理
  79. mul_model.oper.nq('')
  80. data = mul_model.select()
  81. if data:
  82. for v in data:
  83. devicesNum = len(tuple(eval(v['devices'])))
  84. model.status.ins((2,3))
  85. cur = Demeter.time() - 10
  86. model.operdate.assgin(cur, '<=')
  87. queue = model.select()
  88. num = len(queue)
  89. if num == devicesNum:
  90. errorNum = 0
  91. model.mul_id = v['id']
  92. model.update(status=4)
  93. for qv in queue:
  94. if qv['status'] == 3:
  95. errorNum = errorNum + 1
  96. mul_model.id = v['id']
  97. if errorNum == devicesNum:
  98. mul_model.update(oper='', value=v['old'])
  99. else:
  100. mul_model.update(oper='')
  101. gevent.sleep(1)
  102. gevent.sleep(1)
  103. # 批量控制的队列清理,10小时清理一次24小时之前完成的数据
  104. def mulQueueDrop():
  105. while 1:
  106. num = 3600*24
  107. model = Demeter.model('device_mul_queue')
  108. model.status = 4
  109. cur = Demeter.time() - num
  110. model.operdate.assgin(cur, '<=')
  111. model.delete()
  112. gevent.sleep(36000)
  113. def timing():
  114. while 1:
  115. model = Demeter.model('device_set_timing')
  116. model.status = 0
  117. cur = Demeter.time()
  118. model.zdate.assgin(cur, '<=')
  119. data = model.select()
  120. if data:
  121. for value in data:
  122. switch(value)
  123. model.id = value['id']
  124. model.update(status=1)
  125. gevent.sleep(1)
  126. gevent.sleep(timeSleep)
  127. def loop():
  128. while 1:
  129. model = Demeter.model('device_set_loop')
  130. cur = Demeter.time()
  131. date = Demeter.date(cur, '%Y-%m-%d-%w-%H-%M')
  132. date = date.split('-')
  133. week = date[3]
  134. day = date[2]
  135. model.status = True
  136. model.hour = date[4]
  137. model.minute = date[5]
  138. data = model.select()
  139. if data:
  140. for value in data:
  141. state = False
  142. value['loop'] = value['loop'].split(',')
  143. if value['looptype'] == 2:
  144. if week in value['loop']:
  145. state = True
  146. elif value['looptype'] == 3:
  147. if day in value['loop']:
  148. state = True
  149. if state:
  150. switch(value)
  151. gevent.sleep(1)
  152. gevent.sleep(timeSleep)
  153. def savePic():
  154. while 1:
  155. pic()
  156. gevent.sleep(1800)
  157. # 同步时间,24小时同步一次
  158. def timeSync():
  159. while 1:
  160. pub = Pub()
  161. key = 'time/bh'
  162. value = Demeter.date(Demeter.time())
  163. pub.push(key, value)
  164. gevent.sleep(3600*24)
  165. def handle():
  166. gevent.joinall([
  167. gevent.spawn(timing),
  168. gevent.spawn(loop),
  169. gevent.spawn(device),
  170. gevent.spawn(savePic),
  171. #gevent.spawn(control),
  172. gevent.spawn(timeSync),
  173. gevent.spawn(mulQueue),
  174. gevent.spawn(mulQueueDrop),
  175. ])
  176. handle()