Repository: bo4e/BO4E-python (language: python)

Issue:
Improve Enum construction
At the moment the enums are generated during runtime.  This is now fine cause it works, but your IDE of choice is not able to make suggestions in this way.
It should be like the HTTPStatus enum
```python
from http import HTTPStatus

HTTPStatus.ACCEPTED
```
The main struggle is the string representation for the serialization. But this issue should be solveable.
👷 Test in Multiple Python Versions; Run Black, Coverage and Linter in most recent version only
Rationale:
- The code formatter (black) needs to run only in 1 python version; use the latest one
- The tests should cover all versions >= 3.8 (min version)
- Other than the tests, the coverage measurement needs to happen only once; use the latest python version
- Linting only needs to be done the most recent version


Discussion / hints:
If we decide to use Python 3.10, this problem should be solved by using StrEnum:
https://github.com/python/cpython/blob/7c4d96103c4e16161e9aed9a584c9857d0674099/Doc/howto/enum.rst#id101

https://docs.python.org/3.10/whatsnew/changelog.html#changelog
https://bugs.python.org/issue41816


Fix patch:
diff --git a/src/bo4e/enum/anrede.py b/src/bo4e/enum/anrede.py
index d98321ced..baf1814c8 100644
--- a/src/bo4e/enum/anrede.py
+++ b/src/bo4e/enum/anrede.py
@@ -1,16 +1,14 @@
-"""
-Übersicht möglicher Anreden, z.B. eines Geschäftspartners.
-"""
+# pylint: disable=missing-module-docstring
+from bo4e.enum.strenum import StrEnum
 
-from enum import Enum
 
-Anrede = Enum(
-    "Anrede",
-    {
-        "HERR": "HERR",
-        "FRAU": "FRAU",
-        "EHELEUTE": "EHELEUTE",
-        "FIRMA": "FIRMA",
-        "INDIVIDUELL": "INDIVIDUELL",
-    },
-)
+class Anrede(StrEnum):
+    """
+    Übersicht möglicher Anreden, z.B. eines Geschäftspartners.
+    """
+
+    HERR = "HERR"
+    FRAU = "FRAU"
+    EHELEUTE = "EHELEUTE"
+    FIRMA = "FIRMA"
+    INDIVIDUELL = "INDIVIDUELL"
diff --git a/src/bo4e/enum/arithmetische_operation.py b/src/bo4e/enum/arithmetische_operation.py
index 797cccad3..bacd2ee4c 100644
--- a/src/bo4e/enum/arithmetische_operation.py
+++ b/src/bo4e/enum/arithmetische_operation.py
@@ -1,15 +1,13 @@
-"""
-Mit dieser Aufzählung können arithmetische Operationen festgelegt werden.
-"""
+# pylint: disable=missing-module-docstring
+from bo4e.enum.strenum import StrEnum
 
-from enum import Enum
 
-ArithmetischeOperation = Enum(
-    "ArithmetischeOperation",
-    {
-        "ADDITION": "ADDITION",
-        "SUBTRAKTION": "SUBTRAKTION",
-        "MULTIPLIKATION": "MULTIPLIKATION",
-        "DIVISION": "DIVISION",
-    },
-)
+class ArithmetischeOperation(StrEnum):
+    """
+    Mit dieser Aufzählung können arithmetische Operationen festgelegt werden.
+    """
+
+    ADDITION = "ADDITION"
+    SUBTRAKTION = "SUBTRAKTION"
+    MULTIPLIKATION = "MULTIPLIKATION"
+    DIVISION = "DIVISION"
diff --git a/src/bo4e/enum/bilanzierungsmethode.py b/src/bo4e/enum/bilanzierungsmethode.py
index 53690fc66..3296b0ce7 100644
--- a/src/bo4e/enum/bilanzierungsmethode.py
+++ b/src/bo4e/enum/bilanzierungsmethode.py
@@ -1,15 +1,14 @@
-"""
-Mit dieser Aufzählung kann zwischen den Bilanzierungsmethoden bzw. -grundlagen unterschieden werden.
-"""
-from enum import Enum
+# pylint: disable=missing-module-docstring
+from bo4e.enum.strenum import StrEnum
 
-Bilanzierungsmethode = Enum(
-    "Bilanzierungsmethode",
-    {
-        "RLM": "RLM",  # Registrierende Leistungsmessung
-        "SLP": "SLP",  # Standard Lastprofil
-        "TLP_GEMEINSAM": "TLP_GEMEINSAM",  # TLP gemeinsame Messung
-        "TLP_GETRENNT": "TLP_GETRENNT",  # TLP getrennte Messung
-        "PAUSCHAL": "PAUSCHAL",  # Pauschale Betrachtung (Band)
-    },
-)
+
+class Bilanzierungsmethode(StrEnum):
+    """
+    Mit dieser Aufzählung kann zwischen den Bilanzierungsmethoden bzw. -grundlagen unterschieden werden.
+    """
+
+    RLM = "RLM"  # Registrierende Leistungsmessung
+    SLP = "SLP"  # Standard Lastprofil
+    TLP_GEMEINSAM = "TLP_GEMEINSAM"  # TLP gemeinsame Messung
+    TLP_GETRENNT = "TLP_GETRENNT"  # TLP getrennte Messung
+    PAUSCHAL = "PAUSCHAL"  # Pauschale Betrachtung (Band)
diff --git a/src/bo4e/enum/botyp.py b/src/bo4e/enum/botyp.py
index ea852a3b9..c73ad4736 100644
--- a/src/bo4e/enum/botyp.py
+++ b/src/bo4e/enum/botyp.py
@@ -1,39 +1,37 @@
-"""
-Auflistung sämtlicher existierender Geschäftsobjekte.
-"""
+# pylint:disable=missing-module-docstring
+from bo4e.enum.strenum import StrEnum
 
-from enum import Enum
 
-BoTyp = Enum(
-    "BoTyp",
-    {
-        "ANGEBOT": "ANGEBOT",
-        "ANSPRECHPARTNER": "ANSPRECHPARTNER",
-        "AUSSCHREIBUNG": "AUSSCHREIUNG",
-        "ENERGIEMENGE": "ENERGIEMENGE",
-        # It is practical to use the BoTyp Enum as discriminator in the database.
-        # Therefore we added one additional entry for GESCHAEFTSOBJEKT
-        # This is not defined by the documentation!
-        "GESCHAEFTSOBJEKT": "GESCHAEFTSOBJEKT",
-        "GESCHAEFTSPARTNER": "GESCHAEFTSPARTNER",
-        "KOSTEN": "KOSTEN",
-        "MARKTLOKATION": "MARKTLOKATION",
-        "MESSLOKATION": "MESSLOKATION",
-        "MARKTTEILNEHMER": "MARKTTEILNEHMER",
-        "NETZNUTZUNGSRECHNUNG": "NETZNUTZUNGSRECHNUNG",
-        "PREISBLATT": "PREISBLATT",
-        "PREISBLATTDIENSTLEISTUNG": "PREISBLATTDIENSTLEISTUNG",
-        "PREISBLATTKONZESSIONSABGABE": "PREISBLATTKONZESSIONSABGABE",
-        "PREISBLATTMESSUNG": "PREISBLATTMESSUNG",
-        "PREISBLATTNETZNUTZUNG": "PREISBLATTNETZNUTZUNG",
-        "PREISBLATTUMLAGEN": "PREISBLATTUMLAGEN",
-        "RECHNUNG": "RECHNUNG",
-        "REGIONALTARIF": "REGIONALTARIF",
-        "TARIFINFO": "TARIFINFO",
-        "TARIFKOSTEN": "TARIFKOSTEN",
-        "TARIFPREISBLATT": "TARIFPREISBLATT",
-        "VERTRAG": "VERTRAG",
-        "ZAEHLER": "ZAEHLER",
-        "ZEITREIHE": "ZEITREIHE",
-    },
-)
+class BoTyp(StrEnum):
+    """
+    Auflistung sämtlicher existierender Geschäftsobjekte.
+    """
+
+    ANGEBOT = "ANGEBOT"
+    ANSPRECHPARTNER = "ANSPRECHPARTNER"
+    AUSSCHREIBUNG = "AUSSCHREIUNG"
+    ENERGIEMENGE = "ENERGIEMENGE"
+    # It is practical to use the BoTyp Enum as discriminator in the database.
+    # Therefore we added one additional entry for GESCHAEFTSOBJEKT
+    # This is not defined by the documentation!
+    GESCHAEFTSOBJEKT = "GESCHAEFTSOBJEKT"
+    GESCHAEFTSPARTNER = "GESCHAEFTSPARTNER"
+    KOSTEN = "KOSTEN"
+    MARKTLOKATION = "MARKTLOKATION"
+    MESSLOKATION = "MESSLOKATION"
+    MARKTTEILNEHMER = "MARKTTEILNEHMER"
+    NETZNUTZUNGSRECHNUNG = "NETZNUTZUNGSRECHNUNG"
+    PREISBLATT = "PREISBLATT"
+    PREISBLATTDIENSTLEISTUNG = "PREISBLATTDIENSTLEISTUNG"
+    PREISBLATTKONZESSIONSABGABE = "PREISBLATTKONZESSIONSABGABE"
+    PREISBLATTMESSUNG = "PREISBLATTMESSUNG"
+    PREISBLATTNETZNUTZUNG = "PREISBLATTNETZNUTZUNG"
+    PREISBLATTUMLAGEN = "PREISBLATTUMLAGEN"
+    RECHNUNG = "RECHNUNG"
+    REGIONALTARIF = "REGIONALTARIF"
+    TARIFINFO = "TARIFINFO"
+    TARIFKOSTEN = "TARIFKOSTEN"
+    TARIFPREISBLATT = "TARIFPREISBLATT"
+    VERTRAG = "VERTRAG"
+    ZAEHLER = "ZAEHLER"
+    ZEITREIHE = "ZEITREIHE"
diff --git a/src/bo4e/enum/dienstleistungstyp.py b/src/bo4e/enum/dienstleistungstyp.py
index e9d14e43f..9b4c280cb 100644
--- a/src/bo4e/enum/dienstleistungstyp.py
+++ b/src/bo4e/enum/dienstleistungstyp.py
@@ -1,55 +1,54 @@
-"""
-Auflistung möglicher abzurechnender Dienstleistungen.
-"""
-from enum import Enum
+# pylint:disable=missing-module-docstring
+
+from bo4e.enum.strenum import StrEnum
+
 
 # pylint: disable=line-too-long
