From cc4d965ba5beff4d04ce3f9cdb0e32547c150160 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 24 Oct 2022 21:06:03 -0500 Subject: [PATCH] feat: add support for IO Series 7 (#6) --- src/oralb_ble/parser.py | 10 ++-- tests/test_parser.py | 124 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 5 deletions(-) diff --git a/src/oralb_ble/parser.py b/src/oralb_ble/parser.py index 73cb9f7..67b1e11 100644 --- a/src/oralb_ble/parser.py +++ b/src/oralb_ble/parser.py @@ -41,7 +41,7 @@ class OralBBinarySensor(StrEnum): class Models(Enum): - IOSerial7 = auto() + IOSeries7 = auto() SmartSeries7000 = auto() @@ -53,8 +53,8 @@ class ModelDescription: DEVICE_TYPES = { - Models.IOSerial7: ModelDescription( - device_type="IO Serial 7", + Models.IOSeries7: ModelDescription( + device_type="IO Series 7", modes={ 0: "daily clean", 1: "sensitive", @@ -140,9 +140,9 @@ def _process_mfr_data( no_of_sectors, ) = UNPACK_BBHBBBB(data[3:11]) - device_bytes = data[4:7] + device_bytes = data[0:3] if device_bytes == b"\x062k": - model = Models.IOSerial7 + model = Models.IOSeries7 else: model = Models.SmartSeries7000 diff --git a/tests/test_parser.py b/tests/test_parser.py index f00b608..4574d28 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -53,6 +53,15 @@ service_data={}, source="local", ) +ORALB_IO_SERIES_7 = BluetoothServiceInfo( + name="78:DB:2F:C2:48:BE", + address="78:DB:2F:C2:48:BE", + rssi=-63, + manufacturer_data={220: b"\x062k\x02 \x00\x01\x01\x01\x03\x04"}, + service_uuids=[], + service_data={}, + source="local", +) def test_can_create(): @@ -517,3 +526,118 @@ def test_dataset_4(): }, events={}, ) + + +def test_io_series_7(): + parser = OralBBluetoothDeviceData() + service_info = ORALB_IO_SERIES_7 + result = parser.update(service_info) + assert result == SensorUpdate( + title="IO Series 7 48BE", + devices={ + None: SensorDeviceInfo( + name="IO Series 7 48BE", + model="IO Series 7", + manufacturer="OralB", + sw_version=None, + hw_version=None, + ) + }, + entity_descriptions={ + DeviceKey(key="number_of_sectors", device_id=None): SensorDescription( + device_key=DeviceKey(key="number_of_sectors", device_id=None), + device_class=None, + native_unit_of_measurement=None, + ), + DeviceKey(key="sector_timer", device_id=None): SensorDescription( + device_key=DeviceKey(key="sector_timer", device_id=None), + device_class=None, + native_unit_of_measurement=None, + ), + DeviceKey(key="signal_strength", device_id=None): SensorDescription( + device_key=DeviceKey(key="signal_strength", device_id=None), + device_class=SensorDeviceClass.SIGNAL_STRENGTH, + native_unit_of_measurement=Units.SIGNAL_STRENGTH_DECIBELS_MILLIWATT, + ), + DeviceKey(key="sector", device_id=None): SensorDescription( + device_key=DeviceKey(key="sector", device_id=None), + device_class=None, + native_unit_of_measurement=None, + ), + DeviceKey(key="toothbrush_state", device_id=None): SensorDescription( + device_key=DeviceKey(key="toothbrush_state", device_id=None), + device_class=None, + native_unit_of_measurement=None, + ), + DeviceKey(key="mode", device_id=None): SensorDescription( + device_key=DeviceKey(key="mode", device_id=None), + device_class=None, + native_unit_of_measurement=None, + ), + DeviceKey(key="pressure", device_id=None): SensorDescription( + device_key=DeviceKey(key="pressure", device_id=None), + device_class=None, + native_unit_of_measurement=None, + ), + DeviceKey(key="counter", device_id=None): SensorDescription( + device_key=DeviceKey(key="counter", device_id=None), + device_class=None, + native_unit_of_measurement=None, + ), + }, + entity_values={ + DeviceKey(key="number_of_sectors", device_id=None): SensorValue( + device_key=DeviceKey(key="number_of_sectors", device_id=None), + name="Number " "of " "sectors", + native_value=4, + ), + DeviceKey(key="sector_timer", device_id=None): SensorValue( + device_key=DeviceKey(key="sector_timer", device_id=None), + name="Sector " "Timer", + native_value=3, + ), + DeviceKey(key="signal_strength", device_id=None): SensorValue( + device_key=DeviceKey(key="signal_strength", device_id=None), + name="Signal " "Strength", + native_value=-63, + ), + DeviceKey(key="sector", device_id=None): SensorValue( + device_key=DeviceKey(key="sector", device_id=None), + name="Sector", + native_value="sector " "1", + ), + DeviceKey(key="toothbrush_state", device_id=None): SensorValue( + device_key=DeviceKey(key="toothbrush_state", device_id=None), + name="Toothbrush " "State", + native_value="idle", + ), + DeviceKey(key="mode", device_id=None): SensorValue( + device_key=DeviceKey(key="mode", device_id=None), + name="Mode", + native_value="sensitive", + ), + DeviceKey(key="pressure", device_id=None): SensorValue( + device_key=DeviceKey(key="pressure", device_id=None), + name="Pressure", + native_value="unknown " "pressure " "32", + ), + DeviceKey(key="counter", device_id=None): SensorValue( + device_key=DeviceKey(key="counter", device_id=None), + name="Counter", + native_value=1, + ), + }, + binary_entity_descriptions={ + DeviceKey(key="brushing", device_id=None): BinarySensorDescription( + device_key=DeviceKey(key="brushing", device_id=None), device_class=None + ) + }, + binary_entity_values={ + DeviceKey(key="brushing", device_id=None): BinarySensorValue( + device_key=DeviceKey(key="brushing", device_id=None), + name="Brushing", + native_value=False, + ) + }, + events={}, + )