30 lines
884 B
Python
30 lines
884 B
Python
# 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)
|