eflips-depot 4.15.1__py3-none-any.whl → 4.15.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of eflips-depot might be problematic. Click here for more details.
- eflips/depot/api/private/depot.py +18 -17
- eflips/depot/api/private/results_to_database.py +6 -1
- eflips/depot/api/private/util.py +1 -0
- eflips/depot/processes.py +19 -3
- eflips/depot/rating.py +1 -1
- eflips/depot/simple_vehicle.py +12 -1
- {eflips_depot-4.15.1.dist-info → eflips_depot-4.15.3.dist-info}/METADATA +1 -1
- {eflips_depot-4.15.1.dist-info → eflips_depot-4.15.3.dist-info}/RECORD +10 -10
- {eflips_depot-4.15.1.dist-info → eflips_depot-4.15.3.dist-info}/WHEEL +0 -0
- {eflips_depot-4.15.1.dist-info → eflips_depot-4.15.3.dist-info}/licenses/LICENSE.md +0 -0
|
@@ -230,7 +230,7 @@ def depot_to_template(depot: Depot) -> Dict[str, str | Dict[str, str | int]]:
|
|
|
230
230
|
if process_type(processes_in_area) == ProcessType.CHARGING:
|
|
231
231
|
# Add the charging process for this vehicle type
|
|
232
232
|
template["areas"][area_name]["available_processes"].append(
|
|
233
|
-
str(processes_in_area.id) + str(area.vehicle_type_id)
|
|
233
|
+
str(processes_in_area.id) + "vt" + str(area.vehicle_type_id)
|
|
234
234
|
)
|
|
235
235
|
# Delete the original charging process
|
|
236
236
|
template["areas"][area_name]["available_processes"].remove(
|
|
@@ -253,7 +253,7 @@ def depot_to_template(depot: Depot) -> Dict[str, str | Dict[str, str | int]]:
|
|
|
253
253
|
# Add the charging process for this vehicle type
|
|
254
254
|
for vt in scenario.vehicle_types:
|
|
255
255
|
template["areas"][area_name]["available_processes"].append(
|
|
256
|
-
str(processes_in_area.id) + str(vt.id)
|
|
256
|
+
str(processes_in_area.id) + "vt" + str(vt.id)
|
|
257
257
|
)
|
|
258
258
|
# Delete the original charging process
|
|
259
259
|
template["areas"][area_name]["available_processes"].remove(
|
|
@@ -386,30 +386,31 @@ def depot_to_template(depot: Depot) -> Dict[str, str | Dict[str, str | int]]:
|
|
|
386
386
|
|
|
387
387
|
for vt in all_vehicle_types:
|
|
388
388
|
charging_curve = vt.charging_curve
|
|
389
|
-
|
|
389
|
+
|
|
390
|
+
charging_process_name = process_name + "vt" + str(vt.id)
|
|
391
|
+
template["processes"][charging_process_name] = template[
|
|
390
392
|
"processes"
|
|
391
393
|
][process_name].copy()
|
|
392
|
-
template["processes"][
|
|
394
|
+
template["processes"][charging_process_name][
|
|
393
395
|
"typename"
|
|
394
396
|
] = "ChargeEquationSteps"
|
|
395
|
-
template["processes"][
|
|
396
|
-
"vehicle_filter"
|
|
397
|
-
] = {
|
|
397
|
+
template["processes"][charging_process_name]["vehicle_filter"] = {
|
|
398
398
|
"filter_names": ["vehicle_type"],
|
|
399
399
|
"vehicle_types": [str(vt.id)],
|
|
400
400
|
}
|
|
401
401
|
|
|
402
|
-
template["processes"][
|
|
402
|
+
template["processes"][charging_process_name][
|
|
403
403
|
"peq_name"
|
|
404
404
|
] = "charging_curve_power"
|
|
405
|
-
template["processes"][
|
|
405
|
+
template["processes"][charging_process_name]["peq_params"] = {
|
|
406
406
|
"soc": [soc_power_pair[0] for soc_power_pair in charging_curve],
|
|
407
407
|
"power": [
|
|
408
408
|
soc_power_pair[1] for soc_power_pair in charging_curve
|
|
409
409
|
],
|
|
410
|
+
"precision": 0.01,
|
|
410
411
|
}
|
|
411
412
|
|
|
412
|
-
del template["processes"][
|
|
413
|
+
del template["processes"][charging_process_name]["dur"]
|
|
413
414
|
|
|
414
415
|
# delete the original process
|
|
415
416
|
del template["processes"][process_name]
|
|
@@ -1195,7 +1196,9 @@ def depot_smallest_possible_size(
|
|
|
1195
1196
|
|
|
1196
1197
|
# Simulate the depot
|
|
1197
1198
|
simulate_scenario(
|
|
1198
|
-
scenario,
|
|
1199
|
+
scenario,
|
|
1200
|
+
smart_charging_strategy=SmartChargingStrategy.NONE,
|
|
1201
|
+
ignore_unstable_simulation=True,
|
|
1199
1202
|
)
|
|
1200
1203
|
|
|
1201
1204
|
# Find the peak usage of the depot
|
|
@@ -1259,12 +1262,6 @@ def depot_smallest_possible_size(
|
|
|
1259
1262
|
|
|
1260
1263
|
except MissingVehicleDimensionError as e:
|
|
1261
1264
|
raise e
|
|
1262
|
-
except UnstableSimulationException as e:
|
|
1263
|
-
# This change is made after Unstable exception and delay exceptions are introduced
|
|
1264
|
-
logger.debug(
|
|
1265
|
-
f"Results are unstable, suggesting depot is too small."
|
|
1266
|
-
)
|
|
1267
|
-
continue
|
|
1268
1265
|
except DelayedTripException as e:
|
|
1269
1266
|
logger.debug(f"Trips are delayed, suggesting depot is too small.")
|
|
1270
1267
|
continue
|
|
@@ -1274,6 +1271,10 @@ def depot_smallest_possible_size(
|
|
|
1274
1271
|
# Identify the best configuration for each vehicle type
|
|
1275
1272
|
ret_val: Dict[VehicleType, Dict[AreaType, int]] = dict()
|
|
1276
1273
|
for vt in vts_and_rotations.keys():
|
|
1274
|
+
assert area_needed[vt] != {}, (
|
|
1275
|
+
f"No valid configurations found for {vt.name}, "
|
|
1276
|
+
f"please check if there are any delays after simulating scenario."
|
|
1277
|
+
)
|
|
1277
1278
|
best_config = min(area_needed[vt].keys(), key=lambda x: area_needed[vt][x])
|
|
1278
1279
|
ret_val[vt] = {
|
|
1279
1280
|
AreaType.LINE: best_config * standard_block_length,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import datetime
|
|
2
2
|
import itertools
|
|
3
3
|
import logging
|
|
4
|
+
import math
|
|
4
5
|
import warnings
|
|
5
6
|
from datetime import timedelta
|
|
6
7
|
from typing import List, Dict
|
|
@@ -398,6 +399,10 @@ def add_soc_to_events(dict_of_events, battery_log) -> None:
|
|
|
398
399
|
"""
|
|
399
400
|
battery_log_list = []
|
|
400
401
|
for log in battery_log:
|
|
402
|
+
# TODO this is a bypass of update events having lower energy_real than the event before. It happens in processes L 1304
|
|
403
|
+
if log.event_name == "update":
|
|
404
|
+
continue
|
|
405
|
+
|
|
401
406
|
battery_log_list.append((log.t, round(log.energy / log.energy_real, 4)))
|
|
402
407
|
|
|
403
408
|
time_keys = sorted(dict_of_events.keys())
|
|
@@ -522,7 +527,7 @@ def add_events_into_database(
|
|
|
522
527
|
if "timeseries" in process_dict.keys():
|
|
523
528
|
# Convert "time" in timeseries to timedelta
|
|
524
529
|
timeseries["time"] = [
|
|
525
|
-
(timedelta(seconds=t) + simulation_start_time).isoformat()
|
|
530
|
+
(timedelta(seconds=math.ceil(t)) + simulation_start_time).isoformat()
|
|
526
531
|
for t in process_dict["timeseries"]["time"]
|
|
527
532
|
]
|
|
528
533
|
timeseries["soc"] = process_dict["timeseries"]["soc"]
|
eflips/depot/api/private/util.py
CHANGED
eflips/depot/processes.py
CHANGED
|
@@ -840,6 +840,7 @@ class Charge(ChargeAbstract):
|
|
|
840
840
|
|
|
841
841
|
@property
|
|
842
842
|
def power(self):
|
|
843
|
+
# TODO this doesn't consider vehicle charging power
|
|
843
844
|
return self.charging_interface.max_power
|
|
844
845
|
|
|
845
846
|
def _action(self, *args, **kwargs):
|
|
@@ -1240,6 +1241,8 @@ class ChargeEquationSteps(ChargeAbstract):
|
|
|
1240
1241
|
self.precision = precision
|
|
1241
1242
|
Charge.check_soc_target(soc_target, vehicle_filter)
|
|
1242
1243
|
self.soc_target = soc_target
|
|
1244
|
+
if "precision" in self.peq_params:
|
|
1245
|
+
self.precision = self.peq_params["precision"]
|
|
1243
1246
|
|
|
1244
1247
|
@property
|
|
1245
1248
|
def power(self):
|
|
@@ -1271,8 +1274,12 @@ class ChargeEquationSteps(ChargeAbstract):
|
|
|
1271
1274
|
)
|
|
1272
1275
|
soc_target_step = self.vehicle.battery.soc + soc_interval
|
|
1273
1276
|
amount = self.vehicle.battery.energy_real * soc_interval
|
|
1274
|
-
effective_power =
|
|
1275
|
-
|
|
1277
|
+
effective_power = (
|
|
1278
|
+
self.power
|
|
1279
|
+
* self.efficiency
|
|
1280
|
+
* self.vehicle.vehicle_type.charging_efficiency
|
|
1281
|
+
)
|
|
1282
|
+
self.dur = round(amount / effective_power * 3600, 12)
|
|
1276
1283
|
|
|
1277
1284
|
if self.dur == 0:
|
|
1278
1285
|
# amount is so small that dur is <1s. Reduce the precision
|
|
@@ -1295,6 +1302,7 @@ class ChargeEquationSteps(ChargeAbstract):
|
|
|
1295
1302
|
yield self.env.timeout(self.dur)
|
|
1296
1303
|
|
|
1297
1304
|
if soc_target_step < self.soc_target:
|
|
1305
|
+
# TODO why here we have energy higher than the step_soc_target?
|
|
1298
1306
|
# recalculate amount because update_battery may have been
|
|
1299
1307
|
# called in the meantime
|
|
1300
1308
|
amount_step = (
|
|
@@ -1438,13 +1446,21 @@ def charging_curve_power(vehicle, charging_interface, peq_params):
|
|
|
1438
1446
|
:return: charging power in float for given SimpleVehicle
|
|
1439
1447
|
"""
|
|
1440
1448
|
|
|
1449
|
+
precision = peq_params.get("precision", 0.01)
|
|
1441
1450
|
current_soc = vehicle.battery.soc
|
|
1442
1451
|
p_max = charging_interface.max_power
|
|
1452
|
+
target_step_soc = min(vehicle.battery.soc + precision, vehicle.battery.soc_max)
|
|
1443
1453
|
|
|
1444
|
-
|
|
1454
|
+
power_current_soc = min(
|
|
1445
1455
|
p_max, np.interp(current_soc, peq_params["soc"], peq_params["power"])
|
|
1446
1456
|
)
|
|
1447
1457
|
|
|
1458
|
+
power_target_soc = min(
|
|
1459
|
+
p_max, np.interp(target_step_soc, peq_params["soc"], peq_params["power"])
|
|
1460
|
+
)
|
|
1461
|
+
|
|
1462
|
+
current_power = min(power_current_soc, power_target_soc)
|
|
1463
|
+
|
|
1448
1464
|
return float(current_power)
|
|
1449
1465
|
|
|
1450
1466
|
|
eflips/depot/rating.py
CHANGED
|
@@ -422,7 +422,7 @@ class RfdDiffDispatch:
|
|
|
422
422
|
diffs = []
|
|
423
423
|
for vehicle in area.vehicles:
|
|
424
424
|
etc = vehicle.dwd.etc_processes
|
|
425
|
-
if isinstance(etc, int):
|
|
425
|
+
if isinstance(etc, int) or isinstance(etc, float):
|
|
426
426
|
diff = etc - slot[0].env.now
|
|
427
427
|
diffs.append(diff)
|
|
428
428
|
# Convert EstimateValue to numerical rfddiff
|
eflips/depot/simple_vehicle.py
CHANGED
|
@@ -36,7 +36,17 @@ class VehicleType:
|
|
|
36
36
|
|
|
37
37
|
"""
|
|
38
38
|
|
|
39
|
-
def __init__(
|
|
39
|
+
def __init__(
|
|
40
|
+
self,
|
|
41
|
+
ID,
|
|
42
|
+
battery_capacity,
|
|
43
|
+
soc_min,
|
|
44
|
+
soc_max,
|
|
45
|
+
soc_init,
|
|
46
|
+
soh,
|
|
47
|
+
charging_efficiency=1.0,
|
|
48
|
+
CR=None,
|
|
49
|
+
):
|
|
40
50
|
self.ID = ID
|
|
41
51
|
self.battery_capacity = battery_capacity
|
|
42
52
|
self.soc_min = soc_min
|
|
@@ -45,6 +55,7 @@ class VehicleType:
|
|
|
45
55
|
self.soh = soh
|
|
46
56
|
self.CR = CR
|
|
47
57
|
self.group = None
|
|
58
|
+
self.charging_efficiency = charging_efficiency
|
|
48
59
|
|
|
49
60
|
self.count = {}
|
|
50
61
|
self.share = {}
|
|
@@ -3,9 +3,9 @@ eflips/depot/api/__init__.py,sha256=nq5aHGTOIpDmvDfcGMlCH_jd97E0VZ28KVcT3XTwpbE,
|
|
|
3
3
|
eflips/depot/api/defaults/default_settings.json,sha256=0eUDTw_rtLQFvthP8oJL93iRXlmAOravAg-4qqGMQAY,5375
|
|
4
4
|
eflips/depot/api/private/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
eflips/depot/api/private/consumption.py,sha256=494u6FelymWfI-Yt3ybJpLHUL-6zEqBOT2qSrPhRmMo,30038
|
|
6
|
-
eflips/depot/api/private/depot.py,sha256=
|
|
7
|
-
eflips/depot/api/private/results_to_database.py,sha256
|
|
8
|
-
eflips/depot/api/private/util.py,sha256=
|
|
6
|
+
eflips/depot/api/private/depot.py,sha256=6JzaWPiHbhzbcioeFz-Blz_Qyx_9kvJItXuqjGP8uFk,59683
|
|
7
|
+
eflips/depot/api/private/results_to_database.py,sha256=OewbDwbk54GPORMVavLbJ7DSZpRKBLHM7q9aWKTngs8,30026
|
|
8
|
+
eflips/depot/api/private/util.py,sha256=e7T_-1AUXoCV9c11zaED2-za7p0TDhYG4Dg0lBZnrZI,18342
|
|
9
9
|
eflips/depot/configuration.py,sha256=Op3hlir-dEN7yHr0kTqbYANoCBKFWK6uKOv3NJl8w_w,35678
|
|
10
10
|
eflips/depot/depot.py,sha256=5NBw5bvOP2cplkRGZbKbG3SOA23F2Kw-UsabHubocPU,107555
|
|
11
11
|
eflips/depot/evaluation.py,sha256=qqXyP4jA1zFcKuWhliQ6n25ZlGl9mJV-vtXf0yu8WN8,140842
|
|
@@ -27,16 +27,16 @@ eflips/depot/layout_opt/settings.py,sha256=EUGCp4dAX22j2uF8sKqbi9a5iP8hb6QpP7t2N
|
|
|
27
27
|
eflips/depot/layout_opt/template_creation.py,sha256=H4LoFjQfbPjTt9rGvapH2tEUWcQ56kPwDucq7t6YahU,9736
|
|
28
28
|
eflips/depot/layout_opt/util.py,sha256=EYh7IN58ZjysmCFdSieQqIQ9goe1a_ZwARRHxOgjEQo,3780
|
|
29
29
|
eflips/depot/plots.py,sha256=85xInZWfJIOVm03onvppgP5yLTgQeMn-1t5aoNdavyY,2509
|
|
30
|
-
eflips/depot/processes.py,sha256=
|
|
31
|
-
eflips/depot/rating.py,sha256=
|
|
30
|
+
eflips/depot/processes.py,sha256=2ovkJuyBCHT3L4JudePVGVqdk_KKnGQXorndqdEFqsQ,60017
|
|
31
|
+
eflips/depot/rating.py,sha256=WjySy_cT3CtKLFaCCCVZB1f7qCYRyNFxAnM6IgJW7Ro,16453
|
|
32
32
|
eflips/depot/resources.py,sha256=0SuzN8qgMmCqa7oUEXVC_XE6pCUtxTsqOfCsaM9Oh3o,13568
|
|
33
33
|
eflips/depot/settings_config.py,sha256=z7CqPdjd8QRlgZj0Zis-H13cL7LOiheRT4ctYCYGguc,2527
|
|
34
|
-
eflips/depot/simple_vehicle.py,sha256
|
|
34
|
+
eflips/depot/simple_vehicle.py,sha256=-fqHhuyC1KXhl53zCZh8x8NUQnuz4EpZ6oLtaTaRqFw,9534
|
|
35
35
|
eflips/depot/simulation.py,sha256=ee0qTzOzG-8ybN36ie_NJallXfC7jUaS9JZvaYFziLs,10676
|
|
36
36
|
eflips/depot/smart_charging.py,sha256=C3BYqzn2-OYY4ipXm0ETtavbAM9QXZMYULBpVoChf0E,54311
|
|
37
37
|
eflips/depot/standalone.py,sha256=8O01zEXghFG9zZBu0fUD0sXvbHQ-AXw6RB5M750a_sM,22419
|
|
38
38
|
eflips/depot/validation.py,sha256=TIuY7cQtEJI4H2VVMSuY5IIVkacEEZ67weeMuY3NSAM,7097
|
|
39
|
-
eflips_depot-4.15.
|
|
40
|
-
eflips_depot-4.15.
|
|
41
|
-
eflips_depot-4.15.
|
|
42
|
-
eflips_depot-4.15.
|
|
39
|
+
eflips_depot-4.15.3.dist-info/METADATA,sha256=QbDDrCgMjFr6Sv5Elgs_nPphS0tHH370C0NrYeKsSZU,5961
|
|
40
|
+
eflips_depot-4.15.3.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
41
|
+
eflips_depot-4.15.3.dist-info/licenses/LICENSE.md,sha256=KB4XTk1fPHjtZCYDyPyreu6h1LVJVZXYg-5vePcWZAc,34143
|
|
42
|
+
eflips_depot-4.15.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|