+class Dienstleistungstyp(StrEnum):
+    """
+    Auflistung möglicher abzurechnender Dienstleistungen.
+    """
 
-Dienstleistungstyp: Enum = Enum(
-    "Dienstleistungstyp",
-    {
-        "DATENBEREITSTELLUNG_TAEGLICH": "DATENBEREITSTELLUNG_TAEGLICH",  # Datenbereitstellung täglich
-        "DATENBEREITSTELLUNG_WOECHENTLICH": "DATENBEREITSTELLUNG_WOECHENTLICH",  # Datenbereitstellung wöchentlich
-        "DATENBEREITSTELLUNG_MONATLICH": "DATENBEREITSTELLUNG_MONATLICH",  # Datenbereitstellung monatlich
-        "DATENBEREITSTELLUNG_JAEHRLICH": "DATENBEREITSTELLUNG_JAEHRLICH",  # Datenbereitstellung jährlich
-        "DATENBEREITSTELLUNG_HISTORISCHE_LG": "DATENBEREITSTELLUNG_HISTORISCHE_LG",
-        # Datenbereitstellung historischer Lastgänge
-        "DATENBEREITSTELLUNG_STUENDLICH": "DATENBEREITSTELLUNG_STUENDLICH",  # Datenbereitstellung stündlich
-        "DATENBEREITSTELLUNG_VIERTELJAEHRLICH": "DATENBEREITSTELLUNG_VIERTELJAEHRLICH",
-        # Datenbereitstellung vierteljährlich
-        "DATENBEREITSTELLUNG_HALBJAEHRLICH": "DATENBEREITSTELLUNG_HALBJAEHRLICH",  # Datenbereitstellung halbjährlich
-        "DATENBEREITSTELLUNG_MONATLICH_ZUSAETZLICH": "DATENBEREITSTELLUNG_MONATLICH_ZUSAETZLICH",
-        # Datenbereitstellung monatlich zusätzlich
-        "DATENBEREITSTELLUNG_EINMALIG": "DATENBEREITSTELLUNG_EINMALIG",  # Datenbereitstellung einmalig
-        "AUSLESUNG_2X_TAEGLICH_FERNAUSLESUNG": "AUSLESUNG_2X_TAEGLICH_FERNAUSLESUNG",
-        # Auslesung 2x täglich mittels Fernauslesung
-        "AUSLESUNG_TAEGLICH_FERNAUSLESUNG": "AUSLESUNG_TAEGLICH_FERNAUSLESUNG",  # Auslesung täglich mittels Fernauslesung
-        "AUSLESUNG_MANUELL_MSB": "AUSLESUNG_MANUELL_MSB",  # Auslesung, manuell vom Messstellenbetreiber vorgenommen
-        "AUSLESUNG_MONATLICH_FERNAUSLESUNG": "AUSLESUNG_MONATLICH_FERNAUSLESUNG",
-        # Auslesung monatlich bei mittels Fernauslesung
-        "AUSLESUNG_JAEHRLICH_FERNAUSLESUNG": "AUSLESUNG_JAEHRLICH_FERNAUSLESUNG",
-        # Auslesung jährlich bei SLP mittels Fernauslesung
-        "AUSLESUNG_MDE": "AUSLESUNG_MDE",  # Auslesung mit mobiler Daten Erfassung (MDE)
-        "ABLESUNG_MONATLICH": "ABLESUNG_MONATLICH",  # Ablesung monatlich
-        "ABLESUNG_VIERTELJAEHRLICH": "ABLESUNG_VIERTELJAEHRLICH",  # Ablesung vierteljährlich
-        "ABLESUNG_HALBJAEHRLICH": "ABLESUNG_HALBJAEHRLICH",  # Ablesung halbjährlich
-        "ABLESUNG_JAEHRLICH": "ABLESUNG_JAEHRLICH",  # Ablesung jährlich
-        "AUSLESUNG_FERNAUSLESUNG": "AUSLESUNG_FERNAUSLESUNG",  # Auslesung mittels Fernauslesung
-        "ABLESUNG_ZUSAETZLICH_MSB": "ABLESUNG_ZUSAETZLICH_MSB",  # Ablesung, zusätzlich vom Messstellenbetreiber vorgenommen
-        "ABLESUNG_ZUSAETZLICH_KUNDE": "ABLESUNG_ZUSAETZLICH_KUNDE",  # Ablesung SLP, zusätzlich vom Kunden vorgenommen
-        "AUSLESUNG_FERNAUSLESUNG_ZUSAETZLICH_MSB": "AUSLESUNG_FERNAUSLESUNG_ZUSAETZLICH_MSB",
-        # Auslesung, mittels Fernauslesung, zusätzlich vom Messstellenbetreiber vorgenommen
-        "AUSLESUNG_MOATLICH_FERNAUSLESUNG": "AUSLESUNG_MOATLICH_FERNAUSLESUNG",  # Auslesung monatlich mittels Fernauslesung
-        "AUSLESUNG_STUENDLICH_FERNAUSLESUNG": "AUSLESUNG_STUENDLICH_FERNAUSLESUNG",
-        # Auslesung stündlich mittels Fernauslesung
-        "AUSLESUNG_TEMPERATURMENGENUMWERTER": "AUSLESUNG_TEMPERATURMENGENUMWERTER",  # Auslesung Temperaturmengenumwerter
-        "AUSLESUNG_ZUSTANDSMENGENUMWERTER": "AUSLESUNG_ZUSTANDSMENGENUMWERTER",  # Auslesung Zustandsmengenumwerter
-        "AUSLESUNG_SYSTEMMENGENUMWERTER": "AUSLESUNG_SYSTEMMENGENUMWERTER",  # Auslesung Systemmengenumwerter
-        "AUSLESUNG_VORGANG": "AUSLESUNG_VORGANG",  # Auslesung je Vorgang
-        "AUSLESUNG_KOMPAKTMENGENUMWERTER": "AUSLESUNG_KOMPAKTMENGENUMWERTER",  # Auslesung Kompaktmengenumwerter
-        "SPERRUNG": "SPERRUNG",  # Sperrung einer Abnahmestelle
-        "ENTSPERRUNG": "ENTSPERRUNG",  # Entsperrung einer Abnahmestelle
-        "MAHNKOSTEN": "MAHNKOSTEN",  # Mahnkosten
-        "INKASSOKOSTEN": "INKASSOKOSTEN",  # Inkassokosten
-    },
-)
+    DATENBEREITSTELLUNG_TAEGLICH = "DATENBEREITSTELLUNG_TAEGLICH"  # Datenbereitstellung täglich
+    DATENBEREITSTELLUNG_WOECHENTLICH = "DATENBEREITSTELLUNG_WOECHENTLICH"  # Datenbereitstellung wöchentlich
+    DATENBEREITSTELLUNG_MONATLICH = "DATENBEREITSTELLUNG_MONATLICH"  # Datenbereitstellung monatlich
+    DATENBEREITSTELLUNG_JAEHRLICH = "DATENBEREITSTELLUNG_JAEHRLICH"  # Datenbereitstellung jährlich
+    DATENBEREITSTELLUNG_HISTORISCHE_LG = "DATENBEREITSTELLUNG_HISTORISCHE_LG"
+    # Datenbereitstellung historischer Lastgänge
+    DATENBEREITSTELLUNG_STUENDLICH = "DATENBEREITSTELLUNG_STUENDLICH"  # Datenbereitstellung stündlich
+    DATENBEREITSTELLUNG_VIERTELJAEHRLICH = "DATENBEREITSTELLUNG_VIERTELJAEHRLICH"
+    # Datenbereitstellung vierteljährlich
+    DATENBEREITSTELLUNG_HALBJAEHRLICH = "DATENBEREITSTELLUNG_HALBJAEHRLICH"  # Datenbereitstellung halbjährlich
+    DATENBEREITSTELLUNG_MONATLICH_ZUSAETZLICH = "DATENBEREITSTELLUNG_MONATLICH_ZUSAETZLICH"
+    # Datenbereitstellung monatlich zusätzlich
+    DATENBEREITSTELLUNG_EINMALIG = "DATENBEREITSTELLUNG_EINMALIG"  # Datenbereitstellung einmalig
+    AUSLESUNG_2X_TAEGLICH_FERNAUSLESUNG = "AUSLESUNG_2X_TAEGLICH_FERNAUSLESUNG"
+    # Auslesung 2x täglich mittels Fernauslesung
+    AUSLESUNG_TAEGLICH_FERNAUSLESUNG = "AUSLESUNG_TAEGLICH_FERNAUSLESUNG"  # Auslesung täglich mittels Fernauslesung
+    AUSLESUNG_MANUELL_MSB = "AUSLESUNG_MANUELL_MSB"  # Auslesung, manuell vom Messstellenbetreiber vorgenommen
+    AUSLESUNG_MONATLICH_FERNAUSLESUNG = "AUSLESUNG_MONATLICH_FERNAUSLESUNG"
+    # Auslesung monatlich bei mittels Fernauslesung
+    AUSLESUNG_JAEHRLICH_FERNAUSLESUNG = "AUSLESUNG_JAEHRLICH_FERNAUSLESUNG"
+    # Auslesung jährlich bei SLP mittels Fernauslesung
+    AUSLESUNG_MDE = "AUSLESUNG_MDE"  # Auslesung mit mobiler Daten Erfassung (MDE)
+    ABLESUNG_MONATLICH = "ABLESUNG_MONATLICH"  # Ablesung monatlich
+    ABLESUNG_VIERTELJAEHRLICH = "ABLESUNG_VIERTELJAEHRLICH"  # Ablesung vierteljährlich
+    ABLESUNG_HALBJAEHRLICH = "ABLESUNG_HALBJAEHRLICH"  # Ablesung halbjährlich
+    ABLESUNG_JAEHRLICH = "ABLESUNG_JAEHRLICH"  # Ablesung jährlich
+    AUSLESUNG_FERNAUSLESUNG = "AUSLESUNG_FERNAUSLESUNG"  # Auslesung mittels Fernauslesung
+    ABLESUNG_ZUSAETZLICH_MSB = "ABLESUNG_ZUSAETZLICH_MSB"  # Ablesung, zusätzlich vom Messstellenbetreiber vorgenommen
+    ABLESUNG_ZUSAETZLICH_KUNDE = "ABLESUNG_ZUSAETZLICH_KUNDE"  # Ablesung SLP, zusätzlich vom Kunden vorgenommen
+    AUSLESUNG_FERNAUSLESUNG_ZUSAETZLICH_MSB = "AUSLESUNG_FERNAUSLESUNG_ZUSAETZLICH_MSB"
+    # Auslesung, mittels Fernauslesung, zusätzlich vom Messstellenbetreiber vorgenommen
+    AUSLESUNG_MOATLICH_FERNAUSLESUNG = "AUSLESUNG_MOATLICH_FERNAUSLESUNG"  # Auslesung monatlich mittels Fernauslesung
+    AUSLESUNG_STUENDLICH_FERNAUSLESUNG = "AUSLESUNG_STUENDLICH_FERNAUSLESUNG"
+    # Auslesung stündlich mittels Fernauslesung
+    AUSLESUNG_TEMPERATURMENGENUMWERTER = "AUSLESUNG_TEMPERATURMENGENUMWERTER"  # Auslesung Temperaturmengenumwerter
+    AUSLESUNG_ZUSTANDSMENGENUMWERTER = "AUSLESUNG_ZUSTANDSMENGENUMWERTER"  # Auslesung Zustandsmengenumwerter
+    AUSLESUNG_SYSTEMMENGENUMWERTER = "AUSLESUNG_SYSTEMMENGENUMWERTER"  # Auslesung Systemmengenumwerter
+    AUSLESUNG_VORGANG = "AUSLESUNG_VORGANG"  # Auslesung je Vorgang
+    AUSLESUNG_KOMPAKTMENGENUMWERTER = "AUSLESUNG_KOMPAKTMENGENUMWERTER"  # Auslesung Kompaktmengenumwerter
+    SPERRUNG = "SPERRUNG"  # Sperrung einer Abnahmestelle
+    ENTSPERRUNG = "ENTSPERRUNG"  # Entsperrung einer Abnahmestelle
+    MAHNKOSTEN = "MAHNKOSTEN"  # Mahnkosten
+    INKASSOKOSTEN = "INKASSOKOSTEN"  # Inkassokosten
diff --git a/src/bo4e/enum/energierichtung.py b/src/bo4e/enum/energierichtung.py
index ffca6eb58..6fd1646fb 100644
--- a/src/bo4e/enum/energierichtung.py
+++ b/src/bo4e/enum/energierichtung.py
@@ -1,6 +1,12 @@
-"""
-Spezifiziert die Energierichtung einer Markt- und/oder Messlokation
-"""
-from enum import Enum
+# pylint:disable=missing-module-docstring
 
