Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 10 additions & 21 deletions src/bluetooth_sig/device/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from ..gatt.characteristics import CharacteristicName
from ..gatt.context import CharacteristicContext, DeviceInfo
from ..gatt.services import GattServiceRegistry, ServiceName
from ..gatt.services.base import BaseGattService
from ..gatt.services.base import UnknownService
from ..types import (
BLEAdvertisementTypes,
BLEAdvertisingPDU,
Expand All @@ -29,7 +29,7 @@
from ..types.data_types import CharacteristicData
from ..types.device_types import DeviceEncryption, DeviceService
from ..types.gatt_enums import GattProperty
from ..types.gatt_services import CharacteristicCollection
from ..types.uuid import BluetoothUUID
from .advertising_parser import AdvertisingParser
from .connection import ConnectionManagerProtocol

Expand Down Expand Up @@ -65,18 +65,6 @@ def get_characteristic_info_by_name(self, name: CharacteristicName) -> Any | Non
"""Get characteristic info by enum name (optional method)."""


class UnknownService(BaseGattService):
"""Generic service for unknown/unsupported UUIDs."""

@classmethod
def get_expected_characteristics(cls) -> CharacteristicCollection:
return {}

@classmethod
def get_required_characteristics(cls) -> CharacteristicCollection:
return {}


def _is_uuid_like(value: str) -> bool:
"""Check if a string looks like a Bluetooth UUID."""
# Remove dashes and check if it's a valid hex string of UUID length
Expand Down Expand Up @@ -124,15 +112,16 @@ def add_service(self, service_name: str | ServiceName, characteristics: dict[str
service_uuid = self.translator.get_service_uuid(service_name)

if not service_uuid:
# Fallback to unknown service if UUID not found
service: BaseGattService = UnknownService()
device_service = DeviceService(service=service, characteristics={})
self.services[service_name if isinstance(service_name, str) else service_name.value] = device_service
return
# No UUID found - this is an error condition
service_name_str = service_name if isinstance(service_name, str) else service_name.value
raise ValueError(
f"Cannot resolve service UUID for '{service_name_str}'. "
"Service name not found in registry and not a valid UUID format."
)

service_class = GattServiceRegistry.get_service_class(service_uuid)
if not service_class:
service = UnknownService()
service = UnknownService(uuid=BluetoothUUID(service_uuid))
else:
service = service_class()

Expand Down Expand Up @@ -553,7 +542,7 @@ async def discover_services(self) -> dict[str, Any]:
service_uuid = service_info.uuid
if service_uuid not in self.services:
# Create a service instance - we'll use UnknownService for undiscovered services
service_instance = UnknownService()
service_instance = UnknownService(uuid=BluetoothUUID(service_uuid))
device_service = DeviceService(service=service_instance, characteristics={})
self.services[service_uuid] = device_service

Expand Down
2 changes: 0 additions & 2 deletions src/bluetooth_sig/gatt/services/automation_io.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@

from __future__ import annotations

from dataclasses import dataclass
from typing import ClassVar

from ..characteristics.registry import CharacteristicName
from .base import BaseGattService


@dataclass
class AutomationIOService(BaseGattService):
"""Automation IO Service implementation.

Expand Down
Loading