From e7de1fb9ae5b7a1f0c24cacfb79938dec9206a38 Mon Sep 17 00:00:00 2001
From: Fabian Affolter <mail@fabian-affolter.ch>
Date: Mon, 12 Jun 2017 06:40:06 +0200
Subject: [PATCH] Add Gitter.im sensor (#7998)

---
 .coveragerc                               |   1 +
 homeassistant/components/sensor/gitter.py | 103 ++++++++++++++++++++++
 requirements_all.txt                      |   3 +
 3 files changed, 107 insertions(+)
 create mode 100644 homeassistant/components/sensor/gitter.py

diff --git a/.coveragerc b/.coveragerc
index 558319e1ee4..2bbabdf2965 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -407,6 +407,7 @@ omit =
     homeassistant/components/sensor/fixer.py
     homeassistant/components/sensor/fritzbox_callmonitor.py
     homeassistant/components/sensor/fritzbox_netmonitor.py
+    homeassistant/components/sensor/gitter.py
     homeassistant/components/sensor/glances.py
     homeassistant/components/sensor/google_travel_time.py
     homeassistant/components/sensor/gpsd.py
diff --git a/homeassistant/components/sensor/gitter.py b/homeassistant/components/sensor/gitter.py
new file mode 100644
index 00000000000..5a41046a948
--- /dev/null
+++ b/homeassistant/components/sensor/gitter.py
@@ -0,0 +1,103 @@
+"""
+Support for displaying details about a Gitter.im chat room.
+
+For more details about this platform, please refer to the documentation at
+https://home-assistant.io/components/sensor.gitter/
+"""
+import logging
+
+import voluptuous as vol
+
+import homeassistant.helpers.config_validation as cv
+from homeassistant.components.sensor import PLATFORM_SCHEMA
+from homeassistant.const import CONF_NAME, CONF_API_KEY
+from homeassistant.helpers.entity import Entity
+
+REQUIREMENTS = ['gitterpy==0.1.5']
+
+_LOGGER = logging.getLogger(__name__)
+
+ATTR_MENTION = 'mention'
+ATTR_ROOM = 'room'
+ATTR_USERNAME = 'username'
+
+CONF_ROOM = 'room'
+
+DEFAULT_NAME = 'Gitter messages'
+DEFAULT_ROOM = 'home-assistant/home-assistant'
+
+ICON = 'mdi:message-settings-variant'
+
+PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
+    vol.Required(CONF_API_KEY): cv.string,
+    vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
+    vol.Optional(CONF_ROOM, default=DEFAULT_ROOM): cv.string,
+})
+
+
+def setup_platform(hass, config, add_devices, discovery_info=None):
+    """Set up the Gitter sensor."""
+    from gitterpy.client import GitterClient
+    from gitterpy.errors import GitterTokenError
+
+    name = config.get(CONF_NAME)
+    api_key = config.get(CONF_API_KEY)
+    room = config.get(CONF_ROOM)
+
+    gitter = GitterClient(api_key)
+    try:
+        username = gitter.auth.get_my_id['name']
+    except GitterTokenError:
+        _LOGGER.error("Token is not valid")
+        return False
+
+    add_devices([GitterSensor(gitter, room, name, username)], True)
+
+
+class GitterSensor(Entity):
+    """Representation of a Gitter sensor."""
+
+    def __init__(self, data, room, name, username):
+        """Initialize the sensor."""
+        self._name = name
+        self._data = data
+        self._room = room
+        self._username = username
+        self._state = None
+        self._mention = 0
+        self._unit_of_measurement = 'Msg'
+
+    @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 the value is expressed in."""
+        return self._unit_of_measurement
+
+    @property
+    def device_state_attributes(self):
+        """Return the state attributes."""
+        return {
+            ATTR_USERNAME: self._username,
+            ATTR_ROOM: self._room,
+            ATTR_MENTION: self._mention,
+        }
+
+    @property
+    def icon(self):
+        """Return the icon to use in the frontend, if any."""
+        return ICON
+
+    def update(self):
+        """Get the latest data and updates the state."""
+        data = self._data.user.unread_items(self._room)
+        self._mention = len(data['mention'])
+        self._state = len(data['chat'])
diff --git a/requirements_all.txt b/requirements_all.txt
index 4e59a99b02c..4deaf251ed0 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -231,6 +231,9 @@ gTTS-token==1.1.1
 # homeassistant.components.device_tracker.bluetooth_le_tracker
 # gattlib==0.20150805
 
+# homeassistant.components.sensor.gitter
+gitterpy==0.1.5
+
 # homeassistant.components.notify.gntp
 gntp==1.0.3
 
-- 
GitLab