S&B Volcano vaporizer remote control with Pi Pico W
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

poll.py 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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.device.addr_hex()
  12. print("Connecting to '{}'...".format(address))
  13. connection = await dev.device.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. attempts = 3
  32. while attempts > 0:
  33. val = int(temp * 10.0)
  34. d = val.to_bytes(4, "little")
  35. service = await device.service(serviceUuidVolcano4)
  36. uuid = bluetooth.UUID("10110003-5354-4f52-5a26-4249434b454c")
  37. characteristic = await service.characteristic(uuid)
  38. await characteristic.write(d)
  39. attempts -= 1
  40. target = await get_target_temp(device)
  41. if abs(target - temp) < 0.5:
  42. return
  43. raise RuntimeError("Could not set target temperature")
  44. async def get_unit_is_fahrenheit(device):
  45. service = await device.service(serviceUuidVolcano3)
  46. uuid = bluetooth.UUID("1010000d-5354-4f52-5a26-4249434b454c")
  47. characteristic = await service.characteristic(uuid)
  48. val = await characteristic.read()
  49. num = int.from_bytes(val, "little")
  50. return (num & 0x200) != 0
  51. async def get_state(device):
  52. service = await device.service(serviceUuidVolcano3)
  53. uuid = bluetooth.UUID("1010000c-5354-4f52-5a26-4249434b454c")
  54. characteristic = await service.characteristic(uuid)
  55. val = await characteristic.read()
  56. num = int.from_bytes(val, "little")
  57. heater = (num & 0x0020) != 0
  58. pump = (num & 0x2000) != 0
  59. return (heater, pump)
  60. async def set_state(device, state):
  61. heater, pump = state
  62. if heater == True:
  63. service = await device.service(serviceUuidVolcano4)
  64. uuid = bluetooth.UUID("1011000f-5354-4f52-5a26-4249434b454c")
  65. characteristic = await service.characteristic(uuid)
  66. await characteristic.write(int(0).to_bytes(1, "little"))
  67. elif heater == False:
  68. service = await device.service(serviceUuidVolcano4)
  69. uuid = bluetooth.UUID("10110010-5354-4f52-5a26-4249434b454c")
  70. characteristic = await service.characteristic(uuid)
  71. await characteristic.write(int(0).to_bytes(1, "little"))
  72. if pump == True:
  73. service = await device.service(serviceUuidVolcano4)
  74. uuid = bluetooth.UUID("10110013-5354-4f52-5a26-4249434b454c")
  75. characteristic = await service.characteristic(uuid)
  76. await characteristic.write(int(0).to_bytes(1, "little"))
  77. elif pump == False:
  78. service = await device.service(serviceUuidVolcano4)
  79. uuid = bluetooth.UUID("10110014-5354-4f52-5a26-4249434b454c")
  80. characteristic = await service.characteristic(uuid)
  81. await characteristic.write(int(0).to_bytes(1, "little"))
  82. if __name__ == "__main__":
  83. async def test_poll(device):
  84. temp = await get_current_temp(device)
  85. print("Current Temperature: {}".format(temp))
  86. target = await get_target_temp(device)
  87. print("Target Temperature: {}".format(target))
  88. fahrenheit = await get_unit_is_fahrenheit(device)
  89. if fahrenheit:
  90. print("Unit is Fahrenheit")
  91. else:
  92. print("Unit is Celsius")
  93. heater, pump = await get_state(device)
  94. if heater:
  95. print("Heater is On")
  96. else:
  97. print("Heater is Off")
  98. if pump:
  99. print("Pump is On")
  100. else:
  101. print("Pump is Off")
  102. async def test(address):
  103. device = await ble_conn(address)
  104. if device == None:
  105. return
  106. async with device:
  107. print("Writing...")
  108. await set_target_temp(device, 190.0)
  109. print("Reading...")
  110. for i in range(0, 5):
  111. await test_poll(device)
  112. print()
  113. time.sleep(2.0)
  114. asyncio.run(test(None))