mirror of
https://github.com/home-assistant/core
synced 2024-10-08 12:38:20 +00:00
Essent sensor (#23513)
* Initial commit for Essent * Cleanup Essent component * Update CODEOWNERS * Move stuff to PyEssent * Update requirements_all * Fix PyEssent * Move meter list to PyEssent library * Update requirements_all * Only check for updates once an hour * Use PyEssent 0.10 * Fixing up Essent component * Fix crash * Don't add unused meter/tariff combos * Fix lint * Get tariffs per meter * Don't hammer Essent API * Fix linting errors * Fix old description * Fix old call * Cleanup Essent component
This commit is contained in:
parent
cfaaae661a
commit
603e2cd961
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
1
homeassistant/components/essent/__init__.py
Normal file
1
homeassistant/components/essent/__init__.py
Normal file
|
@ -0,0 +1 @@
|
|||
"""The Essent component."""
|
8
homeassistant/components/essent/manifest.json
Normal file
8
homeassistant/components/essent/manifest.json
Normal file
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"domain": "essent",
|
||||
"name": "Essent",
|
||||
"documentation": "https://www.home-assistant.io/components/essent",
|
||||
"requirements": ["PyEssent==0.10"],
|
||||
"dependencies": [],
|
||||
"codeowners": ["@TheLastProject"]
|
||||
}
|
112
homeassistant/components/essent/sensor.py
Normal file
112
homeassistant/components/essent/sensor.py
Normal file
|
@ -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()))
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue