"""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