* Update format

* Use string formatting
This commit is contained in:
Fabian Affolter 2018-07-09 14:39:28 +02:00 committed by GitHub
parent 1d1408b98d
commit f7d7d825b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 83 additions and 66 deletions

View File

@ -5,12 +5,13 @@ For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/sensor.efergy/ https://home-assistant.io/components/sensor.efergy/
""" """
import logging import logging
import requests
import voluptuous as vol import voluptuous as vol
from requests import RequestException, get
import homeassistant.helpers.config_validation as cv
from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import CONF_CURRENCY
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -21,7 +22,6 @@ CONF_UTC_OFFSET = 'utc_offset'
CONF_MONITORED_VARIABLES = 'monitored_variables' CONF_MONITORED_VARIABLES = 'monitored_variables'
CONF_SENSOR_TYPE = 'type' CONF_SENSOR_TYPE = 'type'
CONF_CURRENCY = 'currency'
CONF_PERIOD = 'period' CONF_PERIOD = 'period'
CONF_INSTANT = 'instant_readings' CONF_INSTANT = 'instant_readings'
@ -60,17 +60,18 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
"""Set up the Efergy sensor.""" """Set up the Efergy sensor."""
app_token = config.get(CONF_APPTOKEN) app_token = config.get(CONF_APPTOKEN)
utc_offset = str(config.get(CONF_UTC_OFFSET)) utc_offset = str(config.get(CONF_UTC_OFFSET))
dev = [] dev = []
for variable in config[CONF_MONITORED_VARIABLES]: for variable in config[CONF_MONITORED_VARIABLES]:
if variable[CONF_SENSOR_TYPE] == CONF_CURRENT_VALUES: if variable[CONF_SENSOR_TYPE] == CONF_CURRENT_VALUES:
url_string = _RESOURCE + 'getCurrentValuesSummary?token=' \ url_string = '{}getCurrentValuesSummary?token={}'.format(
+ app_token _RESOURCE, app_token)
response = get(url_string, timeout=10) response = requests.get(url_string, timeout=10)
for sensor in response.json(): for sensor in response.json():
sid = sensor['sid'] sid = sensor['sid']
dev.append(EfergySensor(variable[CONF_SENSOR_TYPE], app_token, dev.append(EfergySensor(
utc_offset, variable[CONF_PERIOD], variable[CONF_SENSOR_TYPE], app_token, utc_offset,
variable[CONF_CURRENCY], sid)) variable[CONF_PERIOD], variable[CONF_CURRENCY], sid))
dev.append(EfergySensor( dev.append(EfergySensor(
variable[CONF_SENSOR_TYPE], app_token, utc_offset, variable[CONF_SENSOR_TYPE], app_token, utc_offset,
variable[CONF_PERIOD], variable[CONF_CURRENCY])) variable[CONF_PERIOD], variable[CONF_CURRENCY]))
@ -86,7 +87,7 @@ class EfergySensor(Entity):
"""Initialize the sensor.""" """Initialize the sensor."""
self.sid = sid self.sid = sid
if sid: if sid:
self._name = 'efergy_' + sid self._name = 'efergy_{}'.format(sid)
else: else:
self._name = SENSOR_TYPES[sensor_type][0] self._name = SENSOR_TYPES[sensor_type][0]
self.type = sensor_type self.type = sensor_type
@ -96,7 +97,8 @@ class EfergySensor(Entity):
self.period = period self.period = period
self.currency = currency self.currency = currency
if self.type == 'cost': if self.type == 'cost':
self._unit_of_measurement = self.currency + '/' + self.period self._unit_of_measurement = '{}/{}'.format(
self.currency, self.period)
else: else:
self._unit_of_measurement = SENSOR_TYPES[sensor_type][1] self._unit_of_measurement = SENSOR_TYPES[sensor_type][1]
@ -119,34 +121,34 @@ class EfergySensor(Entity):
"""Get the Efergy monitor data from the web service.""" """Get the Efergy monitor data from the web service."""
try: try:
if self.type == 'instant_readings': if self.type == 'instant_readings':
url_string = _RESOURCE + 'getInstant?token=' + self.app_token url_string = '{}getInstant?token={}'.format(
response = get(url_string, timeout=10) _RESOURCE, self.app_token)
response = requests.get(url_string, timeout=10)
self._state = response.json()['reading'] self._state = response.json()['reading']
elif self.type == 'amount': elif self.type == 'amount':
url_string = _RESOURCE + 'getEnergy?token=' + self.app_token \ url_string = '{}getEnergy?token={}&offset={}&period={}'.format(
+ '&offset=' + self.utc_offset + '&period=' \ _RESOURCE, self.app_token, self.utc_offset, self.period)
+ self.period response = requests.get(url_string, timeout=10)
response = get(url_string, timeout=10)
self._state = response.json()['sum'] self._state = response.json()['sum']
elif self.type == 'budget': elif self.type == 'budget':
url_string = _RESOURCE + 'getBudget?token=' + self.app_token url_string = '{}getBudget?token={}'.format(
response = get(url_string, timeout=10) _RESOURCE, self.app_token)
response = requests.get(url_string, timeout=10)
self._state = response.json()['status'] self._state = response.json()['status']
elif self.type == 'cost': elif self.type == 'cost':
url_string = _RESOURCE + 'getCost?token=' + self.app_token \ url_string = '{}getCost?token={}&offset={}&period={}'.format(
+ '&offset=' + self.utc_offset + '&period=' \ _RESOURCE, self.app_token, self.utc_offset, self.period)
+ self.period response = requests.get(url_string, timeout=10)
response = get(url_string, timeout=10)
self._state = response.json()['sum'] self._state = response.json()['sum']
elif self.type == 'current_values': elif self.type == 'current_values':
url_string = _RESOURCE + 'getCurrentValuesSummary?token=' \ url_string = '{}getCurrentValuesSummary?token={}'.format(
+ self.app_token _RESOURCE, self.app_token)
response = get(url_string, timeout=10) response = requests.get(url_string, timeout=10)
for sensor in response.json(): for sensor in response.json():
if self.sid == sensor['sid']: if self.sid == sensor['sid']:
measurement = next(iter(sensor['data'][0].values())) measurement = next(iter(sensor['data'][0].values()))
self._state = measurement self._state = measurement
else: else:
self._state = 'Unknown' self._state = None
except (RequestException, ValueError, KeyError): except (requests.RequestException, ValueError, KeyError):
_LOGGER.warning("Could not update status for %s", self.name) _LOGGER.warning("Could not update status for %s", self.name)

