micropython / micropython-lib

Core Python libraries ported to MicroPython
Other
2.3k stars 981 forks source link

"TypeError: can't convert NoneType to int" on Raspberry Pi Pico W with aioble #817

Closed jxpd closed 4 months ago

jxpd commented 4 months ago

I am writing a program for the Raspberry Pi Pico W that sends commands to control the blinkers of a Lumos Kickstart Bluetooth helmet via BLE to later hook it up with the blinkers of my Ninebot e-Scooter.

Device: Raspberry Pi Pico W (sysname='rp2', nodename='rp2', release='1.22.2', version='v1.22.2 on 2024-02-22 (GNU 13.2.0 MinSizeRel)', machine='Raspberry Pi Pico W with RP2040') MicroPython version: 1.22.2 aioble version: 0.4.1 (installed via the package manager in Thonny)

I have managed to send the first command (Blink right) successfully, but every time I intend to send another command with the method await temp_characteristic.write(), I get an error like this with "TypeError: can't convert NoneType to int":

Sent 'blink right' command to LumosHelmet.
Sent 'turn off' command to LumosHelmet.
Traceback (most recent call last):
  File "<stdin>", line 97, in <module>
  File "asyncio/core.py", line 1, in run
  File "asyncio/core.py", line 1, in run_until_complete
  File "asyncio/core.py", line 1, in run_until_complete
  File "<stdin>", line 75, in main
  File "aioble/client.py", line 288, in write
TypeError: can't convert NoneType to int

I must admit that I am still a beginner at python, and I would be thankful if anyone could tell me where the problem lies. Here is the part of the code that causes the problem (in the while True loop):

async def main():
    device = await scan_and_connect()
    if not device:
        print("Lumos Helmet not found.")
        return
    try:
        print("Connecting to ", device)
        connection = await device.connect()
    except asyncio.TimeoutError:
        print("Timeout during connection")
        return

    async with connection:
        try:
            # Get the service and characteristic for the UART Tx
            temp_service = await connection.service(SERVICE_UUID)
            temp_characteristic = await temp_service.characteristic(UART_TX_UUID)
        except asyncio.TimeoutError:
            print("Timeout discovering services/characteristics")
            return

        while True:
            if temp_characteristic is not None:
                # Send the "blink right" command
                await temp_characteristic.write(BLINK_RIGHT_CMD)
                print("Sent 'blink right' command to LumosHelmet.")

                # Sleep a bit            
                await asyncio.sleep_ms(2000)
            else:
                print("Characteristic not found.")

            if temp_characteristic is not None:
                # Send the "turn off" command
                await temp_characteristic.write(TURN_OFF_CMD)
                print("Sent 'turn off' command to LumosHelmet.")
jxpd commented 4 months ago

It seems like the issue is because of the helmet disconnecting after a few seconds from the Raspberry Pi Pico W. Therefore, I will close this issue as it does not seem like it is directly related to aioble.