Skip to content

Commit 0b81c71

Browse files
coffeehornbdraco
andauthored
feat: adding the new 2023 "Pro Check Universal" device (M1017020A) (#9)
Co-authored-by: J. Nick Koston <nick@koston.org>
1 parent 91a882c commit 0b81c71

File tree

2 files changed

+140
-2
lines changed

2 files changed

+140
-2
lines changed

src/mopeka_iot_ble/parser.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,18 @@ class MopekaDevice:
4040

4141
DEVICE_TYPES = {
4242
0x3: MopekaDevice("M1017", "Pro Check", 10),
43+
0xC: MopekaDevice("M1017", "Pro Check Universal", 10),
4344
0x4: MopekaDevice("", "Top down air space", 10),
4445
0x5: MopekaDevice("", "Bottom up water", 10),
4546
0x8: MopekaDevice("M1015", "Pro Plus", 10),
4647
}
4748

48-
SUPPORTED_DEVICE_TYPES = {0x3, 0x8}
49+
SUPPORTED_DEVICE_TYPES = {0x3, 0xC, 0x8}
4950

5051

5152
def hex(data: bytes) -> str:
5253
"""Return a string object containing two hexadecimal digits for each byte in the instance."""
53-
return "b'{}'".format("".join(f"\\x{b:02x}" for b in data))
54+
return "b'{}'".format("".join(f"\\x{b:02x}" for b in data)) # noqa: E231
5455

5556

5657
def battery_to_voltage(battery: int) -> float:

tests/test_parser.py

+137
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,17 @@
6565
)
6666

6767

68+
CHECK_UNIVERSAL_INSTALLED_SERVICE_INFO = BluetoothServiceInfo(
69+
name="",
70+
address="C9:F3:32:E0:F5:09",
71+
rssi=-63,
72+
manufacturer_data={89: b"\x0CpC\xb6\xc3\xe0\xf5\t\xfa\xe3"},
73+
service_uuids=["0000fee5-0000-1000-8000-00805f9b34fb"],
74+
service_data={},
75+
source="local",
76+
)
77+
78+
6879
def test_hex():
6980
assert (
7081
hex(b"\x08rF\x000\xe0\xf5\t\xf0\xd8")
@@ -580,6 +591,132 @@ def test_pro_installed():
580591
)
581592

582593

