123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467 |
- # -*- coding: utf-8 -*-
- """
- demeter load
- author:rabin
- """
- from demeter.web import *
- from datetime 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']:
- self.data['setting']['userInfo'] = self.service('common').one('farm_user', id=self.data['setting']['user'].decode())
- self.data['setting']['farm'] = self.data['setting']['userInfo']['farm_id']
- else:
- return
- if 'farm' in self.data['setting'] and self.data['setting']['farm']:
- self.data['setting']['farmInfo'] = self.service('common').one('farm', id=self.data['setting']['farm'])
- if 'eros_status' in self.data['setting']['farmInfo'] and self.data['setting']['farmInfo']['eros_status'] == 1 and self.data['setting']['farmInfo']['eros_server']:
- self.data['url'] = 'http://' + self.data['setting']['farmInfo']['eros_server'] + ':8081'
-
- 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'] and 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'
- #inorder asc, type_id asc,udate asc,hardware_id asc
- return self.service('common').list('device_info', state=True, search=search, order='inorder asc, type_id asc, udate asc,hardware_id asc,cdate desc', 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']:
- type_info = self.service('common').one('setting_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:
- if value['value'] == '1.0':
- value['value'] = '1'
- 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('setting_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('setting_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
- 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']:
- info = self.service('common').one('setting_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
|