OCPP

OCPP のドライバーの手引き。内蔵のセントラルシステム、充電ポイントの証明書、充電コネクターのタグ、そして Meter と Status の名付けの規則。

Markdown で表示

OCPP のドライバーは、Open Charge Point Protocol を話す EV の充電ポイントに対して、Ganter Lab をセントラルシステムにします。LoRaWAN と同じで、向きが逆です。ステーションのほうから充電器につなぐのではなく、充電ポイントのほうが WebSocket で Ganter Lab につなぎ、自分を登録し、測定値を送り込んできます。

内蔵のセントラルシステムは、有効な OCPP の機器の 1 つ目が動いている connector に読み込まれたときに始まり、最後の 1 つが削除されるか無効になったときに止まります。充電ポイントが 1 つも設定されていなければ、そのポートで待ち受けるものは何もありません。1 つ追加すれば、アプリケーションを再起動せずに戻ってきます。設定する機器 1 台が、1 つの充電ポイントを表し、それがつないでくるときの ID で見分けられます。

セントラルシステムとポート

項目
プロトコルの版 OCPP 1.62.02.0.12.1(WebSocket のサブプロトコルの取り決め、JSON)
待ち受け すべてのインターフェース、TCP のポート 19521、TLS のみ
充電ポイントのアドレス wss://<station-address>:19521/<charge-point-id>
識別 WebSocket のパスの最後の部分が、充電ポイントの ID です

待ち受けは必ず TLS です。平文の HTTP の待ち受けは、プロセス内の試験のためだけにある loopback 以外では拒否されます。充電ポイントは自分の BootNotification で登録し(60 秒のハートビートの間隔で答えます)、認可のために差し出されたバッジはすべて受け入れられます。Ganter Lab は充電を観測するのであって、料金や入退場を管理するものではありません。

証明書

TLS の握手のサーバー側は、このアプリケーション自身の OPC UA の証明書を差し出します。充電ポイントは、それぞれクライアントの証明書を差し出さなければなりません。

  1. その証明書は、この Windows の機械の上で正しい連鎖を組み立てられ、TLS の方針のエラーがないこと。検査に落ちた接続は拒否され、どの検査に落ちたかを診断ログが記録します。
  2. その主体の一般名か、DNS のサブジェクト代替名が、つないでくるときの充電ポイントの ID を名指ししていること。接続のパスにあるものと違う充電ポイントを名乗る証明書は拒否されます。

クライアントの証明書のない握手は、データが 1 つも流れる前に落とされます。

接続の項目

項目 意味 形式 既定
識別子 この機器が表す充電ポイントの ID。充電器が接続の URL の末尾に置き、証明書にも載せている、その同じ ID です。 自由記述で、大文字と小文字を問わずに突き合わせます。空なら、機器の名前を整えたものに戻ります。

ホスト、ポート、資格情報の項目はありません。接続の詳しいところは充電器が持っていて、このステーションは、その機器がどの充電ポイントを指すのかだけ知っていればよいからです。読み出し周期の項目もありません。OCPP は押し出し型で、充電ポイントが MeterValues と StatusNotification のメッセージを自分の都合で送ってきます。タグは、最後に受け取ったデータから 1 秒の決まった周期で更新されます。

ですから、まだつないできていない充電ポイントや、まだ報告していない充電コネクターには、失敗した読み取りではなく、読み取りがありません。そのタグは空のままで、機器はオフラインになるのではなく、まだ何も観測していないと伝え、失敗は診断ログに残りません。これは、設定したばかりでまだ現れていない充電ポイントの、ふつうの状態です。

タグ

OCPP のタグは、充電ポイントの充電コネクターを 1 つ読みます(OCPP の意味での connector、つまり 1 か所の差込口で、1 から数えます)。タグには 2 種類あり、検証されるタグ名の接尾辞で見分けます。

タグ名の終わり方 読むもの 適した型
Meter その充電コネクターが報告した、いちばん新しい標本の計量値(OCPP の MeterValues)。単位は充電器が送ってくるもので、ふつうは Wh です。サーバーは最後の 10 個の標本を保ち、タグはいちばん新しいものを読みます。一度も報告していない充電コネクターは、0 ではなく空の値として読まれます。 Float か Double
Status 最後の StatusNotification が伝えた充電コネクターの状態の文字列(たとえば AvailableChargingFaulted)。 String