594+
def test_check_universal_installed():
595+
parser = MopekaIOTBluetoothDeviceData()
596+
service_info = CHECK_UNIVERSAL_INSTALLED_SERVICE_INFO
597+
result = parser.update(service_info)
598+
assert result == SensorUpdate(
599+
title=None,
600+
devices={
601+
None: SensorDeviceInfo(
602+
name="Pro Check Universal F509",
603+
model="M1017",
604+
manufacturer="Mopeka IOT",
605+
sw_version=None,
606+
hw_version=None,
607+
)
608+
},
609+
entity_descriptions={
610+
DeviceKey(key="battery_voltage", device_id=None): SensorDescription(
611+
device_key=DeviceKey(key="battery_voltage", device_id=None),
612+
device_class=SensorDeviceClass.VOLTAGE,
613+
native_unit_of_measurement=Units.ELECTRIC_POTENTIAL_VOLT,
614+
),
615+
DeviceKey(key="tank_level", device_id=None): SensorDescription(
616+
device_key=DeviceKey(key="tank_level", device_id=None),
617+
device_class=SensorDeviceClass.DISTANCE,
618+
native_unit_of_measurement=Units.LENGTH_MILLIMETERS,
619+
),
620+
DeviceKey(key="temperature", device_id=None): SensorDescription(
621+
device_key=DeviceKey(key="temperature", device_id=None),
622+
device_class=SensorDeviceClass.TEMPERATURE,
623+
native_unit_of_measurement=Units.TEMP_CELSIUS,
624+
),
625+
DeviceKey(key="battery", device_id=None): SensorDescription(
626+
device_key=DeviceKey(key="battery", device_id=None),
627+
device_class=SensorDeviceClass.BATTERY,
628+
native_unit_of_measurement=Units.PERCENTAGE,
629+
),
630+
DeviceKey(key="signal_strength", device_id=None): SensorDescription(
631+
device_key=DeviceKey(key="signal_strength", device_id=None),
632+
device_class=SensorDeviceClass.SIGNAL_STRENGTH,
633+
native_unit_of_measurement=Units.SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
634+
),
635+
DeviceKey(key="reading_quality", device_id=None): SensorDescription(
636+
device_key=DeviceKey(key="reading_quality", device_id=None),
637+
device_class=None,
638+
native_unit_of_measurement=Units.PERCENTAGE,
639+
),
640+
DeviceKey(key="reading_quality_raw", device_id=None): SensorDescription(
641+
device_key=DeviceKey(key="reading_quality_raw", device_id=None),
642+
device_class=None,
643+
native_unit_of_measurement=None,
644+
),
645+
DeviceKey(key="accelerometer_y", device_id=None): SensorDescription(
646+
device_key=DeviceKey(key="accelerometer_y", device_id=None),
647+
device_class=None,
648+
native_unit_of_measurement=None,
649+
),
650+
DeviceKey(key="accelerometer_x", device_id=None): SensorDescription(
651+
device_key=DeviceKey(key="accelerometer_x", device_id=None),
652+
device_class=None,
653+
native_unit_of_measurement=None,
654+
),
655+
},
656+
entity_values={
657+
DeviceKey(key="battery_voltage", device_id=None): SensorValue(
658+
device_key=DeviceKey(key="battery_voltage", device_id=None),
659+
name="Battery " "Voltage",
660+
native_value=3.5,
661+
),
662+
DeviceKey(key="tank_level", device_id=None): SensorValue(
663+
device_key=DeviceKey(key="tank_level", device_id=None),
664+
name="Tank " "Level",
665+
native_value=341,
666+
),
667+
DeviceKey(key="temperature", device_id=None): SensorValue(
668+
device_key=DeviceKey(key="temperature", device_id=None),
669+
name="Temperature",
670+
native_value=27,
671+
),
672+
DeviceKey(key="battery", device_id=None): SensorValue(
673+
device_key=DeviceKey(key="battery", device_id=None),
674+
name="Battery",
675+
native_value=100,
676+
),
677+
DeviceKey(key="signal_strength", device_id=None): SensorValue(
678+
device_key=DeviceKey(key="signal_strength", device_id=None),
679+
name="Signal " "Strength",
680+
native_value=-63,
681+
),
682+
DeviceKey(key="reading_quality", device_id=None): SensorValue(
683+
device_key=DeviceKey(key="reading_quality", device_id=None),
684+
name="Reading " "quality",
685+
native_value=100,
686+
),
687+
DeviceKey(key="reading_quality_raw", device_id=None): SensorValue(
688+
device_key=DeviceKey(key="reading_quality_raw", device_id=None),
689+
name="Reading " "quality " "raw",
690+
native_value=3,
691+
),
692+
DeviceKey(key="accelerometer_y", device_id=None): SensorValue(
693+
device_key=DeviceKey(key="accelerometer_y", device_id=None),
694+
name="Position " "Y",
695+
native_value=227,
696+
),
697+
DeviceKey(key="accelerometer_x", device_id=None): SensorValue(
698+
device_key=DeviceKey(key="accelerometer_x", device_id=None),
699+
name="Position " "X",
700+
native_value=250,
701+
),
702+
},
703+
binary_entity_descriptions={
704+
DeviceKey(key="button_pressed", device_id=None): BinarySensorDescription(
705+
device_key=DeviceKey(key="button_pressed", device_id=None),
706+
device_class=BinarySensorDeviceClass.OCCUPANCY,
707+
)
708+
},
709+
binary_entity_values={
710+
DeviceKey(key="button_pressed", device_id=None): BinarySensorValue(
711+
device_key=DeviceKey(key="button_pressed", device_id=None),
712+
name="Button pressed",
713+
native_value=False,
714+
)
715+
},
716+
events={},
717+
)
718+
719+
583720
def test_check_installed():
584721
parser = MopekaIOTBluetoothDeviceData()
585722
service_info = CHECK_INSTALLED_SERVICE_INFO

0 commit comments

Comments
 (0)