TCPP 1.3.0
JSON Schema Draft 2020-12 · 55 Dateien Entwurf

Schema

Das TCPP-Nachrichtenformat 1.3.0

27 Endpunkte, jeder ein Request/Response-Paar, dazu all.json, der Rahmen, den sie alle teilen. Jede Datei wird hier unter der URL ausgeliefert, die ihre $id nennt; $ref löst sich damit ohne Umschreiben auf.

Der Rahmen

Jede TCPP-Nachricht ist ein JSON-Objekt mit denselben fünf oder sechs Elementen der obersten Ebene. Der Endpunkt bestimmt, was in record steht; alles darum herum ist identisch, ob die Nachricht einen Ladevorgang meldet oder einen Ping beantwortet.

ElementInInhalt
tcppbeide Die Version, gegen die diese Nachricht geschrieben ist, als URL: https://tcpp.digital/schema/1.3.0/.
headbeide Wer, an wen, wozu, wann und mit welchem Ergebnis. In allen Endpunkten gleich aufgebaut; unten beschrieben.
recordbeide Die Nutzlast, festgelegt vom Schema des jeweiligen Endpunkts. Das einzige Element, dessen Aufbau wechselt.
parsedResponse Ergebnis je Element: eine Zuordnung von Pfaden im Request auf sechsstellige Fehlercodes; eine teilweise angenommene Nachricht sagt damit genau, welcher Teil gescheitert ist.
participantsbeide Weitere Beteiligte am Vorgang, jeweils mit Typ, Kennung und Rechten (read, control, push, broker …), optional mit Weiterleitendem und Genehmigendem.
referencesbeide Die Nachrichten, auf die sich diese bezieht: je eine Referenzkennung, der vollständige head jener Nachricht und optional deren Signatur. Das macht einen Prozess aus seinen Datensätzen rekonstruierbar.

Der Head

Zwölf Pflichtfelder. Eine Response wiederholt den Head des Requests mit umgekehrter Richtung, vertauschtem Ursprung und Ziel und dem eigenen Ergebnis in error_code.

FeldTypBedeutung
record_typestringDer Endpunkt: ping, charge_start, tariffs_list, …
record_directionstringrequest, response oder internal. Auf jeden Request folgt eine Response; internal ist für Ausnahmen gedacht, etwa einen Fehler, den ein Gerät über sich selbst festhält.
record_udtdate-timeUniverselles Datum mit Uhrzeit und Zeitversatz.
record_paginationnumberDer eigene Zähler des Senders für diesen Datensatz, ab 1.
record_versionstringDie TCPP-Version: 1.3.0.
origin_typestring(3)Modultyp des Senders, siehe Tabelle unten.
origin_idstringKennung des Senders, mit Präfix für ihren Namensraum.
target_typestring(3)Modultyp des Empfängers.
target_idstringKennung des Empfängers.
context_typestring(3)Zu welcher Art Vorgang die Nachricht gehört: ein Prozesstyp, kein Modultyp. Darf leer sein.
context_idstringKennung dieses Vorgangs, gemeinsam für alle Nachrichten darin. Darf leer sein.
error_codehex(6)Das Ergebnis. 000000 im Request und in einer erfolgreichen Response.
error_textstringOptionaler Klartext neben dem Code.

Kennungen

Jede Kennung im Head (Ursprung, Ziel, Kontext, Beteiligte) trägt ein Präfix aus einem Buchstaben und einem Doppelpunkt, das ihren Namensraum benennt; damit ist nie unklar, was für ein Ding eine Kennung bezeichnet. Die ganze Kennung ist samt Präfix höchstens 120 Zeichen lang.

PräfixNamensraumBeispiel
E:EVSE-IDE:DE*PID*E*IWS*00100017
G:GUIDG:90676293-fa28-49bd-81ba-1b58a0f62abd
D:Domain-NamensraumD:node.example.de
P:privater NamensraumP:ECS-HOST
I:senderinternI:slot-2
H:HashH:9f86d081884c7d…
N:numerische ZählungN:45330
C:Vertrags- oder TarifkennungC:DE-8AA-C12345-6
V:FahrzeugkennungV:WDD1234567A123456
X:undefiniertX:legacy-7

Modultypen

Drei Großbuchstaben sagen, was ein Beteiligter ist. Der Typ nennt die Rolle im Protokoll, die Kennung das konkrete Gerät oder den konkreten Dienst.

Vertrauenswürdige Dienste

TypModulFührt
TMHTrusted Management HostSchlüssel, Module, eMAIDs, Ladepunkte
TEHTrusted Exchange Hostdynamische Daten: Status, Reservierungen
TAHTrusted Archive Hostarchivierte Dokumente und Datensätze

Marktteilnehmer

TypModulAnmerkung
MSPeMobility Service ProvidereMSP
CPOCharge Point Operatorsofern unabhängig vom MSP
LMPLocation Management ProviderParkraum
FMPFleet Management ProviderFlotte und Logistik
ESPEnergy Supplier ProviderEnergielieferant
SMSSupport Monitoring Servicetechnischer Service, Überwachung
SASSurveillance Authority ServiceBehörden

Ladepunkte und lokale Geräte

TypModulAnmerkung
CSUCharge Switch Unitdas Hauptgerät des Ladepunkts
CCUCharge Central UnitZentrale eines Satellitensystems
LIULocal Identification Unitsofern unabhängig von der CSU
LDULocal Display Unitsofern unabhängig von der CSU
RIURemote Identification UnitApp, Telematik, externe Anzeige
RDURemote Display UnitApp, Telematik, externe Anzeige
PSUParking Space UnitParkhaus, Parkplatz
DEVDevicejedes weitere Gerät

Messung und Energiemanagement

TypModulAnmerkung
SMGSmart Meter GatewayBSI TR-03109
SMLSmart Meter Light
ELMElectric Metereigenständiger Zähler
EMUEnergy Management Unitlokales Lastmanagement
GMUGrid Energy Management Unitnetzseitiges Lastmanagement
BMUBattery Management UnitBatteriespeicher

Kontexttypen

context_type benennt die Art des Vorgangs, zu dem eine Nachricht gehört, und stammt aus einem eigenen Satz: CRG Laden · ENG Energiesteuerung · MNT Wartung · INF Information · DRR Data Request Record · TFF Tarif.

Fehlercodes

Sechs Hexadezimalstellen, verwendet im Head, im elementweisen parsed-Block einer Response und in Referenzen. Der Code wird in drei Teilen gelesen: die erste Stelle ist die globale Klasse, die beiden folgenden der genaue Status, die letzten drei ein modulspezifischer Status, FFF, wenn das Modul nicht bestimmt ist.

Stelle 1Klasse
0kein Fehler
1nicht auswertbar
2Head-Daten
3Auswertung des Records
4Aufbau des Records
5Signaturumwandlung oder Zustellung
6interner Softwarefehler
7interner Hardwarefehler
Funbekannt

000000 bedeutet also Erfolg, FFFFFF einen unbekannten Fehler. Eine Response, die den Head angenommen, aber ein Element einer Liste abgelehnt hat, sagt das in parsed unter dem Pfad dieses Elements, statt die ganze Nachricht scheitern zu lassen.

An den beiden Stellen wird der Code unterschiedlich geschrieben. Im Head ist error_code ausschließlich großgeschriebenes Hexadezimal: ^[0-9A-F]{6}$. Die Werte in parsed sind großzügiger — beide Schreibweisen und ein optionales führendes #. Ein Head mit ffffff fällt durch die Prüfung, dieselbe Zeichenkette in parsed nicht.

Signatur

Eine TCPP-Nachricht reist als Compact JWS mit alg: ES384, also ECDSA über der NIST-Kurve P-384 mit SHA-384. Das oben gezeigte JSON-Objekt ist die Nutzlast; der Empfänger dekodiert sie, prüft sie gegen den öffentlichen Schlüssel des Senders und bewahrt Nachricht und Token gemeinsam auf.

Signiert werden die Bytes, wie sie erstellt wurden. Eine Prüfung muss über die empfangenen Bytes laufen, nie über eine neue Serialisierung des ausgewerteten Objekts: Schlüsselreihenfolge, Leerzeichen und Zahlenformat ändern sich dabei, und die Signatur übersteht das nicht.

JWS-Signaturen verwenden die feste R‖S-Kodierung nach IEEE P1363, die auch die Web Crypto API eines Browsers erzeugt. Bibliotheken, die DER ausgeben, darunter ecdsa.SignASN1 in Go, müssen zuvor umgewandelt werden, einschließlich der Linksauffüllung einer zu kurzen Koordinate.

Eine Signatur kann auch innerhalb einer Nachricht mitgeführt werden: Jeder Eintrag in references darf das jws des Datensatzes enthalten, auf den er verweist. So lässt sich eine Kette von Datensätzen als ein Dokument weitergeben und Glied für Glied prüfen. Dieses Element ist ein Objekt, nicht die kompakte Zeichenkette, als die eine Nachricht reist: innerhalb eines Datensatzes wird die Signatur in der JSON-Serialisierung von JWS geführt und bleibt damit als JSON lesbar statt als eine undurchsichtige Zeile.

