概要
macOSにて下記コードを動かした際、ToioCoreCube.disconnect() を呼んでも切断が実行されないようでした。
おそらく、bleakのバージョンが1.0.0に上がった際の変更に関連しているかと思います。(詳しくは後述します)
再現コード
import asyncio
from toio import ToioCoreCube
async def scan_and_connect():
cube = ToioCoreCube()
await cube.scan()
await cube.connect()
print("connnected")
await asyncio.sleep(3)
await cube.disconnect()
print("disconnnected") # このタイミングでは切断されない
await asyncio.sleep(3)
# コードの終了時に切断される
if __name__ == "__main__":
asyncio.run(scan_and_connect())
動作環境
Python: 3.11.3
OS: macOS 15.6.1
toio.py: 1.1.0
bleak: 1.1.0
調査結果
確認したところ、接続後もBleCube.connectedがFalseとなっているようでした。(下記のwarningが出ていました)
https://github.com/toio/toio.py/blob/main/toio/device_interface/ble.py#L99
cubeへの接続時にBleakClient.connect()の返り値がBleCube.connectedに代入されますが、
https://github.com/toio/toio.py/blob/main/toio/device_interface/ble.py#L86
bleakがバージョン1.0.0でBleakClient.connect()の返り値をNoneに固定しており、この影響で常にBleCube.connectedがFalseに評価されているようです。
hbldh/bleak@28e4f53
BleakClient.connect()の返り値ではなく、BleakClient.is_connectedを使用するか、BleakClient.connect()でexceptionが出ない場合は常にTrueとして更新する形が良いかと思いました。
以上になります。ご確認よろしくお願いいたします。