From a35cbe488f19ac47440c273e5b3df1ec3d687d4a Mon Sep 17 00:00:00 2001 From: Simon Blank Date: Wed, 12 Nov 2025 09:19:25 +0100 Subject: [PATCH 1/3] #1047 change BO Energiemenge and use it instead of COM Verbrauch --- src/bo4e/bo/energiemenge.py | 19 ++++++++++--------- src/bo4e/bo/marktlokation.py | 4 ++-- tests/test_energiemenge.py | 10 ++++++---- tests/test_marktlokation.py | 2 ++ 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/bo4e/bo/energiemenge.py b/src/bo4e/bo/energiemenge.py index 072f7f014..03ada029c 100644 --- a/src/bo4e/bo/energiemenge.py +++ b/src/bo4e/bo/energiemenge.py @@ -11,8 +11,9 @@ from .geschaeftsobjekt import Geschaeftsobjekt if TYPE_CHECKING: + from ..com.menge import Menge from ..com.verbrauch import Verbrauch - from ..enum.lokationstyp import Lokationstyp + from ..com.zeitraum import Zeitraum # pylint: disable=too-few-public-methods @@ -34,11 +35,11 @@ class Energiemenge(Geschaeftsobjekt): """ typ: Annotated[Literal[BoTyp.ENERGIEMENGE], Field(alias="_typ")] = BoTyp.ENERGIEMENGE - lokations_id: Optional[str] = None - """Eindeutige Nummer der Marktlokation bzw. der Messlokation, zu der die Energiemenge gehört""" - lokationstyp: Optional["Lokationstyp"] = None - """Gibt an, ob es sich um eine Markt- oder Messlokation handelt""" - - energieverbrauch: Optional[list["Verbrauch"]] = None - """Gibt den Verbrauch in einer Zeiteinheit an""" - # there are no optional attributes + obis_kennzahl: Optional[str] = None + """Die OBIS-Kennzahl der Energiemenge""" + beschreibung: Optional[str] = None + """Ergänzende Beschreibung zur Energiemenge""" + zeitraum: Optional["Zeitraum"] = None + """Zeitraum, in dem die Energiemenge angefallen ist/gemessen wurde""" + menge: Optional["Menge"] = None + """Die angefallene/gemessene Menge""" diff --git a/src/bo4e/bo/marktlokation.py b/src/bo4e/bo/marktlokation.py index 6d43401e0..bbf23fffc 100644 --- a/src/bo4e/bo/marktlokation.py +++ b/src/bo4e/bo/marktlokation.py @@ -12,10 +12,10 @@ from .geschaeftsobjekt import Geschaeftsobjekt if TYPE_CHECKING: + from ..bo.energiemenge import Energiemenge from ..com.adresse import Adresse from ..com.geokoordinaten import Geokoordinaten from ..com.katasteradresse import Katasteradresse - from ..com.verbrauch import Verbrauch from ..com.zaehlwerk import Zaehlwerk from ..enum.bilanzierungsmethode import Bilanzierungsmethode from ..enum.energierichtung import Energierichtung @@ -103,7 +103,7 @@ class Marktlokation(Geschaeftsobjekt): marktgebiet: Optional[str] = None """für Gas. Code vom EIC, https://www.entsog.eu/data/data-portal/codes-list""" zaehlwerke: Optional[list["Zaehlwerk"]] = None - verbrauchsmengen: Optional[list["Verbrauch"]] = None + verbrauchsmengen: Optional[list["Energiemenge"]] = None zaehlwerke_der_beteiligten_marktrolle: Optional[list["Zaehlwerk"]] = None lokationszuordnungen: Optional[list["Lokationszuordnung"]] = None diff --git a/tests/test_energiemenge.py b/tests/test_energiemenge.py index 09d1a0903..eaf20cf01 100644 --- a/tests/test_energiemenge.py +++ b/tests/test_energiemenge.py @@ -1,6 +1,7 @@ import pytest -from bo4e import Energiemenge, Lokationstyp, Verbrauch +from bo4e import Energiemenge, Menge, Zeitraum + from tests.serialization_helper import assert_serialization_roundtrip @@ -10,9 +11,10 @@ class TestEnergiemenge: [ pytest.param( Energiemenge( - lokations_id="DE0123456789012345678901234567890", - lokationstyp=Lokationstyp.MELO, - energieverbrauch=[Verbrauch()], + obis_kennzahl="1-0:1.8.1", + beschreibung="Eine Beschreibung", + zeitraum=Zeitraum(), + menge=Menge(), ), id="all attributes at first level", ), diff --git a/tests/test_marktlokation.py b/tests/test_marktlokation.py index 9c9cfaa84..7de428936 100644 --- a/tests/test_marktlokation.py +++ b/tests/test_marktlokation.py @@ -3,6 +3,7 @@ from bo4e import ( Adresse, Bilanzierungsmethode, + Energiemenge, Energierichtung, Geschaeftspartner, Kundentyp, @@ -29,6 +30,7 @@ class TestMaLo: netzebene=Netzebene.NSP, endkunde=Geschaeftspartner(), kundengruppen=[Kundentyp.GEWERBE, Kundentyp.PRIVAT], + verbrauchsmengen=[Energiemenge()], lokationsbuendel_objektcode="9992 00000 125 6", lokationszuordnungen=[Lokationszuordnung()], ) From 6b0528cf409889acb0d4e7abc4274d7a6975a315 Mon Sep 17 00:00:00 2001 From: Simon Blank Date: Wed, 12 Nov 2025 09:20:42 +0100 Subject: [PATCH 2/3] #1047 remove no longer used COM Verbrauch --- src/bo4e/__init__.py | 2 -- src/bo4e/bo/energiemenge.py | 1 - src/bo4e/com/verbrauch.py | 55 ------------------------------------- src/bo4e/enum/comtyp.py | 1 - tests/test_verbrauch.py | 38 ------------------------- 5 files changed, 97 deletions(-) delete mode 100644 src/bo4e/com/verbrauch.py delete mode 100644 tests/test_verbrauch.py diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 90a761826..b34d2f2a9 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -98,7 +98,6 @@ "TarifpreispositionProOrt", "TarifpreisstaffelProOrt", "Unterschrift", - "Verbrauch", "Vertragskonditionen", "Vertragsteil", "VerwendungszweckProMarktrolle", @@ -302,7 +301,6 @@ from .com.tarifpreispositionproort import TarifpreispositionProOrt from .com.tarifpreisstaffelproort import TarifpreisstaffelProOrt from .com.unterschrift import Unterschrift -from .com.verbrauch import Verbrauch from .com.vertragskonditionen import Vertragskonditionen from .com.vertragsteil import Vertragsteil from .com.verwendungszweckpromarktrolle import VerwendungszweckProMarktrolle diff --git a/src/bo4e/bo/energiemenge.py b/src/bo4e/bo/energiemenge.py index 03ada029c..a1bbf9d77 100644 --- a/src/bo4e/bo/energiemenge.py +++ b/src/bo4e/bo/energiemenge.py @@ -12,7 +12,6 @@ if TYPE_CHECKING: from ..com.menge import Menge - from ..com.verbrauch import Verbrauch from ..com.zeitraum import Zeitraum diff --git a/src/bo4e/com/verbrauch.py b/src/bo4e/com/verbrauch.py deleted file mode 100644 index 2c6d6f958..000000000 --- a/src/bo4e/com/verbrauch.py +++ /dev/null @@ -1,55 +0,0 @@ -""" -Contains Verbrauch -""" - -from decimal import Decimal -from typing import TYPE_CHECKING, Annotated, Literal, Optional - -import pydantic -from pydantic import Field - -from ..enum.comtyp import ComTyp -from ..utils import postprocess_docstring -from .com import COM - -if TYPE_CHECKING: - from ..enum.mengeneinheit import Mengeneinheit - from ..enum.messwertstatus import Messwertstatus - - -# pylint: disable=too-few-public-methods -# pylint: disable=no-name-in-module - - -@postprocess_docstring -class Verbrauch(COM): - """ - Abbildung eines zeitlich abgegrenzten Verbrauchs - - .. raw:: html - - - - .. HINT:: - `Verbrauch JSON Schema `_ - - """ - - typ: Annotated[Literal[ComTyp.VERBRAUCH], Field(alias="_typ")] = ComTyp.VERBRAUCH - - obis_kennzahl: Optional[str] = None - """Die OBIS-Kennzahl für den Wert, die festlegt, welche Größe mit dem Stand gemeldet wird, z.B. '1-0:""" - wert: Optional[Decimal] = None - """Gibt den absoluten Wert der Menge an""" - einheit: Optional["Mengeneinheit"] = None - """Gibt die Einheit zum jeweiligen Wert an""" - - startdatum: Optional[pydantic.AwareDatetime] = None - """Inklusiver Beginn des Zeitraumes, für den der Verbrauch angegeben wird""" - enddatum: Optional[pydantic.AwareDatetime] = None - """ - Exklusives Ende des Zeitraumes, für den der Verbrauch angegeben wird. - Ein ZeitPUNKT kann mit start==ende angegeben werden. - """ - messwertstatus: Optional["Messwertstatus"] = None - """Messwertstatus includes the plausibility of the value""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index 0666bdb81..3b0cef55c 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -63,7 +63,6 @@ class ComTyp(StrEnum): TARIFPREISPOSITIONPROORT = "TARIFPREISPOSITIONPROORT" TARIFPREISSTAFFELPROORT = "TARIFPREISSTAFFELPROORT" UNTERSCHRIFT = "UNTERSCHRIFT" - VERBRAUCH = "VERBRAUCH" VERTRAGSKONDITIONEN = "VERTRAGSKONDITIONEN" VERTRAGSTEIL = "VERTRAGSTEIL" VERWENDUNGSZWECKPROMARKTROLLE = "VERWENDUNGSZWECKPROMARKTROLLE" diff --git a/tests/test_verbrauch.py b/tests/test_verbrauch.py deleted file mode 100644 index b8aeb5ba2..000000000 --- a/tests/test_verbrauch.py +++ /dev/null @@ -1,38 +0,0 @@ -from datetime import datetime, timezone -from decimal import Decimal - -import pytest - -from bo4e import Mengeneinheit, Messwertstatus, Verbrauch -from tests.serialization_helper import assert_serialization_roundtrip - - -class TestVerbrauch: - @pytest.mark.parametrize( - "verbrauch", - [ - pytest.param( - Verbrauch( - wert=Decimal(40), - startdatum=datetime(2021, 12, 1, 0, 0, 0).replace(tzinfo=timezone.utc), - enddatum=datetime(2021, 12, 2, 0, 0, 0).replace(tzinfo=timezone.utc), - obis_kennzahl="1-0:1.8.1", - einheit=Mengeneinheit.KWH, - messwertstatus=Messwertstatus.ABGELESEN, - ) - ), - pytest.param( - Verbrauch( - wert=Decimal(40), - obis_kennzahl="1-0:1.8.1", - einheit=Mengeneinheit.KWH, - messwertstatus=Messwertstatus.ABGELESEN, - ), - ), - ], - ) - def test_serialization_roundtrip(self, verbrauch: Verbrauch) -> None: - """ - Test de-/serialisation of Verbrauch. - """ - assert_serialization_roundtrip(verbrauch) From 2e6ea8b3e087212bcd0d255dfafbdbc8306eb1c8 Mon Sep 17 00:00:00 2001 From: Simon Blank Date: Wed, 12 Nov 2025 09:22:43 +0100 Subject: [PATCH 3/3] #1047 Linting --- tests/test_energiemenge.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_energiemenge.py b/tests/test_energiemenge.py index eaf20cf01..c1c4853fe 100644 --- a/tests/test_energiemenge.py +++ b/tests/test_energiemenge.py @@ -1,7 +1,6 @@ import pytest from bo4e import Energiemenge, Menge, Zeitraum - from tests.serialization_helper import assert_serialization_roundtrip