diff --git a/custom_components/ble_monitor/ble_parser/__init__.py b/custom_components/ble_monitor/ble_parser/__init__.py index 6753916d0..d547d196a 100644 --- a/custom_components/ble_monitor/ble_parser/__init__.py +++ b/custom_components/ble_monitor/ble_parser/__init__.py @@ -554,8 +554,8 @@ def parse_advertisement( # Inkbird sensor_data = parse_inkbird(self, man_spec_data, local_name, mac) break - elif comp_id == 0x004A and local_name == "ST7" and data_len == 0x11: - # Mocreo ST7, see below under local_name checks for the other Mocreo models + elif comp_id == 0x004A and local_name in ["ST7", "ST7-CL"] and data_len == 0x11: + # Mocreo ST7/ST7-CL, see below under local_name checks for the other Mocreo models sensor_data = parse_mocreo(self, man_spec_data, local_name, mac) break else: diff --git a/custom_components/ble_monitor/ble_parser/mocreo.py b/custom_components/ble_monitor/ble_parser/mocreo.py index 613dd8c0b..98f476a8e 100644 --- a/custom_components/ble_monitor/ble_parser/mocreo.py +++ b/custom_components/ble_monitor/ble_parser/mocreo.py @@ -8,6 +8,7 @@ MOCREO_TYPE_DICT = { 0x10: "ST7", + 0x85: "ST7-CL", 0x81: "ST5", 0x82: "SW2", 0x83: "ST6", @@ -32,6 +33,9 @@ 0x10: { "temperature": (5, 0, -16, True, lambda x: x / 100), }, + 0x85: { + "temperature": (5, 0, -16, True, lambda x: x / 100), + }, 0x81: { "temperature": (6, 0, -16, True, lambda x: x / 100), }, diff --git a/custom_components/ble_monitor/const.py b/custom_components/ble_monitor/const.py index 67efa9d84..d234f2f3d 100644 --- a/custom_components/ble_monitor/const.py +++ b/custom_components/ble_monitor/const.py @@ -2242,6 +2242,7 @@ class BLEMonitorBinarySensorEntityDescription( 'SW2' : [["battery", "rssi"], [], ["water leak"]], 'ST6' : [["temperature", "humidity", "battery", "rssi"], [], []], 'ST7' : [["temperature", "battery", "rssi"], [], []], + 'ST7-CL' : [["temperature", "rssi"], [], []], 'ST8' : [["temperature", "battery", "rssi"], [], []], 'ST9' : [["temperature", "humidity", "battery", "rssi"], [], []], 'ST10' : [["temperature", "battery", "rssi"], [], []], @@ -2399,6 +2400,7 @@ class BLEMonitorBinarySensorEntityDescription( 'SW2' : 'MOCREO', 'ST6' : 'MOCREO', 'ST7' : 'MOCREO', + 'ST7-CL' : 'MOCREO', 'ST8' : 'MOCREO', 'ST9' : 'MOCREO', 'ST10' : 'MOCREO', diff --git a/docs/_devices/MOCREO_ST7-CL.md b/docs/_devices/MOCREO_ST7-CL.md new file mode 100644 index 000000000..051ab2e4b --- /dev/null +++ b/docs/_devices/MOCREO_ST7-CL.md @@ -0,0 +1,28 @@ +--- +manufacturer: MOCREO +name: Temperature Controller +model: ST7-CL +image: MOCREO_ST7-CL.png +physical_description: Compact MOCREO temperature controller / sensor with a BLE broadcast packet that follows the same base ST7 frame structure but advertises the ST7-CL model identifier. +broadcasted_properties: + - temperature + - rssi +broadcasted_property_notes: + - AC-powered device; battery is not a relevant advertised entity for ST7-CL. +broadcast_rate: +active_scan: no +encryption_key: +custom_firmware: +notes: > + This MOCREO device uses the same BLE advertisement family as the earlier ST7 model, but the app identifies the payload as ST7-CL using the model byte 0x85 in the manufacturer payload. + + The packet layout follows the existing MOCREO parsing logic for the ST7 family: + - company identifier 0x004A + - local name "ST7-CL" + - manufacturer payload length 0x11 + - device type byte at offset 1 in the common payload + - temperature extracted from the signed 16-bit field at byte 5, bit 0, with a scale of 0.01 °C + - battery is not treated as a valid advertised entity for this AC-powered controller + + Thermostat bounds and relay state are not available in BLE advertisements. +--- diff --git a/docs/assets/images/MOCREO_ST7-CL.png b/docs/assets/images/MOCREO_ST7-CL.png new file mode 100644 index 000000000..701182ce4 Binary files /dev/null and b/docs/assets/images/MOCREO_ST7-CL.png differ