# OCPP 1.6J

Salia-Ladestationen verbinden sich mit OCPP 1.6J mit einem Backend
(Central System), also OCPP 1.6 über WebSocket mit JSON. Diese Seite
beschreibt, welche Teile des Protokolls die Ladestation umsetzt und wo sie
von dem abweicht, was ein Backend erwarten könnte. Die Fehlercodes, die die
Ladestation sendet, stehen unter [OCPP-Fehlercodes](/de/ocpp/error-codes).

Gilt ab Firmware 2.5.0 für alle Ladestationen mit Salia-Controller. Jede
Ladestation hat einen Connector (Connector `1`); Connector `0` steht für die
Ladestation als Ganzes.

## Verbindung

| Thema | Verhalten |
| --- | --- |
| Protokoll | OCPP 1.6J, WebSocket-Subprotokoll `ocpp1.6`. SOAP und OCPP 2.0.1 werden nicht unterstützt. |
| Backend-URL | `ws://` oder `wss://`. Die URL wird genau so verwendet, wie sie eingetragen ist; sie muss also die Charge-Point-ID enthalten, zum Beispiel `wss://backend.example.com/ocpp/CP-0001`. Eine geänderte `CentralSystemURI` wird nach einem Neustart wirksam. |
| TLS | `wss://` verwendet TLS 1.2. Das Serverzertifikat wird einschließlich Hostname nur geprüft, wenn in den OCPP-Einstellungen der Weboberfläche *Zertifikatsprüfung* aktiviert ist. Die Option ist im Werkszustand aus; ohne sie wird jedes Serverzertifikat akzeptiert. |
| Authentifizierung | HTTP Basic Auth mit Benutzername und Passwort. Die Zugangsdaten werden in der Weboberfläche der Ladestation eingetragen; über OCPP lassen sie sich nicht ändern (`AuthorizationKey` wird nicht unterstützt). Client-Zertifikate werden nicht unterstützt. |
| Antwortzeit | Das Backend muss jede Anfrage innerhalb von 60 Sekunden beantworten. Andernfalls schließt die Ladestation die Verbindung und verbindet sich neu. |
| Uhrzeit | Die Ladestation übernimmt die Uhrzeit aus `BootNotification` und `Heartbeat` (und NTP, falls eingerichtet). Eichrechtskonforme Ladestationen lehnen Transaktionen ab, bis die Uhr gestellt ist. Andere Ladestationen starten Transaktionen auch mit ungestellter Uhr (`allowTxWithInvalidTime`); deren Zeitstempel sind dann falsch. |
| BootNotification | `chargePointVendor` und `chargePointModel` (je bis 20 Zeichen), `chargePointSerialNumber` und `chargeBoxSerialNumber` (falls gesetzt; je bis 25 Zeichen), `firmwareVersion`, `meterType`, `meterSerialNumber`; `iccid` und `imsi` bei Ladestationen mit Mobilfunkmodem. |
| Registrierung | Die Ladestation startet Transaktionen, online wie offline, erst, nachdem das Backend aus `CentralSystemURI` mindestens einmal eine `BootNotification` mit `Accepted` beantwortet hat. Eine Änderung von `CentralSystemURI` verwirft Transaktionen, die noch nicht an das bisherige Backend gesendet wurden. |

## Feature-Profile

Der Konfigurationsschlüssel `SupportedFeatureProfiles` meldet
`Core,FirmwareManagement,LocalAuthListManagement`.

| Profil | Unterstützung |
| --- | --- |
| Core | Unterstützt, Grenzen siehe unten. |
| Firmware Management | Unterstützt. |
| Local Auth List Management | Unterstützt, nur vollständige Aktualisierungen. |
| Reservation | Nicht unterstützt. `ReserveNow` wird mit `Rejected` beantwortet. |
| Smart Charging | Nicht gemeldet. `SetChargingProfile` wird in eingeschränkter Form angenommen, siehe unten. |
| Remote Trigger | Nicht gemeldet. `TriggerMessage` funktioniert für einige Nachrichten, siehe unten. |

Die Erweiterungen des OCPP 1.6 Security Whitepaper (signiertes
Firmware-Update, Zertifikatsverwaltung, Security Events, `GetLog`) sind
nicht umgesetzt.

Solange ein Neustart ansteht (nach `Reset` oder einer
Firmware-Installation), beantwortet die Ladestation die meisten Anfragen mit
einem `CALLERROR` `GenericError`.

## Nachrichten

### Core

