Skip to content

Commit f7c934a

Browse files
Исправления по третей ночи настоящего использования
1 parent 2563be9 commit f7c934a

21 files changed

Lines changed: 974 additions & 62 deletions

.github/workflows/ci.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,12 @@ jobs:
7272

7373
# Corrupts one part of the blueprint at a time and asserts the suite
7474
# notices. A green suite that survives a mutation is a vacuous suite.
75+
#
76+
# One full suite run per mutation, so this is the long job: serial it is
77+
# about half an hour. The mutations are independent and each xdist worker
78+
# gets its own sandbox copy, so `-n auto` parallelises them safely.
7579
- name: Verify the suite detects a broken blueprint
76-
run: pytest -v -m slow
80+
run: pytest -v -m slow -n auto
7781

7882
ruff:
7983
name: Python lint

CHANGELOG.md

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,71 @@
33
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/),
44
версионирование — [семантическое](https://semver.org/lang/ru/).
55

6-
## Не выпущено
6+
## [1.4.0] — 2026-08-04
77

8-
Документация и инфраструктура; логика блюпринта не менялась, поэтому версия
9-
осталась прежней.
8+
Третья ночь на реальном железе. Машина зарядилась до 100 %, но полчаса в начале
9+
пропали впустую, а под утро регулятор гнал ток с 13 до 28 А за шесть минут.
10+
11+
### Исправлено
12+
13+
- **Потерянная команда включения больше не стоит полчаса.** В 23:06 команда
14+
`switch.turn_on` ушла в станцию, и станция её проглотила: выключатель остался
15+
`off`. Промах команды не порождает события состояния, а все триггеры блюпринта
16+
были либо часами, либо изменением чужой сущности — поэтому повтор случился
17+
только на очередном пересчёте в 23:30, через **24 минуты**. Добавлен триггер
18+
`command_missed`: выключатель, пролежавший в `off` дольше паузы между
19+
командами, поднимает прогон, и включение повторяется в следующую минуту.
20+
- **Потерянная запись уставки тоже больше не стоит полчаса.** Тем же способом
21+
станция теряла и уставку: `11 → 12` писалось в 23:30, 00:00 и 00:30,
22+
подействовала только третья запись (возраст уставки при этом рос
23+
4761 → 6561 → 8361 с — она не менялась). То же с `13 → 16` в 03:00 и 03:30.
24+
Добавлен триггер `setpoint_stale` на застоявшуюся уставку. Ждёт вдвое дольше
25+
паузы между командами, иначе срабатывал бы на каждой нормальной записи.
26+
- **Обрыв связи больше не выглядит как «машина уехала».** Признак физического
27+
присутствия («ток идёт — значит машина на месте») проверял выключатель
28+
условием «не включён», а недоступный выключатель под это подходит. В третью
29+
ночь трекер четыре часа врал `not_home` из-за дрейфа GPS — ровно тот случай,
30+
ради которого признак и заведён, — и одного секундного обрыва хватило, чтобы
31+
«машина уехала» стало правдой при живых 2616 Вт на сенсоре мощности. Зарядку
32+
тогда спасло лишь то, что в тот же миг была недоступна и сама станция.
33+
Теперь, как и в остальных местах после 1.3.0, разрушительный вывод делается
34+
только по **подтверждённо выключенному** выключателю.
35+
- **Недодача тока больше не выдумывается на ровном месте.** Сенсор тока станции
36+
обновляется с задержкой: под утро он стоял на 11.669 А целых семь минут, пока
37+
мощность росла 2592 → 5683 Вт, и «недодача» насчитывалась до 16 А. Теперь
38+
величина считается только на установившемся режиме — все завышенные значения
39+
в трассировках пришлись ровно на свежую уставку.
40+
41+
### Добавлено
42+
43+
- **«Запас по току, %»** (по умолчанию 10). Станция почти всегда выдаёт меньше
44+
заказанного: на уставке 11 А шло 9.9 А. Планировщик считал по уставке и весь
45+
вечер отставал незаметно для себя — пока до конца окна далеко, недобор делится
46+
на большой остаток времени и тонет в шаге тока. К утру остаток сжимался,
47+
и тот же недобор требовал разгона до максимума за минуты. Запас поднимает ток
48+
с самого начала, и к утру он плавно снижается вместо рывка. Потолок тока
49+
запас не пробивает.
50+
51+
Реализован множителем, а не прибавкой: прибавка сравнивалась бы с уставкой
52+
в зоне нечувствительности и переписывала бы её на каждом пересчёте.
53+
- **«Не повышать ток начиная с заряда, %»** (по умолчанию 95). На последних
54+
процентах BMS сам ограничивает приём, и лишний заказанный ток уже не ускоряет
55+
зарядку, а греет батарею. Выше порога уставку можно только снижать. `100`
56+
выключено. Не действует при недостоверных данных о заряде, в мороз и при
57+
аварийной дозарядке — там ток нужен весь.
1058

1159
### Изменено
1260

61+
- **Описание параметра «КПД зарядки» дополнено формулой расчёта.** Раньше
62+
предлагались только ориентиры «зимой 80–85, летом 90–93», а подобрать своё
63+
число было не из чего. Теперь описано, какие два измерения нужны и как из них
64+
посчитать КПД, и явно разделено, что относится к КПД, а что — к недодаче
65+
станции (для неё появился отдельный параметр).
66+
- **Мутационный прогон распараллелен.** Каждая мутация требует отдельного
67+
запуска всего набора, поэтому семь десятков мутаций подряд занимали около
68+
получаса. Мутации независимы, и каждый воркер работает в своей копии
69+
репозитория, поэтому `pytest -m slow -n auto` даёт несколько минут вместо
70+
получаса. Добавлена зависимость `pytest-xdist`, CI обновлён.
1371
- **Документация переехала на сайт**[saippuakauppias.github.io/ha-ev-smart-charging](https://saippuakauppias.github.io/ha-ev-smart-charging/).
1472
README похудел с 743 строк до сотни: он остался витриной, а подробности
1573
разложены по разделам с поиском и навигацией. `IDEAS.md` и `docs/EXAMPLES.md`
@@ -524,6 +582,7 @@
524582
только когда максимум не делится на дискретность (например 28 А при шаге 5 А).
525583
Обнаружено мутационным тестированием.
526584

585+
[1.4.0]: https://github.com/saippuakauppias/ha-ev-smart-charging/compare/v1.3.0...v1.4.0
527586
[1.3.0]: https://github.com/saippuakauppias/ha-ev-smart-charging/compare/v1.2.1...v1.3.0
528587
[1.2.1]: https://github.com/saippuakauppias/ha-ev-smart-charging/compare/v1.2.0...v1.2.1
529588
[1.2.0]: https://github.com/saippuakauppias/ha-ev-smart-charging/compare/v1.1.0...v1.2.0

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
```bash
2525
pytest -m "not slow" # ~20 с, обычная проверка
26-
pytest -m slow # мутации, ~30 мин, перед крупными правками
26+
pytest -m slow -n auto # мутации, несколько минут, перед крупными правками
2727
ruff check tests/ tools/
2828
yamllint -c .yamllint.yaml blueprints/ .github/ .yamllint.yaml mkdocs.yml
2929
mkdocs build --strict # сайт; битая ссылка = падение сборки

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252

5353
```bash
5454
pytest -m "not slow"
55-
pytest -m slow
55+
pytest -m slow -n auto
5656
ruff check tests/ tools/
5757
yamllint -c .yamllint.yaml blueprints/ .github/ .yamllint.yaml
5858
```

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ Home Assistant:
8585
```bash
8686
pip install -r requirements-dev.txt
8787
pytest -m "not slow" # весь набор кроме мутаций, около 15 секунд
88-
pytest -m slow # мутационное тестирование, около 10 минут
88+
pytest -m slow -n auto # мутационное тестирование, несколько минут
8989
```
9090

9191
Подробнее — [про устройство тестов](https://saippuakauppias.github.io/ha-ev-smart-charging/development/)

0 commit comments

Comments
 (0)