FastAPI を使ってモバイルアプリと OCPP EV 充電システムを連携する方法
電気自動車(EV)の普及に伴い、ユーザーはモバイルアプリから充電ステーションをリアルタイムで操作・監視することを求めています。そのためには、リアルタイム通信・高性能・拡張性のあるバックエンドが不可欠です。
そこで登場するのが FastAPI。Python 製の軽量で高速なフレームワークで、OCPP による EV 充電インフラとモバイルアプリをつなぐ理想的なソリューションです。
⚡ FastAPI とは?
FastAPI は、Python 3.7+ 向けの次世代 API フレームワークで、以下をベースに構築されています:
- Starlette:Web サーバー/WebSocket の基盤
- Pydantic:データ検証と型チェック
- Uvicorn:超高速 ASGI サーバー
🚀 なぜ FastAPI が EV システムに最適なのか?
- ✅ 非同期(async)対応:同時に多数の充電器と通信可能
- ✅ WebSocket サポート:OCPP 1.6 に最適
- ✅ 自動 API ドキュメント:Swagger / ReDoc 対応
- ✅ 型安全でシンプルな構文:保守性・拡張性が高い
- ✅ 高速処理:Node.js や Go に匹敵するパフォーマンス
✅ FastAPI vs Flask
| 特徴 | Flask | FastAPI |
|---|---|---|
| 非同期(async) | ⚠️ 限定的対応 | ✅ 完全対応 |
| WebSocket 対応 | ❌ 外部ライブラリ必須 | ✅ 標準搭載 |
| 型安全・データ検証 | ❌ 手動で実装 | ✅ Pydantic による自動化 |
| OpenAPI ドキュメント生成 | ❌ 拡張が必要 | ✅ 自動生成 |
| パフォーマンス(サーバー) | 🐢 WSGI(同期) | ⚡ ASGI(非同期) |
🚦 今回構築するシステム
- ✅ OCPP 1.6 に対応した WebSocket サーバー
- ✅ モバイルアプリ用の REST API
- ✅ アプリから充電ステーションをリモートで起動
⚙️ システム構成図
graph TD
Charger["EV 充電器 (OCPP 1.6)"] -->|WebSocket| FastAPI_WS["FastAPI WebSocket"]
FastAPI_REST["FastAPI REST API (モバイルアプリ)"] -->|API 呼び出し| Dispatcher
Mobile["モバイルアプリ (Flutter / React Native)"] -->|HTTP| FastAPI_REST
Dispatcher --> FastAPI_WS
📁 プロジェクト構成
ev-system/
├── main.py # FastAPI メインアプリ
├── charge_point.py # OCPP クライアントロジック
├── dispatcher.py # RemoteStartTransaction 呼び出し
├── registry.py # 充電器管理
└── requirements.txt
🔧 Step 1: 必要パッケージのインストール
pip install fastapi uvicorn ocpp
🧠 Step 2: charge_point.py
from ocpp.v16 import ChargePoint as CP
from ocpp.v16.enums import RegistrationStatus
from ocpp.v16 import call_result
from ocpp.routing import on
class ChargePoint(CP):
@on('BootNotification')
async def on_boot_notification(self, charge_point_model, charge_point_vendor, **kwargs):
return call_result.BootNotificationPayload(
current_time="2025-06-08T00:00:00Z",
interval=10,
status=RegistrationStatus.accepted
)
🔌 Step 3: 接続管理 registry.py
class ConnectionRegistry:
def __init__(self):
self._registry = {}
def add(self, cp_id, cp):
self._registry[cp_id] = cp
def get(self, cp_id):
return self._registry.get(cp_id)
def remove(self, cp_id):
self._registry.pop(cp_id, None)
registry = ConnectionRegistry()
⚡ Step 4: リモート起動ロジック dispatcher.py
from ocpp.v16 import call
async def send_remote_start(cp, id_tag="MOBILE_USER"):
request = call.RemoteStartTransaction(
id_tag=id_tag,
connector_id=1
)
response = await cp.call(request)
return response.status
🚀 Step 5: アプリ本体 main.py
from fastapi import FastAPI, WebSocket, WebSocketDisconnect, HTTPException
from charge_point import ChargePoint
from dispatcher import send_remote_start
from registry import registry
app = FastAPI()
@app.websocket("/ws/{cp_id}")
async def websocket_handler(websocket: WebSocket, cp_id: str):
await websocket.accept(subprotocol="ocpp1.6")
cp = ChargePoint(cp_id, websocket)
registry.add(cp_id, cp)
try:
await cp.start()
except WebSocketDisconnect:
registry.remove(cp_id)
@app.post("/api/remote-start/{cp_id}")
async def remote_start(cp_id: str):
cp = registry.get(cp_id)
if not cp:
raise HTTPException(404, "充電器が接続されていません")
status = await send_remote_start(cp)
return {"status": status}
📲 Step 6: API テスト例
POST /api/remote-start/CP001
Content-Type: application/json
{}
/ws/CP001 に接続している OCPP 充電器に RemoteStartTransaction が送信されます。
🔐 実運用での対策
- ✅ JWT 認証の導入
- ✅ Redis / MongoDB で接続管理
- ✅ Rate Limiting の実装
- ✅ HTTPS を使った通信保護
🎯 このシステムでできること
- モバイルアプリから充電開始/停止
- 接続中の充電器ステータスの表示
- ファームウェアの更新
- 複数台の EV 充電器を一括管理
💬 まとめ
FastAPI を使うことで、EV 充電システムとモバイルアプリを簡単・高速・安全に接続できます。
- WebSocket + REST API を 1 つのアプリで提供
- ドキュメント生成も自動
- スケーラブルで将来性のある設計
📦 次は何を作りたいですか?
- Docker + Redis + MongoDB の構成?
- Flutter クライアントアプリ?
- 管理者向けダッシュボード?
ご要望があればぜひ教えてください。未来の EV プラットフォームを一緒に作りましょう ⚡
Get in Touch with us
Related Posts
- 古典的プログラミング思考 ― Kernighan & Pike から学び続けること
- コードを書く前に:私たちが必ずお客様にお聞きする5つの質問
- なぜ利益を生むシステムでも「本当の価値」を持たないことがあるのか
- 彼女の世界(Her World)
- Temporal × ローカルLLM × Robot Framework 日本企業向け「止まらない・壊れない」業務自動化アーキテクチャ
- RPA × AI: なぜ「自動化」は知能なしでは破綻し、 知能は制御なしでは信頼されないのか
- 国境紛争・代理戦争をどうシミュレーションするか
- 検索とアクセスを最初に改善する 大学図書館の戦略的価値を最短で回復する方法
- 工場とリサイクル事業者をつなぐ、新しいスクラップ取引プラットフォームを開発しています
- Python で MES(製造実行システム)を開発する方法 ― 日本の製造現場に適した実践ガイド ―
- MES・ERP・SCADA の違いとは? ― 製造業における役割と境界を分かりやすく解説
- なぜソフトウェア開発の学習はこんなにも「つらい」のか ― そして、その解決方法
- 企業はどちらを選ぶのか:GPT型AIか、Gemini型AIか
- GPT-5.2 が GPT-5.1 より真価を発揮する実務ユースケース
- ChatGPT 5.2 と 5.1 の違い ― たとえ話でわかりやすく解説
- なぜ成長する企業は 既製ソフトウェアでは限界を迎えるのか ― 成功している企業が選ぶ次の一手 ―
- コンピュータビジョンのエッジ化と低リソース環境:日本企業における課題と新たな機会*
- Simplico — 企業向けAIオートメーション & カスタムソフトウェア開発(日本市場向け)
- AIによる予知保全 ― センサーから予測モデルまでの全体像
- 会計業務におけるAIアシスタント ― できること・できないこと













