From 25c3275cf315cceba522d263b02517bca43ee4d2 Mon Sep 17 00:00:00 2001 From: w1ll1am23 Date: Tue, 26 Jun 2018 18:47:06 -0400 Subject: [PATCH 1/8] Added support for Duke Energy smart meters --- .coveragerc | 1 + .../components/sensor/duke_energy.py | 82 +++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 86 insertions(+) create mode 100644 homeassistant/components/sensor/duke_energy.py diff --git a/.coveragerc b/.coveragerc index d059d62b5f31a..a28e520d85936 100644 --- a/.coveragerc +++ b/.coveragerc @@ -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 diff --git a/homeassistant/components/sensor/duke_energy.py b/homeassistant/components/sensor/duke_energy.py new file mode 100644 index 0000000000000..8bc38dfe5ba66 --- /dev/null +++ b/homeassistant/components/sensor/duke_energy.py @@ -0,0 +1,82 @@ +""" +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 +import homeassistant.util as util + +REQUIREMENTS = ['pydukeenergy==0.0.5'] + +_LOGGER = logging.getLogger(__name__) + +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): + from pydukeenergy.api import DukeEnergy, DukeEnergyException + + try: + duke = DukeEnergy(config.get(CONF_USERNAME), + config.get(CONF_PASSWORD), + update_interval=500) + except DukeEnergyException: + _LOGGER.error("Failed to setup Duke Energy") + return False + + meters = duke.get_meters() + sensors = [] + for meter in meters: + sensors.append(DukeEnergyMeter(meter)) + add_devices(sensors) + + return True + + +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_" + 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 = { + "lastBillsUsage": self.duke_meter.get_total(), + "lastBillsAverageUsage": self.duke_meter.get_average(), + "lastBillsDaysBilled": self.duke_meter.get_days_billed() + } + return attributes + + def update(self): + """Update meter.""" + self.duke_meter.update() + diff --git a/requirements_all.txt b/requirements_all.txt index 64bc53d5c89e2..0f993f2cfd8be 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -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.5 + # homeassistant.components.sensor.ebox pyebox==1.1.4 From e98c0a916755a1434cba6daddca904920de0ffd8 Mon Sep 17 00:00:00 2001 From: w1ll1am23 Date: Tue, 26 Jun 2018 19:07:56 -0400 Subject: [PATCH 2/8] Fixed hound --- homeassistant/components/sensor/duke_energy.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/sensor/duke_energy.py b/homeassistant/components/sensor/duke_energy.py index 8bc38dfe5ba66..bb7ce3fa23797 100644 --- a/homeassistant/components/sensor/duke_energy.py +++ b/homeassistant/components/sensor/duke_energy.py @@ -12,7 +12,6 @@ from homeassistant.const import CONF_USERNAME, CONF_PASSWORD from homeassistant.helpers.entity import Entity import homeassistant.helpers.config_validation as cv -import homeassistant.util as util REQUIREMENTS = ['pydukeenergy==0.0.5'] @@ -29,8 +28,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None): try: duke = DukeEnergy(config.get(CONF_USERNAME), - config.get(CONF_PASSWORD), - update_interval=500) + config.get(CONF_PASSWORD), + update_interval=500) except DukeEnergyException: _LOGGER.error("Failed to setup Duke Energy") return False @@ -79,4 +78,3 @@ def device_state_attributes(self): def update(self): """Update meter.""" self.duke_meter.update() - From 445ead8ef729b5ca206f69902fb23c566d25f52d Mon Sep 17 00:00:00 2001 From: w1ll1am23 Date: Tue, 26 Jun 2018 19:55:10 -0400 Subject: [PATCH 3/8] Added function docstring --- homeassistant/components/sensor/duke_energy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homeassistant/components/sensor/duke_energy.py b/homeassistant/components/sensor/duke_energy.py index bb7ce3fa23797..a6247485ca831 100644 --- a/homeassistant/components/sensor/duke_energy.py +++ b/homeassistant/components/sensor/duke_energy.py @@ -24,6 +24,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup all Duke Energy meters.""" from pydukeenergy.api import DukeEnergy, DukeEnergyException try: From c44fa30b55ca5051e93f1b3f364303feed2ee3b9 Mon Sep 17 00:00:00 2001 From: w1ll1am23 Date: Wed, 27 Jun 2018 20:00:20 -0400 Subject: [PATCH 4/8] Moved strings to constants, implemented unique_id, and cleaned up setup. --- .../components/sensor/duke_energy.py | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/sensor/duke_energy.py b/homeassistant/components/sensor/duke_energy.py index a6247485ca831..0ef45aefe4ea1 100644 --- a/homeassistant/components/sensor/duke_energy.py +++ b/homeassistant/components/sensor/duke_energy.py @@ -22,6 +22,10 @@ vol.Required(CONF_PASSWORD): cv.string, }) +LAST_BILL_USAGE = "lastBillsUsage" +LAST_BILL_AVERAGE_USAGE = "lastBillsAverageUsage" +LAST_BILL_DAYS_BILLED = "lastBillsDaysBilled" + def setup_platform(hass, config, add_devices, discovery_info=None): """Setup all Duke Energy meters.""" @@ -35,13 +39,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): _LOGGER.error("Failed to setup Duke Energy") return False - meters = duke.get_meters() - sensors = [] - for meter in meters: - sensors.append(DukeEnergyMeter(meter)) - add_devices(sensors) - - return True + add_devices([DukeEnergyMeter(meter) for meter in duke.get_meters()]) class DukeEnergyMeter(Entity): @@ -56,6 +54,10 @@ def name(self): """Return the name.""" return "duke_energy_" + self.duke_meter.id + @property + def unique_id(self): + return self.duke_meter.id + @property def state(self): """Return yesterdays usage.""" @@ -70,9 +72,9 @@ def unit_of_measurement(self): def device_state_attributes(self): """Return the state attributes.""" attributes = { - "lastBillsUsage": self.duke_meter.get_total(), - "lastBillsAverageUsage": self.duke_meter.get_average(), - "lastBillsDaysBilled": self.duke_meter.get_days_billed() + 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 From b317b7b4837ead9d3873301e178991f9c491c4fd Mon Sep 17 00:00:00 2001 From: w1ll1am23 Date: Wed, 27 Jun 2018 20:43:04 -0400 Subject: [PATCH 5/8] Added doc string. --- homeassistant/components/sensor/duke_energy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homeassistant/components/sensor/duke_energy.py b/homeassistant/components/sensor/duke_energy.py index 0ef45aefe4ea1..d1c9a69eb1b52 100644 --- a/homeassistant/components/sensor/duke_energy.py +++ b/homeassistant/components/sensor/duke_energy.py @@ -56,6 +56,7 @@ def name(self): @property def unique_id(self): + """Return the unique ID.""" return self.duke_meter.id @property From 42223219da6ba1c8044bc7568620b6d2526ccdbb Mon Sep 17 00:00:00 2001 From: w1ll1am23 Date: Sat, 30 Jun 2018 09:16:06 -0400 Subject: [PATCH 6/8] Fixed review issues. --- homeassistant/components/sensor/duke_energy.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/sensor/duke_energy.py b/homeassistant/components/sensor/duke_energy.py index d1c9a69eb1b52..337b93fefd011 100644 --- a/homeassistant/components/sensor/duke_energy.py +++ b/homeassistant/components/sensor/duke_energy.py @@ -2,7 +2,7 @@ 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/ +https://home-assistant.io/components/sensor.duke_energy/ """ import logging @@ -22,9 +22,9 @@ vol.Required(CONF_PASSWORD): cv.string, }) -LAST_BILL_USAGE = "lastBillsUsage" -LAST_BILL_AVERAGE_USAGE = "lastBillsAverageUsage" -LAST_BILL_DAYS_BILLED = "lastBillsDaysBilled" +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): @@ -32,12 +32,12 @@ def setup_platform(hass, config, add_devices, discovery_info=None): from pydukeenergy.api import DukeEnergy, DukeEnergyException try: - duke = DukeEnergy(config.get(CONF_USERNAME), - config.get(CONF_PASSWORD), - update_interval=500) + duke = DukeEnergy(config[CONF_USERNAME], + config[CONF_PASSWORD], + update_interval=60) except DukeEnergyException: _LOGGER.error("Failed to setup Duke Energy") - return False + return add_devices([DukeEnergyMeter(meter) for meter in duke.get_meters()]) @@ -52,7 +52,7 @@ def __init__(self, meter): @property def name(self): """Return the name.""" - return "duke_energy_" + self.duke_meter.id + return "duke_energy_{}".format(self.duke_meter.id) @property def unique_id(self): From c858cc55213745dda701316f743e9ba1e06056d6 Mon Sep 17 00:00:00 2001 From: w1ll1am23 Date: Sun, 1 Jul 2018 09:34:30 -0400 Subject: [PATCH 7/8] Updated pydukenergy to 0.0.6 and set update interval to 2 hours --- homeassistant/components/sensor/duke_energy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/duke_energy.py b/homeassistant/components/sensor/duke_energy.py index 337b93fefd011..458a2929d0b6b 100644 --- a/homeassistant/components/sensor/duke_energy.py +++ b/homeassistant/components/sensor/duke_energy.py @@ -13,7 +13,7 @@ from homeassistant.helpers.entity import Entity import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['pydukeenergy==0.0.5'] +REQUIREMENTS = ['pydukeenergy==0.0.6'] _LOGGER = logging.getLogger(__name__) @@ -34,7 +34,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): try: duke = DukeEnergy(config[CONF_USERNAME], config[CONF_PASSWORD], - update_interval=60) + update_interval=120) except DukeEnergyException: _LOGGER.error("Failed to setup Duke Energy") return From f2731bfba922ea689883b3174cfddd0d6b05fede Mon Sep 17 00:00:00 2001 From: w1ll1am23 Date: Sun, 1 Jul 2018 09:47:13 -0400 Subject: [PATCH 8/8] Updated requirements_all --- requirements_all.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements_all.txt b/requirements_all.txt index 0f993f2cfd8be..9bc358f4aedba 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -798,7 +798,7 @@ pydispatcher==2.0.5 pydroid-ipcam==0.8 # homeassistant.components.sensor.duke_energy -pydukeenergy==0.0.5 +pydukeenergy==0.0.6 # homeassistant.components.sensor.ebox pyebox==1.1.4