diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py
index c45aebf00..1be6619e2 100644
--- a/src/bo4e/__init__.py
+++ b/src/bo4e/__init__.py
@@ -9,8 +9,10 @@
"""
__all__ = [
+ "Abwicklungsmodell",
"Angebot",
"Ausschreibung",
+ "Bilanzierung",
"Buendelvertrag",
"Energiemenge",
"Fremdkosten",
@@ -68,6 +70,7 @@
"Kostenblock",
"Kostenposition",
"KriteriumWert",
+ "Lastprofil",
"MarktgebietInfo",
"Menge",
"PositionsAufAbschlag",
@@ -86,6 +89,7 @@
"StandorteigenschaftenGas",
"StandorteigenschaftenStrom",
"Steuerbetrag",
+ "Tagesparameter",
"Tarifberechnungsparameter",
"Tarifeinschraenkung",
"Tarifpreis",
@@ -103,6 +107,7 @@
"Zeitreihenwert",
"Zustaendigkeit",
"AbgabeArt",
+ "Aggregationsverantwortung",
"Angebotsstatus",
"Anrede",
"ArithmetischeOperation",
@@ -120,6 +125,7 @@
"EMobilitaetsart",
"Energierichtung",
"Erzeugungsart",
+ "Fallgruppenzuordnung",
"Gasqualitaet",
"Gebiettyp",
"Geraeteklasse",
@@ -156,6 +162,10 @@
"Preismodell",
"Preisstatus",
"Preistyp",
+ "Profilart",
+ "Profiltyp",
+ "Profilverfahren",
+ "Prognosegrundlage",
"Rechnungslegung",
"Rechnungsstatus",
"Rechnungstyp",
@@ -183,6 +193,7 @@
"Vertragsstatus",
"Verwendungszweck",
"Voraussetzungen",
+ "WahlrechtPrognosegrundlage",
"Waehrungscode",
"Waehrungseinheit",
"Waermenutzung",
@@ -191,6 +202,7 @@
"Zaehlergroesse",
"Zaehlertyp",
"ZaehlertypSpezifikation",
+ "Zeitreihentyp",
"ZusatzAttribut",
"__version__",
"__gh_version__",
@@ -201,6 +213,7 @@
# Import BOs
from .bo.angebot import Angebot
from .bo.ausschreibung import Ausschreibung
+from .bo.bilanzierung import Bilanzierung
from .bo.buendelvertrag import Buendelvertrag
from .bo.energiemenge import Energiemenge
from .bo.fremdkosten import Fremdkosten
@@ -261,6 +274,7 @@
from .com.kostenblock import Kostenblock
from .com.kostenposition import Kostenposition
from .com.kriteriumwert import KriteriumWert
+from .com.lastprofil import Lastprofil
from .com.marktgebietinfo import MarktgebietInfo
from .com.menge import Menge
from .com.positionsaufabschlag import PositionsAufAbschlag
@@ -279,6 +293,7 @@
from .com.standorteigenschaftengas import StandorteigenschaftenGas
from .com.standorteigenschaftenstrom import StandorteigenschaftenStrom
from .com.steuerbetrag import Steuerbetrag
+from .com.tagesparameter import Tagesparameter
from .com.tarifberechnungsparameter import Tarifberechnungsparameter
from .com.tarifeinschraenkung import Tarifeinschraenkung
from .com.tarifpreis import Tarifpreis
@@ -298,6 +313,8 @@
# Import Enums
from .enum.abgabeart import AbgabeArt
+from .enum.abwicklungsmodell import Abwicklungsmodell
+from .enum.aggregationsverantwortung import Aggregationsverantwortung
from .enum.angebotsstatus import Angebotsstatus
from .enum.anrede import Anrede
from .enum.arithmetische_operation import ArithmetischeOperation
@@ -315,6 +332,7 @@
from .enum.emobilitaetsart import EMobilitaetsart
from .enum.energierichtung import Energierichtung
from .enum.erzeugungsart import Erzeugungsart
+from .enum.fallgruppenzuordnung import Fallgruppenzuordnung
from .enum.gasqualitaet import Gasqualitaet
from .enum.gebiettyp import Gebiettyp
from .enum.geraeteklasse import Geraeteklasse
@@ -350,6 +368,10 @@
from .enum.preismodell import Preismodell
from .enum.preisstatus import Preisstatus
from .enum.preistyp import Preistyp
+from .enum.profilart import Profilart
+from .enum.profiltyp import Profiltyp
+from .enum.profilverfahren import Profilverfahren
+from .enum.prognosegrundlage import Prognosegrundlage
from .enum.rechnungslegung import Rechnungslegung
from .enum.rechnungsstatus import Rechnungsstatus
from .enum.rechnungstyp import Rechnungstyp
@@ -380,11 +402,13 @@
from .enum.waehrungscode import Waehrungscode
from .enum.waehrungseinheit import Waehrungseinheit
from .enum.waermenutzung import Waermenutzung
+from .enum.wahlrechtprognosegrundlage import WahlrechtPrognosegrundlage
from .enum.wertermittlungsverfahren import Wertermittlungsverfahren
from .enum.zaehlerauspraegung import Zaehlerauspraegung
from .enum.zaehlergroesse import Zaehlergroesse
from .enum.zaehlertyp import Zaehlertyp
from .enum.zaehlertypspezifikation import ZaehlertypSpezifikation
+from .enum.zeitreihentyp import Zeitreihentyp
from .version import __gh_version__, __version__
from .zusatzattribut import ZusatzAttribut
diff --git a/src/bo4e/bo/bilanzierung.py b/src/bo4e/bo/bilanzierung.py
new file mode 100644
index 000000000..ad9586651
--- /dev/null
+++ b/src/bo4e/bo/bilanzierung.py
@@ -0,0 +1,81 @@
+"""
+Contains class Bilanzierung
+"""
+
+from datetime import datetime
+from decimal import Decimal
+from typing import Annotated, Optional
+
+from pydantic import Field
+
+from bo4e.bo.geschaeftsobjekt import Geschaeftsobjekt
+from bo4e.com.lastprofil import Lastprofil
+from bo4e.com.menge import Menge
+from bo4e.enum.aggregationsverantwortung import Aggregationsverantwortung
+from bo4e.enum.fallgruppenzuordnung import Fallgruppenzuordnung
+from bo4e.enum.profiltyp import Profiltyp
+from bo4e.enum.prognosegrundlage import Prognosegrundlage
+from bo4e.enum.wahlrechtprognosegrundlage import WahlrechtPrognosegrundlage
+from bo4e.enum.zeitreihentyp import Zeitreihentyp
+
+from ..enum.abwicklungsmodell import Abwicklungsmodell
+from ..enum.typ import Typ
+
+
+class Bilanzierung(Geschaeftsobjekt):
+ """
+ Das BO Bilanzierung erfasst alle relevanten Informationen zur Bilanzierung.
+
+ .. raw:: html
+
+
+
+ .. HINT::
+ `Lastprofil JSON Schema `_
+
+ """
+
+ typ: Annotated[Optional[Typ], Field(alias="_typ")] = Typ.BILANZIERUNG
+
+ marktlokations_id: Optional[str] = None #: ID der Marktlokation
+ lastprofil: Optional[list[Lastprofil]] = None #: Eine Liste der verwendeten Lastprofile (SLP, SLP/TLP, ALP etc.)
+ bilanzierungsbeginn: Optional[datetime] = None #: Inklusiver Start der Bilanzierung
+ bilanzierungsende: Optional[datetime] = None #: Exklusives Ende der Bilanzierung
+ bilanzkreis: Optional[str] = None #: Bilanzkreis
+ jahresverbrauchsprognose: Optional[Menge] = None #: Jahresverbrauchsprognose
+ temperatur_arbeit: Optional[Menge] = None #: Temperatur Arbeit
+ kundenwert: Optional[Menge] = None #: Kundenwert
+ verbrauchsaufteilung: Optional[Decimal] = None
+ """
+ Verbrauchsaufteilung in % zwischen SLP und TLP-Profil.
+
+ 1. [Gemessene Energiemenge der OBIS "nicht Schwachlast"] * [Verbrauchsaufteilung in % / 100%]
+ = [zu verlagernde Energiemenge]
+ 2. [Gemessene Energiemenge der OBIS "Schwachlast"] - [zu verlagernde Energiemenge]
+ = [Ermittelte Energiemenge für Schwachlast]
+ 3. [Gemessene Energiemenge der OBIS "nicht Schwachlast"] + [zu verlagernde Energiemenge]
+ = [Ermittelte Energiemenge für nicht Schwachlast]
+ """
+ zeitreihentyp: Optional[Zeitreihentyp] = None #: Zeitreihentyp (SLS, TLS, etc.)
+ aggregationsverantwortung: Optional[Aggregationsverantwortung] = None #: Aggregationsverantwortung
+ prognosegrundlage: Optional[Prognosegrundlage] = None #: Prognosegrundlage
+ details_prognosegrundlage: Optional[list[Profiltyp]] = None
+ """
+ Prognosegrundlage.
+
+ Besteht der Bedarf ein tagesparameteräbhängiges Lastprofil mit gemeinsamer Messung anzugeben,
+ so ist dies über die 2 -malige Wiederholung des CAV Segments mit der Angabe der Codes E02 und E14 möglich.
+ """
+ wahlrecht_prognosegrundlage: Optional[WahlrechtPrognosegrundlage] = None
+ """
+ Wahlrecht der Prognosegrundlage.
+ """
+ fallgruppenzuordnung: Optional[Fallgruppenzuordnung] = None #: Fallgruppenzuordnung (für gas RLM)
+ prioritaet: Optional[int] = None #: Priorität des Bilanzkreises (für Gas)
+ grund_wahlrecht_prognosegrundlage: Optional[WahlrechtPrognosegrundlage] = None
+ """
+ Grund Wahlrecht der Prognosegrundlage.
+
+ true=Wahlrecht beim Lieferanten vorhanden
+ """
+ abwicklungsmodell: Optional[Abwicklungsmodell] = None #: Abwicklungsmodell
diff --git a/src/bo4e/bo/energiemenge.py b/src/bo4e/bo/energiemenge.py
index ed1043ea1..247489eaf 100644
--- a/src/bo4e/bo/energiemenge.py
+++ b/src/bo4e/bo/energiemenge.py
@@ -37,7 +37,6 @@ class Energiemenge(Geschaeftsobjekt):
typ: Annotated[Literal[Typ.ENERGIEMENGE], Field(alias="_typ")] = Typ.ENERGIEMENGE
lokations_id: Optional[str] = None
"""Eindeutige Nummer der Marktlokation bzw. der Messlokation, zu der die Energiemenge gehört"""
- # todo: add validator such that only mess- or marktlokations IDs are accepted + cross check with lokationstyp
lokationstyp: Optional["Lokationstyp"] = None
"""Gibt an, ob es sich um eine Markt- oder Messlokation handelt"""
diff --git a/src/bo4e/com/lastprofil.py b/src/bo4e/com/lastprofil.py
new file mode 100644
index 000000000..0fd80c1f0
--- /dev/null
+++ b/src/bo4e/com/lastprofil.py
@@ -0,0 +1,34 @@
+"""
+Contains class Lastprofil
+"""
+
+from typing import Optional
+
+from bo4e.com.com import COM
+from bo4e.com.tagesparameter import Tagesparameter
+from bo4e.enum.profilart import Profilart
+from bo4e.enum.profilverfahren import Profilverfahren
+
+
+class Lastprofil(COM):
+ """
+ Informationen zum Lastprofil.
+
+ .. raw:: html
+
+
+
+ .. HINT::
+ `Lastprofil JSON Schema `_
+
+ """
+
+ bezeichnung: Optional[str] = None #: Bezeichnung des Profils, durch DVGW bzw. den Netzbetreiber vergeben (z.B. H0)
+ profilschar: Optional[str] = (
+ None #: Bezeichnung der Profilschar, durch DVGW bzw. den Netzbetreiber vergeben (z.B. H0)
+ )
+ verfahren: Optional[Profilverfahren] = None #: Verfahren des Profils (analytisch oder synthetisch)
+ ist_einspeisung: Optional[bool] = None #: Einspeiseprofil: True/False
+ tagesparameter: Optional[Tagesparameter] = None #: Klimazone / Temperaturmessstelle
+ profilart: Optional[Profilart] = None #: Profilart des Lastprofils, e.g. ART_STANDARDLASTPROFIL
+ herausgeber: Optional[str] = None #: Herausgeber des Lastprofil-Codes, e.g. BDEW
diff --git a/src/bo4e/com/tagesparameter.py b/src/bo4e/com/tagesparameter.py
new file mode 100644
index 000000000..f76793d30
--- /dev/null
+++ b/src/bo4e/com/tagesparameter.py
@@ -0,0 +1,19 @@
+"""
+Contains tagesparameter class
+"""
+
+from typing import Optional
+
+from bo4e.com.com import COM
+
+
+class Tagesparameter(COM):
+ """
+ Speichert Informationen zu einer tagesparameter abhängigen Messstelle. z.B. den Namen einer Klimazone oder die ID
+ der Wetterstation für die Temperaturmessstelle
+ """
+
+ klimazone: Optional[str] = None #: Qualifier der Klimazone, e.g. 7624q
+ temperaturmessstelle: Optional[str] = None #: Qualifier der Temperaturmessstelle, e.g. 1234x
+ dienstanbieter: Optional[str] = None #: Dienstanbieter (bei Temperaturmessstellen), e.g. ZT1
+ herausgeber: Optional[str] = None #: Herausgeber des Lastprofil-Codes, e.g. BDEW
diff --git a/src/bo4e/enum/abwicklungsmodell.py b/src/bo4e/enum/abwicklungsmodell.py
new file mode 100644
index 000000000..467a0b144
--- /dev/null
+++ b/src/bo4e/enum/abwicklungsmodell.py
@@ -0,0 +1,11 @@
+# pylint: disable=missing-module-docstring
+from bo4e.enum.strenum import StrEnum
+
+
+class Abwicklungsmodell(StrEnum):
+ """
+ Art des Abwicklungsmodell (E-Mob)
+ """
+
+ MODELL_1 = "MODELL_1" #: Modell 1 "Bilanzierung an der Marktlokation"
+ MODELL_2 = "MODELL_2" #: Modell 2 "Bilanzierung im Bilanzierungsgebiet (BG) des LPB
diff --git a/src/bo4e/enum/aggregationsverantwortung.py b/src/bo4e/enum/aggregationsverantwortung.py
new file mode 100644
index 000000000..8f60f58a0
--- /dev/null
+++ b/src/bo4e/enum/aggregationsverantwortung.py
@@ -0,0 +1,14 @@
+"""
+Contains class Aggregationsverantwortungs
+"""
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Aggregationsverantwortung(StrEnum):
+ """
+ Mögliche Qualifier für die Aggregationsverantwortung
+ """
+
+ UENB = "UENB" #: Übertragungsnetzbetreiber
+ VNB = "VNB" #: Verteilnetzbetreiber
diff --git a/src/bo4e/enum/fallgruppenzuordnung.py b/src/bo4e/enum/fallgruppenzuordnung.py
new file mode 100644
index 000000000..42307c2d7
--- /dev/null
+++ b/src/bo4e/enum/fallgruppenzuordnung.py
@@ -0,0 +1,18 @@
+"""
+Contains Enums for Fallgruppenzuordnung
+"""
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Fallgruppenzuordnung(StrEnum):
+ """
+ Fallgruppenzuordnung nach edi@energy
+ """
+
+ GABI_RLM_MIT_TAGESBAND = "GABI_RLM_MIT_TAGESBAND"
+ """RLM mit Tagesband"""
+ GABI_RLM_OHNE_TAGESBAND = "GABI_RLM_OHNE_TAGESBAND"
+ """RLM ohne Tagesband"""
+ GABI_RLM_IM_NOMINIERUNGSERSATZVERFAHREN = "GABI_RLM_IM_NOMINIERUNGSERSATZVERFAHREN"
+ """RLM im Nominierungsersatzverfahren"""
diff --git a/src/bo4e/enum/profilart.py b/src/bo4e/enum/profilart.py
new file mode 100644
index 000000000..70337ea95
--- /dev/null
+++ b/src/bo4e/enum/profilart.py
@@ -0,0 +1,19 @@
+"""
+Contains Enums for Profilart.
+"""
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Profilart(StrEnum):
+ """
+ Profilart: temperaturabh./Standardlastprofil.
+ """
+
+ ART_STANDARDLASTPROFIL = "ART_STANDARDLASTPROFIL" #: ART_STANDARDLASTPROFIL, Z02
+ ART_TAGESPARAMETERABHAENGIGES_LASTPROFIL = "ART_TAGESPARAMETERABHAENGIGES_LASTPROFIL"
+ """ART_TAGESPARAMETERABHAENGIGES_LASTPROFIL, Z03"""
+ ART_LASTPROFIL = "ART_LASTPROFIL" #: ART_LASTPROFIL, Z12
+ ART_STANDARDEINSPEISEPROFIL = "ART_STANDARDEINSPEISEPROFIL" #: ART_STANDARDEINSPEISEPROFIL, Z04
+ ART_TAGESPARAMETERABHAENGIGES_EINSPEISEPROFIL = "ART_TAGESPARAMETERABHAENGIGES_EINSPEISEPROFIL"
+ #: ART_TAGESPARAMETERABHAENGIGES_EINSPEISEPROFIL, Z05
diff --git a/src/bo4e/enum/profiltyp.py b/src/bo4e/enum/profiltyp.py
new file mode 100644
index 000000000..d2067b21c
--- /dev/null
+++ b/src/bo4e/enum/profiltyp.py
@@ -0,0 +1,14 @@
+"""
+Contains Enums for Profiltyp.
+"""
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Profiltyp(StrEnum):
+ """
+ Profiltyp (temperaturabhängig / Standardlastprofil).
+ """
+
+ SLP_SEP = "SLP_SEP" #: SLP/SEP
+ TLP_TEP = "TLP_TEP" #: TLP/TEP
diff --git a/src/bo4e/enum/profilverfahren.py b/src/bo4e/enum/profilverfahren.py
new file mode 100644
index 000000000..6c726911d
--- /dev/null
+++ b/src/bo4e/enum/profilverfahren.py
@@ -0,0 +1,14 @@
+"""
+Contains Enums for Profilverfahren.
+"""
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Profilverfahren(StrEnum):
+ """
+ Profilverfahren: synthetisch/ analytisch.
+ """
+
+ SYNTHETISCH = "SYNTHETISCH" #: SLP
+ ANALYTISCH = "ANALYTISCH" #: ALP
diff --git a/src/bo4e/enum/prognosegrundlage.py b/src/bo4e/enum/prognosegrundlage.py
new file mode 100644
index 000000000..d244325dc
--- /dev/null
+++ b/src/bo4e/enum/prognosegrundlage.py
@@ -0,0 +1,14 @@
+"""
+Contains Enums for Prognosegrundlage.
+"""
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Prognosegrundlage(StrEnum):
+ """
+ Prognosegrundlage (WERTE, PROFILE).
+ """
+
+ WERTE = "WERTE" #: Prognose auf Basis von Werten
+ PROFILE = "PROFILE" #: Prognose auf Basis von Profilen
diff --git a/src/bo4e/enum/typ.py b/src/bo4e/enum/typ.py
index d3dcdaf46..ba853fba6 100644
--- a/src/bo4e/enum/typ.py
+++ b/src/bo4e/enum/typ.py
@@ -9,6 +9,7 @@ class Typ(StrEnum):
ANGEBOT = "ANGEBOT"
AUSSCHREIBUNG = "AUSSCHREIBUNG"
+ BILANZIERUNG = "BILANZIERUNG"
BUENDELVERTRAG = "BUENDELVERTRAG"
ENERGIEMENGE = "ENERGIEMENGE"
FREMDKOSTEN = "FREMDKOSTEN"
diff --git a/src/bo4e/enum/wahlrechtprognosegrundlage.py b/src/bo4e/enum/wahlrechtprognosegrundlage.py
new file mode 100644
index 000000000..436a752df
--- /dev/null
+++ b/src/bo4e/enum/wahlrechtprognosegrundlage.py
@@ -0,0 +1,18 @@
+"""
+Contains Enums for Wahlrechtsprognosgrundlage.
+"""
+
+from bo4e.enum.strenum import StrEnum
+
+
+class WahlrechtPrognosegrundlage(StrEnum):
+ """
+ Wahlrecht der Prognosegrundlage der Marktlokation.
+ """
+
+ DURCH_LF = "DURCH_LF" #: Wahlrecht durch LF gegeben, remark: SG10 CAV
+ DURCH_LF_NICHT_GEGEBEN = "DURCH_LF_NICHT_GEGEBEN" #: Wahlrecht durch LF nicht gegeben, remark: CAV + ZE2
+ NICHT_WEGEN_GROSSEN_VERBRAUCHS = "NICHT_WEGEN_GROSSEN_VERBRAUCHS" # : kein WR, Verbrauch>10k, CAV+ Z55
+ NICHT_WEGEN_EIGENVERBRAUCH = "NICHT_WEGEN_EIGENVERBRAUCH" #: kein WR, Eigenverbrauch, CAV + ZC1
+ NICHT_WEGEN_TAGES_VERBRAUCH = "NICHT_WEGEN_TAGES_VERBRAUCH" # : kein WR, tagesparam.abh. Verbrauch, CAV + ZD2
+ NICHT_WEGEN_ENWG = "NICHT_WEGEN_ENWG" #: WR nicht wegen $14a EnWG, CAV + ZE3
diff --git a/src/bo4e/enum/zeitreihentyp.py b/src/bo4e/enum/zeitreihentyp.py
new file mode 100644
index 000000000..fc7843a6e
--- /dev/null
+++ b/src/bo4e/enum/zeitreihentyp.py
@@ -0,0 +1,25 @@
+"""
+Contains Enums for Zeitreihentyp.
+"""
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Zeitreihentyp(StrEnum):
+ """
+ Codes der Summenzeitreihentypen.
+
+ Die nachfolgenden Codes sind in DE7111 zu nutzen:
+ https://www.edi-energy.de/index.php?id=38&tx_bdew_bdew%5Buid%5D=695&tx_bdew_bdew%5Baction%5D=download
+ &tx_bdew_bdew%5Bcontroller%5D=Dokument&cHash=67782e05d8b0f75fbe3a0e1801d07ed0
+ """
+
+ EGS = "EGS" #: Einspeisegangsumme
+ LGS = "LGS" #: Lastgangsumme
+ NZR = "NZR" #: Netzzeitreihe
+ SES = "SES" #: Standardeinspeiseprofilsumme
+ SLS = "SLS" #: Standardlastsumme
+ TES = "TES" #: tagesparameterabhängige Einspeiseprofilsumme
+ TLS = "TLS" #: tagesparameterabhängige Lastprofilsumme
+ SLS_TLS = "SLS_TLS" #: gemeinsame Messung aus SLS und TLS
+ SES_TES = "SES_TES" #: gemeinsame Messung aus SES und TES
diff --git a/tests/test_bilanzierung.py b/tests/test_bilanzierung.py
new file mode 100644
index 000000000..9a70acff1
--- /dev/null
+++ b/tests/test_bilanzierung.py
@@ -0,0 +1,66 @@
+from datetime import datetime, timezone
+
+import pytest
+from _decimal import Decimal
+
+from bo4e.bo.bilanzierung import Bilanzierung
+from bo4e.com.lastprofil import Lastprofil
+from bo4e.com.menge import Menge
+from bo4e.com.tagesparameter import Tagesparameter
+from bo4e.enum.aggregationsverantwortung import Aggregationsverantwortung
+from bo4e.enum.fallgruppenzuordnung import Fallgruppenzuordnung
+from bo4e.enum.mengeneinheit import Mengeneinheit
+from bo4e.enum.profilart import Profilart
+from bo4e.enum.profiltyp import Profiltyp
+from bo4e.enum.profilverfahren import Profilverfahren
+from bo4e.enum.prognosegrundlage import Prognosegrundlage
+from bo4e.enum.wahlrechtprognosegrundlage import WahlrechtPrognosegrundlage
+from bo4e.enum.zeitreihentyp import Zeitreihentyp
+from tests.serialization_helper import assert_serialization_roundtrip
+
+
+class TestBilanzierung:
+ @pytest.mark.parametrize(
+ "bilanzierung",
+ [
+ pytest.param(
+ Bilanzierung(
+ marktlokations_id="51238696781",
+ lastprofil=[
+ Lastprofil(
+ bezeichnung="foo",
+ profilschar="foo2",
+ verfahren=Profilverfahren.SYNTHETISCH,
+ ist_einspeisung=True,
+ tagesparameter=Tagesparameter(
+ klimazone="7624q",
+ temperaturmessstelle="1234x",
+ dienstanbieter="ZT1",
+ herausgeber="BDEW",
+ ),
+ profilart=Profilart.ART_LASTPROFIL,
+ herausgeber="BDEW",
+ )
+ ],
+ bilanzierungsbeginn=datetime(2022, 1, 1, 0, 0, 0, tzinfo=timezone.utc),
+ bilanzierungsende=datetime(2023, 1, 1, 0, 0, 0, tzinfo=timezone.utc),
+ bilanzkreis="foo",
+ jahresverbrauchsprognose=Menge(wert=Decimal(3.41), einheit=Mengeneinheit.MWH),
+ temperatur_arbeit=Menge(wert=Decimal(3.41), einheit=Mengeneinheit.MWH),
+ # todo: check einheiten
+ kundenwert=Menge(wert=Decimal(3.41), einheit=Mengeneinheit.MWH),
+ verbrauchsaufteilung=Decimal(1.5),
+ zeitreihentyp=Zeitreihentyp.EGS,
+ aggregationsverantwortung=Aggregationsverantwortung.VNB,
+ prognosegrundlage=Prognosegrundlage.WERTE,
+ details_prognosegrundlage=[Profiltyp.SLP_SEP],
+ wahlrecht_prognosegrundlage=WahlrechtPrognosegrundlage.DURCH_LF,
+ fallgruppenzuordnung=Fallgruppenzuordnung.GABI_RLM_MIT_TAGESBAND,
+ prioritaet=1,
+ grund_wahlrecht_prognosegrundlage=WahlrechtPrognosegrundlage.DURCH_LF_NICHT_GEGEBEN,
+ )
+ ),
+ ],
+ )
+ def test_serialization_roundtrip(self, bilanzierung: Bilanzierung) -> None:
+ assert_serialization_roundtrip(bilanzierung)
diff --git a/tests/test_lastprofil.py b/tests/test_lastprofil.py
new file mode 100644
index 000000000..354e94d57
--- /dev/null
+++ b/tests/test_lastprofil.py
@@ -0,0 +1,36 @@
+import pytest
+
+from bo4e.com.lastprofil import Lastprofil
+from bo4e.com.tagesparameter import Tagesparameter
+from bo4e.enum.profilart import Profilart
+from bo4e.enum.profilverfahren import Profilverfahren
+from tests.serialization_helper import assert_serialization_roundtrip
+
+
+class TestLastprofil:
+ @pytest.mark.parametrize(
+ "lastprofil",
+ [
+ pytest.param(
+ Lastprofil(
+ bezeichnung="foo",
+ profilschar="foo2",
+ verfahren=Profilverfahren.SYNTHETISCH,
+ ist_einspeisung=True,
+ tagesparameter=Tagesparameter(
+ klimazone="7624q",
+ temperaturmessstelle="1234x",
+ dienstanbieter="ZT1",
+ herausgeber="BDEW",
+ ),
+ profilart=Profilart.ART_LASTPROFIL,
+ herausgeber="BDEW",
+ )
+ ),
+ ],
+ )
+ def test_serialization_roundtrip(self, lastprofil: Lastprofil) -> None:
+ """
+ Test de-/serialisation
+ """
+ assert_serialization_roundtrip(lastprofil)
diff --git a/tests/test_tagesparameter.py b/tests/test_tagesparameter.py
new file mode 100644
index 000000000..a52d3851b
--- /dev/null
+++ b/tests/test_tagesparameter.py
@@ -0,0 +1,25 @@
+import pytest
+
+from bo4e.com.tagesparameter import Tagesparameter
+from tests.serialization_helper import assert_serialization_roundtrip
+
+
+class TestTagesparameter:
+ @pytest.mark.parametrize(
+ "tagesparameter",
+ [
+ pytest.param(
+ Tagesparameter(
+ klimazone="7624q",
+ temperaturmessstelle="1234x",
+ dienstanbieter="ZT1",
+ herausgeber="BDEW",
+ )
+ ),
+ ],
+ )
+ def test_serialization_roundtrip(self, tagesparameter: Tagesparameter) -> None:
+ """
+ Test de-/serialisation of Tagesparameter.
+ """
+ assert_serialization_roundtrip(tagesparameter)