forked from platypush/platypush
Added bluetooth.set
method, whose execution is delegated to the plugins.
This commit is contained in:
parent
cd219f44c4
commit
4fac110bb8
1 changed files with 47 additions and 2 deletions
|
@ -1,9 +1,11 @@
|
||||||
import base64
|
import base64
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
from queue import Empty, Queue
|
from queue import Empty, Queue
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
from typing import (
|
from typing import (
|
||||||
|
Any,
|
||||||
Collection,
|
Collection,
|
||||||
Dict,
|
Dict,
|
||||||
Final,
|
Final,
|
||||||
|
@ -16,7 +18,10 @@ from typing import (
|
||||||
from typing_extensions import override
|
from typing_extensions import override
|
||||||
|
|
||||||
from platypush.context import get_bus, get_plugin
|
from platypush.context import get_bus, get_plugin
|
||||||
from platypush.entities import EntityManager, get_entities_engine
|
from platypush.entities import (
|
||||||
|
EnumSwitchEntityManager,
|
||||||
|
get_entities_engine,
|
||||||
|
)
|
||||||
from platypush.entities.bluetooth import BluetoothDevice, BluetoothService
|
from platypush.entities.bluetooth import BluetoothDevice, BluetoothService
|
||||||
from platypush.message.event.bluetooth import (
|
from platypush.message.event.bluetooth import (
|
||||||
BluetoothScanPausedEvent,
|
BluetoothScanPausedEvent,
|
||||||
|
@ -32,7 +37,8 @@ from ._types import RawServiceClass
|
||||||
from ._manager import BaseBluetoothManager
|
from ._manager import BaseBluetoothManager
|
||||||
|
|
||||||
|
|
||||||
class BluetoothPlugin(RunnablePlugin, EntityManager):
|
# pylint: disable=too-many-ancestors
|
||||||
|
class BluetoothPlugin(RunnablePlugin, EnumSwitchEntityManager):
|
||||||
"""
|
"""
|
||||||
Plugin to interact with Bluetooth devices.
|
Plugin to interact with Bluetooth devices.
|
||||||
|
|
||||||
|
@ -252,6 +258,12 @@ class BluetoothPlugin(RunnablePlugin, EntityManager):
|
||||||
Get a device by its address or name, and scan for it if it's not
|
Get a device by its address or name, and scan for it if it's not
|
||||||
cached.
|
cached.
|
||||||
"""
|
"""
|
||||||
|
# If device is a compound entity ID in the format
|
||||||
|
# ``<mac_address>:<service>``, then split the MAC address part
|
||||||
|
m = re.match(r'^(([0-9a-f]{2}:){6}):.*', device, re.IGNORECASE)
|
||||||
|
if m:
|
||||||
|
device = m.group(1).rstrip(':')
|
||||||
|
|
||||||
dev = self._device_cache.get(device)
|
dev = self._device_cache.get(device)
|
||||||
if dev:
|
if dev:
|
||||||
return dev
|
return dev
|
||||||
|
@ -448,6 +460,39 @@ class BluetoothPlugin(RunnablePlugin, EntityManager):
|
||||||
connect_timeout=connect_timeout,
|
connect_timeout=connect_timeout,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@override
|
||||||
|
@action
|
||||||
|
def set(self, entity: str, value: Any, **_):
|
||||||
|
"""
|
||||||
|
Set the value of an entity.
|
||||||
|
|
||||||
|
This is currently only supported for Switchbot devices, where the value
|
||||||
|
can be one among ``on``, ``off`` and ``press``.
|
||||||
|
|
||||||
|
:param entity: The entity to set the value for. It can be the full
|
||||||
|
entity ID in the format ``<mac-address>::<service>``, or just
|
||||||
|
the MAC address if the plugin supports it.
|
||||||
|
:param value: The value to set the entity to.
|
||||||
|
"""
|
||||||
|
device = self._get_device(entity)
|
||||||
|
matching_plugin = next(
|
||||||
|
iter(
|
||||||
|
plugin
|
||||||
|
for manager in self._managers.values()
|
||||||
|
for plugin in manager.plugins
|
||||||
|
if plugin.supports_device(device)
|
||||||
|
),
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert (
|
||||||
|
matching_plugin is not None
|
||||||
|
), f'Action `set` not supported on device {entity}'
|
||||||
|
|
||||||
|
method = getattr(matching_plugin, 'set', None)
|
||||||
|
assert method, f'The plugin {matching_plugin} does not support `set`'
|
||||||
|
return method(device, value)
|
||||||
|
|
||||||
@action
|
@action
|
||||||
def send_file(
|
def send_file(
|
||||||
self,
|
self,
|
||||||
|
|
Loading…
Reference in a new issue