| Nachricht | Richtung | Hinweise |
| --- | --- | --- |
| `Authorize` | Ladestation → Backend | Wird für lokal nicht autorisierte Karten gesendet, solange die Ladestation online ist. |
| `BootNotification` | Ladestation → Backend | Nach `Pending` oder `Rejected` wiederholt die Ladestation nach dem `interval` aus der Antwort. |
| `ChangeAvailability` | Backend → Ladestation | Connector `0` und `1`. `Inoperative`, während der Connector `Preparing`, `Charging` oder `Finishing` ist, wird mit `Scheduled` beantwortet und wirksam, sobald das Fahrzeug abgesteckt ist. Bleibt über einen Neustart erhalten. |
| `ChangeConfiguration` | Backend → Ladestation | Schlüssel siehe [Konfigurationsschlüssel](#konfigurationsschlüssel). Unbekannte Schlüssel: `NotSupported`; schreibgeschützte Schlüssel: `Rejected`. |
| `ClearCache` | Backend → Ladestation | `Accepted`, wenn der Autorisierungscache aktiviert ist, sonst `Rejected` (Werkszustand). |
| `DataTransfer` | Beide | Herstellerspezifisch. Ein `DataTransfer` vom Backend mit unbekannter `vendorId` wird mit `UnknownMessageId` beantwortet. Eichrechtskonforme Ladestationen senden nach `BootNotification` den öffentlichen Schlüssel des Zählers (`vendorId` `generalConfiguration`, `messageId` `setMeterConfiguration`); abschaltbar mit `sendMeterPublicKeyOnBootNotification`. |
| `GetConfiguration` | Backend → Ladestation | Alle oder die angefragten Schlüssel; unbekannte Schlüssel in `unknownKey`. |
| `Heartbeat` | Ladestation → Backend | Wenn `HeartbeatInterval` Sekunden lang keine andere Nachricht gesendet wurde. |
| `MeterValues` | Ladestation → Backend | Nur während einer Transaktion, immer mit `transactionId`. Werden offline nicht gespeichert. |
| `RemoteStartTransaction` | Backend → Ladestation | Connector `1`. Ein `chargingProfile` in der Anfrage wird ignoriert. Das Fahrzeug muss innerhalb von `ConnectionTimeOut` angesteckt werden. `Rejected`, wenn die Ladestation nicht registriert ist, der Connector nicht `Available`, `Preparing` oder `Finishing` ist (zum Beispiel `Faulted`), der Zähler nicht bereit ist, ein Speicherfehler ansteht, 336 Transaktionen auf das Senden warten, eine andere Autorisierung läuft oder bei einer eichrechtskonformen Ladestation die Uhr nicht gestellt ist. |
| `RemoteStopTransaction` | Backend → Ladestation | Beendet mit `reason` = `Remote`. `Rejected`, wenn die `transactionId` unbekannt ist oder Ladestation bzw. Connector `Unavailable` sind. |
| `Reset` | Backend → Ladestation | `Soft` und `Hard` beenden beide eine laufende Transaktion und starten nach etwa 10 Sekunden die gesamte Ladestation neu. `Rejected` während eines Firmware-Updates. |
| `StartTransaction` | Ladestation → Backend | Wird vor dem Senden auf der Ladestation gespeichert und nach einem Verbindungsabbruch erneut gesendet. |
| `StatusNotification` | Ladestation → Backend | `Available`, `Preparing`, `Charging`, `Finishing`, `Unavailable`, `Faulted`. `SuspendedEV` und `SuspendedEVSE` werden nicht verwendet: Ein pausierter Ladevorgang bleibt `Charging`. Meldungen für Connector 0 und 1 werden gemeinsam höchstens einmal alle 10 Sekunden gesendet und enthalten den Status zu diesem Zeitpunkt; ein kürzerer Status kann daher übersprungen werden. Gleiche Meldungen werden nicht wiederholt, außer nach einer Neuverbindung. |
| `StopTransaction` | Ladestation → Backend | Gründe `EmergencyStop`, `EVDisconnected`, `HardReset`, `SoftReset`, `Local`, `PowerLoss`, `Remote`, `UnlockCommand`, `DeAuthorized`, `Other`. `idTag` wird nicht gesendet. |
| `UnlockConnector` | Backend → Ladestation | Nur Varianten mit Steckdose; bei fest angeschlagenem Kabel lautet die Antwort `NotSupported`. Eine laufende Transaktion wird beendet (`reason` = `UnlockCommand`). Die Antwort kommt, sobald die Verriegelung offen ist (`Unlocked`), oder nach 20 Sekunden (`UnlockFailed`); das Antwort-Timeout des Backends muss länger als 20 Sekunden sein. |

### Firmware Management

| Nachricht | Richtung | Hinweise |
| --- | --- | --- |
| `UpdateFirmware` | Backend → Ladestation | `location` (HTTP- oder HTTPS-URL der Firmware-Datei), `retrieveDate`, `retries` und `retryInterval`. Der Download beginnt zum `retrieveDate`, sofern die Ladestation verbunden ist. Die Ladestation installiert die Datei und startet neu. Ein zweites `UpdateFirmware` während eines laufenden Updates wird bestätigt und ignoriert. |
| `FirmwareStatusNotification` | Ladestation → Backend | `Downloading`, `Downloaded`, `DownloadFailed`, `Installing`, `InstallationFailed`, `Installed` (nach dem Neustart). |
| `GetDiagnostics` | Backend → Ladestation | Lädt ein Log-Archiv (`.tar.gz`) per FTP, FTPS, HTTP oder HTTPS hoch. Bei HTTP(S) wird die Datei per `POST` an `<location>/<fileName>` gesendet. `startTime` und `stopTime` werden ignoriert. |
| `DiagnosticsStatusNotification` | Ladestation → Backend | `Uploading`, `Uploaded`, `UploadFailed`. |

### Local Auth List Management

| Nachricht | Richtung | Hinweise |
| --- | --- | --- |
| `GetLocalListVersion` | Backend → Ladestation | `-1`, solange `LocalAuthListEnabled` `false` ist. |
| `SendLocalList` | Backend → Ladestation | Nur `updateType` `Full`; `Differential` wird mit `NotSupported` beantwortet, ebenso jede Aktualisierung, solange `LocalAuthListEnabled` `false` ist. Bis zu 10.000 Einträge. |

### Smart Charging (eingeschränkt, nicht gemeldet)

| Nachricht | Richtung | Hinweise |
| --- | --- | --- |
| `SetChargingProfile` | Backend → Ladestation | Wird nur angenommen mit `chargingProfilePurpose` `ChargePointMaxProfile` (Connector `0`) oder `TxProfile`, `chargingProfileKind` `Relative`, `chargingRateUnit` `A`, `stackLevel` `0` und genau einer Periode mit `startPeriod` `0`, ohne `duration` und `minChargingRate`. Andere Profile werden mit `NotSupported` beantwortet. Mit `Rejected` beantwortet werden ein `ChargePointMaxProfile` für Connector `1` und ein `TxProfile` für eine andere als die laufende `transactionId`. `ChargePointMaxProfile` bleibt über einen Neustart erhalten; `TxProfile` endet mit der Transaktion. |
| `ClearChargingProfile` | Backend → Ladestation | Nach Connector, Profil-ID oder Zweck. `Unknown`, wenn kein Profil passt. |
| `GetCompositeSchedule` | Backend → Ladestation | Nicht unterstützt (`Rejected`). |

### Remote Trigger (teilweise, nicht gemeldet)

`TriggerMessage` wird für `BootNotification`, `Heartbeat` und
`StatusNotification` angenommen. `MeterValues`,
`DiagnosticsStatusNotification` und `FirmwareStatusNotification` werden mit
`NotImplemented` beantwortet.

## Konfigurationsschlüssel

Die Spalte *Werkszustand* zeigt die Werte einer Ladestation mit Firmware
2.5.0 bei Auslieferung. Mit *Neustart* gekennzeichnete Schlüssel werden
sofort gespeichert und mit `RebootRequired` beantwortet; sie werden nach dem
nächsten Neustart wirksam.

:::note
Ein Firmware-Update setzt `MeterValuesSampledData` auf die Werksliste
zurück. Das Speichern der Einstellungen in der Weboberfläche setzt
`LocalAuthListEnabled` und `LocalAuthorizeOffline` beide auf den Wert der
Option *Offline Authentifizierung*, auch wenn das Backend sie anders
gesetzt hat. Ladestationen, die von älterer Firmware aktualisiert wurden,
behalten ihre bisherigen Werte.
:::

| Schlüssel | Zugriff | Werkszustand | Wirksam |
| --- | --- | --- | --- |
| `AllowOfflineTxForUnknownId` | lesen/schreiben | `false` | sofort |
| `AuthorizationCacheEnabled` | lesen/schreiben | `false` | Neustart |
| `AuthorizeRemoteTxRequests` | lesen/schreiben | `false` | sofort |
| `ClockAlignedDataInterval` | lesen/schreiben | `0` | Neustart |
| `ConnectionTimeOut` | lesen/schreiben | `60` | sofort |
| `HeartbeatInterval` | lesen/schreiben | aus `BootNotification` (vorher 600) | sofort, nicht gespeichert; Werte bis `2` werden abgelehnt |
| `LocalAuthListEnabled` | lesen/schreiben | `false` | Neustart |
| `LocalAuthorizeOffline` | lesen/schreiben | `false` | sofort |
| `LocalPreAuthorize` | lesen/schreiben | `false` | sofort |
| `MeterValuesAlignedData` | lesen/schreiben | leer | Neustart |
| `MeterValuesSampledData` | lesen/schreiben | `Energy.Active.Import.Register`, `Power.Active.Import`, `Power.Active.Import.L1`–`L3`, `Current.Import.L1`–`L3`, `Voltage.L1-N`–`L3-N` | nächste Transaktion |
| `MeterValueSampleInterval` | lesen/schreiben | `60` | nächste Transaktion |
| `StopTransactionOnInvalidId` | lesen/schreiben | `true` | sofort |
| `StopTxnAlignedData` | lesen/schreiben | leer | nächste Transaktion |
| `StopTxnSampledData` | lesen/schreiben | leer | nächste Transaktion |
| `TransactionMessageAttempts` | lesen/schreiben | `3` | Neustart |
| `TransactionMessageRetryInterval` | lesen/schreiben | `30` | Neustart |
| `WebSocketPingInterval` | lesen/schreiben | `10` | sofort |
| `CentralSystemURI` | lesen/schreiben | wie konfiguriert | Neustart; während einer Transaktion abgelehnt |
| `ChargeProfileMaxStackLevel` | nur lesen | `0` | |
| `ChargingScheduleAllowedChargingRateUnit` | nur lesen | `Current` | |
| `ChargingScheduleMaxPeriods` | nur lesen | `1` | |
| `ConnectorPhaseRotation` | nur lesen | `Unknown` | |
| `GetConfigurationMaxKeys` | nur lesen | `10` | |
| `LocalAuthListMaxLength` | nur lesen | `10000` | |
| `MaxChargingProfilesInstalled` | nur lesen | `2` | |
| `MeterValuesAlignedDataMaxLength` | nur lesen | `27` | |
| `MeterValuesSampledDataMaxLength` | nur lesen | `27` | |
| `NumberOfConnectors` | nur lesen | `1` | |
| `ResetRetries` | nur lesen | `0` | |
| `SendLocalListMaxLength` | nur lesen | `10000` | |
| `StopTransactionOnEVSideDisconnect` | nur lesen | `true` | |
| `StopTxnAlignedDataMaxLength` | nur lesen | `27` | |
| `StopTxnSampledDataMaxLength` | nur lesen | `27` | |
| `SupportedFeatureProfiles` | nur lesen | siehe oben | |
| `SupportedFileTransferProtocols` | nur lesen | `FTP,FTPS,HTTP,HTTPS` | |
| `UnlockConnectorOnEVSideDisconnect` | nur lesen | `true` | |

Herstellerspezifische Schlüssel:

| Schlüssel | Zugriff | Werkszustand | Bedeutung |
| --- | --- | --- | --- |
| `rfidStopTransaction` | lesen/schreiben | `false` | `true`: Die Karte, die einen Ladevorgang gestartet hat, kann ihn an der Ladestation beenden. Wirksam nach einem Neustart. |
| `rfidRequiresEvPresent` | lesen/schreiben | `true` | `true`: Karten werden nur gelesen, während ein Fahrzeug angesteckt ist. Wirksam nach einem Neustart. |
| `useAsTimeSource` | lesen/schreiben | `true` | Uhrzeit aus `BootNotification` und `Heartbeat` übernehmen. |
| `allowTxWithInvalidTime` | lesen/schreiben | `true` | Transaktionen erlauben, bevor die Uhr gestellt ist (nie bei eichrechtskonformen Ladestationen). |
| `allowLocalChargingAlways` | lesen/schreiben | `false` | `true`: Jede Karte wird lokal angenommen, die Antwort auf `StartTransaction` wird ignoriert und `RemoteStartTransaction` immer mit `Rejected` beantwortet. |
| `bootNotificationOnReconnect` | lesen/schreiben | `false` | Nach jedem Verbindungsaufbau `BootNotification` senden. |
| `webSocketPingTimeout` | lesen/schreiben | `120` | Sekunden ohne WebSocket-Pong, nach denen die Verbindung neu aufgebaut wird. |
| `forwardCredentials` | lesen/schreiben | leer | Host, für den die Basic-Auth-Zugangsdaten auch bei Firmware- und Diagnose-URLs verwendet werden. |
| `ftpTryTLSUpgrade` | lesen/schreiben | `false` | Für Diagnose-Uploads explizites FTPS versuchen. |
| `calibrationLawFormat` | lesen/schreiben | leer | Format der signierten Messwerte: leer, `OCMF,plain` oder `OCMF,hex`. |
| `sendMeterPublicKeyOnBootNotification` | lesen/schreiben | `true` | Öffentlichen Schlüssel des Zählers nach `BootNotification` per `DataTransfer` senden. |
| `StopTransactionSignatureFormat` | nur lesen | `MR` | Signierte Messwerte: Start und Ende in einem OCMF-Datensatz. |
| `Meter1PublicKey` | nur lesen | vom Zähler | Öffentlicher Schlüssel des eichrechtskonformen Zählers. |
| `vendorId` | nur lesen | `com.in-tech.smartcharging` | `vendorId` der Ladestation für `DataTransfer` und `StatusNotification`. |

## Autorisierung

- Online starten lokal bekannte Karten (Autorisierungscache oder lokale
  Liste) den Ladevorgang sofort, wenn `LocalPreAuthorize` `true` ist; alle
  anderen Karten werden mit `Authorize` geprüft.
- Offline werden Karten aus Cache oder lokaler Liste nur angenommen, wenn
  `LocalAuthorizeOffline` `true` ist. Ist es `false`, gilt jede Karte als
  unbekannt, und unbekannte Karten werden nur angenommen, wenn
  `AllowOfflineTxForUnknownId` `true` ist.
- Eine Karte beendet einen laufenden Ladevorgang an der Ladestation nur,
  wenn `rfidStopTransaction` `true` ist, und nur die Karte, die ihn
  gestartet hat.
- Beantwortet das Backend `StartTransaction` mit einem anderen Status als
  `Accepted` oder mit einem abgelaufenen `expiryDate`, beendet die
  Ladestation den Ladevorgang (`reason` = `DeAuthorized`).
  `StopTransactionOnInvalidId` auf `true` lassen: Mit `false` wird das Laden
  ebenfalls beendet, aber kein `StopTransaction` gesendet; die Transaktion
  bleibt im Backend offen.

## Verbindungs- und Stromausfall

- **Verbindungsausfall.** Der Ladevorgang läuft weiter. `StartTransaction`
  und `StopTransaction` werden auf der Ladestation gespeichert und gesendet,
  sobald die Verbindung wieder steht; eine offline gestartete Transaktion
  erhält dann ihre `transactionId`. Bis zu 336 Transaktionen werden
  gespeichert; warten so viele, startet keine neue Transaktion, bis die
  Verbindung wieder steht. `MeterValues`, `StatusNotification`, `Heartbeat`
  und die Statusmeldungen zu Firmware und Diagnose werden nicht gespeichert.
  Nach dem Wiederverbinden sendet die Ladestation den aktuellen Status von
  Connector 0 und 1.
- **Stromausfall.** Eine Transaktion, die beim Stromausfall lief, wird nach
  dem Neustart mit `reason` = `PowerLoss` beendet; `meterStop` und
  `timestamp` werden nach dem Neustart erfasst. Das Fahrzeug muss neu
  autorisiert werden. Dasselbe gilt für jeden Neustart, der nicht per
  `Reset` angefordert wurde.
- **Firmware-Update.** Nach erfolgreicher Installation startet die
  Ladestation sofort neu; eine laufende Transaktion wird dann mit `reason` =
  `PowerLoss` beendet. Updates außerhalb von Ladevorgängen einplanen.

## Signierte Messwerte

Bei eichrechtskonformen Ladestationen enthält `StopTransaction` die
signierten Messwerte in `transactionData`: einen Messwert mit Kontext
`Transaction.End` und Format `SignedData`, der den OCMF-Datensatz mit Start
und Ende der Transaktion enthält. Der öffentliche Schlüssel des Zählers
steht in `Meter1PublicKey`.

## Produkte

Die OCPP-Umsetzung ist auf allen Ladestationen mit Salia-Controller gleich.