-Energierichtung = Enum("Energierichtung", {"AUSSP": "AUSSP", "EINSP": "EINSP"})  # Ausspeisung  # Einspeisung
+from bo4e.enum.strenum import StrEnum
+
+
+class Energierichtung(StrEnum):
+    """
+    Spezifiziert die Energierichtung einer Markt- und/oder Messlokation
+    """
+
+    AUSSP = "AUSSP"  # Ausspeisung
+    EINSP = "EINSP"  # Einspeisung
diff --git a/src/bo4e/enum/gasqualitaet.py b/src/bo4e/enum/gasqualitaet.py
index 8e70e8eeb..1c4498bf8 100644
--- a/src/bo4e/enum/gasqualitaet.py
+++ b/src/bo4e/enum/gasqualitaet.py
@@ -1,12 +1,12 @@
-"""
-Unterscheidung für hoch- und niedrig-kalorisches Gas.
-"""
-from enum import Enum
-
-Gasqualitaet = Enum(
-    "Gasqualitaet",
-    {
-        "H_GAS": "H_GAS",  # High Caloric Gas
-        "L_GAS": "L_GAS",  # Low Caloric Gas
-    },
-)  # type: ignore
+# pylint:disable=missing-module-docstring
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Gasqualitaet(StrEnum):
+    """
+    Unterscheidung für hoch- und niedrig-kalorisches Gas.
+    """
+
+    H_GAS = "H_GAS"  # High Caloric Gas
+    L_GAS = "L_GAS"  # Low Caloric Gas
diff --git a/src/bo4e/enum/gebiettyp.py b/src/bo4e/enum/gebiettyp.py
index 7ed104c30..b460e21c7 100644
--- a/src/bo4e/enum/gebiettyp.py
+++ b/src/bo4e/enum/gebiettyp.py
@@ -1,19 +1,19 @@
-"""
-List of possible Gebiettypen.
-"""
-from enum import Enum
+# pylint:disable=missing-module-docstring
 
-Gebiettyp = Enum(
-    "Gebiettyp",
-    {
-        "REGELZONE": "REGELZONE",
-        "MARKTGEBIET": "MARKTGEBIET",
-        "BILANZIERUNGSGEBIET": "BILANZIERUNGSGEBIET",
-        "VERTEILNETZ": "VERTEILNETZ",
-        "TRANSPORTNETZ": "TRANSPORTNETZ",
-        "REGIONALNETZ": "REGIONALNETZ",
-        "AREALNETZ": "AREALNETZ",
-        "GRUNDVERSORGUNGSGEBIET": "GRUNDVERSORGUNGSGEBIET",
-        "VERSORGUNGSGEBIET": "VERSORGUNGSGEBIET",
-    },
-)
+from bo4e.enum.strenum import StrEnum
+
+
+class Gebiettyp(StrEnum):
+    """
+    List of possible Gebiettypen.
+    """
+
+    REGELZONE = "REGELZONE"
+    MARKTGEBIET = "MARKTGEBIET"
+    BILANZIERUNGSGEBIET = "BILANZIERUNGSGEBIET"
+    VERTEILNETZ = "VERTEILNETZ"
+    TRANSPORTNETZ = "TRANSPORTNETZ"
+    REGIONALNETZ = "REGIONALNETZ"
+    AREALNETZ = "AREALNETZ"
+    GRUNDVERSORGUNGSGEBIET = "GRUNDVERSORGUNGSGEBIET"
+    VERSORGUNGSGEBIET = "VERSORGUNGSGEBIET"
diff --git a/src/bo4e/enum/geraetetyp.py b/src/bo4e/enum/geraetetyp.py
index 70dc369b7..e1a9d23f8 100644
--- a/src/bo4e/enum/geraetetyp.py
+++ b/src/bo4e/enum/geraetetyp.py
@@ -1,56 +1,55 @@
-"""
-Auflistung möglicher abzurechnender Gerätetypen.
-"""
-from enum import Enum
+# pylint:disable=missing-module-docstring
+
+from bo4e.enum.strenum import StrEnum
+
 
 # pylint: disable=line-too-long
