Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
231588a
feat: add new lokationszuordnung
levtoji Apr 9, 2024
5a46a34
chore: linter fix
levtoji Apr 9, 2024
71c2cd4
chore: pre-commit
levtoji Apr 9, 2024
2f44507
chore: module docstring
levtoji Apr 9, 2024
92fb992
chore: working? doc
levtoji Apr 9, 2024
9b6b8c4
Merge branch 'main' into lokationszuordnung
levtoji Apr 10, 2024
316d07d
Merge branch 'main' into lokationszuordnung
levtoji Apr 16, 2024
e8479fd
empty commit
levtoji Apr 16, 2024
0d73ccf
missing bo's created and adaptions implemented (wip)
levtoji Apr 17, 2024
1491719
add missing classes from bo4e dotnet
levtoji Apr 18, 2024
c97ea12
using new added classes
levtoji Apr 18, 2024
31ed45e
Merge branch 'main' into lokationszuordnung
levtoji Apr 18, 2024
460da79
style: fix formatting
levtoji Apr 18, 2024
5d3b52e
added classes to init script
levtoji Apr 18, 2024
1732f4b
cyclic import and missing imports
levtoji Apr 18, 2024
8c37901
doc strings
levtoji Apr 18, 2024
8861302
Merge branch 'main' into lokationszuordnung
levtoji Apr 19, 2024
6b427b8
Merge branch 'main' into lokationszuordnung
levtoji Apr 30, 2024
862b42c
renaming to match naming convention and adding some comments
levtoji Apr 30, 2024
62f5d69
Revert of formatting changes
levtoji Apr 18, 2024
e7a5dcf
Revert "style: fix formatting"
levtoji Apr 30, 2024
38da05e
add missing comments
levtoji Apr 30, 2024
6cdbf7b
Merge branch 'main' into lokationszuordnung
levtoji Apr 30, 2024
e4b5d34
fix docstrings
levtoji May 2, 2024
d164255
Merge branch 'main' into lokationszuordnung
levtoji May 14, 2024
f7ac39a
messlokationszuordnung fix after merge
levtoji May 14, 2024
2c45b8a
Refactor using TYPE_CHECKING
levtoji May 14, 2024
cacbd35
fix: useless import
levtoji May 14, 2024
3277756
Removed reappearing file
levtoji May 14, 2024
f66df18
Add missing none to make the property optional
levtoji May 14, 2024
70ac8bf
Remove Typ for Konfigurationsprodukt
levtoji May 14, 2024
2242c51
Fix JSON-schema generation for models with circular references
lord-haffi May 14, 2024
4efcc89
fix for schema generation
levtoji May 15, 2024
c462ace
Update src/bo4e/bo/marktlokation.py
levtoji May 16, 2024
ef6424c
Update generate_or_validate_json_schemas.py
levtoji May 16, 2024
5290fb7
Update src/bo4e/bo/netzlokation.py
levtoji May 16, 2024
aec024f
Update src/bo4e/bo/steuerbareressource.py
levtoji May 16, 2024
4db594e
Update src/bo4e/bo/steuerbareressource.py
levtoji May 16, 2024
08c19b6
review fixes
levtoji May 21, 2024
9c31701
Todo added to zuordnungstyp in lokationszuordnung
levtoji May 21, 2024
5b636c4
Merge branch 'main' into lokationszuordnung
levtoji May 21, 2024
553a489
Added roundtrip tests
levtoji May 21, 2024
796dde4
Add test konfigurationsprodukt
levtoji May 21, 2024
a2dddc6
fix for Menge
levtoji May 22, 2024
ded2b64
Merge branch 'main' into lokationszuordnung
levtoji May 22, 2024
944fc39
change to decimal
levtoji May 22, 2024
bd1f682
Merge branch 'main' into lokationszuordnung
levtoji May 23, 2024
c6bf32c
Merge branch 'main' into lokationszuordnung
levtoji May 28, 2024
1aa8de8
Update generate_or_validate_json_schemas.py
levtoji Jun 4, 2024
1f4b4b0
Merge branch 'main' into lokationszuordnung
levtoji Jun 4, 2024
769244a
Remove unused include
levtoji Jun 4, 2024
8a5be53
Add list of Lokationszuordnung
levtoji Jun 4, 2024
b33849c
Add import
levtoji Jun 4, 2024
148f798
Adapt tests to new field
levtoji Jun 4, 2024
609b3b3
Fix tests
levtoji Jun 4, 2024
777f749
Update src/bo4e/bo/messlokation.py
levtoji Jun 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion generate_or_validate_json_schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,19 @@ def get_schema_json_dict(cls: Any) -> dict[str, Any]:
schema_json_dict = TypeAdapter(cls).json_schema(schema_generator=GenerateJsonSchema)
else:
raise ValueError(f"Class {cls} is neither a pydantic BaseModel nor an enum.")
if {"allOf", "$defs"} == set(schema_json_dict.keys()):
assert (
len(schema_json_dict["allOf"]) == 1
), "Internal error: Assumed circular reference but structure is unexpected"
# This is the case for schemas containing circular references
reference_pattern = re.compile(r"^#/\$defs/(?P<cls_name>\w+)$")
reference_match = reference_pattern.fullmatch(schema_json_dict["allOf"][0]["$ref"])
assert (
reference_match is not None
), "Internal Error: Reference string has unexpected format: {schema_json_dict['allOf'][0]['$ref']}"
schema_json_dict_to_merge = schema_json_dict["$defs"][reference_match.group("cls_name")]
del schema_json_dict["allOf"]
schema_json_dict.update(schema_json_dict_to_merge)
if "$defs" in schema_json_dict:
del schema_json_dict["$defs"]
return schema_json_dict
Expand Down Expand Up @@ -191,7 +204,7 @@ def traverse_dict(obj: dict[str, Any]) -> None:
)
def generate_or_validate_json_schemas(mode: Literal["validate", "generate"], target_version: str) -> None:
"""generate json schemas for all BOs and COMs"""
_logger.debug("Mode: %s, target version: %s", mode, target_version)
_logger.info("Mode: %s, target version: %s", mode, target_version)
packages = ["bo", "com", "enum"]

