Clase Hub
La clase Hub representa el Smart Hub físico de LEGO WeDo 2.0 y constituye el punto de entrada principal para interactuar con todos los motores, sensores y funciones del dispositivo.
from wedopy import Hub
🏗️ Constructor
Hub(*, transport=None, timing=None)
Crea una instancia de control del Hub.
- Parámetros:
transport(opcional): Implementación del transporte BLE. Por defecto utilizaBleakTransport(comunicación real por Bluetooth). Para pruebas unitarias sin hardware físico se puede proporcionarSimulatedHub.timing(opcional): Instancia deTimingcon parámetros de tiempos de espera y reintentos (usado principalmente en pruebas y entornos de alta latencia).
- Ejemplo:
# Uso estándar con hardware real hub = Hub()
🔄 Ciclo de vida y conexión
connect()
hub.connect() -> Hub
Inicia la búsqueda BLE, conecta con el primer WeDo 2.0 Smart Hub detectado, descubre sus puertos y devuelve la propia instancia de Hub.
disconnect()
hub.disconnect() -> None
Cancela todas las tareas cooperativas en ejecución, solicita la parada de los motores (nobarrier) y cierra limpiamente la conexión BLE. Es seguro llamarlo múltiples veces consecutivas.
shutdown()
hub.shutdown() -> None
Envía la orden de apagado total de energía al hardware. El Smart Hub se apagará y requerirá presionar manualmente su botón físico para volver a encenderse.
stop_all()
hub.stop_all() -> None
Envía una orden inmediata de parada (run(0)) a todos los puertos de motor conocidos.
is_connected
hub.is_connected -> bool
Propiedad que devuelve True si el Hub mantiene una conexión activa, o False en caso contrario.
Uso con Context Manager (Recomendado)
with Hub() as hub:
# El hub se conecta automáticamente al entrar.
hub.motor("A").run(50)
# Al salir del bloque (incluso si ocurre una excepción),
# se garantiza la llamada a disconnect().
🔌 Detección de Puertos y Dispositivos
ports
hub.ports -> dict[str, str]
Propiedad de solo lectura que devuelve una instantánea de los dispositivos externos conectados a los puertos "A" y "B".
Ejemplo de retorno:
{"A": "motor", "B": "distance"}
Valores posibles según el dispositivo: "motor", "motion" (sensor de distancia), "tilt" (sensor de inclinación).
refresh_ports()
hub.refresh_ports() -> dict[str, str]
Solicita al hardware del Hub un nuevo reporte del estado de los puertos y devuelve el diccionario actualizado.
⚙️ Métodos para obtener Dispositivos
motor(port=None)
hub.motor(port=None) -> Motor
Obtiene el objeto controlador del motor.
- Parámetros:
port(str, opcional): Puerto físico ("A"o"B", sin distinción de mayúsculas/minúsculas).
- Comportamiento automático:
- Si se omite
porty hay exactamente un motor conectado, se detecta y devuelve automáticamente. - Lanza
DeviceNotFoundErrorsi no hay motor conectado. - Lanza
DeviceTypeErrorsi el dispositivo conectado en el puerto especificado no es un motor. - Lanza
AmbiguousDeviceErrorsi se omiteportpero hay dos motores conectados a la vez.
- Si se omite
motors(ports)
hub.motors(ports) -> MotorGroup
Crea un grupo de motores sincronizado.
- Parámetros:
ports(secuencia): Tupla o lista de puertos, por ejemplo("A", "B").
distance_sensor(port=None)
hub.distance_sensor(port=None) -> DistanceSensor
Obtiene el sensor de distancia conectado al puerto indicado (o lo autodetecta si solo hay uno).
tilt_sensor(port=None)
hub.tilt_sensor(port=None) -> TiltSensor
Obtiene el sensor de inclinación conectado al puerto indicado (o lo autodetecta si solo hay uno).
💡 Periféricos Integrados
led
hub.led -> LED
Devuelve el objeto para controlar el LED RGB integrado.
button
hub.button -> Button
Devuelve el objeto para consultar el botón físico integrado.
tasks
hub.tasks -> TaskManager
Devuelve el gestor de tareas cooperativas asociado a la sesión de este Hub.