Утро началось с пустого репозитория. К вечеру — работающая платформа для управления электрозарядками: станции, гости, бронирования, оплата, мониторинг в реальном времени и AI-ассистент. 22 коммита, около 15 тысяч строк кода. Расскажу подробно, что умеет каждый модуль.

Зачем это нужно

Представьте: у вас дома или в офисе стоит зарядная станция для электромобиля. Вы хотите давать доступ друзьям, соседям, коллегам — но контролировать, кто сколько заряжает и сколько за это платит. А ещё видеть в реальном времени, что происходит со станцией: онлайн она, заряжает ли чей-то автомобиль, нет ли ошибок.

Ebenza решает именно эту задачу. Платформа заточена под российский рынок: оплата через ЮKassa, интерфейс на русском (плюс английский и китайский), поддержка протокола OCPP — стандарта, по которому общаются зарядные станции с серверами.

Управление станциями

Владелец регистрирует станцию, вводя серийный номер или сканируя QR-код. Станция тут же появляется в личном кабинете. Система показывает текущий статус: онлайн, заряжает, оффлайн, ошибка, на обслуживании.

У каждой станции есть коннекторы — физические разъёмы для подключения автомобиля. Поддерживаются все основные типы: Type 2 (европейский стандарт), CCS (быстрая зарядка), CHAdeMO (японский), GB/T (китайский), Schuko (обычная розетка). Для каждого коннектора видно, свободен он или занят.

Фоновая задача каждые 5 минут проверяет heartbeat станций. Если станция не отвечала слишком долго — статус меняется на "оффлайн", владелец получает уведомление.

Гостевой доступ

Владелец может пригласить любого человека пользоваться своей станцией. Отправляется приглашение — гость принимает, и у него появляется доступ. Но не безграничный.

Можно задать лимиты: максимум киловатт-часов, срок действия доступа, расписание (например, только по будням с 9 до 18). Гость видит в своём приложении только те станции, к которым у него есть доступ, и может начать зарядку в рамках разрешённых лимитов.

Просроченные приглашения автоматически удаляются — фоновая задача чистит их каждую ночь.

Бронирование

Гости могут бронировать слоты на зарядку. Выбирают станцию, коннектор, дату и время. Бронирование проходит через подтверждение владельцем. За 15 минут до начала приходит напоминание.

Это решает проблему конфликтов: если на станции один коннектор, а желающих двое — система не даст забронировать занятое время.

Зарядка в реальном времени

Когда автомобиль подключён и зарядка началась, пользователь видит всё в реальном времени: текущую мощность в киловаттах, накопленную энергию, уровень заряда батареи (если станция передаёт SoC).

На экране — живой график мощности, дуговой индикатор текущей нагрузки и числовые метрики. Данные обновляются через WebSocket — никакого обновления страницы, всё само.

graph LR
    A[Зарядная станция] -->|OCPP WebSocket| B[Сервер]
    B -->|Обновления в реальном времени| C[Dashboard WebSocket]
    C --> D[Браузер пользователя]

После завершения зарядки сессия сохраняется в историю: сколько зарядил, сколько стоило, с какого коннектора, когда началась и закончилась.

Биллинг и оплата

Владелец станции настраивает тариф: за киловатт-час, фиксированная плата за сессию, или комбинированная модель. Система считает стоимость каждой зарядки автоматически.

Оплата через ЮKassa — российский платёжный шлюз. Поддерживается split billing: деньги распределяются между владельцем станции и платформой.

Модель тарификации Как работает
За kWh Цена умножается на потреблённую энергию
Фиксированная Одна цена за сессию, независимо от объёма
Комбинированная Фиксированная база + доплата за kWh

В личном кабинете владелец видит выручку за месяц, историю транзакций, статус каждого платежа.

Уведомления

Три канала: push-уведомления на телефон (Firebase Cloud Messaging), email и уведомления внутри приложения.