if mode == "generate":
Expand Down
22 changes: 20 additions & 2 deletions src/bo4e/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@
"Geschaeftspartner",
"Kosten",
"Lastgang",
"Lokationszuordnung",
"Marktlokation",
"Marktteilnehmer",
"Messlokation",
"Netzlokation",
"Person",
"Preisblatt",
"PreisblattDienstleistung",
Expand All @@ -33,10 +35,12 @@
"Region",
"Regionaltarif",
"Standorteigenschaften",
"SteuerbareRessource",
"Tarif",
"Tarifinfo",
"Tarifkosten",
"Tarifpreisblatt",
"TechnischeRessource",
"Vertrag",
"Zaehler",
"Zeitreihe",
Expand Down Expand Up @@ -66,7 +70,6 @@
"KriteriumWert",
"MarktgebietInfo",
"Menge",
"Messlokationszuordnung",
"PositionsAufAbschlag",
"Preis",
"Preisgarantie",
Expand Down Expand Up @@ -115,6 +118,7 @@
"Bemessungsgroesse",
"Bilanzierungsmethode",
"Dienstleistungstyp",
"EMobilitaetsart",
"Energierichtung",
"Erzeugungsart",
"Gasqualitaet",
Expand All @@ -124,6 +128,7 @@
"Geschaeftspartnerrolle",
"Gueltigkeitstyp",
"Kalkulationsmethode",
"Konfigurationsprodukt",
"Kontaktart",
"Kostenklasse",
"Kundengruppe",
Expand Down Expand Up @@ -159,13 +164,17 @@
"Registeranzahl",
"Rollencodetyp",
"Sparte",
"Speicherart",
"SteuerkanalLeistungsbeschreibung",
"Steuerkennzeichen",
"StrEnum",
"Tarifkalkulationsmethode",
"Tarifmerkmal",
"Tarifregionskriterium",
"Tariftyp",
"Tarifzeit",
"TechnischeRessourceNutzung",
"TechnischeRessourceVerbrauchsart",
"Themengebiet",
"Titel",
"Typ",
Expand Down Expand Up @@ -201,9 +210,11 @@
from .bo.geschaeftspartner import Geschaeftspartner
from .bo.kosten import Kosten
from .bo.lastgang import Lastgang
from .bo.lokationszuordnung import Lokationszuordnung
from .bo.marktlokation import Marktlokation
from .bo.marktteilnehmer import Marktteilnehmer
from .bo.messlokation import Messlokation
from .bo.netzlokation import Netzlokation
from .bo.person import Person
from .bo.preisblatt import Preisblatt
from .bo.preisblattdienstleistung import PreisblattDienstleistung
Expand All @@ -215,10 +226,12 @@
from .bo.region import Region
from .bo.regionaltarif import Regionaltarif
from .bo.standorteigenschaften import Standorteigenschaften
from .bo.steuerbareressource import SteuerbareRessource
from .bo.tarif import Tarif
from .bo.tarifinfo import Tarifinfo
from .bo.tarifkosten import Tarifkosten
from .bo.tarifpreisblatt import Tarifpreisblatt
from .bo.technischeressource import TechnischeRessource
from .bo.vertrag import Vertrag
from .bo.zaehler import Zaehler
from .bo.zeitreihe import Zeitreihe
Expand All @@ -243,14 +256,14 @@
from .com.fremdkostenposition import Fremdkostenposition
from .com.geokoordinaten import Geokoordinaten
from .com.katasteradresse import Katasteradresse
from .com.konfigurationsprodukt import Konfigurationsprodukt
from .com.kontaktweg import Kontaktweg
from .com.konzessionsabgabe import Konzessionsabgabe
from .com.kostenblock import Kostenblock
from .com.kostenposition import Kostenposition
from .com.kriteriumwert import KriteriumWert
from .com.marktgebietinfo import MarktgebietInfo
from .com.menge import Menge
from .com.messlokationszuordnung import Messlokationszuordnung
from .com.positionsaufabschlag import PositionsAufAbschlag
from .com.preis import Preis
from .com.preisgarantie import Preisgarantie
Expand Down Expand Up @@ -301,6 +314,7 @@
from .enum.bemessungsgroesse import Bemessungsgroesse
from .enum.bilanzierungsmethode import Bilanzierungsmethode
from .enum.dienstleistungstyp import Dienstleistungstyp
from .enum.emobilitaetsart import EMobilitaetsart
from .enum.energierichtung import Energierichtung
from .enum.erzeugungsart import Erzeugungsart
from .enum.gasqualitaet import Gasqualitaet
Expand Down Expand Up @@ -345,13 +359,17 @@
from .enum.registeranzahl import Registeranzahl
from .enum.rollencodetyp import Rollencodetyp
from .enum.sparte import Sparte
from .enum.speicherart import Speicherart
from .enum.steuerkanalleistungsbeschreibung import SteuerkanalLeistungsbeschreibung
from .enum.steuerkennzeichen import Steuerkennzeichen
from .enum.strenum import StrEnum
from .enum.tarifkalkulationsmethode import Tarifkalkulationsmethode
from .enum.tarifmerkmal import Tarifmerkmal
from .enum.tarifregionskriterium import Tarifregionskriterium
from .enum.tariftyp import Tariftyp
from .enum.tarifzeit import Tarifzeit
from .enum.technischeressourcenutzung import TechnischeRessourceNutzung
from .enum.technischeressourceverbrauchsart import TechnischeRessourceVerbrauchsart
from .enum.themengebiet import Themengebiet
from .enum.titel import Titel
from .enum.typ import Typ
Expand Down
53 changes: 53 additions & 0 deletions src/bo4e/bo/lokationszuordnung.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
"""
Contains Lokationszuordnung class
"""

