diff --git a/.coveragerc b/.coveragerc
index af5cf49e02dbd3f64edebde9a841f72eae7ef256..0288fc0d39f28c87b63d8cba4af353b6448ab6e3 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -180,6 +180,7 @@ omit =
     homeassistant/components/sensor/nzbget.py
     homeassistant/components/sensor/onewire.py
     homeassistant/components/sensor/openweathermap.py
+    homeassistant/components/sensor/plex.py
     homeassistant/components/sensor/rest.py
     homeassistant/components/sensor/sabnzbd.py
     homeassistant/components/sensor/snmp.py
diff --git a/homeassistant/components/sensor/plex.py b/homeassistant/components/sensor/plex.py
new file mode 100644
index 0000000000000000000000000000000000000000..e35cb54cab82b9215877e776d91ab10159adda8e
--- /dev/null
+++ b/homeassistant/components/sensor/plex.py
@@ -0,0 +1,99 @@
+"""
+Support for Plex media server monitoring.
+
+For more details about this platform, please refer to the documentation at
+https://home-assistant.io/components/sensor.plex/
+"""
+from datetime import timedelta
+import logging
+import voluptuous as vol
+
+from homeassistant.const import (CONF_NAME, CONF_PLATFORM, CONF_USERNAME,
+                                 CONF_PASSWORD, CONF_HOST, CONF_PORT)
+from homeassistant.helpers.entity import Entity
+from homeassistant.util import Throttle
+import homeassistant.helpers.config_validation as cv
+
+REQUIREMENTS = ['plexapi==1.1.0']
+
+CONF_SERVER = 'server'
+MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=1)
+
+_LOGGER = logging.getLogger(__name__)
+
+PLATFORM_SCHEMA = vol.Schema({
+    vol.Required(CONF_PLATFORM): 'plex',
+    vol.Optional(CONF_USERNAME): cv.string,
+    vol.Optional(CONF_PASSWORD): cv.string,
+    vol.Optional(CONF_SERVER): cv.string,
+    vol.Optional(CONF_NAME, default='Plex'): cv.string,
+    vol.Optional(CONF_HOST, default='localhost'): cv.string,
+    vol.Optional(CONF_PORT, default=32400): vol.All(vol.Coerce(int),
+                                                    vol.Range(min=1,
+                                                              max=65535))
+})
+
+
+# pylint: disable=unused-argument
+def setup_platform(hass, config, add_devices, discovery_info=None):
+    """Setup the Demo sensors."""
+    name = config.get(CONF_NAME)
+    plex_user = config.get(CONF_USERNAME)
+    plex_password = config.get(CONF_PASSWORD)
+    plex_server = config.get(CONF_SERVER)
+    plex_host = config.get(CONF_HOST)
+    plex_port = config.get(CONF_PORT)
+    plex_url = 'http://' + plex_host + ':' + str(plex_port)
+    add_devices([PlexSensor(name, plex_url, plex_user,
+                            plex_password, plex_server)])
+
+
+class PlexSensor(Entity):
+    """Plex now playing sensor."""
+
+    # pylint: disable=too-many-arguments
+    def __init__(self, name, plex_url, plex_user, plex_password, plex_server):
+        """Initialize the sensor."""
+        self._name = name
+        self._state = 0
+        self._now_playing = []
+
+        if plex_user and plex_password:
+            from plexapi.myplex import MyPlexUser
+            user = MyPlexUser.signin(plex_user, plex_password)
+            server = plex_server if plex_server else user.resources()[0].name
+            self._server = user.getResource(server).connect()
+        else:
+            from plexapi.server import PlexServer
+            self._server = PlexServer(plex_url)
+
+        self.update()
+
+    @property
+    def name(self):
+        """Return the name of the sensor."""
+        return self._name
+
+    @property
+    def state(self):
+        """Return the state of the sensor."""
+        return self._state
+
+    @property
+    def unit_of_measurement(self):
+        """Return the unit this state is expressed in."""
+        return "Watching"
+
+    @property
+    def device_state_attributes(self):
+        """Return the state attributes."""
+        return {content[0]: content[1] for content in self._now_playing}
+
+    @Throttle(MIN_TIME_BETWEEN_UPDATES)
+    def update(self):
+        """Update method for plex sensor."""
+        sessions = self._server.sessions()
+        now_playing = [(s.user.title, "{0} ({1})".format(s.title, s.year))
+                       for s in sessions]
+        self._state = len(sessions)
+        self._now_playing = now_playing
diff --git a/requirements_all.txt b/requirements_all.txt
index d112e3944b60e23e90143a379d15aedfa0897379..069bd4ce48cc4e1abfbe152956ee5fb54c98dc5e 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -202,6 +202,7 @@ pexpect==4.0.1
 phue==0.8
 
 # homeassistant.components.media_player.plex
+# homeassistant.components.sensor.plex
 plexapi==1.1.0
 
 # homeassistant.components.thermostat.proliphix