# EnergyPrice.py from __future__ import annotations from dataclasses import dataclass from datetime import datetime import zoneinfo from utils.time_helpers import WARSAW_TZ @dataclass class EnergyPriceBase: tz: zoneinfo.ZoneInfo = WARSAW_TZ def to_local_dt(self, ts: datetime) -> datetime: if ts.tzinfo is None: return ts.replace(tzinfo=self.tz) return ts.astimezone(self.tz) def has_rate(self, ts: datetime) -> bool: try: self.rate(ts) return True except KeyError: return False def rate(self, ts: datetime) -> float: """Return PLN/kWh (net) for given timestamp (override in subclasses).""" raise NotImplementedError def cost(self, ts: datetime, consumption_kwh: float) -> float: return self.rate(ts) * float(consumption_kwh)