cron.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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() - 500
  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. type_model = Demeter.model('device_type')
  39. cur = Demeter.time() - 10
  40. model.cdate.assgin(cur, '<=')
  41. model.oper = True
  42. model.hardware_type = 3
  43. service = Demeter.service('device')
  44. data = model.select()
  45. if data:
  46. for v in data:
  47. model.id = v['id']
  48. if v['exp'] == '-1':
  49. msg = service.notice('timeout')
  50. service.mul(v['id'], v['type_id'], v['name'], v['cxnum'], '失败:' + msg, False)
  51. model.update(exp=msg)
  52. else:
  53. msg = '1'
  54. service.mul(v['id'], v['type_id'], v['name'], v['cxnum'], '', True)
  55. model.update(exp=msg, oper=False)
  56. gevent.sleep(timeSleep)
  57. # 批量控制的队列
  58. def mulQueue():
  59. while 1:
  60. model = Demeter.model('device_mul_queue')
  61. model.status = 1
  62. data = model.select(type='fetchone', order='device_id asc')
  63. service = Demeter.service('device')
  64. if data and not data['oper']:
  65. model.id = data['id']
  66. service.switch(data['device_id'], switch=data['value'])
  67. model.update(oper=True)
  68. gevent.sleep(1)
  69. # 批量控制的队列清理,10小时清理一次24小时之前完成的数据
  70. def mulQueueDrop():
  71. while 1:
  72. num = 3600*24
  73. model = Demeter.model('device_mul_queue')
  74. model.status.ins((2,3))
  75. cur = Demeter.time() - num
  76. model.cdate.assgin(cur, '<=')
  77. model.delete()
  78. gevent.sleep(36000)
  79. def timing():
  80. while 1:
  81. model = Demeter.model('device_set_timing')
  82. model.status = 0
  83. cur = Demeter.time()
  84. model.zdate.assgin(cur, '<=')
  85. data = model.select()
  86. if data:
  87. for value in data:
  88. switch(value)
  89. model.id = value['id']
  90. model.update(status=1)
  91. gevent.sleep(timeSleep)
  92. def loop():
  93. while 1:
  94. model = Demeter.model('device_set_loop')
  95. cur = Demeter.time()
  96. date = Demeter.date(cur, '%Y-%m-%d-%w-%H-%M')
  97. date = date.split('-')
  98. week = date[3]
  99. day = date[2]
  100. model.status = True
  101. model.hour = date[4]
  102. model.minute = date[5]
  103. data = model.select()
  104. if data:
  105. for value in data:
  106. state = False
  107. value['loop'] = value['loop'].split(',')
  108. if value['looptype'] == 2:
  109. if week in value['loop']:
  110. state = True
  111. elif value['looptype'] == 3:
  112. if day in value['loop']:
  113. state = True
  114. if state:
  115. switch(value)
  116. gevent.sleep(timeSleep)
  117. def savePic():
  118. while 1:
  119. pic()
  120. gevent.sleep(1800)
  121. # 同步时间,24小时同步一次
  122. def timeSync():
  123. while 1:
  124. pub = Pub()
  125. key = 'time/bh'
  126. value = Demeter.date(Demeter.time())
  127. pub.push(key, value)
  128. gevent.sleep(3600*24)
  129. def handle():
  130. gevent.joinall([
  131. gevent.spawn(timing),
  132. gevent.spawn(loop),
  133. gevent.spawn(device),
  134. gevent.spawn(savePic),
  135. gevent.spawn(control),
  136. gevent.spawn(timeSync),
  137. gevent.spawn(mulQueue),
  138. gevent.spawn(mulQueueDrop),
  139. ])
  140. handle()