2026-04-24 FE Backup
This commit is contained in:
@@ -0,0 +1,170 @@
|
||||
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
|
||||
Reference in New Issue
Block a user