-Geraetetyp = Enum(
-    "Geraetetyp",
-    {
-        "WECHSELSTROMZAEHLER": "WECHSELSTROMZAEHLER",  # Wechselstromzähler
-        "DREHSTROMZAEHLER": "DREHSTROMZAEHLER",  # Drehstromzähler
-        "ZWEIRICHTUNGSZAEHLER": "ZWEIRICHTUNGSZAEHLER",  # Zweirichtungszähler
-        "RLM_ZAEHLER": "RLM_ZAEHLER",  # RLM-Zähler
-        "BALGENGASZAEHLER": "BALGENGASZAEHLER",  # Balgengaszähler
-        "MAXIMUMZAEHLER": "MAXIMUMZAEHLER",  # Maximumzähler (Schleppzähler)
-        "MULTIPLEXANLAGE": "MULTIPLEXANLAGE",  # Multiplexeranlage
-        "PAUSCHALANLAGE": "PAUSCHALANLAGE",  # Pauschalanlagen
-        "VERSTAERKERANLAGE": "VERSTAERKERANLAGE",  # Verstärkeranlage
-        "SUMMATIONSGERAET": "SUMMATIONSGERAET",  # Summationsgerät
-        "IMPULSGEBER": "IMPULSGEBER",  # Impulsgeber
-        "EDL_21_ZAEHLERAUFSATZ": "EDL_21_ZAEHLERAUFSATZ",  # EDL 21 Zähleraufsatz für Zähler
-        "VIER_QUADRANTEN_LASTGANGZAEHLER": "VIER_QUADRANTEN_LASTGANGZAEHLER",  # Vier-Quadranten-Lastgangzähler
-        "MENGENUMWERTER": "MENGENUMWERTER",  # Mengenumwerter
-        "STROMWANDLER": "STROMWANDLER",  # Stromwandler
-        "SPANNUNGSWANDLER": "SPANNUNGSWANDLER",  # Spannungs-Wandler
-        "KOMBIMESSWANDLER": "KOMBIMESSWANDLER",  # Kombimesswandler
-        "BLOCKSTROMWANDLER": "BLOCKSTROMWANDLER",  # Blockstromwandler
-        "DATENLOGGER": "DATENLOGGER",  # Datenlogger
-        "KOMMUNIKATIONSANSCHLUSS": "KOMMUNIKATIONSANSCHLUSS",  # Kommunikationsanschluss
-        "MODEM": "MODEM",  # Modem
-        "TELEKOMMUNIKATIONSEINRICHTUNG": "TELEKOMMUNIKATIONSEINRICHTUNG",
-        # vom Messstellenbetreiber beigestellte Telekommunikationseinrichtung (Telefonanschluss)
-        "DREHKOLBENGASZAEHLER": "DREHKOLBENGASZAEHLER",  # Drehkolbengaszähler
-        "TURBINENRADGASZAEHLER": "TURBINENRADGASZAEHLER",  # Turbinenradgaszähler
-        "ULTRASCHALLZAEHLER": "ULTRASCHALLZAEHLER",  # Ultraschallzähler
-        "WIRBELGASZAEHLER": "WIRBELGASZAEHLER",  # Wirbelgaszähler
-        "MODERNE_MESSEINRICHTUNG": "MODERNE_MESSEINRICHTUNG",  # moderne Messeinrichtung
-        "INTELLIGENTES_MESSYSTEM": "INTELLIGENTES_MESSYSTEM",  # Intelligentes Messystem
-        "ELEKTRONISCHER_HAUSHALTSZAEHLER": "ELEKTRONISCHER_HAUSHALTSZAEHLER",  # elektronischer Haushaltszähler
-        "STEUEREINRICHTUNG": "STEUEREINRICHTUNG",  # Steuereinrichtung
-        "TARIFSCHALTGERAET": "TARIFSCHALTGERAET",  # Tarifschaltgerät
-        "RUNDSTEUEREMPFAENGER": "RUNDSTEUEREMPFAENGER",  # Rundsteuerempfänger
-        "OPTIONALE_ZUS_ZAEHLEINRICHTUNG": "OPTIONALE_ZUS_ZAEHLEINRICHTUNG",  # optionale zusätzliche Zähleinrichtung
-        "MESSWANDLERSATZ_IMS_MME": "MESSWANDLERSATZ_IMS_MME",  # Messwandlersatz Strom iMS und mME, NSP
-        "KOMBIMESSWANDLER_IMS_MME": "KOMBIMESSWANDLER_IMS_MME",  # Kombimesswandlersatz (Strom u. Spg) iMS und mME
-        "TARIFSCHALTGERAET_IMS_MME": "TARIFSCHALTGERAET_IMS_MME",  # Tarifschaltung iMS und mME
-        "RUNDSTEUEREMPFAENGER_IMS_MME": "RUNDSTEUEREMPFAENGER_IMS_MME",  # Rundsteuerempfänger iMS und mME
-        "TEMPERATUR_KOMPENSATION": "TEMPERATUR_KOMPENSATION",  # Temperaturkompensation
-        "HOECHSTBELASTUNGS_ANZEIGER": "HOECHSTBELASTUNGS_ANZEIGER",  # Höchsbelastungsanzeiger
-        "SONSTIGES_GERAET": "SONSTIGES_GERAET",  # Sonstiges Gerät
-        "PREPAYMENTZAEHLER": "PREPAYMENTZAEHLER",  # Prepaymentzähler
-        "EDL_21": "EDL_21",  # EDL21
-        "96_H_ZAEHLER": "96_H_ZAEHLER",  # 96 h Zähler
-        "EDL_40_ZAEHLERAUFSATZ": "EDL_40_ZAEHLERAUFSATZ",  # EDL 40 Zähleraufsatz für Zähler
-    },
-)
+class Geraetetyp(StrEnum):
+    """
+    Auflistung möglicher abzurechnender Gerätetypen.
+    """
+
+    WECHSELSTROMZAEHLER = "WECHSELSTROMZAEHLER"  # Wechselstromzähler
+    DREHSTROMZAEHLER = "DREHSTROMZAEHLER"  # Drehstromzähler
+    ZWEIRICHTUNGSZAEHLER = "ZWEIRICHTUNGSZAEHLER"  # Zweirichtungszähler
+    RLM_ZAEHLER = "RLM_ZAEHLER"  # RLM-Zähler
+    BALGENGASZAEHLER = "BALGENGASZAEHLER"  # Balgengaszähler
+    MAXIMUMZAEHLER = "MAXIMUMZAEHLER"  # Maximumzähler (Schleppzähler)
+    MULTIPLEXANLAGE = "MULTIPLEXANLAGE"  # Multiplexeranlage
+    PAUSCHALANLAGE = "PAUSCHALANLAGE"  # Pauschalanlagen
+    VERSTAERKERANLAGE = "VERSTAERKERANLAGE"  # Verstärkeranlage
+    SUMMATIONSGERAET = "SUMMATIONSGERAET"  # Summationsgerät
+    IMPULSGEBER = "IMPULSGEBER"  # Impulsgeber
+    EDL_21_ZAEHLERAUFSATZ = "EDL_21_ZAEHLERAUFSATZ"  # EDL 21 Zähleraufsatz für Zähler
+    VIER_QUADRANTEN_LASTGANGZAEHLER = "VIER_QUADRANTEN_LASTGANGZAEHLER"  # Vier-Quadranten-Lastgangzähler
+    MENGENUMWERTER = "MENGENUMWERTER"  # Mengenumwerter
+    STROMWANDLER = "STROMWANDLER"  # Stromwandler
+    SPANNUNGSWANDLER = "SPANNUNGSWANDLER"  # Spannungs-Wandler
+    KOMBIMESSWANDLER = "KOMBIMESSWANDLER"  # Kombimesswandler
+    BLOCKSTROMWANDLER = "BLOCKSTROMWANDLER"  # Blockstromwandler
+    DATENLOGGER = "DATENLOGGER"  # Datenlogger
+    KOMMUNIKATIONSANSCHLUSS = "KOMMUNIKATIONSANSCHLUSS"  # Kommunikationsanschluss
+    MODEM = "MODEM"  # Modem
+    TELEKOMMUNIKATIONSEINRICHTUNG = "TELEKOMMUNIKATIONSEINRICHTUNG"  # vom Messstellenbetreiber beigestellte Telekommunikationseinrichtung (Telefonanschluss)
+    DREHKOLBENGASZAEHLER = "DREHKOLBENGASZAEHLER"  # Drehkolbengaszähler
+    TURBINENRADGASZAEHLER = "TURBINENRADGASZAEHLER"  # Turbinenradgaszähler
+    ULTRASCHALLZAEHLER = "ULTRASCHALLZAEHLER"  # Ultraschallzähler
+    WIRBELGASZAEHLER = "WIRBELGASZAEHLER"  # Wirbelgaszähler
+    MODERNE_MESSEINRICHTUNG = "MODERNE_MESSEINRICHTUNG"  # moderne Messeinrichtung
+    INTELLIGENTES_MESSYSTEM = "INTELLIGENTES_MESSYSTEM"  # Intelligentes Messystem
+    ELEKTRONISCHER_HAUSHALTSZAEHLER = "ELEKTRONISCHER_HAUSHALTSZAEHLER"  # elektronischer Haushaltszähler
+    STEUEREINRICHTUNG = "STEUEREINRICHTUNG"  # Steuereinrichtung
+    TARIFSCHALTGERAET = "TARIFSCHALTGERAET"  # Tarifschaltgerät
+    RUNDSTEUEREMPFAENGER = "RUNDSTEUEREMPFAENGER"  # Rundsteuerempfänger
+    OPTIONALE_ZUS_ZAEHLEINRICHTUNG = "OPTIONALE_ZUS_ZAEHLEINRICHTUNG"  # optionale zusätzliche Zähleinrichtung
+    MESSWANDLERSATZ_IMS_MME = "MESSWANDLERSATZ_IMS_MME"  # Messwandlersatz Strom iMS und mME, NSP
+    KOMBIMESSWANDLER_IMS_MME = "KOMBIMESSWANDLER_IMS_MME"  # Kombimesswandlersatz (Strom u. Spg) iMS und mME
+    TARIFSCHALTGERAET_IMS_MME = "TARIFSCHALTGERAET_IMS_MME"  # Tarifschaltung iMS und mME
+    RUNDSTEUEREMPFAENGER_IMS_MME = "RUNDSTEUEREMPFAENGER_IMS_MME"  # Rundsteuerempfänger iMS und mME
+    TEMPERATUR_KOMPENSATION = "TEMPERATUR_KOMPENSATION"  # Temperaturkompensation
+    HOECHSTBELASTUNGS_ANZEIGER = "HOECHSTBELASTUNGS_ANZEIGER"  # Höchsbelastungsanzeiger
+    SONSTIGES_GERAET = "SONSTIGES_GERAET"  # Sonstiges Gerät
+    PREPAYMENTZAEHLER = "PREPAYMENTZAEHLER"  # Prepaymentzähler
+    EDL_21 = "EDL_21"  # EDL21
+    _96_H_ZAEHLER = "96_H_ZAEHLER"  # 96 h Zähler
+    EDL_40_ZAEHLERAUFSATZ = "EDL_40_ZAEHLERAUFSATZ"  # EDL 40 Zähleraufsatz für Zähler
diff --git a/src/bo4e/enum/geschaeftspartnerrolle.py b/src/bo4e/enum/geschaeftspartnerrolle.py
index 9233e979c..1aa3791de 100644
--- a/src/bo4e/enum/geschaeftspartnerrolle.py
+++ b/src/bo4e/enum/geschaeftspartnerrolle.py
@@ -1,15 +1,15 @@
-"""
-Diese Rollen kann ein Geschäftspartner einnehmen.
-"""
-from enum import Enum
-
-Geschaeftspartnerrolle = Enum(
-    "Geschaeftspartnerrolle",
-    {
-        "LIEFERANT": "LIEFERANT",
-        "DIENSTLEISTER": "DIENSTLEISTER",
-        "KUNDE": "KUNDE",
-        "INTERESSENT": "INTERESSENT",
-        "MARKTPARTNER": "MARKTPARTNER",
-    },
-)
+# pylint:disable=missing-module-docstring
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Geschaeftspartnerrolle(StrEnum):
+    """
+    Diese Rollen kann ein Geschäftspartner einnehmen.
+    """
+
+    LIEFERANT = "LIEFERANT"
+    DIENSTLEISTER = "DIENSTLEISTER"
+    KUNDE = "KUNDE"
+    INTERESSENT = "INTERESSENT"
+    MARKTPARTNER = "MARKTPARTNER"
diff --git a/src/bo4e/enum/kontaktart.py b/src/bo4e/enum/kontaktart.py
index 518508fc5..54987ec54 100644
--- a/src/bo4e/enum/kontaktart.py
+++ b/src/bo4e/enum/kontaktart.py
@@ -1,15 +1,15 @@
-"""
-Art des Kontaktes zwischen Geschäftspartnern.
-"""
-from enum import Enum
-
-Kontaktart = Enum(
-    "Kontaktart",
-    {
-        "ANSCHREIBEN": "ANSCHREIBEN",
-        "TELEFONAT": "TELEFONAT",
-        "FAX": "FAX",
-        "E_MAIL": "E_MAIL",
-        "SMS": "SMS",
-    },
-)
+# pylint:disable=missing-module-docstring
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Kontaktart(StrEnum):
+    """
+    Art des Kontaktes zwischen Geschäftspartnern.
+    """
+
+    ANSCHREIBEN = "ANSCHREIBEN"
+    TELEFONAT = "TELEFONAT"
+    FAX = "FAX"
+    E_MAIL = "E_MAIL"
+    SMS = "SMS"
diff --git a/src/bo4e/enum/marktrolle.py b/src/bo4e/enum/marktrolle.py
index bbbefe919..ac0f33f53 100644
--- a/src/bo4e/enum/marktrolle.py
+++ b/src/bo4e/enum/marktrolle.py
@@ -1,24 +1,24 @@
-"""
-Diese Rollen kann ein Marktteilnehmer einnehmen.
-"""
-from enum import Enum
+# pylint:disable=missing-module-docstring
 
