Блюпринт Home Assistant для нежной зарядки EV. Управляет силовым оборудованием: ошибка в логике ограничения тока — вопрос безопасности проводки, а не косметики.
Документация, комментарии в блюпринте и общение с пользователем — на русском. Имена переменных, тестов и код — на английском. Docstring'и тестов — на английском.
| Путь | Что это |
|---|---|
blueprints/automation/ev_smart_charging/ev_smart_charging.yaml |
весь продукт, ~2300 строк |
tests/ha_sim.py |
офлайн-эмулятор шаблонов HA, на нём работают тесты |
tests/differential_against_home_assistant.py |
сверяет эмулятор с настоящим HA; единственное, что ловит его дрейф |
tests/test_mutations.py |
ломает блюпринт по одному месту и проверяет, что набор это ловит |
tools/trace_report.py |
разбор скачанных трассировок; держит совместимость с Python 3.9 |
docs/ |
сайт MkDocs; CHANGELOG/CONTRIBUTING/SECURITY лежат в корне и подключены сниппетами |
pytest -m "not slow" # ~20 с, обычная проверка
pytest -m slow -n auto # мутации, несколько минут, перед крупными правками
ruff check tests/ tools/
yamllint -c .yamllint.yaml blueprints/ .github/ .yamllint.yaml mkdocs.yml
mkdocs build --strict # сайт; битая ссылка = падение сборки
# требуют `pip install homeassistant`, обе информационные в CI
python tests/validate_with_home_assistant.py # схема: входы и селекторы
python tests/differential_against_home_assistant.py # правили ha_sim.py — прогнатьЛогика живёт в variables:, блок actions: намеренно тонкий — только исполняет
принятые решения. Это разделение и делает блюпринт тестируемым, держитесь его.
- Порядок объявления переменных значим. HA рендерит
variables:сверху вниз; ссылка на переменную, объявленную ниже, молча даёт пустое значение. - Каждый вызов службы — с
continue_on_error: true. - Никаких блокирующих
delayперед командами. Режимrestart: любой триггер обрывает паузу вместе со всем, что шло после неё. Интервалы выдерживаются проверкой (какgap_elapsed), а не ожиданием. - Новая переменная — новый тест, плюс мутация в
test_mutations.py, если поведение значимое. - Новая функция шаблонов — реализовать в
tests/ha_sim.pyстрого как в настоящем HA, включая отказы. Движок мягче настоящего HA опаснее отсутствующего: тесты зеленеют, в проде ломается. Затем добавить её вызовы вtests/differential_against_home_assistant.pyи прогнать его — иначе у новой реализации не будет эталона, с которым её сверяют.
- HA считает результат шаблона числом только если текст похож на число по его
правилу.
4.9e-05остаётся строкой →TypeErrorв арифметике ниже. Отсюда| round(4)вneeded_kwh. | float/| intбез аргумента по умолчанию в HA бросают исключение, а не возвращают 0.last_changedобновляется и при уходе сущности вunavailable: секундный обрыв связи «омолаживает» выключатель до нуля.- Недоступная сущность ≠ выключенная. Разрушительный вывод («выключили», «чужая», «сломалась») делается только по подтверждённому состоянию.
- Запись того же значения не порождает
state_changed— триггеры состояния не сработают.
Версия живёт в одном месте — в описании блюпринта (Версия X.Y.Z).
CI-джоба packaging сверяет её с CHANGELOG.md и с git-тегом. Теги без
префикса v: 1.3.0.
- Не переименовывать и не удалять входы (
input:) без мажорной версии — это сбрасывает настройку у всех, кто уже пользуется блюпринтом. - Не называть конкретные марки машин и станций в описаниях входов.