View File

@ -14,21 +14,20 @@ ONE_SENSOR_CONFIG = {
'platform': 'efergy', 'platform': 'efergy',
'app_token': token, 'app_token': token,
'utc_offset': '300', 'utc_offset': '300',
'monitored_variables': [{'type': 'amount', 'period': 'day'}, 'monitored_variables': [
{'type': 'instant_readings'}, {'type': 'amount', 'period': 'day'},
{'type': 'budget'}, {'type': 'instant_readings'},
{'type': 'cost', 'period': 'day', 'currency': '$'}, {'type': 'budget'},
{'type': 'current_values'} {'type': 'cost', 'period': 'day', 'currency': '$'},
] {'type': 'current_values'},
]
} }
MULTI_SENSOR_CONFIG = { MULTI_SENSOR_CONFIG = {
'platform': 'efergy', 'platform': 'efergy',
'app_token': multi_sensor_token, 'app_token': multi_sensor_token,
'utc_offset': '300', 'utc_offset': '300',
'monitored_variables': [ 'monitored_variables': [{'type': 'current_values'}],
{'type': 'current_values'}
]
} }
@ -36,22 +35,23 @@ def mock_responses(mock):
"""Mock responses for Efergy.""" """Mock responses for Efergy."""
base_url = 'https://engage.efergy.com/mobile_proxy/' base_url = 'https://engage.efergy.com/mobile_proxy/'
mock.get( mock.get(
base_url + 'getInstant?token=' + token, '{}getInstant?token={}'.format(base_url, token),
text=load_fixture('efergy_instant.json')) text=load_fixture('efergy_instant.json'))
mock.get( mock.get(
base_url + 'getEnergy?token=' + token + '&offset=300&period=day', '{}getEnergy?token={}&offset=300&period=day'.format(base_url, token),
text=load_fixture('efergy_energy.json')) text=load_fixture('efergy_energy.json'))
mock.get( mock.get(
base_url + 'getBudget?token=' + token, '{}getBudget?token={}'.format(base_url, token),
text=load_fixture('efergy_budget.json')) text=load_fixture('efergy_budget.json'))
mock.get( mock.get(
base_url + 'getCost?token=' + token + '&offset=300&period=day', '{}getCost?token={}&offset=300&period=day'.format(base_url, token),
text=load_fixture('efergy_cost.json')) text=load_fixture('efergy_cost.json'))
mock.get( mock.get(
base_url + 'getCurrentValuesSummary?token=' + token, '{}getCurrentValuesSummary?token={}'.format(base_url, token),
text=load_fixture('efergy_current_values_single.json')) text=load_fixture('efergy_current_values_single.json'))
mock.get( mock.get(
base_url + 'getCurrentValuesSummary?token=' + multi_sensor_token, '{}getCurrentValuesSummary?token={}'.format(
base_url, multi_sensor_token),
text=load_fixture('efergy_current_values_multi.json')) text=load_fixture('efergy_current_values_multi.json'))
@ -69,7 +69,7 @@ class TestEfergySensor(unittest.TestCase):
self.DEVICES.append(device) self.DEVICES.append(device)
def setUp(self): def setUp(self):
"""Initialize values for this testcase class.""" """Initialize values for this test case class."""
self.hass = get_test_home_assistant() self.hass = get_test_home_assistant()
self.config = ONE_SENSOR_CONFIG self.config = ONE_SENSOR_CONFIG
@ -82,27 +82,31 @@ class TestEfergySensor(unittest.TestCase):
"""Test for successfully setting up the Efergy platform.""" """Test for successfully setting up the Efergy platform."""
mock_responses(mock) mock_responses(mock)
assert setup_component(self.hass, 'sensor', { assert setup_component(self.hass, 'sensor', {
'sensor': ONE_SENSOR_CONFIG}) 'sensor': ONE_SENSOR_CONFIG,
self.assertEqual('38.21', })
self.hass.states.get('sensor.energy_consumed').state)
self.assertEqual('1580', self.assertEqual(
self.hass.states.get('sensor.energy_usage').state) '38.21', self.hass.states.get('sensor.energy_consumed').state)
self.assertEqual('ok', self.assertEqual(
self.hass.states.get('sensor.energy_budget').state) '1580', self.hass.states.get('sensor.energy_usage').state)
self.assertEqual('5.27', self.assertEqual(
self.hass.states.get('sensor.energy_cost').state) 'ok', self.hass.states.get('sensor.energy_budget').state)
self.assertEqual('1628', self.assertEqual(
self.hass.states.get('sensor.efergy_728386').state) '5.27', self.hass.states.get('sensor.energy_cost').state)
self.assertEqual(
'1628', self.hass.states.get('sensor.efergy_728386').state)
@requests_mock.Mocker() @requests_mock.Mocker()
def test_multi_sensor_readings(self, mock): def test_multi_sensor_readings(self, mock):
"""Test for multiple sensors in one household.""" """Test for multiple sensors in one household."""
mock_responses(mock) mock_responses(mock)
assert setup_component(self.hass, 'sensor', { assert setup_component(self.hass, 'sensor', {
'sensor': MULTI_SENSOR_CONFIG}) 'sensor': MULTI_SENSOR_CONFIG,
self.assertEqual('218', })
self.hass.states.get('sensor.efergy_728386').state)
self.assertEqual('1808', self.assertEqual(
self.hass.states.get('sensor.efergy_0').state) '218', self.hass.states.get('sensor.efergy_728386').state)
self.assertEqual('312', self.assertEqual(
self.hass.states.get('sensor.efergy_728387').state) '1808', self.hass.states.get('sensor.efergy_0').state)
self.assertEqual(
'312', self.hass.states.get('sensor.efergy_728387').state)

View File

@ -1 +1,4 @@
{"status":"ok", "monthly_budget":250.0000} {
"status": "ok",
"monthly_budget": 250.0000
}

View File

@ -1 +1,5 @@
{"sum":"5.27","duration":70320,"units":"GBP"} {
"sum": "5.27",
"duration": 70320,
"units": "GBP"
}

View File

@ -1 +1,5 @@
{"sum":"38.21","duration":70320,"units":"kWh"} {
"sum": "38.21",
"duration": 70320,
"units": "kWh"
}