|
3 | 3 |
|
4 | 4 | """Configuration for microgrids.""" |
5 | 5 |
|
| 6 | +import logging |
6 | 7 | import re |
7 | 8 | import tomllib |
8 | 9 | from dataclasses import dataclass |
| 10 | +from pathlib import Path |
9 | 11 | from typing import Any, Literal, cast, get_args |
10 | 12 |
|
| 13 | +_logger = logging.getLogger(__name__) |
| 14 | + |
11 | 15 | ComponentType = Literal["grid", "pv", "battery", "consumption", "chp", "ev"] |
12 | 16 | """Valid component types.""" |
13 | 17 |
|
@@ -286,22 +290,71 @@ def formula(self, component_type: str, metric: str) -> str: |
286 | 290 | return formula |
287 | 291 |
|
288 | 292 | @staticmethod |
289 | | - def load_configs(*paths: str) -> dict[str, "MicrogridConfig"]: |
| 293 | + def load_configs( |
| 294 | + microgrid_config_files: str | Path | list[str | Path] | None = None, |
| 295 | + microgrid_config_dir: str | Path | None = None, |
| 296 | + ) -> dict[str, "MicrogridConfig"]: |
290 | 297 | """Load multiple microgrid configurations from a file. |
291 | 298 |
|
292 | 299 | Configs for a single microgrid are expected to be in a single file. |
293 | 300 | Later files with the same microgrid ID will overwrite the previous configs. |
294 | 301 |
|
295 | 302 | Args: |
296 | | - *paths: Path(es) to the config file(s). |
| 303 | + microgrid_config_files: Path to a single microgrid config file or list of paths. |
| 304 | + microgrid_config_dir: Directory containing multiple microgrid config files. |
297 | 305 |
|
298 | 306 | Returns: |
299 | 307 | Dictionary of single microgrid formula configs with microgrid IDs as keys. |
| 308 | +
|
| 309 | + Raises: |
| 310 | + ValueError: If no config files or dir is provided, or if no config files are found. |
300 | 311 | """ |
301 | | - microgrid_configs = {} |
302 | | - for config_path in paths: |
303 | | - with open(config_path, "rb") as f: |
| 312 | + if microgrid_config_files is None and microgrid_config_dir is None: |
| 313 | + raise ValueError( |
| 314 | + "No microgrid config path or directory provided. " |
| 315 | + "Please provide at least one." |
| 316 | + ) |
| 317 | + |
| 318 | + config_files: list[Path] = [] |
| 319 | + |
| 320 | + if microgrid_config_files: |
| 321 | + if isinstance(microgrid_config_files, str): |
| 322 | + config_files = [Path(microgrid_config_files)] |
| 323 | + elif isinstance(microgrid_config_files, Path): |
| 324 | + config_files = [microgrid_config_files] |
| 325 | + elif isinstance(microgrid_config_files, list): |
| 326 | + config_files = [Path(f) for f in microgrid_config_files] |
| 327 | + |
| 328 | + if microgrid_config_dir: |
| 329 | + if Path(microgrid_config_dir).is_dir(): |
| 330 | + config_files += list(Path(microgrid_config_dir).glob("*.toml")) |
| 331 | + else: |
| 332 | + raise ValueError( |
| 333 | + f"Microgrid config directory {microgrid_config_dir} " |
| 334 | + "is not a directory" |
| 335 | + ) |
| 336 | + |
| 337 | + if len(config_files) == 0: |
| 338 | + raise ValueError( |
| 339 | + "No microgrid config files found. " |
| 340 | + "Please provide at least one valid config file." |
| 341 | + ) |
| 342 | + |
| 343 | + microgrid_configs: dict[str, "MicrogridConfig"] = {} |
| 344 | + |
| 345 | + for config_path in config_files: |
| 346 | + if not config_path.is_file(): |
| 347 | + _logger.warning("Config path %s is not a file, skipping.", config_path) |
| 348 | + continue |
| 349 | + |
| 350 | + with config_path.open("rb") as f: |
304 | 351 | cfg_dict = tomllib.load(f) |
305 | 352 | for microgrid_id, mcfg in cfg_dict.items(): |
| 353 | + _logger.debug( |
| 354 | + "Loading microgrid config for ID %s from %s", |
| 355 | + microgrid_id, |
| 356 | + config_path, |
| 357 | + ) |
306 | 358 | microgrid_configs[microgrid_id] = MicrogridConfig(mcfg) |
| 359 | + |
307 | 360 | return microgrid_configs |
0 commit comments