utils.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from __future__ import annotations
  2. import pandas as pd
  3. from flexmeasures.data.models.time_series import Sensor
  4. from flexmeasures.tests.utils import get_test_sensor
  5. from flexmeasures.utils.calculations import integrate_time_series
  6. from flexmeasures.utils.unit_utils import ur
  7. def series_to_ts_specs(s: pd.Series, unit: str) -> list[dict]:
  8. """Assumes the series frequency should be used as the event resolution."""
  9. return [
  10. {
  11. "start": i.isoformat(),
  12. "duration": pd.to_timedelta(s.index.freq).isoformat(),
  13. "value": f"{s[i]} {unit}",
  14. }
  15. for i in s.index
  16. ]
  17. def check_constraints(
  18. sensor: Sensor,
  19. schedule: pd.Series,
  20. soc_at_start: float,
  21. roundtrip_efficiency: float = 1,
  22. storage_efficiency: float = 1,
  23. tolerance: float = 0.00001,
  24. ) -> pd.Series:
  25. soc_schedule = integrate_time_series(
  26. schedule,
  27. soc_at_start,
  28. up_efficiency=roundtrip_efficiency**0.5,
  29. down_efficiency=roundtrip_efficiency**0.5,
  30. storage_efficiency=storage_efficiency,
  31. decimal_precision=6,
  32. )
  33. with pd.option_context("display.max_rows", None, "display.max_columns", 3):
  34. print(soc_schedule)
  35. capacity = sensor.get_attribute(
  36. "capacity_in_mw",
  37. ur.Quantity(sensor.get_attribute("site-power-capacity")).to("MW").magnitude,
  38. )
  39. assert min(schedule.values) >= capacity * -1 - tolerance
  40. assert max(schedule.values) <= capacity + tolerance
  41. for soc in soc_schedule.values:
  42. assert soc >= sensor.get_attribute("min_soc_in_mwh")
  43. assert soc <= sensor.get_attribute("max_soc_in_mwh")
  44. return soc_schedule
  45. def get_sensors_from_db(
  46. db, battery_assets, battery_name="Test battery", power_sensor_name="power"
  47. ):
  48. # get the sensors from the database
  49. epex_da = get_test_sensor(db)
  50. battery = [
  51. s for s in battery_assets[battery_name].sensors if s.name == power_sensor_name
  52. ][0]
  53. assert battery.get_attribute("consumption-price") == {"sensor": epex_da.id}
  54. return epex_da, battery