Files
Stream_PHX_A7/Gateways/FE/projects/.resources/a9fde284188178e8d48e83afc3db9892c10288db980f06d5a99f45bf7c2469c9

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)