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 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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. service3 = None
  9. service4 = None
  10. characteristic1 = None
  11. characteristic3 = None
  12. characteristicd = None
  13. characteristicc = None
  14. characteristicf = None
  15. characteristic10 = None
  16. characteristic13 = None
  17. characteristic14 = None
  18. async def cache_services_characteristics(device, cb = None):
  19. global service3, service4
  20. global characteristic1, characteristic3
  21. global characteristicd, characteristicc
  22. global characteristicf, characteristic10
  23. global characteristic13, characteristic14
  24. service3 = await device.service(serviceUuidVolcano3)
  25. if cb != None:
  26. await cb(0.1)
  27. service4 = await device.service(serviceUuidVolcano4)
  28. if cb != None:
  29. await cb(0.2)
  30. uuid1 = bluetooth.UUID("10110001-5354-4f52-5a26-4249434b454c")
  31. characteristic1 = await service4.characteristic(uuid1)
  32. if cb != None:
  33. await cb(0.3)
  34. uuid3 = bluetooth.UUID("10110003-5354-4f52-5a26-4249434b454c")
  35. characteristic3 = await service4.characteristic(uuid3)
  36. if cb != None:
  37. await cb(0.4)
  38. uuidd = bluetooth.UUID("1010000d-5354-4f52-5a26-4249434b454c")
  39. characteristicd = await service3.characteristic(uuidd)
  40. if cb != None:
  41. await cb(0.5)
  42. uuidc = bluetooth.UUID("1010000c-5354-4f52-5a26-4249434b454c")
  43. characteristicc = await service3.characteristic(uuidc)
  44. if cb != None:
  45. await cb(0.6)
  46. uuidf = bluetooth.UUID("1011000f-5354-4f52-5a26-4249434b454c")
  47. characteristicf = await service4.characteristic(uuidf)
  48. if cb != None:
  49. await cb(0.7)
  50. uuid10 = bluetooth.UUID("10110010-5354-4f52-5a26-4249434b454c")
  51. characteristic10 = await service4.characteristic(uuid10)
  52. if cb != None:
  53. await cb(0.8)
  54. uuid13 = bluetooth.UUID("10110013-5354-4f52-5a26-4249434b454c")
  55. characteristic13 = await service4.characteristic(uuid13)
  56. if cb != None:
  57. await cb(0.9)
  58. uuid14 = bluetooth.UUID("10110014-5354-4f52-5a26-4249434b454c")
  59. characteristic14 = await service4.characteristic(uuid14)
  60. if cb != None:
  61. await cb(1.0)
  62. async def get_current_temp(device):
  63. val = await characteristic1.read()
  64. num = int.from_bytes(val, "little")
  65. return num / 10.0
  66. async def get_target_temp(device):
  67. val = await characteristic3.read()
  68. num = int.from_bytes(val, "little")
  69. return num / 10.0
  70. async def set_target_temp(device, temp):
  71. attempts = 3
  72. while attempts > 0:
  73. val = int(temp * 10.0)
  74. d = val.to_bytes(4, "little")
  75. await characteristic3.write(d)
  76. attempts -= 1
  77. target = await get_target_temp(device)
  78. if abs(target - temp) < 0.5:
  79. return
  80. raise RuntimeError("Could not set target temperature")
  81. async def get_unit_is_fahrenheit(device):
  82. val = await characteristicd.read()
  83. num = int.from_bytes(val, "little")
  84. return (num & 0x200) != 0
  85. async def get_state(device):
  86. val = await characteristicc.read()
  87. num = int.from_bytes(val, "little")
  88. heater = (num & 0x0020) != 0
  89. pump = (num & 0x2000) != 0
  90. return (heater, pump)
  91. async def set_state(device, state):
  92. attempts = 3
  93. while attempts > 0:
  94. attempts -= 1
  95. try:
  96. heater, pump = state
  97. if heater == True:
  98. await characteristicf.write(int(0).to_bytes(1, "little"))
  99. elif heater == False:
  100. await characteristic10.write(int(0).to_bytes(1, "little"))
  101. if pump == True:
  102. await characteristic13.write(int(0).to_bytes(1, "little"))
  103. elif pump == False:
  104. await characteristic14.write(int(0).to_bytes(1, "little"))
  105. except:
  106. time.sleep(0.05)
  107. continue
  108. break