123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- # -*- coding: utf-8 -*-
- """
- demeter database
- name:data.py
- author:rabin
- """
- from demeter.core import *
- from .__load__ import *
- import datetime
- import calendar
- #DROP MEASUREMENT "data_4_10021011"
- #DROP MEASUREMENT "data_2_10022011"
- class Data(Model):
- __table__ = 'data'
- def setTable(self, data=False):
- if data and 'farm' in data:
- self.table = self.__table__ + '_' + str(data['farm']) + '_' + str(data['device']) + '1'
- def insert(self, data):
- self.setTable(data)
- json = self.insert_json(data)
- self.db.write_points(json)
- value = str(data['farm']) + '__' + str(data['device']) + '__' + str(data['hard']) + '__' + str(data['type']) + '__' + str(data['gateway']) + '__' + str(data['source']) + '__' + str(data['value'])
- Demeter.service('core', 'zeus').rsync(self.table, value)
- def insert_json(self, data):
- json = [
- {
- "measurement": self.table,
- "tags": {
- "hard": data['hard'],
- "type":data['type'],
- "gateway": data['gateway']
- },
- #"time": data['time'],
- "fields": {
- 'source' : float(data['source']),
- 'value' : float(data['value'])
- }
- }]
- return json
- def get(self, farm, device, col='value', search='', exp=''):
- data = {}
- data['farm'] = farm
- data['device'] = device
- self.setTable(data)
- if search:
- search = ' where ' + search
- sql = 'select ' + col + ' from ' + self.table + search
- data = self.db.query(sql)
- value = []
- time = []
- rows = []
- utc_format = '%Y-%m-%dT%H:%M:%S'
- local_format = "%Y-%m-%d %H:%M:%S"
- if 'series' in data.raw and data.raw['series'][0]['values']:
- for values in data.raw['series'][0]['values']:
- if values[1]:
- v = float(round(values[1], 2))
- v = Demeter.exp(exp, v)
- temp = values[0].split('.')
- uformat = utc_format
- if len(temp) <= 1:
- uformat = utc_format + 'Z'
- utc = Demeter.mktime(temp[0], uformat) + 3600*8
- date = Demeter.date(utc, local_format)
- value.append(v)
- time.append(date)
- rows.append([date, v])
- return {'time':time, 'value':value, 'rows':rows}
- def getData(self, method, data, config):
- search = ''
- col = 'value'
- utc_format = '%Y-%m-%dT%H:%M:%SZ'
- if ('start' in data and data['start']) or ('end' in data and data['end']):
- if 'start' in data and data['start']:
- start = Demeter.mktime(data['start'])
- startDate = Demeter.date(start - 3600*8, utc_format)
- search = 'time > \'' + str(startDate) + '\''
- if 'end' in data and data['end']:
- end = Demeter.mktime(data['end'])
- endDate = Demeter.date(end - 3600*8, utc_format)
- search = search + ' and time < \'' + str(endDate) + '\''
- search = search + self.group(self.day(start, end))
- else:
- now = Demeter.time()
- search = search + self.group(self.day(start, now))
- elif 'group' in data and data['group']:
- value = data['group']
- time = 'time > now()'
- search = time + ' - ' + value + 'd' + self.group(int(value))
- result = []
- if method == 'avg':
- col = 'mean(value) as value'
- result.append(self.load(config, search, col, '平均'))
- elif method == 'maxmin':
- col = 'max(value) as value'
- result.append(self.load(config, search, col, '最高'))
- col = 'min(value) as value'
- result.append(self.load(config, search, col, '最低'))
- else:
- col = 'value'
- if 'group' in search:
- temp = search.split('group')
- search = temp[0]
- result.append(self.load(config, search, col, '明细'))
- return result
- def load(self, config, search, col, name):
- result = {}
- result['data'] = self.get(config['farm_id'], config['hardware_id'], search=search, col=col)
- result['name'] = name
- if result['data']:
- result['data']['time'] = json.dumps(result['data']['time'])
- result['data']['value'] = json.dumps(result['data']['value'])
- return result
- def group(self, day):
- if day >= 180:
- return ' group by time(10d)'
- elif day >= 30:
- return ' group by time(1d)'
- elif day >= 7:
- return ' group by time(60m)'
- elif day >= 1:
- return ' group by time(10m)'
- else:
- return ' group by time(1m)'
- def day(self, start, end):
- return math.ceil(round(float((end - start) / (3600*24))))
- def dateConfig(self):
- return [{'id':'1', 'name':'一天'},{'id':'7', 'name':'一周'},{'id':'30', 'name':'一个月'},{'id':'180', 'name':'半年'}]
|