diff --git a/homeassistant/components/broadlink/sensor.py b/homeassistant/components/broadlink/sensor.py index 0e42d8c438f..3f4a1e861b3 100644 --- a/homeassistant/components/broadlink/sensor.py +++ b/homeassistant/components/broadlink/sensor.py @@ -51,7 +51,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities): sensors = [ BroadlinkSensor(device, monitored_condition) for monitored_condition in sensor_data - if sensor_data[monitored_condition] or device.api.type == "A1" + if sensor_data[monitored_condition] != 0 or device.api.type == "A1" ] async_add_entities(sensors) diff --git a/homeassistant/components/broadlink/updater.py b/homeassistant/components/broadlink/updater.py index 8401dba8c0d..a84eec07d68 100644 --- a/homeassistant/components/broadlink/updater.py +++ b/homeassistant/components/broadlink/updater.py @@ -117,11 +117,25 @@ class BroadlinkRMUpdateManager(BroadlinkUpdateManager): device = self.device if hasattr(device.api, "check_sensors"): - return await device.async_request(device.api.check_sensors) + data = await device.async_request(device.api.check_sensors) + return self.normalize(data, self.coordinator.data) await device.async_request(device.api.update) return {} + @staticmethod + def normalize(data, previous_data): + """Fix firmware issue. + + See https://github.com/home-assistant/core/issues/42100. + """ + if data["temperature"] == -7: + if previous_data is None or previous_data["temperature"] is None: + data["temperature"] = None + elif abs(previous_data["temperature"] - data["temperature"]) > 3: + data["temperature"] = previous_data["temperature"] + return data + class BroadlinkSP1UpdateManager(BroadlinkUpdateManager): """Manages updates for Broadlink SP1 devices.""" diff --git a/tests/components/broadlink/test_device.py b/tests/components/broadlink/test_device.py index df22bcaffcb..8e53fd74c1c 100644 --- a/tests/components/broadlink/test_device.py +++ b/tests/components/broadlink/test_device.py @@ -144,7 +144,10 @@ async def test_device_setup_update_authorization_error(hass): """Test we handle an authorization error in the update step.""" device = get_device("Office") mock_api = device.get_mock_api() - mock_api.check_sensors.side_effect = (blke.AuthorizationError(), None) + mock_api.check_sensors.side_effect = ( + blke.AuthorizationError(), + {"temperature": 30}, + ) with patch.object( hass.config_entries, "async_forward_entry_setup" diff --git a/tests/components/broadlink/test_sensors.py b/tests/components/broadlink/test_sensors.py index de0cd88f288..e5d31705a4f 100644 --- a/tests/components/broadlink/test_sensors.py +++ b/tests/components/broadlink/test_sensors.py @@ -143,6 +143,38 @@ async def test_rm_pro_sensor_update(hass): assert sensors_and_states == {(f"{device.name} Temperature", "25.8")} +async def test_rm_pro_filter_crazy_temperature(hass): + """Test we filter a crazy temperature variation. + + Firmware issue. See https://github.com/home-assistant/core/issues/42100. + """ + device = get_device("Office") + mock_api = device.get_mock_api() + mock_api.check_sensors.return_value = {"temperature": 22.9} + + device_registry = mock_device_registry(hass) + entity_registry = mock_registry(hass) + + mock_api, mock_entry = await device.setup_entry(hass, mock_api=mock_api) + + device_entry = device_registry.async_get_device({(DOMAIN, mock_entry.unique_id)}) + entries = async_entries_for_device(entity_registry, device_entry.id) + sensors = {entry for entry in entries if entry.domain == SENSOR_DOMAIN} + assert len(sensors) == 1 + + mock_api.check_sensors.return_value = {"temperature": -7} + await hass.helpers.entity_component.async_update_entity( + next(iter(sensors)).entity_id + ) + assert mock_api.check_sensors.call_count == 2 + + sensors_and_states = { + (sensor.original_name, hass.states.get(sensor.entity_id).state) + for sensor in sensors + } + assert sensors_and_states == {(f"{device.name} Temperature", "22.9")} + + async def test_rm_mini3_no_sensor(hass): """Test we do not set up sensors for RM mini 3.""" device = get_device("Entrance")