Add is_closed state attribute to cover (#164739)

This commit is contained in:
Erik Montnemery
2026-03-04 16:54:06 +01:00
committed by GitHub
parent 780dc178a1
commit d88c736016
35 changed files with 195 additions and 27 deletions
+4 -1
View File
@@ -91,6 +91,7 @@ class CoverEntityFeature(IntFlag):
ATTR_CURRENT_POSITION = "current_position"
ATTR_CURRENT_TILT_POSITION = "current_tilt_position"
ATTR_IS_CLOSED = "is_closed"
ATTR_POSITION = "position"
ATTR_TILT_POSITION = "tilt_position"
@@ -267,7 +268,9 @@ class CoverEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_):
@property
def state_attributes(self) -> dict[str, Any]:
"""Return the state attributes."""
data = {}
data: dict[str, Any] = {}
data[ATTR_IS_CLOSED] = self.is_closed
if (current := self.current_cover_position) is not None:
data[ATTR_CURRENT_POSITION] = current
@@ -41,6 +41,7 @@
'current_position': 90,
'device_class': 'damper',
'friendly_name': 'Zone 1 Damper',
'is_closed': False,
'supported_features': <CoverEntityFeature: 7>,
}),
'context': <ANY>,
@@ -93,6 +94,7 @@
'current_position': 100,
'device_class': 'damper',
'friendly_name': 'Zone 2 Damper',
'is_closed': False,
'supported_features': <CoverEntityFeature: 7>,
}),
'context': <ANY>,
@@ -40,6 +40,7 @@
'attributes': ReadOnlyDict({
'device_class': 'garage',
'friendly_name': 'Test Door',
'is_closed': True,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -41,6 +41,7 @@
'current_position': 75,
'device_class': 'shutter',
'friendly_name': 'Shutter mock 1',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -40,6 +40,7 @@
'attributes': ReadOnlyDict({
'device_class': 'shutter',
'friendly_name': 'Cover0',
'is_closed': None,
'supported_features': <CoverEntityFeature: 11>,
}),
'context': <ANY>,
+71 -25
View File
@@ -34,10 +34,10 @@ async def test_services(
# Test init all covers should be open
assert is_open(hass, ent1)
assert is_open(hass, ent2)
assert is_open(hass, ent2, 50)
assert is_open(hass, ent3)
assert is_open(hass, ent4)
assert is_open(hass, ent5)
assert is_open(hass, ent5, 50)
assert is_open(hass, ent6)
# call basic toggle services
@@ -50,10 +50,10 @@ async def test_services(
# entities should be either closed or closing, depending on if they report transitional states
assert is_closed(hass, ent1)
assert is_closing(hass, ent2)
assert is_closing(hass, ent2, 50)
assert is_closed(hass, ent3)
assert is_closed(hass, ent4)
assert is_closing(hass, ent5)
assert is_closing(hass, ent5, 50)
assert is_closing(hass, ent6)
# call basic toggle services and set different cover position states
@@ -68,10 +68,10 @@ async def test_services(
# entities should be in correct state depending on the SUPPORT_STOP feature and cover position
assert is_open(hass, ent1)
assert is_closed(hass, ent2)
assert is_closed(hass, ent2, 0)
assert is_open(hass, ent3)
assert is_open(hass, ent4)
assert is_open(hass, ent5)
assert is_open(hass, ent5, 15)
assert is_opening(hass, ent6)
# call basic toggle services
@@ -84,10 +84,10 @@ async def test_services(
# entities should be in correct state depending on the SUPPORT_STOP feature and cover position
assert is_closed(hass, ent1)
assert is_opening(hass, ent2)
assert is_opening(hass, ent2, 0, closed=True)
assert is_closed(hass, ent3)
assert is_closed(hass, ent4)
assert is_opening(hass, ent5)
assert is_opening(hass, ent5, 15)
assert is_closing(hass, ent6)
# Without STOP but still reports opening/closing has a 4th possible toggle state
@@ -98,13 +98,13 @@ async def test_services(
# After the unusual state transition: closing -> fully open, toggle should close
set_state(ent5, CoverState.OPEN)
await call_service(hass, SERVICE_TOGGLE, ent5) # Start closing
assert is_closing(hass, ent5)
assert is_closing(hass, ent5, 15)
set_state(
ent5, CoverState.OPEN
) # Unusual state transition from closing -> fully open
set_cover_position(ent5, 100)
await call_service(hass, SERVICE_TOGGLE, ent5) # Should close, not open
assert is_closing(hass, ent5)
assert is_closing(hass, ent5, 100)
def call_service(hass: HomeAssistant, service: str, ent: Entity) -> ServiceResponse:
@@ -124,21 +124,67 @@ def set_state(ent, state) -> None:
ent._values["state"] = state
def is_open(hass: HomeAssistant, ent: Entity) -> bool:
def _check_state(
hass: HomeAssistant,
ent: Entity,
*,
expected_state: str,
expected_position: int | None,
expected_is_closed: bool,
) -> bool:
"""Check if the state of a cover is as expected."""
state = hass.states.get(ent.entity_id)
correct_state = state.state == expected_state
correct_is_closed = state.attributes.get("is_closed") == expected_is_closed
correct_position = state.attributes.get("current_position") == expected_position
return all([correct_state, correct_is_closed, correct_position])
def is_open(hass: HomeAssistant, ent: Entity, position: int | None = None) -> bool:
"""Return if the cover is open based on the statemachine."""
return _check_state(
hass,
ent,
expected_state=CoverState.OPEN,
expected_position=position,
expected_is_closed=False,
)
def is_opening(
hass: HomeAssistant,
ent: Entity,
position: int | None = None,
*,
closed: bool = False,
) -> bool:
"""Return if the cover is opening based on the statemachine."""
return _check_state(
hass,
ent,
expected_state=CoverState.OPENING,
expected_position=position,
expected_is_closed=closed,
)
def is_closed(hass: HomeAssistant, ent: Entity, position: int | None = None) -> bool:
"""Return if the cover is closed based on the statemachine."""
return hass.states.is_state(ent.entity_id, CoverState.OPEN)
return _check_state(
hass,
ent,
expected_state=CoverState.CLOSED,
expected_position=position,
expected_is_closed=True,
)
def is_opening(hass: HomeAssistant, ent: Entity) -> bool:
"""Return if the cover is closed based on the statemachine."""
return hass.states.is_state(ent.entity_id, CoverState.OPENING)
def is_closed(hass: HomeAssistant, ent: Entity) -> bool:
"""Return if the cover is closed based on the statemachine."""
return hass.states.is_state(ent.entity_id, CoverState.CLOSED)
def is_closing(hass: HomeAssistant, ent: Entity) -> bool:
"""Return if the cover is closed based on the statemachine."""
return hass.states.is_state(ent.entity_id, CoverState.CLOSING)
def is_closing(hass: HomeAssistant, ent: Entity, position: int | None = None) -> bool:
"""Return if the cover is closing based on the statemachine."""
return _check_state(
hass,
ent,
expected_state=CoverState.CLOSING,
expected_position=position,
expected_is_closed=False,
)
@@ -41,6 +41,7 @@
'current_position': 0,
'device_class': 'shade',
'friendly_name': 'Window covering device',
'is_closed': True,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -94,6 +95,7 @@
'current_tilt_position': 97,
'device_class': 'damper',
'friendly_name': 'Vent',
'is_closed': False,
'supported_features': <CoverEntityFeature: 255>,
}),
'context': <ANY>,
@@ -147,6 +149,7 @@
'current_tilt_position': 100,
'device_class': 'shade',
'friendly_name': 'Covering device',
'is_closed': False,
'supported_features': <CoverEntityFeature: 255>,
}),
'context': <ANY>,
@@ -5,6 +5,7 @@
'current_position': 20,
'device_class': 'blind',
'friendly_name': 'Test',
'is_closed': False,
'supported_features': <CoverEntityFeature: 7>,
}),
'context': <ANY>,
@@ -40,6 +40,7 @@
'attributes': ReadOnlyDict({
'current_position': 0,
'friendly_name': 'ESPAN.DOM.01',
'is_closed': True,
'supported_features': <CoverEntityFeature: 11>,
}),
'context': <ANY>,
@@ -41,6 +41,7 @@
'current_position': 100,
'device_class': 'blind',
'friendly_name': 'fake_name',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
+2
View File
@@ -115,6 +115,7 @@ async def test_open_close_update(gogogate2api_mock, hass: HomeAssistant) -> None
"device_class": "garage",
"door_id": 1,
"friendly_name": "Door1",
"is_closed": False,
"supported_features": CoverEntityFeature.CLOSE | CoverEntityFeature.OPEN,
}
@@ -254,6 +255,7 @@ async def test_availability(ismartgateapi_mock, hass: HomeAssistant) -> None:
"device_class": "garage",
"door_id": 1,
"friendly_name": "Door1",
"is_closed": True,
"supported_features": CoverEntityFeature.CLOSE | CoverEntityFeature.OPEN,
}
+1 -1
View File
@@ -476,7 +476,7 @@ async def test_options_flow_hides_members(
assert entity_registry.async_get(f"{group_type}.three").hidden_by == hidden_by
COVER_ATTRS = [{"supported_features": 0}, {}]
COVER_ATTRS = [{"supported_features": 0}, {"is_closed": False}]
EVENT_ATTRS = [{"event_types": []}, {"event_type": None}]
FAN_ATTRS = [{"supported_features": 0}, {}]
LIGHT_ATTRS = [
@@ -11262,6 +11262,7 @@
'attributes': dict({
'current_position': 98,
'friendly_name': 'Family Room North',
'is_closed': False,
'supported_features': <CoverEntityFeature: 7>,
}),
'entity_id': 'cover.family_room_north',
@@ -11518,6 +11519,7 @@
'attributes': dict({
'current_position': 100,
'friendly_name': 'Kitchen Window',
'is_closed': False,
'supported_features': <CoverEntityFeature: 7>,
}),
'entity_id': 'cover.kitchen_window',
@@ -12754,6 +12756,7 @@
'attributes': dict({
'current_position': 98,
'friendly_name': 'Family Room North',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'entity_id': 'cover.family_room_north',
@@ -13010,6 +13013,7 @@
'attributes': dict({
'current_position': 100,
'friendly_name': 'Kitchen Window',
'is_closed': False,
'supported_features': <CoverEntityFeature: 7>,
}),
'entity_id': 'cover.kitchen_window',
@@ -21093,6 +21097,7 @@
'attributes': dict({
'current_position': 0,
'friendly_name': 'Master Bath South RYSE Shade',
'is_closed': True,
'supported_features': <CoverEntityFeature: 7>,
}),
'entity_id': 'cover.master_bath_south_ryse_shade',
@@ -21349,6 +21354,7 @@
'attributes': dict({
'current_position': 100,
'friendly_name': 'RYSE SmartShade RYSE Shade',
'is_closed': False,
'supported_features': <CoverEntityFeature: 7>,
}),
'entity_id': 'cover.ryse_smartshade_ryse_shade',
@@ -21528,6 +21534,7 @@
'attributes': dict({
'current_position': 100,
'friendly_name': 'BR Left RYSE Shade',
'is_closed': False,
'supported_features': <CoverEntityFeature: 7>,
}),
'entity_id': 'cover.br_left_ryse_shade',
@@ -21703,6 +21710,7 @@
'attributes': dict({
'current_position': 0,
'friendly_name': 'LR Left RYSE Shade',
'is_closed': True,
'supported_features': <CoverEntityFeature: 7>,
}),
'entity_id': 'cover.lr_left_ryse_shade',
@@ -21878,6 +21886,7 @@
'attributes': dict({
'current_position': 0,
'friendly_name': 'LR Right RYSE Shade',
'is_closed': True,
'supported_features': <CoverEntityFeature: 7>,
}),
'entity_id': 'cover.lr_right_ryse_shade',
@@ -22134,6 +22143,7 @@
'attributes': dict({
'current_position': 100,
'friendly_name': 'RZSS RYSE Shade',
'is_closed': False,
'supported_features': <CoverEntityFeature: 7>,
}),
'entity_id': 'cover.rzss_ryse_shade',
@@ -22634,6 +22644,7 @@
'current_position': 0,
'current_tilt_position': 100,
'friendly_name': 'VELUX Internal Cover Venetian Blinds',
'is_closed': True,
'supported_features': <CoverEntityFeature: 183>,
}),
'entity_id': 'cover.velux_internal_cover_venetian_blinds',
@@ -23727,6 +23738,7 @@
'current_position': 0,
'device_class': 'window',
'friendly_name': 'VELUX Window Roof Window',
'is_closed': True,
'supported_features': <CoverEntityFeature: 7>,
}),
'entity_id': 'cover.velux_window_roof_window',
@@ -23858,6 +23870,7 @@
'current_position': 0,
'device_class': 'window',
'friendly_name': 'VELUX Window Roof Window',
'is_closed': True,
'supported_features': <CoverEntityFeature: 7>,
}),
'entity_id': 'cover.velux_window_roof_window',
@@ -23988,6 +24001,7 @@
'attributes': dict({
'current_position': 0,
'friendly_name': 'VELUX External Cover Awning Blinds',
'is_closed': True,
'supported_features': <CoverEntityFeature: 7>,
}),
'entity_id': 'cover.velux_external_cover_awning_blinds',
@@ -40,6 +40,7 @@
'attributes': ReadOnlyDict({
'assumed_state': True,
'friendly_name': 'TestModule Cover_Outputs',
'is_closed': True,
'supported_features': <CoverEntityFeature: 11>,
}),
'context': <ANY>,
@@ -91,6 +92,7 @@
'attributes': ReadOnlyDict({
'assumed_state': True,
'friendly_name': 'TestModule Cover_Relays',
'is_closed': True,
'supported_features': <CoverEntityFeature: 11>,
}),
'context': <ANY>,
@@ -142,6 +144,7 @@
'attributes': ReadOnlyDict({
'assumed_state': True,
'friendly_name': 'TestModule Cover_Relays_BS4',
'is_closed': True,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -193,6 +196,7 @@
'attributes': ReadOnlyDict({
'assumed_state': True,
'friendly_name': 'TestModule Cover_Relays_Module',
'is_closed': True,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -40,6 +40,7 @@
'attributes': ReadOnlyDict({
'current_position': 0,
'friendly_name': 'Test Cover',
'is_closed': True,
'lutron_integration_id': 'cover_id',
'supported_features': <CoverEntityFeature: 7>,
}),
@@ -41,6 +41,7 @@
'current_position': 100,
'device_class': 'shade',
'friendly_name': 'Eve Shutter Switch 20ECI1701',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -94,6 +95,7 @@
'current_tilt_position': 100,
'device_class': 'awning',
'friendly_name': 'Mock Full Window Covering',
'is_closed': False,
'supported_features': <CoverEntityFeature: 143>,
}),
'context': <ANY>,
@@ -145,6 +147,7 @@
'attributes': ReadOnlyDict({
'device_class': 'awning',
'friendly_name': 'Mock Lift Window Covering',
'is_closed': None,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -197,6 +200,7 @@
'current_position': 51,
'device_class': 'shade',
'friendly_name': 'Longan link WNCV DA01',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -249,6 +253,7 @@
'current_tilt_position': 100,
'device_class': 'blind',
'friendly_name': 'Mock PA Tilt Window Covering',
'is_closed': None,
'supported_features': <CoverEntityFeature: 139>,
}),
'context': <ANY>,
@@ -300,6 +305,7 @@
'attributes': ReadOnlyDict({
'device_class': 'blind',
'friendly_name': 'Mock Tilt Window Covering',
'is_closed': None,
'supported_features': <CoverEntityFeature: 139>,
}),
'context': <ANY>,
@@ -352,6 +358,7 @@
'current_position': 0,
'device_class': 'shade',
'friendly_name': 'Zemismart MT25B Roller Motor',
'is_closed': True,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -42,6 +42,7 @@
'current_position': 0,
'device_class': 'shutter',
'friendly_name': 'Bubendorff blind',
'is_closed': True,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -95,6 +96,7 @@
'current_position': 0,
'device_class': 'shutter',
'friendly_name': 'Entrance Blinds',
'is_closed': True,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -40,6 +40,7 @@
'attributes': ReadOnlyDict({
'device_class': 'garage',
'friendly_name': 'Test Garage 1',
'is_closed': True,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -91,6 +92,7 @@
'attributes': ReadOnlyDict({
'device_class': 'garage',
'friendly_name': 'Test Garage 2',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -142,6 +144,7 @@
'attributes': ReadOnlyDict({
'device_class': 'gate',
'friendly_name': 'Test Garage 3',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -193,6 +196,7 @@
'attributes': ReadOnlyDict({
'device_class': 'garage',
'friendly_name': 'Test Garage 4',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -4,6 +4,7 @@
'attributes': ReadOnlyDict({
'device_class': 'garage',
'friendly_name': 'Test Garage 1',
'is_closed': True,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -39,6 +39,7 @@
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': 'cover',
'is_closed': False,
'supported_features': <CoverEntityFeature: 11>,
}),
'context': <ANY>,
@@ -6862,6 +6862,7 @@
'attributes': ReadOnlyDict({
'device_class': 'shutter',
'friendly_name': 'Test name',
'is_closed': False,
'supported_features': <CoverEntityFeature: 11>,
}),
'context': <ANY>,
@@ -42,6 +42,7 @@
'current_position': 100,
'device_class': 'curtain',
'friendly_name': 'slide bedroom',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -41,6 +41,7 @@
'current_position': 100,
'device_class': 'shade',
'friendly_name': 'Curtain 1A',
'is_closed': False,
'supported_features': <CoverEntityFeature: 7>,
}),
'context': <ANY>,
@@ -94,6 +95,7 @@
'current_position': 32,
'device_class': 'shade',
'friendly_name': 'Kitchen IKEA KADRILJ Window blind',
'is_closed': False,
'supported_features': <CoverEntityFeature: 7>,
}),
'context': <ANY>,
@@ -4,6 +4,7 @@
'attributes': ReadOnlyDict({
'device_class': 'garage',
'friendly_name': 'Door 1',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -86,6 +87,7 @@
'attributes': ReadOnlyDict({
'device_class': 'garage',
'friendly_name': 'Door 2',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -4,6 +4,7 @@
'attributes': ReadOnlyDict({
'current_position': 100,
'friendly_name': 'My template',
'is_closed': False,
'supported_features': <CoverEntityFeature: 7>,
}),
'context': <ANY>,
@@ -40,6 +40,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Charge port door',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -91,6 +92,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Frunk',
'is_closed': True,
'supported_features': <CoverEntityFeature: 1>,
}),
'context': <ANY>,
@@ -142,6 +144,7 @@
'attributes': ReadOnlyDict({
'device_class': 'window',
'friendly_name': 'Test Sunroof',
'is_closed': False,
'supported_features': <CoverEntityFeature: 11>,
}),
'context': <ANY>,
@@ -193,6 +196,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Trunk',
'is_closed': True,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -244,6 +248,7 @@
'attributes': ReadOnlyDict({
'device_class': 'window',
'friendly_name': 'Test Windows',
'is_closed': True,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -295,6 +300,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Charge port door',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -346,6 +352,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Frunk',
'is_closed': False,
'supported_features': <CoverEntityFeature: 1>,
}),
'context': <ANY>,
@@ -397,6 +404,7 @@
'attributes': ReadOnlyDict({
'device_class': 'window',
'friendly_name': 'Test Sunroof',
'is_closed': None,
'supported_features': <CoverEntityFeature: 11>,
}),
'context': <ANY>,
@@ -448,6 +456,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Trunk',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -499,6 +508,7 @@
'attributes': ReadOnlyDict({
'device_class': 'window',
'friendly_name': 'Test Windows',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -550,6 +560,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Charge port door',
'is_closed': False,
'supported_features': <CoverEntityFeature: 0>,
}),
'context': <ANY>,
@@ -601,6 +612,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Frunk',
'is_closed': True,
'supported_features': <CoverEntityFeature: 0>,
}),
'context': <ANY>,
@@ -652,6 +664,7 @@
'attributes': ReadOnlyDict({
'device_class': 'window',
'friendly_name': 'Test Sunroof',
'is_closed': False,
'supported_features': <CoverEntityFeature: 0>,
}),
'context': <ANY>,
@@ -703,6 +716,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Trunk',
'is_closed': True,
'supported_features': <CoverEntityFeature: 0>,
}),
'context': <ANY>,
@@ -754,6 +768,7 @@
'attributes': ReadOnlyDict({
'device_class': 'window',
'friendly_name': 'Test Windows',
'is_closed': True,
'supported_features': <CoverEntityFeature: 0>,
}),
'context': <ANY>,
@@ -40,6 +40,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Charge port door',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -91,6 +92,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Frunk',
'is_closed': True,
'supported_features': <CoverEntityFeature: 1>,
}),
'context': <ANY>,
@@ -142,6 +144,7 @@
'attributes': ReadOnlyDict({
'device_class': 'window',
'friendly_name': 'Test Sunroof',
'is_closed': False,
'supported_features': <CoverEntityFeature: 11>,
}),
'context': <ANY>,
@@ -193,6 +196,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Trunk',
'is_closed': True,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -244,6 +248,7 @@
'attributes': ReadOnlyDict({
'device_class': 'window',
'friendly_name': 'Test Windows',
'is_closed': True,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -295,6 +300,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Charge port door',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -346,6 +352,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Frunk',
'is_closed': False,
'supported_features': <CoverEntityFeature: 1>,
}),
'context': <ANY>,
@@ -397,6 +404,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Trunk',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -448,6 +456,7 @@
'attributes': ReadOnlyDict({
'device_class': 'window',
'friendly_name': 'Test Windows',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -499,6 +508,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Charge port door',
'is_closed': False,
'supported_features': <CoverEntityFeature: 0>,
}),
'context': <ANY>,
@@ -550,6 +560,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Frunk',
'is_closed': True,
'supported_features': <CoverEntityFeature: 0>,
}),
'context': <ANY>,
@@ -601,6 +612,7 @@
'attributes': ReadOnlyDict({
'device_class': 'window',
'friendly_name': 'Test Sunroof',
'is_closed': False,
'supported_features': <CoverEntityFeature: 0>,
}),
'context': <ANY>,
@@ -652,6 +664,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Trunk',
'is_closed': True,
'supported_features': <CoverEntityFeature: 0>,
}),
'context': <ANY>,
@@ -703,6 +716,7 @@
'attributes': ReadOnlyDict({
'device_class': 'window',
'friendly_name': 'Test Windows',
'is_closed': True,
'supported_features': <CoverEntityFeature: 0>,
}),
'context': <ANY>,
@@ -40,6 +40,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Charge port door',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -91,6 +92,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Frunk',
'is_closed': True,
'supported_features': <CoverEntityFeature: 1>,
}),
'context': <ANY>,
@@ -142,6 +144,7 @@
'attributes': ReadOnlyDict({
'device_class': 'window',
'friendly_name': 'Test Sunroof',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -193,6 +196,7 @@
'attributes': ReadOnlyDict({
'device_class': 'door',
'friendly_name': 'Test Trunk',
'is_closed': True,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -244,6 +248,7 @@
'attributes': ReadOnlyDict({
'device_class': 'window',
'friendly_name': 'Test Vent windows',
'is_closed': True,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -41,6 +41,7 @@
'current_position': 0,
'device_class': 'curtain',
'friendly_name': 'bedroom blinds Curtain',
'is_closed': True,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -93,6 +94,7 @@
'current_position': 36,
'device_class': 'curtain',
'friendly_name': 'blinds Curtain',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -145,6 +147,7 @@
'current_position': 0,
'device_class': 'curtain',
'friendly_name': 'Dining 1 Curtain',
'is_closed': True,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -196,6 +199,7 @@
'attributes': ReadOnlyDict({
'device_class': 'curtain',
'friendly_name': 'Estore Sala Curtain',
'is_closed': None,
'supported_features': <CoverEntityFeature: 11>,
}),
'context': <ANY>,
@@ -248,6 +252,7 @@
'current_position': 0,
'device_class': 'curtain',
'friendly_name': 'Fenster Küche Curtain',
'is_closed': True,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -299,6 +304,7 @@
'attributes': ReadOnlyDict({
'device_class': 'garage',
'friendly_name': 'Garage door Door 1',
'is_closed': False,
'supported_features': <CoverEntityFeature: 3>,
}),
'context': <ANY>,
@@ -350,6 +356,7 @@
'attributes': ReadOnlyDict({
'device_class': 'curtain',
'friendly_name': 'Kit-Blinds Curtain',
'is_closed': False,
'supported_features': <CoverEntityFeature: 11>,
}),
'context': <ANY>,
@@ -402,6 +409,7 @@
'current_position': 100,
'device_class': 'blind',
'friendly_name': 'Kitchen Blinds Blind',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -454,6 +462,7 @@
'current_position': 48,
'device_class': 'curtain',
'friendly_name': 'Kitchen Blinds Curtain',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -506,6 +515,7 @@
'current_position': 100,
'device_class': 'curtain',
'friendly_name': 'Lounge Dark Blind Curtain',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -558,6 +568,7 @@
'current_position': 100,
'device_class': 'curtain',
'friendly_name': 'Pergola Curtain',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -610,6 +621,7 @@
'current_position': 100,
'device_class': 'curtain',
'friendly_name': 'Persiana do Quarto Curtain',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -662,6 +674,7 @@
'current_position': 100,
'device_class': 'curtain',
'friendly_name': 'Projector Screen Curtain',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -714,6 +727,7 @@
'current_position': 75,
'device_class': 'curtain',
'friendly_name': 'Roller shutter Living Room Curtain',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -766,6 +780,7 @@
'current_position': 0,
'device_class': 'curtain',
'friendly_name': 'Tapparelle studio Curtain',
'is_closed': True,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -818,6 +833,7 @@
'current_position': 100,
'device_class': 'curtain',
'friendly_name': 'VIVIDSTORM SCREEN Curtain',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -40,6 +40,7 @@
'attributes': ReadOnlyDict({
'current_position': 50,
'friendly_name': 'Basement CoverName',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -91,6 +92,7 @@
'attributes': ReadOnlyDict({
'assumed_state': True,
'friendly_name': 'Basement CoverNameNoPos',
'is_closed': False,
'supported_features': <CoverEntityFeature: 11>,
}),
'context': <ANY>,
@@ -42,6 +42,7 @@
'current_tilt_position': 75,
'device_class': 'blind',
'friendly_name': 'Test Blind',
'is_closed': False,
'supported_features': <CoverEntityFeature: 255>,
}),
'context': <ANY>,
@@ -94,6 +95,7 @@
'current_position': 70,
'device_class': 'awning',
'friendly_name': 'Test Awning',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -146,6 +148,7 @@
'current_position': 70,
'device_class': 'shutter',
'friendly_name': 'Test DualRollerShutter',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -198,6 +201,7 @@
'current_position': 70,
'device_class': 'shutter',
'friendly_name': 'Test DualRollerShutter Lower shutter',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -250,6 +254,7 @@
'current_position': 70,
'device_class': 'shutter',
'friendly_name': 'Test DualRollerShutter Upper shutter',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -302,6 +307,7 @@
'current_position': 70,
'device_class': 'garage',
'friendly_name': 'Test GarageDoor',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -354,6 +360,7 @@
'current_position': 70,
'device_class': 'gate',
'friendly_name': 'Test Gate',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -406,6 +413,7 @@
'current_position': 70,
'device_class': 'shutter',
'friendly_name': 'Test RollerShutter',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -458,6 +466,7 @@
'current_position': 70,
'device_class': 'window',
'friendly_name': 'Test Window',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
@@ -30,6 +30,7 @@
'current_position': 70,
'device_class': 'window',
'friendly_name': 'Test Window',
'is_closed': False,
'supported_features': 15,
}),
'entity_id': 'cover.test_window',
@@ -37,6 +37,7 @@
'current_position': 0,
'device_class': 'awning',
'friendly_name': 'Markise',
'is_closed': True,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,
+1
View File
@@ -56,6 +56,7 @@ def mock_api_device(
mock_api_device.manufacture_info = mock_manfacture_info
mock_api_device.brightness = 0
mock_api_device.is_closed = False
mock_api_device.percentage = 0
return mock_api_device
@@ -5,6 +5,7 @@
'current_position': 0,
'device_class': 'garage',
'friendly_name': 'Cover Controller Test Entity Name',
'is_closed': False,
'supported_features': <CoverEntityFeature: 15>,
}),
'context': <ANY>,