Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/air_purifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def process_air_purifier(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int]:
"""Process air purifier services data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 14:
return {}
device_data = mfr_data[6:]

Expand Down
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/art_frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ def process_art_frame(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int | str]:
"""Process Art Frame data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 10:
return {}

_seq_num = mfr_data[6]
Expand Down
4 changes: 2 additions & 2 deletions switchbot/adv_parsers/blind_tilt.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ def process_woblindtilt(
data: bytes | None, mfr_data: bytes | None, reverse: bool = False
) -> dict[str, bool | int]:
"""Process woBlindTilt services data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 10:
return {}

device_data = mfr_data[6:]
Expand All @@ -19,7 +19,7 @@ def process_woblindtilt(

return {
"calibration": _calibrated,
"battery": data[2] & 0b01111111 if data else None,
"battery": data[2] & 0b01111111 if data and len(data) >= 3 else None,
"inMotion": _in_motion,
"tilt": (100 - _tilt) if reverse else _tilt,
"lightLevel": _light_level,
Expand Down
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ def process_wohand(data: bytes | None, mfr_data: bytes | None) -> dict[str, bool
if data is None and mfr_data is None:
return {}

if data is None:
if data is None or len(data) < 3:
return {
"switchMode": None,
"isOn": None,
Expand Down
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/bulb.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ def process_color_bulb(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int]:
"""Process WoBulb services data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 11:
return {}
return {
"sequence_number": mfr_data[6],
Expand Down
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/ceiling_light.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

def process_woceiling(data: bytes, mfr_data: bytes | None) -> dict[str, bool | int]:
"""Process WoCeiling services data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 11:
return {}
return {
"sequence_number": mfr_data[6],
Expand Down
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/climate_panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ def process_climate_panel(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int | str]:
"""Process Climate Panel data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 16:
return {}

seq_number = mfr_data[6]
Expand Down
6 changes: 3 additions & 3 deletions switchbot/adv_parsers/curtain.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ def process_wocurtain(
battery_data = mfr_data[12]
elif mfr_data and len(mfr_data) >= 11:
device_data = mfr_data[8:11]
battery_data = data[2] if data else None
elif data:
battery_data = data[2] if data and len(data) >= 3 else None
elif data and len(data) >= 6:
device_data = data[3:6]
battery_data = data[2]
else:
Expand All @@ -25,7 +25,7 @@ def process_wocurtain(
_device_chain = device_data[1] & 0b00000111

return {
"calibration": bool(data[1] & 0b01000000) if data else None,
"calibration": bool(data[1] & 0b01000000) if data and len(data) >= 2 else None,
"battery": battery_data & 0b01111111 if battery_data is not None else None,
"inMotion": _in_motion,
"position": (100 - _position) if reverse else _position,
Expand Down
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/fan.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def _parse_fan(
mfr_data: bytes | None, mode_map: dict[int, str]
) -> dict[str, bool | int | str | None]:
"""Shared fan advertisement parse, parameterized on the mode map."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 10:
return {}

device_data = mfr_data[6:]
Expand Down
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/hub2.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def process_wohub2(data: bytes | None, mfr_data: bytes | None) -> dict[str, Any]
"""Process woHub2 sensor manufacturer data."""
temp_data = None

if mfr_data:
if mfr_data and len(mfr_data) >= 16:
status = mfr_data[12]
temp_data = mfr_data[13:16]

Expand Down
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/hub3.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

def process_hub3(data: bytes | None, mfr_data: bytes | None) -> dict[str, Any]:
"""Process hub3 sensor manufacturer data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 17:
return {}
device_data = mfr_data[6:]

Expand Down
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/hubmini_matter.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def process_hubmini_matter(
"""Process Hubmini matter sensor manufacturer data."""
temp_data = None

if mfr_data:
if mfr_data and len(mfr_data) >= 16:
temp_data = mfr_data[13:16]

if not temp_data:
Expand Down
4 changes: 2 additions & 2 deletions switchbot/adv_parsers/humidifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def process_wohumidifier(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int]:
"""Process WoHumi services data."""
if data is None:
if data is None or len(data) < 5:
return {
"isOn": None,
"level": None,
Expand All @@ -64,7 +64,7 @@ def process_evaporative_humidifier(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int]:
"""Process WoHumi services data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 17:
return {}

seq_number = mfr_data[6]
Expand Down
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/keypad.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def process_wokeypad(
mfr_data: bytes | None,
) -> dict[str, bool | int | None]:
"""Process woKeypad services data."""
if data is None or mfr_data is None:
if data is None or mfr_data is None or len(data) < 3 or len(mfr_data) < 7:
return {"battery": None, "attempt_state": None}

_LOGGER.debug("mfr_data: %s", mfr_data.hex())
Expand Down
6 changes: 3 additions & 3 deletions switchbot/adv_parsers/keypad_vision.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

def process_common_mfr_data(mfr_data: bytes | None) -> dict[str, bool | int]:
"""Process common Keypad Vision (Pro) manufacturer data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 13:
return {}

sequence_number = mfr_data[6]
Expand Down Expand Up @@ -41,7 +41,7 @@ def process_keypad_vision(
"""Process Keypad Vision data."""
result = process_common_mfr_data(mfr_data)

if not result:
if not result or len(mfr_data) < 14:
return {}

pir_triggered_level = mfr_data[13] & 0x03
Expand All @@ -63,7 +63,7 @@ def process_keypad_vision_pro(
"""Process Keypad Vision Pro data."""
result = process_common_mfr_data(mfr_data)

if not result:
if not result or len(mfr_data) < 14:
return {}

radar_triggered_level = mfr_data[13] & 0x03
Expand Down
6 changes: 3 additions & 3 deletions switchbot/adv_parsers/light_strip.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ def process_wostrip(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int]:
"""Process WoStrip services data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 9:
return {}
return {
"sequence_number": mfr_data[6],
Expand All @@ -25,7 +25,7 @@ def process_candle_warmer_lamp(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int]:
"""Process Candle Warmer Lamp services data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 9:
return {}
return {
"sequence_number": mfr_data[6],
Expand All @@ -41,7 +41,7 @@ def process_light(
) -> dict[str, bool | int]:
"""Support for strip light 3 and floor lamp."""
common_data = process_wostrip(data, mfr_data)
if not common_data:
if not common_data or len(mfr_data) < cw_offset + 2:
return {}

light_data = {"cw": _UNPACK_UINT16_BE(mfr_data, cw_offset)[0]}
Expand Down
8 changes: 4 additions & 4 deletions switchbot/adv_parsers/lock.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
def process_wolock(data: bytes | None, mfr_data: bytes | None) -> dict[str, bool | int]:
"""Support for lock and lock lite process data."""
common_data = process_locklite(data, mfr_data)
if not common_data:
if not common_data or len(mfr_data) < 9:
return {}

common_data["door_open"] = bool(mfr_data[7] & 0b00000100)
Expand All @@ -26,7 +26,7 @@ def process_locklite(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int]:
"""Support for lock lite process data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 9:
return {}

_LOGGER.debug("mfr_data: %s", mfr_data.hex())
Expand All @@ -35,7 +35,7 @@ def process_locklite(

return {
"sequence_number": mfr_data[6],
"battery": data[2] & 0b01111111 if data else None,
"battery": data[2] & 0b01111111 if data and len(data) >= 3 else None,
"calibration": bool(mfr_data[7] & 0b10000000),
"status": LockStatus((mfr_data[7] & 0b01110000) >> 4),
"update_from_secondary_lock": bool(mfr_data[7] & 0b00001000),
Expand All @@ -46,7 +46,7 @@ def process_locklite(


def parse_common_data(mfr_data: bytes | None) -> dict[str, bool | int]:
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 12:
return {}

_LOGGER.debug("mfr_data: %s", mfr_data.hex())
Expand Down
6 changes: 3 additions & 3 deletions switchbot/adv_parsers/meter.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ def process_wosensorth(data: bytes | None, mfr_data: bytes | None) -> dict[str,
temp_data: bytes | None = None
battery: int | None = None

if mfr_data:
if mfr_data and len(mfr_data) >= 11:
temp_data = mfr_data[8:11]

if data:
if not temp_data:
if data and len(data) >= 3:
if not temp_data and len(data) >= 6:
temp_data = data[3:6]
battery = data[2] & 0b01111111

Expand Down
3 changes: 2 additions & 1 deletion switchbot/adv_parsers/motion.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ def process_wopresence(
sense_distance = None
light_intensity = None
is_light = None
motion_detected = None

if data:
if data and len(data) >= 6:
tested = bool(data[1] & 0b10000000)
motion_detected = bool(data[1] & 0b01000000)
battery = data[2] & 0b01111111
Expand Down
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/plug.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ def process_woplugmini(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int]:
"""Process plug mini."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 12:
return {}
return {
"switchMode": True,
Expand Down
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/remote.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def process_woremote(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, int | None]:
"""Process WoRemote adv data."""
if data is None:
if data is None or len(data) < 3:
return {
"battery": None,
}
Expand Down
4 changes: 2 additions & 2 deletions switchbot/adv_parsers/roller_shade.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ def process_worollershade(
data: bytes | None, mfr_data: bytes | None, reverse: bool = True
) -> dict[str, bool | int]:
"""Process woRollerShade services data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 10:
return {}

device_data = mfr_data[6:]
Expand All @@ -20,7 +20,7 @@ def process_worollershade(

return {
"calibration": _calibrated,
"battery": data[2] & 0b01111111 if data else None,
"battery": data[2] & 0b01111111 if data and len(data) >= 3 else None,
"inMotion": _in_motion,
"position": (100 - _position) if reverse else _position,
"lightLevel": _light_level,
Expand Down
2 changes: 1 addition & 1 deletion switchbot/adv_parsers/smart_thermostat_radiator.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def process_smart_thermostat_radiator(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int | str]:
"""Process Smart Thermostat Radiator data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 13:
return {}

_seq_num = mfr_data[6]
Expand Down
4 changes: 2 additions & 2 deletions switchbot/adv_parsers/vacuum.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def process_vacuum(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int | str]:
"""Support for s10, k10+ pro combo, k20 process service data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 14:
return {}

_seq_num = mfr_data[6]
Expand Down Expand Up @@ -48,7 +48,7 @@ def process_vacuum_k(
data: bytes | None, mfr_data: bytes | None
) -> dict[str, bool | int | str]:
"""Support for k10+, k10+ pro process service data."""
if mfr_data is None:
if mfr_data is None or len(mfr_data) < 9:
return {}

_seq_num = mfr_data[6]
Expand Down
Loading
Loading