From dcf4fc5e9b4bc09c14a4e5a11bef8a995388cbc3 Mon Sep 17 00:00:00 2001 From: Nolan Gilley Date: Wed, 10 Aug 2016 20:39:52 -0400 Subject: [PATCH] fast.com speedtest sensor (#2783) * fast.com speedtest sensor * update for fastdotcom --- .coveragerc | 1 + homeassistant/components/sensor/fastdotcom.py | 104 ++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 108 insertions(+) create mode 100644 homeassistant/components/sensor/fastdotcom.py diff --git a/.coveragerc b/.coveragerc index 0efed20b330..08a3862d0e7 100644 --- a/.coveragerc +++ b/.coveragerc @@ -197,6 +197,7 @@ omit = homeassistant/components/sensor/dte_energy_bridge.py homeassistant/components/sensor/efergy.py homeassistant/components/sensor/eliqonline.py + homeassistant/components/sensor/fastdotcom.py homeassistant/components/sensor/fitbit.py homeassistant/components/sensor/fixer.py homeassistant/components/sensor/forecast.py diff --git a/homeassistant/components/sensor/fastdotcom.py b/homeassistant/components/sensor/fastdotcom.py new file mode 100644 index 00000000000..74bfd88366f --- /dev/null +++ b/homeassistant/components/sensor/fastdotcom.py @@ -0,0 +1,104 @@ +""" +Support for Fast.com internet speed testing sensor. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/sensor.fastdotcom/ +""" +import logging + +import homeassistant.util.dt as dt_util +from homeassistant.components import recorder +from homeassistant.components.sensor import DOMAIN +from homeassistant.helpers.entity import Entity +from homeassistant.helpers.event import track_time_change + +REQUIREMENTS = ['https://github.com/nkgilley/fast.com/archive/' + 'master.zip#fastdotcom==0.0.1'] + +_LOGGER = logging.getLogger(__name__) + +CONF_SECOND = 'second' +CONF_MINUTE = 'minute' +CONF_HOUR = 'hour' +CONF_DAY = 'day' + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the Speedtest sensor.""" + data = SpeedtestData(hass, config) + sensor = SpeedtestSensor(data) + add_devices([sensor]) + + def update(call=None): + """Update service for manual updates.""" + data.update(dt_util.now()) + sensor.update() + + hass.services.register(DOMAIN, 'update_fastdotcom', update) + + +# pylint: disable=too-few-public-methods +class SpeedtestSensor(Entity): + """Implementation of a speedtest.net sensor.""" + + def __init__(self, speedtest_data): + """Initialize the sensor.""" + self._name = 'Fast.com Speedtest' + self.speedtest_client = speedtest_data + self._state = None + self._unit_of_measurement = 'Mbps' + + @property + def name(self): + """Return the name of the sensor.""" + return self._name + + @property + def state(self): + """Return the state of the device.""" + return self._state + + @property + def unit_of_measurement(self): + """Return the unit of measurement of this entity, if any.""" + return self._unit_of_measurement + + def update(self): + """Get the latest data and update the states.""" + data = self.speedtest_client.data + if data is None: + entity_id = 'sensor.fastcom_speedtest' + states = recorder.get_model('States') + try: + last_state = recorder.execute( + recorder.query('States').filter( + (states.entity_id == entity_id) & + (states.last_changed == states.last_updated) & + (states.state != 'unknown') + ).order_by(states.state_id.desc()).limit(1)) + except TypeError: + return + if not last_state: + return + self._state = last_state[0].state + else: + self._state = data['download'] + + +class SpeedtestData(object): + """Get the latest data from fast.com.""" + + def __init__(self, hass, config): + """Initialize the data object.""" + self.data = None + track_time_change(hass, self.update, + second=config.get(CONF_SECOND, 0), + minute=config.get(CONF_MINUTE, 0), + hour=config.get(CONF_HOUR, None), + day=config.get(CONF_DAY, None)) + + def update(self, now): + """Get the latest data from fast.com.""" + from fastdotcom import fast_com + _LOGGER.info('Executing fast.com speedtest') + self.data = {'download': fast_com()} diff --git a/requirements_all.txt b/requirements_all.txt index 58decd00ae7..92f46806042 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -150,6 +150,9 @@ https://github.com/kellerza/pyqwikswitch/archive/v0.4.zip#pyqwikswitch==0.4 # homeassistant.components.media_player.russound_rnet https://github.com/laf/russound/archive/0.1.6.zip#russound==0.1.6 +# homeassistant.components.sensor.fastdotcom +https://github.com/nkgilley/fast.com/archive/master.zip#fastdotcom==0.0.1 + # homeassistant.components.ecobee https://github.com/nkgilley/python-ecobee-api/archive/4856a704670c53afe1882178a89c209b5f98533d.zip#python-ecobee==0.0.6