-Marktrolle = Enum(
-    "Marktrolle",
-    {
-        "NB": "NB",  # Grid Operator
-        "LF": "LF",  # Supplier
-        "MSB": "MSB",  # Messstellenbetreiber
-        "DL": "DL",  # Dienstleister
-        "BKV": "BKV",  # Bilanzkreisverantwortlicher,
-        "BKO": "BKO",  # Bilanzkoordinator / Marktgebietsverantwortlicher
-        "UENB": "UENB",  # Übertragungsnetzbetreiber
-        "KUNDE_SELBST_NN": "KUNDE_SELBST_NN",  # Kunden, die Netznutzungsentgelte selbst zahlen
-        "MGV": "MGV",  # Marktgebietsverantwortlicher
-        "EIV": "EIV",  # Einsatzverantwortlicher
-        "RB": "RB",  # Registerbetreiber
-        "KUNDE": "KUNDE",
-        "INTERESSENT": "INTERESSENT",
-        "BTR": "BTR",  # Betreiber einer technischen Ressource
-    },
-)
+from bo4e.enum.strenum import StrEnum
+
+
+class Marktrolle(StrEnum):
+    """
+    Diese Rollen kann ein Marktteilnehmer einnehmen.
+    """
+
+    NB = "NB"  # Grid Operator
+    LF = "LF"  # Supplier
+    MSB = "MSB"  # Messstellenbetreiber
+    DL = "DL"  # Dienstleister
+    BKV = "BKV"  # Bilanzkreisverantwortlicher,
+    BKO = "BKO"  # Bilanzkoordinator / Marktgebietsverantwortlicher
+    UENB = "UENB"  # Übertragungsnetzbetreiber
+    KUNDE_SELBST_NN = "KUNDE_SELBST_NN"  # Kunden, die Netznutzungsentgelte selbst zahlen
+    MGV = "MGV"  # Marktgebietsverantwortlicher
+    EIV = "EIV"  # Einsatzverantwortlicher
+    RB = "RB"  # Registerbetreiber
+    KUNDE = "KUNDE"
+    INTERESSENT = "INTERESSENT"
+    BTR = "BTR"  # Betreiber einer technischen Ressource
diff --git a/src/bo4e/enum/mengeneinheit.py b/src/bo4e/enum/mengeneinheit.py
index aceb96759..4caaa83d1 100644
--- a/src/bo4e/enum/mengeneinheit.py
+++ b/src/bo4e/enum/mengeneinheit.py
@@ -1,24 +1,24 @@
-"""
-Einheit: Messgrößen, die per Messung oder Vorgabe ermittelt werden können.
-"""
-from enum import Enum
+# pylint:disable=missing-module-docstring
 
-Mengeneinheit = Enum(
-    "Mengeneinheit",
-    {
-        "W": "W",  # Watt
-        "WH": "WH",  # Wattstunde
-        "KW": "KW",  # Kilowatt
-        "KWH": "KWH",  # Kilowattstunde
-        "KVARH": "KVARH",  # Kilovarstunde
-        "MW": "MW",  # Megawatt
-        "MWH": "MWH",  # Megawattstunde
-        "STUECK": "STUECK",  # Stückzahl
-        "KUBIKMETER": "KUBIKMETER",  # Kubikmeter (Gas)
-        "STUNDE": "STUNDE",  # Stunde
-        "TAG": "TAG",  # Tage
-        "MONAT": "MONAT",  # Monat
-        "JAHR": "JAHR",  # Jahr
-        "PROZENT": "PROZENT",  # Prozent
-    },
-)
+from bo4e.enum.strenum import StrEnum
+
+
+class Mengeneinheit(StrEnum):
+    """
+    Einheit: Messgrößen, die per Messung oder Vorgabe ermittelt werden können.
+    """
+
+    W = "W"  # Watt
+    WH = "WH"  # Wattstunde
+    KW = "KW"  # Kilowatt
+    KWH = "KWH"  # Kilowattstunde
+    KVARH = "KVARH"  # Kilovarstunde
+    MW = "MW"  # Megawatt
+    MWH = "MWH"  # Megawattstunde
+    STUECK = "STUECK"  # Stückzahl
+    KUBIKMETER = "KUBIKMETER"  # Kubikmeter (Gas)
+    STUNDE = "STUNDE"  # Stunde
+    TAG = "TAG"  # Tage
+    MONAT = "MONAT"  # Monat
+    JAHR = "JAHR"  # Jahr
+    PROZENT = "PROZENT"  # Prozent
diff --git a/src/bo4e/enum/netzebene.py b/src/bo4e/enum/netzebene.py
index c31ad07c5..0479c1bd8 100644
--- a/src/bo4e/enum/netzebene.py
+++ b/src/bo4e/enum/netzebene.py
@@ -1,21 +1,20 @@
-"""
-Auflistung möglicher Netzebenen innerhalb der Energiearten Strom und Gas.
-"""
+# pylint:disable=missing-module-docstring
 
-from enum import Enum
+from bo4e.enum.strenum import StrEnum
 
-Netzebene = Enum(
-    "Netzebene",
-    {
-        "NSP": "NSP",  # Niederspannung; Strom
-        "MSP": "MSP",  # Mittelspannung; Strom
-        "HSP": "HSP",  # Hochspannung; Strom
-        "HSS": "HSS",  # Hoechstspannung; Strom
-        "MSP_NSP_UMSP": "MSP_NSP_UMSP",  # MS/NS Umspannung; Strom
-        "HSP_MSP_UMSP": "HSP_MSP_UMSP",  # HS/MS Umspannung; Strom
-        "HSS_HSP_UMSP": "HSS_HSP_UMSP",  # HOES/HS Umspannung; Strom
-        "HD": "HD",  # Hochdruck; Gas
-        "MD": "MD",  # Mitteldruck; Gas
-        "ND": "ND",  # Niederdruck; Gas
-    },
-)
+
+class Netzebene(StrEnum):
+    """
+    Auflistung möglicher Netzebenen innerhalb der Energiearten Strom und Gas.
+    """
+
+    NSP = "NSP"  # Niederspannung; Strom
+    MSP = "MSP"  # Mittelspannung; Strom
+    HSP = "HSP"  # Hochspannung; Strom
+    HSS = "HSS"  # Hoechstspannung; Strom
+    MSP_NSP_UMSP = "MSP_NSP_UMSP"  # MS/NS Umspannung; Strom
+    HSP_MSP_UMSP = "HSP_MSP_UMSP"  # HS/MS Umspannung; Strom
+    HSS_HSP_UMSP = "HSS_HSP_UMSP"  # HOES/HS Umspannung; Strom
+    HD = "HD"  # Hochdruck; Gas
+    MD = "MD"  # Mitteldruck; Gas
+    ND = "ND"  # Niederdruck; Gas
diff --git a/src/bo4e/enum/rollencodetyp.py b/src/bo4e/enum/rollencodetyp.py
index 3c3311903..fe46d6849 100644
--- a/src/bo4e/enum/rollencodetyp.py
+++ b/src/bo4e/enum/rollencodetyp.py
@@ -1,14 +1,13 @@
-"""
-Gibt den Codetyp einer Rolle, beispielsweise einer Marktrolle, an.
-"""
-
-from enum import Enum
-
-Rollencodetyp = Enum(
-    "Rollencodetyp",
-    {
-        "BDEW": "BDEW",  # Bundesverband der Energie- u. Wasserwirtschaft
-        "DVG": "DVG",  # Deutscher Verein des Gas- und Wasserfaches
-        "GLN": "GLN",  # Global Location Number
-    },
-)
+# pylint:disable=missing-module-docstring
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Rollencodetyp(StrEnum):
+    """
+    Gibt den Codetyp einer Rolle, beispielsweise einer Marktrolle, an.
+    """
+
+    BDEW = "BDEW"  # Bundesverband der Energie- u. Wasserwirtschaft
+    DVG = "DVG"  # Deutscher Verein des Gas- und Wasserfaches
+    GLN = "GLN"  # Global Location Number
diff --git a/src/bo4e/enum/rufnummernart.py b/src/bo4e/enum/rufnummernart.py
index e5b3484dc..5b1928dfd 100644
--- a/src/bo4e/enum/rufnummernart.py
+++ b/src/bo4e/enum/rufnummernart.py
@@ -1,20 +1,19 @@
-"""
-Abbildung verschiedener Rufnummerntypen.
-"""
+# pylint:disable=missing-module-docstring
 
-from enum import Enum
+from bo4e.enum.strenum import StrEnum
 
