From a156c46015dc873ee55e28e7bd0a37368dd8fcb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Fr=C4=85tczak?= Date: Fri, 10 Nov 2023 23:30:00 +0100 Subject: [PATCH] add read mode --- api.py | 50 +++++++++++++++++++++++++------------------- headwind/__init__.py | 30 ++++++++++++++++++++------ headwind/spec.py | 14 ++++++++++++- 3 files changed, 65 insertions(+), 29 deletions(-) diff --git a/api.py b/api.py index 97729c3..c239878 100755 --- a/api.py +++ b/api.py @@ -5,42 +5,48 @@ from headwind import Headwind as Headwind app = Flask(__name__) app.config.from_prefixed_env() -@app.route("/on") +@app.route("/on", methods=["POST"]) async def on(): fan = Headwind(app, app.config["ADDRESS"]) - fan_status = await fan.on() + fan_status = await fan.writeOn() if not fan_status: - return "

Failed to turn headwind on

", 503 - return "

Turning headwind on

", 200 + return "Failed to turn headwind on", 503 + return "Turning headwind on", 200 -@app.route("/sleep") +@app.route("/sleep", methods=["POST"]) async def sleep(): fan = Headwind(app, app.config["ADDRESS"]) - fan_status = await fan.sleep() + fan_status = await fan.writeSleep() if not fan_status: - return "

Failed to put headwind to sleep

", 503 - return "

Putting headwind to sleep

", 200 + return "Failed to put headwind to sleep", 503 + return "Putting headwind to sleep", 200 -@app.route("/speed/") +@app.route("/speed/", methods=["POST"]) async def speed(speed): fan = Headwind(app, app.config["ADDRESS"]) - fan_status = await fan.manualSpeed(speed) + fan_status = await fan.writeSpeed(speed) if not fan_status: - return f"

Failed to set headwind speed to {speed}

", 503 - return f"

Setting headwind speed to {speed}

", 200 + return f"Failed to set headwind speed to {speed}", 503 + return f"Setting headwind speed to {speed}", 200 -@app.route("/hr") -async def hr(): +@app.route("/speed", methods=["GET"]) +async def getSpeed(): fan = Headwind(app, app.config["ADDRESS"]) - fan_status = await fan.hr() - if not fan_status: - return "

Failed to set headwind to HR mode

", 503 - return "

Setting headwind to HR mode

", 200 + speed = await fan.readSpeed() + return f"{speed}", 200 -@app.route("/off") -async def off(): +@app.route("/hr", methods=["POST"]) +async def writeHr(): + fan = Headwind(app, app.config["ADDRESS"]) + fan_status = await fan.writeHr() + if not fan_status: + return "Failed to set headwind to HR mode", 503 + return "Setting headwind to HR mode", 200 + +@app.route("/off", methods=["POST"]) +async def writeOff(): fan = Headwind(app, app.config["ADDRESS"]) fan_status = await fan.off() if not fan_status: - return "

Failed to turn headwind off

", 503 - return "

Turning headwind off

", 200 \ No newline at end of file + return "Failed to turn headwind off", 503 + return "Turning headwind off", 200 \ No newline at end of file diff --git a/headwind/__init__.py b/headwind/__init__.py index a2cb260..c5778df 100644 --- a/headwind/__init__.py +++ b/headwind/__init__.py @@ -11,6 +11,8 @@ MIN_SPEED = [0x2, 0x1] HALF_SPEED = [0x2, 0x32] FULL_SPEED = [0x2, 0x64] CHARACTERISTIC = "a026e038-0a7d-4ab3-97fa-f1500f9feb8b" +# > read the above characteristic 0xFD-01-XX-04 where XX is speed +# > bytearray(b'\xfd\x01\x00\x01') class Headwind: fanClient = None @@ -19,7 +21,23 @@ class Headwind: self.flaskApp = flaskApp self.fanClient = BleakClient(address) - async def sleep(self): + async def readSpeed(self): + try: + async with self.fanClient as client: + result = await client.read_gatt_char(CHARACTERISTIC) + return result[2] + except Exception: + return 0 + + async def readMode(self): + try: + async with self.fanClient as client: + result = await client.read_gatt_char(CHARACTERISTIC) + return result[3] # Return state code + except Exception: + return 0 + + async def writeSleep(self): try: async with self.fanClient as client: await client.write_gatt_char(CHARACTERISTIC, SLEEP) @@ -27,7 +45,7 @@ class Headwind: except Exception as e: return False - async def on(self): + async def writeOn(self): try: async with self.fanClient as client: await client.write_gatt_char(CHARACTERISTIC, ON) @@ -35,7 +53,7 @@ class Headwind: except Exception as e: return False - async def speedMode(self): + async def writeSpeedMode(self): try: async with self.fanClient as client: await client.write_gatt_char(CHARACTERISTIC, SPD) @@ -43,7 +61,7 @@ class Headwind: except Exception as e: return False - async def hrMode(self): + async def writeHrMode(self): try: async with self.fanClient as client: await client.write_gatt_char(CHARACTERISTIC, HR) @@ -51,7 +69,7 @@ class Headwind: except Exception as e: return False - async def manualSpeed(self, speed): + async def writeSpeed(self, speed): if speed > 0: value = [0x2, speed] try: @@ -63,7 +81,7 @@ class Headwind: else: return False - async def off(self): + async def writeOff(self): try: async with self.fanClient as client: await client.write_gatt_char(CHARACTERISTIC, OFF) diff --git a/headwind/spec.py b/headwind/spec.py index 1b3ed14..aafc64c 100644 --- a/headwind/spec.py +++ b/headwind/spec.py @@ -15,4 +15,16 @@ service001e = "a026ee0c-0a7d-4ab3-97fa-f1500f9feb8b" # Vendor service001e_char001f = "a026e038-0a7d-4ab3-97fa-f1500f9feb8b" # Vendor specific service001e_char001f_desc0021 = "00002902-0000-1000-8000-00805f9b34fb" # Client Characteristic Configuration handle = 0x0000 -address = 'F2:B3:F7:6A:24:48' \ No newline at end of file +address = 'F2:B3:F7:6A:24:48' + +# bytearray(b'\xfd\x01\x19\x04') +# 127.0.0.1 - - [10/Nov/2023 15:56:50] "GET /get/speed HTTP/1.1" 200 - +# 127.0.0.1 - - [10/Nov/2023 15:57:14] "GET /speed/32 HTTP/1.1" 200 - +# bytearray(b'\xfd\x01 \x04') +# 127.0.0.1 - - [10/Nov/2023 15:57:23] "GET /get/speed HTTP/1.1" 200 - +# 127.0.0.1 - - [10/Nov/2023 15:58:01] "GET /speed/50 HTTP/1.1" 200 - +# bytearray(b'\xfd\x012\x04') +# 127.0.0.1 - - [10/Nov/2023 15:58:14] "GET /get/speed HTTP/1.1" 200 - +# 127.0.0.1 - - [10/Nov/2023 15:58:37] "GET /speed/100 HTTP/1.1" 200 - +# bytearray(b'\xfd\x01d\x04') +# 127.0.0.1 - - [10/Nov/2023 15:58:45] "GET /get/speed HTTP/1.1" 200 - \ No newline at end of file