| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462 | 
							- #!/usr/bin/env python
 
- # -*- coding: utf-8 -*-
 
- """
 
-     demeter load
 
-     author:rabin
 
- """
 
- from demeter.web import *
 
- class Load(Base):
 
- 	KEYS = ('user', 'farm')
 
- 	def setting(self):
 
- 		self.user()
 
- 	def user(self):
 
- 		ajax = self.input('ajax')
 
- 		if ajax:
 
- 			self.data['ajax'] = True
 
- 		else:
 
- 			self.data['ajax'] = False
 
- 		self.data['auth'] = True
 
- 		if 'user' in self.data['setting'] and self.data['setting']['user'] > 0:
 
- 			self.data['setting']['userInfo'] = self.service('common').one('farm_user', id=self.data['setting']['user'])
 
- 			self.data['setting']['farm'] = self.data['setting']['userInfo']['farm_id']
 
- 		else:
 
- 			return
 
- 		if 'farm' in self.data['setting'] and self.data['setting']['farm'] > 0:
 
- 			self.data['setting']['farmInfo'] = self.service('common').one('farm', id=self.data['setting']['farm'])
 
- 			self.data['setting']['farmInfo']['gateways'] = ''
 
- 			if self.data['setting']['farmInfo']['gateway']:
 
- 				self.data['setting']['farmInfo']['gateways'] = tuple(eval(self.data['setting']['farmInfo']['gateway']))
 
- 		self.data['setting']['msgNum'] = len(self.service('common').list('msg', search={'status':False, "farm_id":self.data['setting']['farm']}, limit='0,100'))
 
- 		if self.data['setting']['msgNum'] > 99:
 
- 			self.data['setting']['msgNum'] = str(99) + '+'
 
- 		#self.data['setting']['msg'] = self.service('common').one('msg', type_id=3)
 
- 		self.data['setting']['web'] = Demeter.config['web']['url']
 
- 		self.data['setting']['farmurl'] = Demeter.config['web']['farmurl']
 
- 		cur = 'main'
 
- 		if '/' in self.request.uri:
 
- 			temp = self.request.uri.split('/')
 
- 			slen = len(temp)
 
- 			if slen > 1 and temp[1]:
 
- 				cur = temp[1]
 
- 		self.data['setting']['cur'] = cur
 
- class Device(object):
 
- 	@staticmethod
 
- 	def init(self, search={}):
 
- 		type = self.input('type')
 
- 		id = self.input('id')
 
- 		if not id:
 
- 			self.view('404.html')
 
- 			return (None, type)
 
- 		if 'stat' in self.request.uri:
 
- 			self.data['device_cur'] = 'stat'
 
- 		elif 'log' in self.request.uri:
 
- 			self.data['device_cur'] = 'log'
 
- 		elif 'pic' in self.request.uri:
 
- 			self.data['device_cur'] = 'pic'
 
- 		else:
 
- 			self.data['device_cur'] = 'data'
 
- 		self.data['show'] = True
 
- 		self.data['url'] = Device.url('type='+type+'&id=' + id)
 
- 		if not search:
 
- 			search = {}
 
- 		self.data['info'] = {}
 
- 		self.data['device'] = []
 
- 		if type == 'gateway':
 
- 			self.data['info'] = self.service('common').one('device_gateway', id=id)
 
- 			if not self.data['info']:
 
- 				self.view('404.html')
 
- 				return (None, type)
 
- 			search['gateway_id'] = id
 
- 			self.data['device'] = Device.get(self, search=search)
 
- 			if self.data['device_cur'] in ('stat', 'log'):
 
- 				self.data['pic'] = Device.get(self, search={'gateway_id':id, 'hardware_type':6})
 
- 		elif type == 'page':
 
- 			self.data['info'] = self.service('common').one('device_page', id=id)
 
- 			if not self.data['info']:
 
- 				self.view('404.html')
 
- 				return (None, type)
 
- 			search['page_id'] = id
 
- 			self.data['group'] = self.service('common').list('device_group', search={'page_id':id}, order='inorder asc,cdate desc')
 
- 			if self.data['group']:
 
- 				Device.group(self, search)
 
- 		else:
 
- 			self.data['info'] = self.data['setting']['farmInfo']
 