-Rufnummernart = Enum(
-    "Rufnummernart",
-    {
-        "RUF_ZENTRALE": "RUF_ZENTRALE",  # Rufnummer Zentrale
-        "FAX_ZENTRALE": "FAX_ZENTRALE",  # Faxnummer Zentrale
-        "SAMMELRUF": "SAMMELRUF",  # Sammelrufnummer
-        "SAMMELFAX": "SAMMELFAX",  # Sammelfaxnummer
-        "ABTEILUNGRUF": "ABTEILUNGRUF",  # Rufnummer Abteilung
-        "ABTEILUNGFAX": "ABTEILUNGFAX",  # Faxnummer Abteilung
-        "RUF_DURCHWAHL": "RUF_DURCHWAHL",  # Rufnummer Durchwahl
-        "FAX_DURCHWAHL": "FAX_DURCHWAHL",  # Faxnummer Durchwahl
-        "MOBIL_NUMMER": "MOBIL_NUMMER",  # Nummer des mobilen Telefons
-    },
-)
+
+class Rufnummernart(StrEnum):
+    """
+    Abbildung verschiedener Rufnummerntypen.
+    """
+
+    RUF_ZENTRALE = "RUF_ZENTRALE"  # Rufnummer Zentrale
+    FAX_ZENTRALE = "FAX_ZENTRALE"  # Faxnummer Zentrale
+    SAMMELRUF = "SAMMELRUF"  # Sammelrufnummer
+    SAMMELFAX = "SAMMELFAX"  # Sammelfaxnummer
+    ABTEILUNGRUF = "ABTEILUNGRUF"  # Rufnummer Abteilung
+    ABTEILUNGFAX = "ABTEILUNGFAX"  # Faxnummer Abteilung
+    RUF_DURCHWAHL = "RUF_DURCHWAHL"  # Rufnummer Durchwahl
+    FAX_DURCHWAHL = "FAX_DURCHWAHL"  # Faxnummer Durchwahl
+    MOBIL_NUMMER = "MOBIL_NUMMER"  # Nummer des mobilen Telefons
diff --git a/src/bo4e/enum/sparte.py b/src/bo4e/enum/sparte.py
index b38b3fc80..e4c012c9d 100644
--- a/src/bo4e/enum/sparte.py
+++ b/src/bo4e/enum/sparte.py
@@ -1,16 +1,16 @@
-"""
-Unterscheidungsmöglichkeiten für die Sparte.
-"""
-from enum import Enum
+# pylint:disable=missing-module-docstring
 
-Sparte = Enum(
-    "Sparte",
-    {
-        "STROM": "STROM",
-        "GAS": "GAS",
-        "FERNWAERME": "FERNWAERME",
-        "NAHWAERME": "NAHWAERME",
-        "WASSER": "WASSER",
-        "ABWASSER": "ABWASSER",
-    },
-)
+from bo4e.enum.strenum import StrEnum
+
+
+class Sparte(StrEnum):
+    """
+    Unterscheidungsmöglichkeiten für die Sparte.
+    """
+
+    STROM = "STROM"
+    GAS = "GAS"
+    FERNWAERME = "FERNWAERME"
+    NAHWAERME = "NAHWAERME"
+    WASSER = "WASSER"
+    ABWASSER = "ABWASSER"
diff --git a/src/bo4e/enum/strenum.py b/src/bo4e/enum/strenum.py
new file mode 100644
index 000000000..d43169921
--- /dev/null
+++ b/src/bo4e/enum/strenum.py
@@ -0,0 +1,14 @@
+"""
+strenum contains an enum that inherits from the plain enum and string.
+"""
+
+from enum import Enum
+
+
+# pylint: disable=too-few-public-methods
+class StrEnum(str, Enum):
+    """
+    An enum that has string values.
+    """
+
+    # see https://docs.python.org/3/library/enum.html?highlight=strenum#others
diff --git a/src/bo4e/enum/tarifart.py b/src/bo4e/enum/tarifart.py
index 0d557ed61..43835491b 100644
--- a/src/bo4e/enum/tarifart.py
+++ b/src/bo4e/enum/tarifart.py
@@ -1,16 +1,15 @@
-"""
-Die Tarifart wird verwendet zur Charakterisierung von Zählern und daraus resultierenden Tarifen.
-"""
+# pylint:disable=missing-module-docstring
 
-from enum import Enum
+from bo4e.enum.strenum import StrEnum
 
-Tarifart = Enum(
-    "Tarifart",
-    {
-        "EINTARIF": "EINTARIF",  # Eintarif
-        "ZWEITARIF": "ZWEITARIF",  # Zweitarif
-        "MEHRTARIF": "MEHRTARIF",  # Mehrtarif
-        "SMART_METER": "SMART_METER",  # Smart Meter Tarif
-        "LEISTUNGSGEMESSEN": "LEISTUNGSGEMESSEN",  # Leistungsgemessener Tarif
-    },
-)
+
+class Tarifart(StrEnum):
+    """
+    Die Tarifart wird verwendet zur Charakterisierung von Zählern und daraus resultierenden Tarifen.
+    """
+
+    EINTARIF = "EINTARIF"  # Eintarif
+    ZWEITARIF = "ZWEITARIF"  # Zweitarif
+    MEHRTARIF = "MEHRTARIF"  # Mehrtarif
+    SMART_METER = "SMART_METER"  # Smart Meter Tarif
+    LEISTUNGSGEMESSEN = "LEISTUNGSGEMESSEN"  # Leistungsgemessener Tarif
diff --git a/src/bo4e/enum/themengebiet.py b/src/bo4e/enum/themengebiet.py
index 5ec2bd5ad..5f343d034 100644
--- a/src/bo4e/enum/themengebiet.py
+++ b/src/bo4e/enum/themengebiet.py
@@ -1,71 +1,71 @@
-"""
-Über dieses ENUM kann eine thematische Zuordnung, beispielsweise eines Ansprechpartners, vorgenommen werden.
-"""
+# pylint:disable=missing-module-docstring
 
-from enum import Enum
+from bo4e.enum.strenum import StrEnum
 
