diff --git a/src/frequenz/client/common/microgrid/electrical_components/__init__.py b/src/frequenz/client/common/microgrid/electrical_components/__init__.py index 84a2b0f3..877d7b1d 100644 --- a/src/frequenz/client/common/microgrid/electrical_components/__init__.py +++ b/src/frequenz/client/common/microgrid/electrical_components/__init__.py @@ -13,8 +13,12 @@ UnspecifiedBattery, ) from ._category import ElectricalComponentCategory +from ._chp import Chp +from ._converter import Converter +from ._crypto_miner import CryptoMiner from ._diagnostic_code import ElectricalComponentDiagnosticCode from ._electrical_component import ElectricalComponent +from ._electrolyzer import Electrolyzer from ._ev_charger import ( AcEvCharger, DcEvCharger, @@ -25,6 +29,7 @@ UnrecognizedEvCharger, UnspecifiedEvCharger, ) +from ._hvac import Hvac from ._ids import ElectricalComponentId from ._inverter import ( BatteryInverter, @@ -36,13 +41,18 @@ UnrecognizedInverter, UnspecifiedInverter, ) +from ._meter import Meter +from ._precharger import Precharger from ._problematic import ( MismatchedCategoryComponent, ProblematicComponent, UnrecognizedComponent, UnspecifiedComponent, ) +from ._relay import Relay from ._state_code import ElectricalComponentStateCode +from ._steam_boiler import SteamBoiler +from ._wind_turbine import WindTurbine __all__ = [ "AcEvCharger", @@ -50,25 +60,34 @@ "BatteryInverter", "BatteryType", "BatteryTypes", + "Chp", + "Converter", + "CryptoMiner", "DcEvCharger", "ElectricalComponent", "ElectricalComponentCategory", "ElectricalComponentDiagnosticCode", "ElectricalComponentId", "ElectricalComponentStateCode", + "Electrolyzer", "EvCharger", "EvChargerType", "EvChargerTypes", + "Hvac", "HybridEvCharger", "HybridInverter", "Inverter", "InverterType", "InverterTypes", "LiIonBattery", + "Meter", "MismatchedCategoryComponent", "NaIonBattery", + "Precharger", "ProblematicComponent", + "Relay", "SolarInverter", + "SteamBoiler", "UnrecognizedBattery", "UnrecognizedComponent", "UnrecognizedEvCharger", @@ -77,4 +96,5 @@ "UnspecifiedComponent", "UnspecifiedEvCharger", "UnspecifiedInverter", + "WindTurbine", ] diff --git a/src/frequenz/client/common/microgrid/electrical_components/_chp.py b/src/frequenz/client/common/microgrid/electrical_components/_chp.py new file mode 100644 index 00000000..dc3e5152 --- /dev/null +++ b/src/frequenz/client/common/microgrid/electrical_components/_chp.py @@ -0,0 +1,18 @@ +# License: MIT +# Copyright © 2024 Frequenz Energy-as-a-Service GmbH + +"""CHP electrical component.""" + +import dataclasses +from typing import Literal + +from ._category import ElectricalComponentCategory +from ._electrical_component import ElectricalComponent + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class Chp(ElectricalComponent): + """A combined heat and power (CHP) electrical component.""" + + category: Literal[ElectricalComponentCategory.CHP] = ElectricalComponentCategory.CHP + """The category of this electrical component.""" diff --git a/src/frequenz/client/common/microgrid/electrical_components/_converter.py b/src/frequenz/client/common/microgrid/electrical_components/_converter.py new file mode 100644 index 00000000..529490a8 --- /dev/null +++ b/src/frequenz/client/common/microgrid/electrical_components/_converter.py @@ -0,0 +1,20 @@ +# License: MIT +# Copyright © 2024 Frequenz Energy-as-a-Service GmbH + +"""Converter electrical component.""" + +import dataclasses +from typing import Literal + +from ._category import ElectricalComponentCategory +from ._electrical_component import ElectricalComponent + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class Converter(ElectricalComponent): + """An AC-DC converter electrical component.""" + + category: Literal[ElectricalComponentCategory.CONVERTER] = ( + ElectricalComponentCategory.CONVERTER + ) + """The category of this electrical component.""" diff --git a/src/frequenz/client/common/microgrid/electrical_components/_crypto_miner.py b/src/frequenz/client/common/microgrid/electrical_components/_crypto_miner.py new file mode 100644 index 00000000..5fc42cfd --- /dev/null +++ b/src/frequenz/client/common/microgrid/electrical_components/_crypto_miner.py @@ -0,0 +1,20 @@ +# License: MIT +# Copyright © 2024 Frequenz Energy-as-a-Service GmbH + +"""Crypto miner electrical component.""" + +import dataclasses +from typing import Literal + +from ._category import ElectricalComponentCategory +from ._electrical_component import ElectricalComponent + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class CryptoMiner(ElectricalComponent): + """A crypto miner electrical component.""" + + category: Literal[ElectricalComponentCategory.CRYPTO_MINER] = ( + ElectricalComponentCategory.CRYPTO_MINER + ) + """The category of this electrical component.""" diff --git a/src/frequenz/client/common/microgrid/electrical_components/_electrolyzer.py b/src/frequenz/client/common/microgrid/electrical_components/_electrolyzer.py new file mode 100644 index 00000000..9958e900 --- /dev/null +++ b/src/frequenz/client/common/microgrid/electrical_components/_electrolyzer.py @@ -0,0 +1,20 @@ +# License: MIT +# Copyright © 2024 Frequenz Energy-as-a-Service GmbH + +"""Electrolyzer electrical component.""" + +import dataclasses +from typing import Literal + +from ._category import ElectricalComponentCategory +from ._electrical_component import ElectricalComponent + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class Electrolyzer(ElectricalComponent): + """An electrolyzer electrical component.""" + + category: Literal[ElectricalComponentCategory.ELECTROLYZER] = ( + ElectricalComponentCategory.ELECTROLYZER + ) + """The category of this electrical component.""" diff --git a/src/frequenz/client/common/microgrid/electrical_components/_hvac.py b/src/frequenz/client/common/microgrid/electrical_components/_hvac.py new file mode 100644 index 00000000..db506666 --- /dev/null +++ b/src/frequenz/client/common/microgrid/electrical_components/_hvac.py @@ -0,0 +1,20 @@ +# License: MIT +# Copyright © 2024 Frequenz Energy-as-a-Service GmbH + +"""HVAC electrical component.""" + +import dataclasses +from typing import Literal + +from ._category import ElectricalComponentCategory +from ._electrical_component import ElectricalComponent + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class Hvac(ElectricalComponent): + """A heating, ventilation, and air conditioning (HVAC) electrical component.""" + + category: Literal[ElectricalComponentCategory.HVAC] = ( + ElectricalComponentCategory.HVAC + ) + """The category of this electrical component.""" diff --git a/src/frequenz/client/common/microgrid/electrical_components/_meter.py b/src/frequenz/client/common/microgrid/electrical_components/_meter.py new file mode 100644 index 00000000..0c703c20 --- /dev/null +++ b/src/frequenz/client/common/microgrid/electrical_components/_meter.py @@ -0,0 +1,20 @@ +# License: MIT +# Copyright © 2024 Frequenz Energy-as-a-Service GmbH + +"""Meter electrical component.""" + +import dataclasses +from typing import Literal + +from ._category import ElectricalComponentCategory +from ._electrical_component import ElectricalComponent + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class Meter(ElectricalComponent): + """A measuring meter electrical component.""" + + category: Literal[ElectricalComponentCategory.METER] = ( + ElectricalComponentCategory.METER + ) + """The category of this electrical component.""" diff --git a/src/frequenz/client/common/microgrid/electrical_components/_precharger.py b/src/frequenz/client/common/microgrid/electrical_components/_precharger.py new file mode 100644 index 00000000..6d566f1b --- /dev/null +++ b/src/frequenz/client/common/microgrid/electrical_components/_precharger.py @@ -0,0 +1,20 @@ +# License: MIT +# Copyright © 2024 Frequenz Energy-as-a-Service GmbH + +"""Precharger electrical component.""" + +import dataclasses +from typing import Literal + +from ._category import ElectricalComponentCategory +from ._electrical_component import ElectricalComponent + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class Precharger(ElectricalComponent): + """A precharger electrical component.""" + + category: Literal[ElectricalComponentCategory.PRECHARGER] = ( + ElectricalComponentCategory.PRECHARGER + ) + """The category of this electrical component.""" diff --git a/src/frequenz/client/common/microgrid/electrical_components/_relay.py b/src/frequenz/client/common/microgrid/electrical_components/_relay.py new file mode 100644 index 00000000..114e80f4 --- /dev/null +++ b/src/frequenz/client/common/microgrid/electrical_components/_relay.py @@ -0,0 +1,20 @@ +# License: MIT +# Copyright © 2024 Frequenz Energy-as-a-Service GmbH + +"""Relay electrical component.""" + +import dataclasses +from typing import Literal + +from ._category import ElectricalComponentCategory +from ._electrical_component import ElectricalComponent + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class Relay(ElectricalComponent): + """A relay electrical component.""" + + category: Literal[ElectricalComponentCategory.BREAKER] = ( + ElectricalComponentCategory.BREAKER + ) + """The category of this electrical component.""" diff --git a/src/frequenz/client/common/microgrid/electrical_components/_steam_boiler.py b/src/frequenz/client/common/microgrid/electrical_components/_steam_boiler.py new file mode 100644 index 00000000..e26aebbc --- /dev/null +++ b/src/frequenz/client/common/microgrid/electrical_components/_steam_boiler.py @@ -0,0 +1,20 @@ +# License: MIT +# Copyright © 2026 Frequenz Energy-as-a-Service GmbH + +"""Steam boiler electrical component.""" + +import dataclasses +from typing import Literal + +from ._category import ElectricalComponentCategory +from ._electrical_component import ElectricalComponent + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class SteamBoiler(ElectricalComponent): + """A steam boiler electrical component.""" + + category: Literal[ElectricalComponentCategory.STEAM_BOILER] = ( + ElectricalComponentCategory.STEAM_BOILER + ) + """The category of this electrical component.""" diff --git a/src/frequenz/client/common/microgrid/electrical_components/_wind_turbine.py b/src/frequenz/client/common/microgrid/electrical_components/_wind_turbine.py new file mode 100644 index 00000000..629c592b --- /dev/null +++ b/src/frequenz/client/common/microgrid/electrical_components/_wind_turbine.py @@ -0,0 +1,20 @@ +# License: MIT +# Copyright © 2025 Frequenz Energy-as-a-Service GmbH + +"""Wind turbine electrical component.""" + +import dataclasses +from typing import Literal + +from ._category import ElectricalComponentCategory +from ._electrical_component import ElectricalComponent + + +@dataclasses.dataclass(frozen=True, kw_only=True) +class WindTurbine(ElectricalComponent): + """A wind turbine electrical component.""" + + category: Literal[ElectricalComponentCategory.WIND_TURBINE] = ( + ElectricalComponentCategory.WIND_TURBINE + ) + """The category of this electrical component.""" diff --git a/tests/microgrid/electrical_components/test_chp.py b/tests/microgrid/electrical_components/test_chp.py new file mode 100644 index 00000000..10fa2c94 --- /dev/null +++ b/tests/microgrid/electrical_components/test_chp.py @@ -0,0 +1,31 @@ +# License: MIT +# Copyright © 2025 Frequenz Energy-as-a-Service GmbH + +"""Tests for CHP component.""" + +from frequenz.client.common.microgrid import MicrogridId +from frequenz.client.common.microgrid.electrical_components import ( + Chp, + ElectricalComponentCategory, + ElectricalComponentId, +) + + +def test_init() -> None: + """Test CHP component initialization.""" + component_id = ElectricalComponentId(1) + microgrid_id = MicrogridId(1) + component = Chp( + id=component_id, + microgrid_id=microgrid_id, + name="chp_test", + manufacturer="test_manufacturer", + model_name="test_model", + ) + + assert component.id == component_id + assert component.microgrid_id == microgrid_id + assert component.name == "chp_test" + assert component.manufacturer == "test_manufacturer" + assert component.model_name == "test_model" + assert component.category == ElectricalComponentCategory.CHP diff --git a/tests/microgrid/electrical_components/test_converter.py b/tests/microgrid/electrical_components/test_converter.py new file mode 100644 index 00000000..bcdd6558 --- /dev/null +++ b/tests/microgrid/electrical_components/test_converter.py @@ -0,0 +1,31 @@ +# License: MIT +# Copyright © 2025 Frequenz Energy-as-a-Service GmbH + +"""Tests for Converter component.""" + +from frequenz.client.common.microgrid import MicrogridId +from frequenz.client.common.microgrid.electrical_components import ( + Converter, + ElectricalComponentCategory, + ElectricalComponentId, +) + + +def test_init() -> None: + """Test Converter component initialization.""" + component_id = ElectricalComponentId(1) + microgrid_id = MicrogridId(1) + component = Converter( + id=component_id, + microgrid_id=microgrid_id, + name="test_converter", + manufacturer="test_manufacturer", + model_name="test_model", + ) + + assert component.id == component_id + assert component.microgrid_id == microgrid_id + assert component.name == "test_converter" + assert component.manufacturer == "test_manufacturer" + assert component.model_name == "test_model" + assert component.category == ElectricalComponentCategory.CONVERTER diff --git a/tests/microgrid/electrical_components/test_crypto_miner.py b/tests/microgrid/electrical_components/test_crypto_miner.py new file mode 100644 index 00000000..622940c4 --- /dev/null +++ b/tests/microgrid/electrical_components/test_crypto_miner.py @@ -0,0 +1,31 @@ +# License: MIT +# Copyright © 2025 Frequenz Energy-as-a-Service GmbH + +"""Tests for CryptoMiner component.""" + +from frequenz.client.common.microgrid import MicrogridId +from frequenz.client.common.microgrid.electrical_components import ( + CryptoMiner, + ElectricalComponentCategory, + ElectricalComponentId, +) + + +def test_init() -> None: + """Test CryptoMiner component initialization.""" + component_id = ElectricalComponentId(1) + microgrid_id = MicrogridId(1) + component = CryptoMiner( + id=component_id, + microgrid_id=microgrid_id, + name="test_crypto_miner", + manufacturer="test_manufacturer", + model_name="test_model", + ) + + assert component.id == component_id + assert component.microgrid_id == microgrid_id + assert component.name == "test_crypto_miner" + assert component.manufacturer == "test_manufacturer" + assert component.model_name == "test_model" + assert component.category == ElectricalComponentCategory.CRYPTO_MINER diff --git a/tests/microgrid/electrical_components/test_electrolyzer.py b/tests/microgrid/electrical_components/test_electrolyzer.py new file mode 100644 index 00000000..04da6b5b --- /dev/null +++ b/tests/microgrid/electrical_components/test_electrolyzer.py @@ -0,0 +1,31 @@ +# License: MIT +# Copyright © 2025 Frequenz Energy-as-a-Service GmbH + +"""Tests for Electrolyzer component.""" + +from frequenz.client.common.microgrid import MicrogridId +from frequenz.client.common.microgrid.electrical_components import ( + ElectricalComponentCategory, + ElectricalComponentId, + Electrolyzer, +) + + +def test_init() -> None: + """Test Electrolyzer component initialization.""" + component_id = ElectricalComponentId(1) + microgrid_id = MicrogridId(1) + component = Electrolyzer( + id=component_id, + microgrid_id=microgrid_id, + name="test_electrolyzer", + manufacturer="test_manufacturer", + model_name="test_model", + ) + + assert component.id == component_id + assert component.microgrid_id == microgrid_id + assert component.name == "test_electrolyzer" + assert component.manufacturer == "test_manufacturer" + assert component.model_name == "test_model" + assert component.category == ElectricalComponentCategory.ELECTROLYZER diff --git a/tests/microgrid/electrical_components/test_hvac.py b/tests/microgrid/electrical_components/test_hvac.py new file mode 100644 index 00000000..f6602b92 --- /dev/null +++ b/tests/microgrid/electrical_components/test_hvac.py @@ -0,0 +1,31 @@ +# License: MIT +# Copyright © 2025 Frequenz Energy-as-a-Service GmbH + +"""Tests for HVAC component.""" + +from frequenz.client.common.microgrid import MicrogridId +from frequenz.client.common.microgrid.electrical_components import ( + ElectricalComponentCategory, + ElectricalComponentId, + Hvac, +) + + +def test_init() -> None: + """Test HVAC component initialization.""" + component_id = ElectricalComponentId(1) + microgrid_id = MicrogridId(1) + component = Hvac( + id=component_id, + microgrid_id=microgrid_id, + name="test_hvac", + manufacturer="test_manufacturer", + model_name="test_model", + ) + + assert component.id == component_id + assert component.microgrid_id == microgrid_id + assert component.name == "test_hvac" + assert component.manufacturer == "test_manufacturer" + assert component.model_name == "test_model" + assert component.category == ElectricalComponentCategory.HVAC diff --git a/tests/microgrid/electrical_components/test_meter.py b/tests/microgrid/electrical_components/test_meter.py new file mode 100644 index 00000000..273b318e --- /dev/null +++ b/tests/microgrid/electrical_components/test_meter.py @@ -0,0 +1,31 @@ +# License: MIT +# Copyright © 2025 Frequenz Energy-as-a-Service GmbH + +"""Tests for Meter component.""" + +from frequenz.client.common.microgrid import MicrogridId +from frequenz.client.common.microgrid.electrical_components import ( + ElectricalComponentCategory, + ElectricalComponentId, + Meter, +) + + +def test_init() -> None: + """Test Meter component initialization.""" + component_id = ElectricalComponentId(1) + microgrid_id = MicrogridId(1) + component = Meter( + id=component_id, + microgrid_id=microgrid_id, + name="meter_test", + manufacturer="test_manufacturer", + model_name="test_model", + ) + + assert component.id == component_id + assert component.microgrid_id == microgrid_id + assert component.name == "meter_test" + assert component.manufacturer == "test_manufacturer" + assert component.model_name == "test_model" + assert component.category == ElectricalComponentCategory.METER diff --git a/tests/microgrid/electrical_components/test_precharger.py b/tests/microgrid/electrical_components/test_precharger.py new file mode 100644 index 00000000..99d34170 --- /dev/null +++ b/tests/microgrid/electrical_components/test_precharger.py @@ -0,0 +1,31 @@ +# License: MIT +# Copyright © 2025 Frequenz Energy-as-a-Service GmbH + +"""Tests for Precharger component.""" + +from frequenz.client.common.microgrid import MicrogridId +from frequenz.client.common.microgrid.electrical_components import ( + ElectricalComponentCategory, + ElectricalComponentId, + Precharger, +) + + +def test_init() -> None: + """Test Precharger component initialization.""" + component_id = ElectricalComponentId(1) + microgrid_id = MicrogridId(1) + component = Precharger( + id=component_id, + microgrid_id=microgrid_id, + name="precharger_test", + manufacturer="test_manufacturer", + model_name="test_model", + ) + + assert component.id == component_id + assert component.microgrid_id == microgrid_id + assert component.name == "precharger_test" + assert component.manufacturer == "test_manufacturer" + assert component.model_name == "test_model" + assert component.category == ElectricalComponentCategory.PRECHARGER diff --git a/tests/microgrid/electrical_components/test_relay.py b/tests/microgrid/electrical_components/test_relay.py new file mode 100644 index 00000000..643e87d1 --- /dev/null +++ b/tests/microgrid/electrical_components/test_relay.py @@ -0,0 +1,31 @@ +# License: MIT +# Copyright © 2025 Frequenz Energy-as-a-Service GmbH + +"""Tests for Relay component.""" + +from frequenz.client.common.microgrid import MicrogridId +from frequenz.client.common.microgrid.electrical_components import ( + ElectricalComponentCategory, + ElectricalComponentId, + Relay, +) + + +def test_init() -> None: + """Test Relay component initialization.""" + component_id = ElectricalComponentId(1) + microgrid_id = MicrogridId(1) + component = Relay( + id=component_id, + microgrid_id=microgrid_id, + name="relay_test", + manufacturer="test_manufacturer", + model_name="test_model", + ) + + assert component.id == component_id + assert component.microgrid_id == microgrid_id + assert component.name == "relay_test" + assert component.manufacturer == "test_manufacturer" + assert component.model_name == "test_model" + assert component.category == ElectricalComponentCategory.BREAKER diff --git a/tests/microgrid/electrical_components/test_steam_boiler.py b/tests/microgrid/electrical_components/test_steam_boiler.py new file mode 100644 index 00000000..0234a71d --- /dev/null +++ b/tests/microgrid/electrical_components/test_steam_boiler.py @@ -0,0 +1,31 @@ +# License: MIT +# Copyright © 2026 Frequenz Energy-as-a-Service GmbH + +"""Tests for steam boiler component.""" + +from frequenz.client.common.microgrid import MicrogridId +from frequenz.client.common.microgrid.electrical_components import ( + ElectricalComponentCategory, + ElectricalComponentId, + SteamBoiler, +) + + +def test_init() -> None: + """Test steam boiler component initialization.""" + component_id = ElectricalComponentId(1) + microgrid_id = MicrogridId(1) + component = SteamBoiler( + id=component_id, + microgrid_id=microgrid_id, + name="test_steam_boiler", + manufacturer="test_manufacturer", + model_name="test_model", + ) + + assert component.id == component_id + assert component.microgrid_id == microgrid_id + assert component.name == "test_steam_boiler" + assert component.manufacturer == "test_manufacturer" + assert component.model_name == "test_model" + assert component.category == ElectricalComponentCategory.STEAM_BOILER diff --git a/tests/microgrid/electrical_components/test_wind_turbine.py b/tests/microgrid/electrical_components/test_wind_turbine.py new file mode 100644 index 00000000..ca09d66c --- /dev/null +++ b/tests/microgrid/electrical_components/test_wind_turbine.py @@ -0,0 +1,31 @@ +# License: MIT +# Copyright © 2025 Frequenz Energy-as-a-Service GmbH + +"""Tests for WindTurbine component.""" + +from frequenz.client.common.microgrid import MicrogridId +from frequenz.client.common.microgrid.electrical_components import ( + ElectricalComponentCategory, + ElectricalComponentId, + WindTurbine, +) + + +def test_init() -> None: + """Test WindTurbine component initialization.""" + component_id = ElectricalComponentId(1) + microgrid_id = MicrogridId(1) + component = WindTurbine( + id=component_id, + microgrid_id=microgrid_id, + name="wind_turbine_test", + manufacturer="test_manufacturer", + model_name="test_model", + ) + + assert component.id == component_id + assert component.microgrid_id == microgrid_id + assert component.name == "wind_turbine_test" + assert component.manufacturer == "test_manufacturer" + assert component.model_name == "test_model" + assert component.category == ElectricalComponentCategory.WIND_TURBINE