Автоматизация зарядки электромобиля через Home Assistant

У меня на подземном паркинге имеется два парковочных места и зарядные устройства. В этом лонгриде постараюсь рассказать как я делаю эти маленькие объекты недвижимости чуть «умнее».

Меня зовут Владислав Иващенко. В свободное от работы время увлекаюсь темой умного дома. Пытаюсь автоматизировать всё, до чего дотягиваются руки. Свои первые датчики и шлюз Xiaomi купил в 2017 году. Буду рад поделиться опытом.

Владислав Иващенко
Называю себя энтузиастом умного дома

Про паркинг

У меня два машиноместа на самом стандартном подземном паркинге в многоквартирном доме в спальном районе Санкт-Петербурга.

Первым парковочным местом пользуется супруга для гибрида Volvo. И там стоит две зарядки Type2: одно «глупое» – просто заряжает до талого когда вставляешь пистолет в авто (изначально установил по незнанию, позже уже докупил второй вариант), а второе умнее – прокинуто в Home Assistant и им можно управлять по собственным правилам.

И на другом парковочном месте ещё одна зарядка GB/T, где я заряжаю свой полностью электрический Zeekr.

Главная панель по паркингу в Home Assistant
Главная панель по паркингу в Home Assistant

На скриншоте – моя панель Home Assistant, посвящённая паркингу. На главном экране информация по трём зарядным устройствам, а также можно провалиться по бейджам для дополнительных функций, о которых я расскажу ниже.

Электричество

С 2020 года у меня в семье присутствовали подключаемые гибриды от Volvo. А в конце 2023 я решил, что нужно озадачиться и провести электричество на паркинг, чтобы заряжать автомобиль супруги.

Это, конечно, был тот ещё квест, достойный отдельного поста, но в итоге всё получилось: в августе 2024 у меня на паркинге появился свой электрощит с выделенной мощностью 15 кВт (3 фазы по 5 кВт), своим счётчиком и первой не очень умной зарядкой Type2.

Так выглядел щит сразу после опломбировки счётчика
Так выглядел щит сразу после опломбировки счётчика

Интернет

Сразу, конечно, встал вопрос интернета на парковочном месте. Мой мобильный оператор, Yota, в паркинге не ловил совсем.

Поскольку паркинг – помещение нежилое, то провести туда проводного провайдера стоит каких-то космических денег, ну и тарифы потом соответствующие.

В итоге были приобретены симки всех операторов с самыми дешёвыми тарифами для теста. Итоги теста показали, что Билайн на моём парковочном месте имеет лучший сигнал из всех.

Сначала я просто воткнул роутер Keenetic с модемом ZTE MF79N и маленькими выносными антеннами, но связь всё равно не всегда была достаточно стабильной, поэтому позже поменял на модем Vertell с MIMO-антенной – и теперь у меня стабильно 40 Мбит на приём и 20 Мбит на передачу, чего мне с лихвой хватает.

Автоматизация зарядки электромобиля через Home Assistant

Тариф, кстати, у Билайна получился очень даже выгодный. Тариф up с 2 Гб интернета и без звонков стоит 150 рублей в месяц, а если покопаться в услугах, то сейчас у Билайна можно найти бесплатную опцию на 1 Тб трафика на год.

Тариф в Билайне 
Тариф в Билайне 

В итоге за 150 рублей в месяц у меня на паркинге 2+83,5=85,5 Гб трафика ежемесячно – более чем достаточно для моих целей.

Локальная сеть

Поскольку сервер Home Assistant установлен в квартире, связал домашний Keenetic с парковочным через IPSec VPN – настраивается несложно, главное использовать разные подсети на роутерах, чтобы не было конфликтов.

В моём случае в квартире используется стандартная подсеть 192.168.1.x, а на паркинге – 192.169.1.x.

VPN туннель сеть-сеть квартиры с паркингом 
VPN туннель сеть-сеть квартиры с паркингом 

Если не объединять локальные сети, то те интеграции в Home Assistant, которые работают локально (а это почти все нормальные) – работать не будут, а будут только облачные интеграции (а это, конечно, зло).

Второе парковочное место

