147 lines
5.6 KiB
Plaintext
147 lines
5.6 KiB
Plaintext
from datetime import datetime
|
|
import re
|
|
def getTagPaths(location=None):
|
|
"""
|
|
Get all the relvant tagpaths needed for the historian query
|
|
"""
|
|
baseTagPaths = reports.MBR.common.util.getBaseTagPaths(reports.MBR.common.static.getUPSBase(), location)
|
|
return baseTagPaths
|
|
|
|
def getPowerPaths(location):
|
|
paths = []
|
|
for ups1path, ups2path in getTagPaths(location):
|
|
paths.extend(["%s/Total kW"%ups1path, "%s/Total kW"%ups2path])
|
|
return paths
|
|
def getPowerHist(startDate,endDate, location=None):
|
|
tagpaths = getPowerPaths(location)
|
|
|
|
hist = reports.MBR.common.util.getHistory(tagpaths, startDate, endDate, customArgs={})
|
|
return reports.MBR.common.util.generateSumCol(hist, sumColName="SumTotalkW"), tagpaths
|
|
|
|
|
|
def averageHistData(histData, inclColumns, interval=None):
|
|
"""
|
|
Calculate the Average, Min Average, Max Average
|
|
Args:
|
|
data: historian data, expected in minute intervals
|
|
inclColumns: list of strings reprsenting the tagpath/column name from queryTagHistory
|
|
interval: grouping by minutes, None if daily
|
|
Returns:
|
|
dictionary containing calculated data
|
|
"""
|
|
data = system.dataset.toPyDataSet(histData)
|
|
res = {"MinAvg":-1,"MaxAvg":-1,"ResultData":None}
|
|
dailyGroup= {}
|
|
resultData = []
|
|
allAvgs = []
|
|
def getUPSName(inclNames):
|
|
newNames = []
|
|
for name in inclNames:
|
|
newNames.append(name.split("_")[-1].split("/")[0])
|
|
return newNames
|
|
if interval is None:
|
|
for row in data:
|
|
# dayStr = system.date.format(system.date.fromMillis(row["t_stamp"]),"yyyy-MM-dd")
|
|
dayStr = system.date.format(row["t_stamp"],"yyyy-MM-dd")
|
|
dailyGroup.setdefault(dayStr,{c:[] for c in inclColumns})
|
|
for c in inclColumns:
|
|
dailyGroup[dayStr][c].append(row[c])
|
|
|
|
|
|
|
|
sortedDateKeys = sorted(dailyGroup.keys(), key=lambda x: datetime.strptime(x, '%Y-%m-%d'))
|
|
for date_str in sortedDateKeys:
|
|
oneRow= [system.date.parse(date_str, "yyyy-MM-dd")]
|
|
for c in inclColumns:
|
|
cleanValues = [v for v in dailyGroup[date_str][c] if v is not None]
|
|
dailyAvg = sum(cleanValues)/len(cleanValues) if len(cleanValues) > 0 else 0
|
|
allAvgs.append(dailyAvg)
|
|
oneRow.append(dailyAvg)
|
|
resultData.append(oneRow)
|
|
|
|
else:
|
|
quarterHrStr = ""
|
|
for i,row in enumerate(data):
|
|
if i%interval == 0:
|
|
quarterHrStr = system.date.format(row["t_stamp"],"yyyy-MM-dd HH:mm")
|
|
dailyGroup.setdefault(quarterHrStr,{c:[] for c in inclColumns})
|
|
for c in inclColumns:
|
|
dailyGroup[quarterHrStr][c].append(row[c])
|
|
sortedDateKeys = sorted(dailyGroup.keys(), key=lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M'))
|
|
for dt_str in sortedDateKeys:
|
|
oneRow = [system.date.parse(dt_str, "yyyy-MM-dd HH:mm")]
|
|
for c in inclColumns:
|
|
# print dailyGroup[dt_str]
|
|
cleanValues = [v for v in dailyGroup[dt_str][c] if v is not None]
|
|
dtAvg = sum(cleanValues)/len(cleanValues) if len(cleanValues) > 0 else 0
|
|
allAvgs.append(dtAvg)
|
|
oneRow.append(dtAvg)
|
|
resultData.append(oneRow)
|
|
|
|
res["MinAvg"] = min(allAvgs) if len(allAvgs) > 0 and not all(x == 0 for x in allAvgs) else -1
|
|
res["MaxAvg"] = max(allAvgs) if len(allAvgs) > 0 and not all(x == 0 for x in allAvgs) else 1
|
|
res["SimpAvg"] = sum(allAvgs)/len(allAvgs) if len(allAvgs) > 0 else 0
|
|
res["Paths"] = inclColumns
|
|
|
|
# we're going to inject two new columns to resultData
|
|
for row in resultData:
|
|
row.extend([res["MinAvg"], res["MaxAvg"]])
|
|
|
|
res["ResultDS"] = system.dataset.toDataSet(["Date"]+["Unit%s"%(i+1) for i in range(len(inclColumns))]+["Min", "Max"], resultData)
|
|
# res["RawDS"] = data
|
|
return res
|
|
|
|
def getEqNamesByLoc(location):
|
|
mEqPaths = []
|
|
for ups1path, ups2path in getTagPaths(location):
|
|
mEqPaths.extend(["%s/Meta/EqName"%ups1path, "%s/Meta/EqName"%ups2path])
|
|
return [qv.value for qv in system.tag.readBlocking(mEqPaths)]
|
|
|
|
def getEqNamesByPath(paths):
|
|
mEqPaths = ["/".join(p.split("/")[:-1]) +"/Meta/EqName" for p in paths]
|
|
return [qv.value for qv in system.tag.readBlocking(mEqPaths)]
|
|
|
|
def processAverage(startDate, endDate, location, interval=None):
|
|
finalRes= {}
|
|
def getUPSName(tagpath):
|
|
return tagpath.split("_")[-1].split("/")[0][:-2] if "-"in tagpath else tagpath.split("_")[-1].split("/")[0][:-1]
|
|
def getRoomName(tagpath):
|
|
# return tagpath.split("/")[1].split("_")[1]
|
|
if "]" in tagpath:
|
|
return tagpath.split("/")[0].split("]")[1]
|
|
else:
|
|
return tagpath.split("/")[0]
|
|
|
|
|
|
histData, rawTagPaths = getPowerHist(startDate,endDate, location)
|
|
header = system.dataset.getColumnHeaders(histData)
|
|
# clone the header for actual tagpaths
|
|
rawTagPaths = [""]+rawTagPaths
|
|
# print header
|
|
allRows = []
|
|
newHeader = ["ChartName","MinAvg","MaxAvg","ChartDS", "SimpAvg"]
|
|
|
|
res = averageHistData(histData, ["SumTotalkW"], interval)
|
|
allRows.append(["Data Hall Total Loading", res["MinAvg"], res["MaxAvg"], res["ResultDS"], res["SimpAvg"]])
|
|
finalRes["TotalLoading"] = system.dataset.toDataSet(newHeader, allRows)
|
|
|
|
allRows= []
|
|
|
|
# Format the result
|
|
for i in range(1, len(header)-2, 2): # Start at index 1, step by 2 to get pairs
|
|
tag1, tag2 = header[i], header[i+1]
|
|
res = averageHistData(histData, [tag1,tag2], interval)
|
|
eq1,eq2 = reports.MBR.criticalpower.getEqNamesByPath([rawTagPaths[i], rawTagPaths[i+1]])
|
|
allRows.append([getRoomName(tag1)+" Loading", res["MinAvg"], res["MaxAvg"], res["ResultDS"], res["SimpAvg"], getUPSName(tag1), eq1, eq2])
|
|
|
|
finalRes["reportDS"] = system.dataset.toDataSet(newHeader+["ChartCategory", "Eq1", "Eq2"], allRows)
|
|
finalRes["rawDS"] = histData
|
|
# finalRes["NameLists"] = reports.MBR.criticalpower.getEqNames(location)
|
|
|
|
return finalRes
|
|
|
|
def doDailyReport(startDate, endDate, location=None):
|
|
return processAverage(startDate, endDate, location, None)
|
|
|
|
def doReportInterval(startDate, endDate, location=None, interval=15):
|
|
return processAverage(startDate, endDate, location, interval) |