Aller au contenu

La référence du protocole OCPP 1.6J.

Ce que se disent une borne et son backoffice : les 28 messages avec leurs champs et un exemple, les 43 clés de configuration, ce qu’une borne peut mesurer et ce qui tourne mal en pratique.

MessagesClés de configurationGrandeurs mesuréesQuestions

Qu’est-ce que OCPP 1.6J ?

OCPP, l’Open Charge Point Protocol, est un standard libre et ouvert de l’Open Charge Alliance. Il définit comment une borne communique avec le logiciel qui la gère : le Central System dans la spécification, le backoffice sur le marché.

Dans la version 1.6J, la borne ouvre un WebSocket vers le backoffice, et les deux côtés s’y envoient des messages JSON. La borne rapporte son statut, ses valeurs de compteur et ses sessions. Le backoffice démarre et arrête les sessions, modifie les réglages et fixe des limites de charge.

Comme le standard est ouvert, une borne qui le parle peut aussi se connecter à d’autres backoffices qui le parlent, selon le modèle, le firmware et la configuration. C’est ce qui vous permet de mélanger les marques sur un même site et de transférer une borne vers un autre backoffice. Pour faire tourner une borne sur plusieurs backoffices en même temps, utilisez l’OCPP Proxy.

  • Un standard ouvertLibre d’implémentation, maintenu par l’Open Charge Alliance.
  • WebSocket et JSONUne connexion qui reste ouverte, avec des messages structurés.
  • 28 messagesRépartis en six profils de fonctionnalités, de Core à Remote Trigger.
  • Dans les deux sensLa borne et le backoffice lancent chacun leurs propres messages.

Les 28 messages OCPP 1.6

Chaque message est une requête d’un côté et une réponse de l’autre, reliées par un identifiant de message unique.

Core

Requis. Opérations fondamentales de la borne : autorisation, transactions, rapports de statut, configuration et contrôle à distance de base.

Demande l’autorisation d’un idTag avant de permettre la recharge.

Requête
ChampTypeUsageContenu
idTagstringRequisL’identifiant à autoriser. 20 caractères au maximum.
Réponse
ChampTypeUsageContenu
idTagInfoobjectRequisInformations d’autorisation pour l’idTag.
statusstringRequisStatut d’autorisation. Valeurs possibles : Accepted, Blocked, Expired, Invalid, ConcurrentTx.
expiryDatestringOptionnelDate et heure après lesquelles l’idTag doit être considéré comme expiré. Une date et une heure.
parentIdTagstringOptionnelidTag parent pour l’autorisation de groupe. 20 caractères au maximum.
Exemple
La borne envoie
[2, "7f83df9c", "Authorize", {
  "idTag": "04A2B3C4D5E6F7"
}]
Le backoffice répond
[3, "7f83df9c", {
  "idTagInfo": {
    "status": "Accepted"
  }
}]

Dans OCPP 2.0.1 : Authorize

Envoyé après le démarrage pour s’enregistrer auprès du backoffice.

Requête
ChampTypeUsageContenu
chargePointVendorstringRequisFabricant de la borne. 20 caractères au maximum.
chargePointModelstringRequisModèle de la borne. 20 caractères au maximum.
chargePointSerialNumberstringOptionnelNuméro de série de la borne. 25 caractères au maximum.
chargeBoxSerialNumberstringOptionnelNuméro de série du boîtier de charge. 25 caractères au maximum.
firmwareVersionstringOptionnelVersion du firmware de la borne. 50 caractères au maximum.
iccidstringOptionnelICCID de la carte SIM. 20 caractères au maximum.
imsistringOptionnelIMSI de la carte SIM. 20 caractères au maximum.
meterTypestringOptionnelType du compteur d’énergie. 25 caractères au maximum.
meterSerialNumberstringOptionnelNuméro de série du compteur d’énergie. 25 caractères au maximum.
Réponse
ChampTypeUsageContenu
statusstringRequisStatut d’enregistrement. Valeurs possibles : Accepted, Pending, Rejected.
currentTimestringRequisHeure actuelle du Central System. Une date et une heure.
intervalintegerRequisIntervalle de Heartbeat en secondes.
Exemple
La borne envoie
[2, "392b5b40", "BootNotification", {
  "chargePointVendor": "ExampleVendor",
  "chargePointModel": "ExampleModel",
  "firmwareVersion": "1.4.2"
}]
Le backoffice répond
[3, "392b5b40", {
  "status": "Accepted",
  "currentTime": "2026-10-06T09:30:00Z",
  "interval": 300
}]

Dans OCPP 2.0.1 : BootNotification

Modifie la disponibilité d’un point de charge.

