Removing gogogate2 emulated cover transitional states. (#38199)
This commit is contained in:
parent
1776540757
commit
da380d89c2
2 changed files with 6 additions and 63 deletions
|
@ -1,5 +1,4 @@
|
||||||
"""Support for Gogogate2 garage Doors."""
|
"""Support for Gogogate2 garage Doors."""
|
||||||
from datetime import datetime, timedelta
|
|
||||||
import logging
|
import logging
|
||||||
from typing import Callable, List, Optional
|
from typing import Callable, List, Optional
|
||||||
|
|
||||||
|
@ -13,13 +12,7 @@ from homeassistant.components.cover import (
|
||||||
CoverEntity,
|
CoverEntity,
|
||||||
)
|
)
|
||||||
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
|
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
|
||||||
from homeassistant.const import (
|
from homeassistant.const import CONF_IP_ADDRESS, CONF_PASSWORD, CONF_USERNAME
|
||||||
CONF_IP_ADDRESS,
|
|
||||||
CONF_PASSWORD,
|
|
||||||
CONF_USERNAME,
|
|
||||||
STATE_CLOSING,
|
|
||||||
STATE_OPENING,
|
|
||||||
)
|
|
||||||
from homeassistant.core import HomeAssistant, callback
|
from homeassistant.core import HomeAssistant, callback
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
from homeassistant.helpers.entity import Entity
|
from homeassistant.helpers.entity import Entity
|
||||||
|
@ -86,8 +79,6 @@ class Gogogate2Cover(CoverEntity):
|
||||||
self._api = data_update_coordinator.api
|
self._api = data_update_coordinator.api
|
||||||
self._unique_id = cover_unique_id(config_entry, door)
|
self._unique_id = cover_unique_id(config_entry, door)
|
||||||
self._is_available = True
|
self._is_available = True
|
||||||
self._transition_state: Optional[str] = None
|
|
||||||
self._transition_state_start: Optional[datetime] = None
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def available(self) -> bool:
|
def available(self) -> bool:
|
||||||
|
@ -119,16 +110,6 @@ class Gogogate2Cover(CoverEntity):
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@property
|
|
||||||
def is_opening(self):
|
|
||||||
"""Return if the cover is opening or not."""
|
|
||||||
return self._transition_state == STATE_OPENING
|
|
||||||
|
|
||||||
@property
|
|
||||||
def is_closing(self):
|
|
||||||
"""Return if the cover is closing or not."""
|
|
||||||
return self._transition_state == STATE_CLOSING
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def device_class(self):
|
def device_class(self):
|
||||||
"""Return the class of this device, from component DEVICE_CLASSES."""
|
"""Return the class of this device, from component DEVICE_CLASSES."""
|
||||||
|
@ -142,14 +123,10 @@ class Gogogate2Cover(CoverEntity):
|
||||||
async def async_open_cover(self, **kwargs):
|
async def async_open_cover(self, **kwargs):
|
||||||
"""Open the door."""
|
"""Open the door."""
|
||||||
await self.hass.async_add_executor_job(self._api.open_door, self._door.door_id)
|
await self.hass.async_add_executor_job(self._api.open_door, self._door.door_id)
|
||||||
self._transition_state = STATE_OPENING
|
|
||||||
self._transition_state_start = datetime.now()
|
|
||||||
|
|
||||||
async def async_close_cover(self, **kwargs):
|
async def async_close_cover(self, **kwargs):
|
||||||
"""Close the door."""
|
"""Close the door."""
|
||||||
await self.hass.async_add_executor_job(self._api.close_door, self._door.door_id)
|
await self.hass.async_add_executor_job(self._api.close_door, self._door.door_id)
|
||||||
self._transition_state = STATE_CLOSING
|
|
||||||
self._transition_state_start = datetime.now()
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def state_attributes(self):
|
def state_attributes(self):
|
||||||
|
@ -168,16 +145,6 @@ class Gogogate2Cover(CoverEntity):
|
||||||
|
|
||||||
door = get_door_by_id(self._door.door_id, self._data_update_coordinator.data)
|
door = get_door_by_id(self._door.door_id, self._data_update_coordinator.data)
|
||||||
|
|
||||||
# Check if the transition state should expire.
|
|
||||||
if self._transition_state:
|
|
||||||
is_transition_state_expired = (
|
|
||||||
datetime.now() - self._transition_state_start
|
|
||||||
) > timedelta(seconds=60)
|
|
||||||
|
|
||||||
if is_transition_state_expired or self._door.status != door.status:
|
|
||||||
self._transition_state = None
|
|
||||||
self._transition_state_start = None
|
|
||||||
|
|
||||||
# Set the state.
|
# Set the state.
|
||||||
self._door = door
|
self._door = door
|
||||||
self._is_available = True
|
self._is_available = True
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
"""Tests for the GogoGate2 component."""
|
"""Tests for the GogoGate2 component."""
|
||||||
from datetime import datetime, timedelta
|
|
||||||
from unittest.mock import MagicMock, patch
|
|
||||||
|
|
||||||
from gogogate2_api import GogoGate2Api
|
from gogogate2_api import GogoGate2Api
|
||||||
from gogogate2_api.common import (
|
from gogogate2_api.common import (
|
||||||
ActivateResponse,
|
ActivateResponse,
|
||||||
|
@ -24,15 +21,15 @@ from homeassistant.const import (
|
||||||
CONF_PLATFORM,
|
CONF_PLATFORM,
|
||||||
CONF_USERNAME,
|
CONF_USERNAME,
|
||||||
STATE_CLOSED,
|
STATE_CLOSED,
|
||||||
STATE_CLOSING,
|
|
||||||
STATE_OPEN,
|
STATE_OPEN,
|
||||||
STATE_OPENING,
|
|
||||||
STATE_UNAVAILABLE,
|
STATE_UNAVAILABLE,
|
||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
|
|
||||||
from .common import ComponentFactory
|
from .common import ComponentFactory
|
||||||
|
|
||||||
|
from tests.async_mock import MagicMock
|
||||||
|
|
||||||
|
|
||||||
async def test_import_fail(
|
async def test_import_fail(
|
||||||
hass: HomeAssistant, component_factory: ComponentFactory
|
hass: HomeAssistant, component_factory: ComponentFactory
|
||||||
|
@ -405,11 +402,6 @@ async def test_open_close(
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
component_data.api.close_door.assert_called_with(1)
|
component_data.api.close_door.assert_called_with(1)
|
||||||
await hass.services.async_call(
|
|
||||||
HA_DOMAIN, "update_entity", service_data={"entity_id": "cover.door1"},
|
|
||||||
)
|
|
||||||
await hass.async_block_till_done()
|
|
||||||
assert hass.states.get("cover.door1").state == STATE_CLOSING
|
|
||||||
|
|
||||||
component_data.data_update_coordinator.api.info.return_value = closed_door_response
|
component_data.data_update_coordinator.api.info.return_value = closed_door_response
|
||||||
await component_data.data_update_coordinator.async_refresh()
|
await component_data.data_update_coordinator.async_refresh()
|
||||||
|
@ -422,35 +414,19 @@ async def test_open_close(
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
component_data.api.open_door.assert_called_with(1)
|
component_data.api.open_door.assert_called_with(1)
|
||||||
await hass.services.async_call(
|
|
||||||
HA_DOMAIN, "update_entity", service_data={"entity_id": "cover.door1"},
|
|
||||||
)
|
|
||||||
await hass.async_block_till_done()
|
|
||||||
assert hass.states.get("cover.door1").state == STATE_OPENING
|
|
||||||
|
|
||||||
# Assert the mid state does not change when the same status is returned.
|
# Assert the mid state does not change when the same status is returned.
|
||||||
component_data.data_update_coordinator.api.info.return_value = closed_door_response
|
component_data.data_update_coordinator.api.info.return_value = closed_door_response
|
||||||
await component_data.data_update_coordinator.async_refresh()
|
await component_data.data_update_coordinator.async_refresh()
|
||||||
component_data.data_update_coordinator.api.info.return_value = closed_door_response
|
component_data.data_update_coordinator.api.info.return_value = closed_door_response
|
||||||
|
await component_data.data_update_coordinator.async_refresh()
|
||||||
|
|
||||||
await component_data.data_update_coordinator.async_refresh()
|
await component_data.data_update_coordinator.async_refresh()
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
HA_DOMAIN, "update_entity", service_data={"entity_id": "cover.door1"},
|
HA_DOMAIN, "update_entity", service_data={"entity_id": "cover.door1"},
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
assert hass.states.get("cover.door1").state == STATE_OPENING
|
assert hass.states.get("cover.door1").state == STATE_CLOSED
|
||||||
|
|
||||||
# Assert the mid state times out.
|
|
||||||
with patch("homeassistant.components.gogogate2.cover.datetime") as datetime_mock:
|
|
||||||
datetime_mock.now.return_value = datetime.now() + timedelta(seconds=60.1)
|
|
||||||
component_data.data_update_coordinator.api.info.return_value = (
|
|
||||||
closed_door_response
|
|
||||||
)
|
|
||||||
await component_data.data_update_coordinator.async_refresh()
|
|
||||||
await hass.services.async_call(
|
|
||||||
HA_DOMAIN, "update_entity", service_data={"entity_id": "cover.door1"},
|
|
||||||
)
|
|
||||||
await hass.async_block_till_done()
|
|
||||||
assert hass.states.get("cover.door1").state == STATE_CLOSED
|
|
||||||
|
|
||||||
|
|
||||||
async def test_availability(
|
async def test_availability(
|
||||||
|
|
Loading…
Add table
Reference in a new issue