seems to work
This commit is contained in:
@@ -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.)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user