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