Remove zerproc threaded upstream reconnect logic (#43910)
This commit is contained in:
parent
6e74f90136
commit
c4426a73b3
5 changed files with 50 additions and 30 deletions
|
@ -36,7 +36,7 @@ def connect_lights(lights: List[pyzerproc.Light]) -> List[pyzerproc.Light]:
|
||||||
connected = []
|
connected = []
|
||||||
for light in lights:
|
for light in lights:
|
||||||
try:
|
try:
|
||||||
light.connect(auto_reconnect=True)
|
light.connect()
|
||||||
connected.append(light)
|
connected.append(light)
|
||||||
except pyzerproc.ZerprocException:
|
except pyzerproc.ZerprocException:
|
||||||
_LOGGER.debug("Unable to connect to '%s'", light.address, exc_info=True)
|
_LOGGER.debug("Unable to connect to '%s'", light.address, exc_info=True)
|
||||||
|
@ -193,6 +193,8 @@ class ZerprocLight(LightEntity):
|
||||||
def update(self):
|
def update(self):
|
||||||
"""Fetch new state data for this light."""
|
"""Fetch new state data for this light."""
|
||||||
try:
|
try:
|
||||||
|
if not self._light.connected:
|
||||||
|
self._light.connect()
|
||||||
state = self._light.get_state()
|
state = self._light.get_state()
|
||||||
except pyzerproc.ZerprocException:
|
except pyzerproc.ZerprocException:
|
||||||
if self._available:
|
if self._available:
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"config_flow": true,
|
"config_flow": true,
|
||||||
"documentation": "https://www.home-assistant.io/integrations/zerproc",
|
"documentation": "https://www.home-assistant.io/integrations/zerproc",
|
||||||
"requirements": [
|
"requirements": [
|
||||||
"pyzerproc==0.2.5"
|
"pyzerproc==0.3.0"
|
||||||
],
|
],
|
||||||
"codeowners": [
|
"codeowners": [
|
||||||
"@emlove"
|
"@emlove"
|
||||||
|
|
|
@ -1903,7 +1903,7 @@ pyxeoma==1.4.1
|
||||||
pyzbar==0.1.7
|
pyzbar==0.1.7
|
||||||
|
|
||||||
# homeassistant.components.zerproc
|
# homeassistant.components.zerproc
|
||||||
pyzerproc==0.2.5
|
pyzerproc==0.3.0
|
||||||
|
|
||||||
# homeassistant.components.qnap
|
# homeassistant.components.qnap
|
||||||
qnapstats==0.3.0
|
qnapstats==0.3.0
|
||||||
|
|
|
@ -932,7 +932,7 @@ pywebpush==1.9.2
|
||||||
pywilight==0.0.65
|
pywilight==0.0.65
|
||||||
|
|
||||||
# homeassistant.components.zerproc
|
# homeassistant.components.zerproc
|
||||||
pyzerproc==0.2.5
|
pyzerproc==0.3.0
|
||||||
|
|
||||||
# homeassistant.components.rachio
|
# homeassistant.components.rachio
|
||||||
rachiopy==1.0.3
|
rachiopy==1.0.3
|
||||||
|
|
|
@ -24,19 +24,27 @@ from homeassistant.const import (
|
||||||
)
|
)
|
||||||
import homeassistant.util.dt as dt_util
|
import homeassistant.util.dt as dt_util
|
||||||
|
|
||||||
from tests.async_mock import patch
|
from tests.async_mock import MagicMock, patch
|
||||||
from tests.common import MockConfigEntry, async_fire_time_changed
|
from tests.common import MockConfigEntry, async_fire_time_changed
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
async def mock_light(hass):
|
async def mock_entry(hass):
|
||||||
|
"""Create a mock light entity."""
|
||||||
|
return MockConfigEntry(domain=DOMAIN)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
async def mock_light(hass, mock_entry):
|
||||||
"""Create a mock light entity."""
|
"""Create a mock light entity."""
|
||||||
await setup.async_setup_component(hass, "persistent_notification", {})
|
await setup.async_setup_component(hass, "persistent_notification", {})
|
||||||
|
|
||||||
mock_entry = MockConfigEntry(domain=DOMAIN)
|
|
||||||
mock_entry.add_to_hass(hass)
|
mock_entry.add_to_hass(hass)
|
||||||
|
|
||||||
light = pyzerproc.Light("AA:BB:CC:DD:EE:FF", "LEDBlue-CCDDEEFF")
|
light = MagicMock(spec=pyzerproc.Light)
|
||||||
|
light.address = "AA:BB:CC:DD:EE:FF"
|
||||||
|
light.name = "LEDBlue-CCDDEEFF"
|
||||||
|
light.connected = False
|
||||||
|
|
||||||
mock_state = pyzerproc.LightState(False, (0, 0, 0))
|
mock_state = pyzerproc.LightState(False, (0, 0, 0))
|
||||||
|
|
||||||
|
@ -49,31 +57,36 @@ async def mock_light(hass):
|
||||||
await hass.config_entries.async_setup(mock_entry.entry_id)
|
await hass.config_entries.async_setup(mock_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
light.connected = True
|
||||||
|
|
||||||
return light
|
return light
|
||||||
|
|
||||||
|
|
||||||
async def test_init(hass):
|
async def test_init(hass, mock_entry):
|
||||||
"""Test platform setup."""
|
"""Test platform setup."""
|
||||||
await setup.async_setup_component(hass, "persistent_notification", {})
|
await setup.async_setup_component(hass, "persistent_notification", {})
|
||||||
|
|
||||||
mock_entry = MockConfigEntry(domain=DOMAIN)
|
|
||||||
mock_entry.add_to_hass(hass)
|
mock_entry.add_to_hass(hass)
|
||||||
|
|
||||||
mock_light_1 = pyzerproc.Light("AA:BB:CC:DD:EE:FF", "LEDBlue-CCDDEEFF")
|
mock_light_1 = MagicMock(spec=pyzerproc.Light)
|
||||||
mock_light_2 = pyzerproc.Light("11:22:33:44:55:66", "LEDBlue-33445566")
|
mock_light_1.address = "AA:BB:CC:DD:EE:FF"
|
||||||
|
mock_light_1.name = "LEDBlue-CCDDEEFF"
|
||||||
|
mock_light_1.connected = True
|
||||||
|
|
||||||
|
mock_light_2 = MagicMock(spec=pyzerproc.Light)
|
||||||
|
mock_light_2.address = "11:22:33:44:55:66"
|
||||||
|
mock_light_2.name = "LEDBlue-33445566"
|
||||||
|
mock_light_2.connected = True
|
||||||
|
|
||||||
mock_state_1 = pyzerproc.LightState(False, (0, 0, 0))
|
mock_state_1 = pyzerproc.LightState(False, (0, 0, 0))
|
||||||
mock_state_2 = pyzerproc.LightState(True, (0, 80, 255))
|
mock_state_2 = pyzerproc.LightState(True, (0, 80, 255))
|
||||||
|
|
||||||
|
mock_light_1.get_state.return_value = mock_state_1
|
||||||
|
mock_light_2.get_state.return_value = mock_state_2
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.zerproc.light.pyzerproc.discover",
|
"homeassistant.components.zerproc.light.pyzerproc.discover",
|
||||||
return_value=[mock_light_1, mock_light_2],
|
return_value=[mock_light_1, mock_light_2],
|
||||||
), patch.object(mock_light_1, "connect"), patch.object(
|
|
||||||
mock_light_2, "connect"
|
|
||||||
), patch.object(
|
|
||||||
mock_light_1, "get_state", return_value=mock_state_1
|
|
||||||
), patch.object(
|
|
||||||
mock_light_2, "get_state", return_value=mock_state_2
|
|
||||||
):
|
):
|
||||||
await hass.config_entries.async_setup(mock_entry.entry_id)
|
await hass.config_entries.async_setup(mock_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
@ -98,22 +111,17 @@ async def test_init(hass):
|
||||||
ATTR_XY_COLOR: (0.138, 0.08),
|
ATTR_XY_COLOR: (0.138, 0.08),
|
||||||
}
|
}
|
||||||
|
|
||||||
with patch.object(hass.loop, "stop"), patch.object(
|
with patch.object(hass.loop, "stop"):
|
||||||
mock_light_1, "disconnect"
|
|
||||||
) as mock_disconnect_1, patch.object(
|
|
||||||
mock_light_2, "disconnect"
|
|
||||||
) as mock_disconnect_2:
|
|
||||||
await hass.async_stop()
|
await hass.async_stop()
|
||||||
|
|
||||||
assert mock_disconnect_1.called
|
assert mock_light_1.disconnect.called
|
||||||
assert mock_disconnect_2.called
|
assert mock_light_2.disconnect.called
|
||||||
|
|
||||||
|
|
||||||
async def test_discovery_exception(hass):
|
async def test_discovery_exception(hass, mock_entry):
|
||||||
"""Test platform setup."""
|
"""Test platform setup."""
|
||||||
await setup.async_setup_component(hass, "persistent_notification", {})
|
await setup.async_setup_component(hass, "persistent_notification", {})
|
||||||
|
|
||||||
mock_entry = MockConfigEntry(domain=DOMAIN)
|
|
||||||
mock_entry.add_to_hass(hass)
|
mock_entry.add_to_hass(hass)
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
|
@ -127,14 +135,16 @@ async def test_discovery_exception(hass):
|
||||||
assert len(hass.data[DOMAIN]["addresses"]) == 0
|
assert len(hass.data[DOMAIN]["addresses"]) == 0
|
||||||
|
|
||||||
|
|
||||||
async def test_connect_exception(hass):
|
async def test_connect_exception(hass, mock_entry):
|
||||||
"""Test platform setup."""
|
"""Test platform setup."""
|
||||||
await setup.async_setup_component(hass, "persistent_notification", {})
|
await setup.async_setup_component(hass, "persistent_notification", {})
|
||||||
|
|
||||||
mock_entry = MockConfigEntry(domain=DOMAIN)
|
|
||||||
mock_entry.add_to_hass(hass)
|
mock_entry.add_to_hass(hass)
|
||||||
|
|
||||||
mock_light = pyzerproc.Light("AA:BB:CC:DD:EE:FF", "LEDBlue-CCDDEEFF")
|
mock_light = MagicMock(spec=pyzerproc.Light)
|
||||||
|
mock_light.address = "AA:BB:CC:DD:EE:FF"
|
||||||
|
mock_light.name = "LEDBlue-CCDDEEFF"
|
||||||
|
mock_light.connected = False
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.zerproc.light.pyzerproc.discover",
|
"homeassistant.components.zerproc.light.pyzerproc.discover",
|
||||||
|
@ -149,6 +159,14 @@ async def test_connect_exception(hass):
|
||||||
assert len(hass.data[DOMAIN]["addresses"]) == 0
|
assert len(hass.data[DOMAIN]["addresses"]) == 0
|
||||||
|
|
||||||
|
|
||||||
|
async def test_remove_entry(hass, mock_light, mock_entry):
|
||||||
|
"""Test platform setup."""
|
||||||
|
with patch.object(mock_light, "disconnect") as mock_disconnect:
|
||||||
|
await hass.config_entries.async_remove(mock_entry.entry_id)
|
||||||
|
|
||||||
|
assert mock_disconnect.called
|
||||||
|
|
||||||
|
|
||||||
async def test_light_turn_on(hass, mock_light):
|
async def test_light_turn_on(hass, mock_light):
|
||||||
"""Test ZerprocLight turn_on."""
|
"""Test ZerprocLight turn_on."""
|
||||||
utcnow = dt_util.utcnow()
|
utcnow = dt_util.utcnow()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue