Files
Reactor-Sim/src/reactor_sim/consumer.py
2025-11-21 18:15:11 +02:00

47 lines
1.5 KiB
Python

"""External electrical consumer/load models."""
from __future__ import annotations
from dataclasses import dataclass
import logging
LOGGER = logging.getLogger(__name__)
@dataclass
class ElectricalConsumer:
name: str
demand_mw: float
online: bool = False
power_received_mw: float = 0.0
_under_supply_logged: bool = False
def request_power(self) -> float:
return self.demand_mw if self.online else 0.0
def set_demand(self, demand_mw: float) -> None:
previous = self.demand_mw
self.demand_mw = max(0.0, demand_mw)
LOGGER.info("%s demand %.1f -> %.1f MW", self.name, previous, self.demand_mw)
def set_online(self, online: bool) -> None:
if self.online != online:
self.online = online
LOGGER.info("%s %s", self.name, "online" if online else "offline")
def update_power_received(self, supplied_mw: float) -> None:
self.power_received_mw = supplied_mw
if supplied_mw + 1e-6 < self.request_power():
if not self._under_supply_logged:
LOGGER.warning(
"%s under-supplied: %.1f/%.1f MW",
self.name,
supplied_mw,
self.request_power(),
)
self._under_supply_logged = True
else:
if self._under_supply_logged:
LOGGER.info("%s demand satisfied", self.name)
self._under_supply_logged = False