Спецификация для разработчиков EV зарядных станций
Спецификация для разработчиков EV зарядных станций
1. Обзор системы
1.1 Общая архитектура
graph TB
subgraph "Backend Infrastructure"
CSMS[Central System Management Service]
API[REST API Gateway]
DB[(Database)]
end
subgraph "EV Charging Station (Ваша зона ответственности)"
CP[Charge Point Controller]
MODEM[4G Modem]
BATTERY[Battery Management]
CONNECTOR[Charging Connector]
METER[Energy Meter]
RFID[RFID Reader]
DISPLAY[Display/UI]
GPS[GPS Module]
end
subgraph "External"
USER[End User]
VEHICLE[Electric Vehicle]
end
CSMS <--> MODEM
MODEM <--> CP
CP --> BATTERY
CP --> CONNECTOR
CP --> METER
CP --> RFID
CP --> DISPLAY
CP --> GPS
USER --> RFID
USER --> DISPLAY
VEHICLE <--> CONNECTOR
1.2 Протокол коммуникации
Протокол: OCPP 2.0.1 (Open Charge Point Protocol)
Транспорт: WebSocket Secure (WSS) over 4G
Формат данных: JSON
Аутентификация: API Key в заголовке Authorization
2. Зона ответственности разработчиков станции
2.1 Основные задачи
mindmap
root((EV Station Tasks))
OCPP Client
WebSocket Connection
Message Handling
Error Recovery
Hardware Integration
Connector Control
Meter Reading
Battery Monitoring
RFID Processing
State Management
Station Status
Transaction Lifecycle
Error States
Local Features
Offline Mode
Local Authorization
Display Management
Monitoring
Self Diagnostics
Event Logging
Telemetry Collection
2.2 Архитектура ПО станции
flowchart TD
subgraph "Application Layer"
OCPP[OCPP Client]
SM[State Machine]
AUTH[Authorization Manager]
end
subgraph "Business Logic"
TXN[Transaction Manager]
METER_MGR[Meter Manager]
EVENT[Event Manager]
CONFIG[Configuration Manager]
end
subgraph "Hardware Abstraction Layer"
CONN_HAL[Connector HAL]
METER_HAL[Meter HAL]
BATTERY_HAL[Battery HAL]
COMM_HAL[Communication HAL]
RFID_HAL[RFID HAL]
end
subgraph "Hardware"
HW[Physical Components]
end
OCPP <--> SM
OCPP <--> TXN
SM <--> AUTH
TXN <--> METER_MGR
TXN <--> EVENT
METER_MGR <--> METER_HAL
CONN_HAL <--> HW
METER_HAL <--> HW
BATTERY_HAL <--> HW
COMM_HAL <--> HW
RFID_HAL <--> HW
3. OCPP Client Implementation
3.1 Установка соединения
sequenceDiagram
participant CP as Charge Point
participant CSMS as Backend CSMS
Note over CP: Power On / Network Available
CP->>CSMS: WebSocket Connection Request<br/>wss://csms.server.com/ocpp/{stationId}
Note over CP: Headers: Authorization: Bearer {apiKey}
CSMS->>CP: WebSocket Connection Accepted
CP->>CSMS: BootNotification
Note over CP: {<br/>"reason": "PowerUp",<br/>"chargingStation": {<br/>"model": "YourModel",<br/>"vendorName": "YourVendor",<br/>"firmwareVersion": "1.0.0"<br/>}<br/>}
CSMS->>CP: BootNotification Response
Note over CSMS: {<br/>"status": "Accepted",<br/>"interval": 300,<br/>"currentTime": "2025-07-12T10:00:00Z"<br/>}
CP->>CSMS: StatusNotification
Note over CP: Connector Status: "Available"
loop Heartbeat Every 300s
CP->>CSMS: Heartbeat
CSMS->>CP: Heartbeat Response
end
3.2 Аутентификация
WebSocket Headers:
Authorization: Bearer your-api-key-here
Sec-WebSocket-Protocol: ocpp2.0.1
Reconnection Strategy:
flowchart TD
DISCONNECT[Connection Lost] --> WAIT[Wait Period]
WAIT --> RETRY[Retry Connection]
RETRY --> SUCCESS{Connected?}
SUCCESS -->|Yes| BOOT[Send BootNotification]
SUCCESS -->|No| BACKOFF[Increase Wait Period]
BACKOFF --> WAIT
BOOT --> OPERATIONAL[Operational State]
4. Состояния зарядной станции
4.1 Основная диаграмма состояний
stateDiagram-v2
[*] --> PowerOn
PowerOn --> Connecting: Network Available
Connecting --> Available: CSMS Connected
Connecting --> Offline: Connection Failed
Available --> Preparing: Cable Connected
Available --> Reserved: RemoteStartTransaction
Available --> Unavailable: SetChargingProfile(Unavailable)
Preparing --> Charging: RFID Authorized
Preparing --> Available: Authorization Failed
Preparing --> Available: Cable Disconnected
Reserved --> Preparing: Cable Connected
Reserved --> Available: Reservation Expired
Charging --> SuspendedEVSE: Station Error
Charging --> SuspendedEV: Vehicle Error
Charging --> Finishing: Stop Requested
SuspendedEVSE --> Charging: Error Cleared
SuspendedEV --> Charging: Vehicle Ready
SuspendedEVSE --> Faulted: Critical Error
Finishing --> Available: Transaction Complete
Faulted --> Available: Fault Cleared
Faulted --> Unavailable: Manual Reset Required
Offline --> Connecting: Retry Connection
Unavailable --> Available: Reset Command
4.2 Обработка событий в каждом состоянии
flowchart TD
subgraph "Available State"
A1[Cable Connected] --> A2[Send StatusNotification: Preparing]
A3[RemoteStartTransaction] --> A4[Send StatusNotification: Reserved]
A5[RFID Scan] --> A6[Local Authorization Check]
end
subgraph "Charging State"
C1[Meter Reading Timer] --> C2[Send MeterValues]
C3[Vehicle Disconnected] --> C4[Send TransactionEvent: Ended]
C5[Error Detected] --> C6[Send StatusNotification: SuspendedEVSE]
end
subgraph "Error Handling"
E1[Hardware Error] --> E2[Log Error Locally]
E2 --> E3[Send NotifyEvent]
E3 --> E4[Update State to Faulted]
end
5. Обязательные OCPP сообщения от станции
5.1 Инициализация и статус
BootNotification (при старте)
{
"reason": "PowerUp",
"chargingStation": {
"model": "EV-CHARGER-V1",
"vendorName": "YourCompany",
"firmwareVersion": "1.2.3",
"serialNumber": "SN123456789"
}
}
StatusNotification (при изменении состояния)
{
"timestamp": "2025-07-12T10:30:00Z",
"connectorStatus": "Available",
"evseId": 1,
"connectorId": 1
}
Heartbeat (периодически)
{
"currentTime": "2025-07-12T10:30:00Z"
}
5.2 События транзакций
TransactionEvent (начало зарядки)
{
"eventType": "Started",
"timestamp": "2025-07-12T10:30:00Z",
"triggerReason": "Authorized",
"seqNo": 0,
"transactionInfo": {
"transactionId": "TXN_" + generateUniqueId(),
"chargingState": "Charging"
},
"evse": {
"id": 1,
"connectorId": 1
},
"idToken": {
"idToken": "RFID_12345",
"type": "ISO14443"
},
"meterValue": [
{
"timestamp": "2025-07-12T10:30:00Z",
"sampledValue": [
{
"value": "0.0",
"measurand": "Energy.Active.Import.Register",
"unit": "kWh"
}
]
}
]
}
MeterValues (во время зарядки каждые 60 сек)
{
"evseId": 1,
"meterValue": [
{
"timestamp": "2025-07-12T10:31:00Z",
"sampledValue": [
{
"value": "7.2",
"measurand": "Power.Active.Import",
"unit": "kW"
},
{
"value": "1.2",
"measurand": "Energy.Active.Import.Register",
"unit": "kWh"
},
{
"value": "230.5",
"measurand": "Voltage",
"unit": "V"
},
{
"value": "31.2",
"measurand": "Current.Import",
"unit": "A"
}
]
}
]
}
5.3 События системы
NotifyEvent (ошибки и важные события)
{
"generatedAt": "2025-07-12T10:35:00Z",
"eventData": [
{
"eventId": 1,
"timestamp": "2025-07-12T10:35:00Z",
"trigger": "Alerting",
"eventType": "FaultDetected",
"component": {
"name": "ChargingStation"
},
"variable": {
"name": "ConnectorLockFailure"
},
"eventNotificationType": "Alert"
}
]
}
6. Обработка команд от CSMS
6.1 Команды управления
RemoteStartTransaction
sequenceDiagram
participant CSMS
participant CP as Charge Point
participant USER as User
CSMS->>CP: RemoteStartTransaction
Note over CSMS: {<br/>"idToken": {"idToken": "RFID_123", "type": "ISO14443"},<br/>"evseId": 1<br/>}
CP->>CP: Check EVSE Availability
alt EVSE Available
CP->>CSMS: RemoteStartTransaction Response (Accepted)
CP->>CSMS: StatusNotification (Reserved)
USER->>CP: Connect Cable
CP->>CSMS: StatusNotification (Preparing)
CP->>CSMS: TransactionEvent (Started)
else EVSE Occupied/Faulted
CP->>CSMS: RemoteStartTransaction Response (Rejected)
end
RemoteStopTransaction
sequenceDiagram
participant CSMS
participant CP as Charge Point
CSMS->>CP: RemoteStopTransaction
Note over CSMS: {"transactionId": "TXN_123456"}
CP->>CP: Find Active Transaction
alt Transaction Found
CP->>CSMS: RemoteStopTransaction Response (Accepted)
CP->>CP: Stop Power Delivery
CP->>CSMS: TransactionEvent (Ended)
CP->>CSMS: StatusNotification (Available)
else Transaction Not Found
CP->>CSMS: RemoteStopTransaction Response (Rejected)
end
6.2 Команды мониторинга
GetReport (запрос данных)
Запрос от CSMS:
{
"requestId": 1,
"componentVariable": [
{
"component": {"name": "BatteryManagement"},
"variable": {"name": "StateOfCharge"}
}
]
}
Ваш ответ:
{
"status": "Accepted",
"statusInfo": {
"reasonCode": "NoError"
}
}
Затем отправить NotifyReport:
{
"requestId": 1,
"generatedAt": "2025-07-12T10:30:00Z",
"reportData": [
{
"component": {"name": "BatteryManagement"},
"variable": {"name": "StateOfCharge"},
"variableAttribute": {
"value": "85",
"unit": "Percent"
}
}
]
}
7. Мониторинг компонентов станции
7.1 Компоненты для мониторинга
graph TD
subgraph "Station Components"
BATTERY[Battery Management]
CONNECTOR[Charging Connector]
METER[Energy Meter]
TEMP[Temperature Sensors]
RFID[RFID Reader]
NETWORK[Network Module]
end
subgraph "Monitored Variables"
BATTERY --> B1[StateOfCharge]
BATTERY --> B2[BatteryVoltage]
BATTERY --> B3[BatteryTemperature]
CONNECTOR --> C1[ConnectorStatus]
CONNECTOR --> C2[LockStatus]
METER --> M1[Energy.Active.Import.Register]
METER --> M2[Power.Active.Import]
METER --> M3[Voltage]
METER --> M4[Current.Import]
TEMP --> T1[InletTemperature]
TEMP --> T2[OutletTemperature]
RFID --> R1[ReaderStatus]
NETWORK --> N1[SignalStrength]
NETWORK --> N2[NetworkStatus]
end
7.2 Периодическая отправка данных
MeterValues каждые 60 секунд во время зарядки:
flowchart TD
START[Transaction Started] --> TIMER[Start 60s Timer]
TIMER --> READ[Read All Meters]
READ --> SEND[Send MeterValues]
SEND --> CHECK{Transaction Active?}
CHECK -->|Yes| TIMER
CHECK -->|No| END[Stop Reporting]
8. Локальная авторизация (Offline Mode)
8.1 Кэш авторизации
flowchart TD
RFID[RFID Scanned] --> CACHE{In Local Cache?}
CACHE -->|Yes| AUTH[Authorize Locally]
CACHE -->|No| ONLINE{CSMS Online?}
ONLINE -->|Yes| REMOTE[Request Remote Auth]
ONLINE -->|No| REJECT[Reject Authorization]
REMOTE --> RESPONSE{Authorized?}
RESPONSE -->|Yes| CACHE_ADD[Add to Local Cache]
RESPONSE -->|No| REJECT
CACHE_ADD --> AUTH
AUTH --> START[Start Transaction]
8.2 Управление кэшем
Структура записи в кэше:
{
"idToken": "RFID_12345",
"type": "ISO14443",
"status": "Accepted",
"expiryDate": "2025-12-31T23:59:59Z",
"groupIdToken": "GROUP_001"
}
9. Обработка ошибок и диагностика
9.1 Типы ошибок и реакция
flowchart TD
ERROR[Error Detected] --> TYPE{Error Type}
TYPE -->|Communication| COMM[Connection Lost]
TYPE -->|Hardware| HW[Hardware Fault]
TYPE -->|Software| SW[Software Error]
COMM --> RECONNECT[Start Reconnection]
COMM --> OFFLINE[Switch to Offline Mode]
HW --> DIAG[Run Diagnostics]
HW --> NOTIFY[Send NotifyEvent]
HW --> FAULT[Set Status to Faulted]
SW --> LOG[Log Error Details]
SW --> RESTART[Restart Component]
SW --> NOTIFY
RECONNECT --> ONLINE{Connected?}
ONLINE -->|Yes| SYNC[Sync Offline Data]
ONLINE -->|No| OFFLINE
9.2 Self-Diagnostics
Периодические проверки каждые 5 минут:
flowchart TD
START[Diagnostic Timer] --> BATTERY[Check Battery Status]
BATTERY --> CONNECTOR[Check Connector Status]
CONNECTOR --> METER[Check Meter Communication]
METER --> TEMP[Check Temperature Sensors]
TEMP --> NETWORK[Check Network Signal]
NETWORK --> RFID[Check RFID Reader]
RFID --> RESULT{All OK?}
RESULT -->|Yes| SCHEDULE[Schedule Next Check]
RESULT -->|No| ALERT[Send Alert to CSMS]
ALERT --> SCHEDULE
SCHEDULE --> START
10. Схема данных для локального хранения
10.1 Структура данных
erDiagram
TRANSACTIONS {
string transaction_id PK
datetime start_time
datetime end_time
string rfid_token
float start_energy
float end_energy
string status
json meter_values
}
AUTH_CACHE {
string rfid_token PK
string status
datetime expiry_date
string group_id
}
ERROR_LOG {
int id PK
datetime timestamp
string error_type
string component
string description
string status
}
CONFIG {
string key PK
string value
datetime updated_at
}
11. Примеры реализации ключевых функций
11.1 OCPP Message Handler
// Псевдокод для обработки входящих сообщений
function handleOCPPMessage(messageType, messageId, payload) {
switch(messageType) {
case 'RemoteStartTransaction':
return handleRemoteStart(payload);
case 'RemoteStopTransaction':
return handleRemoteStop(payload);
case 'GetReport':
return handleGetReport(payload);
case 'Reset':
return handleReset(payload);
default:
return {
status: 'NotSupported',
statusInfo: {
reasonCode: 'MessageNotSupported'
}
};
}
}
11.2 State Machine Implementation
// Псевдокод для state machine
class ChargingStationStateMachine {
constructor() {
this.currentState = 'Available';
this.allowedTransitions = {
'Available': ['Preparing', 'Reserved', 'Unavailable'],
'Preparing': ['Available', 'Charging'],
'Charging': ['Finishing', 'SuspendedEVSE', 'SuspendedEV'],
'Finishing': ['Available']
};
}
transitionTo(newState, reason) {
if (this.allowedTransitions[this.currentState].includes(newState)) {
this.currentState = newState;
this.sendStatusNotification(newState, reason);
return true;
}
return false;
}
}
Данная спецификация предназначена для разработчиков ПО зарядных станций и содержит все необходимые требования для реализации OCPP 2.0.1 клиента.