Когда у меня появилась зарядка, я чего-то психанул и купил себе полную электричку – Zeekr 001. Посмотреть что это такое. Свою BMW я всё-таки не продал, летом преимущественно езжу на бензине, а вот зимой больше комфорта даёт Zeekr.

Соответственно, нужно было протянуть и электричество, и интернет на второе парковочное место, которое расположено примерно в 150 метрах по паркингу от первого.

Сначала пытался заново начать всю тягомотину с подключением мощностей через Петроэлектросбыт, но в итоге плюнул и просто одну из трёх фаз первого парковочного места протянул вместе с оптоволокном до второго места.

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

Автоматизация зарядки электромобиля через Home Assistant

Зато по срокам это удалось реализовать за пару недель, а не за почти год, как в случае с подключением первого паркоместа.

Тарифы на электричество

У меня двухтарифный счётчик электричества, то есть ночью с 23:00 до 07:00 электроэнергия дешевле, чем днём. Текущие тарифы:

Панель электричества в паркинге 
Панель электричества в паркинге 

Для мониторинга расхода электричества после счётчика от энергосбытовой компании подключен энергомонитор Shelly Pro 3EM, он без проблем прокидывается в Home Assistant штатной интеграцией.

Поскольку каждое парковочное место висит на отдельной фазе, то легко считать не только общее потребление, но и разделять по паркоместам, как видно на скриншоте.

С помощью штатного функционала HA utility_meter считаю потребление день/ночь, ну и сразу можно помножить на рубли.

Нехитрым шаблоном добавив стартовые значения счётчика в момент подключения utility_meter можно высчитать показания счётчика для передачи в энергосбытовую компанию, чтобы не лазить в щит каждый месяц:

Шаблон сенсора показания счётчика – день 
Шаблон сенсора показания счётчика – день 

А автоматизация раз в месяц пришлёт в Telegram показания для передачи вместе со ссылкой для входа в личный кабинет, а потом напомнит оплатить: ПСК долго формирует «счета», поскольку паркинг считается нежилым помещением и с ним работает отдел по работе с юрлицами, который формирует оплаты вручную.

Автоматизация отправки показаний счётчиков в группу Telegram 
Автоматизация отправки показаний счётчиков в группу Telegram 

Про зарядку Volvo

Для зарядки гибрида у меня стоит простое зарядное устройства Shuko-Type2 из экосистемы Tuya, прокинутое в Home Assistant через local_tuya.

Можно использовать Xtend Tuya (он тоже работает локально), но я по старинке предпочитаю local_tuya, чтобы не полагаться на сторонних разработчиков – local_key и все нужные мне объекты настраиваю самостоятельно. А ещё Xtend Tuya может иногда конфликтовать с облачной Tuya, в итоге какие-то объекты могут остаться только в облачном исполнении.

Зарядка покупалась на AliExpress, но можно найти умные аналоги и на Озоне/Авито 
Зарядка покупалась на AliExpress, но можно найти умные аналоги и на Озоне/Авито 

С зарядкой гибрида всё просто. Там маленькая батарея 10 кВтч, поэтому логика простая: с 23:00 до 06:59 заряжаем минимальным током – даже 8А хватит, чтобы полностью зарядить батарею за 8 ночных часов.

Если зарядка подключена с 07:00 до 16:59, то сразу заряжаем максимальным током – высока вероятность, что автомобиль может потребоваться для вечерней поездки.

Ну а при подключении зарядки после 17:00 – просто ждём активации зарядки по ночному тарифу в 23:00, потому что маловероятно, что автомобиль куда-то ещё поедет.

Пример работы зарядки 
Пример работы зарядки 

При этом оставляем вариант ручного старта зарядки – на случай отклонения от стандартных сценариев использования.

Автоматизация нехитрая – настраивается за 10 минут через веб-интерфейс.

Уведомления

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

Не забыли подключить кабель – отлично
Не забыли подключить кабель – отлично

А также о старте и окончании зарядки:

Автоматизация зарядки электромобиля через Home Assistant

