diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 17ac712d4..a20691e1a 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -149,6 +149,7 @@ "Messart", "Messgroesse", "Messpreistyp", + "Messwert", "Messwerterfassung", "Messwertstatus", "Messwertstatuszusatz", @@ -277,6 +278,7 @@ from .com.lastprofil import Lastprofil from .com.marktgebietinfo import MarktgebietInfo from .com.menge import Menge +from .com.messwert import Messwert from .com.positionsaufabschlag import PositionsAufAbschlag from .com.preis import Preis from .com.preisgarantie import Preisgarantie diff --git a/src/bo4e/com/messwert.py b/src/bo4e/com/messwert.py new file mode 100644 index 000000000..869dc85ac --- /dev/null +++ b/src/bo4e/com/messwert.py @@ -0,0 +1,43 @@ +""" +Contains Messwert class +""" + +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 ..com.menge import Menge + from ..enum.messwertstatus import Messwertstatus + from ..enum.messwertstatuszusatz import Messwertstatuszusatz + + +@postprocess_docstring +class Messwert(COM): + """ + Abbildung eines Messwertes mit Stati, Zeitpunkt und Wert. + + .. raw:: html + + + + .. HINT:: + `Messwert JSON Schema `_ + + """ + + typ: Annotated[Literal[ComTyp.MESSWERT], Field(alias="_typ")] = ComTyp.MESSWERT + + messwertstatus: Optional["Messwertstatus"] = None + """Gibt den Status des Messwerts an.""" + messwertstatuszusatz: Optional["Messwertstatuszusatz"] = None + """Gibt den Status Zusatz des Messwerts an.""" + zeitpunkt: Optional[pydantic.AwareDatetime] = None + """Gibt den Zeitpunkt des Messwerts an.""" + wert: Optional["Menge"] = None + """Gibt die gemessene Menge an.""" diff --git a/src/bo4e/enum/comtyp.py b/src/bo4e/enum/comtyp.py index afca3294d..0666bdb81 100644 --- a/src/bo4e/enum/comtyp.py +++ b/src/bo4e/enum/comtyp.py @@ -38,6 +38,7 @@ class ComTyp(StrEnum): LASTPROFIL = "LASTPROFIL" MARKTGEBIETINFO = "MARKTGEBIETINFO" MENGE = "MENGE" + MESSWERT = "MESSWERT" POSITIONSAUFABSCHLAG = "POSITIONSAUFABSCHLAG" PREIS = "PREIS" PREISGARANTIE = "PREISGARANTIE" diff --git a/tests/test_messwert.py b/tests/test_messwert.py new file mode 100644 index 000000000..5641c7bd0 --- /dev/null +++ b/tests/test_messwert.py @@ -0,0 +1,28 @@ +from datetime import datetime, timezone + +import pytest + +from bo4e import Menge, Messwert, Messwertstatus, Messwertstatuszusatz +from tests.serialization_helper import assert_serialization_roundtrip + + +class TestMesswert: + @pytest.mark.parametrize( + "messwert", + [ + pytest.param( + Messwert( + messwertstatus=Messwertstatus.ABGELESEN, + messwertstatuszusatz=Messwertstatuszusatz.Z84_LEERSTAND, + zeitpunkt=datetime(2022, 2, 1, 0, 0, 0, tzinfo=timezone.utc), + wert=Menge(), + ), + id="all attributes at first level", + ), + ], + ) + def test_serialization_roundtrip(self, messwert: Messwert) -> None: + """ + Test de-/serialisation roundtrip. + """ + assert_serialization_roundtrip(messwert)