2016-06-11 18:17:13 +02:00
|
|
|
'''
|
|
|
|
Created on 11. 06. 2016
|
|
|
|
|
|
|
|
@author: wn
|
|
|
|
'''
|
|
|
|
|
2016-06-11 18:35:46 +02:00
|
|
|
from __future__ import print_function
|
2016-06-11 18:17:13 +02:00
|
|
|
|
|
|
|
import xlrd
|
|
|
|
import xlwt
|
|
|
|
from xlutils.copy import copy
|
|
|
|
import pymongo
|
|
|
|
from bson.son import SON
|
|
|
|
import datetime
|
2016-06-11 18:35:46 +02:00
|
|
|
import time
|
|
|
|
|
2016-06-11 18:17:13 +02:00
|
|
|
|
2016-06-25 15:21:34 +02:00
|
|
|
DBHOST = '172.16.2.18'
|
2016-06-11 18:17:13 +02:00
|
|
|
DBNAME = 'iot'
|
|
|
|
DBCOLL = 'iot'
|
|
|
|
FILENAME = 'powerProfile.xls'
|
|
|
|
|
|
|
|
|
2016-06-25 15:21:34 +02:00
|
|
|
PIPELINE_DISHWASHER = [
|
2016-06-11 18:17:13 +02:00
|
|
|
{'$match':
|
|
|
|
{
|
|
|
|
'metadata.device':'MeterbusHub',
|
|
|
|
'metadata.timestamp':
|
|
|
|
{
|
2016-06-25 15:21:34 +02:00
|
|
|
'$gt': datetime.datetime(2016, 6, 11, 19, 20, 0),
|
|
|
|
'$lt': datetime.datetime(2016, 6, 11, 21, 15, 0)
|
2016-06-11 18:17:13 +02:00
|
|
|
},
|
|
|
|
'data.decodedTelegram.frame.comment':'Dishwasher'}
|
|
|
|
},
|
|
|
|
{'$project':
|
|
|
|
{
|
|
|
|
'_id':0,
|
|
|
|
'timestamp': '$metadata.timestamp',
|
|
|
|
'energy': '$data.energy',
|
|
|
|
'power': '$data.power'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{'$sort':
|
|
|
|
{'metadata.timestamp':1}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
|
2016-06-25 15:21:34 +02:00
|
|
|
PIPELINE_LAUNDRY = [
|
|
|
|
{'$match':
|
|
|
|
{
|
|
|
|
'metadata.device':'MeterbusHub',
|
|
|
|
'metadata.timestamp':
|
|
|
|
{
|
|
|
|
'$gt': datetime.datetime(2016, 6, 12, 15, 0, 0),
|
|
|
|
'$lt': datetime.datetime(2016, 6, 12, 18, 0, 0)
|
|
|
|
},
|
|
|
|
'data.decodedTelegram.frame.comment':'Laundry'}
|
|
|
|
},
|
|
|
|
{'$project':
|
|
|
|
{
|
|
|
|
'_id':0,
|
|
|
|
'timestamp': '$metadata.timestamp',
|
|
|
|
'energy': '$data.energy',
|
|
|
|
'power': '$data.power'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{'$sort':
|
|
|
|
{'metadata.timestamp':1}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
|
|
|
|
PIPELINE_FREEZER_POWER = [
|
|
|
|
{'$match':
|
|
|
|
{
|
|
|
|
'metadata.device':'MeterbusHub',
|
|
|
|
'metadata.timestamp':
|
|
|
|
{
|
|
|
|
'$gt': datetime.datetime(2016, 6, 12, 0, 0, 0),
|
|
|
|
'$lt': datetime.datetime(2016, 6, 12, 23, 59, 59)
|
|
|
|
},
|
|
|
|
'data.decodedTelegram.frame.comment':'Freezer'}
|
|
|
|
},
|
|
|
|
{'$project':
|
|
|
|
{
|
|
|
|
'_id':0,
|
|
|
|
'timestamp': '$metadata.timestamp',
|
|
|
|
'energy': '$data.energy',
|
|
|
|
'power': '$data.power'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{'$sort':
|
|
|
|
{'metadata.timestamp':1}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
|
|
|
|
PIPELINE_LIGHT = [
|
|
|
|
{'$match':
|
|
|
|
{
|
|
|
|
'metadata.device':'MeterbusHub',
|
|
|
|
'metadata.timestamp':
|
|
|
|
{
|
|
|
|
'$gt': datetime.datetime(2016, 6, 23, 0, 0, 0),
|
|
|
|
'$lt': datetime.datetime(2016, 6, 23, 23, 59, 59)
|
|
|
|
},
|
|
|
|
'data.decodedTelegram.frame.comment':'Light'}
|
|
|
|
},
|
|
|
|
{'$project':
|
|
|
|
{
|
|
|
|
'_id':0,
|
|
|
|
'timestamp': '$metadata.timestamp',
|
|
|
|
'energy': '$data.energy',
|
|
|
|
'power': '$data.power'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{'$sort':
|
|
|
|
{'metadata.timestamp':1}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
|
|
|
|
PIPELINE_FREEZER_TEMPERATURE = [
|
|
|
|
{'$match':
|
|
|
|
{
|
|
|
|
'metadata.device':'ModbusHub',
|
|
|
|
'metadata.Slave':'Thermometer',
|
|
|
|
'metadata.timestamp':
|
|
|
|
{
|
|
|
|
'$gt': datetime.datetime(2016, 6, 18, 0, 0, 0),
|
|
|
|
'$lt': datetime.datetime(2016, 6, 18, 23, 59, 59)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{'$project':
|
|
|
|
{
|
|
|
|
'_id':0,
|
|
|
|
'timestamp':'$metadata.timestamp',
|
|
|
|
'temperature': '$data.t2'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{'$sort':
|
|
|
|
{'metadata.timestamp':1}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
|
|
|
|
PIPELINE_OUTDOOR_TEMPERATURE = [
|
|
|
|
{'$match':
|
|
|
|
{
|
|
|
|
'metadata.device':'MeterbusHub',
|
|
|
|
'metadata.consumer': 'Thermometer',
|
|
|
|
'metadata.timestamp':
|
|
|
|
{
|
|
|
|
'$gt': datetime.datetime(2016, 6, 23, 0, 0, 0),
|
|
|
|
'$lt': datetime.datetime(2016, 6, 24, 23, 59, 59)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{'$project':
|
|
|
|
{
|
|
|
|
'_id':0,
|
|
|
|
'timestamp': '$metadata.timestamp',
|
|
|
|
'temperature1': '$data.temperature1',
|
|
|
|
'temperature2': '$data.temperature2',
|
|
|
|
'temperature3': '$data.temperature3',
|
|
|
|
'temperature4': '$data.temperature4'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{'$sort':
|
|
|
|
{'metadata.timestamp':1}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PIPELINE = PIPELINE_OUTDOOR_TEMPERATURE
|
2016-06-11 18:17:13 +02:00
|
|
|
|
2016-06-11 18:35:46 +02:00
|
|
|
class Stopwatch():
|
|
|
|
def millis(self):
|
|
|
|
return time.time() * 1000
|
|
|
|
def __init__(self, msg):
|
|
|
|
self.msg = msg
|
|
|
|
def __enter__(self):
|
|
|
|
self.start = self.millis()
|
|
|
|
print("{} ... ".format(self.msg), end="")
|
|
|
|
def __exit__(self, type, value, traceback):
|
|
|
|
duration = self.millis() - self.start
|
|
|
|
print("{}".format(duration))
|
|
|
|
|
|
|
|
|
2016-06-11 18:17:13 +02:00
|
|
|
class DataAdder(object):
|
|
|
|
def __init__(self, dbhost, dbname, dbcoll, filename, pipeline):
|
|
|
|
self.dbhost = dbhost
|
|
|
|
self.dbname = dbname
|
|
|
|
self.dbcoll = dbcoll
|
|
|
|
self.filename = filename
|
|
|
|
self.pipeline = pipeline
|
|
|
|
|
|
|
|
self.client = pymongo.MongoClient(dbhost)
|
|
|
|
self.db = self.client[self.dbname]
|
|
|
|
self.coll = self.db[self.dbcoll]
|
|
|
|
|
|
|
|
self.date_format = xlwt.XFStyle()
|
|
|
|
self.date_format.num_format_str = 'dd.mm.yyyy'
|
|
|
|
|
|
|
|
def openExcel(self):
|
|
|
|
self.excelW = xlwt.Workbook(encoding='ascii', style_compression=0)
|
|
|
|
self.sheetW = self.excelW.add_sheet('data')
|
|
|
|
|
|
|
|
|
|
|
|
def collectData(self):
|
|
|
|
cursor = self.coll.aggregate(
|
|
|
|
self.pipeline,
|
|
|
|
useCursor = True, allowDiskUse = True
|
|
|
|
)
|
|
|
|
return cursor
|
|
|
|
|
|
|
|
def run(self):
|
2016-06-11 18:35:46 +02:00
|
|
|
with Stopwatch("stage 1: collecting data"):
|
|
|
|
cursor = self.collectData()
|
|
|
|
with Stopwatch("stage 2: opening excel"):
|
|
|
|
self.openExcel()
|
|
|
|
with Stopwatch("stage 3: writing excel"):
|
|
|
|
for rownum, row in enumerate(cursor):
|
|
|
|
if (rownum == 0):
|
|
|
|
for pos, key in enumerate(row.iterkeys()):
|
|
|
|
self.sheetW.write(rownum, pos, key)
|
|
|
|
else:
|
|
|
|
for pos, value in enumerate(row.itervalues()):
|
|
|
|
if (type(value) not in [int, float]):
|
|
|
|
value = str(value)
|
|
|
|
self.sheetW.write(rownum, pos, value)
|
|
|
|
with Stopwatch("stage 4: saving excel"):
|
2016-06-11 18:17:13 +02:00
|
|
|
self.excelW.save(self.filename)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dataAdder = DataAdder(DBHOST, DBNAME, DBCOLL, FILENAME, PIPELINE)
|
2016-06-25 15:21:34 +02:00
|
|
|
dataAdder.run()
|