При этом у меня есть 4 вида уведомлений: замьюченные в общую группу (как эти, например), обычные в общую группу (когда звонят в домофон или дверь), срочные (звонок на телефон через HA Companion App + дозвон на телефон через Яндекс Алису), а также некоторые системные уведомления шлю напрямую себе в личку, а не общую группу.

Забыли подключить зарядку (телефон супруги появляется в домашней сети, но зарядка не подключена) – отлично, шлём уведомление 🙃 Благо супруга уже научена всегда подключать зарядку, поэтому такие уведомления случаются крайне редко.

Про зарядку Zeekr

С полной электричкой дела обстоят уже хитрее, ведь батарея тут целых 100 кВтч. При просто ночной зарядке с 23 до 7 «залить» в машину при ограничении на фазу в 5 кВт удастся не более 40 кВтч (а с учётом потерь и того меньше), чего не всегда может хватать.

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

Поэтому логика следующая:

  • Ночью используем минимальный достаточный ток, чтобы успеть зарядиться к 07:00.
  • Днём включаем зарядку только в том случае, если по расчётам не успеем зарядиться ночью.

В моём случае нужно также учесть потерю напряжения, ведь второе парковочное место находится в 150 метрах от первого, где стоит первичный электрощит и счётчик от энергосбытовой компании, плюс потери возникают на встроенном в электромобиль трансформате AC->DC. У меня потери от автомата до батареи на практике составляют чуть больше 20%.

Оборудование тут тоже чуть серьёзнее: речь уже не про 16-амперную бытовую розетку, а 32-амперная версия с силовой розеткой. Но всё так же Tuya с прокидкой в Home Assistant через local_tuya.

Эта зарядка покупалась на Авито с доставкой из Москвы 
Эта зарядка покупалась на Авито с доставкой из Москвы 

Для тех, кто хочет повторить или лучше понять логику работы, ниже полный код автоматизации. Он выглядит сложным, но по сути это просто набор условий (if/else). Главное – правильно подставить названия своих сущностей (entities).

