Add OPENING & CLOSING state to MySensors cover (#47285)

* Added OPENING & CLOSING State Support

Added support for OPENING and CLOSING states using a combination of
the required V_ variables. Simplified the determination of the
cover's state by use of a new enumeration and single method allowing
the state to be used by all three HomeAssistant query methods.

* Fixes for HomeAssistant Style

Corrections to style to allow flake8, isort, and black to pass.

* Peer Review Changes

Added @unique to the main enumeration. Removed unnecessary parens from
door state logic. Reordered CLOSING and CLOSED in the enumeration.
This commit is contained in:
FidgetyRat 2021-03-06 04:26:04 -05:00 committed by GitHub
parent c7718f2b3b
commit 4cade4b736
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 5 deletions

View File

@ -1,4 +1,5 @@
"""Support for MySensors covers.""" """Support for MySensors covers."""
from enum import Enum, unique
import logging import logging
from typing import Callable from typing import Callable
@ -14,6 +15,16 @@ from homeassistant.helpers.typing import HomeAssistantType
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@unique
class CoverState(Enum):
"""An enumeration of the standard cover states."""
OPEN = 0
OPENING = 1
CLOSING = 2
CLOSED = 3
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistantType, config_entry: ConfigEntry, async_add_entities: Callable hass: HomeAssistantType, config_entry: ConfigEntry, async_add_entities: Callable
): ):
@ -43,13 +54,44 @@ async def async_setup_entry(
class MySensorsCover(mysensors.device.MySensorsEntity, CoverEntity): class MySensorsCover(mysensors.device.MySensorsEntity, CoverEntity):
"""Representation of the value of a MySensors Cover child node.""" """Representation of the value of a MySensors Cover child node."""
def get_cover_state(self):
"""Return a CoverState enum representing the state of the cover."""
set_req = self.gateway.const.SetReq
v_up = self._values.get(set_req.V_UP) == STATE_ON
v_down = self._values.get(set_req.V_DOWN) == STATE_ON
v_stop = self._values.get(set_req.V_STOP) == STATE_ON
# If a V_DIMMER or V_PERCENTAGE is available, that is the amount
# the cover is open. Otherwise, use 0 or 100 based on the V_LIGHT
# or V_STATUS.
amount = 100
if set_req.V_DIMMER in self._values:
amount = self._values.get(set_req.V_DIMMER)
else:
amount = 100 if self._values.get(set_req.V_LIGHT) == STATE_ON else 0
if v_up and not v_down and not v_stop:
return CoverState.OPENING
if not v_up and v_down and not v_stop:
return CoverState.CLOSING
if not v_up and not v_down and v_stop and amount == 0:
return CoverState.CLOSED
return CoverState.OPEN
@property @property
def is_closed(self): def is_closed(self):
"""Return True if cover is closed.""" """Return True if the cover is closed."""
set_req = self.gateway.const.SetReq return self.get_cover_state() == CoverState.CLOSED
if set_req.V_DIMMER in self._values:
return self._values.get(set_req.V_DIMMER) == 0 @property
return self._values.get(set_req.V_LIGHT) == STATE_OFF def is_closing(self):
"""Return True if the cover is closing."""
return self.get_cover_state() == CoverState.CLOSING
@property
def is_opening(self):
"""Return True if the cover is opening."""
return self.get_cover_state() == CoverState.OPENING
@property @property
def current_cover_position(self): def current_cover_position(self):

View File

@ -162,6 +162,9 @@ class MySensorsDevice:
set_req.V_LIGHT, set_req.V_LIGHT,
set_req.V_LOCK_STATUS, set_req.V_LOCK_STATUS,
set_req.V_TRIPPED, set_req.V_TRIPPED,
set_req.V_UP,
set_req.V_DOWN,
set_req.V_STOP,
): ):
self._values[value_type] = STATE_ON if int(value) == 1 else STATE_OFF self._values[value_type] = STATE_ON if int(value) == 1 else STATE_OFF
elif value_type == set_req.V_DIMMER: elif value_type == set_req.V_DIMMER: