diff --git a/.coveragerc b/.coveragerc index 3aeb2b5c1874f5..a574c2ead43429 100644 --- a/.coveragerc +++ b/.coveragerc @@ -173,6 +173,7 @@ omit = homeassistant/components/esphome/light.py homeassistant/components/esphome/sensor.py homeassistant/components/esphome/switch.py + homeassistant/components/essent/sensor.py homeassistant/components/etherscan/sensor.py homeassistant/components/eufy/* homeassistant/components/everlights/light.py diff --git a/CODEOWNERS b/CODEOWNERS index 38de5b1fe6f11e..103e6ec9a68ab6 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -71,6 +71,7 @@ homeassistant/components/ephember/* @ttroy50 homeassistant/components/epsonworkforce/* @ThaStealth homeassistant/components/eq3btsmart/* @rytilahti homeassistant/components/esphome/* @OttoWinter +homeassistant/components/essent/* @TheLastProject homeassistant/components/file/* @fabaff homeassistant/components/filter/* @dgomes homeassistant/components/fitbit/* @robbiet480 diff --git a/homeassistant/components/essent/__init__.py b/homeassistant/components/essent/__init__.py new file mode 100644 index 00000000000000..42e867c6d21448 --- /dev/null +++ b/homeassistant/components/essent/__init__.py @@ -0,0 +1 @@ +"""The Essent component.""" diff --git a/homeassistant/components/essent/manifest.json b/homeassistant/components/essent/manifest.json new file mode 100644 index 00000000000000..49189f6bacb15b --- /dev/null +++ b/homeassistant/components/essent/manifest.json @@ -0,0 +1,8 @@ +{ + "domain": "essent", + "name": "Essent", + "documentation": "https://www.home-assistant.io/components/essent", + "requirements": ["PyEssent==0.10"], + "dependencies": [], + "codeowners": ["@TheLastProject"] +} diff --git a/homeassistant/components/essent/sensor.py b/homeassistant/components/essent/sensor.py new file mode 100644 index 00000000000000..545ed3d5baf5f5 --- /dev/null +++ b/homeassistant/components/essent/sensor.py @@ -0,0 +1,112 @@ +"""Support for Essent API.""" +from datetime import timedelta + +from pyessent import PyEssent +import voluptuous as vol + +from homeassistant.components.sensor import PLATFORM_SCHEMA +from homeassistant.const import ( + CONF_PASSWORD, CONF_USERNAME, ENERGY_KILO_WATT_HOUR) +import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.entity import Entity +from homeassistant.util import Throttle + +SCAN_INTERVAL = timedelta(hours=1) + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_USERNAME): cv.string, + vol.Required(CONF_PASSWORD): cv.string +}) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Set up the Essent platform.""" + username = config[CONF_USERNAME] + password = config[CONF_PASSWORD] + + essent = EssentBase(username, password) + meters = [] + for meter in essent.retrieve_meters(): + data = essent.retrieve_meter_data(meter) + for tariff in data['values']['LVR'].keys(): + meters.append(EssentMeter( + essent, + meter, + data['type'], + tariff, + data['values']['LVR'][tariff]['unit'])) + + add_devices(meters, True) + + +class EssentBase(): + """Essent Base.""" + + def __init__(self, username, password): + """Initialize the Essent API.""" + self._username = username + self._password = password + self._meters = [] + self._meter_data = {} + + self.update() + + def retrieve_meters(self): + """Retrieve the list of meters.""" + return self._meters + + def retrieve_meter_data(self, meter): + """Retrieve the data for this meter.""" + return self._meter_data[meter] + + @Throttle(timedelta(minutes=30)) + def update(self): + """Retrieve the latest meter data from Essent.""" + essent = PyEssent(self._username, self._password) + self._meters = essent.get_EANs() + for meter in self._meters: + self._meter_data[meter] = essent.read_meter( + meter, only_last_meter_reading=True) + + +class EssentMeter(Entity): + """Representation of Essent measurements.""" + + def __init__(self, essent_base, meter, meter_type, tariff, unit): + """Initialize the sensor.""" + self._state = None + self._essent_base = essent_base + self._meter = meter + self._type = meter_type + self._tariff = tariff + self._unit = unit + + @property + def name(self): + """Return the name of the sensor.""" + return "Essent {} ({})".format(self._type, self._tariff) + + @property + def state(self): + """Return the state of the sensor.""" + return self._state + + @property + def unit_of_measurement(self): + """Return the unit of measurement.""" + if self._unit.lower() == 'kwh': + return ENERGY_KILO_WATT_HOUR + + return self._unit + + def update(self): + """Fetch the energy usage.""" + # Ensure our data isn't too old + self._essent_base.update() + + # Retrieve our meter + data = self._essent_base.retrieve_meter_data(self._meter) + + # Set our value + self._state = next( + iter(data['values']['LVR'][self._tariff]['records'].values())) diff --git a/requirements_all.txt b/requirements_all.txt index b510ebbc0de9cb..1b3fe6b4b4e4d8 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -41,6 +41,9 @@ Mastodon.py==1.3.1 # homeassistant.components.orangepi_gpio OPi.GPIO==0.3.6 +# homeassistant.components.essent +PyEssent==0.10 + # homeassistant.components.github PyGithub==1.43.5