from typing import TYPE_CHECKING, Annotated, Optional

from pydantic import Field

from ..enum.typ import Typ
from ..utils import postprocess_docstring
from .geschaeftsobjekt import Geschaeftsobjekt

if TYPE_CHECKING:
from ..bo.marktlokation import Marktlokation
from ..bo.messlokation import Messlokation
from ..bo.netzlokation import Netzlokation
from ..bo.steuerbareressource import SteuerbareRessource
from ..bo.technischeressource import TechnischeRessource
from ..com.zeitspanne import Zeitspanne


@postprocess_docstring
class Lokationszuordnung(Geschaeftsobjekt):
"""
Modell für die Abbildung der Referenz auf die Lokationsbündelstruktur. Diese gibt an welche Marktlokationen,
Messlokationen, Netzlokationen, technische/steuerbaren Ressourcen an einer Lokation vorhanden sind.

.. raw:: html

<object data="../_static/images/bo4e/bo/Lokationszuordnung.svg" type="image/svg+xml"></object>

.. HINT::
`Lokationszuordnung JSON Schema <https://json-schema.app/view/%23?url=https://raw.githubusercontent.com/BO4E/BO4E-Schemas/{__gh_version__}/src/bo4e_schemas/bo/Lokationszuordnung.json>`_
"""

typ: Annotated[Optional[Typ], Field(alias="_typ")] = Typ.LOKATIONSZUORDNUNG

