import os
import sys
from collections import OrderedDict
if "SUMO_HOME" in os.environ:
sys.path += [os.path.join(os.environ["SUMO_HOME"], "tools")]
import sumolib
def parseTimeSteps(inputFile):
result = {}
for timeStep in sumolib.xml.parse(inputFile, 'timestep'):
timestepFloat = float(timeStep.time)
result[timestepFloat] = {}
for vehicle in timeStep.vehicle or []:
result[timestepFloat][vehicle.id] = {}
result[timestepFloat][vehicle.id]["energyConsumed"] = float(vehicle.energyConsumed)
result[timestepFloat][vehicle.id]["totalEnergyConsumed"] = float(vehicle.totalEnergyConsumed)
result[timestepFloat][vehicle.id]["totalEnergyRegenerated"] = float(vehicle.totalEnergyRegenerated)
result[timestepFloat][vehicle.id]["energyChargedInTransit"] = float(vehicle.energyChargedInTransit)
result[timestepFloat][vehicle.id]["energyChargedStopped"] = float(vehicle.energyChargedStopped)
result[timestepFloat][vehicle.id]["timeStopped"] = float(vehicle.timeStopped)
return result
def writeTimeSteps(result, outputFile):
with open(outputFile, "w") as f:
sumolib.xml.writeHeader(f)
f.write("<battery-export>\n")
Step = sumolib.xml.compound_object('timestep', ['interval'])
for timeStep in result:
step = Step([str(timeStep[0]) + "-" + str(timeStep[1])])
for vehicleID in timeStep[2]:
vehicleAttributes = timeStep[2][vehicleID]
attrs = ("energyConsumed", "totalEnergyConsumed", "totalEnergyRegenerated",
"energyChargedInTransit", "energyChargedStopped", "timeStopped", "aggregateNumber")
attrValues = OrderedDict([("id", vehicleID)] + [(a, str(vehicleAttributes[a])) for a in attrs])
step.addChild('vehicle', attrValues, sortAttrs=False)
f.write(step.toXML(" "))
f.write("</battery-export>\n")
def processMatrix(matrix, timeToSplit):
result = []
lastValue = int(list(matrix.keys())[-1])
for timeStep in range(0, lastValue, timeToSplit):
if ((timeStep + timeToSplit - 1) > lastValue):
result.append([timeStep, lastValue, {}])
else:
result.append([timeStep, timeStep + timeToSplit - 1, {}])
timeStepCounter = 0
for timeStep in matrix:
if (result[timeStepCounter][1] < timeStep):
timeStepCounter += 1
for vehicleID in matrix[timeStep]:
vehicleMatrix = matrix[timeStep][vehicleID]
found = False
for vehicleIDResult in result[timeStepCounter][2]:
if ((vehicleIDResult == vehicleID) and not found):
vehicleResult = result[timeStepCounter][2][vehicleIDResult]
newVehicleAttributes = {}
newVehicleAttributes["energyConsumed"] = float(
vehicleResult["energyConsumed"]) + float(vehicleMatrix["energyConsumed"])
newVehicleAttributes["totalEnergyConsumed"] = float(
vehicleResult["totalEnergyConsumed"]) + float(vehicleMatrix["totalEnergyConsumed"])
newVehicleAttributes["totalEnergyRegenerated"] = float(
vehicleResult["totalEnergyRegenerated"]) + float(vehicleMatrix["totalEnergyRegenerated"])
newVehicleAttributes["energyChargedInTransit"] = float(
vehicleResult["energyChargedInTransit"]) + float(vehicleMatrix["energyChargedInTransit"])
newVehicleAttributes["energyChargedStopped"] = float(
vehicleResult["energyChargedStopped"]) + float(vehicleMatrix["energyChargedStopped"])
newVehicleAttributes["timeStopped"] = float(
vehicleResult["timeStopped"]) + float(vehicleMatrix["timeStopped"])
newVehicleAttributes["aggregateNumber"] = float(vehicleResult["aggregateNumber"]) + 1
result[timeStepCounter][2][vehicleIDResult] = newVehicleAttributes
found = True
if not found:
newVehicleAttributes = {}
newVehicleAttributes["energyConsumed"] = float(vehicleMatrix["energyConsumed"])
newVehicleAttributes["totalEnergyConsumed"] = float(vehicleMatrix["totalEnergyConsumed"])
newVehicleAttributes["totalEnergyRegenerated"] = float(vehicleMatrix["totalEnergyRegenerated"])
newVehicleAttributes["energyChargedInTransit"] = float(vehicleMatrix["energyChargedInTransit"])
newVehicleAttributes["energyChargedStopped"] = float(vehicleMatrix["energyChargedStopped"])
newVehicleAttributes["timeStopped"] = float(vehicleMatrix["timeStopped"])
newVehicleAttributes["aggregateNumber"] = 1.0
result[timeStepCounter][2][vehicleID] = newVehicleAttributes
return result
def main():
op = sumolib.options.ArgumentParser()
op.add_argument("-i", "--input", type=op.file, category="input", help="battery input file")
op.add_argument("-o", "--output", type=op.file, category="output", help="battery merged output file")
op.add_argument("-t", "--time", type=op.time, help="time to merge")
opts = op.parse_args()
matrix = parseTimeSteps(opts.input)
matrix = processMatrix(matrix, int(opts.time))
writeTimeSteps(matrix, opts.output)
if __name__ == "__main__":
main()