-
-
Notifications
You must be signed in to change notification settings - Fork 37.4k
Added gogogate2 cover #13467
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Added gogogate2 cover #13467
Changes from all commits
b1e0715
9408408
4f80a55
7c03e0a
37c1500
e52f2c0
a1c844a
381a8d6
403d3af
fa51dfd
2cdf95d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,120 @@ | ||
| """ | ||
| Support for Gogogate2 Garage Doors. | ||
|
|
||
| For more details about this platform, please refer to the documentation | ||
| https://home-assistant.io/components/cover.gogogate2/ | ||
| """ | ||
| import logging | ||
|
|
||
| import voluptuous as vol | ||
|
|
||
| from homeassistant.components.cover import ( | ||
| CoverDevice, SUPPORT_OPEN, SUPPORT_CLOSE) | ||
| from homeassistant.const import ( | ||
| CONF_USERNAME, CONF_PASSWORD, STATE_CLOSED, STATE_UNKNOWN, | ||
| CONF_IP_ADDRESS, CONF_NAME) | ||
| import homeassistant.helpers.config_validation as cv | ||
|
|
||
| REQUIREMENTS = ['pygogogate2==0.0.3'] | ||
|
|
||
| _LOGGER = logging.getLogger(__name__) | ||
|
|
||
| DEFAULT_NAME = 'gogogate2' | ||
|
|
||
| NOTIFICATION_ID = 'gogogate2_notification' | ||
| NOTIFICATION_TITLE = 'Gogogate2 Cover Setup' | ||
|
|
||
| COVER_SCHEMA = vol.Schema({ | ||
| vol.Required(CONF_USERNAME): cv.string, | ||
| vol.Required(CONF_PASSWORD): cv.string, | ||
| vol.Required(CONF_IP_ADDRESS): cv.string, | ||
| vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, | ||
| }) | ||
|
|
||
|
|
||
| def setup_platform(hass, config, add_devices, discovery_info=None): | ||
| """Set up the Gogogate2 component.""" | ||
| from pygogogate2 import Gogogate2API as pygogogate2 | ||
|
|
||
| username = config.get(CONF_USERNAME) | ||
| password = config.get(CONF_PASSWORD) | ||
| ip_address = config.get(CONF_IP_ADDRESS) | ||
| name = config.get(CONF_NAME) | ||
| mygogogate2 = pygogogate2(username, password, ip_address) | ||
|
|
||
| try: | ||
| devices = mygogogate2.get_devices() | ||
| if devices is False: | ||
| raise ValueError( | ||
| "Username or Password is incorrect or no devices found") | ||
|
|
||
| add_devices(MyGogogate2Device( | ||
| mygogogate2, door, name) for door in devices) | ||
| return | ||
|
|
||
| except (TypeError, KeyError, NameError, ValueError) as ex: | ||
| _LOGGER.error("%s", ex) | ||
| hass.components.persistent_notification.create( | ||
| 'Error: {}<br />' | ||
| 'You will need to restart hass after fixing.' | ||
| ''.format(ex), | ||
| title=NOTIFICATION_TITLE, | ||
| notification_id=NOTIFICATION_ID) | ||
| return | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as above. |
||
|
|
||
|
|
||
| class MyGogogate2Device(CoverDevice): | ||
| """Representation of a Gogogate2 cover.""" | ||
|
|
||
| def __init__(self, mygogogate2, device, name): | ||
| """Initialize with API object, device id.""" | ||
| self.mygogogate2 = mygogogate2 | ||
| self.device_id = device['door'] | ||
| self._name = name or device['name'] | ||
| self._status = device['status'] | ||
| self.available = None | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should be made private.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @fabaff, @MartinHjelmare is correct. I just tried this out and this line currently throws an error 'can't set attribute'. I've changed it to private and will submit a new PR, along with the rest of Martin's suggestions.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. New PR here: #13728 Thanks |
||
|
|
||
| @property | ||
| def name(self): | ||
| """Return the name of the garage door if any.""" | ||
| return self._name if self._name else DEFAULT_NAME | ||
|
|
||
| @property | ||
| def is_closed(self): | ||
| """Return true if cover is closed, else False.""" | ||
| return self._status == STATE_CLOSED | ||
|
|
||
| @property | ||
| def device_class(self): | ||
| """Return the class of this device, from component DEVICE_CLASSES.""" | ||
| return 'garage' | ||
|
|
||
| @property | ||
| def supported_features(self): | ||
| """Flag supported features.""" | ||
| return SUPPORT_OPEN | SUPPORT_CLOSE | ||
|
|
||
| @property | ||
| def available(self): | ||
| """Could the device be accessed during the last update call.""" | ||
| return self.available | ||
|
|
||
| def close_cover(self, **kwargs): | ||
| """Issue close command to cover.""" | ||
| self.mygogogate2.close_device(self.device_id) | ||
| self.schedule_update_ha_state(True) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove this. Since this is a polling entity, the state will be updated directly after the service call. |
||
|
|
||
| def open_cover(self, **kwargs): | ||
| """Issue open command to cover.""" | ||
| self.mygogogate2.open_device(self.device_id) | ||
| self.schedule_update_ha_state(True) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as above. |
||
|
|
||
| def update(self): | ||
| """Update status of cover.""" | ||
| try: | ||
| self._status = self.mygogogate2.get_status(self.device_id) | ||
| self.available = True | ||
| except (TypeError, KeyError, NameError, ValueError) as ex: | ||
| _LOGGER.error("%s", ex) | ||
| self._status = STATE_UNKNOWN | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don't use |
||
| self.available = False | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not needed return.