mobev 0.2.0__tar.gz → 0.3.0__tar.gz
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.
- mobev-0.3.0/PKG-INFO +133 -0
- mobev-0.3.0/README.md +109 -0
- {mobev-0.2.0 → mobev-0.3.0}/mobev/__init__.py +20 -8
- {mobev-0.2.0 → mobev-0.3.0}/mobev/_version.py +1 -1
- mobev-0.3.0/mobev/charging/__init__.py +6 -0
- mobev-0.3.0/mobev/charging/charging_simulator.py +916 -0
- mobev-0.3.0/mobev/charging/decision_engine.py +731 -0
- mobev-0.3.0/mobev/charging/events.py +300 -0
- mobev-0.3.0/mobev/charging/profiles.py +141 -0
- mobev-0.3.0/mobev/charging/sessions.py +238 -0
- mobev-0.3.0/mobev/cli/__init__.py +1 -0
- mobev-0.3.0/mobev/cli/run_mobev.py +209 -0
- mobev-0.3.0/mobev/config/__init__.py +39 -0
- mobev-0.3.0/mobev/config/config.py +283 -0
- mobev-0.3.0/mobev/config/defaults.py +88 -0
- mobev-0.3.0/mobev/config/load.py +260 -0
- mobev-0.3.0/mobev/config/models.py +203 -0
- mobev-0.3.0/mobev/config/random.py +48 -0
- mobev-0.3.0/mobev/config/serialization.py +39 -0
- mobev-0.3.0/mobev/config/validation.py +277 -0
- {mobev-0.2.0/mobev/core → mobev-0.3.0/mobev}/pipeline.py +107 -31
- mobev-0.3.0/mobev/plot/__init__.py +5 -0
- mobev-0.3.0/mobev/plot/axes.py +29 -0
- mobev-0.3.0/mobev/plot/output.py +45 -0
- mobev-0.3.0/mobev/plot/plot.py +241 -0
- mobev-0.3.0/mobev/plot/profile_data.py +132 -0
- mobev-0.3.0/mobev/plot/profile_render.py +147 -0
- mobev-0.3.0/mobev/plot/tariff.py +47 -0
- mobev-0.3.0/mobev/plot/time.py +67 -0
- mobev-0.3.0/mobev/plot/trip_map_data.py +212 -0
- mobev-0.3.0/mobev/plot/trip_map_html.py +139 -0
- {mobev-0.2.0 → mobev-0.3.0}/mobev/profiles/profile_aggregator.py +54 -119
- mobev-0.3.0/mobev/results/__init__.py +20 -0
- mobev-0.3.0/mobev/results/aggregated_profiles.py +211 -0
- mobev-0.3.0/mobev/results/charging_simulation.py +261 -0
- mobev-0.3.0/mobev/results/common.py +225 -0
- mobev-0.3.0/mobev/results/indicators.py +262 -0
- mobev-0.3.0/mobev/results/metadata.py +330 -0
- mobev-0.3.0/mobev/results/output.py +219 -0
- mobev-0.3.0/mobev/results/prepared_trips.py +266 -0
- mobev-0.3.0/mobev/results/scenario_inputs.py +327 -0
- mobev-0.3.0/mobev/results/schemas.py +200 -0
- mobev-0.3.0/mobev/results/simulation_results.py +103 -0
- {mobev-0.2.0 → mobev-0.3.0}/mobev/scenario/__init__.py +2 -1
- mobev-0.3.0/mobev/scenario/fleet.py +122 -0
- mobev-0.3.0/mobev/scenario/parking.py +354 -0
- mobev-0.3.0/mobev/scenario/scenario_builder.py +521 -0
- mobev-0.3.0/mobev/scenario/stations.py +85 -0
- mobev-0.3.0/mobev/scenario/tariffs.py +241 -0
- mobev-0.3.0/mobev/trips/boundaries.py +343 -0
- mobev-0.3.0/mobev/trips/chains.py +279 -0
- mobev-0.3.0/mobev/trips/distances.py +160 -0
- mobev-0.3.0/mobev/trips/source.py +428 -0
- mobev-0.3.0/mobev/trips/trip_preparer.py +441 -0
- {mobev-0.2.0 → mobev-0.3.0}/mobev/utils/logger.py +33 -10
- mobev-0.3.0/mobev.egg-info/PKG-INFO +133 -0
- mobev-0.3.0/mobev.egg-info/SOURCES.txt +88 -0
- mobev-0.3.0/mobev.egg-info/entry_points.txt +2 -0
- {mobev-0.2.0 → mobev-0.3.0}/pyproject.toml +9 -4
- {mobev-0.2.0 → mobev-0.3.0}/tests/test_aggregated_profile_plotting.py +55 -41
- mobev-0.3.0/tests/test_charging_decision.py +456 -0
- mobev-0.3.0/tests/test_charging_simulator.py +590 -0
- mobev-0.3.0/tests/test_cli.py +109 -0
- mobev-0.3.0/tests/test_config.py +430 -0
- mobev-0.3.0/tests/test_logger.py +20 -0
- mobev-0.3.0/tests/test_metadata.py +109 -0
- mobev-0.3.0/tests/test_output.py +103 -0
- {mobev-0.2.0 → mobev-0.3.0}/tests/test_pipeline.py +23 -51
- {mobev-0.2.0 → mobev-0.3.0}/tests/test_pipeline_api.py +48 -27
- mobev-0.3.0/tests/test_plot_export.py +83 -0
- {mobev-0.2.0 → mobev-0.3.0}/tests/test_profile_aggregator.py +83 -38
- mobev-0.3.0/tests/test_random.py +31 -0
- mobev-0.3.0/tests/test_results.py +275 -0
- mobev-0.3.0/tests/test_results_indicators.py +315 -0
- mobev-0.3.0/tests/test_scenario_builder.py +258 -0
- mobev-0.3.0/tests/test_tariff_builder.py +320 -0
- mobev-0.3.0/tests/test_tariff_plotting.py +68 -0
- mobev-0.3.0/tests/test_trip_boundaries.py +402 -0
- mobev-0.3.0/tests/test_trip_chains.py +22 -0
- mobev-0.3.0/tests/test_trip_distances.py +117 -0
- {mobev-0.2.0 → mobev-0.3.0}/tests/test_trip_plotting.py +23 -67
- mobev-0.3.0/tests/test_trip_preparer.py +180 -0
- mobev-0.3.0/tests/test_trip_source.py +116 -0
- mobev-0.2.0/PKG-INFO +0 -191
- mobev-0.2.0/README.md +0 -167
- mobev-0.2.0/mobev/charging/__init__.py +0 -5
- mobev-0.2.0/mobev/charging/charging_simulator.py +0 -605
- mobev-0.2.0/mobev/charging/tariffs.py +0 -451
- mobev-0.2.0/mobev/core/config.py +0 -900
- mobev-0.2.0/mobev/plotting/__init__.py +0 -6
- mobev-0.2.0/mobev/plotting/api.py +0 -250
- mobev-0.2.0/mobev/plotting/data.py +0 -122
- mobev-0.2.0/mobev/plotting/render.py +0 -83
- mobev-0.2.0/mobev/plotting/tariff.py +0 -137
- mobev-0.2.0/mobev/plotting/trips.py +0 -376
- mobev-0.2.0/mobev/results/__init__.py +0 -54
- mobev-0.2.0/mobev/results/aggregated_profiles.py +0 -118
- mobev-0.2.0/mobev/results/charging_simulation.py +0 -133
- mobev-0.2.0/mobev/results/common.py +0 -281
- mobev-0.2.0/mobev/results/factories.py +0 -87
- mobev-0.2.0/mobev/results/prepared_trips.py +0 -91
- mobev-0.2.0/mobev/results/results_indicators.py +0 -132
- mobev-0.2.0/mobev/results/scenario_inputs.py +0 -219
- mobev-0.2.0/mobev/results/simulation_results.py +0 -48
- mobev-0.2.0/mobev/scenario/scenario_builder.py +0 -401
- mobev-0.2.0/mobev/trips/trip_preparer.py +0 -656
- mobev-0.2.0/mobev/utils/metadata.py +0 -132
- mobev-0.2.0/mobev.egg-info/PKG-INFO +0 -191
- mobev-0.2.0/mobev.egg-info/SOURCES.txt +0 -52
- mobev-0.2.0/tests/test_charging_simulator.py +0 -149
- mobev-0.2.0/tests/test_config.py +0 -93
- mobev-0.2.0/tests/test_results.py +0 -99
- mobev-0.2.0/tests/test_results_indicators.py +0 -116
- mobev-0.2.0/tests/test_scenario_builder.py +0 -78
- mobev-0.2.0/tests/test_tariff_pipeline.py +0 -36
- mobev-0.2.0/tests/test_trip_pipeline.py +0 -64
- mobev-0.2.0/tests/test_unit_boundaries.py +0 -73
- mobev-0.2.0/tests/test_utils.py +0 -310
- {mobev-0.2.0 → mobev-0.3.0}/LICENSE +0 -0
- {mobev-0.2.0 → mobev-0.3.0}/mobev/profiles/__init__.py +0 -0
- {mobev-0.2.0 → mobev-0.3.0}/mobev/trips/__init__.py +0 -0
- {mobev-0.2.0 → mobev-0.3.0}/mobev.egg-info/dependency_links.txt +0 -0
- {mobev-0.2.0 → mobev-0.3.0}/mobev.egg-info/requires.txt +0 -0
- {mobev-0.2.0 → mobev-0.3.0}/mobev.egg-info/top_level.txt +0 -0
- {mobev-0.2.0 → mobev-0.3.0}/setup.cfg +0 -0
mobev-0.3.0/PKG-INFO
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mobev
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: MobEV: mobility-based, geolocalized EV charging-demand model.
|
|
5
|
+
Author-email: Yoann Chiche <yoann.chiche@minesparis.psl.eu>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Repository, https://git.persee.minesparis.psl.eu/planeterr/mobev
|
|
8
|
+
Project-URL: Documentation, https://pages.persee.minesparis.psl.eu/planeterr/mobev/
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Requires-Python: >=3.13
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Requires-Dist: pandas
|
|
15
|
+
Requires-Dist: numpy
|
|
16
|
+
Requires-Dist: geopandas
|
|
17
|
+
Requires-Dist: shapely>=2
|
|
18
|
+
Requires-Dist: polars
|
|
19
|
+
Requires-Dist: PyYAML
|
|
20
|
+
Requires-Dist: matplotlib
|
|
21
|
+
Requires-Dist: pyarrow
|
|
22
|
+
Requires-Dist: colorlog
|
|
23
|
+
Dynamic: license-file
|
|
24
|
+
|
|
25
|
+
# MobEV
|
|
26
|
+
|
|
27
|
+
<p align="left">
|
|
28
|
+
<a href="https://pages.persee.minesparis.psl.eu/planeterr/mobev/">
|
|
29
|
+
<img src="docs/source/logo.png" alt="MobEV logo" width="220">
|
|
30
|
+
</a>
|
|
31
|
+
</p>
|
|
32
|
+
|
|
33
|
+
[](https://www.python.org/)
|
|
34
|
+
[](https://pypi.org/project/mobev/)
|
|
35
|
+
|
|
36
|
+
MobEV is a mobility-based, geolocalized EV charging-demand model. It
|
|
37
|
+
generates EV charging-demand profiles for distribution-network studies from
|
|
38
|
+
weekly car-trip data. The model samples an EV fleet and charging access,
|
|
39
|
+
simulates battery state of charge and charging sessions, and aggregates the
|
|
40
|
+
resulting demand at the configured timestep.
|
|
41
|
+
It requires Python 3.13 or newer. Install with `python -m pip install mobev` or
|
|
42
|
+
`uv add mobev`; contributors can run `uv sync` from a checkout.
|
|
43
|
+
|
|
44
|
+
[Full documentation](https://pages.persee.minesparis.psl.eu/planeterr/mobev/)
|
|
45
|
+
|
|
46
|
+
## Inputs and configuration
|
|
47
|
+
|
|
48
|
+
Pass a directory containing `weekday_trips.gpkg` and `weekend_trips.gpkg`.
|
|
49
|
+
Both need person/activity fields, car mode, seconds-since-midnight departure
|
|
50
|
+
and arrival times, line geometry, and a CRS. See the [trip input schema](https://pages.persee.minesparis.psl.eu/planeterr/mobev/inputs.html#trip-inputs).
|
|
51
|
+
Optional tariff CSVs need a zero-based contiguous integer positional index and
|
|
52
|
+
exactly one numeric `price` or `price_eur_kwh` column in EUR/kWh; source
|
|
53
|
+
timestamps are rejected. See [tariff inputs](https://pages.persee.minesparis.psl.eu/planeterr/mobev/inputs.html#tariff-inputs).
|
|
54
|
+
|
|
55
|
+
Use the complete [YAML template](config/config.yaml) and
|
|
56
|
+
[parameter reference](https://pages.persee.minesparis.psl.eu/planeterr/mobev/configuration.html).
|
|
57
|
+
Relative tariff paths resolve from the YAML file. The main sections are
|
|
58
|
+
`simulation`, `fleet`, `battery`, `charging`, `flexibility`, `tariff`, and
|
|
59
|
+
`locations`. The YAML must include the simulation section and required charging fields;
|
|
60
|
+
horizon dates default to 2024-01-01 through 2024-01-07. The template is ready to copy and edit. A minimal flat-tariff YAML is:
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
simulation:
|
|
64
|
+
start_date: 2024-01-01
|
|
65
|
+
end_date: 2024-01-07
|
|
66
|
+
charging:
|
|
67
|
+
target_soc: 0.9
|
|
68
|
+
minimum_parking_time_minutes: 15
|
|
69
|
+
charging_setup_duration_minutes: 0
|
|
70
|
+
range_anxiety:
|
|
71
|
+
type: normal
|
|
72
|
+
mean: 0.5
|
|
73
|
+
std: 0.15
|
|
74
|
+
min: 0.1
|
|
75
|
+
max: 0.9
|
|
76
|
+
tariff:
|
|
77
|
+
unit: EUR/kWh
|
|
78
|
+
flat_tariff: 0.30
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Run from Python
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
from mobev import SimulationPipeline
|
|
85
|
+
|
|
86
|
+
pipeline = SimulationPipeline.from_yaml(
|
|
87
|
+
"config/config.yaml", "data/input/trips/YOUR_FEEDER"
|
|
88
|
+
)
|
|
89
|
+
result = pipeline.run()
|
|
90
|
+
print(result.charging_simulation.charging_profiles_df.head())
|
|
91
|
+
aggregate = pipeline.aggregate(by="total")
|
|
92
|
+
print(aggregate.aggregated_profiles_df.head())
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
`TripPreparer`, `ScenarioBuilder`, and `ChargingSimulator` are the mandatory
|
|
96
|
+
stages. They produce `PreparedTrips`, `ScenarioInputs`, and
|
|
97
|
+
`ChargingSimulation`; `run()` returns `SimulationResults` containing all three.
|
|
98
|
+
`ProfileAggregator` is an optional separate analysis stage producing
|
|
99
|
+
`AggregatedProfiles`. Construct a pipeline with `SimulationPipeline.from_yaml`
|
|
100
|
+
or `SimulationPipeline.from_config`, or call its individual stage methods.
|
|
101
|
+
See the [workflow](https://pages.persee.minesparis.psl.eu/planeterr/mobev/workflow.html)
|
|
102
|
+
and [result attributes](https://pages.persee.minesparis.psl.eu/planeterr/mobev/results.html).
|
|
103
|
+
|
|
104
|
+
## Run from the command line
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
mobev --input-dir data/input/trips/YOUR_FEEDER --output-dir output --config config/config.yaml
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The installed `mobev` command writes stage table Parquet files, indicator
|
|
111
|
+
CSVs, `log_file.log`, and, by default, `metadata.json` and analysis PNGs.
|
|
112
|
+
See [CLI options](https://pages.persee.minesparis.psl.eu/planeterr/mobev/workflow.html#command-line-runner).
|
|
113
|
+
|
|
114
|
+
## Charging decisions
|
|
115
|
+
|
|
116
|
+
At each parking opportunity, the simulator checks whether projected next-trip
|
|
117
|
+
SOC reaches the minimum reserve. Reserve charging starts immediately toward
|
|
118
|
+
trip demand plus reserve; normal charging uses the configured target SOC and
|
|
119
|
+
range-anxiety gate. A feasible normal charging window is chosen by mean tariff
|
|
120
|
+
price and compared with the curve reference. Session cost uses delivered grid
|
|
121
|
+
energy at each tariff slot. Trips that cannot meet demand above minimum SOC
|
|
122
|
+
appear in `charging_simulation.infeasible_trips_df`. See the
|
|
123
|
+
[charging decision algorithm](https://pages.persee.minesparis.psl.eu/planeterr/mobev/charging-algorithm.html).
|
|
124
|
+
|
|
125
|
+
## Project links
|
|
126
|
+
|
|
127
|
+
[Changelog](CHANGELOG.md) ·
|
|
128
|
+
[Contribute](https://pages.persee.minesparis.psl.eu/planeterr/mobev/contribute.html) ·
|
|
129
|
+
[API reference](https://pages.persee.minesparis.psl.eu/planeterr/mobev/api/)
|
|
130
|
+
|
|
131
|
+
Build the docs from a checkout with `uv sync --group docs` and
|
|
132
|
+
`make -C docs html`. Open `docs/build/html/index.html`; Sphinx warnings fail
|
|
133
|
+
the build.
|
mobev-0.3.0/README.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# MobEV
|
|
2
|
+
|
|
3
|
+
<p align="left">
|
|
4
|
+
<a href="https://pages.persee.minesparis.psl.eu/planeterr/mobev/">
|
|
5
|
+
<img src="docs/source/logo.png" alt="MobEV logo" width="220">
|
|
6
|
+
</a>
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
[](https://www.python.org/)
|
|
10
|
+
[](https://pypi.org/project/mobev/)
|
|
11
|
+
|
|
12
|
+
MobEV is a mobility-based, geolocalized EV charging-demand model. It
|
|
13
|
+
generates EV charging-demand profiles for distribution-network studies from
|
|
14
|
+
weekly car-trip data. The model samples an EV fleet and charging access,
|
|
15
|
+
simulates battery state of charge and charging sessions, and aggregates the
|
|
16
|
+
resulting demand at the configured timestep.
|
|
17
|
+
It requires Python 3.13 or newer. Install with `python -m pip install mobev` or
|
|
18
|
+
`uv add mobev`; contributors can run `uv sync` from a checkout.
|
|
19
|
+
|
|
20
|
+
[Full documentation](https://pages.persee.minesparis.psl.eu/planeterr/mobev/)
|
|
21
|
+
|
|
22
|
+
## Inputs and configuration
|
|
23
|
+
|
|
24
|
+
Pass a directory containing `weekday_trips.gpkg` and `weekend_trips.gpkg`.
|
|
25
|
+
Both need person/activity fields, car mode, seconds-since-midnight departure
|
|
26
|
+
and arrival times, line geometry, and a CRS. See the [trip input schema](https://pages.persee.minesparis.psl.eu/planeterr/mobev/inputs.html#trip-inputs).
|
|
27
|
+
Optional tariff CSVs need a zero-based contiguous integer positional index and
|
|
28
|
+
exactly one numeric `price` or `price_eur_kwh` column in EUR/kWh; source
|
|
29
|
+
timestamps are rejected. See [tariff inputs](https://pages.persee.minesparis.psl.eu/planeterr/mobev/inputs.html#tariff-inputs).
|
|
30
|
+
|
|
31
|
+
Use the complete [YAML template](config/config.yaml) and
|
|
32
|
+
[parameter reference](https://pages.persee.minesparis.psl.eu/planeterr/mobev/configuration.html).
|
|
33
|
+
Relative tariff paths resolve from the YAML file. The main sections are
|
|
34
|
+
`simulation`, `fleet`, `battery`, `charging`, `flexibility`, `tariff`, and
|
|
35
|
+
`locations`. The YAML must include the simulation section and required charging fields;
|
|
36
|
+
horizon dates default to 2024-01-01 through 2024-01-07. The template is ready to copy and edit. A minimal flat-tariff YAML is:
|
|
37
|
+
|
|
38
|
+
```yaml
|
|
39
|
+
simulation:
|
|
40
|
+
start_date: 2024-01-01
|
|
41
|
+
end_date: 2024-01-07
|
|
42
|
+
charging:
|
|
43
|
+
target_soc: 0.9
|
|
44
|
+
minimum_parking_time_minutes: 15
|
|
45
|
+
charging_setup_duration_minutes: 0
|
|
46
|
+
range_anxiety:
|
|
47
|
+
type: normal
|
|
48
|
+
mean: 0.5
|
|
49
|
+
std: 0.15
|
|
50
|
+
min: 0.1
|
|
51
|
+
max: 0.9
|
|
52
|
+
tariff:
|
|
53
|
+
unit: EUR/kWh
|
|
54
|
+
flat_tariff: 0.30
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Run from Python
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
from mobev import SimulationPipeline
|
|
61
|
+
|
|
62
|
+
pipeline = SimulationPipeline.from_yaml(
|
|
63
|
+
"config/config.yaml", "data/input/trips/YOUR_FEEDER"
|
|
64
|
+
)
|
|
65
|
+
result = pipeline.run()
|
|
66
|
+
print(result.charging_simulation.charging_profiles_df.head())
|
|
67
|
+
aggregate = pipeline.aggregate(by="total")
|
|
68
|
+
print(aggregate.aggregated_profiles_df.head())
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`TripPreparer`, `ScenarioBuilder`, and `ChargingSimulator` are the mandatory
|
|
72
|
+
stages. They produce `PreparedTrips`, `ScenarioInputs`, and
|
|
73
|
+
`ChargingSimulation`; `run()` returns `SimulationResults` containing all three.
|
|
74
|
+
`ProfileAggregator` is an optional separate analysis stage producing
|
|
75
|
+
`AggregatedProfiles`. Construct a pipeline with `SimulationPipeline.from_yaml`
|
|
76
|
+
or `SimulationPipeline.from_config`, or call its individual stage methods.
|
|
77
|
+
See the [workflow](https://pages.persee.minesparis.psl.eu/planeterr/mobev/workflow.html)
|
|
78
|
+
and [result attributes](https://pages.persee.minesparis.psl.eu/planeterr/mobev/results.html).
|
|
79
|
+
|
|
80
|
+
## Run from the command line
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
mobev --input-dir data/input/trips/YOUR_FEEDER --output-dir output --config config/config.yaml
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The installed `mobev` command writes stage table Parquet files, indicator
|
|
87
|
+
CSVs, `log_file.log`, and, by default, `metadata.json` and analysis PNGs.
|
|
88
|
+
See [CLI options](https://pages.persee.minesparis.psl.eu/planeterr/mobev/workflow.html#command-line-runner).
|
|
89
|
+
|
|
90
|
+
## Charging decisions
|
|
91
|
+
|
|
92
|
+
At each parking opportunity, the simulator checks whether projected next-trip
|
|
93
|
+
SOC reaches the minimum reserve. Reserve charging starts immediately toward
|
|
94
|
+
trip demand plus reserve; normal charging uses the configured target SOC and
|
|
95
|
+
range-anxiety gate. A feasible normal charging window is chosen by mean tariff
|
|
96
|
+
price and compared with the curve reference. Session cost uses delivered grid
|
|
97
|
+
energy at each tariff slot. Trips that cannot meet demand above minimum SOC
|
|
98
|
+
appear in `charging_simulation.infeasible_trips_df`. See the
|
|
99
|
+
[charging decision algorithm](https://pages.persee.minesparis.psl.eu/planeterr/mobev/charging-algorithm.html).
|
|
100
|
+
|
|
101
|
+
## Project links
|
|
102
|
+
|
|
103
|
+
[Changelog](CHANGELOG.md) ·
|
|
104
|
+
[Contribute](https://pages.persee.minesparis.psl.eu/planeterr/mobev/contribute.html) ·
|
|
105
|
+
[API reference](https://pages.persee.minesparis.psl.eu/planeterr/mobev/api/)
|
|
106
|
+
|
|
107
|
+
Build the docs from a checkout with `uv sync --group docs` and
|
|
108
|
+
`make -C docs html`. Open `docs/build/html/index.html`; Sphinx warnings fail
|
|
109
|
+
the build.
|
|
@@ -1,19 +1,23 @@
|
|
|
1
|
-
"""MobEV public API."""
|
|
2
|
-
|
|
3
1
|
from mobev._version import __version__
|
|
4
|
-
from mobev.charging import ChargingSimulator
|
|
5
|
-
from mobev.
|
|
2
|
+
from mobev.charging import ChargingDecisionEngine, ChargingSimulator
|
|
3
|
+
from mobev.config import (
|
|
6
4
|
BatteryConfig,
|
|
7
5
|
ChargingConfig,
|
|
8
6
|
Config,
|
|
7
|
+
EVSegmentConfig,
|
|
9
8
|
FixedVehicleConfig,
|
|
10
9
|
FleetConfig,
|
|
10
|
+
FlexibilityConfig,
|
|
11
11
|
InitialSocConfig,
|
|
12
|
+
LocationChargingConfig,
|
|
13
|
+
PowerDistributionConfig,
|
|
14
|
+
RangeAnxietyConfig,
|
|
12
15
|
SimulationConfig,
|
|
13
|
-
|
|
16
|
+
SocDistributionConfig,
|
|
14
17
|
TariffConfig,
|
|
18
|
+
TariffFileConfig,
|
|
15
19
|
)
|
|
16
|
-
from mobev.
|
|
20
|
+
from mobev.pipeline import SimulationPipeline
|
|
17
21
|
from mobev.profiles import ProfileAggregator
|
|
18
22
|
from mobev.results import (
|
|
19
23
|
AggregatedProfiles,
|
|
@@ -23,29 +27,37 @@ from mobev.results import (
|
|
|
23
27
|
ScenarioInputs,
|
|
24
28
|
SimulationResults,
|
|
25
29
|
)
|
|
26
|
-
from mobev.scenario import ScenarioBuilder
|
|
30
|
+
from mobev.scenario import ScenarioBuilder, TariffBuilder
|
|
27
31
|
from mobev.trips import TripPreparer
|
|
28
32
|
|
|
29
33
|
__all__ = [
|
|
30
34
|
"AggregatedProfiles",
|
|
31
35
|
"BatteryConfig",
|
|
32
36
|
"ChargingConfig",
|
|
37
|
+
"ChargingDecisionEngine",
|
|
33
38
|
"ChargingSimulation",
|
|
34
39
|
"ChargingSimulator",
|
|
35
40
|
"Config",
|
|
41
|
+
"EVSegmentConfig",
|
|
36
42
|
"FixedVehicleConfig",
|
|
37
43
|
"FleetConfig",
|
|
44
|
+
"FlexibilityConfig",
|
|
38
45
|
"InitialSocConfig",
|
|
46
|
+
"LocationChargingConfig",
|
|
39
47
|
"Metadata",
|
|
48
|
+
"PowerDistributionConfig",
|
|
40
49
|
"PreparedTrips",
|
|
41
50
|
"ProfileAggregator",
|
|
51
|
+
"RangeAnxietyConfig",
|
|
42
52
|
"ScenarioBuilder",
|
|
43
53
|
"ScenarioInputs",
|
|
44
54
|
"SimulationConfig",
|
|
45
55
|
"SimulationPipeline",
|
|
46
56
|
"SimulationResults",
|
|
47
|
-
"
|
|
57
|
+
"SocDistributionConfig",
|
|
58
|
+
"TariffBuilder",
|
|
48
59
|
"TariffConfig",
|
|
60
|
+
"TariffFileConfig",
|
|
49
61
|
"TripPreparer",
|
|
50
62
|
"__version__",
|
|
51
63
|
]
|