#: Liste mit referenzierten Marktlokationen
marktlokationen: Optional[list["Marktlokation"]] = None
#: Liste mit referenzierten Messlokationen
messlokationen: Optional[list["Messlokation"]] = None
#: Liste mit referenzierten Netzlokationen
netzlokationen: Optional[list["Netzlokation"]] = None
#: Liste mit referenzierten technischen Ressourcen
technische_ressourcen: Optional[list["TechnischeRessource"]] = None
#: Liste mit referenzierten steuerbaren Ressourcen
steuerbare_ressourcen: Optional[list["SteuerbareRessource"]] = None
#: Zeitspanne der Gültigkeit
gueltigkeit: Optional["Zeitspanne"] = None
#: Verknüpfungsrichtung z.B. Malo-Melo [TODO: Eventuell anderer Datentyp]
zuordnungstyp: Optional[str] = None
#: Code, der angibt wie die Lokationsbündelstruktur zusammengesetzt ist (zu finden unter "Codeliste der Lokationsbündelstrukturen" auf https://www.edi-energy.de/index.php?id=38)
lokationsbuendelcode: Optional[str] = None
30 changes: 7 additions & 23 deletions src/bo4e/bo/marktlokation.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
from ..com.adresse import Adresse
from ..com.geokoordinaten import Geokoordinaten
from ..com.katasteradresse import Katasteradresse
from ..com.messlokationszuordnung import Messlokationszuordnung
from ..com.verbrauch import Verbrauch
from ..com.zaehlwerk import Zaehlwerk
from ..enum.bilanzierungsmethode import Bilanzierungsmethode
Expand All @@ -28,6 +27,7 @@
from ..enum.sparte import Sparte
from ..enum.verbrauchsart import Verbrauchsart
from .geschaeftspartner import Geschaeftspartner
from .lokationszuordnung import Lokationszuordnung

# pylint: disable=no-name-in-module

Expand All @@ -47,6 +47,7 @@ class Marktlokation(Geschaeftsobjekt):
"""

typ: Annotated[Optional["Typ"], Field(alias="_typ")] = Typ.MARKTLOKATION

#: Identifikationsnummer einer Marktlokation, an der Energie entweder verbraucht, oder erzeugt wird.
marktlokations_id: Optional[str] = None
#: Sparte der Marktlokation, z.B. Gas oder Strom
Expand Down Expand Up @@ -80,28 +81,6 @@ class Marktlokation(Geschaeftsobjekt):
gasqualitaet: Optional["Gasqualitaet"] = None
#: Geschäftspartner, dem diese Marktlokation gehört
endkunde: Optional["Geschaeftspartner"] = None
zugehoerige_messlokation: Optional["Messlokationszuordnung"] = None # todo: rename to plural
"""
Aufzählung der Messlokationen, die zu dieser Marktlokation gehören.
Es können 3 verschiedene Konstrukte auftreten:

Beziehung 1 : 0 : Hier handelt es sich um Pauschalanlagen ohne Messung. D.h. die Verbrauchsdaten sind direkt über
die Marktlokation abgreifbar.
Beziehung 1 : 1 : Das ist die Standard-Beziehung für die meisten Fälle. In diesem Fall gibt es zu einer
Marktlokation genau eine Messlokation.
Beziehung 1 : N : Hier liegt beispielsweise eine Untermessung vor. Der Verbrauch einer Marklokation berechnet sich
hier aus mehreren Messungen.

Es gibt praktisch auch noch die Beziehung N : 1, beispielsweise bei einer Zweirichtungsmessung bei der durch eine
Messeinrichtung die Messung sowohl für die Einspreiseseite als auch für die Aussspeiseseite erfolgt.
Da Abrechnung und Bilanzierung jedoch für beide Marktlokationen getrennt erfolgt, werden nie beide Marktlokationen
gemeinsam betrachtet. Daher lässt sich dieses Konstrukt auf zwei 1:1-Beziehung zurückführen,
wobei die Messlokation in beiden Fällen die gleiche ist.

In den Zuordnungen sind ist die arithmetische Operation mit der der Verbrauch einer Messlokation zum Verbrauch einer
Marktlokation beitrögt mit aufgeführt.
Der Standard ist hier die Addition.
"""

# only one of the following three optional attributes can be set
#: Die Adresse, an der die Energie-Lieferung oder -Einspeisung erfolgt
Expand All @@ -127,3 +106,8 @@ class Marktlokation(Geschaeftsobjekt):
zaehlwerke: Optional[list["Zaehlwerk"]] = None
verbrauchsmengen: Optional[list["Verbrauch"]] = None
zaehlwerke_der_beteiligten_marktrolle: Optional[list["Zaehlwerk"]] = None

#: Lokationszuordnung, um bspw. die zugehörigen Messlokationen anzugeben
lokationszuordnungen: Optional[list["Lokationszuordnung"]] = None
#: Lokationsbuendel Code, der die Funktion dieses BOs an der Lokationsbuendelstruktur beschreibt.
lokationsbuendel_objektcode: Optional[str] = None
6 changes: 6 additions & 0 deletions src/bo4e/bo/messlokation.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

if TYPE_CHECKING:
from ..bo.geraet import Geraet
from ..bo.lokationszuordnung import Lokationszuordnung
from ..com.adresse import Adresse
from ..com.dienstleistung import Dienstleistung
from ..com.geokoordinaten import Geokoordinaten
Expand All @@ -39,6 +40,7 @@ class Messlokation(Geschaeftsobjekt):
"""