alias: Зарядка паркинг дальний ночью автоматизация description: "Управление мощностью зарядки с приоритетом ночного тарифа" trigger: - platform: time_pattern minutes: "/30" - platform: state entity_id: - binary_sensor.1080930401_ev_charging_connected - input_boolean.zariadka_nachata_parking_dalnii - binary_sensor.status_zariadki_parking_dalnii action: # === НАСТРОЙКИ === - variables: # Параметры зарядки protsent_poter: 22 # Процент потерь в сети (например, 20%) dostupnye_toki: [24, 20, 16, 13, 10, 8] emkost_batarei: 100 # Сущности target_soc_entity: "input_number.zariazhat_zeekr_do_ukazannogo_protsenta_zariada" # Число от 0 до 100 – до скольки процентов заряжаем батарею current_soc_entity: "sensor.1080930401_soc" # Сенсор текущего уровня заряда батареи zariadka_nachata_entity: "input_boolean.zariadka_nachata_parking_dalnii" # Вспомогательный переключатель, что зарядка начата: включается либо вручную, либо автоматизацией switch_entity: "switch.zariadka_dlia_avto_parking_dalnii_zariadka_dlia_avto_parking_dalnii_vkliuchit" # Переключатель зарядного устройства (local_tuya) current_entity: "number.zariadka_dlia_avto_parking_dalnii_zariadka_dlia_avto_parking_dalnii_moshchnost" # Выбор тока зарядки (local_tuya) status_entity: "binary_sensor.status_zariadki_parking_dalnii" # Сенсор: идёт ли заряд (на базе энергомониторинга фазы Shelly Pro 3EM) voltage_sensor_entity: "sensor.tension_phase_sensor" # Сенсор текущего напряжения (Shelly Pro 3EM) # Текущие значения target_soc: "{{ states(target_soc_entity) | float(80) }}" current_soc: "{{ states(current_soc_entity) | float(0) }}" soc_diff: "{{ target_soc - current_soc }}" zariadka_nachata: "{{ states(zariadka_nachata_entity) == 'on' }}" switch_state: "{{ states(switch_entity) }}" status_state: "{{ states(status_entity) }}" # Расчет эффективного напряжения с учетом потерь current_voltage: "{{ states(voltage_sensor_entity) | float(220) }}" napriazhenie_seti: "{{ current_voltage * (1 - protsent_poter / 100) }}" # Время current_hour: "{{ now().hour }}" current_minute: "{{ now().minute }}" is_night_tariff: "{{ current_hour >= 23 or current_hour < 7 }}" hours_until_7am: > {% if current_hour < 7 %} {{ 7 - current_hour - current_minute / 60 }} {% else %} {{ 31 - current_hour - current_minute / 60 }} {% endif %} # Расчеты энергии energy_needed: "{{ (soc_diff / 100) * emkost_batarei }}" # Расчет тока required_power: "{{ energy_needed / [hours_until_7am, 0.1] | max }}" required_current: "{{ (required_power * 1000) / napriazhenie_seti }}" sufficient_currents: > {% if is_night_tariff and soc_diff > 0 %} {{ dostupnye_toki | select('>=', required_current) | list }} {% else %} [] {% endif %} optimal_current: > {% if soc_diff <= 0 %} 1 {% elif is_night_tariff %} {% if sufficient_currents %} {{ sufficient_currents | min }} {% else %} {{ dostupnye_toki | max }} {% endif %} {% else %} {{ dostupnye_toki | max }} {% endif %} should_charge: > {% if soc_diff <= 0 %} false {% elif zariadka_nachata %} true {% else %} {% set max_power = (dostupnye_toki | max * napriazhenie_seti) / 1000 %} {% set time_needed = energy_needed / max_power %} {{ is_night_tariff or time_needed > 8 or current_hour >= (23 - [time_needed - 8, 0] | max) }} {% endif %} # Проверки состояния is_charging_active: "{{ switch_state == 'on' and status_state == 'on' }}" is_charging_inactive: "{{ switch_state == 'off' and status_state == 'off' }}" # Отладочное сообщение, отключено (но можно включить для отладки и понимания логики работы автоматизации) - service: notify.telegramvlad enabled: false data: message: > 🔌 ДЕТАЛЬНАЯ ДИАГНОСТИКА ЗАРЯДКИ 📊 ПАРАМЕТРЫ БАТАРЕИ: Текущий: {{ current_soc | round(1) }}% → Целевой: {{ target_soc | round(1) }}% Разница: +{{ soc_diff | round(1) }}% Энергия: {{ energy_needed | round(2) }} кВт·ч ⏰ ВРЕМЯ: Сейчас: {{ now().strftime('%H:%M') }} До 07:00: {{ hours_until_7am | round(2) }}ч Ночь: {{ 'ДА' if is_night_tariff else 'НЕТ' }} ⚡️ РАСЧЕТ ТОКА: {% if is_night_tariff and soc_diff > 0 %} Мощность: {{ required_power | round(3) }} кВт Ток расчетный: {{ required_current | round(2) }}А Ток выбранный: {{ optimal_current }}А Достаточные токи: {{ sufficient_currents }} {% else %} Режим: {{ 'НОЧЬ' if is_night_tariff else 'ДЕНЬ' }} Ток: {{ optimal_current }}А {% endif %} 🔧 СОСТОЯНИЕ: Зарядка начата: {{ 'ДА' if zariadka_nachata else 'НЕТ' }} Switch: {{ switch_state }} Статус: {{ status_state }} Зарядка активна: {{ 'ДА' if is_charging_active else 'НЕТ' }} 🎯 РЕШЕНИЕ: Действие: {% if soc_diff <= 0 %}ВЫКЛ{% elif should_charge %}ВКЛ{% else %}ОЖИДАНИЕ{% endif %} # Логика управления - choose: - conditions: - condition: template value_template: "{{ soc_diff <= 0 }}" sequence: - if: - condition: template value_template: "{{ not is_charging_inactive }}" then: - service: switch.turn_off target: entity_id: "{{ switch_entity }}" - service: number.set_value target: entity_id: "{{ current_entity }}" data: value: 1 - service: input_boolean.turn_off target: entity_id: "{{ zariadka_nachata_entity }}" - conditions: - condition: template value_template: "{{ should_charge }}" sequence: - if: - condition: template value_template: "{{ not is_charging_active or states(current_entity) | float != optimal_current }}" then: - service: switch.turn_on target: entity_id: "{{ switch_entity }}" - service: number.set_value target: entity_id: "{{ current_entity }}" data: value: "{{ optimal_current }}" - service: input_boolean.turn_on target: entity_id: "{{ zariadka_nachata_entity }}" - conditions: - condition: template value_template: "{{ not should_charge and soc_diff > 0 }}" sequence: - if: - condition: template value_template: "{{ not is_charging_inactive }}" then: - service: switch.turn_off target: entity_id: "{{ switch_entity }}" - service: number.set_value target: entity_id: "{{ current_entity }}" data: value: 1 - service: input_boolean.turn_off target: entity_id: "{{ zariadka_nachata_entity }}" mode: restart

