Спецификация OCPP модуля для зарядных станций
1. Обзор задачи
1.1 Архитектура взаимодействия
graph TB
subgraph "Backend Infrastructure"
CSMS[Central System Management Service]
end
subgraph "EV Charging Station"
subgraph "Ваша зона ответственности"
OCPP[OCPP Communication Module]
WS[WebSocket Client]
PARSER[Message Parser/Generator]
QUEUE[Message Queue]
end
subgraph "Station System (существующее)"
STATION[Station Controller]
HARDWARE[Hardware Controllers]
end
end
CSMS <--> WS
WS <--> OCPP
OCPP <--> PARSER
OCPP <--> QUEUE
OCPP <--> STATION
STATION <--> HARDWARE
1.2 Задача модуля
Основная функция: Обеспечить двустороннюю связь между мобильной зарядной станцией и CSMS по протоколу OCPP 2.0.1
Контекст использования: Мобильные зарядные станции, которые техник привозит к клиенту или на базу для подзарядки. Управление зарядкой через пульт станции или мобильное приложение CSMS.
Интерфейсы:
- Внешний: WebSocket соединение с CSMS
- Внутренний: API для интеграции с системой станции
1.3 Таблица методов OCPP модуля
Методы для реализации на стороне станции
| Метод | Описание | Когда вызывается |
|---|---|---|
initialize(config) |
Инициализация модуля с конфигурацией | При запуске системы |
connect() |
Установка соединения с CSMS | После инициализации |
disconnect() |
Разрыв соединения с CSMS | При выключении/обслуживании |
sendStationEvent(event) |
Отправка события от станции | При изменении состояния станции |
sendMeterData(data) |
Отправка показаний счетчиков | Каждые 10 сек во время зарядки |
sendStatusUpdate(status) |
Отправка обновления статуса | При смене состояния станции |
handleStartCharging(params) |
Обработка команды начала зарядки | По команде от CSMS |
handleStopCharging(transactionId) |
Обработка команды остановки зарядки | По команде от CSMS |
handleDataRequest(requestType) |
Обработка запроса данных | По команде от CSMS |
getStationStatus() |
Получение текущего статуса станции | По запросу от CSMS |
getBatteryData() |
Получение данных о батарее станции | По запросу от CSMS |
getLocationData() |
Получение GPS координат станции | По запросу от CSMS |
Методы для реализации на стороне CSMS
| Метод | Описание | Когда вызывается |
|---|---|---|
handleBootNotification(stationData) |
Обработка уведомления о запуске станции | При подключении станции |
handleStatusNotification(status) |
Обработка уведомления о статусе | При изменении статуса станции |
handleTransactionEvent(event) |
Обработка событий транзакции | При начале/окончании зарядки |
handleMeterValues(values) |
Обработка показаний счетчиков | Каждые 10 сек во время зарядки |
handleNotifyEvent(event) |
Обработка уведомлений об ошибках | При возникновении ошибок |
sendRemoteStart(stationId, params) |
Отправка команды удаленного старта | По запросу пользователя |
sendRemoteStop(transactionId) |
Отправка команды удаленной остановки | По запросу пользователя |
requestStationData(stationId, dataType) |
Запрос данных станции | По запросу пользователя |
updateStationConfig(stationId, config) |
Обновление конфигурации станции | При изменении настроек |
2. Состояния мобильной зарядной станции
2.1 Основные состояния станции
stateDiagram-v2
[*] --> Standby
Standby --> CustomerCharging: Техник начал зарядку клиента
Standby --> StationCharging: Техник начал зарядку станции
CustomerCharging --> Standby: Зарядка клиента завершена
StationCharging --> Standby: Зарядка станции завершена
note right of Standby
Станция включена
Зарядка не происходит
Готова к работе
end note
note right of CustomerCharging
Идёт зарядка автомобиля клиента
Данные каждые 10 секунд
end note
note right of StationCharging
Идёт зарядка самой станции
Данные каждые 10 секунд
end note
2.2 Данные по состояниям
2.2.1 Состояние "Standby" (Станция включена, зарядка не происходит)
Данные для отправки в CSMS:
{
"stationStatus": "Available",
"batteryLevel": 75,
"batteryVoltage": 48.2,
"batteryTemperature": 25.5,
"location": {
"latitude": 55.7558,
"longitude": 37.6176,
"accuracy": 10
},
"signalStrength": -65,
"internalTemperature": 22.0,
"outputVoltage": 0.0,
"outputCurrent": 0.0,
"outputPower": 0.0,
"connectorStatus": "Available",
"errorCodes": [],
"lastMaintenanceDate": "2025-07-10T09:00:00Z"
}
Периодичность отправки: При изменении состояния + по запросу от CSMS
2.2.2 Состояние "CustomerCharging" (Идёт зарядка автомобиля клиента)
Данные для отправки в CSMS каждые 10 секунд:
{
"stationStatus": "Charging",
"transactionId": "TXN_123456",
"transactionType": "customer_charging",
"chargingStartTime": "2025-07-12T10:30:00Z",
"chargingDuration": 1800,
"energyDelivered": 5.2,
"currentPower": 7200,
"outputVoltage": 230.5,
"outputCurrent": 31.2,
"vehicleBatteryLevel": 65,
"estimatedTimeToComplete": 2400,
"batteryLevel": 68,
"batteryVoltage": 47.8,
"batteryTemperature": 28.0,
"location": {
"latitude": 55.7558,
"longitude": 37.6176,
"accuracy": 10
},
"signalStrength": -68,
"internalTemperature": 32.0,
"connectorStatus": "Occupied",
"connectorTemperature": 35.0,
"errorCodes": [],
"chargingEfficiency": 92.5
}
Периодичность отправки: Каждые 10 секунд во время зарядки
2.2.3 Состояние "StationCharging" (Идёт зарядка самой станции)
Данные для отправки в CSMS каждые 10 секунд:
{
"stationStatus": "SelfCharging",
"transactionId": "TXN_SELF_789",
"transactionType": "station_charging",
"chargingStartTime": "2025-07-12T14:00:00Z",
"chargingDuration": 3600,
"energyReceived": 15.8,
"inputPower": 5000,
"inputVoltage": 220.0,
"inputCurrent": 22.7,
"batteryLevel": 85,
"batteryVoltage": 49.2,
"batteryTemperature": 30.0,
"estimatedTimeToComplete": 1800,
"location": {
"latitude": 55.7520,
"longitude": 37.6140,
"accuracy": 5
},
"signalStrength": -72,
"internalTemperature": 28.0,
"connectorStatus": "SelfCharging",
"chargingSource": "grid",
"errorCodes": [],
"chargingEfficiency": 94.2
}
Периодичность отправки: Каждые 10 секунд во время зарядки
3. Интерфейс OCPP модуля
2.1 API для интеграции с системой станции
flowchart LR
subgraph "Station System"
CONTROLLER[Station Controller]
end
subgraph "OCPP Module API"
direction TB
IN[Incoming Events]
OUT[Outgoing Commands]
STATUS[Status Queries]
CONFIG[Configuration]
end
subgraph "CSMS"
BACKEND[Backend Server]
end
CONTROLLER -->|Events| IN
OUT -->|Commands| CONTROLLER
CONTROLLER -->|Query| STATUS
CONTROLLER -->|Setup| CONFIG
IN -.->|OCPP Messages| BACKEND
BACKEND -.->|OCPP Messages| OUT
2.2 Входящие события от станции
{
"eventType": "station_event",
"events": [
{
"type": "cable_connected",
"evseId": 1,
"connectorId": 1,
"timestamp": "2025-07-12T10:30:00Z"
},
{
"type": "rfid_scanned",
"rfidToken": "RFID_12345",
"evseId": 1,
"timestamp": "2025-07-12T10:30:00Z"
},
{
"type": "charging_started",
"transactionId": "TXN_123",
"evseId": 1,
"connectorId": 1,
"timestamp": "2025-07-12T10:30:00Z"
},
{
"type": "meter_reading",
"evseId": 1,
"readings": {
"energy": 5.2,
"power": 7.2,
"voltage": 230.5,
"current": 31.2
},
"timestamp": "2025-07-12T10:31:00Z"
},
{
"type": "charging_stopped",
"transactionId": "TXN_123",
"reason": "user_stopped",
"finalEnergy": 8.5,
"timestamp": "2025-07-12T10:45:00Z"
},
{
"type": "error_detected",
"errorCode": "connector_lock_failure",
"severity": "alert",
"component": "charging_connector",
"timestamp": "2025-07-12T10:35:00Z"
},
{
"type": "status_changed",
"evseId": 1,
"connectorId": 1,
"newStatus": "available",
"timestamp": "2025-07-12T10:30:00Z"
}
]
}
2.3 Исходящие команды к станции
{
"commandType": "csms_command",
"commands": [
{
"type": "authorize_user",
"rfidToken": "RFID_12345",
"authStatus": "accepted",
"expiryDate": "2025-12-31T23:59:59Z"
},
{
"type": "start_charging",
"evseId": 1,
"rfidToken": "RFID_12345",
"chargingProfile": {
"maxPower": 7200,
"phases": 1
}
},
{
"type": "stop_charging",
"transactionId": "TXN_123",
"reason": "remote_stop"
},
{
"type": "request_data",
"dataType": "battery_status",
"requestId": "REQ_001"
},
{
"type": "update_configuration",
"parameters": {
"heartbeatInterval": 300,
"meterValueSampleInterval": 60
}
},
{
"type": "reset_station",
"resetType": "soft"
}
]
}
3. OCPP Communication Flow
3.1 Установка соединения
sequenceDiagram
participant Station as Station System
participant OCPP as OCPP Module
participant CSMS as CSMS Server
Station->>OCPP: Initialize Connection
Note over OCPP: Config: server URL, API key, station ID
OCPP->>CSMS: WebSocket Connect
Note over OCPP,CSMS: wss://csms.server.com/ocpp/{stationId}<br/>Authorization: Bearer {apiKey}
CSMS->>OCPP: Connection Accepted
OCPP->>CSMS: BootNotification
Note over OCPP: Station info, firmware version
CSMS->>OCPP: BootNotification Response
Note over CSMS: Status: Accepted, Heartbeat interval
OCPP->>Station: Connection Established
loop Heartbeat
OCPP->>CSMS: Heartbeat (every interval)
CSMS->>OCPP: Heartbeat Response
end
3.4.2 Обработка событий по состояниям станции
4.2.1 Состояние "Standby" (Станция готова к работе)
sequenceDiagram
participant Technician as Техник
participant Station as Station System
participant OCPP as OCPP Module
participant CSMS as CSMS Server
Note over Technician,CSMS: Станция включена, ожидает команд
Station->>OCPP: status_changed event (Available)
OCPP->>CSMS: StatusNotification (Available)
CSMS->>OCPP: StatusNotification Response
Note over Technician,CSMS: Техник подключает кабель к автомобилю клиента
Technician->>Station: Cable connected to customer vehicle
Station->>OCPP: cable_connected event (customer)
OCPP->>CSMS: StatusNotification (Preparing)
CSMS->>OCPP: StatusNotification Response
Note over Technician,CSMS: Техник запускает зарядку через пульт
Technician->>Station: Start customer charging
Station->>OCPP: charging_started event (customer)
OCPP->>CSMS: TransactionEvent (Started, customer_charging)
CSMS->>OCPP: TransactionEvent Response
Note over Technician,CSMS: Альтернатива: запуск через CSMS
CSMS->>OCPP: RemoteStartTransaction
OCPP->>Station: start_charging command
Station->>OCPP: Command accepted
OCPP->>CSMS: RemoteStartTransaction Response (Accepted)
4.2.2 Состояние "CustomerCharging" (Зарядка клиента)
sequenceDiagram
participant Station as Station System
participant OCPP as OCPP Module
participant CSMS as CSMS Server
Note over Station,CSMS: ПользовЗатель порядключила клиентаб активна
loop Каждыель 10 секунд
Station->>OCPP: cable_connectedmeter_reading event (customer data)
OCPP->>CSMS: MeterValues (customer charging data)
Note over OCPP: Включает: energyDelivered, currentPower,<br/>outputVoltage, vehicleBatteryLevel,<br/>batteryLevel станции, location
CSMS->>OCPP: MeterValues Response
end
Note over Station,CSMS: Обработка событий во время зарядки
alt Ошибка зарядки
Station->>OCPP: error_detected event
OCPP->>CSMS: NotifyEvent (Charging error)
OCPP->>CSMS: StatusNotification (Preparing)SuspendedEVSE)
else Зарядка завершена техником
Station->>OCPP: charging_stopped event (user_stopped)
OCPP->>CSMS: TransactionEvent (Ended)
OCPP->>CSMS: StatusNotification (Available)
else Удаленная остановка
CSMS->>OCPP: StatusNotificationRemoteStopTransaction
ResponseOCPP->>Station: Notestop_charging over Station,CSMS: Пользователь приложил RFIDcommand
Station->>OCPP: rfid_scannedcharging_stopped event (remote_stopped)
OCPP->>CSMS: Authorize
CSMS->>OCPP: Authorize ResponseTransactionEvent (Accepted)Ended)
OCPP->>Station:end
authorize_user
4.2.3 Состояние "StationCharging" (Зарядка станции)
sequenceDiagram
participant Technician as Техник
participant Station as Station System
participant OCPP as OCPP Module
participant CSMS as CSMS Server
Note over Station,Technician,CSMS: СТехник подключает станцию к источнику питания
началаTechnician->>Station: зарядкуConnect to charging source
Station->>OCPP: charging_startedstation_charging_started event
OCPP->>CSMS: TransactionEvent (Started)Started, station_charging)
CSMS->>OCPP: TransactionEvent Response
OCPP->>CSMS: StatusNotification (SelfCharging)
Note over Station,CSMS: Периодичцесс зарядкие показстанция счетчика
loop EveryКаждые 6010 secondsсекунд
Station->>OCPP: meter_reading event (station data)
OCPP->>CSMS: MeterValues (station charging data)
Note over OCPP: Включает: energyReceived, inputPower,<br/>batteryLevel, batteryTemperature,<br/>estimatedTimeToComplete, location
CSMS->>OCPP: MeterValues Response
end
Note over Station,CSMS: Завершение зарядки станции
alt Батарея полностью заряжена
Station->>OCPP: station_charging_complete event
OCPP->>CSMS: TransactionEvent (Ended, BatteryFull)
OCPP->>CSMS: StatusNotification (Available)
else Техник остановил зарядку
Technician->>Station: Stop station charging
Station->>OCPP: station_charging_stopped event
OCPP->>CSMS: TransactionEvent (Ended, UserStopped)
OCPP->>CSMS: StatusNotification (Available)
else Ошибка зарядки
Station->>OCPP: error_detected event (charging_fault)
OCPP->>CSMS: NotifyEvent (Station charging error)
OCPP->>CSMS: StatusNotification (Faulted)
end
3.3 Обработка команд от CSMS
sequenceDiagram
participant CSMS as CSMS Server
participant OCPP as OCPP Module
participant Station as Station System
Note over CSMS,Station: Удаленный запуск зарядки
CSMS->>OCPP: RemoteStartTransaction
OCPP->>Station: start_charging command
Station->>OCPP: Command accepted
OCPP->>CSMS: RemoteStartTransaction Response (Accepted)
Note over CSMS,Station: Запрос данных о батарее
CSMS->>OCPP: GetReport (Battery)
OCPP->>Station: request_data command
Station->>OCPP: Data response
OCPP->>CSMS: GetReport Response
OCPP->>CSMS: NotifyReport (Battery data)
4. Детальная спецификация OCPP сообщений
4.1 Исходящие сообщения (Station → CSMS)
BootNotification (при запуске)
{
"reason": "PowerUp",
"chargingStation": {
"model": "получить_от_station_system",
"vendorName": "получить_от_station_system",
"firmwareVersion": "получить_от_station_system",
"serialNumber": "получить_от_station_system"
}
}
StatusNotification (при изменении статуса)
{
"timestamp": "получить_от_station_system",
"connectorStatus": "Available|Preparing|Charging|SuspendedEVSE|SuspendedEV|Finishing|Reserved|Unavailable|Faulted",
"evseId": "получить_от_station_system",
"connectorId": "получить_от_station_system"
}
TransactionEvent (события транзакции)
{
"eventType": "Started|Updated|Ended",
"timestamp": "получить_от_station_system",
"triggerReason": "Authorized|CablePluggedIn|ChargingStateChanged|ChargingRateChanged|ChargingStateChanged|Deauthorized|EnergyLimitReached|EVCommunicationLost|EVConnectTimeout|MeterValueClock|MeterValuePeriodic|TimeLimitReached|Trigger|UnlockCommand|StopAuthorized|EVDeparted|EVDetected|RemoteStop|RemoteStart|AbnormalCondition|SignedDataReceived|ResetCommand"TechnicianStart|TechnicianStop|StationChargingStart|StationChargingComplete",
"seqNo": "incremental_number",
"transactionInfo": {
"transactionId": "получить_от_station_system",
"chargingState": "Charging|EVConnected|SuspendedEV|SuspendedEVSE|Idle",
"chargingType": "customer_charging|station_charging"
},
"evse": {
"id": "получить_от_station_system",
"connectorId": "получить_от_station_system"
},
"idToken"customData": {
"idToken"technicianId": "получить_от_station_system",
"type"customerInfo": "ISO14443|ISO15693|KeyCode|Local|MacAddress|NoAuthorization"получить_от_station_system_если_зарядка_клиента",
"chargingLocation": "получить_от_station_system"
},
"meterValue": [
{
"timestamp": "получить_от_station_system",
"sampledValue": [
{
"value": "получить_от_station_system",
"measurand": "Energy.Active.Import.Register|Power.Active.Import|Voltage|Current.Import|Temperature",
"unit": "kWh|kW|V|A|Celsius"
}
]
}
]
}
MeterValues (телеметрия каждые 10 секунд во время зарядки)
{
"evseId": "получить_от_station_system",
"meterValue": [
{
"timestamp": "получить_от_station_system",
"sampledValue": [
{
"value": "получить_от_station_system",
"measurand": "Energy.Active.Import.Register|Power.Active.Import|Voltage|Current.Import|Temperature",
"unit": "kWh|kW|V|A|Celsius"
}
]
}
]
}
NotifyEvent (ошибки и события)
{
"generatedAt": "текущее_время",
"eventData": [
{
"eventId": "уникальный_id",
"timestamp": "получить_от_station_system",
"trigger": "Alerting|Delta|Periodic",
"eventType": "получить_от_station_system",
"component": {
"name": "получить_от_station_system"
},
"variable": {
"name": "получить_от_station_system"
},
"eventNotificationType": "HardWiredNotification|HardWiredMonitor|PreconfiguredMonitor|CustomMonitor"
}
]
}
Authorize (авторизация)
{
"idToken": {
"idToken": "получить_от_station_system",
"type": "ISO14443|ISO15693|KeyCode|Local|MacAddress|NoAuthorization"
},
"evseId": "получить_от_station_system"
}
4.2 Входящие сообщения (CSMS → Station)
RemoteStartTransaction
Получили от CSMS:
{
"idToken": {
"idToken": "RFID_12345",
"type": "ISO14443"
},
"evseId": 1,
"chargingType": "customer_charging|station_charging",
"chargingProfile": {
"id": 1,
"stackLevel": 0,
"chargingProfilePurpose": "TxProfile",
"chargingProfileKind": "Absolute",
"chargingSchedule": [
{
"id": 1,
"startSchedule": "2025-07-12T10:30:00Z",
"duration": 3600,
"chargingRateUnit": "W",
"chargingSchedulePeriod": [
{
"startPeriod": 0,
"limit": 7200
}
]
}
]
},
"customData": {
"customerInfo": {
"customerId": "CUST_001",
"vehicleType": "Tesla Model 3"
},
"technicianId": "TECH_005",
"estimatedDuration": 3600
}
}
Отправить в station_system:
{
"type": "start_charging"start_customer_charging",
"evseId": 1,
"rfidToken": "RFID_12345",
"maxPower": 7200,
"duration": 36003600,
"customerInfo": {
"customerId": "CUST_001",
"vehicleType": "Tesla Model 3"
},
"technicianId": "TECH_005"
}
Ответ CSMS:
{
"status": "Accepted|Rejected",
"statusInfo": {
"reasonCode": "NoError|Busy|Occupied|Faulted"
}
}
RemoteStopTransaction
Получили от CSMS:
{
"transactionId": "TXN_123456"
}
Отправить в station_system:
{
"type": "stop_charging",
"transactionId": "TXN_123456",
"reason": "remote_stop"
}
GetReport
Получили от CSMS:
{
"requestId": 1,
"componentVariable": [
{
"component": {"name": "BatteryManagement"},
"variable": {"name": "StateOfCharge"}
}
]
}
Отправить в station_system:
{
"type": "request_data",
"requestId": 1,
"dataType": "battery_status"
}
Получить от station_system:
{
"requestId": 1,
"batteryLevel": 85,
"batteryVoltage": 48.2,
"batteryTemperature": 25.5
}
Отправить CSMS (NotifyReport):
{
"requestId": 1,
"generatedAt": "текущее_время",
"reportData": [
{
"component": {"name": "BatteryManagement"},
"variable": {"name": "StateOfCharge"},
"variableAttribute": {
"value": "85",
"unit": "Percent"
}
}
]
}
5. Обработка ошибок и переподключение
5.1 Стратегия переподключения
flowchart TD
DISCONNECT[Connection Lost] --> LOG[Log Disconnect Event]
LOG --> QUEUE[Queue Outgoing Messages]
QUEUE --> WAIT[Wait Period]
WAIT --> RETRY[Attempt Reconnection]
RETRY --> SUCCESS{Connected?}
SUCCESS -->|Yes| BOOT[Send BootNotification]
SUCCESS -->|No| BACKOFF[Increase Wait Period]
BACKOFF --> MAXWAIT{Max Wait Reached?}
MAXWAIT -->|No| WAIT
MAXWAIT -->|Yes| RESET[Reset Wait Period]
RESET --> WAIT
BOOT --> SYNC[Send Queued Messages]
SYNC --> OPERATIONAL[Operational Mode]
5.2 Обработка таймаутов
sequenceDiagram
participant OCPP as OCPP Module
participant CSMS as CSMS Server
participant Station as Station System
OCPP->>CSMS: Request Message
Note over OCPP: Start 30s timeout timer
alt Response received
CSMS->>OCPP: Response Message
Note over OCPP: Clear timeout, process response
else Timeout occurred
Note over OCPP: 30s elapsed, no response
OCPP->>Station: Notify timeout error
OCPP->>OCPP: Queue message for retry
end
6. Конфигурация модуля
6.1 Параметры подключения
{
"connection": {
"serverUrl": "wss://csms.example.com/ocpp",
"stationId": "STATION_001",
"apiKey": "your-api-key-here",
"reconnectInterval": 30,
"maxReconnectInterval": 300,
"messageTimeout": 30,
"heartbeatInterval": 300
},
"station": {
"model": "EV-CHARGER-V1",
"vendorName": "YourCompany",
"serialNumber": "SN123456789",
"firmwareVersion": "1.0.0"
},
"intervals": {
"meterValueSampleInterval": 60,10,
"clockAlignedDataInterval": 900,
"connectionTimeOut": 60
}
}
6.2 Методы управления
// Псевдокод API модуля
class OCPPModule {
// Инициализация
initialize(config) { }
// Управление соединением
connect() { }
disconnect() { }
isConnected() { }
// Отправка событий от станции
sendStationEvent(event) { }
// Получение команд для станции (callback)
onStationCommand(callback) { }
// Статус модуля
getStatus() { }
getLastError() { }
// Логирование
enableLogging(level) { }
}
7. Протокол взаимодействия с системой станции
7.1 Инициализация модуля
sequenceDiagram
participant Station as Station System
participant OCPP as OCPP Module
Station->>OCPP: Initialize(config)
OCPP->>OCPP: Load configuration
OCPP->>Station: Initialization complete
Station->>OCPP: SetEventHandler(callback)
OCPP->>Station: Handler registered
Station->>OCPP: Connect()
OCPP->>OCPP: Establish WebSocket connection
OCPP->>Station: onStationCommand("connection_established")
7.2 Обработка событий в runtime
sequenceDiagram
participant Station as Station System
participant OCPP as OCPP Module
participant CSMS as CSMS Server
Note over Station,CSMS: Обычный поток событий
Station->>OCPP: sendStationEvent(cable_connected)
OCPP->>CSMS: StatusNotification
CSMS->>OCPP: StatusNotification Response
Note over Station,CSMS: Команда от CSMS
CSMS->>OCPP: RemoteStartTransaction
OCPP->>Station: onStationCommand(start_charging)
Station->>OCPP: Command response (accepted)
OCPP->>CSMS: RemoteStartTransaction Response
Данная спецификация определяет требования к модулю OCPP коммуникации для интеграции с системой зарядной станции.