どちらの接尾辞も持たない名前は、検証が拒否します。Connector1MeterConnector1Status のように名前を付けてください。

項目 意味 受け付ける値 既定
充電コネクター このタグが読む、充電ポイントの充電コネクターの番号。 1 以上 1
データ型 値を公開するときの OPC UA の型。 Int32、Float、Double、String Float

OCPP のタグは読み取り専用です。アクセスの項目に書き込める選択肢はなく、書き込みは装われるのではなく拒否されます。充電ポイントに指令を出すのは、次に述べるそれ自身のコマンドであって、タグに書いた値ではありません。

コマンド

充電ポイントは、読むだけでなく指令も出します。OCPP の機器はそれぞれ、下のコマンドを、このステーション自身の OPC UA のアドレス空間で機器のメソッドとして持ちます。ですから、メソッドを呼べるものなら何からでも出せます。OPC UA のクライアントでも、それを呼ぶ Logic のアクションでもかまいません。

どのコマンドも、最初の引数として充電ポイントの ID を取り、その充電ポイント自身の答えを結果として返します。

コマンド ほかの引数 何をするか
ChangeAvailability ConnectorId、Type(OperativeInoperative 充電コネクターを使える状態にする、あるいは外します。
ChangeConfiguration Key、Value 充電ポイントの構成のキーを 1 つ設定します(OCPP 1.6)。
ClearCache なし 充電ポイントの認可のキャッシュを消します。
GetConfiguration Key 構成のキーを 1 つ読みます(OCPP 1.6)。
RemoteStartTransaction IdTag あるトークンのための充電を始めます。
RemoteStopTransaction TransactionId 走っている充電を止めます。
GetTransactionStatus TransactionId そのトランザクションがまだ走っているかを尋ねます(OCPP 2.x)。
Reset なし 充電ポイントを再起動します。
UnlockConnector ConnectorId 充電コネクターからケーブルを解放します。
SetChargingProfile ConnectorId、Limit、NumberOfPhases 充電の電力の上限を設定します。
SetVariables ComponentName、VariableName、AttributeType、AttributeValue あるコンポーネントの変数を 1 つ設定します(OCPP 2.x)。
GetVariables ComponentName、VariableName、AttributeType あるコンポーネントの変数を 1 つ読みます(OCPP 2.x)。

AttributeTypeActualTargetMinSetMaxSet のいずれかです。

答えを待つこと。コマンドは、ステーションが送った時点では終わっていません。ステーションは、送ったまさにその指令に充電ポイントが答えるまで呼び出しを開いたままにし、それを一緒に運ばれる対応付けの識別子で突き合わせ、そのときはじめて成功を伝え、答えを返します。それ以外の終わり方は 3 つで、どれも理由を添えた失敗として伝えられます。

  • 充電ポイントがつながっていない、あるいはその接続が開いていない。何も送られません。
  • 充電ポイントが OCPP のエラーで答えた。たとえば、実装していないコマンドです。そのエラーコードが理由になります。
  • 答えがまったくないまま 30 秒が過ぎた。誰も答えなかったコマンドは失敗であって、決して成功ではありません。

機器が持っていない充電ポイントや、つながっていない充電ポイントに対して出したコマンドは、待ち行列に入るのではなく、その場で拒否されます。

機器検出

OCPP のドライバーの機器検出は、セントラルシステムに今つながっている充電ポイントを並べ、候補のチャネルを読むと、その充電ポイントがこれまでに報告した充電コネクター 1 つにつき MeterStatus のタグを 1 つずつ提案します。

最初の充電ポイントは必ず手で設定します。セントラルシステムが待ち受ける前は何もつなげませんし、待ち受けるのはここに OCPP の機器ができてからです。ですから、充電ポイントを 1 つも設定していない設備をスキャンしても何も見つからず、そう伝えます。その最初の機器は、充電器がつないでくるときの ID で追加してください。そのあとは、つないできた充電器を機器検出で見つけられます。機器検出の全体の流れは Connector のページにあります。

ID は、証明書でも、接続のパスでも、機器との突き合わせでも、大文字と小文字を問わずに照合します。CP-A を名乗る証明書を持って cp-a としてつないでくる充電器は、識別子が CP-A と書かれた機器と同じ充電ポイントです。