-Themengebiet = Enum(
-    "Themengebiet",
-    {
-        "ALLGEMEINER_INFORMATIONSAUSTAUSCH": "ALLGEMEINER_INFORMATIONSAUSTAUSCH",  # Allgemeiner Informationsaustausch
-        "AN_UND_ABMELDUNG": "AN_UND_ABMELDUNG",  # An- und Abmeldung
-        "ANSPRECHPARTNER_ALLGEMEIN": "ANSPRECHPARTNER_ALLGEMEIN",  # Ansprechpartner Allgemein
-        "ANSPRECHPARTNER_BDEW_DVGW": "ANSPRECHPARTNER_BDEW_DVGW",  # Ansprechpartner BDEW/DVGW
-        "ANSPRECHPARTNER_IT_TECHNIK": "ANSPRECHPARTNER_IT_TECHNIK",  # Ansprechpartner IT/Technik
-        "BILANZIERUNG": "BILANZIERUNG",  # Bilanzierung
-        "BILANZKREISKOORDINATOR": "BILANZKREISKOORDINATOR",  # Bilanzkreiskoordinator
-        "BILANZKREISVERANTWORTLICHER": "BILANZKREISVERANTWORTLICHER",  # Bilanzkreisverantwortlicher
-        "DATENFORMATE_ZERTIFIKATE_VERSCHLUESSELUNGEN": "DATENFORMATE_ZERTIFIKATE_VERSCHLUESSELUNGEN",
-        # Datenformate, Zertifikate, Verschlüsselungen
-        "DEBITORENMANAGEMENT": "DEBITORENMANAGEMENT",  # Debitorenmanagement
-        "DEMAND_SIDE_MANAGEMENT": "DEMAND_SIDE_MANAGEMENT",  # Demand-Side-Management
-        "EDI_VEREINBARUNG": "EDI_VEREINBARUNG",  # EDI-Vereinbarung
-        "EDIFACT": "EDIFACT",  # EDIFACT
-        "ENERGIEDATENMANAGEMENT": "ENERGIEDATENMANAGEMENT",  # Energiedatenmanagement
-        "FAHRPLANMANAGEMENT": "FAHRPLANMANAGEMENT",  # Fahrplanmanagement
-        "ALOCAT": "ALOCAT",  # Format:ALOCAT
-        "APERAK": "APERAK",  # Format:APERAK
-        "CONTRL": "CONTRL",  # Format:CONTRL
-        "INVOIC": "INVOIC",  # Format:INVOIC
-        "MSCONS": "MSCONS",  # Format:MSCONS
-        "ORDERS": "ORDERS",  # Format:ORDERS
-        "ORDERSP": "ORDERSP",  # Format:ORDERSP
-        "REMADV": "REMADV",  # Format:REMADV
-        "UTILMD": "UTILMD",  # Format:UTILMD
-        "GABI": "GABI",  # GaBi Gas
-        "GELI": "GELI",  # GeLi Gas
-        "GERAETERUECKGABE": "GERAETERUECKGABE",  # Geräterückgabe
-        "GERAETEWECHSEL": "GERAETEWECHSEL",  # Gerätewechsel
-        "GPKE": "GPKE",  # GPKE
-        "INBETRIEBNAHME": "INBETRIEBNAHME",  # Inbetriebnahme
-        "KAPAZITAETSMANAGEMENT": "KAPAZITAETSMANAGEMENT",  # Kapazitätsmanagement
-        "KLAERFAELLE": "KLAERFAELLE",  # Klärfälle
-        "LASTGAENGE_RLM": "LASTGAENGE_RLM",  # Lastgänge RLM
-        "LIEFERANTENRAHMENVERTRAG": "LIEFERANTENRAHMENVERTRAG",  # Lieferantenrahmenvertrag
-        "LIEFERANTENWECHSEL": "LIEFERANTENWECHSEL",  # Lieferantenwechsel
-        "MABIS": "MABIS",  # MaBiS
-        "MAHNWESEN": "MAHNWESEN",  # Mahnwesen
-        "MARKTGEBIETSVERANTWORTLICHER": "MARKTGEBIETSVERANTWORTLICHER",  # Marktgebietsverantwortlicher
-        "MARKTKOMMUNIKATION": "MARKTKOMMUNIKATION",  # Marktkommunikation
-        "MEHR_MINDERMENGEN": "MEHR_MINDERMENGEN",  # Mehr- Mindermengen
-        "MSB_MDL": "MSB_MDL",  # MSB - MDL
-        "NETZABRECHNUNG": "NETZABRECHNUNG",  # Netzabrechnung
-        "NETZENTGELTE": "NETZENTGELTE",  # Netzentgelte
-        "NETZMANAGEMENT": "NETZMANAGEMENT",  # Netzmanagement
-        "RECHT": "RECHT",  # Recht
-        "REGULIERUNGSMANAGEMENT": "REGULIERUNGSMANAGEMENT",  # Regulierungsmanagement
-        "REKLAMATIONEN": "REKLAMATIONEN",  # Reklamationen
-        "SPERREN_ENTSPERREN_INKASSO": "SPERREN_ENTSPERREN_INKASSO",  # Sperren/Entsperren/Inkasso
-        "STAMMDATEN": "STAMMDATEN",  # Stammdaten
-        "STOERUNGSFAELLE": "STOERUNGSFAELLE",  # Übermittlung_Störungsfälle
-        "TECHNISCHE_FRAGEN": "TECHNISCHE_FRAGEN",  # Technische Fragen
-        "UMSTELLUNG_INVOIC": "UMSTELLUNG_INVOIC",  # Umstellung INVOIC
-        "VERSCHLUESSELUNG_SIGNATUR": "VERSCHLUESSELUNG_SIGNATUR",  # Verschlüsselung/Signatur
-        "VERTRAGSMANAGEMENT": "VERTRAGSMANAGEMENT",  # Vertragsmanagement
-        "VERTRIEB": "VERTRIEB",  # Vertrieb
-        "WIM": "WIM",  # WiM
-        "ZAEHLERSTAENDE_SLP": "ZAEHLERSTAENDE_SLP",  # Zählerstände SLP
-        "ZAHLUNGSVERKEHR": "ZAHLUNGSVERKEHR",  # Zahlungsverkehr
-        "ZUORDNUNGSVEREINBARUNG": "ZUORDNUNGSVEREINBARUNG",  # Zuordnungsvereinbarung
-    },
-)
+
+class Themengebiet(StrEnum):
+    """
+    Über dieses ENUM kann eine thematische Zuordnung, beispielsweise eines Ansprechpartners, vorgenommen werden.
+    """
+
+    ALLGEMEINER_INFORMATIONSAUSTAUSCH = "ALLGEMEINER_INFORMATIONSAUSTAUSCH"  # Allgemeiner Informationsaustausch
+    AN_UND_ABMELDUNG = "AN_UND_ABMELDUNG"  # An- und Abmeldung
+    ANSPRECHPARTNER_ALLGEMEIN = "ANSPRECHPARTNER_ALLGEMEIN"  # Ansprechpartner Allgemein
+    ANSPRECHPARTNER_BDEW_DVGW = "ANSPRECHPARTNER_BDEW_DVGW"  # Ansprechpartner BDEW/DVGW
+    ANSPRECHPARTNER_IT_TECHNIK = "ANSPRECHPARTNER_IT_TECHNIK"  # Ansprechpartner IT/Technik
+    BILANZIERUNG = "BILANZIERUNG"  # Bilanzierung
+    BILANZKREISKOORDINATOR = "BILANZKREISKOORDINATOR"  # Bilanzkreiskoordinator
+    BILANZKREISVERANTWORTLICHER = "BILANZKREISVERANTWORTLICHER"  # Bilanzkreisverantwortlicher
+    DATENFORMATE_ZERTIFIKATE_VERSCHLUESSELUNGEN = (
+        "DATENFORMATE_ZERTIFIKATE_VERSCHLUESSELUNGEN"  # Datenformate, Zertifikate, Verschlüsselungen
+    )
+    DEBITORENMANAGEMENT = "DEBITORENMANAGEMENT"  # Debitorenmanagement
+    DEMAND_SIDE_MANAGEMENT = "DEMAND_SIDE_MANAGEMENT"  # Demand-Side-Management
+    EDI_VEREINBARUNG = "EDI_VEREINBARUNG"  # EDI-Vereinbarung
+    EDIFACT = "EDIFACT"  # EDIFACT
+    ENERGIEDATENMANAGEMENT = "ENERGIEDATENMANAGEMENT"  # Energiedatenmanagement
+    FAHRPLANMANAGEMENT = "FAHRPLANMANAGEMENT"  # Fahrplanmanagement
+    ALOCAT = "ALOCAT"  # Format:ALOCAT
+    APERAK = "APERAK"  # Format:APERAK
+    CONTRL = "CONTRL"  # Format:CONTRL
+    INVOIC = "INVOIC"  # Format:INVOIC
+    MSCONS = "MSCONS"  # Format:MSCONS
+    ORDERS = "ORDERS"  # Format:ORDERS
+    ORDERSP = "ORDERSP"  # Format:ORDERSP
+    REMADV = "REMADV"  # Format:REMADV
+    UTILMD = "UTILMD"  # Format:UTILMD
+    GABI = "GABI"  # GaBi Gas
+    GELI = "GELI"  # GeLi Gas
+    GERAETERUECKGABE = "GERAETERUECKGABE"  # Geräterückgabe
+    GERAETEWECHSEL = "GERAETEWECHSEL"  # Gerätewechsel
+    GPKE = "GPKE"  # GPKE
+    INBETRIEBNAHME = "INBETRIEBNAHME"  # Inbetriebnahme
+    KAPAZITAETSMANAGEMENT = "KAPAZITAETSMANAGEMENT"  # Kapazitätsmanagement
+    KLAERFAELLE = "KLAERFAELLE"  # Klärfälle
+    LASTGAENGE_RLM = "LASTGAENGE_RLM"  # Lastgänge RLM
+    LIEFERANTENRAHMENVERTRAG = "LIEFERANTENRAHMENVERTRAG"  # Lieferantenrahmenvertrag
+    LIEFERANTENWECHSEL = "LIEFERANTENWECHSEL"  # Lieferantenwechsel
+    MABIS = "MABIS"  # MaBiS
+    MAHNWESEN = "MAHNWESEN"  # Mahnwesen
+    MARKTGEBIETSVERANTWORTLICHER = "MARKTGEBIETSVERANTWORTLICHER"  # Marktgebietsverantwortlicher
+    MARKTKOMMUNIKATION = "MARKTKOMMUNIKATION"  # Marktkommunikation
+    MEHR_MINDERMENGEN = "MEHR_MINDERMENGEN"  # Mehr- Mindermengen
+    MSB_MDL = "MSB_MDL"  # MSB - MDL
+    NETZABRECHNUNG = "NETZABRECHNUNG"  # Netzabrechnung
+    NETZENTGELTE = "NETZENTGELTE"  # Netzentgelte
+    NETZMANAGEMENT = "NETZMANAGEMENT"  # Netzmanagement
+    RECHT = "RECHT"  # Recht
+    REGULIERUNGSMANAGEMENT = "REGULIERUNGSMANAGEMENT"  # Regulierungsmanagement
+    REKLAMATIONEN = "REKLAMATIONEN"  # Reklamationen
+    SPERREN_ENTSPERREN_INKASSO = "SPERREN_ENTSPERREN_INKASSO"  # Sperren/Entsperren/Inkasso
+    STAMMDATEN = "STAMMDATEN"  # Stammdaten
+    STOERUNGSFAELLE = "STOERUNGSFAELLE"  # Übermittlung_Störungsfälle
+    TECHNISCHE_FRAGEN = "TECHNISCHE_FRAGEN"  # Technische Fragen
+    UMSTELLUNG_INVOIC = "UMSTELLUNG_INVOIC"  # Umstellung INVOIC
+    VERSCHLUESSELUNG_SIGNATUR = "VERSCHLUESSELUNG_SIGNATUR"  # Verschlüsselung/Signatur
+    VERTRAGSMANAGEMENT = "VERTRAGSMANAGEMENT"  # Vertragsmanagement
+    VERTRIEB = "VERTRIEB"  # Vertrieb
+    WIM = "WIM"  # WiM
+    ZAEHLERSTAENDE_SLP = "ZAEHLERSTAENDE_SLP"  # Zählerstände SLP
+    ZAHLUNGSVERKEHR = "ZAHLUNGSVERKEHR"  # Zahlungsverkehr
+    ZUORDNUNGSVEREINBARUNG = "ZUORDNUNGSVEREINBARUNG"  # Zuordnungsvereinbarung
diff --git a/src/bo4e/enum/titel.py b/src/bo4e/enum/titel.py
index c3b06b9d4..dc48ab6a6 100644
--- a/src/bo4e/enum/titel.py
+++ b/src/bo4e/enum/titel.py
@@ -1,14 +1,13 @@
-"""
-Übersicht möglicher Titel, z.B. eines Geschäftspartners.
-"""
-
-from enum import Enum
-
-Titel = Enum(
-    "Titel",
-    {
-        "DR": "DR",  # Doktor*In
-        "PROF": "PROF",  # Professor*In
-        "PROF_DR": "PROF_DR",  # Professor*In Dr.
-    },
-)
+# pylint:disable=missing-module-docstring
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Titel(StrEnum):
+    """
+    Übersicht möglicher Titel, z.B. eines Geschäftspartners.
+    """
+
+    DR = "DR"  # Doktor*In
+    PROF = "PROF"  # Professor*In
+    PROF_DR = "PROF_DR"  # Professor*In Dr.
diff --git a/src/bo4e/enum/verbrauchsart.py b/src/bo4e/enum/verbrauchsart.py
index d8de65444..8cec4704a 100644
--- a/src/bo4e/enum/verbrauchsart.py
+++ b/src/bo4e/enum/verbrauchsart.py
@@ -1,15 +1,15 @@
-"""
-Verbrauchsart einer Marktlokation.
-"""
-from enum import Enum
-
-Verbrauchsart = Enum(
-    "Verbrauchsart",
-    {
-        "KL": "KL",  # Kraft/Licht
-        "KLW": "KLW",  # Kraft/Licht/Wärme
-        "KLWS": "KLWS",  # Kraft/Licht/Wärme/Speicherheizung
-        "W": "W",  # Wärme
-        "WS": "WS",  # Wärme/Speicherheizung
-    },
-)
+# pylint:disable=missing-module-docstring
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Verbrauchsart(StrEnum):
+    """
+    Verbrauchsart einer Marktlokation.
+    """
+
+    KL = "KL"  # Kraft/Licht
+    KLW = "KLW"  # Kraft/Licht/Wärme
+    KLWS = "KLWS"  # Kraft/Licht/Wärme/Speicherheizung
+    W = "W"  # Wärme
+    WS = "WS"  # Wärme/Speicherheizung
diff --git a/src/bo4e/enum/vertragsart.py b/src/bo4e/enum/vertragsart.py
index e243dfc32..94b8853ca 100644
--- a/src/bo4e/enum/vertragsart.py
+++ b/src/bo4e/enum/vertragsart.py
@@ -1,15 +1,15 @@
-"""
-Aufzählung der Vertragsarten.
-"""
-from enum import Enum
-
-Vertragsart = Enum(
-    "Vertragsart",
-    {
-        "ENERGIELIEFERVERTRAG": "ENERGIELIEFERVERTRAG",  # Energieliefervertrag
-        "NETZNUTZUNGSVERTRAG": "NETZNUTZUNGSVERTRAG",  # Netznutzungsvertrag
-        "BILANZIERUNGSVERTRAG": "BILANZIERUNGSVERTRAG",  # Bilanzierungsvertrag
-        "MESSSTELLENBETRIEBSVERTRAG": "MESSSTELLENBETRIEBSVERTRAG",  # Messstellenabetriebsvertrag
-        "BUENDELVERTRAG": "BUENDELVERTRAG",  # Bündelvertrag
-    },
-)
+# pylint:disable=missing-module-docstring
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Vertragsart(StrEnum):
+    """
+    Aufzählung der Vertragsarten.
+    """
+
+    ENERGIELIEFERVERTRAG = "ENERGIELIEFERVERTRAG"  # Energieliefervertrag
+    NETZNUTZUNGSVERTRAG = "NETZNUTZUNGSVERTRAG"  # Netznutzungsvertrag
+    BILANZIERUNGSVERTRAG = "BILANZIERUNGSVERTRAG"  # Bilanzierungsvertrag
+    MESSSTELLENBETRIEBSVERTRAG = "MESSSTELLENBETRIEBSVERTRAG"  # Messstellenabetriebsvertrag
+    BUENDELVERTRAG = "BUENDELVERTRAG"  # Bündelvertrag
diff --git a/src/bo4e/enum/vertragsstatus.py b/src/bo4e/enum/vertragsstatus.py
index a4843f684..aa676fd7d 100644
--- a/src/bo4e/enum/vertragsstatus.py
+++ b/src/bo4e/enum/vertragsstatus.py
@@ -1,19 +1,19 @@
-"""
-Abbildung einer Statusinformation für Verträge.
-"""
-from enum import Enum
+# pylint:disable=missing-module-docstring
 