Благодаря этой автоматизации утром у меня всегда заряженный электромобиль по минимальному возможному тарифу и минимальным возможным током.

Посчитаем экономию

Обычно я трачу около 30 кВтч в день и возвращаюсь домой в около 18:00. Если начинать зарядку сразу, то 5 часов зарядка будет идти по дневному тарифу и ещё около 2,5 часов по ночному.

Если заряжаться таким образом 20 дней в месяц, то счёт за электричество составит 4 058 рублей. А если перейти на полностью ночную зарядку – уже 2 610 рублей. Экономия – 1 448 рублей в месяц.

К слову, на бензин для летней BMW со схожими динамическими характеристиками, таким же режимом вождения и месячным пробегом – трачу примерно раз в 6-8 больше денег.

Интеграция автомобилей в Home Assistant

Надо отметить, что мой умный дом знает текущий уровень заряда батареи электромобиля, благодаря чему и возможна умная зарядка.

В моём случае у меня на Зикре установлена сигнализация Пандора – и с помощью HACS-интеграции все данные с шины передаются в Home Assistant:

Автоматизация зарядки электромобиля через Home Assistant

Помимо использования для автоматизации зарядки, это даёт и другую пользу: считаю расход на 100 км пробега, можно открывать / закрывать машину удалённо и т.д. Да и просто нативное приложение у Пандоры мне нравится меньше, чем интерфейс Home Assistant.

Сейчас есть интеграции и для Пандоры, и для Старлайна. И, конечно, для штатных блоков удалённого управления и мониторинга от производителей.

У меня в Home Assistant также были заведены BMW через ConnectedDrive и Volvo через Volvo On Call, но оба перестали работать в России, к сожалению. Вроде Роскомнадзор блокирует то ли протоколы, то ли запросы к иностранным серверам 🤷‍♂

На сегодняшний день и в наших реалиях самый надёжный способ интегрировать машину в умный дом – поставить российскую сигнализацию.

Камеры

Куда же без них. У меня стоят недорогие камеры от IMOU – это саббренд Dahua, более ориентированный на частных, а не корпоративных пользователей.

Автоматизация зарядки электромобиля через Home Assistant

В Home Assistant камеры прокинуты через ONVIF. Из плюсов – у IMOU есть также облачная интеграция, которая позволяет автоматизировать перезагрузку камер через облако, если ONVIF сбоит (а такое иногда случается при нестабильном соединении).

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

Автоматизация зарядки электромобиля через Home Assistant

Также использую снапшоты с камер для разных уведомлений (уже можно было заметить выше). И получаю оперативные уведомления, если кто-то трётся у машиноместа.

Для этого с помощью штатной интеграции history_stats мониторю сколько секунд был активен сенсор движения камеры за последние 5 минут. Если больше 180 и никто из домашних не подключен к вай-фаю – то сразу шлём последнее записанное видео с уведомлением.

Можно оперативно прогонять детей, балующихся на паркинге 🙃 Ну или оперативно узнавать о каких-то менее безобидных вещах (не мониторя постоянно чат с проезжающими мимо автомобилями или проходящими мимо людьми).

Итого

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

Ну и ещё я иногда пишу в свой маленький уютный канал про умный дом, если эта тема вам интересна.

1 комментарий