Типы событий, о которых система сообщает:

  • Зарядка началась / завершилась / ошибка
  • Гость принял приглашение / использовал станцию
  • Бронирование создано / напоминание
  • Платёж получен
  • Станция ушла в оффлайн / ошибка

Каждый пользователь настраивает, какие уведомления хочет получать и по каким каналам. Кто-то хочет push обо всём, кто-то — только email о платежах.

Отчёты

Раздел аналитики: графики потребления энергии по дням, распределение по станциям и коннекторам, финансовая сводка. Данные можно экспортировать в CSV для бухгалтерии или собственного анализа.

Ежедневно система автоматически генерирует сводки — это фоновая задача, которая агрегирует данные за прошедший день.

AI-ассистент

Встроенный чат-бот на базе Claude Haiku 4.5. Не просто болталка — он видит реальные данные пользователя и отвечает на их основе.

Спрашиваешь "какие станции онлайн?" — ассистент смотрит в базу данных и называет конкретные станции с их статусами. Спрашиваешь "сколько я потратил в этом месяце?" — достаёт реальные цифры из биллинга.

sequenceDiagram
    participant U as Пользователь
    participant S as Сервер
    participant AI as Claude Haiku
    participant DB as База данных
    U->>S: "Какие станции онлайн?"
    S->>AI: Определить намерение
    AI-->>S: STATION_STATUS
    S->>DB: Загрузить данные станций
    S->>AI: Сгенерировать ответ с данными
    AI-->>S: Текст ответа (посимвольно)
    S-->>U: Ответ появляется по мере генерации

Ассистент понимает 11 типов запросов: статус станций, вопросы о зарядке, биллинг, гостевой доступ, бронирования, общие вопросы о платформе, эскалация в поддержку. Плюс четыре действия — начать/остановить зарядку, пригласить гостя, создать бронирование. При этом в ответе появляются кнопки быстрых действий.

Ответы приходят в режиме streaming — текст появляется по мере генерации, а не после паузы в 2-3 секунды. Контекст кэшируется в Redis на 60 секунд, чтобы не дёргать базу данных на каждое сообщение.

История диалогов сохраняется. Можно переключаться между сессиями, искать по истории, продолжать разговор с того места, где остановился.

Интерфейс

Приложение оптимизировано под мобильные телефоны — именно так большинство людей будет пользоваться зарядкой. Дизайн в светлых тёплых тонах, крупные кнопки, плавные анимации в стиле iOS.

Внизу экрана три главных раздела: Dashboard (общая картина), Stations (список станций), Charging (текущая зарядка). Остальное — в боковом меню: история, гости, бронирования, отчёты, настройки. Переключатель языка прямо в меню.

graph TB
    subgraph "Мобильная навигация"
        BN[Нижние табы] --> D[Dashboard]
        BN --> ST[Станции]
        BN --> CH[Зарядка]
        SM[Боковое меню] --> H[История]
        SM --> G[Гости]
        SM --> B[Бронирования]
        SM --> R[Отчёты]
        SM --> S[Настройки]
    end

Dashboard показывает четыре карточки: количество станций, активные зарядки, энергия за месяц, выручка. Ниже — список станций с их статусами и активные сессии зарядки с анимацией пульсации.

Развёртывание

Вся платформа работает в Docker — 7 контейнеров: веб-сервер, два бэкенд-процесса (один для обычных запросов, второй для WebSocket), фоновый обработчик задач, планировщик, база данных, кэш.

Есть скрипт для обновления: можно пересобрать только фронтенд, только бэкенд, только запустить миграции базы — или всё разом. База данных и кэш при обновлении никогда не трогаются, данные в безопасности.

Итог

За один день — от пустого каталога до работающей платформы. 10 модулей бэкенда, мобильный интерфейс на трёх языках, поддержка двух версий протокола OCPP, AI-ассистент со streaming-ответами и 21 автотест. Всё крутится в Docker и готово к использованию.