- 			if not self.data['info']:
 
- 				self.view('404.html')
 
- 				return (None, type)
 
- 			self.data['device'] = Device.get(self, search=search)
 
- 		if not self.data['device'] or not self.data['info']:
 
- 			self.view('404.html')
 
- 			return (None, type)
 
- 		self.data['input'] = {}
 
- 		self.data['input']['type'] = type
 
- 		self.data['input']['id'] = id
 
- 		return (id, type)
 
- 	@staticmethod
 
- 	def set(self):
 
- 		if 'condition' in self.request.uri:
 
- 			self.data['set_cur'] = 'condition'
 
- 		elif 'timing' in self.request.uri:
 
- 			self.data['set_cur'] = 'timing'
 
- 		elif 'loop' in self.request.uri:
 
- 			self.data['set_cur'] = 'loop'
 
- 		else:
 
- 			self.data['set_cur'] = 'mul'
 
- 		self.data['url'] = Device.setUrl()
 
- 	@staticmethod
 
- 	def setCronOper(self):
 
- 		self.data['oper'] = ({'id':1, 'name':'打开'},{'id':2, 'name':'关闭'})
 
- 		self.data['looptype'] = ({'id':1, 'name':'按日周期', 'list':'每天'},{'id':2, 'name':'按周周期', 'list':'每周'}, {'id': 3, 'name': '按月周期', 'list':'每月'})
 
- 		self.data['opers'] = ({'id':1, 'name':'无操作'}, {'id':2, 'name':'打开'},{'id':3, 'name':'关闭'})
 
- 		self.data['week'] = ({'id':1, 'name':'周一'},{'id':2, 'name':'周二'}, {'id': 3, 'name': '周三'}, {'id': 4, 'name': '周四'}, {'id': 5, 'name': '周五'}, {'id': 6, 'name': '周六'}, {'id': 7, 'name': '周日'})
 
- 		self.data['condition'] = ({'id':1, 'name':'大于', 'exp':'>'}, {'id':2, 'name':'小于', 'exp':'<'},{'id':3, 'name':'等于','exp':'='})
 
- 		self.data['day'] = []
 
- 		for i in range(31):
 
- 			i = i + 1
 
- 			self.data['day'].append({'id':i, 'name':i})
 
- 		self.data['hour'] = []
 
- 		for i in range(24):
 
- 			i = i + 1
 
- 			self.data['hour'].append({'id':i, 'name':Demeter.hour(i)})
 
- 		self.data['minute'] = []
 
- 		for i in range(60):
 
- 			self.data['minute'].append({'id':i, 'name':Demeter.hour(i)})
 
- 	@staticmethod
 
- 	def get(self, search):
 
- 		if 'id--ins' in search and search['id--ins']:
 
- 			search['id--ins'] = tuple(eval(search['id--ins']))
 
- 			#order='inorder asc, type_id asc,udate asc,id asc'
 
- 		return self.service('common').list('device_info', state=True, search=search, order='inorder asc, type_id asc,udate asc,hardware_id asc', limit='0,10000')
 
- 	@staticmethod
 
- 	def getByGateway(self, search={}):
 
- 		device = Device.get(self, search=search)
 
- 		result = {}
 
- 		if device:
 
- 			for value in device:
 
- 				if value['gateway_id'] not in result:
 
- 					result[value['gateway_id']] = []
 
- 				result[value['gateway_id']].append(value)
 
- 		return result
 
- 	@staticmethod
 
- 	def data(self):
 
- 		id, type = Device.init(self)
 
- 		if not id:
 
- 			return
 
- 		method = type + '_data'
 
- 		if hasattr(Device, method):
 
- 			func = getattr(Device, method)
 
- 			data = func(self, id)
 
- 		else:
 
- 			self.view('404.html')
 
- 			return
 
- 		#self.data = dict(self.data, **data)
 
- 	@staticmethod
 
- 	def gateway_data(self, id):
 
- 		power = []
 
- 		sensor = []
 
- 		control = []
 
- 		self.data['stat'] = {}
 
- 		self.data['pic'] = []
 
- 		self.data['camera'] = []
 
- 		if self.data['device']:
 
- 			for value in self.data['device']:
 
