Перейти к содержанию

Entity Map

Фабрики маппинга: связь HA domain и entity_id с соответствующими классами устройств Sber.

Mapping from HA entity domains to Sber device entity classes.

Provides factory functions that create the appropriate Sber entity subclass based on the HA entity domain and device class. Supports user-defined overrides via sber_category parameter.

CATEGORY_CONSTRUCTORS module-attribute

CATEGORY_CONSTRUCTORS = {'light': lambda data: LightEntity(data), 'led_strip': lambda data: LedStripEntity(data), 'relay': lambda data: RelayEntity(data), 'socket': lambda data: SocketEntity(data), 'curtain': lambda data: CurtainEntity(data), 'window_blind': lambda data: WindowBlindEntity(data), 'gate': lambda data: GateEntity(data), 'hvac_ac': lambda data: ClimateEntity(data), 'hvac_radiator': lambda data: HvacRadiatorEntity(data), 'hvac_heater': lambda data: HvacHeaterEntity(data), 'hvac_boiler': lambda data: HvacBoilerEntity(data), 'hvac_underfloor_heating': lambda data: HvacUnderfloorEntity(data), 'hvac_fan': lambda data: HvacFanEntity(data), 'valve': lambda data: ValveEntity(data), 'hvac_humidifier': lambda data: HumidifierEntity(data), 'scenario_button': lambda data: ScenarioButtonEntity(data), 'sensor_temp': lambda data: SensorTempEntity(data), 'sensor_humidity': lambda data: HumiditySensorEntity(data), 'sensor_pir': lambda data: MotionSensorEntity(data), 'sensor_door': lambda data: DoorSensorEntity(data), 'sensor_water_leak': lambda data: WaterLeakSensorEntity(data), 'sensor_smoke': lambda data: SmokeSensorEntity(data), 'sensor_gas': lambda data: GasSensorEntity(data), 'hvac_air_purifier': lambda data: HvacAirPurifierEntity(data), 'kettle': lambda data: KettleEntity(data), 'tv': lambda data: TvEntity(data), 'vacuum_cleaner': lambda data: VacuumCleanerEntity(data), 'intercom': lambda data: IntercomEntity(data)}

Mapping of Sber category names to entity constructor callables.

OVERRIDABLE_CATEGORIES module-attribute

OVERRIDABLE_CATEGORIES = ['light', 'led_strip', 'relay', 'socket', 'curtain', 'window_blind', 'gate', 'hvac_ac', 'hvac_radiator', 'hvac_heater', 'hvac_boiler', 'hvac_underfloor_heating', 'hvac_fan', 'valve', 'hvac_humidifier', 'scenario_button', 'hvac_air_purifier', 'kettle', 'tv', 'vacuum_cleaner', 'intercom']

Sber categories that users can select as type overrides.

ENTITY_CONSTRUCTORS module-attribute

ENTITY_CONSTRUCTORS = {'light': lambda data: LightEntity(data), 'cover': _create_cover, 'sensor': _create_sensor, 'binary_sensor': _create_binary_sensor, 'switch': _create_switch, 'script': lambda data: RelayEntity(data), 'button': lambda data: RelayEntity(data), 'input_boolean': lambda data: ScenarioButtonEntity(data), 'climate': _create_climate, 'valve': lambda data: ValveEntity(data), 'humidifier': lambda data: HumidifierEntity(data), 'fan': _create_fan, 'water_heater': _create_water_heater, 'media_player': _create_media_player, 'vacuum': lambda data: VacuumCleanerEntity(data)}

Mapping of HA domain names to Sber entity constructor callables.

create_sber_entity

create_sber_entity(entity_id, entity_data, sber_category=None)

Create a Sber device entity from HA entity data.

When sber_category is provided (user override), it takes precedence over the default domain-based mapping.

Parameters:

Name Type Description Default
entity_id str

HA entity ID (e.g., 'light.living_room').

required
entity_data dict

Dict with entity registry data (entity_id, device_id, area_id, etc.)

required
sber_category str | None

Optional Sber category override (e.g., 'light', 'relay').

None

Returns:

Type Description
BaseEntity | None

BaseEntity subclass instance or None if domain not supported.

Source code in custom_components/sber_mqtt_bridge/sber_entity_map.py
def create_sber_entity(
    entity_id: str,
    entity_data: dict,
    sber_category: str | None = None,
) -> BaseEntity | None:
    """Create a Sber device entity from HA entity data.

    When ``sber_category`` is provided (user override), it takes precedence
    over the default domain-based mapping.

    Args:
        entity_id: HA entity ID (e.g., 'light.living_room').
        entity_data: Dict with entity registry data (entity_id, device_id, area_id, etc.)
        sber_category: Optional Sber category override (e.g., 'light', 'relay').

    Returns:
        BaseEntity subclass instance or None if domain not supported.
    """
    # User override takes precedence, but respect device_class for sensors
    if sber_category:
        # For sensor_temp category, pick the right subclass based on device_class
        dc = entity_data.get("original_device_class", "")
        if sber_category == "sensor_temp" and dc == "humidity":
            sber_category = "sensor_humidity"
        constructor = CATEGORY_CONSTRUCTORS.get(sber_category)
        if constructor is not None:
            entity = constructor(entity_data)
            _LOGGER.debug(
                "Entity %s → Sber %s (override)",
                entity_id,
                entity.category,
            )
            return entity
        _LOGGER.warning(
            "Unknown Sber category override '%s' for %s, falling back to domain mapping",
            sber_category,
            entity_id,
        )

    domain = entity_id.split(".")[0]
    constructor = ENTITY_CONSTRUCTORS.get(domain)
    if constructor is None:
        _LOGGER.debug("Unsupported domain for Sber: %s", domain)
        return None
    entity = constructor(entity_data)
    if entity is None:
        _LOGGER.debug(
            "No Sber mapping for entity %s (device_class=%s)", entity_id, entity_data.get("original_device_class", "")
        )
    else:
        _LOGGER.debug(
            "Entity %s → Sber %s (domain=%s, device_class=%s)",
            entity_id,
            entity.category,
            domain,
            entity_data.get("original_device_class", ""),
        )
    return entity