S&B Volcano vaporizer remote control with Pi Pico W
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

poll.py 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #!/usr/bin/env python
  2. import uasyncio as asyncio
  3. import bluetooth
  4. import time
  5. from scan import ble_scan
  6. serviceUuidVolcano3 = bluetooth.UUID("10100000-5354-4f52-5a26-4249434b454c")
  7. serviceUuidVolcano4 = bluetooth.UUID("10110000-5354-4f52-5a26-4249434b454c")
  8. async def ble_conn(address):
  9. dev = await ble_scan(address)
  10. if dev:
  11. address = dev.addr_hex()
  12. print("Connecting to '{}'...".format(address))
  13. connection = await dev.connect()
  14. return connection
  15. return None
  16. async def get_current_temp(device):
  17. service = await device.service(serviceUuidVolcano4)
  18. uuid = bluetooth.UUID("10110001-5354-4f52-5a26-4249434b454c")
  19. characteristic = await service.characteristic(uuid)
  20. val = await characteristic.read()
  21. num = int.from_bytes(val, "little")
  22. return num / 10.0
  23. async def get_target_temp(device):
  24. service = await device.service(serviceUuidVolcano4)
  25. uuid = bluetooth.UUID("10110003-5354-4f52-5a26-4249434b454c")
  26. characteristic = await service.characteristic(uuid)
  27. val = await characteristic.read()
  28. num = int.from_bytes(val, "little")
  29. return num / 10.0
  30. async def set_target_temp(device, temp):
  31. val = int(temp * 10.0)
  32. d = val.to_bytes(4, "little")
  33. service = await device.service(serviceUuidVolcano4)
  34. uuid = bluetooth.UUID("10110003-5354-4f52-5a26-4249434b454c")
  35. characteristic = await service.characteristic(uuid)
  36. await characteristic.write(d)
  37. async def get_unit_is_fahrenheit(device):
  38. service = await device.service(serviceUuidVolcano3)
  39. uuid = bluetooth.UUID("1010000d-5354-4f52-5a26-4249434b454c")
  40. characteristic = await service.characteristic(uuid)
  41. val = await characteristic.read()
  42. num = int.from_bytes(val, "little")
  43. return (num & 0x200) != 0
  44. async def get_state(device):
  45. service = await device.service(serviceUuidVolcano3)
  46. uuid = bluetooth.UUID("1010000c-5354-4f52-5a26-4249434b454c")
  47. characteristic = await service.characteristic(uuid)
  48. val = await characteristic.read()
  49. num = int.from_bytes(val, "little")
  50. heater = (num & 0x0020) != 0
  51. pump = (num & 0x2000) != 0
  52. return (heater, pump)
  53. async def set_state(device, state):
  54. heater, pump = state
  55. if heater:
  56. service = await device.service(serviceUuidVolcano4)
  57. uuid = bluetooth.UUID("1011000f-5354-4f52-5a26-4249434b454c")
  58. characteristic = await service.characteristic(uuid)
  59. await characteristic.write(int(0).to_bytes(1, "little"))
  60. else:
  61. service = await device.service(serviceUuidVolcano4)
  62. uuid = bluetooth.UUID("10110010-5354-4f52-5a26-4249434b454c")
  63. characteristic = await service.characteristic(uuid)
  64. await characteristic.write(int(0).to_bytes(1, "little"))
  65. if pump:
  66. service = await device.service(serviceUuidVolcano4)
  67. uuid = bluetooth.UUID("10110013-5354-4f52-5a26-4249434b454c")
  68. characteristic = await service.characteristic(uuid)
  69. await characteristic.write(int(0).to_bytes(1, "little"))
  70. else:
  71. service = await device.service(serviceUuidVolcano4)
  72. uuid = bluetooth.UUID("10110014-5354-4f52-5a26-4249434b454c")
  73. characteristic = await service.characteristic(uuid)
  74. await characteristic.write(int(0).to_bytes(1, "little"))
  75. if __name__ == "__main__":
  76. async def test_poll(device):
  77. temp = await get_current_temp(device)
  78. print("Current Temperature: {}".format(temp))
  79. target = await get_target_temp(device)
  80. print("Target Temperature: {}".format(target))
  81. fahrenheit = await get_unit_is_fahrenheit(device)
  82. if fahrenheit:
  83. print("Unit is Fahrenheit")
  84. else:
  85. print("Unit is Celsius")
  86. heater, pump = await get_state(device)
  87. if heater:
  88. print("Heater is On")
  89. else:
  90. print("Heater is Off")
  91. if pump:
  92. print("Pump is On")
  93. else:
  94. print("Pump is Off")
  95. async def test(address):
  96. device = await ble_conn(address)
  97. if device == None:
  98. return
  99. async with device:
  100. print("Writing...")
  101. await set_target_temp(device, 190.0)
  102. print("Reading...")
  103. for i in range(0, 5):
  104. await test_poll(device)
  105. print()
  106. time.sleep(2.0)
  107. asyncio.run(test(None))