battery-passport-kit: Daten für den EU-Batteriepass prüfen

Ein Kommandozeilenwerkzeug, das CSV-Zeilen in Datensätze für den EU-Batteriepass umwandelt, sie gegen die BatteryPass-Ready-Schemas validiert und fehlende Pflichtelemente pro Datenelementgruppe meldet.

Das Problem

Ab dem 18. Februar 2027 verlangt die EU-Batterieverordnung (EU) 2023/1542 einen digitalen Batteriepass für Batterien von Elektrofahrzeugen, LMT-Batterien (E-Bikes, Roller) und Industriebatterien über 2 kWh. Jeder Pass ist ein strukturierter Datensatz mit 85 bis 120 Pflichtelementen, je nach Kategorie und Stufe.

Das BatteryPass-Ready-Konsortium veröffentlicht JSON-Schemas für diese Datensätze. Ein Unternehmen, das Pässe erstellen muss, hat die Daten meist in Tabellen oder in Exporten aus ERP- oder PLM-Systemen. Es muss diese Daten in das Schemaformat bringen, herausfinden, welche Pflichtelemente noch fehlen, und festlegen, welche Teile eines Passes welche Rolle lesen darf.

Wie es funktioniert

battery-passport-kit enthält das BatteryPass-Ready-Datenmodell 2.0.1 und stellt den Befehl bpkit mit diesen Unterbefehlen bereit:

  • template schreibt eine CSV-Vorlage mit einer Spalte pro Datenelement.
  • from-csv erzeugt pro Zeile ein Pass-JSON, ergänzt Einheiten und andere feste Werte und validiert jeden Pass.
  • validate prüft Pässe gegen das Schema, einschließlich Datumsangaben, URIs, ISO-8601-Dauern und Codelisten.
  • report listet fehlende Pflichtelemente pro Datenelementgruppe und markiert leere Elemente, die die Verordnung nur für manche Batterien vorschreibt.
  • view gibt den Teil eines Passes aus, den eine Rolle (public, authorities, repairer, ...) lesen darf, auf Basis der Zugriffsangaben im Schema.
  • qr erzeugt den QR-Code, der die physische Batterie mit ihrem Pass verbindet.

Abgedeckt sind alle fünf Batteriekategorien, jeweils in zwei Stufen: feb27 für die Anforderungen ab 18. Februar 2027 und full für alle Anforderungen, einschließlich CO2-Fußabdruck und Sorgfaltspflichten in der Lieferkette, die später gelten.

Das Repository enthält eine CSV-Datei mit zwei fiktiven EV-Batterien. In der zweiten Zeile sind die Batteriemasse und die Norm für den Zyklentest absichtlich leer. Lokal ausgeführt ergeben der Import und der Bericht diese Ausgabe:

$ bpkit from-csv examples/ev-feb27.csv --category ev -o passports
passports/EXC77-000001.json: valid
passports/EXC77-000002.json: 2 problem(s), see `bpkit report passports/EXC77-000002.json`

$ bpkit report passports/EXC77-000002.json
passports/EXC77-000002.json  category ev, stage feb27, data model 2.0.1
Required elements: 100/102 filled, schema problems: 2

group                                          required   optional
dppHeader                                           7/7        0/2
batteryMaterialsAndComposition                      9/9        2/3
circularityAndResourceEfficiency                  16/16       7/14
identifiersAndProductData                         15/16        1/6
performanceAndDurability                          45/46      11/38
symbolsLabelsAndDocumentationOfConformity           8/8       5/12

Missing required elements:
  batteryPassportData.identifiersAndProductData.batteryMass.gramKilogramValue
  batteryPassportData.performanceAndDurability.cycleLifeReferenceTest

Empty elements that are mandatory for some batteries (check whether they apply):
  batteryPassportData.identifiersAndProductData.warrantyPeriod
  batteryPassportData.symbolsLabelsAndDocumentationOfConformity.symbolsForCadmiumAndLead

Schema problems:
  batteryPassportData.identifiersAndProductData.batteryMass: 'gramKilogramValue' is a required property
  batteryPassportData.performanceAndDurability: 'cycleLifeReferenceTest' is a required property

Tests

Für jede Kategorie und beide Stufen prüft ein Test, dass der vollständige Platzhalter-Pass gültig ist, keine Pflichtelemente fehlen und die Kategorie richtig erkannt wird. Weitere Tests prüfen, dass die Elemente von feb27 eine Teilmenge der Elemente von full sind und dass ein entferntes Pflichtelement, ein leeres Objekt, das mindestens ein Feld braucht, und ungültige Werte (das Datum 2027-13-40, ein Kapazitätsverlust von 140 Prozent, ein unbekannter Batteriestatus) gemeldet werden.

Der Rollentest prüft, dass die öffentliche Sicht die ID des Wirtschaftsakteurs verbirgt und die Sicht für Behörden sie enthält. Die CSV-Tests prüfen Listenwerte, Einträge zu gefährlichen Stoffen, ergänzte Konstanten und die Ablehnung unbekannter Spalten und nicht numerischer Werte. Ein End-to-End-Test führt Import, Validierung, Bericht, Sicht und QR-Code-Erzeugung über die Kommandozeile aus.

Es sind 23 Tests. Das CI führt sie auf Python 3.10, 3.11, 3.12 und 3.13 aus, zusammen mit ruff check und ruff format --check, und danach das Beispiel aus dem README, bei dem der Bericht für den zweiten Pass fehlschlagen muss.

Grenzen

  • Die Schemas sind ein Vorschlag des Konsortiums und als laufende Arbeit gekennzeichnet. Sie sind kein offizielles EU-Format, und die delegierten Rechtsakte und Durchführungsrechtsakte sind noch in Arbeit. Ergebnisse sollten mit der aktuellen Data Attribute Longlist unter thebatterypass.eu abgeglichen werden.
  • JSON Schema kann nicht ausdrücken, welche Elemente nur unter Bedingungen Pflicht sind, zum Beispiel die Symbole für Blei und Cadmium. report listet die leeren als Punkte zur Prüfung und entscheidet nicht selbst.
  • Das Werkzeug erstellt und prüft Passdaten. Es hostet keine Pässe und stellt weder das Register noch die Zugriffskontrolle oder den Datenträger bereit, die die Verordnung verlangt.
  • Es ist keine Rechtsberatung.

Die enthaltenen Schemas stammen vom BatteryPass-Ready-Konsortium und stehen unter CC BY 4.0. Code und Installationsanleitung liegen unter github.com/Jwrede/battery-passport-kit.