Skip to content

bug: promotion switch→light/fan/climate ломает управление (hardcoded HA domain) #33

Description

@dzerik

Описание

При override'е категории через entity_type_overrides / YAML / wizard в стиле switch → light (или switch → fan, switch → climate и т.д.) Sber принимает конфиг устройства без ошибок, но команды с облака в HA не проходят — пользователь видит, что «устройство появилось, но не реагирует».

Это проявляется в issue #32:

Попробовал подключится с сущьностью Light (как будто не розетка а лампочка), Сбер принял сущность без ошибок правда на управление (вкл/выкл) никак не реагирует

Воспроизведение

  1. Завести switch.my_outlet (обычный HA switch без brightness/color).
  2. В настройках интеграции поставить override категории: switch.my_outletlight.
  3. Мост создаёт LightEntity, публикует схему — Sber принимает.
  4. В приложении Сбер нажать «Включить» → HA ничего не делает.

Корневая причина

custom_components/sber_mqtt_bridge/sber_entity_map.py:441:

entity = spec.cls(entity_data)   # → LightEntity, ClimateEntity, FanEntity, ...

Класс целевой категории инстанцируется, но в process_cmd он захардкожен на «свой» HA-домен:

light.py:308:

return [self._build_on_off_service_call(self.entity_id, \"light\", on)]

light.turn_on(entity_id=\"switch.my_outlet\") — HA отклоняет, такого entity нет.

Затронутые классы

Захардкоженный HA-домен в process_cmd:

  • LightEntity\"light\"
  • LedStripEntity\"light\"
  • ClimateEntity / HvacRadiatorEntity / HvacHeaterEntity / HvacUnderfloorEntity\"climate\"
  • HvacFanEntity, HvacAirPurifierEntity\"fan\"
  • HumidifierEntity\"humidifier\"
  • TvEntity\"media_player\"
  • CurtainEntity, GateEntity, WindowBlindEntity\"cover\"
  • VacuumCleanerEntity\"vacuum\"
  • KettleEntity, HvacBoilerEntity\"water_heater\"

Устойчив к promotion:

  • RelayEntity — берёт домен из self.entity_id.split(\".\", 1)[0].

Варианты фикса

A. Жёсткая валидация в create_sber_entity. Если sber_category не совпадает с естественным HA-доменом по CATEGORY_DOMAIN_MAP, возвращать None + WARN. Чисто, но ломает существующих пользователей, которые уже сделали частично-рабочий override (например switch → socket).

B. Dynamic HA-домен в классах. Заменить hardcoded \"light\" и т.д. на domain = self.entity_id.split(\".\", 1)[0] — как в RelayEntity. Частично поможет (on_off вообще), но команды вида brightness/color/climate setpoint всё равно не пройдут в switch.

C. Ограничить OVERRIDABLE_CATEGORIES. Оставить override только для случаев с совместимыми командами (sensor_temp ↔ sensor_humidity, hvac_radiator ↔ hvac_heater и т.п.). Кросс-доменный override запретить в UI.

Предпочитаемый: комбинация A + C — строгая валидация совместимости + узкий список разрешённых override'ов.

Acceptance criteria

  • Создание LightEntity из switch.xxx через override отклоняется с warning'ом.
  • Wizard не предлагает cross-domain override'ы для switch (light/fan/climate/...).
  • Тесты в test_sber_entity_map.py покрывают cross-domain override'ы и проверяют отказ.

Связанные

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions