seems to work

This commit is contained in:
2025-11-17 11:36:19 +01:00
parent d0b5184270
commit aaee480e57
11 changed files with 790 additions and 17 deletions

View File

@@ -1,8 +1,34 @@
"""
HomeKit Bridge Main Module
Implementiert eine HAP-Python Bridge, die Geräte über die REST-API lädt
und über HomeKit verfügbar macht.
Für detaillierte Implementierungsanweisungen, Tests und Deployment-Informationen
siehe README.md in diesem Verzeichnis.
"""
import os
import logging
import signal
import sys
import threading
from typing import Optional
from pyhap.accessory_driver import AccessoryDriver
from pyhap.accessory import Bridge
from .accessories.light import (
OnOffLightAccessory,
DimmableLightAccessory,
ColorLightAccessory,
)
from .accessories.thermostat import ThermostatAccessory
from .accessories.contact import ContactAccessory
from .accessories.sensor import TempHumidityAccessory
from .accessories.outlet import OutletAccessory
from .api_client import ApiClient
from .device_registry import DeviceRegistry
# Configure logging
logging.basicConfig(
@@ -45,9 +71,14 @@ 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})")
logger.info(f"Added accessory: {device.friendly_name} ({device.type}) in room: {device.room or 'Unknown'}")
else:
logger.warning(f"No accessory mapping for device: {device.name} ({device.type})")
except Exception as e:
@@ -60,6 +91,22 @@ def build_bridge(driver: AccessoryDriver, api_client: ApiClient) -> Bridge:
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 base_name
def create_accessory_for_device(device, api_client: ApiClient, driver: AccessoryDriver):
"""
Create appropriate HomeKit accessory based on device type and features.
@@ -68,36 +115,38 @@ 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)
return ColorLightAccessory(driver, device, api_client, display_name=display_name)
elif features.get("brightness"):
return DimmableLightAccessory(driver, device, api_client)
return DimmableLightAccessory(driver, device, api_client, display_name=display_name)
else:
return OnOffLightAccessory(driver, device, api_client)
return OnOffLightAccessory(driver, device, api_client, display_name=display_name)
# Thermostat
elif device_type == "thermostat":
return ThermostatAccessory(driver, device, api_client)
return ThermostatAccessory(driver, device, api_client, display_name=display_name)
# Contact sensor
elif device_type == "contact":
return ContactAccessory(driver, device, api_client)
return ContactAccessory(driver, device, api_client, display_name=display_name)
# Temperature/Humidity sensor
elif device_type == "temp_humidity":
return TempHumidityAccessory(driver, device, api_client)
elif device_type == "temp_humidity_sensor":
return TempHumidityAccessory(driver, device, api_client, display_name=display_name)
# Outlet/Switch
elif device_type == "outlet":
return OutletAccessory(driver, device, api_client)
# Relay/Outlet
elif device_type == "relay":
return OutletAccessory(driver, device, api_client, display_name=display_name)
# Cover/Blinds (optional)
elif device_type == "cover":
# TODO: Implement CoverAccessory based on homekit_mapping.md
return CoverAccessory(driver, device, api_client)
logger.warning(f"Cover accessory not yet implemented for {device.name}")
return None
# TODO: Add more device types as needed (lock, motion, etc.)