Restore govee_ble state when gateway device becomes available (#97984)
This commit is contained in:
parent
40a221c923
commit
b7f936fcdd
3 changed files with 124 additions and 4 deletions
|
@ -110,7 +110,9 @@ async def async_setup_entry(
|
|||
GoveeBluetoothSensorEntity, async_add_entities
|
||||
)
|
||||
)
|
||||
entry.async_on_unload(coordinator.async_register_processor(processor))
|
||||
entry.async_on_unload(
|
||||
coordinator.async_register_processor(processor, SensorEntityDescription)
|
||||
)
|
||||
|
||||
|
||||
class GoveeBluetoothSensorEntity(
|
||||
|
|
|
@ -37,6 +37,31 @@ GVH5177_SERVICE_INFO = BluetoothServiceInfo(
|
|||
source="local",
|
||||
)
|
||||
|
||||
GVH5178_REMOTE_SERVICE_INFO = BluetoothServiceInfo(
|
||||
name="B51782BC8",
|
||||
address="A4:C1:38:75:2B:C8",
|
||||
rssi=-66,
|
||||
manufacturer_data={
|
||||
1: b"\x01\x01\x01\x00\x2a\xf7\x64\x00\x03",
|
||||
76: b"\x02\x15INTELLI_ROCKS_HWPu\xf2\xff\xc2",
|
||||
},
|
||||
service_data={},
|
||||
service_uuids=["0000ec88-0000-1000-8000-00805f9b34fb"],
|
||||
source="local",
|
||||
)
|
||||
GVH5178_PRIMARY_SERVICE_INFO = BluetoothServiceInfo(
|
||||
name="B51782BC8",
|
||||
address="A4:C1:38:75:2B:C8",
|
||||
rssi=-66,
|
||||
manufacturer_data={
|
||||
1: b"\x01\x01\x00\x00\x2a\xf7\x64\x00\x03",
|
||||
76: b"\x02\x15INTELLI_ROCKS_HWPu\xf2\xff\xc2",
|
||||
},
|
||||
service_data={},
|
||||
service_uuids=["0000ec88-0000-1000-8000-00805f9b34fb"],
|
||||
source="local",
|
||||
)
|
||||
|
||||
GVH5178_SERVICE_INFO_ERROR = BluetoothServiceInfo(
|
||||
name="B51782BC8",
|
||||
address="A4:C1:38:75:2B:C8",
|
||||
|
|
|
@ -1,4 +1,11 @@
|
|||
"""Test the Govee BLE sensors."""
|
||||
from datetime import timedelta
|
||||
import time
|
||||
from unittest.mock import patch
|
||||
|
||||
from homeassistant.components.bluetooth import (
|
||||
FALLBACK_MAXIMUM_STALE_ADVERTISEMENT_SECONDS,
|
||||
)
|
||||
from homeassistant.components.govee_ble.const import DOMAIN
|
||||
from homeassistant.components.sensor import ATTR_STATE_CLASS
|
||||
from homeassistant.const import (
|
||||
|
@ -7,11 +14,20 @@ from homeassistant.const import (
|
|||
STATE_UNAVAILABLE,
|
||||
)
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.util import dt as dt_util
|
||||
|
||||
from . import GVH5075_SERVICE_INFO, GVH5178_SERVICE_INFO_ERROR
|
||||
from . import (
|
||||
GVH5075_SERVICE_INFO,
|
||||
GVH5178_PRIMARY_SERVICE_INFO,
|
||||
GVH5178_REMOTE_SERVICE_INFO,
|
||||
GVH5178_SERVICE_INFO_ERROR,
|
||||
)
|
||||
|
||||
from tests.common import MockConfigEntry
|
||||
from tests.components.bluetooth import inject_bluetooth_service_info
|
||||
from tests.common import MockConfigEntry, async_fire_time_changed
|
||||
from tests.components.bluetooth import (
|
||||
inject_bluetooth_service_info,
|
||||
patch_all_discovered_devices,
|
||||
)
|
||||
|
||||
|
||||
async def test_sensors(hass: HomeAssistant) -> None:
|
||||
|
@ -62,3 +78,80 @@ async def test_gvh5178_error(hass: HomeAssistant) -> None:
|
|||
|
||||
assert await hass.config_entries.async_unload(entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
|
||||
async def test_gvh5178_multi_sensor(hass: HomeAssistant) -> None:
|
||||
"""Test H5178 with a primary and remote sensor.
|
||||
|
||||
The gateway sensor is responsible for broadcasting the state for
|
||||
all sensors and it does so in many advertisements. We want
|
||||
all the connected devices to stay available when the gateway
|
||||
sensor is available.
|
||||
"""
|
||||
start_monotonic = time.monotonic()
|
||||
entry = MockConfigEntry(
|
||||
domain=DOMAIN,
|
||||
unique_id="A4:C1:38:75:2B:C8",
|
||||
)
|
||||
entry.add_to_hass(hass)
|
||||
|
||||
assert await hass.config_entries.async_setup(entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert len(hass.states.async_all()) == 0
|
||||
inject_bluetooth_service_info(hass, GVH5178_REMOTE_SERVICE_INFO)
|
||||
await hass.async_block_till_done()
|
||||
assert len(hass.states.async_all()) == 3
|
||||
|
||||
temp_sensor = hass.states.get("sensor.b51782bc8_remote_temperature")
|
||||
assert temp_sensor.state == "1.0"
|
||||
|
||||
assert await hass.config_entries.async_unload(entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
# Fastforward time without BLE advertisements
|
||||
monotonic_now = start_monotonic + FALLBACK_MAXIMUM_STALE_ADVERTISEMENT_SECONDS + 1
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.bluetooth.manager.MONOTONIC_TIME",
|
||||
return_value=monotonic_now,
|
||||
), patch_all_discovered_devices([]):
|
||||
async_fire_time_changed(
|
||||
hass,
|
||||
dt_util.utcnow()
|
||||
+ timedelta(seconds=FALLBACK_MAXIMUM_STALE_ADVERTISEMENT_SECONDS + 1),
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert await hass.config_entries.async_setup(entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
temp_sensor = hass.states.get("sensor.b51782bc8_remote_temperature")
|
||||
assert temp_sensor.state == STATE_UNAVAILABLE
|
||||
|
||||
inject_bluetooth_service_info(hass, GVH5178_PRIMARY_SERVICE_INFO)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
temp_sensor = hass.states.get("sensor.b51782bc8_remote_temperature")
|
||||
assert temp_sensor.state == "1.0"
|
||||
|
||||
primary_temp_sensor = hass.states.get("sensor.b51782bc8_primary_temperature")
|
||||
assert primary_temp_sensor.state == "1.0"
|
||||
|
||||
# Fastforward time without BLE advertisements
|
||||
with patch(
|
||||
"homeassistant.components.bluetooth.manager.MONOTONIC_TIME",
|
||||
return_value=monotonic_now,
|
||||
), patch_all_discovered_devices([]):
|
||||
async_fire_time_changed(
|
||||
hass,
|
||||
dt_util.utcnow()
|
||||
+ timedelta(seconds=FALLBACK_MAXIMUM_STALE_ADVERTISEMENT_SECONDS + 1),
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
temp_sensor = hass.states.get("sensor.b51782bc8_remote_temperature")
|
||||
assert temp_sensor.state == STATE_UNAVAILABLE
|
||||
|
||||
primary_temp_sensor = hass.states.get("sensor.b51782bc8_primary_temperature")
|
||||
assert primary_temp_sensor.state == STATE_UNAVAILABLE
|
||||
|
|
Loading…
Add table
Reference in a new issue