Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Essent sensor #23513

Merged
merged 20 commits into from Apr 30, 2019
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .coveragerc
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions CODEOWNERS
Validating CODEOWNERS rules …
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions homeassistant/components/essent/__init__.py
@@ -0,0 +1 @@
"""The Essent component."""
8 changes: 8 additions & 0 deletions 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"]
}
117 changes: 117 additions & 0 deletions homeassistant/components/essent/sensor.py
@@ -0,0 +1,117 @@
"""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)
add_devices(essent.retrieve_meters(), True)


class EssentBase():
amelchio marked this conversation as resolved.
Show resolved Hide resolved
"""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 get_session(self):
TheLastProject marked this conversation as resolved.
Show resolved Hide resolved
"""Return the active session."""
return self._essent

def retrieve_meters(self):
"""Retrieve the IDs of the meters used by Essent."""
meters = []
for meter in self._meters:
data = self._meter_data[meter]
TheLastProject marked this conversation as resolved.
Show resolved Hide resolved
TheLastProject marked this conversation as resolved.
Show resolved Hide resolved
self._meter_data[meter] = data
for tariff in data['values']['LVR'].keys():
meters.append(EssentMeter(
self,
meter,
data['type'],
tariff,
data['values']['LVR'][tariff]['unit']))

return 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()))
3 changes: 3 additions & 0 deletions requirements_all.txt
Expand Up @@ -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

Expand Down