core/homeassistant/components/duke_energy/sensor.py

77 lines
2.2 KiB
Python
Raw Normal View History

"""Support for Duke Energy Gas and Electric meters."""
import logging
from pydukeenergy.api import DukeEnergy, DukeEnergyException
import voluptuous as vol
from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import CONF_PASSWORD, CONF_USERNAME
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import Entity
_LOGGER = logging.getLogger(__name__)
2019-07-31 19:25:30 +00:00
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string}
)
LAST_BILL_USAGE = "last_bills_usage"
LAST_BILL_AVERAGE_USAGE = "last_bills_average_usage"
LAST_BILL_DAYS_BILLED = "last_bills_days_billed"
def setup_platform(hass, config, add_entities, discovery_info=None):
2018-08-19 20:29:08 +00:00
"""Set up all Duke Energy meters."""
try:
2019-07-31 19:25:30 +00:00
duke = DukeEnergy(
config[CONF_USERNAME], config[CONF_PASSWORD], update_interval=120
)
except DukeEnergyException:
2018-08-19 20:29:08 +00:00
_LOGGER.error("Failed to set up Duke Energy")
return
add_entities([DukeEnergyMeter(meter) for meter in duke.get_meters()])
class DukeEnergyMeter(Entity):
"""Representation of a Duke Energy meter."""
def __init__(self, meter):
"""Initialize the meter."""
self.duke_meter = meter
@property
def name(self):
"""Return the name."""
return f"duke_energy_{self.duke_meter.id}"
@property
def unique_id(self):
"""Return the unique ID."""
return self.duke_meter.id
@property
def state(self):
"""Return yesterdays usage."""
return self.duke_meter.get_usage()
@property
def unit_of_measurement(self):
"""Return the unit of measurement this sensor expresses itself in."""
return self.duke_meter.get_unit()
@property
def device_state_attributes(self):
"""Return the state attributes."""
attributes = {
LAST_BILL_USAGE: self.duke_meter.get_total(),
LAST_BILL_AVERAGE_USAGE: self.duke_meter.get_average(),
2019-07-31 19:25:30 +00:00
LAST_BILL_DAYS_BILLED: self.duke_meter.get_days_billed(),
}
return attributes
def update(self):
"""Update meter."""
self.duke_meter.update()