Requête
ChampTypeUsageContenu
connectorIdintegerRequisID du point de charge (0 = toute la borne).
typestringRequisChangement de disponibilité demandé. Valeurs possibles : Inoperative, Operative.
Réponse
ChampTypeUsageContenu
statusstringRequisRésultat de la demande de changement de disponibilité. Valeurs possibles : Accepted, Rejected, Scheduled.
Exemple
Le backoffice envoie
[2, "be3dcf2e", "ChangeAvailability", {
  "connectorId": 1,
  "type": "Operative"
}]
La borne répond
[3, "be3dcf2e", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : ChangeAvailability

Modifie une clé de configuration sur la borne.

Requête
ChampTypeUsageContenu
keystringRequisClé de configuration à modifier. 50 caractères au maximum.
valuestringRequisNouvelle valeur de la clé de configuration. 500 caractères au maximum.
Réponse
ChampTypeUsageContenu
statusstringRequisRésultat de la modification de configuration. Valeurs possibles : Accepted, Rejected, RebootRequired, NotSupported.
Exemple
Le backoffice envoie
[2, "6fdf2255", "ChangeConfiguration", {
  "key": "MeterValueSampleInterval",
  "value": "60"
}]
La borne répond
[3, "6fdf2255", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : SetVariables

Vide le cache d’autorisation de la borne.

Requête

Aucun champ : la requête est vide.

Réponse
ChampTypeUsageContenu
statusstringRequisRésultat de la demande de vidage du cache. Valeurs possibles : Accepted, Rejected.
Exemple
Le backoffice envoie
[2, "e993e844", "ClearCache", {}]
La borne répond
[3, "e993e844", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : ClearCache

Échange de données propre au fabricant.

Requête
ChampTypeUsageContenu
vendorIdstringRequisIdentifie le fabricant. 255 caractères au maximum.
messageIdstringOptionnelIdentification complémentaire du message. 50 caractères au maximum.
datastringOptionnelDonnées propres au fabricant.
Réponse
ChampTypeUsageContenu
statusstringRequisRésultat du transfert de données. Valeurs possibles : Accepted, Rejected, UnknownMessageId, UnknownVendorId.
datastringOptionnelDonnées de réponse propres au fabricant.
Exemple
Un côté envoie
[2, "e1a403d5", "DataTransfer", {
  "vendorId": "com.example"
}]
L’autre côté répond
[3, "e1a403d5", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : DataTransfer

Récupère des clés de configuration de la borne.

Requête
ChampTypeUsageContenu
keyarrayOptionnelListe des clés de configuration à récupérer. Chaque élément fait 50 caractères au maximum.
Réponse
ChampTypeUsageContenu
configurationKeyarrayOptionnelListe des clés de configuration connues.
keystringRequisNom de la clé de configuration. 50 caractères au maximum.
readonlybooleanRequisIndique si la clé est en lecture seule.
valuestringOptionnelValeur actuelle de la clé. 500 caractères au maximum.
unknownKeyarrayOptionnelListe des clés demandées qui sont inconnues. Chaque élément fait 50 caractères au maximum.
Exemple
Le backoffice envoie
[2, "02bd00f5", "GetConfiguration", {
  "key": [
    "MeterValueSampleInterval"
  ]
}]
La borne répond
[3, "02bd00f5", {
  "configurationKey": [
    {
      "key": "MeterValueSampleInterval",
      "readonly": false,
      "value": "60"
    }
  ]
}]

Dans OCPP 2.0.1 : GetBaseReport et GetVariables

Message périodique de maintien de connexion, qui indique au backoffice que la borne est en ligne.

Requête

Aucun champ : la requête est vide.

Réponse
ChampTypeUsageContenu
currentTimestringRequisHeure actuelle du Central System. Une date et une heure.
Exemple
La borne envoie
[2, "83622997", "Heartbeat", {}]
Le backoffice répond
[3, "83622997", {
  "currentTime": "2026-10-06T09:30:00Z"
}]

Dans OCPP 2.0.1 : Heartbeat

Envoie des relevés de compteur périodiques ou déclenchés.

Requête
ChampTypeUsageContenu
connectorIdintegerRequisID du point de charge (0 = compteur principal).
meterValuearrayRequisUne ou plusieurs valeurs de compteur avec horodatage.
timestampstringRequisHorodatage de la valeur de compteur. Une date et une heure.
sampledValuearrayRequisUne ou plusieurs valeurs échantillonnées.
valuestringRequisLa valeur mesurée.
contextstringOptionnelContexte du relevé. Valeurs possibles : Interruption.Begin, Interruption.End, Sample.Clock, Sample.Periodic, Transaction.Begin, Transaction.End, Trigger, Other.
formatstringOptionnelFormat de la valeur. Valeurs possibles : Raw, SignedData.
measurandstringOptionnelType de mesure. Valeurs possibles : Energy.Active.Export.Register, Energy.Active.Import.Register, Energy.Reactive.Export.Register, Energy.Reactive.Import.Register, Energy.Active.Export.Interval, Energy.Active.Import.Interval, Energy.Reactive.Export.Interval, Energy.Reactive.Import.Interval, Power.Active.Export, Power.Active.Import, Power.Offered, Power.Reactive.Export, Power.Reactive.Import, Power.Factor, Current.Import, Current.Export, Current.Offered, Voltage, Frequency, Temperature, SoC, RPM.
phasestringOptionnelPhase à laquelle s’applique la mesure. Valeurs possibles : L1, L2, L3, N, L1-N, L2-N, L3-N, L1-L2, L2-L3, L3-L1.
locationstringOptionnelEmplacement de la mesure. Valeurs possibles : Cable, EV, Inlet, Outlet, Body.
unitstringOptionnelUnité de mesure. Valeurs possibles : Wh, kWh, varh, kvarh, W, kW, VA, kVA, var, kvar, A, V, K, Celcius, Celsius, Fahrenheit, Percent.
transactionIdintegerOptionnelTransaction à laquelle s’appliquent ces valeurs de compteur.
Réponse

Aucun champ : la réponse est vide.

Exemple
La borne envoie
[2, "80a15023", "MeterValues", {
  "connectorId": 1,
  "meterValue": [
    {
      "timestamp": "2026-10-06T09:30:00Z",
      "sampledValue": [
        {
          "value": "19840",
          "measurand": "Energy.Active.Import.Register",
          "unit": "Wh"
        }
      ]
    }
  ],
  "transactionId": 4521
}]
Le backoffice répond
[3, "80a15023", {}]

Dans OCPP 2.0.1 : MeterValues

Démarre une session de recharge à distance.

Requête
ChampTypeUsageContenu
idTagstringRequisL’identifiant à utiliser pour cette session. 20 caractères au maximum.
connectorIdintegerOptionnelPoint de charge sur lequel démarrer.
chargingProfileobjectOptionnelProfil de charge à appliquer à cette session.
chargingProfileIdintegerRequisIdentifiant unique de ce profil de charge.
stackLevelintegerRequisNiveau de priorité du profil (plus il est élevé, plus le profil est prioritaire).
chargingProfilePurposestringRequisFinalité du profil de charge. Valeurs possibles : ChargePointMaxProfile, TxDefaultProfile, TxProfile.
chargingProfileKindstringRequisType de planning. Valeurs possibles : Absolute, Recurring, Relative.
chargingScheduleobjectRequisLe planning de charge.
chargingRateUnitstringRequisUnité du taux de charge (ampères ou watts). Valeurs possibles : A, W.
chargingSchedulePeriodarrayRequisListe des périodes du planning.
startPeriodintegerRequisDébut de la période, en secondes depuis le début du planning.
limitnumberRequisLimite de puissance ou de courant pendant cette période. Par pas de 0,1.
numberPhasesintegerOptionnelNombre de phases à utiliser pour la charge.
durationintegerOptionnelDurée du planning en secondes.
startSchedulestringOptionnelDate et heure de début du planning. Une date et une heure.
minChargingRatenumberOptionnelTaux de charge minimal pris en charge. Par pas de 0,1.
transactionIdintegerOptionnelTransaction à laquelle s’applique ce profil.
recurrencyKindstringOptionnelFréquence de récurrence des profils récurrents. Valeurs possibles : Daily, Weekly.
validFromstringOptionnelDate et heure à partir desquelles le profil est valable. Une date et une heure.
validTostringOptionnelDate et heure après lesquelles le profil n’est plus valable. Une date et une heure.
Réponse
ChampTypeUsageContenu
statusstringRequisIndique si la borne a accepté la demande. Valeurs possibles : Accepted, Rejected.
Exemple
Le backoffice envoie
[2, "b7e2ef8a", "RemoteStartTransaction", {
  "idTag": "04A2B3C4D5E6F7",
  "connectorId": 1
}]
La borne répond
[3, "b7e2ef8a", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : RequestStartTransaction

Arrête une session de recharge à distance.

Requête
ChampTypeUsageContenu
transactionIdintegerRequisID de la transaction à arrêter.
Réponse
ChampTypeUsageContenu
statusstringRequisIndique si la borne a accepté la demande. Valeurs possibles : Accepted, Rejected.
Exemple
Le backoffice envoie
[2, "7fb0afb2", "RemoteStopTransaction", {
  "transactionId": 4521
}]
La borne répond
[3, "7fb0afb2", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : RequestStopTransaction

Redémarre la borne (Hard ou Soft).

Requête
ChampTypeUsageContenu
typestringRequisType de redémarrage à effectuer. Valeurs possibles : Hard, Soft.
Réponse
ChampTypeUsageContenu
statusstringRequisIndique si la borne a accepté le redémarrage. Valeurs possibles : Accepted, Rejected.
Exemple
Le backoffice envoie
[2, "526d688f", "Reset", {
  "type": "Soft"
}]
La borne répond
[3, "526d688f", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : Reset

Informe le backoffice qu’une session de recharge a démarré.

Requête
ChampTypeUsageContenu
connectorIdintegerRequisPoint de charge sur lequel la transaction a démarré.
idTagstringRequisIdentifiant utilisé pour démarrer la transaction. 20 caractères au maximum.
meterStartintegerRequisValeur du compteur au début de la transaction (Wh).
timestampstringRequisHorodatage du début de la transaction. Une date et une heure.
reservationIdintegerOptionnelID de la réservation utilisée.
Réponse
ChampTypeUsageContenu
idTagInfoobjectRequisInformations d’autorisation pour l’idTag.
statusstringRequisStatut d’autorisation. Valeurs possibles : Accepted, Blocked, Expired, Invalid, ConcurrentTx.
expiryDatestringOptionnelDate et heure après lesquelles l’idTag doit être considéré comme expiré. Une date et une heure.
parentIdTagstringOptionnelidTag parent pour l’autorisation de groupe. 20 caractères au maximum.
transactionIdintegerRequisID de transaction attribué par le Central System.
Exemple
La borne envoie
[2, "2410a6a5", "StartTransaction", {
  "connectorId": 1,
  "idTag": "04A2B3C4D5E6F7",
  "meterStart": 12500,
  "timestamp": "2026-10-06T09:30:00Z"
}]
Le backoffice répond
[3, "2410a6a5", {
  "idTagInfo": {
    "status": "Accepted"
  },
  "transactionId": 4521
}]

Dans OCPP 2.0.1 : TransactionEvent

Rapporte le statut actuel et les éventuelles erreurs d’un point de charge.

Requête
ChampTypeUsageContenu
connectorIdintegerRequisPoint de charge dont le statut est rapporté.
errorCodestringRequisCode d’erreur (NoError en l’absence d’erreur). Valeurs possibles : ConnectorLockFailure, EVCommunicationError, GroundFailure, HighTemperature, InternalError, LocalListConflict, NoError, OtherError, OverCurrentFailure, PowerMeterFailure, PowerSwitchFailure, ReaderFailure, ResetFailure, UnderVoltage, OverVoltage, WeakSignal.
statusstringRequisStatut actuel du point de charge. Valeurs possibles : Available, Preparing, Charging, SuspendedEVSE, SuspendedEV, Finishing, Reserved, Unavailable, Faulted.
infostringOptionnelInformations complémentaires en texte libre sur le statut. 50 caractères au maximum.
timestampstringOptionnelHorodatage du changement de statut. Une date et une heure.
vendorIdstringOptionnelIdentifiant propre au fabricant. 255 caractères au maximum.
vendorErrorCodestringOptionnelCode d’erreur propre au fabricant. 50 caractères au maximum.
Réponse

Aucun champ : la réponse est vide.

Exemple
La borne envoie
[2, "d9b0420e", "StatusNotification", {
  "connectorId": 1,
  "errorCode": "NoError",
  "status": "Available"
}]
Le backoffice répond
[3, "d9b0420e", {}]

Dans OCPP 2.0.1 : StatusNotification

Informe le backoffice qu’une session de recharge s’est arrêtée.

Requête
ChampTypeUsageContenu
transactionIdintegerRequisID de la transaction arrêtée.
timestampstringRequisHorodatage de l’arrêt de la transaction. Une date et une heure.
meterStopintegerRequisValeur du compteur à la fin de la transaction (Wh).
idTagstringOptionnelIdentifiant qui a demandé l’arrêt. 20 caractères au maximum.
reasonstringOptionnelMotif de l’arrêt de la transaction. Valeurs possibles : EmergencyStop, EVDisconnected, HardReset, Local, Other, PowerLoss, Reboot, Remote, SoftReset, UnlockCommand, DeAuthorized.
transactionDataarrayOptionnelTableau d’objets MeterValue (même structure que MeterValues.meterValue).
timestampstringRequisHorodatage de la valeur de compteur. Une date et une heure.
sampledValuearrayRequisUne ou plusieurs valeurs échantillonnées.
valuestringRequisLa valeur mesurée.
contextstringOptionnelContexte du relevé. Valeurs possibles : Interruption.Begin, Interruption.End, Sample.Clock, Sample.Periodic, Transaction.Begin, Transaction.End, Trigger, Other.
formatstringOptionnelFormat de la valeur. Valeurs possibles : Raw, SignedData.
measurandstringOptionnelType de mesure. Valeurs possibles : Energy.Active.Export.Register, Energy.Active.Import.Register, Energy.Reactive.Export.Register, Energy.Reactive.Import.Register, Energy.Active.Export.Interval, Energy.Active.Import.Interval, Energy.Reactive.Export.Interval, Energy.Reactive.Import.Interval, Power.Active.Export, Power.Active.Import, Power.Offered, Power.Reactive.Export, Power.Reactive.Import, Power.Factor, Current.Import, Current.Export, Current.Offered, Voltage, Frequency, Temperature, SoC, RPM.
phasestringOptionnelPhase à laquelle s’applique la mesure. Valeurs possibles : L1, L2, L3, N, L1-N, L2-N, L3-N, L1-L2, L2-L3, L3-L1.
locationstringOptionnelEmplacement de la mesure. Valeurs possibles : Cable, EV, Inlet, Outlet, Body.
unitstringOptionnelUnité de mesure. Valeurs possibles : Wh, kWh, varh, kvarh, W, kW, VA, kVA, var, kvar, A, V, K, Celcius, Celsius, Fahrenheit, Percent.
Réponse
ChampTypeUsageContenu
idTagInfoobjectOptionnelInformations d’autorisation pour l’idTag.
statusstringRequisStatut d’autorisation. Valeurs possibles : Accepted, Blocked, Expired, Invalid, ConcurrentTx.
expiryDatestringOptionnelDate et heure après lesquelles l’idTag doit être considéré comme expiré. Une date et une heure.
parentIdTagstringOptionnelidTag parent pour l’autorisation de groupe. 20 caractères au maximum.
Exemple
La borne envoie
[2, "b380dc07", "StopTransaction", {
  "transactionId": 4521,
  "timestamp": "2026-10-06T09:30:00Z",
  "meterStop": 19840,
  "idTag": "04A2B3C4D5E6F7"
}]
Le backoffice répond
[3, "b380dc07", {
  "idTagInfo": {
    "status": "Accepted"
  }
}]

Dans OCPP 2.0.1 : TransactionEvent

Déverrouille un point de charge à distance.

Requête
ChampTypeUsageContenu
connectorIdintegerRequisPoint de charge à déverrouiller.
Réponse
ChampTypeUsageContenu
statusstringRequisRésultat de la demande de déverrouillage. Valeurs possibles : Unlocked, UnlockFailed, NotSupported.
Exemple
Le backoffice envoie
[2, "882ccab0", "UnlockConnector", {
  "connectorId": 1
}]
La borne répond
[3, "882ccab0", {
  "status": "Unlocked"
}]

Dans OCPP 2.0.1 : UnlockConnector

Gestion du firmware

Mises à jour du firmware et envoi des diagnostics pour la maintenance à distance des bornes.

Demande à la borne d’envoyer ses journaux de diagnostic.

Requête
ChampTypeUsageContenu
locationstringRequisURI vers laquelle envoyer les diagnostics. Une adresse (URI).
retriesintegerOptionnelNombre de tentatives d’envoi.
retryIntervalintegerOptionnelSecondes entre deux tentatives.
startTimestringOptionnelDébut de la plage horaire pour la collecte des journaux. Une date et une heure.
stopTimestringOptionnelFin de la plage horaire pour la collecte des journaux. Une date et une heure.
Réponse
ChampTypeUsageContenu
fileNamestringOptionnelNom du fichier de diagnostic. 255 caractères au maximum.
Exemple
Le backoffice envoie
[2, "da7920cd", "GetDiagnostics", {
  "location": "ftp://files.example.com/diagnostics/"
}]
La borne répond
[3, "da7920cd", {}]

Dans OCPP 2.0.1 : GetLog

Rapporte le statut d’un envoi de diagnostics.

Requête
ChampTypeUsageContenu
statusstringRequisStatut actuel de l’envoi des diagnostics. Valeurs possibles : Idle, Uploaded, UploadFailed, Uploading.
Réponse

Aucun champ : la réponse est vide.

Exemple
La borne envoie
[2, "d1c853b4", "DiagnosticsStatusNotification", {
  "status": "Uploaded"
}]
Le backoffice répond
[3, "d1c853b4", {}]

Dans OCPP 2.0.1 : LogStatusNotification

Rapporte le statut d’une mise à jour du firmware.

Requête
ChampTypeUsageContenu
statusstringRequisStatut actuel de la mise à jour du firmware. Valeurs possibles : Downloaded, DownloadFailed, Downloading, Idle, InstallationFailed, Installing, Installed.
Réponse

Aucun champ : la réponse est vide.

Exemple
La borne envoie
[2, "dc9afcb2", "FirmwareStatusNotification", {
  "status": "Installed"
}]
Le backoffice répond
[3, "dc9afcb2", {}]

Dans OCPP 2.0.1 : FirmwareStatusNotification

Demande à la borne de télécharger et d’installer un nouveau firmware.

Requête
ChampTypeUsageContenu
locationstringRequisURI depuis laquelle télécharger le firmware. Une adresse (URI).
retrieveDatestringRequisDate et heure après lesquelles la borne doit récupérer le firmware. Une date et une heure.
retriesintegerOptionnelNombre de tentatives de téléchargement.
retryIntervalintegerOptionnelSecondes entre deux tentatives.
Réponse

Aucun champ : la réponse est vide.

Exemple
Le backoffice envoie
[2, "a57cc6a2", "UpdateFirmware", {
  "location": "ftp://files.example.com/fw-1.4.3.bin",
  "retrieveDate": "2026-10-07T02:00:00Z"
}]
La borne répond
[3, "a57cc6a2", {}]

Dans OCPP 2.0.1 : UpdateFirmware

Liste d’autorisation locale

Gérer une liste d’autorisation locale sur la borne pour l’authentification hors ligne.

Récupère le numéro de version de la liste d’autorisation locale.

Requête

Aucun champ : la requête est vide.

Réponse
ChampTypeUsageContenu
listVersionintegerRequisNuméro de version actuel de la liste d’autorisation locale.
Exemple
Le backoffice envoie
[2, "ccf23a29", "GetLocalListVersion", {}]
La borne répond
[3, "ccf23a29", {
  "listVersion": 1
}]

Dans OCPP 2.0.1 : GetLocalListVersion

Envoie une mise à jour complète ou partielle de la liste d’autorisation locale.

Requête
ChampTypeUsageContenu
listVersionintegerRequisNuméro de version de cette mise à jour de la liste.
updateTypestringRequisIndique s’il s’agit d’un remplacement complet ou d’une mise à jour différentielle. Valeurs possibles : Differential, Full.
localAuthorizationListarrayOptionnelListe des entrées d’autorisation.
idTagstringRequisL’identifiant à autoriser. 20 caractères au maximum.
idTagInfoobjectOptionnelInformations d’autorisation pour l’idTag.
statusstringRequisStatut d’autorisation. Valeurs possibles : Accepted, Blocked, Expired, Invalid, ConcurrentTx.
expiryDatestringOptionnelDate et heure après lesquelles l’idTag doit être considéré comme expiré. Une date et une heure.
parentIdTagstringOptionnelidTag parent pour l’autorisation de groupe. 20 caractères au maximum.
Réponse
ChampTypeUsageContenu
statusstringRequisRésultat de la mise à jour de la liste locale. Valeurs possibles : Accepted, Failed, NotSupported, VersionMismatch.
Exemple
Le backoffice envoie
[2, "a23c9563", "SendLocalList", {
  "listVersion": 1,
  "updateType": "Full",
  "localAuthorizationList": [
    {
      "idTag": "04A2B3C4D5E6F7",
      "idTagInfo": {
        "status": "Accepted"
      }
    }
  ]
}]
La borne répond
[3, "a23c9563", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : SendLocalList

Réservation

Réserver à l’avance un point de charge pour un utilisateur précis.

Annule une réservation existante.

Requête
ChampTypeUsageContenu
reservationIdintegerRequisID de la réservation à annuler.
Réponse
ChampTypeUsageContenu
statusstringRequisIndique si la réservation a été annulée. Valeurs possibles : Accepted, Rejected.
Exemple
Le backoffice envoie
[2, "63258356", "CancelReservation", {
  "reservationId": 7
}]
La borne répond
[3, "63258356", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : CancelReservation

Crée une réservation sur un point de charge précis.

Requête
ChampTypeUsageContenu
connectorIdintegerRequisPoint de charge à réserver (0 = aucun point de charge précis).
expiryDatestringRequisDate et heure d’expiration de la réservation. Une date et une heure.
idTagstringRequisIdentifiant pour lequel la réservation est faite. 20 caractères au maximum.
reservationIdintegerRequisID unique de cette réservation.
parentIdTagstringOptionnelidTag parent pour la réservation de groupe. 20 caractères au maximum.
Réponse
ChampTypeUsageContenu
statusstringRequisRésultat de la demande de réservation. Valeurs possibles : Accepted, Faulted, Occupied, Rejected, Unavailable.
Exemple
Le backoffice envoie
[2, "62a25d78", "ReserveNow", {
  "connectorId": 1,
  "expiryDate": "2026-10-06T10:00:00Z",
  "idTag": "04A2B3C4D5E6F7",
  "reservationId": 7
}]
La borne répond
[3, "62a25d78", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : ReserveNow

Charge intelligente

Définir et gérer des profils de charge pour l’équilibrage de charge, l’intégration solaire et la charge programmée.

Supprime un ou plusieurs profils de charge de la borne.

Requête
ChampTypeUsageContenu
idintegerOptionnelID du profil de charge à supprimer.
connectorIdintegerOptionnelPoint de charge dont les profils doivent être supprimés.
chargingProfilePurposestringOptionnelFinalité des profils à supprimer. Valeurs possibles : ChargePointMaxProfile, TxDefaultProfile, TxProfile.
stackLevelintegerOptionnelNiveau de priorité (stackLevel) des profils à supprimer.
Réponse
ChampTypeUsageContenu
statusstringRequisIndique si des profils ont été supprimés. Valeurs possibles : Accepted, Unknown.
Exemple
Le backoffice envoie
[2, "2c436739", "ClearChargingProfile", {}]
La borne répond
[3, "2c436739", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : ClearChargingProfile

Demande le planning de charge combiné d’un point de charge.

Requête
ChampTypeUsageContenu
connectorIdintegerRequisPoint de charge pour lequel obtenir le planning.
durationintegerRequisDurée en secondes du planning demandé.
chargingRateUnitstringOptionnelUnité souhaitée pour le planning. Valeurs possibles : A, W.
Réponse
ChampTypeUsageContenu
statusstringRequisIndique si la borne peut fournir le planning. Valeurs possibles : Accepted, Rejected.
connectorIdintegerOptionnelPoint de charge auquel s’applique le planning.
scheduleStartstringOptionnelDate et heure de début du planning composite. Une date et une heure.
chargingScheduleobjectOptionnelLe planning de charge composite.
chargingRateUnitstringRequisUnité du taux de charge (ampères ou watts). Valeurs possibles : A, W.
chargingSchedulePeriodarrayRequisListe des périodes du planning.
startPeriodintegerRequisDébut de la période, en secondes depuis le début du planning.
limitnumberRequisLimite de puissance ou de courant pendant cette période. Par pas de 0,1.
numberPhasesintegerOptionnelNombre de phases à utiliser pour la charge.
durationintegerOptionnelDurée du planning en secondes.
startSchedulestringOptionnelDate et heure de début du planning. Une date et une heure.
minChargingRatenumberOptionnelTaux de charge minimal pris en charge. Par pas de 0,1.
Exemple
Le backoffice envoie
[2, "50bc203f", "GetCompositeSchedule", {
  "connectorId": 1,
  "duration": 3600
}]
La borne répond
[3, "50bc203f", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : GetCompositeSchedule

Envoie un profil de charge à la borne.

Requête
ChampTypeUsageContenu
connectorIdintegerRequisPoint de charge auquel s’applique le profil.
csChargingProfilesobjectRequisLe profil de charge à installer.
chargingProfileIdintegerRequisIdentifiant unique de ce profil de charge.
stackLevelintegerRequisNiveau de priorité du profil (plus il est élevé, plus le profil est prioritaire).
chargingProfilePurposestringRequisFinalité du profil de charge. Valeurs possibles : ChargePointMaxProfile, TxDefaultProfile, TxProfile.
chargingProfileKindstringRequisType de planning. Valeurs possibles : Absolute, Recurring, Relative.
chargingScheduleobjectRequisLe planning de charge.
chargingRateUnitstringRequisUnité du taux de charge (ampères ou watts). Valeurs possibles : A, W.
chargingSchedulePeriodarrayRequisListe des périodes du planning.
startPeriodintegerRequisDébut de la période, en secondes depuis le début du planning.
limitnumberRequisLimite de puissance ou de courant pendant cette période. Par pas de 0,1.
numberPhasesintegerOptionnelNombre de phases à utiliser pour la charge.
durationintegerOptionnelDurée du planning en secondes.
startSchedulestringOptionnelDate et heure de début du planning. Une date et une heure.
minChargingRatenumberOptionnelTaux de charge minimal pris en charge. Par pas de 0,1.
transactionIdintegerOptionnelTransaction à laquelle s’applique ce profil.
recurrencyKindstringOptionnelFréquence de récurrence des profils récurrents. Valeurs possibles : Daily, Weekly.
validFromstringOptionnelDate et heure à partir desquelles le profil est valable. Une date et une heure.
validTostringOptionnelDate et heure après lesquelles le profil n’est plus valable. Une date et une heure.
Réponse
ChampTypeUsageContenu
statusstringRequisIndique si le profil a été accepté. Valeurs possibles : Accepted, Rejected, NotSupported.
Exemple
Le backoffice envoie
[2, "01be9b20", "SetChargingProfile", {
  "connectorId": 1,
  "csChargingProfiles": {
    "chargingProfileId": 10,
    "stackLevel": 0,
    "chargingProfilePurpose": "TxDefaultProfile",
    "chargingProfileKind": "Relative",
    "chargingSchedule": {
      "chargingRateUnit": "A",
      "chargingSchedulePeriod": [
        {
          "startPeriod": 0,
          "limit": 16.0
        }
      ]
    }
  }
}]
La borne répond
[3, "01be9b20", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : SetChargingProfile

Déclenchement à distance

Demander à la borne d’envoyer un message précis à la demande.

Demande à la borne d’envoyer immédiatement un message précis.

Requête
ChampTypeUsageContenu
requestedMessagestringRequisLe message que la borne doit envoyer. Valeurs possibles : BootNotification, DiagnosticsStatusNotification, FirmwareStatusNotification, Heartbeat, MeterValues, StatusNotification.
connectorIdintegerOptionnelPoint de charge pour lequel le message doit être envoyé.
Réponse
ChampTypeUsageContenu
statusstringRequisIndique si la borne enverra le message. Valeurs possibles : Accepted, Rejected, NotImplemented.
Exemple
Le backoffice envoie
[2, "4c736efd", "TriggerMessage", {
  "requestedMessage": "StatusNotification"
}]
La borne répond
[3, "4c736efd", {
  "status": "Accepted"
}]

Dans OCPP 2.0.1 : TriggerMessage

Clés de configuration OCPP 1.6

ChangeConfiguration définit une clé à la fois sur une borne, et GetConfiguration les relit. C’est ici que se décide la plus grande partie du comportement réel d’une borne : la fréquence d’arrivée des valeurs de compteur, ce qu’elles contiennent, si une session survit à une coupure réseau, comment un câble se déverrouille.

Comment l’appel se comporte

  • Chaque valeur est une chaîneLes nombres et les booléens aussi : "60", "true". Un nombre JSON enfreint le schéma du message, et une borne qui vérifie le schéma répond par un CallError.
  • Écrivez les noms de clés comme la spécificationLa spécification considère que les noms de clés ne sont pas sensibles à la casse, mais toutes les bornes ne suivent pas cette règle : écrivez donc MeterValuesSampledData, et non metervaluessampleddata.
  • Certaines clés exigent un redémarrageLa borne répond RebootRequired, et c’est à vous d’envoyer un Reset.
  • Les fabricants ajoutent leurs propres clésGetConfiguration avec une liste de clés vide renvoie toutes les clés que la borne prend en charge, y compris celles du fabricant. Les clés que vous demandez par leur nom et qu’elle ne reconnaît pas reviennent dans unknownKey.

Les quatre réponses

Accepted
La clé est définie et active immédiatement.
Rejected
La clé existe mais la valeur a été refusée : hors plage, mauvais format, ou en lecture seule sur cette borne.
RebootRequired
La valeur est enregistrée mais ne s’applique qu’au redémarrage de la borne.
NotSupported
La borne n’implémente pas du tout cette clé.

Les 43 clés, par profil de fonctionnalités

CléTypeAccèsCe qu’elle fait
Core34
AllowOfflineTxForUnknownIdOptionnelle dans la spécificationbooleanLecture et écritureIndique si la borne démarre une transaction pour un idTag inconnu lorsqu’elle est hors ligne.Avec true, un site continue de recharger pendant une coupure réseau, au prix de sessions que vous ne pourrez peut-être facturer à personne.
AuthorizationCacheEnabledOptionnelle dans la spécificationbooleanLecture et écritureIndique si la borne met en cache le résultat des appels Authorize précédents.À distinguer de la Local Auth List : le cache se remplit à partir d’autorisations réelles, la liste est envoyée par le backend.
AuthorizeRemoteTxRequestsbooleanLectureIndique si la borne autorise l’idTag d’un RemoteStartTransaction avant de démarrer.Avec true, un démarrage à distance depuis l’application exige encore un aller-retour Authorize : un idTag invalide fait donc échouer le démarrage.
BlinkRepeatOptionnelle dans la spécificationintegerLecture et écritureNombre de clignotements du voyant de la borne pendant une séquence de clignotement.
ClockAlignedDataIntervalintegerLecture et écritureIntervalle des valeurs de compteur alignées sur l’horloge, compté à partir de minuit. 0 les désactive.900 donne un relevé à chaque quart d’heure. C’est cette clé qui alimente MeterValuesAlignedData, et elle tourne qu’une voiture soit branchée ou non.
ConnectionTimeOutintegerLecture et écritureDurée pendant laquelle la borne attend que le conducteur branche la voiture après l’autorisation, avant de libérer le point de charge.
ConnectorPhaseRotationCSLLecture et écritureRotation des phases par point de charge, en notation connectorId.RST, par exemple 0.RST, 1.RST, 2.RTS.Une erreur ici donne des valeurs de compteur par phase fausses et un équilibrage de charge monophasé faux. À vérifier sur tout site triphasé.
ConnectorPhaseRotationMaxLengthOptionnelle dans la spécificationintegerLectureNombre maximal d’éléments dans ConnectorPhaseRotation.
GetConfigurationMaxKeysintegerLectureNombre maximal de clés qu’une seule requête GetConfiguration peut demander.Demandez-en davantage et la borne peut répondre par une erreur. Envoyez GetConfiguration sans aucune clé pour obtenir tout ce qu’elle prend en charge.
HeartbeatIntervalintegerLecture et écritureFréquence à laquelle la borne envoie un Heartbeat quand rien d’autre ne se passe.La réponse au BootNotification peut remplacer cette valeur. Sur une carte SIM facturée à l’usage, un heartbeat court est un coût de données discret qui s’accumule.
LightIntensityOptionnelle dans la spécificationintegerLecture et écritureLuminosité de l’éclairage de la borne, en pourcentage.
LocalAuthorizeOfflinebooleanLecture et écritureIndique si la borne autorise à partir de sa liste locale ou de son cache lorsqu’elle est hors ligne.
LocalPreAuthorizebooleanLecture et écritureIndique si la borne démarre une transaction à partir de la liste locale ou du cache lorsqu’elle est en ligne, sans attendre le backend.Réduit l’attente à la borne, au prix d’un backend qui n’a plus le dernier mot sur chaque démarrage.
MaxEnergyOnInvalidIdOptionnelle dans la spécificationintegerLecture et écritureÉnergie que la borne fournit encore après qu’une autorisation s’est révélée invalide.
MeterValuesAlignedDataCSLLecture et écritureGrandeurs mesurées envoyées dans les MeterValues alignées sur l’horloge, selon le ClockAlignedDataInterval.Même vocabulaire de grandeurs que MeterValuesSampledData, autre déclencheur : l’horloge, et non la session.
MeterValuesAlignedDataMaxLengthOptionnelle dans la spécificationintegerLectureNombre maximal de grandeurs mesurées dans MeterValuesAlignedData.
MeterValuesSampledDataCSLLecture et écritureGrandeurs mesurées échantillonnées pendant une transaction et envoyées dans MeterValues, selon le MeterValueSampleInterval.La clé la plus utile de cette page. Voir l’analyse détaillée plus bas.
MeterValuesSampledDataMaxLengthOptionnelle dans la spécificationintegerLectureNombre maximal de grandeurs mesurées dans MeterValuesSampledData.Lisez-la avant de construire une longue liste : dépassez-la et la borne rejette l’ensemble.
MeterValueSampleIntervalintegerLecture et écritureFréquence à laquelle la borne échantillonne MeterValuesSampledData pendant une transaction. 0 désactive l’échantillonnage.60 est une valeur par défaut raisonnable. En dessous de 30, avec une longue liste de grandeurs, vous générez beaucoup de trafic pour très peu d’informations en plus.
MinimumStatusDurationOptionnelle dans la spécificationintegerLecture et écritureDurée minimale pendant laquelle la borne reste dans un statut avant de rapporter le suivant.Utile contre les statuts qui oscillent, sur les bornes qui passent sans cesse de Preparing à Available.
NumberOfConnectorsintegerLectureNombre de points de charge physiques sur cette borne.
ResetRetriesintegerLecture et écritureNombre de nouvelles tentatives de la borne après un redémarrage échoué.
StopTransactionOnEVSideDisconnectbooleanLecture et écritureIndique si débrancher côté voiture arrête la transaction en cours.Avec false, la session reste ouverte après le retrait du câble : c’est ainsi qu’on se retrouve avec des sessions qui ne finissent jamais.
StopTransactionOnInvalidIdbooleanLecture et écritureIndique si la borne arrête la transaction quand le backend rejette l’idTag.
StopTxnAlignedDataCSLLecture et écritureGrandeurs mesurées alignées sur l’horloge, ajoutées au transactionData de StopTransaction.
StopTxnAlignedDataMaxLengthOptionnelle dans la spécificationintegerLectureNombre maximal de grandeurs mesurées dans StopTxnAlignedData.
StopTxnSampledDataCSLLecture et écritureGrandeurs mesurées échantillonnées, ajoutées au transactionData de StopTransaction.Gardez cette liste courte. Tout ce qu’elle contient est répété pour chaque échantillon de toute la session dans un seul payload StopTransaction : c’est ainsi que des bornes produisent des messages d’arrêt de plusieurs mégaoctets que les backends rejettent.
StopTxnSampledDataMaxLengthOptionnelle dans la spécificationintegerLectureNombre maximal de grandeurs mesurées dans StopTxnSampledData.
SupportedFeatureProfilesCSLLectureProfils de fonctionnalités que cette borne implémente, par exemple Core, FirmwareManagement, SmartCharging.La réponse honnête à la question de ce qu’une borne sait faire. Lisez-la avant de promettre la charge intelligente à un client.
SupportedFeatureProfilesMaxLengthOptionnelle dans la spécificationintegerLectureNombre maximal d’éléments dans SupportedFeatureProfiles.
TransactionMessageAttemptsintegerLecture et écritureNombre de nouvelles tentatives d’envoi d’un message de transaction que le backend n’a pas acquitté.
TransactionMessageRetryIntervalintegerLecture et écritureAttente de base entre ces tentatives. La borne la multiplie par le numéro de la tentative.
UnlockConnectorOnEVSideDisconnectbooleanLecture et écritureIndique si le câble se déverrouille à la borne quand il est débranché côté voiture.
WebSocketPingIntervalOptionnelle dans la spécificationintegerLecture et écritureIntervalle des trames ping WebSocket sur la connexion OCPP-J.La solution discrète pour les bornes qui passent sans cesse hors ligne derrière un NAT ou un pare-feu qui ferme les connexions inactives.
Liste d’autorisation locale3
LocalAuthListEnabledbooleanLecture et écritureIndique si la liste d’autorisation locale est utilisée.
LocalAuthListMaxLengthintegerLectureNombre d’entrées que peut contenir la liste d’autorisation locale.
SendLocalListMaxLengthintegerLectureNombre d’entrées qui tiennent dans un seul message SendLocalList.Une liste plus longue doit être envoyée en plusieurs mises à jour différentielles.
Réservation1
ReserveConnectorZeroSupportedOptionnelle dans la spécificationbooleanLectureIndique si la borne accepte une réservation sur le point de charge 0, c’est-à-dire sur n’importe quel point de charge.
Charge intelligente5
ChargeProfileMaxStackLevelintegerLectureNiveau de priorité (stack level) le plus élevé que la borne accepte sur un profil de charge. Le niveau le plus élevé l’emporte.
ChargingScheduleAllowedChargingRateUnitCSLLectureUnités que la borne accepte dans un planning de charge : courant (A), puissance (W), ou les deux.Envoyez un profil en watts à une borne qui n’accepte que les ampères et il est rejeté. Cette clé vous indique laquelle utiliser.
ChargingScheduleMaxPeriodsintegerLectureNombre maximal de périodes dans un planning de charge.
ConnectorSwitch3to1PhaseSupportedOptionnelle dans la spécificationbooleanLectureIndique si la borne peut basculer entre charge triphasée et charge monophasée.Détermine si vous pouvez descendre sous le minimum triphasé au lieu de mettre la charge complètement en pause.
MaxChargingProfilesInstalledintegerLectureNombre de profils de charge pouvant être installés en même temps.

MeterValuesSampledData : ce que mesure une borne

Une seule clé, MeterValuesSampledData, détermine la télémétrie que vous obtenez d’une session de recharge. C’est une liste de grandeurs mesurées séparées par des virgules, et la borne échantillonne chaque élément à l’intervalle défini par MeterValueSampleInterval, puis les envoie dans un message MeterValues. Laissez-la à sa valeur par défaut et vous obtenez un seul relevé d’énergie cumulée, suffisant pour facturer, et rien d’autre : pas de courbe de puissance, pas de courant par phase, pas de tension, aucun moyen de voir si une limite de charge intelligente a été appliquée.

Elle ne fonctionne jamais seule. MeterValueSampleInterval fixe la fréquence d’envoi, MeterValuesSampledDataMaxLength plafonne le nombre de grandeurs que vous pouvez lister, StopTxnSampledData décide lesquelles sont répétées dans StopTransaction, et MeterValuesAlignedData utilise le même vocabulaire sur un calendrier d’horloge plutôt que par session.

Les grandeurs mesurées

Chacune de ces grandeurs peut figurer dans la liste. Celles qu’une borne prend en charge dépendent de son matériel : une borne murale AC ne remonte généralement pas l’état de charge, et une borne basique peut n’avoir que le registre d’énergie.

MeasurandUnitéGénéralement surCe qu’elle vous donne
Energy.Active.Import.RegisterWhAC et DCÉnergie cumulée prélevée sur le réseau, lue directement sur le registre du compteur. La valeur par défaut quand MeterValuesSampledData est vide, et celle sur laquelle repose presque tout calcul de facturation.
Energy.Active.Export.RegisterWhCompatible V2GÉnergie cumulée réinjectée, pour les installations bidirectionnelles.
Energy.Active.Import.IntervalWhAC et DCÉnergie importée depuis l’échantillon précédent, plutôt qu’un total cumulé.
Energy.Reactive.Import.RegistervarhSelon le compteurÉnergie réactive importée cumulée.
Power.Active.ImportWAC et DCPuissance active instantanée. Ce que vous tracez pour voir une courbe de charge, et ce à quoi réagit la gestion de charge.
Power.OfferedWAC et DCPuissance que la borne offre actuellement à la voiture. Comparez-la à Power.Active.Import pour voir si une limite est réellement appliquée.
Power.Reactive.ImportvarSelon le compteurPuissance réactive instantanée.
Power.FactorrapportSelon le compteurRapport entre la puissance active et la puissance apparente.
Current.ImportAAC et DCCourant prélevé. Généralement remonté par phase : cette seule grandeur peut donc donner trois valeurs par échantillon.
Current.OfferedAAC et DCLimite de courant que la borne signale à la voiture. L’indication directe que votre profil de charge intelligente a été appliqué.
Current.ExportACompatible V2GCourant réinjecté, pour les installations bidirectionnelles.
VoltageVAC et DCTension d’alimentation, par phase sur les bornes triphasées. Utile pour repérer une phase perdue ou une mauvaise connexion.
FrequencyHzSelon le compteurFréquence du réseau. La spécification ne prévoit pas de champ unit pour cette grandeur.
TemperatureCelsiusSelon la borneTempérature à la borne ou au point de charge. Explique une réduction de puissance par temps chaud avant que quelqu’un ne parle de panne.
SoC%DC, ou ISO 15118 en ACÉtat de charge de la batterie de la voiture. Présent seulement quand la voiture le transmet réellement, ce qu’elle ne fait généralement pas en recharge AC simple.
RPMtr/minRareVitesse du ventilateur, sur les bornes qui la remontent.

Listes qui fonctionnent

Copiez-en une dans la valeur d’un appel ChangeConfiguration. Commencez avec peu d’éléments, et ajoutez des grandeurs une fois que la borne les accepte.

  • Facturation uniquement

    Le minimum qui produit encore une facture correcte. La valeur par défaut sur la plupart des bornes.

    Energy.Active.Import.Register
  • Télémétrie standard

    Valeur par défaut raisonnable pour un site AC géré : une courbe de puissance, le courant et la tension par phase pour le diagnostic.

    Energy.Active.Import.Register, Power.Active.Import, Current.Import, Voltage
  • Charge intelligente

    Ajoute les valeurs offertes, pour voir si un profil est réellement appliqué au lieu de le supposer.

    Energy.Active.Import.Register, Power.Active.Import, Power.Offered, Current.Import, Current.Offered, Voltage
  • Recharge rapide DC

    Ajoute l’état de charge et la température, que les bornes DC remontent bien et qui expliquent la plupart des réductions de puissance.

    Energy.Active.Import.Register, Power.Active.Import, Current.Import, Voltage, SoC, Temperature

Ce qui tourne mal

  • Une seule grandeur invalide fait rejeter toute la liste

    Les bornes valident la liste comme un tout. Si un seul élément n’est pas pris en charge, vous obtenez Rejected ou NotSupported pour l’ensemble, sans indication de celui qui a échoué. Définissez la liste une grandeur à la fois pour trouver la coupable, ou lisez d’abord MeterValuesSampledDataMaxLength et la documentation du fabricant.

  • Une grandeur peut donner trois valeurs

    Current.Import et Voltage sont remontés par phase : sur une borne triphasée, ils arrivent chacun sous forme de trois entrées sampledValue, étiquetées L1, L2, L3 ou L1-N, etc. Une liste de six grandeurs peut facilement donner une douzaine de valeurs par échantillon. La taille du payload augmente plus vite que la longueur de la liste ne le laisse penser.

  • Wh contre kWh

    Le registre d’énergie est en Wh par défaut, mais le champ unit peut indiquer kWh, et certains firmwares le font. Lisez l’unité au lieu de la supposer, sinon vous obtenez une facture fausse d’un facteur mille.

  • Un intervalle court a un coût

    Un MeterValueSampleInterval de 10 secondes avec une longue liste signifie des centaines de messages par session. Sur une carte SIM facturée à l’usage, cela coûte de l’argent, et sur un grand site, cela représente une vraie charge pour le backend. 60 secondes est une bonne valeur par défaut, 300 pour les sites où seule la forme de la courbe compte.

  • StopTxnSampledData, le piège du payload

    Tout ce qui y figure est répété, pour chaque échantillon de toute la session, dans un seul message StopTransaction. Une longue liste sur une longue session produit un payload assez gros pour que les backends le rejettent ou le tronquent, et la transaction ne se clôture alors pas proprement. Limitez-la au registre d’énergie, sauf raison précise.

  • Retirez le registre d’énergie et la facturation ne fonctionne plus

    Si Energy.Active.Import.Register ne figure pas dans la liste, les valeurs de compteur périodiques ne contiennent aucun total cumulé. La plupart des backends se rabattent alors sur meterStart et meterStop des messages de transaction, et toute session dont le StopTransaction se perd devient impossible à facturer. Gardez-le toujours dans la liste.

  • Le SoC n’est généralement pas disponible en AC

    L’état de charge vient de la voiture, via ISO 15118 ou le protocole de recharge DC. Sur une simple borne murale AC sans Plug and Charge, la voiture ne le transmet pas : demander le SoC est donc soit rejeté, soit sans résultat utile.

  • Lisez le champ context

    Chaque sampledValue porte un context : Sample.Periodic, Transaction.Begin, Transaction.End, Sample.Clock ou Trigger. Une valeur à Transaction.Begin est un registre de départ, pas une consommation. C’est en traitant chaque échantillon comme périodique que des sessions finissent comptées deux fois.

Questions sur OCPP 1.6J

OCPP 1.6J est la version 1.6 de l’Open Charge Point Protocol dans sa forme JSON. La borne ouvre un WebSocket vers son backoffice, et les deux côtés s’y envoient des messages JSON. L’Open Charge Alliance a publié la version 1.6 en 2015, et la plupart des bornes la prennent encore en charge : dans notre base de données des bornes, 483 des 495 bornes dont la version OCPP est connue prennent en charge la 1.6.

Elles transportent les mêmes messages d’une manière différente. La 1.6J envoie du JSON sur un WebSocket que la borne garde ouvert : la borne n’a donc besoin que d’une connexion sortante. La 1.6S envoie du SOAP sur HTTP, et le backoffice doit alors aussi pouvoir joindre la borne.

La 2.0.1 est une version plus récente, avec son propre jeu de messages. Elle décrit les réglages d’une borne dans un modèle d’équipement (device model), intègre des profils de sécurité, remplace StartTransaction et StopTransaction par TransactionEvent et ajoute des messages pour Plug and Charge (ISO 15118). Les deux ne se mélangent pas : une borne et son backoffice conviennent d’une seule version à l’ouverture de la connexion. Dans notre base de données des bornes, 102 bornes indiquent la 2.0.1, en plus ou à la place de la 1.6. Tous les messages 2.0.1 et 2.1 figurent dans la référence OCPP 2.0.1 et 2.1.

L’Open Charge Alliance la publie gratuitement sur son site web, avec un schéma JSON pour chaque message. Cette référence suit cette spécification. Là où les deux diffèrent, c’est la spécification qui fait foi.

Par le profil Smart Charging. Le backoffice envoie SetChargingProfile avec un planning de limites en ampères ou en watts. Un ChargePointMaxProfile plafonne toute la borne, un TxDefaultProfile s’applique à chaque nouvelle session et un TxProfile à une session en cours. Quand deux profils de même finalité se chevauchent, celui dont le stackLevel est le plus élevé l’emporte. La façon dont Plugchoice s’en sert est décrite sur la page de la charge intelligente.

Cherchez-la dans la base de données des bornes : 775 bornes, avec les versions OCPP que nous connaissons et la source de chacune. La fiche technique de la borne l’indique généralement aussi, souvent sous la forme OCPP 1.6J ou OCPP 1.6 JSON.

Dans les réglages de la borne, souvent dans l’application d’installation ou sur sa page web locale, saisissez l’URL WebSocket du backoffice (elle commence par ws:// ou wss://) et l’ID de la borne, l’identité du charge point. La borne ouvre la connexion et envoie un BootNotification. Dès que le backoffice répond Accepted, la borne est en ligne et envoie un StatusNotification pour chaque point de charge.

Plugchoice et OCPP

  • Un backoffice gratuitConnectez une borne OCPP 1.6J et gérez-la dans le portail web.
  • L’applicationPropriétaires et installateurs pilotent la même borne depuis leur téléphone.
  • L’OCPP ProxyUne borne sur plusieurs backoffices en même temps.
  • BackofficesLes backoffices que vous choisissez dans une liste quand vous connectez une borne.

Lectures complémentaires

  1. Qu’est-ce que OCPP ?

    Blog | 3 min de lecture

Cette page pour les assistants IA

Toute la référence, chaque message et chaque clé de configuration, dans un seul fichier en texte brut qu’un assistant peut lire d’un coup.

La référence en texte brut

Faites tourner vos bornes OCPP sur Plugchoice

Connectez gratuitement vos bornes OCPP 1.6J à Plugchoice et gérez-les dans le portail web, dans l’application et via l’API.