| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 | #!/usr/bin/env python# -*- coding: utf-8 -*-"""    demeter web    name:admin.py    author:rabin"""import timefrom demeter.core import *from gevent import monkey; monkey.patch_socket()import geventfrom pic import picfrom demeter.mqtt import *# 处理定时命令、周期命令、条件控制、消息、设备状态等timeSleep = 10# 开关设备def switch(value):	Demeter.service('device').switchMul(value)				# 更改设备状态(离线)def device():	while 1:		model = Demeter.model('device_info')		cur = Demeter.time() - 1800		model.cdate.assgin(cur, '<=')		model.status = True		data = model.select()		for v in data:			model.id = v['id']			if v['hardware_type'] == 5:				model.update(value='0', status=False)			elif v['hardware_type'] != 7 and v['hardware_type'] != 6:				model.update(status=False)		gevent.sleep(60)# 更改控制设备的超时状态def control():	while 1:		model = Demeter.model('device_info')		cur = Demeter.time() - 10		model.operdate.assgin(cur, '<=')		model.oper = True		model.hardware_type = 3		service = Demeter.service('device')		data = model.select()		if data:			for v in data:				model.id = v['id']				if v['exp'] == '-1':					msg = service.notice('timeout')					service.mul(v, v['name'] + '失败:' + msg, False)					model.update(exp=msg, oper=True, operdate=Demeter.time())				else:					msg = '1'					service.mul(v, '', True)					model.update(exp=msg, oper=False, operdate=Demeter.time())		gevent.sleep(1)		# 批量控制的队列 这块有点乱,但时间太紧,只有两天时间,以后改造优化def mulQueue():	while 1:		mul_model = Demeter.model('device_mul')		device_model = Demeter.model('device_info')		model = Demeter.model('device_mul_queue')		model.status = 1		data = model.select(type='fetchone', order='inorder asc,udate asc,hardware_id asc')		service = Demeter.service('device')		# 查看当前有没有正在执行的设备,如果有,不能继续执行了		msg = service.notice('timeout')		device_model.oper = True		device_model.exp.nq(msg)		device_model.hardware_type = 3		device = device_model.select(type='fetchone')		if not device and data and not data['operstate']:			service.switch(data['device_id'], switch=data['value'], mul=False, queue=data['id'])			model.id = data['id']			model.update(operstate=True)			#mul_model.id = data['mul_id']			#mul_model.update(oper='')		# 将执行完成的进行清理		mul_model.oper.nq('')		data = mul_model.select()		if data:			for v in data:				devicesNum = len(tuple(eval(v['devices'])))				model.status.ins((2,3))				cur = Demeter.time() - 10				model.operdate.assgin(cur, '<=')				queue = model.select()				num = len(queue)				if num == devicesNum:					errorNum = 0					model.mul_id = v['id']					model.update(status=4)					for qv in queue:						if qv['status'] == 3:							errorNum = errorNum + 1					mul_model.id = v['id']					if errorNum == devicesNum:						mul_model.update(oper='', value=v['old'])					else:						mul_model.update(oper='')		gevent.sleep(1)# 批量控制的队列清理,10小时清理一次24小时之前完成的数据def mulQueueDrop():	while 1:		num = 3600*24		model = Demeter.model('device_mul_queue')		model.status = 4		cur = Demeter.time() - num		model.operdate.assgin(cur, '<=')		model.delete()		gevent.sleep(36000)def timing():	while 1:		model = Demeter.model('device_set_timing')		model.status = 0		cur = Demeter.time()		model.zdate.assgin(cur, '<=')		data = model.select()		if data:			for value in data:				switch(value)				model.id = value['id']				model.update(status=1)		gevent.sleep(timeSleep)def loop():	while 1:		model = Demeter.model('device_set_loop')		cur = Demeter.time()		date = Demeter.date(cur, '%Y-%m-%d-%w-%H-%M')		date = date.split('-')		week = date[3]		day = date[2]		model.status = True		model.hour = date[4]		model.minute = date[5]		data = model.select()		if data:			for value in data:				state = False				value['loop'] = value['loop'].split(',')				if value['looptype'] == 2:					if week in value['loop']:						state = True				elif value['looptype'] == 3:					if day in value['loop']:						state = True				if state:					switch(value)		gevent.sleep(timeSleep)def savePic():	while 1:		pic()		gevent.sleep(1800)# 同步时间,24小时同步一次def timeSync():	while 1:		pub = Pub()		key = 'time/bh'		value = Demeter.date(Demeter.time())		pub.push(key, value)		gevent.sleep(3600*24)def handle():	gevent.joinall([		gevent.spawn(timing),		gevent.spawn(loop),		gevent.spawn(device),		gevent.spawn(savePic),		gevent.spawn(control),		gevent.spawn(timeSync),		gevent.spawn(mulQueue),		gevent.spawn(mulQueueDrop),	])handle()
 |