ha(ux): мастер из трёх страниц, feature-модель и capabilities-фильтрация

- config flow: template (A/B/F с пояснениями, значения с устройства,
  определение по oem_model; для неизвестных моделей — пробинг A/B/F тремя
  короткими сессиями) -> capabilities (23 тумблера с описаниями, дефолты
  из device_capabilities/num_dir/ответов) -> limits (диапазон/шаг, ручная
  конверсия); каждая страница с пометкой «значения определены
  автоматически, можно пропустить»
- features.py: FeatureSet/LiveValues/device_default/resolve_features;
  entry.data["features"] хранит выбор пользователя; reconfigure
  предзаполняет; YAML-import получает дефолты
- сущности создаются только для включённых фич: climate (режимы/скорости/
  swing/пресеты), switch, select заслонок (caps+num_dir), датчик комнаты;
  исправлено появление select без ламелей
- trial: caps/num_dir и presence-зонды (необязательные свойства), answered;
  координатор ждёт первые свойства перед созданием сущностей (feature-
  дефолты без гонки)
- атрибут description у сущностей (HA не поддерживает тултипы) + описания
  фич в мастере (en/ru)
- тесты: features, probing, обновлённые flow/entities/repairs; 57 components
This commit is contained in:
2026-09-29 17:39:34 +03:00
parent 4ee428a6fd
commit d1c02d7c4b
20 changed files with 1131 additions and 212 deletions
+9 -2
View File
@@ -11,8 +11,9 @@ from homeassistant.helpers import issue_registry as ir
import pyfglair
from .const import CONF_DSN, DOMAIN
from .const import CONF_DSN, CONF_FEATURES, DOMAIN
from .coordinator import FglairCoordinator, FglairRuntime, key_issue_id
from .features import FeatureSet, LiveValues
from .fglair_client import FglairClient
from .overrides import ConversionSet
@@ -80,8 +81,14 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
finally:
hass.data[DATA_PENDING] -= 1
features = FeatureSet(
explicit=entry.data.get(CONF_FEATURES),
values=LiveValues(coordinator.client.cached),
)
coordinator.features = features
clients[entry.entry_id] = client
entry.runtime_data = FglairRuntime(client, coordinator, conversions)
entry.runtime_data = FglairRuntime(client, coordinator, conversions, features)
if len(clients) == 1:
pyfglair.set_log_handler(_log_handler)
pyfglair.set_log_level(1)