typ: Annotated[Optional["Typ"], Field(alias="_typ")] = Typ.MESSLOKATION

#: Die Messlokations-Identifikation; Das ist die frühere Zählpunktbezeichnung
messlokations_id: Optional[str] = None
#: Sparte der Messlokation, z.B. Gas oder Strom
Expand Down Expand Up @@ -83,3 +85,7 @@ class Messlokation(Geschaeftsobjekt):
Alternativ zu einer postalischen Adresse und Geokoordinaten kann hier eine Ortsangabe mittels Gemarkung und
Flurstück erfolgen.
"""
#: Lokationszuordnung, um bspw. die zugehörigen Marktlokationen anzugeben
lokationszuordnungen: Optional[list["Lokationszuordnung"]] = None
#: Lokationsbuendel Code, der die Funktion dieses BOs an der Lokationsbuendelstruktur beschreibt.
lokationsbuendel_objektcode: Optional[str] = None
63 changes: 63 additions & 0 deletions src/bo4e/bo/netzlokation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
"""
Contains Netzlokation class
and corresponding marshmallow schema for de-/serialization
"""

from typing import TYPE_CHECKING, Annotated, Optional

from pydantic import Field

from ..enum.typ import Typ
from ..utils import postprocess_docstring
from .geschaeftsobjekt import Geschaeftsobjekt

if TYPE_CHECKING:
from ..bo.lokationszuordnung import Lokationszuordnung
from ..com.konfigurationsprodukt import Konfigurationsprodukt
from ..com.menge import Menge
from ..com.verwendungszweckpromarktrolle import VerwendungszweckProMarktrolle
from ..enum.marktrolle import Marktrolle
from ..enum.sparte import Sparte


# pylint: disable=too-many-instance-attributes, too-few-public-methods


@postprocess_docstring
class Netzlokation(Geschaeftsobjekt):
"""
Object containing information about a Netzlokation

.. raw:: html

<object data="../_static/images/bo4e/bo/Netzlokation.svg" type="image/svg+xml"></object>

.. HINT::
`Netzlokation JSON Schema <https://json-schema.app/view/%23?url=https://raw.githubusercontent.com/BO4E/BO4E-Schemas/{__gh_version__}/src/bo4e_schemas/bo/Netzlokation.json>`_

"""

typ: Annotated[Optional[Typ], Field(alias="_typ")] = Typ.NETZLOKATION

#: Identifikationsnummer einer Netzlokation, an der Energie entweder verbraucht, oder erzeugt wird
netzlokations_id: Optional[str] = None
#: Sparte der Netzlokation, z.B. Gas oder Strom.
sparte: Optional["Sparte"] = None
#: Netzanschlussleistungsmenge der Netzlokation
netzanschlussleistung: Optional["Menge"] = None
#: Codenummer des grundzuständigen Messstellenbetreibers, der für diese Netzlokation zuständig ist.
grundzustaendiger_msb_codenr: Optional[str] = None
#: Ob ein Steuerkanal der Netzlokation zugeordnet ist und somit die Netzlokation gesteuert werden kann.
steuerkanal: Optional[bool] = None
#: Die OBIS-Kennzahl für die Netzlokation
obiskennzahl: Optional[str] = None
#: Verwendungungszweck der Werte Netzlokation
verwendungszweck: Optional["VerwendungszweckProMarktrolle"] = None
#: Produkt-Daten der Netzlokation
konfigurationsprodukte: Optional[list["Konfigurationsprodukt"]] = None
#: Eigenschaft des Messstellenbetreibers an der Lokation
eigenschaft_msb_lokation: Optional["Marktrolle"] = None
#: Lokationszuordnung, um bspw. die zugehörigen Messlokationen anzugeben
lokationszuordnungen: Optional[list["Lokationszuordnung"]] = None
#: Lokationsbuendel Code, der die Funktion dieses BOs an der Lokationsbuendelstruktur beschreibt.
lokationsbuendel_objektcode: Optional[str] = None
Loading