Skip to main content

Спецификация для разработчиков 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 клиента.