- 				if value['type_id'] > 0:
 
- 					type_info = self.service('common').one('device_type', id=value['type_id'])
 
- 					value['unit'] = type_info['unit']
 
- 					value['typeName'] = type_info['name']
 
- 				# 获取网关状态
 
- 				if value['hardware_type'] == 5:
 
- 					power.append(value)
 
- 				# 获取电源设备
 
- 				if value['hardware_type'] == 4:
 
- 					#value['value'] = Demeter.exp(value['out_exp'], value['value'])
 
- 					power.append(value)
 
- 					"""
 
- 					if not self.data['stat']:
 
- 						self.data['stat'] = value
 
- 					"""
 
- 				# 获取采集设备
 
- 				if value['hardware_type'] == 2:
 
- 					#value['value'] = Demeter.exp(value['out_exp'], value['value'])
 
- 					sensor.append(value)
 
- 					if not self.data['stat']:
 
- 						self.data['stat'] = value
 
- 				# 获取控制设备
 
- 				if value['hardware_type'] == 3:
 
- 					control.append(value)
 
- 				# 获取摄像头
 
- 				if value['hardware_type'] == 6:
 
- 					value['value'] = value['value'] + '?' + Demeter.date(Demeter.time(), '%Y%m%d%H')
 
- 					self.data['pic'].append(value)
 
- 				# 获取摄像机
 
- 				if value['hardware_type'] == 7:
 
- 					self.data['camera'].append(value)
 
- 		"""
 
- 		if power:
 
- 			power.reverse()
 
- 		"""
 
- 		self.data['list'] = ({'name': '设备状态', 'device': power}, {'name': '数据采集', 'device': sensor}, {'name': '实时设备控制', 'device': control})
 
- 	@staticmethod
 
- 	def page_data(self, id):
 
- 		self.data['list'] = self.data['group']
 
- 	@staticmethod
 
- 	def group(self, search):
 
- 		self.data['show'] = False
 
- 		self.data['pic'] = []
 
- 		self.data['camera'] = []
 
- 		self.data['stat'] = {}
 
- 		for key, value in enumerate(self.data['group']):
 
- 			if value['devices']:
 
- 				search['id--ins'] = value['devices']
 
- 				if self.data['device_cur'] == 'stat':
 
- 					search['hardware_type--ins'].append(6)
 
- 				self.data['group'][key]['device'] = Device.get(self, search=search)
 
- 				if self.data['group'][key]['device']:
 
- 					for k, v in enumerate(self.data['group'][key]['device']):
 
- 						if v['hardware_type'] == 2 or v['hardware_type'] == 4:
 
- 							#v['value'] = Demeter.exp(v['out_exp'], v['value'])
 
- 							if v['hardware_type'] == 2 and self.data['info']['stat'] == True and not self.data['stat']:
 
- 								self.data['stat'] = v
 
- 							self.data['show'] = True
 
- 						if v['type_id'] > 0:
 
- 							type_info = self.service('common').one('device_type', id=v['type_id'])
 
- 							self.data['group'][key]['device'][k]['unit'] = type_info['unit']
 
- 							self.data['group'][key]['device'][k]['typeName'] = type_info['name']
 
- 						if self.data['device_cur'] == 'data':
 
- 							if v['hardware_type'] == 6:
 
- 								slen = len(self.data['group'][key]['device'])
 
- 								if slen < 2:
 
- 									del self.data['group'][key]['device']
 
- 									v['name'] = self.data['group'][key]['name']
 
- 								v['value'] = v['value'] + '?' + Demeter.date(Demeter.time(), '%Y%m%d%H')
 
- 								self.data['pic'].append(v)
 
- 							if v['hardware_type'] == 7:
 
- 								slen = len(self.data['group'][key]['device'])
 
- 								if slen < 2:
 
- 									del self.data['group'][key]['device']
 
- 									v['name'] = self.data['group'][key]['name']
 
- 								self.data['camera'].append(v)
 
- 						if self.data['device_cur'] == 'stat':
 
- 							if v['hardware_type'] == 6:
 
- 								self.data['pic'] = True
 
- 							else:
 
- 								self.data['device'].append(v)
 
- 						else:
 
- 							self.data['device'].append(v)
 
