diff --git a/.coveragerc b/.coveragerc
index d4dc4e4367d60d4f5531d53c59d4fa03ec0e4e9f..3d1bbab84567ed7c01ef70c98a64eae13d7e592c 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -385,6 +385,7 @@ omit =
     homeassistant/components/cover/myq.py
     homeassistant/components/cover/opengarage.py
     homeassistant/components/cover/rpi_gpio.py
+    homeassistant/components/cover/ryobi_gdo.py
     homeassistant/components/cover/scsgate.py
     homeassistant/components/device_tracker/actiontec.py
     homeassistant/components/device_tracker/aruba.py
diff --git a/homeassistant/components/cover/ryobi_gdo.py b/homeassistant/components/cover/ryobi_gdo.py
new file mode 100644
index 0000000000000000000000000000000000000000..a11d70dd3adbad99e50ef547fb714897f0a8a076
--- /dev/null
+++ b/homeassistant/components/cover/ryobi_gdo.py
@@ -0,0 +1,103 @@
+"""
+Ryobi platform for the cover component.
+
+For more details about this platform, please refer to the documentation
+https://home-assistant.io/components/cover.ryobi_gdo/
+"""
+import logging
+import voluptuous as vol
+
+import homeassistant.helpers.config_validation as cv
+
+from homeassistant.components.cover import (
+    CoverDevice, PLATFORM_SCHEMA, SUPPORT_OPEN, SUPPORT_CLOSE)
+from homeassistant.const import (
+    CONF_USERNAME, CONF_PASSWORD, STATE_UNKNOWN, STATE_CLOSED)
+
+REQUIREMENTS = ['py_ryobi_gdo==0.0.10']
+
+_LOGGER = logging.getLogger(__name__)
+
+CONF_DEVICE_ID = 'device_id'
+
+PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
+    vol.Required(CONF_DEVICE_ID): vol.All(cv.ensure_list, [cv.string]),
+    vol.Required(CONF_PASSWORD): cv.string,
+    vol.Required(CONF_USERNAME): cv.string,
+})
+
+SUPPORTED_FEATURES = (SUPPORT_OPEN | SUPPORT_CLOSE)
+
+
+def setup_platform(hass, config, add_devices, discovery_info=None):
+    """Set up the Ryobi covers."""
+    from py_ryobi_gdo import RyobiGDO as ryobi_door
+    covers = []
+
+    username = config.get(CONF_USERNAME)
+    password = config.get(CONF_PASSWORD)
+    devices = config.get(CONF_DEVICE_ID)
+
+    for device_id in devices:
+        my_door = ryobi_door(username, password, device_id)
+        _LOGGER.debug("Getting the API key")
+        if my_door.get_api_key() is False:
+            _LOGGER.error("Wrong credentials, no API key retrieved")
+            return
+        _LOGGER.debug("Checking if the device ID is present")
+        if my_door.check_device_id() is False:
+            _LOGGER.error("%s not in your device list", device_id)
+            return
+        _LOGGER.debug("Adding device %s to covers", device_id)
+        covers.append(RyobiCover(hass, my_door))
+    if covers:
+        _LOGGER.debug("Adding covers")
+        add_devices(covers, True)
+
+
+class RyobiCover(CoverDevice):
+    """Representation of a ryobi cover."""
+
+    def __init__(self, hass, ryobi_door):
+        """Initialize the cover."""
+        self.ryobi_door = ryobi_door
+        self._name = 'ryobi_gdo_{}'.format(ryobi_door.get_device_id())
+        self._door_state = None
+
+    @property
+    def name(self):
+        """Return the name of the cover."""
+        return self._name
+
+    @property
+    def is_closed(self):
+        """Return if the cover is closed."""
+        if self._door_state == STATE_UNKNOWN:
+            return False
+        return self._door_state == 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 SUPPORTED_FEATURES
+
+    def close_cover(self, **kwargs):
+        """Close the cover."""
+        _LOGGER.debug("Closing garage door")
+        self.ryobi_door.close_device()
+
+    def open_cover(self, **kwargs):
+        """Open the cover."""
+        _LOGGER.debug("Opening garage door")
+        self.ryobi_door.open_device()
+
+    def update(self):
+        """Update status from the door."""
+        _LOGGER.debug("Updating RyobiGDO status")
+        self.ryobi_door.update()
+        self._door_state = self.ryobi_door.get_door_status()
diff --git a/requirements_all.txt b/requirements_all.txt
index 934feb4ea4288efbc2b8661a61af092835c99c8b..2c3a9b4bf5c3245021e0d4bcafbe0d469037b0b8 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -706,6 +706,9 @@ pyTibber==0.4.1
 # homeassistant.components.switch.dlink
 pyW215==0.6.0
 
+# homeassistant.components.cover.ryobi_gdo
+py_ryobi_gdo==0.0.10
+
 # homeassistant.components.ads
 pyads==2.2.6