From a147304be9be58f1342425a2a68f5fbf07e2d0a3 Mon Sep 17 00:00:00 2001
From: Dan Smith <dsmith@danplanet.com>
Date: Sat, 6 Feb 2016 21:36:41 +0000
Subject: [PATCH] Add support for Ubiquiti mFi sensors

This adds support for sensors based on Ubiquiti's mFi platform.
All ports/sensors are detected from the mFi controller and exposed.
---
 .coveragerc                            |   1 +
 homeassistant/components/sensor/mfi.py | 108 +++++++++++++++++++++++++
 requirements_all.txt                   |   3 +
 3 files changed, 112 insertions(+)
 create mode 100644 homeassistant/components/sensor/mfi.py

diff --git a/.coveragerc b/.coveragerc
index 6401a1dad1e..792da89e4c6 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -121,6 +121,7 @@ omit =
     homeassistant/components/sensor/eliqonline.py
     homeassistant/components/sensor/forecast.py
     homeassistant/components/sensor/glances.py
+    homeassistant/components/sensor/mfi.py
     homeassistant/components/sensor/netatmo.py
     homeassistant/components/sensor/onewire.py
     homeassistant/components/sensor/openweathermap.py
diff --git a/homeassistant/components/sensor/mfi.py b/homeassistant/components/sensor/mfi.py
new file mode 100644
index 00000000000..8864809e1cb
--- /dev/null
+++ b/homeassistant/components/sensor/mfi.py
@@ -0,0 +1,108 @@
+"""
+homeassistant.components.sensor.mfi
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Support for Ubiquiti mFi Sensors.
+
+Configuration:
+
+sensor:
+  platform: mfi
+  host: ADDRESS
+  port: PORT
+  username: USERNAME
+  password: PASSWORD
+
+Variable:
+
+host
+*Required
+ADDRESS is the IP or hostname of your mFi controller.
+
+port
+*Optional
+PORT is the port of your mFi controller (usually 6443)
+
+username
+*Required
+USERNAME is the mFi admin username
+
+password
+*Required
+PASSWORD is the mFi admin user's password
+"""
+
+import logging
+
+from homeassistant.const import (CONF_USERNAME, CONF_PASSWORD,
+                                 TEMP_CELCIUS)
+from homeassistant.components.sensor import DOMAIN
+from homeassistant.helpers.entity import Entity
+from homeassistant.helpers import validate_config
+
+REQUIREMENTS = ['mficlient==0.2']
+
+_LOGGER = logging.getLogger(__name__)
+
+SENSOR_MODELS = [
+    'Ubiquiti mFi-THS',
+    'Ubiquiti mFi-CS',
+    'Outlet',
+]
+
+
+# pylint: disable=unused-variable
+def setup_platform(hass, config, add_devices, discovery_info=None):
+    """ Sets up mFi sensors. """
+
+    if not validate_config({DOMAIN: config},
+                           {DOMAIN: ['host',
+                                     CONF_USERNAME,
+                                     CONF_PASSWORD]},
+                           _LOGGER):
+        _LOGGER.error('A host, username, and password are required')
+        return False
+
+    host = config.get('host')
+    port = int(config.get('port', 6443))
+    username = config.get(CONF_USERNAME)
+    password = config.get(CONF_PASSWORD)
+
+    from mficlient.client import MFiClient
+
+    try:
+        client = MFiClient(host, username, password, port=port)
+    except client.FailedToLogin as ex:
+        _LOGGER.error('Unable to connect to mFi: %s', str(ex))
+        return False
+
+    add_devices(MfiSensor(port, hass)
+                for device in client.get_devices()
+                for port in device.ports.values()
+                if port.model in SENSOR_MODELS)
+
+
+class MfiSensor(Entity):
+    """ An mFi sensor that exposes tag=value. """
+
+    def __init__(self, port, hass):
+        self._port = port
+        self._hass = hass
+
+    @property
+    def name(self):
+        return self._port.label
+
+    @property
+    def state(self):
+        return self._port.value
+
+    @property
+    def unit_of_measurement(self):
+        if self._port.tag == 'temperature':
+            return TEMP_CELCIUS
+        elif self._port.tag == 'active_pwr':
+            return 'Watts'
+        return self._port.tag
+
+    def update(self):
+        self._port.refresh()
diff --git a/requirements_all.txt b/requirements_all.txt
index 23a758240a5..d83adfa82a2 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -105,6 +105,9 @@ liffylights==0.9.4
 # homeassistant.components.light.limitlessled
 limitlessled==1.0.0
 
+# homeassistant.components.sensor.mfi
+mficlient==0.2
+
 # homeassistant.components.discovery
 netdisco==0.5.2
 
-- 
GitLab