1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
"""Contact sensor parser."""
from __future__ import annotations
def process_wocontact(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int]:
"""Process woContact Sensor services data."""
if data is None and mfr_data is None:
return {}
battery = data[2] & 0b01111111 if data else None
tested = bool(data[1] & 0b10000000) if data else None
if mfr_data and len(mfr_data) >= 13:
motion_detected = bool(mfr_data[7] & 0b10000000)
contact_open = bool(mfr_data[7] & 0b00010000)
contact_timeout = bool(mfr_data[7] & 0b00100000)
button_count = mfr_data[12] & 0b00001111
is_light = bool(mfr_data[7] & 0b01000000)
else:
motion_detected = bool(data[1] & 0b01000000)
contact_open = bool(data[3] & 0b00000010)
contact_timeout = bool(data[3] & 0b00000100)
button_count = data[8] & 0b00001111
is_light = bool(data[3] & 0b00000001)
return {
"tested": tested,
"motion_detected": motion_detected,
"battery": battery,
"contact_open": contact_open or contact_timeout, # timeout still means its open
"contact_timeout": contact_timeout,
"is_light": is_light,
"button_count": button_count,
}
|