-Vertragsstatus = Enum(
-    "Vertragsstatus",
-    {
-        "IN_ARBEIT": "IN_ARBEIT",  # in Arbeit
-        "UEBERMITTELT": "UEBERMITTELT",  # übermittelt
-        "ANGENOMMEN": "ANGENOMMEN",  # angenommen
-        "AKTIV": "AKTIV",  # aktiv
-        "ABGELEHNT": "ABGELEHNT",  # abgelehnt
-        "WIDERRUFEN": "WIDERRUFEN",  # widerrufen
-        "STORNIERT": "STORNIERT",  # storniert
-        "GEKUENDIGT": "GEKUENDIGT",  # gekündigt
-        "BEENDET": "BEENDET",  # beendet
-    },
-)
+from bo4e.enum.strenum import StrEnum
+
+
+class Vertragsstatus(StrEnum):
+    """
+    Abbildung einer Statusinformation für Verträge.
+    """
+
+    IN_ARBEIT = "IN_ARBEIT"  # in Arbeit
+    UEBERMITTELT = "UEBERMITTELT"  # übermittelt
+    ANGENOMMEN = "ANGENOMMEN"  # angenommen
+    AKTIV = "AKTIV"  # aktiv
+    ABGELEHNT = "ABGELEHNT"  # abgelehnt
+    WIDERRUFEN = "WIDERRUFEN"  # widerrufen
+    STORNIERT = "STORNIERT"  # storniert
+    GEKUENDIGT = "GEKUENDIGT"  # gekündigt
+    BEENDET = "BEENDET"  # beendet
diff --git a/src/bo4e/enum/zaehlerauspraegung.py b/src/bo4e/enum/zaehlerauspraegung.py
index 4d8103092..809f83326 100644
--- a/src/bo4e/enum/zaehlerauspraegung.py
+++ b/src/bo4e/enum/zaehlerauspraegung.py
@@ -1,13 +1,12 @@
-"""
-Gibt an, ob es sich um einen Einrichtungs- oder Zweirichtungszähler handelt.
-"""
-
-from enum import Enum
-
-Zaehlerauspraegung = Enum(
-    "Zaehlerauspraegung",
-    {
-        "EINRICHTUNGSZAEHLER": "EINRICHTUNGSZAEHLER",  # Einrichtungszaehler
-        "ZWEIRICHTUNGSZAEHLER": "ZWEIRICHTUNGSZAEHLER",  # Zweirichtungszaehler
-    },
-)
+# pylint:disable=missing-module-docstring
+
+from bo4e.enum.strenum import StrEnum
+
+
+class Zaehlerauspraegung(StrEnum):
+    """
+    Gibt an, ob es sich um einen Einrichtungs- oder Zweirichtungszähler handelt.
+    """
+
+    EINRICHTUNGSZAEHLER = "EINRICHTUNGSZAEHLER"  # Einrichtungszaehler
+    ZWEIRICHTUNGSZAEHLER = "ZWEIRICHTUNGSZAEHLER"  # Zweirichtungszaehler
diff --git a/src/bo4e/enum/zaehlertyp.py b/src/bo4e/enum/zaehlertyp.py
index e5bd9223e..d8b6c52b8 100644
--- a/src/bo4e/enum/zaehlertyp.py
+++ b/src/bo4e/enum/zaehlertyp.py
@@ -1,20 +1,19 @@
-"""
-Bei diesem Enum handelt es sich um die Abbildung von Zählertypen der Sparten Strom und Gas.
-"""
+# pylint:disable=missing-module-docstring
 
-from enum import Enum
+from bo4e.enum.strenum import StrEnum
 
-Zaehlertyp = Enum(
-    "Zaehlertyp",
-    {
-        "DREHSTROMZAEHLER": "DREHSTROMZAEHLER",  # Drehstromzähler
-        "BALGENGASZAEHLER": "BALGENGASZAEHLER",  # Balgengaszähler
-        "DREHKOLBENZAEHLER": "DREHKOLBENZAEHLER",  # Drehkolbengaszähler
-        "SMARTMETER": "SMARTMETER",  # Smart Meter Zähler
-        "LEISTUNGSZAEHLER": "LEISTUNGSZAEHLER",  # leistungsmessender Zähler
-        "MAXIMUMZAEHLER": "MAXIMUMZAEHLER",  # Maximumzähler
-        "TURBINENRADGASZAEHLER": "TURBINENRADGASZAEHLER",  # Turbinenradgaszähler
-        "ULTRASCHALLGASZAEHLER": "ULTRASCHALLGASZAEHLER",  # Ultraschallgaszähler
-        "WECHSELSTROMZAEHLER": "WECHSELSTROMZAEHLER",  # Wechselstromzähler
-    },
-)
+
+class Zaehlertyp(StrEnum):
+    """
+    Bei diesem Enum handelt es sich um die Abbildung von Zählertypen der Sparten Strom und Gas.
+    """
+
+    DREHSTROMZAEHLER = "DREHSTROMZAEHLER"  # Drehstromzähler
+    BALGENGASZAEHLER = "BALGENGASZAEHLER"  # Balgengaszähler
+    DREHKOLBENZAEHLER = "DREHKOLBENZAEHLER"  # Drehkolbengaszähler
+    SMARTMETER = "SMARTMETER"  # Smart Meter Zähler
+    LEISTUNGSZAEHLER = "LEISTUNGSZAEHLER"  # leistungsmessender Zähler
+    MAXIMUMZAEHLER = "MAXIMUMZAEHLER"  # Maximumzähler
+    TURBINENRADGASZAEHLER = "TURBINENRADGASZAEHLER"  # Turbinenradgaszähler
+    ULTRASCHALLGASZAEHLER = "ULTRASCHALLGASZAEHLER"  # Ultraschallgaszähler
+    WECHSELSTROMZAEHLER = "WECHSELSTROMZAEHLER"  # Wechselstromzähler
diff --git a/src/bo4e/enum/zeiteinheit.py b/src/bo4e/enum/zeiteinheit.py
index 4019b0b43..8adb68449 100644
--- a/src/bo4e/enum/zeiteinheit.py
+++ b/src/bo4e/enum/zeiteinheit.py
@@ -1,21 +1,20 @@
-"""
-Auflistung möglicher Einheiten zur Verwendung in zeitbezogenen Angaben.
-"""
+# pylint:disable=missing-module-docstring
 
-from enum import Enum
+from bo4e.enum.strenum import StrEnum
 
-Zeiteinheit = Enum(
-    "Zeiteinheit",
-    {
-        "SEKUNDE": "SEKUNDE",  # Sekunde
-        "MINUTE": "MINUTE",  # Minute
-        "STUNDE": "STUNDE",  # Stunde
-        "VIERTEL_STUNDE": "VIERTEL_STUNDE",  # Viertelstunde
-        "TAG": "TAG",  # Tag
-        "WOCHE": "WOCHE",  # Woche
-        "MONAT": "MONAT",  # Monat
-        "QUARTAL": "QUARTAL",  # Quartal
-        "HALBJAHR": "HALBJAHR",  # Halbjahr
-        "JAHR": "JAHR",  # Jahr
-    },
-)
+
+class Zeiteinheit(StrEnum):
+    """
+    Auflistung möglicher Einheiten zur Verwendung in zeitbezogenen Angaben.
+    """
+
+    SEKUNDE = "SEKUNDE"  # Sekunde
+    MINUTE = "MINUTE"  # Minute
+    STUNDE = "STUNDE"  # Stunde
+    VIERTEL_STUNDE = "VIERTEL_STUNDE"  # Viertelstunde
+    TAG = "TAG"  # Tag
+    WOCHE = "WOCHE"  # Woche
+    MONAT = "MONAT"  # Monat
+    QUARTAL = "QUARTAL"  # Quartal
+    HALBJAHR = "HALBJAHR"  # Halbjahr
+    JAHR = "JAHR"  # Jahr


Test patch:
diff --git a/tests/test_ansprechpartner.py b/tests/test_ansprechpartner.py
index 3320b8d50..6a5ba1ca4 100644
--- a/tests/test_ansprechpartner.py
+++ b/tests/test_ansprechpartner.py
@@ -49,6 +49,7 @@ def test_de_serialisation_minimal_attributes(self):
         json_string = schema.dumps(ansprechpartner, ensure_ascii=False)
         assert "Müller-Schmidt" in json_string
         assert "Mühlenweg" in json_string
+        assert '"FRAU"' in json_string
 
         deserialized_ansprechpartner = schema.loads(json_data=json_string)