OpenWonderLabs / python-host

The python code running on Raspberry Pi or other Linux based boards to control SwitchBot.
Apache License 2.0
379 stars 84 forks source link

Can't send "Press" to Bot #40

Open tojannaon opened 2 years ago

tojannaon commented 2 years ago

Current Situation

Although the same Bot can be controlled successfully via the app no response occurs when using sudo python switchbot.py. Note that the device is discovered and connects just fine. It's just that nothing happens on the Bot (no Press).

After many hours of trying various methods to send this command via BLE I have come to the conclusion that this recent firmware has changed the command structure as even this simple script will not work:

https://gist.github.com/mugifly/a29f34df7de8960d72245fcb124513c7

Logs

pi@raspberrypi:/python-host $ sudo python switchbot.py
Usage: "sudo python switchbot.py [mac dev_type cmd]" or "sudo python switchbot.py"
Scanning...
Scan timeout.
(' 0', [u'd9:31:3b:81:03:56', 'Bot', 'Press'])
Input the device number to control:0
[u'd9:31:3b:81:03:56', 'Bot', 'Press']
Preparing to connect.
Connection successful.
Complete

Configuration

Bot firmware version 6.3

Environment

Additional Context

No response

reestr commented 1 year ago

I seem to have this same issue. I've never been able to try an earlier firmware to confirm if that works, my switchbot turned up with 6.3 installed. Did you ever find a workaround for it @tojannaon ?

dcarrion87 commented 1 year ago

@tojannaon @reestr

Can you guys can any commands to send including on/off?

I'm on bot version 5.0 and I just get invalid handle errors from gatt.

# gatttool -t random -b XX:XX:XX:XX:XX:XX --char-write-req -a 0x0016 -n 570101
Characteristic Write Request failed: Invalid handle

# gatttool -t random -b XX:XX:XX:XX:XX:XX --char-write-req -a 0x0016 -n 570102
Characteristic Write Request failed: Invalid handle
dcarrion87 commented 1 year ago

@reestr try this project instead: https://github.com/Danielhiversen/pySwitchbot

I was only able to get it working through that project.

E.g.:

from switchbot import Switchbot
from bleak import BleakScanner
import asyncio

async def main():
  ble_device = await BleakScanner.find_device_by_address("MAC ADDRESS", timeout=20)
  device = Switchbot(ble_device)
  await device.press()

if __name__ == "__main__":
  asyncio.run(main())

You can also set change mode with:

await device.set_switch_mode()
await device.set_long_press(7)
TForest-UwU commented 1 year ago

Hello,

i have the same issue as @tojannaon, however i the software @dcarrion87 provided gives me this error

Traceback (most recent call last): File "", line 1, in ModuleNotFoundError: No module named 'switchbot'

I have cloned the git through git clone however i cant seem to find a solution to both these problems.

I am using switchbot version 6.3 and a raspberry pi 3 on the raspbian OS

dcarrion87 commented 1 year ago

@TForest-UwU have you:

pip install PySwitchbot

Also you'll need these pip packages too. But they should come down with that one ^

async_timeout>=4.0.1
bleak>=0.17.0
bleak-retry-connector>=2.9.0
cryptography>=38.0.3
boto3>=1.20.24
requests>=2.28.1
TForest-UwU commented 1 year ago

Yes i retried it and it seemed i also had a outdated pip installation, however the program fails to build cryptography with this error

note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed building wheel for cryptography Failed to build cryptography ERROR: Could not build wheels for cryptography, which is required to install pyproject.toml-based projects

the rest of the packages seem to all have installed correctly

dcarrion87 commented 1 year ago

Create a virtual environment first and work in there so you don't mess with your system wide pip packages.

python -m venv venv
. venv/bin/activate

Then do your pip things.

You might need to do some googling of that error to make sure you have build-essentials, upgrade pip version, downgrade setuptools if necessary etc... (I've not be doing this from raspbian).

Maybe apt-get install build-essentials and a pip3 install --upgrade pip might get you going.

tojannaon commented 1 year ago

@reestr Sorry for not chiming in earlier. I ended up having to bail as the Switchbot folks felt that the Bluetooth LE dongle that I was using (expensive and state-of-the-art) was somehow not compatible (even though it works for other applications). I didn't have another to try and wasn't about to purchase one in case there actually were other issues causing the problem.

TForest-UwU commented 1 year ago

If anyone is still having issues check out https://github.com/TForest-UwU/Switchy

I found out that atleast for me this api does not send the command properly, but it does connect nicely. I then found another api that does the exact opposite, so i combined then into a working program

reestr commented 1 year ago

@TForest-UwU - thank you for following up with this, despite reporting an error after each press of the switch, it works as expected! :-)