Endpunkte

27 Request/Response-Paare. Jeder Name verweist auf seine beiden Schemadateien.

Laden

EndpunktInhaltSchema
charge_startEröffnung eines Ladevorgangs: Basisdaten der Sitzung und die beteiligten Rechtssubjekte. Request · Response
charge_processDer Vorgang selbst: Status, Ereignisse, Anzeige, Messkurven und Rechtssubjekte. Request · Response
charge_eventEin einzelnes Ereignis in einem laufenden Vorgang, bis hin zu dessen Ende. Request · Response
emaid_getAuflösung einer Vertragsidentität: per Karte, per Fahrzeug oder über eine andere Abfrageart. Request · Response
tariffs_listTarife zu Ladepunkten, gesucht nach Kennung, nach Ort oder nach Ladegrenzen. Request · Response

Messung

EndpunktInhaltSchema
measurement_createAnlegen eines Measurement Configuration Record, der digitalen Selbstauskunft eines Zählers oder einer Ladesäule: was das Gerät ist, welche Hardware es erkannt hat, welche Software es fährt, auf welche Dokumente es verweist. Request · Response
measurement_changeAblösung eines Konfigurationsdatensatzes durch den nächsten; der alte bleibt auffindbar. Request · Response
measurement_configurationAbruf eines Konfigurationsdatensatzes, des Ankers, auf den sich jede spätere Nachricht über dieses Gerät bezieht. Request · Response

Identität, Schlüssel und Prüfung

EndpunktInhaltSchema
key_getDer öffentliche Schlüssel eines Moduls, damit dessen Signaturen prüfbar werden. Request · Response
module_getWas ein Modul ist: Typ, Kennung und die dazu hinterlegten Angaben. Request · Response
verification_getDie zu einem Modul festgehaltenen Prüfungen: wer was wann bescheinigt hat. Request · Response
verification_setEintragen einer Prüfung zu einem Modul, unter Nennung des verantwortlichen Administrators. Request · Response

Konfiguration

EndpunktInhaltSchema
parameters_getLesen benannter Parameter. Request · Response
parameters_setSchreiben von Parametern, unter Nennung der Administratoren, die es veranlasst haben. Request · Response
parameters_deleteEntfernen von Parametern, ebenso zugeordnet. Request · Response
parameters_listAuflisten von Parametern über einen Bereich, mit Ergebnisgrenze. Request · Response
trigger_setEinrichten eines Triggers: Formeln, die ausgewertet werden, und Aktionen, wenn sie zutreffen. Request · Response
trigger_getAbruf eines einzelnen Triggers. Request · Response
trigger_deleteEntfernen eines Triggers. Request · Response
triggers_listAuflisten von Triggern über einen Bereich. Request · Response

Betrieb

EndpunktInhaltSchema
pingErreichbarkeit. Die kleinste Nachricht des Satzes und die erste, die man umsetzt. Request · Response
statusEin oder mehrere Statuswerte, gezählt und signiert, mit Verweis auf das, was sie beschreiben. Request · Response
errorFehler als eigener Datensatz: gezählt, referenziert und für sich meldbar. Request · Response
display_outputWas eine Anzeige zeigen soll. Request · Response
display_inputWas an ihr eingegeben wurde. Request · Response

Archiv

EndpunktInhaltSchema
archive_listSuche in archivierten Datensätzen nach Head und nach Inhalt, über einen Zeitraum und mit Ergebnisgrenze. Request · Response
archive_getAbruf eines archivierten Datensatzes, mit oder ohne die Signatur, unter der er abgelegt wurde. Request · Response

Das Rahmenschema

all.json ist das Basisformat, das die übrigen ausprägen: Head, die Definitionen für Beteiligte und Referenzen und ein freier record. Dagegen wird geprüft, wenn eine Nachricht gelesen werden muss, deren Endpunkt nicht implementiert ist.

Die Dateien beziehen

Alle 55 Dateien, wie sie hier ausgeliefert werden, gibt es auch als ein Archiv. Der Referenzknoten bringt denselben Satz mit und liefert ihn unter denselben Pfaden aus; eine Implementierung lässt sich also gegen eine lokale Kopie entwickeln und unverändert auf die veröffentlichten URLs umstellen.