keypad_vision.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. """Keypad Vision (Pro) device data parsers."""
  2. import logging
  3. _LOGGER = logging.getLogger(__name__)
  4. def process_common_mfr_data(mfr_data: bytes | None) -> dict[str, bool | int]:
  5. """Process common Keypad Vision (Pro) manufacturer data."""
  6. if mfr_data is None:
  7. return {}
  8. sequence_number = mfr_data[6]
  9. battery_charging = bool(mfr_data[7] & 0b10000000)
  10. battery = mfr_data[7] & 0b01111111
  11. lockout_alarm = bool(mfr_data[8] & 0b00000001)
  12. tamper_alarm = bool(mfr_data[8] & 0b00000010)
  13. duress_alarm = bool(mfr_data[8] & 0b00000100)
  14. low_temperature = bool(mfr_data[8] & 0b10000000)
  15. high_temperature = bool(mfr_data[8] & 0b01000000)
  16. doorbell = bool(mfr_data[12] & 0b00001000)
  17. doorbell_seq = mfr_data[12] & 0b00000111
  18. return {
  19. "sequence_number": sequence_number,
  20. "battery_charging": battery_charging,
  21. "battery": battery,
  22. "lockout_alarm": lockout_alarm,
  23. "tamper_alarm": tamper_alarm,
  24. "duress_alarm": duress_alarm,
  25. "low_temperature": low_temperature,
  26. "high_temperature": high_temperature,
  27. "doorbell": doorbell,
  28. "doorbell_seq": doorbell_seq,
  29. }
  30. def process_keypad_vision(
  31. data: bytes | None, mfr_data: bytes | None
  32. ) -> dict[str, bool | int | str]:
  33. """Process Keypad Vision data."""
  34. result = process_common_mfr_data(mfr_data)
  35. if not result:
  36. return {}
  37. pir_triggered_level = mfr_data[13] & 0x03
  38. result.update(
  39. {
  40. "pir_triggered_level": pir_triggered_level,
  41. }
  42. )
  43. _LOGGER.debug("Keypad Vision mfr data: %s, result: %s", mfr_data.hex(), result)
  44. return result
  45. def process_keypad_vision_pro(
  46. data: bytes | None, mfr_data: bytes | None
  47. ) -> dict[str, bool | int | str]:
  48. """Process Keypad Vision Pro data."""
  49. result = process_common_mfr_data(mfr_data)
  50. if not result:
  51. return {}
  52. radar_triggered_level = mfr_data[13] & 0x03
  53. radar_triggered_distance = (mfr_data[13] >> 2) & 0x03
  54. result.update(
  55. {
  56. "radar_triggered_level": radar_triggered_level,
  57. "radar_triggered_distance": radar_triggered_distance,
  58. }
  59. )
  60. _LOGGER.debug("Keypad Vision Pro mfr data: %s, result: %s", mfr_data.hex(), result)
  61. return result