From f1dbd9344d77937765d967319c43cd36987e0085 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Mon, 8 Dec 2025 11:36:17 +0100 Subject: [PATCH] homekit names 2 --- apps/homekit/accessories/contact.py | 5 ++-- apps/homekit/accessories/light.py | 13 +++++----- apps/homekit/accessories/outlet.py | 5 ++-- apps/homekit/accessories/sensor.py | 5 ++-- apps/homekit/accessories/thermostat.py | 5 ++-- apps/homekit/api_client.py | 19 -------------- apps/homekit/device_registry.py | 28 ++------------------ apps/homekit/main.py | 36 +++++--------------------- 8 files changed, 22 insertions(+), 94 deletions(-) diff --git a/apps/homekit/accessories/contact.py b/apps/homekit/accessories/contact.py index bb2ce0a..7f2502b 100644 --- a/apps/homekit/accessories/contact.py +++ b/apps/homekit/accessories/contact.py @@ -14,7 +14,7 @@ class ContactAccessory(Accessory): category = CATEGORY_SENSOR - def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs): + def __init__(self, driver, device, api_client, *args, **kwargs): """ Initialize the contact sensor accessory. @@ -22,9 +22,8 @@ class ContactAccessory(Accessory): driver: HAP driver instance device: Device object from DeviceRegistry api_client: ApiClient for sending commands - display_name: Optional display name (defaults to device.friendly_name) """ - name = display_name or device.friendly_name or device.name + name = device.name super().__init__(driver, name, *args, **kwargs) self.device = device self.api_client = api_client diff --git a/apps/homekit/accessories/light.py b/apps/homekit/accessories/light.py index 6331e30..afb393b 100644 --- a/apps/homekit/accessories/light.py +++ b/apps/homekit/accessories/light.py @@ -16,7 +16,7 @@ class OnOffLightAccessory(Accessory): category = CATEGORY_LIGHTBULB - def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs): + def __init__(self, driver, device, api_client, *args, **kwargs): """ Initialize the light accessory. @@ -24,9 +24,8 @@ class OnOffLightAccessory(Accessory): driver: HAP driver instance device: Device object from DeviceRegistry api_client: ApiClient for sending commands - display_name: Optional display name (defaults to device.friendly_name) """ - name = display_name or device.friendly_name or device.name + name = device.name super().__init__(driver, name, *args, **kwargs) self.device = device self.api_client = api_client @@ -57,9 +56,9 @@ class OnOffLightAccessory(Accessory): class DimmableLightAccessory(OnOffLightAccessory): """Dimmable Light with brightness control.""" - def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs): + def __init__(self, driver, device, api_client, *args, **kwargs): # Don't call super().__init__() yet - we need to set up service first - name = display_name or device.friendly_name or device.name + name = device.name Accessory.__init__(self, driver, name, *args, **kwargs) self.device = device self.api_client = api_client @@ -106,9 +105,9 @@ class DimmableLightAccessory(OnOffLightAccessory): class ColorLightAccessory(DimmableLightAccessory): """RGB Light with full color control.""" - def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs): + def __init__(self, driver, device, api_client, *args, **kwargs): # Don't call super().__init__() - build everything from scratch - name = display_name or device.friendly_name or device.name + name = device.name Accessory.__init__(self, driver, name, *args, **kwargs) self.device = device self.api_client = api_client diff --git a/apps/homekit/accessories/outlet.py b/apps/homekit/accessories/outlet.py index 82ae994..ceab043 100644 --- a/apps/homekit/accessories/outlet.py +++ b/apps/homekit/accessories/outlet.py @@ -15,7 +15,7 @@ class OutletAccessory(Accessory): category = CATEGORY_OUTLET - def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs): + def __init__(self, driver, device, api_client, *args, **kwargs): """ Initialize the outlet accessory. @@ -23,9 +23,8 @@ class OutletAccessory(Accessory): driver: HAP driver instance device: Device object from DeviceRegistry api_client: ApiClient for sending commands - display_name: Optional display name (defaults to device.friendly_name) """ - name = display_name or device.friendly_name or device.name + name = device.name super().__init__(driver, name, *args, **kwargs) self.device = device self.api_client = api_client diff --git a/apps/homekit/accessories/sensor.py b/apps/homekit/accessories/sensor.py index ce6b323..7e9edba 100644 --- a/apps/homekit/accessories/sensor.py +++ b/apps/homekit/accessories/sensor.py @@ -15,7 +15,7 @@ class TempHumidityAccessory(Accessory): category = CATEGORY_SENSOR - def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs): + def __init__(self, driver, device, api_client, *args, **kwargs): """ Initialize the temp/humidity sensor accessory. @@ -23,9 +23,8 @@ class TempHumidityAccessory(Accessory): driver: HAP driver instance device: Device object from DeviceRegistry api_client: ApiClient for sending commands - display_name: Optional display name (defaults to device.friendly_name) """ - name = display_name or device.friendly_name or device.name + name = device.name super().__init__(driver, name, *args, **kwargs) self.device = device self.api_client = api_client diff --git a/apps/homekit/accessories/thermostat.py b/apps/homekit/accessories/thermostat.py index 51e542c..7604da0 100644 --- a/apps/homekit/accessories/thermostat.py +++ b/apps/homekit/accessories/thermostat.py @@ -17,7 +17,7 @@ class ThermostatAccessory(Accessory): category = CATEGORY_THERMOSTAT - def __init__(self, driver, device, api_client, display_name=None, *args, **kwargs): + def __init__(self, driver, device, api_client, *args, **kwargs): """ Initialize the thermostat accessory. @@ -25,9 +25,8 @@ class ThermostatAccessory(Accessory): driver: HAP driver instance device: Device object from DeviceRegistry api_client: ApiClient for sending commands - display_name: Optional display name (defaults to device.friendly_name) """ - name = display_name or device.friendly_name or device.name + name = device.name super().__init__(driver, name, *args, **kwargs) self.device = device self.api_client = api_client diff --git a/apps/homekit/api_client.py b/apps/homekit/api_client.py index d147a36..c6f1693 100644 --- a/apps/homekit/api_client.py +++ b/apps/homekit/api_client.py @@ -50,26 +50,7 @@ class ApiClient: except Exception as e: logger.error(f"Failed to get devices: {e}") raise - - def get_layout(self) -> Dict: - """ - Get layout information (rooms and device assignments). - Returns: - Layout dictionary with room structure - """ - try: - response = httpx.get( - f'{self.base_url}/layout', - headers=self.headers, - timeout=self.timeout - ) - response.raise_for_status() - return response.json() - except Exception as e: - logger.error(f"Failed to get layout: {e}") - raise - def get_device_state(self, device_id: str) -> Dict: """ Get current state of a specific device. diff --git a/apps/homekit/device_registry.py b/apps/homekit/device_registry.py index 04f0bc7..3b5456e 100644 --- a/apps/homekit/device_registry.py +++ b/apps/homekit/device_registry.py @@ -18,8 +18,6 @@ class Device: device_id: str type: str # "light", "thermostat", "relay", "contact", "temp_humidity", "cover" name: str # Short name from /devices - friendly_name: str # Display title from /layout (fallback to name) - room: Optional[str] # Room name from layout features: Dict[str, bool] # Feature flags (e.g., {"power": true, "brightness": true}) read_only: bool # True for sensors that don't accept commands @@ -50,24 +48,7 @@ class DeviceRegistry: """ # Get devices and layout devices_data = api_client.get_devices() - layout_data = api_client.get_layout() - - # Build lookup: device_id -> (room_name, title) - layout_map = {} - if isinstance(layout_data, dict) and 'rooms' in layout_data: - rooms_list = layout_data['rooms'] - if isinstance(rooms_list, list): - for room in rooms_list: - if isinstance(room, dict): - room_name = room.get('name', 'Unknown') - devices_in_room = room.get('devices', []) - for device_info in devices_in_room: - if isinstance(device_info, dict): - device_id = device_info.get('device_id') - title = device_info.get('title', '') - if device_id: - layout_map[device_id] = (room_name, title) - + # Create Device objects devices = [] for dev_data in devices_data: @@ -76,9 +57,6 @@ class DeviceRegistry: logger.warning(f"Device without device_id: {dev_data}") continue - # Get layout info - room_name, title = layout_map.get(device_id, (None, '')) - # Determine if read-only (sensors don't accept set commands) device_type = dev_data.get('type', '') read_only = device_type in ['contact', 'temp_humidity', 'motion', 'smoke'] @@ -86,9 +64,7 @@ class DeviceRegistry: device = Device( device_id=device_id, type=device_type, - name=dev_data.get('name', device_id), - friendly_name=dev_data.get('name', device_id), - room=room_name, + name=device_id, features=dev_data.get('features', {}), read_only=read_only ) diff --git a/apps/homekit/main.py b/apps/homekit/main.py index 9712b1c..cb41fc7 100644 --- a/apps/homekit/main.py +++ b/apps/homekit/main.py @@ -71,14 +71,9 @@ def build_bridge(driver: AccessoryDriver, api_client: ApiClient) -> Bridge: try: accessory = create_accessory_for_device(device, api_client, driver) if accessory: - # Set room information in the accessory (HomeKit will use this for suggestions) - if device.room: - # Store room info for potential future use - accessory._room_name = device.room - bridge.add_accessory(accessory) accessory_map[device.device_id] = accessory - logger.info(f"Added accessory: {device.friendly_name} ({device.type}, {accessory.__class__.__name__}) in room: {device.room or 'Unknown'}") + logger.info(f"Added accessory: {device.name} ({device.type}, {accessory.__class__.__name__})") else: logger.warning(f"No accessory mapping for device: {device.name} ({device.type})") except Exception as e: @@ -90,23 +85,6 @@ def build_bridge(driver: AccessoryDriver, api_client: ApiClient) -> Bridge: logger.info(f"Bridge built with {len(accessory_map)} accessories") return bridge - -def get_accessory_name(device) -> str: - """ - Build accessory name including room information. - - Args: - device: Device object from DeviceRegistry - - Returns: - Name string like "Device Name (Room)" or just "Device Name" if no room - """ - #base_name = device.friendly_name or device.name - #if device.room: - # return f"{base_name} - {device.room}" - return device.name - - def create_accessory_for_device(device, api_client: ApiClient, driver: AccessoryDriver): """ Create appropriate HomeKit accessory based on device type and features. @@ -115,12 +93,11 @@ def create_accessory_for_device(device, api_client: ApiClient, driver: Accessory """ device_type = device.type features = device.features - display_name = get_accessory_name(device) # Light accessories if device_type == "light": if features.get("color_hsb"): - return ColorLightAccessory(driver, device, api_client, display_name=display_name) + return ColorLightAccessory(driver, device, api_client) elif features.get("brightness"): return DimmableLightAccessory(driver, device, api_client, display_name=display_name) else: @@ -128,19 +105,18 @@ def create_accessory_for_device(device, api_client: ApiClient, driver: Accessory # Thermostat elif device_type == "thermostat": - return ThermostatAccessory(driver, device, api_client, display_name=display_name) + return ThermostatAccessory(driver, device, api_client) # Contact sensor elif device_type == "contact": - return ContactAccessory(driver, device, api_client, display_name=display_name) + return ContactAccessory(driver, device, api_client) # Temperature/Humidity sensor elif device_type == "temp_humidity_sensor": - return TempHumidityAccessory(driver, device, api_client, display_name=display_name) - + return TempHumidityAccessory(driver, device, api_client) # Relay/Outlet elif device_type == "relay": - return OutletAccessory(driver, device, api_client, display_name=display_name) + return OutletAccessory(driver, device, api_client) # Cover/Blinds (optional) elif device_type == "cover":