OCPP
Référence du pilote OCPP : le système central intégré, les certificats des bornes, les tags de connecteur et la règle de nommage Meter/Status.
Le pilote OCPP fait de Ganter Lab le système central des bornes de recharge de véhicules qui parlent l'Open Charge Point Protocol. Comme pour LoRaWAN, le sens est inversé : la station ne se connecte pas à la borne, c'est la borne qui se connecte à Ganter Lab par un WebSocket, s'enregistre, et y pousse sa télémétrie.
Le système central intégré démarre quand le premier équipement OCPP activé est chargé dans le connector en service, et s'arrête quand le dernier est retiré ou désactivé : sans aucune borne configurée, rien n'écoute sur le port. En ajouter une le fait revenir, sans redémarrer l'application. Chaque équipement que vous configurez représente une borne, identifiée par l'ID sous lequel elle se connecte.
Système central et ports
| Quoi | Valeur |
|---|---|
| Versions du protocole | OCPP 1.6, 2.0, 2.0.1 et 2.1 (négociation de sous-protocole WebSocket ; JSON) |
| Écoute | Toutes les interfaces, port TCP 19521, TLS seulement |
| Adresse de la borne | wss://<adresse-de-la-station>:19521/<id-de-la-borne> |
| Identité | La dernière partie du chemin WebSocket est l'ID de la borne |
L'écoute est toujours en TLS ; une écoute en HTTP simple est refusée partout sauf sur la boucle locale, qui n'existe que pour les essais internes au processus. Une borne s'enregistre avec sa BootNotification (à laquelle on répond par un intervalle de battement de 60 secondes), et chaque badge présenté pour autorisation est accepté : Ganter Lab observe la recharge, il ne gère ni tarifs ni accès.
Certificats
Le côté serveur de la poignée de main TLS présente le certificat OPC UA propre à l'application. Chaque borne doit présenter un certificat client :
- Il doit construire une chaîne valide sur cette machine Windows, sans erreur de politique TLS ; une vérification en échec refuse la connexion et le journal enregistre laquelle a échoué.
- Son nom commun de sujet ou un autre nom de sujet DNS doit nommer l'ID de la borne sous lequel elle se connecte. Un certificat qui nomme une autre borne que celle du chemin de connexion est refusé.
Une poignée de main sans certificat client est abandonnée avant qu'aucune donnée ne circule.
Champs de connexion
| Champ | Ce que c'est | Format | Défaut |
|---|---|---|---|
| Identifiant | L'ID de la borne que cet équipement représente : le même ID que la borne place au bout de son URL de connexion et porte dans son certificat. | Texte libre, comparé sans tenir compte de la casse. Vide retombe sur le nom d'équipement assaini. | vide |
Il n'y a ni champ d'hôte, ni de port, ni d'identifiants : la borne détient les détails de connexion, et cette station a seulement besoin de savoir quelle borne l'équipement désigne. Il n'y a pas non plus de champ de période de scrutation. OCPP est fondé sur la poussée : la borne envoie des messages MeterValues et StatusNotification à sa propre cadence, et les tags se rafraîchissent depuis les dernières données reçues sur un cycle fixe d'une seconde.
Une borne qui ne s'est pas encore connectée, ou un connecteur qui n'a pas encore rapporté, n'a donc aucune lecture, et non une lecture en échec. Ses tags restent vides, l'équipement rapporte que rien n'a été observé plutôt que de passer hors ligne, et aucun échec n'est journalisé : c'est l'état normal d'une borne qui vient d'être configurée et n'est pas encore arrivée.
Tags
Un tag OCPP lit un connecteur de la borne (connecteur au sens OCPP : une position de prise, numérotée à partir de 1). Deux sortes de tags existent, distinguées par le suffixe du nom du tag, qui est validé :
| Le nom du tag se termine par | Ce qu'il lit | Type sensé |
|---|---|---|
Meter |
La dernière valeur de compteur échantillonnée que le connecteur a rapportée (MeterValues OCPP). L'unité est ce que la borne envoie, typiquement le Wh. Le serveur garde les 10 derniers échantillons et le tag lit le plus récent. Un connecteur qui n'a jamais rapporté se lit comme une valeur vide, pas comme zéro. | Float ou Double |
Status |
Le texte d'état du connecteur, tiré de la dernière StatusNotification (par exemple Available, Charging, Faulted). |
String |
Un nom sans l'un de ces deux suffixes est refusé par la validation : nommez les tags
Connector1Meter et Connector1Status.
| Champ | Ce qu'il fait | Valeurs | Défaut |
|---|---|---|---|
| Connecteur | Le numéro de connecteur de la borne que ce tag lit. | 1 ou plus | 1 |
| Type de donnée | Le type OPC UA sous lequel la valeur est exposée. | Int32, Float, Double, String | Float |
Les tags OCPP sont en lecture seule : le champ d'accès ne propose aucun choix inscriptible, et une écriture est refusée plutôt que feinte. Commander une borne est une commande à part entière, décrite juste après, pas une valeur écrite dans un tag.
Commandes
Une borne se commande autant qu'elle se lit. Chaque équipement OCPP porte les commandes ci-dessous en méthodes sur l'équipement dans l'espace d'adressage OPC UA propre à cette station, si bien que tout ce qui peut appeler une méthode peut en envoyer une : un client OPC UA, ou une action Logic qui l'appelle.
Chaque commande prend l'ID de la borne en premier argument, et rend la réponse propre de la borne en résultat.
| Commande | Autres arguments | Ce qu'elle fait |
|---|---|---|
| ChangeAvailability | ConnectorId, Type (Operative ou Inoperative) |
Met un connecteur en service ou hors service. |
| ChangeConfiguration | Key, Value | Pose une clé de configuration sur la borne (OCPP 1.6). |
| ClearCache | aucun | Vide le cache d'autorisation de la borne. |
| GetConfiguration | Key | Lit une clé de configuration (OCPP 1.6). |
| RemoteStartTransaction | IdTag | Démarre une session de recharge pour un jeton. |
| RemoteStopTransaction | TransactionId | Arrête une session en cours. |
| GetTransactionStatus | TransactionId | Demande si une transaction tourne encore (OCPP 2.x). |
| Reset | aucun | Redémarre la borne. |
| UnlockConnector | ConnectorId | Libère le câble d'un connecteur. |
| SetChargingProfile | ConnectorId, Limit, NumberOfPhases | Pose une limite de puissance de recharge. |
| SetVariables | ComponentName, VariableName, AttributeType, AttributeValue | Pose une variable d'un composant (OCPP 2.x). |
| GetVariables | ComponentName, VariableName, AttributeType | Lit une variable d'un composant (OCPP 2.x). |
AttributeType vaut Actual, Target, MinSet ou MaxSet.
Attendre la réponse. Une commande n'est pas finie quand la station l'a envoyée. La station tient l'appel ouvert jusqu'à ce que la borne réponde à l'ordre même qu'elle a envoyé, apparié par l'identifiant de corrélation qui voyage avec lui, et alors seulement rapporte le succès et rend la réponse. Trois choses y mettent fin autrement, chacune rapportée comme un échec avec sa raison :
- La borne n'est pas connectée, ou sa connexion n'est pas ouverte. Rien n'est envoyé.
- La borne répond par une erreur OCPP, par exemple pour une commande qu'elle n'implémente pas. Le code d'erreur est la raison.
- 30 secondes passent sans aucune réponse. Une commande à laquelle personne n'a répondu est un échec, jamais un succès.
Une commande envoyée pour une borne qu'un équipement ne porte pas, ou qui n'est pas connectée, est refusée tout de suite plutôt que mise en file.
Découverte
Découvrir sur le pilote OCPP liste les bornes actuellement connectées au
système central, et lire les voies d'un candidat propose un tag Meter et un tag
Status par connecteur que la borne a rapporté jusqu'ici.
La première borne se configure toujours à la main. Rien ne peut se connecter avant que le système central n'écoute, et il n'écoute qu'une fois qu'un équipement OCPP existe ici, si bien qu'un balayage sur une installation sans borne configurée ne trouve rien et le dit. Ajoutez ce premier équipement avec l'ID sous lequel la borne se connectera ; après cela, une borne qui s'est connectée peut être découverte. Le déroulement général de la découverte est décrit sur la page Connector.
L'ID est comparé sans tenir compte de la casse, dans le certificat, dans le chemin de
connexion et face à l'équipement : une borne qui se connecte comme cp-a avec un certificat
qui nomme CP-A est la même borne qu'un équipement dont l'identifiant indique CP-A.