Описание
При override'е категории через entity_type_overrides / YAML / wizard в стиле switch → light (или switch → fan, switch → climate и т.д.) Sber принимает конфиг устройства без ошибок, но команды с облака в HA не проходят — пользователь видит, что «устройство появилось, но не реагирует».
Это проявляется в issue #32:
Попробовал подключится с сущьностью Light (как будто не розетка а лампочка), Сбер принял сущность без ошибок правда на управление (вкл/выкл) никак не реагирует
Воспроизведение
- Завести
switch.my_outlet (обычный HA switch без brightness/color).
- В настройках интеграции поставить override категории:
switch.my_outlet → light.
- Мост создаёт
LightEntity, публикует схему — Sber принимает.
- В приложении Сбер нажать «Включить» → 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:
Устойчив к 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
Связанные
Описание
При override'е категории через
entity_type_overrides/ YAML / wizard в стилеswitch → light(илиswitch → fan,switch → climateи т.д.) Sber принимает конфиг устройства без ошибок, но команды с облака в HA не проходят — пользователь видит, что «устройство появилось, но не реагирует».Это проявляется в issue #32:
Воспроизведение
switch.my_outlet(обычный HA switch без brightness/color).switch.my_outlet→light.LightEntity, публикует схему — Sber принимает.Корневая причина
custom_components/sber_mqtt_bridge/sber_entity_map.py:441:Класс целевой категории инстанцируется, но в
process_cmdон захардкожен на «свой» HA-домен:light.py:308:→
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'ом.light/fan/climate/...).test_sber_entity_map.pyпокрывают cross-domain override'ы и проверяют отказ.Связанные