Skip to content

Commit

Permalink
Merge pull request #945 from custom-components/Bad-govee-data-fix
Browse files Browse the repository at this point in the history
Bad govee data fix
  • Loading branch information
Ernst79 authored Jul 13, 2022
2 parents d42e40f + 6ceed26 commit 2aad98d
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 17 deletions.
48 changes: 32 additions & 16 deletions custom_components/ble_monitor/ble_parser/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,18 +49,30 @@ def __init__(
report_unknown=False,
discovery=True,
filter_duplicates=False,
sensor_whitelist=[],
tracker_whitelist=[],
report_unknown_whitelist=[],
aeskeys={}
sensor_whitelist=None,
tracker_whitelist=None,
report_unknown_whitelist=None,
aeskeys=None
):
self.report_unknown = report_unknown
self.discovery = discovery
self.filter_duplicates = filter_duplicates
self.sensor_whitelist = sensor_whitelist
self.tracker_whitelist = tracker_whitelist
self.report_unknown_whitelist = report_unknown_whitelist
self.aeskeys = aeskeys
if sensor_whitelist is None:
self.sensor_whitelist = []
else:
self.sensor_whitelist = sensor_whitelist
if tracker_whitelist is None:
self.tracker_whitelist = []
else:
self.tracker_whitelist = tracker_whitelist
if report_unknown_whitelist is None:
self.report_unknown_whitelist = []
else:
self.report_unknown_whitelist = report_unknown_whitelist
if aeskeys is None:
self.aeskeys = {}
else:
self.aeskeys = aeskeys

self.lpacket_ids = {}
self.movements_list = {}
Expand Down Expand Up @@ -154,13 +166,17 @@ def parse_advertisement(
service_class_uuid16: Optional[int] = None,
service_class_uuid128: Optional[bytes] = None,
local_name: Optional[str] = "",
service_data_list: Optional[list] = [],
man_spec_data_list: Optional[list] = []
service_data_list: Optional[list] = None,
man_spec_data_list: Optional[list] = None
):
"""parse BLE advertisement"""
sensor_data = None
tracker_data = None
unknown_sensor = False
if service_data_list is None:
service_data_list = []
if man_spec_data_list is None:
man_spec_data_list = []

while not sensor_data:
if service_data_list:
Expand Down Expand Up @@ -229,7 +245,7 @@ def parse_advertisement(
comp_id = (man_spec_data[3] << 8) | man_spec_data[2]
data_len = man_spec_data[0]
# Filter on Company Identifier
if comp_id == 0x0001 and data_len in [0x09, 0x0C]:
if comp_id == 0x0001 and data_len in [0x09, 0x0C, 0x22, 0x25]:
# Govee H5101/H5102/H5177
sensor_data = parse_govee(self, man_spec_data, mac, rssi)
break
Expand Down Expand Up @@ -272,15 +288,15 @@ def parse_advertisement(
# Air Mentor
sensor_data = parse_airmentor(self, man_spec_data, mac, rssi)
break
elif comp_id == 0x8801 and data_len == 0x0C:
elif comp_id == 0x8801 and data_len in [0x0C, 0x25]:
# Govee H5179
sensor_data = parse_govee(self, man_spec_data, mac, rssi)
break
elif comp_id == 0xAA55 and data_len == 0x14:
# Brifit
sensor_data = parse_brifit(self, man_spec_data, mac, rssi)
break
elif comp_id == 0xEC88 and data_len in [0x09, 0x0A, 0x0C]:
elif comp_id == 0xEC88 and data_len in [0x09, 0x0A, 0x0C, 0x22, 0x24, 0x25]:
# Govee H5051/H5071/H5072/H5075/H5074
sensor_data = parse_govee(self, man_spec_data, mac, rssi)
break
Expand Down Expand Up @@ -314,15 +330,15 @@ def parse_advertisement(
# Jinou BEC07-5
sensor_data = parse_jinou(self, man_spec_data, mac, rssi)
break
elif service_class_uuid16 == 0x5182 and data_len == 0x14:
elif service_class_uuid16 == 0x5182 and data_len in [0x14, 0x2D]:
# Govee H5182
sensor_data = parse_govee(self, man_spec_data, mac, rssi)
break
elif service_class_uuid16 == 0x5183 and data_len == 0x11:
elif service_class_uuid16 == 0x5183 and data_len in [0x11, 0x2A]:
# Govee H5183
sensor_data = parse_govee(self, man_spec_data, mac, rssi)
break
elif service_class_uuid16 == 0x5185 and data_len == 0x17:
elif service_class_uuid16 == 0x5185 and data_len in [0x17, 0x30]:
# Govee H5185
sensor_data = parse_govee(self, man_spec_data, mac, rssi)
break
Expand Down
4 changes: 4 additions & 0 deletions custom_components/ble_monitor/ble_parser/govee.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ def decode_temps_probes(packet_value: int) -> float:

def parse_govee(self, data, source_mac, rssi):
"""Parser for Govee sensors"""
# The parser needs to handle the bug in the Govee BLE advertisement
# data as INTELLI_ROCKS sometimes ends up glued on to the end of the message
if len(data) > 25 and b"INTELLI_ROCKS" in data:
data = data[:-25]
msg_length = len(data)
firmware = "Govee"
govee_mac = source_mac
Expand Down
2 changes: 2 additions & 0 deletions custom_components/ble_monitor/ble_parser/inkbird.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ def parse_inkbird(self, data, complete_local_name, source_mac, rssi):
"battery": bat,
}
)
else:
return None
elif msg_length == 14:
device_type = "iBBQ-1"
inkbird_mac = data[6:12]
Expand Down
2 changes: 1 addition & 1 deletion custom_components/ble_monitor/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@
],
"dependencies": [],
"codeowners": ["@Ernst79", "@Magalex2x14", "@Thrilleratplay"],
"version": "9.0.1-beta",
"version": "9.0.1",
"iot_class": "local_polling"
}

0 comments on commit 2aad98d

Please sign in to comment.