Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -612,6 +612,7 @@ omit =
homeassistant/components/sensor/domain_expiry.py
homeassistant/components/sensor/dte_energy_bridge.py
homeassistant/components/sensor/dublin_bus_transport.py
homeassistant/components/sensor/duke_energy.py
homeassistant/components/sensor/dwd_weather_warnings.py
homeassistant/components/sensor/ebox.py
homeassistant/components/sensor/eddystone_temperature.py
Expand Down
84 changes: 84 additions & 0 deletions homeassistant/components/sensor/duke_energy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
"""

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TokenError: EOF in multi-line string

Support for Duke Energy Gas and Electric meters.

For more details about this component, please refer to the documentation at
https://home-assistant.io/components/sensor.duke_energy/
"""
import logging

import voluptuous as vol

from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import CONF_USERNAME, CONF_PASSWORD
from homeassistant.helpers.entity import Entity
import homeassistant.helpers.config_validation as cv

REQUIREMENTS = ['pydukeenergy==0.0.6']

_LOGGER = logging.getLogger(__name__)

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_devices, discovery_info=None):
"""Setup all Duke Energy meters."""
from pydukeenergy.api import DukeEnergy, DukeEnergyException

try:
duke = DukeEnergy(config[CONF_USERNAME],
config[CONF_PASSWORD],
update_interval=120)
except DukeEnergyException:
_LOGGER.error("Failed to setup Duke Energy")
return

add_devices([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 "duke_energy_{}".format(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()

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this doing I/O? No I/O in properties is allowed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No all of the values are stored in a dict in the library and are only updated when update is called.


@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(),
LAST_BILL_DAYS_BILLED: self.duke_meter.get_days_billed()
}
return attributes

def update(self):
"""Update meter."""
self.duke_meter.update()
3 changes: 3 additions & 0 deletions requirements_all.txt
Original file line number Diff line number Diff line change
Expand Up @@ -797,6 +797,9 @@ pydispatcher==2.0.5
# homeassistant.components.android_ip_webcam
pydroid-ipcam==0.8

# homeassistant.components.sensor.duke_energy
pydukeenergy==0.0.6

# homeassistant.components.sensor.ebox
pyebox==1.1.4

Expand Down