Утро началось с пустого репозитория. К вечеру — работающая платформа для управления электрозарядками: станции, гости, бронирования, оплата, мониторинг в реальном времени и 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 и готово к использованию.