143 lines
4.0 KiB
Python
143 lines
4.0 KiB
Python
"""Platform for retrieving energy data from SRP."""
|
|
from datetime import datetime, timedelta
|
|
import logging
|
|
|
|
from requests.exceptions import (
|
|
ConnectionError as ConnectError, HTTPError, Timeout)
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.const import (
|
|
CONF_NAME, CONF_PASSWORD, ENERGY_KILO_WATT_HOUR,
|
|
CONF_USERNAME, CONF_ID)
|
|
import homeassistant.helpers.config_validation as cv
|
|
from homeassistant.util import Throttle
|
|
from homeassistant.components.sensor import PLATFORM_SCHEMA
|
|
from homeassistant.helpers.entity import Entity
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
ATTRIBUTION = "Powered by SRP Energy"
|
|
|
|
DEFAULT_NAME = 'SRP Energy'
|
|
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=1440)
|
|
ENERGY_KWH = ENERGY_KILO_WATT_HOUR
|
|
|
|
ATTR_READING_COST = "reading_cost"
|
|
ATTR_READING_TIME = 'datetime'
|
|
ATTR_READING_USAGE = 'reading_usage'
|
|
ATTR_DAILY_USAGE = 'daily_usage'
|
|
ATTR_USAGE_HISTORY = 'usage_history'
|
|
|
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
|
vol.Required(CONF_USERNAME): cv.string,
|
|
vol.Required(CONF_PASSWORD): cv.string,
|
|
vol.Required(CONF_ID): cv.string,
|
|
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string
|
|
})
|
|
|
|
|
|
def setup_platform(hass, config, add_entities, discovery_info=None):
|
|
"""Set up the SRP energy."""
|
|
name = config[CONF_NAME]
|
|
username = config[CONF_USERNAME]
|
|
password = config[CONF_PASSWORD]
|
|
account_id = config[CONF_ID]
|
|
|
|
from srpenergy.client import SrpEnergyClient
|
|
|
|
srp_client = SrpEnergyClient(account_id, username, password)
|
|
|
|
if not srp_client.validate():
|
|
_LOGGER.error("Couldn't connect to %s. Check credentials", name)
|
|
return
|
|
|
|
add_entities([SrpEnergy(name, srp_client)], True)
|
|
|
|
|
|
class SrpEnergy(Entity):
|
|
"""Representation of an srp usage."""
|
|
|
|
def __init__(self, name, client):
|
|
"""Initialize SRP Usage."""
|
|
self._state = None
|
|
self._name = name
|
|
self._client = client
|
|
self._history = None
|
|
self._usage = None
|
|
|
|
@property
|
|
def attribution(self):
|
|
"""Return the attribution."""
|
|
return ATTRIBUTION
|
|
|
|
@property
|
|
def state(self):
|
|
"""Return the current state."""
|
|
if self._state is None:
|
|
return None
|
|
|
|
return "{0:.2f}".format(self._state)
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the sensor."""
|
|
return self._name
|
|
|
|
@property
|
|
def unit_of_measurement(self):
|
|
"""Return the unit of measurement of this entity, if any."""
|
|
return ENERGY_KWH
|
|
|
|
@property
|
|
def history(self):
|
|
"""Return the energy usage history of this entity, if any."""
|
|
if self._usage is None:
|
|
return None
|
|
|
|
history = [{
|
|
ATTR_READING_TIME: isodate,
|
|
ATTR_READING_USAGE: kwh,
|
|
ATTR_READING_COST: cost
|
|
} for _, _, isodate, kwh, cost in self._usage]
|
|
|
|
return history
|
|
|
|
@property
|
|
def device_state_attributes(self):
|
|
"""Return the state attributes."""
|
|
attributes = {
|
|
ATTR_USAGE_HISTORY: self.history
|
|
}
|
|
|
|
return attributes
|
|
|
|
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
|
def update(self):
|
|
"""Get the latest usage from SRP Energy."""
|
|
start_date = datetime.now() + timedelta(days=-1)
|
|
end_date = datetime.now()
|
|
|
|
try:
|
|
|
|
usage = self._client.usage(start_date, end_date)
|
|
|
|
daily_usage = 0.0
|
|
for _, _, _, kwh, _ in usage:
|
|
daily_usage += float(kwh)
|
|
|
|
if usage:
|
|
|
|
self._state = daily_usage
|
|
self._usage = usage
|
|
|
|
else:
|
|
_LOGGER.error("Unable to fetch data from SRP. No data")
|
|
|
|
except (ConnectError, HTTPError, Timeout) as error:
|
|
_LOGGER.error("Unable to connect to SRP. %s", error)
|
|
except ValueError as error:
|
|
_LOGGER.error("Value error connecting to SRP. %s", error)
|
|
except TypeError as error:
|
|
_LOGGER.error("Type error connecting to SRP. "
|
|
"Check username and password. %s", error)
|