Source code for nwp500.models.energy
from __future__ import annotations
from pydantic import Field
from .._base import NavienBaseModel
[docs]
class EnergyUsageBase(NavienBaseModel):
"""Base energy usage fields common to daily and total responses."""
heat_pump_usage: int = Field(default=0, alias="hpUsage")
heat_element_usage: int = Field(default=0, alias="heUsage")
heat_pump_time: int = Field(default=0, alias="hpTime")
heat_element_time: int = Field(default=0, alias="heTime")
@property
def total_usage(self) -> int:
return self.heat_pump_usage + self.heat_element_usage
[docs]
class EnergyUsageTotal(EnergyUsageBase):
"""Total energy usage data."""
@property
def heat_pump_percentage(self) -> float:
return (
(self.heat_pump_usage / self.total_usage * 100.0)
if self.total_usage > 0
else 0.0
)
@property
def heat_element_percentage(self) -> float:
return (
(self.heat_element_usage / self.total_usage * 100.0)
if self.total_usage > 0
else 0.0
)
@property
def total_time(self) -> int:
return self.heat_pump_time + self.heat_element_time
[docs]
class EnergyUsageDay(EnergyUsageBase):
"""Daily energy usage data."""
pass
[docs]
class MonthlyEnergyData(NavienBaseModel):
"""Monthly energy usage data grouping."""
year: int
month: int
data: list[EnergyUsageDay]
[docs]
class EnergyUsageResponse(NavienBaseModel):
"""Response for energy usage query."""
total: EnergyUsageTotal
usage: list[MonthlyEnergyData]
[docs]
def get_month_data(self, year: int, month: int) -> MonthlyEnergyData | None:
"""Get energy usage data for a specific month.
Args:
year: Year (e.g., 2025)
month: Month (1-12)
Returns:
MonthlyEnergyData for that month, or None if not found
"""
for monthly_data in self.usage:
if monthly_data.year == year and monthly_data.month == month:
return monthly_data
return None