keypad_vision.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. return {
  18. "sequence_number": sequence_number,
  19. "battery_charging": battery_charging,
  20. "battery": battery,
  21. "lockout_alarm": lockout_alarm,
  22. "tamper_alarm": tamper_alarm,
  23. "duress_alarm": duress_alarm,
  24. "low_temperature": low_temperature,
  25. "high_temperature": high_temperature,
  26. "doorbell": doorbell,
  27. }
  28. def process_keypad_vision(
  29. data: bytes | None, mfr_data: bytes | None
  30. ) -> dict[str, bool | int | str]:
  31. """Process Keypad Vision data."""
  32. result = process_common_mfr_data(mfr_data)
  33. if not result:
  34. return {}
  35. pir_triggered_level = mfr_data[13] & 0x03
  36. result.update(
  37. {
  38. "pir_triggered_level": pir_triggered_level,
  39. }
  40. )
  41. _LOGGER.debug("Keypad Vision mfr data: %s, result: %s", mfr_data.hex(), result)
  42. return result
  43. def process_keypad_vision_pro(
  44. data: bytes | None, mfr_data: bytes | None
  45. ) -> dict[str, bool | int | str]:
  46. """Process Keypad Vision Pro data."""
  47. result = process_common_mfr_data(mfr_data)
  48. if not result:
  49. return {}
  50. radar_triggered_level = mfr_data[13] & 0x03
  51. radar_triggered_distance = (mfr_data[13] >> 2) & 0x03
  52. result.update(
  53. {
  54. "radar_triggered_level": radar_triggered_level,
  55. "radar_triggered_distance": radar_triggered_distance,
  56. }
  57. )
  58. _LOGGER.debug("Keypad Vision Pro mfr data: %s, result: %s", mfr_data.hex(), result)
  59. return result