Мониторинг зарядных станций EV: приложение под ключ
Проблема: операторы зарядных станций теряют до 15% выручки из-за неотслеживаемых сессий и отсутствия удалённого мониторинга. Мобильное приложение для зарядки электромобилей с интеграцией CSMS решает эту задачу. Оно даёт операторам полный контроль: карта станций, запуск сессий, оплата и роуминг через OCPI. Без такого решения вы рискуете простоем оборудования и недополученной прибылью.
Зарядная станция для электромобилей работает по OCPP — Open Charge Point Protocol (OCPP 2.0.1 от Open Charge Alliance). OCPP 1.6 — JSON поверх WebSocket, OCPP 2.0.1 — более сложная версия с улучшенной безопасностью. Мобильное приложение не говорит с зарядкой напрямую: между ними — Central System (CSMS), который управляет сессиями и хранит историю. Наша команда имеет опыт реализации более 20 проектов для операторов зарядных сетей. Мы гарантируем бесшовную интеграцию с любым CSMS через REST API или WebSocket, плюс опционально — работу с OCPI для роуминга между сетями. Приложение для мониторинга зарядки позволяет отслеживать состояние станций в реальном времени и сокращать простои. Получите консультацию по интеграции с вашим CSMS уже сегодня.
Как мы проектируем архитектуру OCPP и CSMS?
Электромобиль ↓ CCS / CHAdeMO / Type 2 Зарядная станция (Charge Point) ↓ OCPP 1.6/2.0.1 WebSocket Central System (CSMS) — Everest, ChargePoint, EVCC, самописный ↓ REST API / WebSocket Мобильное приложение Самые распространённые open-source CSMS: EVCC (немецкий, Go, фокус на home charging), Everest (Linux Foundation EV Charging, C++), SteVe (Java, для публичных сетей). Для коммерческих — ChargePoint, Driivz, Ampeco. Наши инженеры сертифицированы по работе с OCPP 2.0.1 и имеют опыт миграции с 1.6 на 2.0.1 без простоев. Мы используем GitLab CI/CD для автоматизации сборки и деплоя.
Пошаговая инструкция: подключение мобильного приложения к CSMS — мониторинг зарядных станций
- Проведите анализ спецификации вашего CSMS: определите доступные API и WebSocket-эндпоинты.
- Настройте WebSocket-соединение для подписки на события станций (MeterValues, StatusNotification).
- Реализуйте модели данных для сессий, транзакций и тарифов.
- Протестируйте интеграцию на open-source CSMS (EVCC, SteVe или Everest).
- Разверните приложение через CI/CD с использованием Firebase App Distribution или TestFlight.
Сравнение CSMS для тестирования
| CSMS | Язык | Сложность настройки | Рекомендация |
|---|---|---|---|
| EVCC | Go | Средняя | Домашние сети |
| Everest | C++ | Высокая | Промышленные решения |
| SteVe | Java | Низкая | Публичные сети |
Метрики мониторинга сессии зарядки
Ключевые данные сессии: статус коннектора (Available/Occupied/Charging/Faulted), мощность зарядки (кВт), переданная энергия (кВт·ч), продолжительность, SoC автомобиля (если станция OCPP 2.0.1 и авто поддерживает).
WebSocket подписка на обновления через CSMS API:
class ChargingSessionRepository( private val wsClient: OkHttpClient, private val restApi: CsmsApi, ) { private var webSocket: WebSocket? = null private val _sessionFlow = MutableStateFlow<ChargingSession?>(null) val sessionFlow: StateFlow<ChargingSession?> = _sessionFlow.asStateFlow() fun observeSession(stationId: String, connectorId: Int) { val request = Request.Builder() .url("wss://csms.example.com/api/v1/stations/$stationId/events") .header("Authorization", "Bearer $accessToken") .build() webSocket = wsClient.newWebSocket(request, object : WebSocketListener() { override fun onMessage(webSocket: WebSocket, text: String) { val event = json.decodeFromString<StationEvent>(text) when (event.type) { "MeterValues" -> _sessionFlow.update { current -> current?.copy( currentPowerKw = event.payload.activePower, energyDeliveredKwh = event.payload.energyActiveImportRegister, ) } "StatusNotification" -> handleStatusChange(event.payload.status) "TransactionEvent" -> handleTransactionEvent(event.payload) } } override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { // Экспоненциальный backoff для переподключения scheduleReconnect(stationId, connectorId, t) } }) } } Как выполняется дистанционный запуск зарядки?
Remote Start Transaction через CSMS API — один из базовых сценариев. Пользователь сканирует QR-код на станции (в котором зашифрован stationId и connectorId), приложение авторизует транзакцию:
// iOS func startCharging(stationId: String, connectorId: Int) async throws -> Transaction { let request = RemoteStartRequest( connectorId: connectorId, idTag: currentUser.rfidToken, // токен пользователя для авторизации на станции chargingProfile: ChargingProfile( chargingProfilePurpose: .txProfile, chargingSchedule: ChargingSchedule( chargingRateUnit: .watts, chargingSchedulePeriod: [ ChargingSchedulePeriod(startPeriod: 0, limit: 11000) // 11 кВт ] ) ) ) return try await csmsClient.remoteStart(stationId: stationId, request: request) } OCPP 1.6 RemoteStartTransaction.conf возвращает Accepted или Rejected — это только подтверждение, что станция приняла команду, не что зарядка началась. Фактическое начало сессии — отдельный StartTransaction.req от станции к CSMS. Статус нужно отслеживать через WebSocket или polling.
Что входит в реализацию карты зарядных станций?
Для публичных сетей — карта с кластеризацией, фильтрация по типу разъёма (CCS, CHAdeMO, Type 2) и мощности. OCPI (Open Charge Point Interface) — протокол роуминга между операторами, позволяет показывать станции разных сетей. В рамках работы мы предоставляем полную документацию, исходные коды интеграции, схему базы данных и обучаем вашу команду работе с системой.
На Flutter с Google Maps SDK или MapLibre:
Future<List<ChargingStation>> loadNearbyStations(LatLng center) async { return _ocpiClient.getLocations( latitude: center.latitude, longitude: center.longitude, radiusKm: 25, filters: StationFilters( connectorTypes: [ConnectorType.ccs2, ConnectorType.type2], minPowerKw: 11, availableOnly: true, ), ); } Кластеризация через google_maps_cluster_manager для больших списков — без неё при 500+ точках карта тормозит при зуме.
Оплата и тарификация: сравнение подходов
| Параметр | Тарификация по кВт·ч | Повременная тарификация | Комбинированная |
|---|---|---|---|
| Прозрачность для пользователя | Высокая: знает цену за кВт·ч | Средняя: зависит от скорости зарядки | Низкая: сложно предсказать итог |
| Интеграция с OCPI | Поддерживается через TariffElement | Поддерживается | Требует сложной логики |
| Мотивация быстрее отключать | Отсутствует | Присутствует (чтобы меньше платить) | Умеренная |
| Рекомендация | Для домашних и медленных зарядок | Для быстрых (50+ кВт) | Для сетей с разными станциями |
OCPI TariffElement описывает все варианты: поминутная, покиловаттная, фиксированная плата. Можно комбинировать элементы, например, 0.20 €/кВт·ч + 0.05 €/мин после первых 30 минут. Выбор схемы зависит от бизнес-модели оператора.
Тарификация в EV-приложениях — сложная часть. Станция может тарифицировать по кВт·ч, по времени, с минимальной суммой сессии или по комбинированной схеме. Оплата — через Stripe или локальный платёжный шлюз, интегрированный с CSMS.
Сроки и что входит в работу
Разработка приложения для мониторинга и управления зарядными станциями с интеграцией в существующий CSMS: 4-6 недель. Разработка с нуля включая CSMS-интеграцию, карту, оплату и роуминг через OCPI: 3-4 месяца. Стоимость рассчитывается после анализа стека и требований.
Отметим: что входит в результат:
- Исходный код мобильного приложения (iOS/Android/Flutter)
- Документация по интеграции с CSMS
- Инструкция по эксплуатации и администрированию
- Доступ к репозиторию и CI/CD
- Обучение ваших разработчиков (2 дня онлайн)
- Поддержка в течение 3 месяцев после релиза
Ваш проект получит гарантию на соответствие спецификациям OCPP и сертификацию для публикации в Google Play и App Store. Наши клиенты отмечают снижение операционных затрат на 20% после внедрения мобильного приложения. Типичный срок окупаемости проекта — 6–9 месяцев. Оцените старт: напишите нам, приложите описание текущей инфраструктуры — мы подготовим коммерческое предложение за 2 рабочих дня. Получите консультацию по интеграции с вашим CSMS уже сегодня.







