diff --git a/.coveragerc b/.coveragerc index 6401a1dad1eac1bf318d369f447c77150d655000..792da89e4c6c2e57952dbfc6db61b143e5d765ae 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 0000000000000000000000000000000000000000..8864809e1cb7a18f8f4102af80e82232fa82bac1 --- /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 23a758240a576ab4ca480f8409692648e7643cf1..d83adfa82a2752c5b66050d5733b39bc01d24764 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