170 lines
5.7 KiB
Plaintext
170 lines
5.7 KiB
Plaintext
import time
|
|
from datetime import datetime
|
|
Logger = system.util.getLogger("reports.MBR.totalpower")
|
|
def getTagPaths(location=None):
|
|
"""
|
|
Get all the relvant tagpaths needed for the historian query
|
|
"""
|
|
baseTagPaths = reports.MBR.common.util.getBaseTagPaths(reports.MBR.common.static.getPQMBase(), location)
|
|
return baseTagPaths
|
|
|
|
def getRealPowerPaths(location=None):
|
|
paths = []
|
|
for path in reports.MBR.common.util.getBaseTagPaths(reports.MBR.common.static.getPQMBase(), location):
|
|
paths.append(path+"/Real Power")
|
|
return paths
|
|
|
|
def getPDURealPowerPaths(location=None):
|
|
paths = []
|
|
for path in reports.MBR.common.util.getBaseTagPaths(reports.MBR.common.static.getPDUBase(), location):
|
|
paths.append(path+"/PQM/Real Power")
|
|
return paths
|
|
|
|
def getRawDataTotalLoad(startDate, endDate, location, customArgs= {}):
|
|
logger = Logger.createSubLogger("getRawDataTotalLoad")
|
|
logger.debug("BEGIN")
|
|
startDur = time.time()
|
|
tagpaths = getRealPowerPaths(location)
|
|
hist = reports.MBR.common.util.getHistory(tagpaths, startDate, endDate, customArgs={})
|
|
logger.debug("completed in %s"%(time.time()-startDur))
|
|
return hist
|
|
|
|
def getRawDataCriticalLoad(startDate, endDate, location, customArgs= {}):
|
|
logger = Logger.createSubLogger("getRawDataTotalLoad")
|
|
logger.debug("BEGIN")
|
|
startDur = time.time()
|
|
tagpaths = getPDURealPowerPaths(location)
|
|
hist = reports.MBR.common.util.getHistory(tagpaths, startDate, endDate, customArgs={})
|
|
|
|
logger.debug("completed in %s"%(time.time()-startDur))
|
|
return hist
|
|
|
|
def generateSumCol(hist):
|
|
return reports.MBR.common.util.generateSumCol(hist, sumColName="SumRealPwr")
|
|
# allHeaders = system.dataset.getColumnHeaders(hist)
|
|
#
|
|
# sumCol = []
|
|
# for row in hist:
|
|
# try:
|
|
# sumCol.append(sum([row[h] for h in allHeaders[1:] if row[h] is not None]))
|
|
# except:
|
|
# sumCol.append(0)
|
|
#
|
|
# return system.dataset.toPyDataSet(system.dataset.addColumn(hist, sumCol, "SumRealPwr", float))
|
|
|
|
def calculateValues(data, interval=15):
|
|
"""
|
|
Calculate the Average, Min Average, Max Average
|
|
Args:
|
|
data: historian data, expected in minute intervals
|
|
interval: grouping by minutes, None if daily
|
|
Returns:
|
|
dictionary containing calculated data
|
|
"""
|
|
data = system.dataset.toPyDataSet(data)
|
|
res = {"MinAvg":-1,"MaxAvg":-1,"ResultData":None}
|
|
dailyGroup= {}
|
|
resultData = []
|
|
allAvgs = []
|
|
rawSum = []
|
|
timeUnitStr = ""
|
|
GroupDict= {} # represents {"datetime":{"col1":[], "col2":[]...}}
|
|
histDsCols = ["SumRealPwr"]
|
|
resultData = []
|
|
# Construct / Group
|
|
for i,row in enumerate(data):
|
|
if i%interval == 0:
|
|
timeUnitStr = system.date.format(row["t_stamp"],"yyyy-MM-dd HH:mm")
|
|
GroupDict.setdefault(timeUnitStr, {})
|
|
GroupDict[timeUnitStr]={col:[] for col in histDsCols}
|
|
# GroupDict[quarterHrStr].append(row["SumRealPwr"])
|
|
for col in histDsCols:
|
|
colVal = row[col] if row[col] is not None else 0
|
|
rawSum.append(colVal)
|
|
GroupDict[timeUnitStr][col].append(row[col] if row[col] is not None else 0)
|
|
sortedDateKeys = sorted(GroupDict.keys(), key=lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M'))
|
|
# Create
|
|
for dt_str in sortedDateKeys:
|
|
colAvgs= [sum(GroupDict[dt_str][col])/len(GroupDict[dt_str][col]) for col in histDsCols]
|
|
allAvgs.append(colAvgs[0])
|
|
oneRow = [system.date.parse(dt_str, "yyyy-MM-dd HH:mm")]+ colAvgs
|
|
resultData.append(oneRow)
|
|
|
|
res["MinAvg"] = min(allAvgs) if len(allAvgs)> 0 else 0
|
|
res["MaxAvg"] = max(allAvgs) if len(allAvgs)> 0 else 0
|
|
res["RawMin"] = min(rawSum) if len(rawSum)> 0 else 0
|
|
res["RawMax"] = max(rawSum) if len(rawSum)> 0 else 0
|
|
|
|
res["ResultData"] = resultData
|
|
res["ResultDS"] = system.dataset.toDataSet(["Date", "Average"], resultData)
|
|
res["RawDS"] = data
|
|
return res
|
|
|
|
def generatePUE(mergedData):
|
|
"""
|
|
Calculate the PUE based on the time column.
|
|
Since there's only 3 columns, date/time, Average, AverageCritical
|
|
"""
|
|
headers = system.dataset.getColumnHeaders(mergedData)
|
|
axisHeader = headers[0]
|
|
newHeaders= [axisHeader, "PUE"]
|
|
allRows= []
|
|
singleVals = []
|
|
for row in system.dataset.toPyDataSet(mergedData):
|
|
try:
|
|
rowPUE = row["Average"]/row["AverageCritical"]
|
|
except:
|
|
rowPUE = -1
|
|
|
|
allRows.append([row[axisHeader], rowPUE])
|
|
singleVals.append(rowPUE)
|
|
|
|
return {"ResultDS":system.dataset.toDataSet(newHeaders, allRows),
|
|
"Min":min(singleVals),
|
|
"Max":max(singleVals)}
|
|
|
|
def getInputData(startDate, endDate, location=None, calcInterval=60):
|
|
"""
|
|
|
|
"""
|
|
final = {"TotalLoad":{}, "CriticalLoad":{}, "MergedDS":{}}
|
|
rawDataTotal = generateSumCol(getRawDataTotalLoad(startDate, endDate, location))
|
|
totalLoadDict = calculateValues(rawDataTotal, calcInterval)
|
|
final["TotalLoad"] = totalLoadDict
|
|
|
|
rawDataCritical = generateSumCol(getRawDataCriticalLoad(startDate, endDate, location))
|
|
totalCriticalDict = calculateValues(rawDataCritical, calcInterval)
|
|
final["CriticalLoad"] = totalCriticalDict
|
|
|
|
return final
|
|
|
|
def MergeTotalCritical(ds1,ds2):
|
|
# extract the rows of average from ds2
|
|
newCol =[]
|
|
for row in system.dataset.toPyDataSet(ds2):
|
|
newCol.append(row["Average"])
|
|
|
|
return system.dataset.addColumn(ds1, newCol, "AverageCritical", float)
|
|
def DoAll(startDate, endDate, location=None, interval= 60):
|
|
"""
|
|
Single call point for Report data fetch
|
|
"""
|
|
final = getInputData(startDate,endDate,location, interval)
|
|
|
|
try:
|
|
final["MergedDS"] = MergeTotalCritical(final["TotalLoad"]["ResultDS"],final["CriticalLoad"]["ResultDS"])
|
|
final["PUE"] = generatePUE(final["MergedDS"])
|
|
except:
|
|
final["MergedDS"] = final["TotalLoad"]["ResultDS"]
|
|
|
|
return final
|
|
|
|
def doAllInterval(startDate, endDate, location=None, intervalMins=15):
|
|
final = getInputData(startDate,endDate,location, intervalMins)
|
|
try:
|
|
final["MergedDS"] = MergeTotalCritical(final["TotalLoad"]["ResultDS"],final["CriticalLoad"]["ResultDS"])
|
|
final["PUE"] = generatePUE(final["MergedDS"])
|
|
except:
|
|
final["MergedDS"] = final["TotalLoad"]["ResultDS"]
|
|
|
|
return final |