Спецификация OCPP модуля для зарядных станций
Спецификация для разработчиков EV зарядных станций
1. Обзор сзадачистемы
1.1 Общая аАрхитектура взаимодействия
graph TB
subgraph "Backend Infrastructure"
CSMS[Central System Management Service]
API[REST API Gateway]
DB[(Database)]
end
subgraph "EV Charging StationStation"
(subgraph "Ваша зона ответственности)"
CP[ChargeOCPP[OCPP Point Controller]
MODEM[4G Modem]
BATTERY[Battery Management]
CONNECTOR[Charging Connector]
METER[Energy Meter]
RFID[RFID Reader]
DISPLAY[Display/UI]
GPS[GPSCommunication Module]
WS[WebSocket Client]
PARSER[Message Parser/Generator]
QUEUE[Message Queue]
end
subgraph "External"Station USER[EndSystem User](существующее)"
VEHICLE[ElectricSTATION[Station Vehicle]Controller]
HARDWARE[Hardware Controllers]
end
end
CSMS <--> MODEMWS
MODEMWS <--> CPOCPP
CP --> BATTERY
CP --> CONNECTOR
CP --> METER
CP --> RFID
CP --> DISPLAY
CP --> GPS
USER --> RFID
USER --> DISPLAY
VEHICLEOCPP <--> CONNECTORPARSER
OCPP <--> QUEUE
OCPP <--> STATION
STATION <--> HARDWARE
1.2 ПЗадача модуля
Основная функция: Обеспечить двустороннюю связь между зарядной станцией и CSMS по протокол коммуникации
Протокол: OCPP 2.0.1
Интерфейсы:
ТраВнспортешний: WebSocketSecureсоединение(WSS)сoverCSMSФоВнутрмат даенных: JSONАутентификацияй: APIKeyдлявинтеграциизаголовкесAuthorization2. Зона ответсиственнмости разработчиковй станции
2. Интерфейс OCPP модуля
2.1 ОсAPI для иновные задачи
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 TDLR
subgraph "ApplicationStation Layer"System"
OCPP[OCPPCONTROLLER[Station Client]
SM[State Machine]
AUTH[Authorization Manager]Controller]
end
subgraph "BusinessOCPP Logic"Module TXN[TransactionAPI"
Manager]direction METER_MGR[MeterTB
Manager]IN[Incoming EVENT[EventEvents]
Manager]OUT[Outgoing Commands]
STATUS[Status Queries]
CONFIG[Configuration Manager]Configuration]
end
subgraph "HardwareCSMS"
AbstractionBACKEND[Backend Layer"
CONN_HAL[Connector HAL]
METER_HAL[Meter HAL]
BATTERY_HAL[Battery HAL]
COMM_HAL[Communication HAL]
RFID_HAL[RFID HAL]Server]
end
subgraphCONTROLLER "Hardware"
HW[Physical Components]
end
OCPP <-->|Events| SMIN
OCPPOUT <-->|Commands| TXNCONTROLLER
SMCONTROLLER <-->|Query| AUTHSTATUS
TXNCONTROLLER <-->|Setup| METER_MGRCONFIG
TXNIN <-.->|OCPP EVENTMessages| METER_MGRBACKEND
<BACKEND -.->|OCPP METER_HALMessages| CONN_HALOUT
<-->
2.2 METER_HALВходящие <-->события HWот BATTERY_HALстанции
{
HW"eventType": COMM_HAL"station_event",
<-->"events": HW[
RFID_HAL{
<-->"type": HW"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 ClientCommunication ImplementationFlow
3.1 Установка соединения
sequenceDiagram
participant CPStation as ChargeStation PointSystem
participant OCPP as OCPP Module
participant CSMS as BackendCSMS CSMSServer
Station->>OCPP: Initialize Connection
Note over CP:OCPP: PowerConfig: Onserver /URL, NetworkAPI Availablekey, CP-station ID
OCPP->>CSMS: WebSocket ConnectionConnect
Request<br/>Note over OCPP,CSMS: wss://csms.server.com/ocpp/{stationId}
Note over CP: Headers: <br/>Authorization: Bearer {apiKey}
CSMS->>CP: WebSocketOCPP: Connection Accepted
CP-OCPP->>CSMS: BootNotification
Note over CP:OCPP: {<br/>"reason":Station "PowerUp",<br/>"chargingStation":info, {<br/>"model":firmware "YourModel",<br/>"vendorName": "YourVendor",<br/>"firmwareVersion": "1.0.0"<br/>}<br/>}version
CSMS->>CP:OCPP: BootNotification Response
Note over CSMS: {<br/>"status":Status: "Accepted",<br/>"interval":Accepted, 300,<br/>"currentTime":Heartbeat "2025-07-12T10:00:00Z"<br/>}interval
CP-OCPP->>CSMS:Station: StatusNotificationConnection Note over CP: Connector Status: "Available"Established
loop Heartbeat
Every 300s
CP-OCPP->>CSMS: Heartbeat (every interval)
CSMS->>CP:OCPP: 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 Обработка событий в каждом состояанции
flowchartsequenceDiagram
TDparticipant subgraphStation "Availableas State"Station A1[CableSystem
Connected]participant --OCPP as OCPP Module
participant CSMS as CSMS Server
Note over Station,CSMS: Пользователь подключил кабель
Station->>OCPP: A2[Sendcable_connected StatusNotification:event
Preparing]OCPP->>CSMS: A3[RemoteStartTransaction]StatusNotification --(Preparing)
CSMS->>OCPP: A4[SendStatusNotification StatusNotification:Response
Reserved]Note A5[over Station,CSMS: Пользователь приложил RFID
Scan]Station->>OCPP: --rfid_scanned event
OCPP->>CSMS: A6[LocalAuthorize
AuthorizationCSMS->>OCPP: Check]Authorize endResponse subgraph(Accepted)
"ChargingOCPP->>Station: State"authorize_user C1[Metercommand
ReadingNote Timer]over --Station,CSMS: Станция начала зарядку
Station->>OCPP: C2[Sendcharging_started MeterValues]event
C3[VehicleOCPP->>CSMS: Disconnected]TransactionEvent --(Started)
CSMS->>OCPP: C4[SendTransactionEvent TransactionEvent:Response
Ended]Note C5[Errorover Detected]Station,CSMS: --Периодические показания счетчика
loop Every 60 seconds
Station->>OCPP: C6[Sendmeter_reading StatusNotification:event
SuspendedEVSE]OCPP->>CSMS: endMeterValues
subgraphCSMS->>OCPP: "ErrorMeterValues Handling"
E1[Hardware Error] --> E2[Log Error Locally]
E2 --> E3[Send NotifyEvent]
E3 --> E4[Update State to Faulted]Response
end
5.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 сообщения от станциий
5.4.1 Исходящие сообщенициализация и(Station статус→ CSMS)
BootNotification (при запустартке)
{
"reason": "PowerUp",
"chargingStation": {
"model": "EV-CHARGER-V1"получить_от_station_system",
"vendorName": "YourCompany"получить_от_station_system",
"firmwareVersion": "1.2.3"получить_от_station_system",
"serialNumber": "SN123456789"получить_от_station_system"
}
}
StatusNotification (при изменении сотатустоянияа)
{
"timestamp": "2025-07-12T10:30:00Z"получить_от_station_system",
"connectorStatus": "Available"Available|Preparing|Charging|SuspendedEVSE|SuspendedEV|Finishing|Reserved|Unavailable|Faulted",
"evseId": 1,"получить_от_station_system",
"connectorId": 1"получить_от_station_system"
}
HeartbeatTransactionEvent (периодически)
{
"currentTime": "2025-07-12T10:30:00Z"
}
5.2 События транзакций
TransactionEvent (начало зарядки)
{
"eventType": "Started"Started|Updated|Ended",
"timestamp": "2025-07-12T10:30:00Z"получить_от_station_system",
"triggerReason": "Authorized"Authorized|CablePluggedIn|ChargingRateChanged|ChargingStateChanged|Deauthorized|EnergyLimitReached|EVCommunicationLost|EVConnectTimeout|MeterValueClock|MeterValuePeriodic|TimeLimitReached|Trigger|UnlockCommand|StopAuthorized|EVDeparted|EVDetected|RemoteStop|RemoteStart|AbnormalCondition|SignedDataReceived|ResetCommand",
"seqNo": 0,"incremental_number",
"transactionInfo": {
"transactionId": "TXN_" + generateUniqueId()получить_от_station_system",
"chargingState": "Charging"Charging|EVConnected|SuspendedEV|SuspendedEVSE|Idle"
},
"evse": {
"id": 1,"получить_от_station_system",
"connectorId": 1"получить_от_station_system"
},
"idToken": {
"idToken": "получить_от_station_system",
"type": "ISO14443|ISO15693|KeyCode|Local|MacAddress|NoAuthorization"
},
"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 (телеметрия)
{
"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
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)
{
"reason": "PowerUp",
"chargingStation": {
"model": "EV-CHARGER-V1"получить_от_station_system",
"vendorName": "YourCompany"получить_от_station_system",
"firmwareVersion": "1.2.3"получить_от_station_system",
"serialNumber": "SN123456789"получить_от_station_system"
}
}
{
"timestamp": "2025-07-12T10:30:00Z"получить_от_station_system",
"connectorStatus": "Available"Available|Preparing|Charging|SuspendedEVSE|SuspendedEV|Finishing|Reserved|Unavailable|Faulted",
"evseId": 1,"получить_от_station_system",
"connectorId": 1"получить_от_station_system"
}
{
"currentTime": "2025-07-12T10:30:00Z"
}
{
"eventType": "Started"Started|Updated|Ended",
"timestamp": "2025-07-12T10:30:00Z"получить_от_station_system",
"triggerReason": "Authorized"Authorized|CablePluggedIn|ChargingRateChanged|ChargingStateChanged|Deauthorized|EnergyLimitReached|EVCommunicationLost|EVConnectTimeout|MeterValueClock|MeterValuePeriodic|TimeLimitReached|Trigger|UnlockCommand|StopAuthorized|EVDeparted|EVDetected|RemoteStop|RemoteStart|AbnormalCondition|SignedDataReceived|ResetCommand",
"seqNo": 0,"incremental_number",
"transactionInfo": {
"transactionId": "TXN_" + generateUniqueId()получить_от_station_system",
"chargingState": "Charging"Charging|EVConnected|SuspendedEV|SuspendedEVSE|Idle"
},
"evse": {
"id": 1,"получить_от_station_system",
"connectorId": 1"получить_от_station_system"
},
"idToken": {
"idToken": "получить_от_station_system",
"type": "ISO14443|ISO15693|KeyCode|Local|MacAddress|NoAuthorization"
},
"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"
}
]
}
]
}
{
"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"
}
]
}
]
}
{
"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"
}
]
}
{
"idToken": {
"idToken": "получить_от_station_system",
"type": "ISO14443|ISO15693|KeyCode|Local|MacAddress|NoAuthorization"
},
"evseId": "получить_от_station_system"
}
Получили от CSMS:
{
"idToken": {
"idToken": "RFID_12345",
"type": "ISO14443"
},
"meterValue"evseId": 1,
"chargingProfile": {
"id": 1,
"stackLevel": 0,
"chargingProfilePurpose": "TxProfile",
"chargingProfileKind": "Absolute",
"chargingSchedule": [
{
"timestamp"id": 1,
"startSchedule": "2025-07-12T10:30:00Z",
"sampledValue"duration": 3600,
"chargingRateUnit": "W",
"chargingSchedulePeriod": [
{
"value"startPeriod": "0.0",0,
"measurand"limit": "Energy.Active.Import.Register",
"unit": "kWh"7200
}
]
}
]
}
}
MeterValues (
Отправоить время зарядки каждые 60 сек)station_system:
{
"type": "start_charging",
"evseId": 1,
"meterValue": [
{
"timestamp"rfidToken": "2025-07-12T10:31:00Z"RFID_12345",
"sampledValue"maxPower": [
{7200,
"value"duration": "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"
}
]
}
]3600
}
5.3
Ответ События системы
CSMS:NotifyEvent (ошибки и важные события)
{
"generatedAt"status": "2025-07-12T10:35:00Z"Accepted|Rejected",
"eventData": [
{
"eventId": 1,
"timestamp": "2025-07-12T10:35:00Z",
"trigger": "Alerting",
"eventType": "FaultDetected",
"component"statusInfo": {
"name"reasonCode": "ChargingStation"
},
"variable": {
"name": "ConnectorLockFailure"
},
"eventNotificationType": "Alert"NoError|Busy|Occupied|Faulted"
}
]
}
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
Получили от CSMS:
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 Ком
Отпранды монвиторингаь в station_system:
{
"type": "stop_charging",
"transactionId": "TXN_123456",
"reason": "remote_stop"
}
GetReport (запрос данных)
ЗапрПослучили от CSMS:
{
"requestId": 1,
"componentVariable": [
{
"component": {"name": "BatteryManagement"},
"variable": {"name": "StateOfCharge"}
}
]
}
Ваш ответ:
{
"status": "Accepted",
"statusInfo": {
"reasonCode": "NoError"
}
}
Затем оОтправить NotifyReport:в 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": "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.5. Обработка ошибок и переподключениагностикае
9.5.1 ТСтратегия пы ошибок и ереаподкцлючения
flowchart TD
ERROR[Error Detected] --> TYPE{Error Type}
TYPE -->|Communication| COMM[DISCONNECT[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 ErrorDisconnect Details]Event]
SWLOG --> RESTART[RestartQUEUE[Queue Component]Outgoing SWMessages]
QUEUE --> NOTIFYWAIT[Wait RECONNECTPeriod]
WAIT --> ONLINE{RETRY[Attempt Reconnection]
RETRY --> SUCCESS{Connected?}
ONLINESUCCESS -->|Yes| SYNC[SyncBOOT[Send OfflineBootNotification]
Data]
ONLINESUCCESS -->|No| OFFLINEBACKOFF[Increase Wait 9.2Period]
Self-Diagnostics
Периодические проверки каждые 5 минут:
flowchart TD
START[Diagnostic Timer]BACKOFF --> BATTERY[CheckMAXWAIT{Max BatteryWait Status]Reached?}
BATTERYMAXWAIT -->|No| CONNECTOR[CheckWAIT
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?}
RESULTMAXWAIT -->|Yes| SCHEDULE[ScheduleRESET[Reset NextWait Check]Period]
RESULT -->|No| ALERT[Send Alert to CSMS]
ALERTRESET --> SCHEDULEWAIT
SCHEDULEBOOT --> STARTSYNC[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
10.6. СхеКонфигурация ма оданных дуля
6.1 Пального хранметры подключения
10.1 Структура данных
erDiagram{
TRANSACTIONS"connection": {
string"serverUrl": transaction_id"wss://csms.example.com/ocpp",
PK"stationId": datetime"STATION_001",
start_time"apiKey": datetime"your-api-key-here",
end_time"reconnectInterval": string30,
rfid_token"maxReconnectInterval": float300,
start_energy"messageTimeout": float30,
end_energy"heartbeatInterval": string status
json meter_values300
},
AUTH_CACHE"station": {
string"model": rfid_token"EV-CHARGER-V1",
PK"vendorName": string"YourCompany",
status"serialNumber": datetime"SN123456789",
expiry_date"firmwareVersion": string group_id"1.0.0"
},
ERROR_LOG"intervals": {
int"meterValueSampleInterval": id60,
PK"clockAlignedDataInterval": datetime900,
timestamp"connectionTimeOut": string error_type
string component
string description
string status60
}
CONFIG {
string key PK
string value
datetime updated_at
}
11.6.2 ПримМертоды управлеалнизации ключевых функций
11.1 OCPP Message Handlerя
// Псевдокод API модуля
class OCPPModule {
// Инициализация
initialize(config) { }
// Управление соединением
connect() { }
disconnect() { }
isConnected() { }
// Отправка событий от станции
sendStationEvent(event) { }
// Получение команд для обрстаботкнции входящих(callback)
сообщений
function handleOCPPMessage(messageType, messageId, payload)onStationCommand(callback) { switch(messageType)}
// Статус модуля
getStatus() { case}
'RemoteStartTransaction':
return handleRemoteStart(payload);
case 'RemoteStopTransaction':
return handleRemoteStop(payload);
case 'GetReport':
return handleGetReport(payload);
case 'Reset':
return handleReset(payload);
default:
returngetLastError() { status:}
'NotSupported',// statusInfo:Логирование
enableLogging(level) {
reasonCode: 'MessageNotSupported'
}
}; }
}
7. Протокол взаимодействия с системой станции
11.27.1 StateИнициализация Machine Implementationмодуля
//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: Команда дляот stateCSMS
machineCSMS->>OCPP: classRemoteStartTransaction
ChargingStationStateMachineOCPP->>Station: {onStationCommand(start_charging)
constructor()Station->>OCPP: {Command this.currentState = 'Available';
this.allowedTransitions = {
'Available': ['Preparing', 'Reserved', 'Unavailable'],
'Preparing': ['Available', 'Charging'],
'Charging': ['Finishing', 'SuspendedEVSE', 'SuspendedEV'],
'Finishing': ['Available']
};
}
transitionTo(newState, reason) {
ifresponse (this.allowedTransitions[this.currentState].includes(newState))accepted)
{OCPP->>CSMS: this.currentStateRemoteStartTransaction = newState;
this.sendStatusNotification(newState, reason);
return true;
}
return false;
}
}Response
erDiagram{
TRANSACTIONS"connection": {
string"serverUrl": transaction_id"wss://csms.example.com/ocpp",
PK"stationId": datetime"STATION_001",
start_time"apiKey": datetime"your-api-key-here",
end_time"reconnectInterval": string30,
rfid_token"maxReconnectInterval": float300,
start_energy"messageTimeout": float30,
end_energy"heartbeatInterval": string status
json meter_values300
},
AUTH_CACHE"station": {
string"model": rfid_token"EV-CHARGER-V1",
PK"vendorName": string"YourCompany",
status"serialNumber": datetime"SN123456789",
expiry_date"firmwareVersion": string group_id"1.0.0"
},
ERROR_LOG"intervals": {
int"meterValueSampleInterval": id60,
PK"clockAlignedDataInterval": datetime900,
timestamp"connectionTimeOut": string error_type
string component
string description
string status60
}
CONFIG {
string key PK
string value
datetime updated_at
}
6.2 ПримМертоды управлеалнизации ключевых функций
// Псевдокод API модуля
class OCPPModule {
// Инициализация
initialize(config) { }
// Управление соединением
connect() { }
disconnect() { }
isConnected() { }
// Отправка событий от станции
sendStationEvent(event) { }
// Получение команд для обрстаботкнции входящих(callback)
сообщений
function handleOCPPMessage(messageType, messageId, payload)onStationCommand(callback) { switch(messageType)}
// Статус модуля
getStatus() { case}
'RemoteStartTransaction':
return handleRemoteStart(payload);
case 'RemoteStopTransaction':
return handleRemoteStop(payload);
case 'GetReport':
return handleGetReport(payload);
case 'Reset':
return handleReset(payload);
default:
returngetLastError() { status:}
'NotSupported',// statusInfo:Логирование
enableLogging(level) {
reasonCode: 'MessageNotSupported'
}
}; }
}
//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")
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: Команда дляот stateCSMS
machineCSMS->>OCPP: classRemoteStartTransaction
ChargingStationStateMachineOCPP->>Station: {onStationCommand(start_charging)
constructor()Station->>OCPP: {Command this.currentState = 'Available';
this.allowedTransitions = {
'Available': ['Preparing', 'Reserved', 'Unavailable'],
'Preparing': ['Available', 'Charging'],
'Charging': ['Finishing', 'SuspendedEVSE', 'SuspendedEV'],
'Finishing': ['Available']
};
}
transitionTo(newState, reason) {
ifresponse (this.allowedTransitions[this.currentState].includes(newState))accepted)
{OCPP->>CSMS: this.currentStateRemoteStartTransaction = newState;
this.sendStatusNotification(newState, reason);
return true;
}
return false;
}
}Response
Данная спецификация опредназначена для разрабоетчиков ПО зарядных станций и содержит все необходимые требования к модуляю реалOCPP коммунизкации OCPPдля 2.0.1 клиентеграции с системой зарядной станции.