"""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'])) if not meters: hass.components.persistent_notification.create( 'Couldn\'t find any meter readings. ' 'Please ensure Verbruiks Manager is enabled in Mijn Essent ' 'and at least one reading has been logged to Meterstanden.', title='Essent', notification_id='essent_notification') return add_devices(meters, True) class EssentBase(): """Essent Base.""" def __init__(self, username, password): """Initialize the Essent API.""" self._username = username self._password = password self._meter_data = {} self.update() def retrieve_meters(self): """Retrieve the list of meters.""" return self._meter_data.keys() 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) eans = essent.get_EANs() for possible_meter in eans: meter_data = essent.read_meter( possible_meter, only_last_meter_reading=True) if meter_data: self._meter_data[possible_meter] = meter_data 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()))