- 	@staticmethod
 
- 	def pic(self):
 
- 		id, type = Device.init(self, search={'hardware_type':6})
 
- 		if not id:
 
- 			return
 
- 		state = Device.get(self, search={'hardware_type--ins':(2,4)})
 
- 		if state:
 
- 			self.data['show'] = True
 
- 		device = self.input('device')
 
- 		if not device:
 
- 			#如果没有,就获取第一个
 
- 			self.data['deviceInfo'] = self.data['device'][0]
 
- 		else:
 
- 			self.data['deviceInfo'] = self.service('common').one('device_info', id=device)
 
- 		if not self.data['deviceInfo']:
 
- 			self.view('404.html')
 
- 			return
 
- 		self.data['pic'] = self.service('common').list('device_pic', search={'device_id':self.data['deviceInfo']['id']}, page={'num':12}, order='sdate desc')
 
- 		if self.data['pic']:
 
- 			for key, value in enumerate(self.data['pic']):
 
- 				self.data['pic'][key]['cdates'] = Demeter.date(value['sdate'])
 
- 	@staticmethod
 
- 	def statBase(self, deviceInfo={}, device = False):
 
- 		
 
- 		if not device:
 
- 			device = self.input('device')
 
- 		method = self.input('method', 'maxmin')
 
- 		if not device:
 
- 			#如果没有,就获取sensor的第一个
 
- 			self.data['deviceInfo'] = deviceInfo
 
- 		else:
 
- 			self.data['deviceInfo'] = self.service('common').one('device_info', id=device)
 
- 		if not self.data['deviceInfo']:
 
- 			self.view('404.html')
 
- 			return
 
- 		self.data['type'] = self.service('common').one('device_type', id=self.data['deviceInfo']['type_id'])
 
- 		model = Demeter.model('data', 'tsdb')
 
- 		self.data['group'] = model.dateConfig()
 
- 		search_group = self.input('group')
 
- 		search_start = self.input('start')
 
- 		search_end = self.input('end')
 
- 		search = {}
 
- 		search['device'] = self.data['deviceInfo']['id']
 
- 		if search_group:
 
- 			search['group'] = search_group
 
- 		else:
 
- 			search['group'] = '1'
 
- 		if search_start:
 
- 			search['start'] = search_start
 
- 		if search_end:
 
- 			search['end'] = search_end
 
- 		search['type'] = type
 
- 		search['id'] = id
 
- 		self.data['search'] = search
 
- 		self.data['statList'] = model.getData(method, search, self.data['deviceInfo'])
 
- 		return self.data
 
- 	@staticmethod
 
- 	def stat(self):
 
- 		id, type = Device.init(self, search={'hardware_type--ins':[2,4]})
 
- 		if not id:
 
- 			return
 
- 		device = self.input('device')
 
- 		Device.statBase(self, self.data['device'][0], device)
 
- 		self.data['url'] = Device.url('type='+type+'&id=' + id)
 
- 	@staticmethod
 
- 	def out(self):
 
- 		id, type = Device.init(self, search={'hardware_type--ins':[2,4]})
 
- 		if not id:
 
- 			return
 
- 		out = self.input('out')
 
- 		if not out:
 
- 			device = self.inputs('device')
 
- 			data = []
 
- 			header = []
 
- 			datas = {}
 
- 			header.append('日期')
 
- 			for i in device:
 
- 				result = Device.statBase(self, self.data['device'][0], i)
 
- 				if result['statList']:
 
- 					header.append(result['deviceInfo']['name'])
 
- 					for t,v in result['statList'][0]['data']['rows']:
 
- 						if t not in datas:
 
- 							datas[t] = [t,v]
 
- 						else:
 
- 							datas[t].append(v)
 
- 			self.data['url'] = Device.url('type='+type+'&id=' + id)
 
- 			if datas:
 
- 				import csv,codecs
 
- 				from datetime import *
 
- 				import uuid
 
- 				dates = sorted(datas.keys())
 
- 				newData = []
 
- 				for i in dates:
 
- 					newData.append(datas[i])
 
- 				data = newData
 
- 				data.insert(0, header)
 
- 				fileData = data
 
- 				day = str(date.today())
 
- 				day = day.split('-')
 
- 				file_name =  self.data['info']['name'] + '.csv'
 
- 				file_path = day[0] + '/' + day[1] + '/' + day[2]
 
- 				file_path = File.mkdirs(os.path.join(Demeter.path, 'runtime','upload', file_path)) + '/' + file_name
 
- 				with open(file_path, 'w') as f:
 
- 					f.write(codecs.BOM_UTF8)
 
- 					writer = csv.writer(f)
 
- 					for row in fileData:
 
- 						writer.writerow(row)
 
- 				url = self.request.protocol + "://" + self.request.host
 
- 				file_path = url + file_path.replace(Demeter.path + 'runtime', '')
 
- 				self.set_header("Content-Type","text/csv,charset=UTF-8")
 
- 				self.set_header('Content-Disposition', 'attachment; filename=' + file_name)
 
- 				self.redirect(file_path)
 
- 		else:
 
- 			self.data['search'] = {}
 
- 	@staticmethod
 
- 	def log(self):
 
- 		id, type = Device.init(self)
 
- 		if not id:
 
- 			return
 
- 		ids = []
 
- 		device_type = {}
 
- 		device_hard = {}
 
- 		device_list = []
 
- 		for value in self.data['device']:
 
- 			ids.append(value['id'])
 
- 			value['cdates'] = Demeter.date(value['udate'], '%Y.%m.%d')
 
- 			if value['type_id'] > 0:
 
- 				info = self.service('common').one('device_type', id=value['type_id'])
 
- 				if info['id'] not in device_type:
 
- 					device_type[info['id']] = {'name':info['name'], 'num':1, 'cdate':value['cdates']}
 
- 				else:
 
- 					num = device_type[info['id']]['num'] + 1
 
- 					device_type[info['id']] = {'name':info['name'], 'num':num, 'cdate':value['cdates']}
 
- 			elif '网关' in value['name']:
 
- 				value['name'] = '通讯网关'
 
- 				device_list.append({'name':value['name'], 'num':1, 'cdate':value['cdates']})
 
- 			elif value['hardware_type'] > 0:
 
- 				info = self.service('common').one('hardware_type', id=value['hardware_type'])
 
- 				if info['id'] not in device_hard:
 
- 					device_hard[info['id']] = {'name':info['name'], 'num':1, 'cdate':value['cdates']}
 
- 				else:
 
- 					num = device_hard[info['id']]['num'] + 1
 
- 					device_hard[info['id']] = {'name':info['name'], 'num':num, 'cdate':value['cdates']}
 
- 		if device_hard:
 
- 			for key, value in device_hard.items():
 
- 				device_list.append({'name':value['name'], 'num':value['num'], 'cdate':value['cdate']})
 
- 		if device_type:
 
- 			for key, value in device_type.items():
 
- 				device_list.append({'name':value['name'], 'num':value['num'], 'cdate':value['cdate']})
 
- 		
 
- 		self.data['list'] = device_list
 
- 		# 获取设备日志
 
- 		self.data['logs'] = self.service('common').list('msg', state=True, search={'device_id-input-ins':ids}, page={'num':6})
 
- 		if self.data['logs']:
 
- 			for key, value in enumerate(self.data['logs']):
 
- 				type_info = self.service('common').one('msg_type', id=value['type_id'])
 
- 				self.data['logs'][key]['type'] = type_info['name']
 
- 				self.data['logs'][key]['cdates'] = Demeter.date(value['cdate'])
 
- 	@staticmethod
 
- 	def url(param):
 
- 		config = {}
 
- 		config['data'] = '/device/data?' + param;
 
- 		config['stat'] = '/device/stat?' + param;
 
- 		config['log'] = '/device/log?' + param;
 
- 		config['pic'] = '/device/pic?' + param;
 
- 		config['out'] = '/device/out?' + param + '&out=1';
 
- 		return config
 
- 	@staticmethod
 
- 	def setUrl():
 
- 		config = {}
 
- 		config['mul'] = '/device/set_mul'
 
- 		config['timing'] = '/device/set_timing'
 
- 		config['loop'] = '/device/set_loop'
 
- 		config['condition'] = '/device/set_condition'
 
- 		return config
 
 
  |