mirror of
https://github.com/home-assistant/core.git
synced 2025-04-23 16:57:53 +00:00
parent
1d1408b98d
commit
f7d7d825b0
@ -5,12 +5,13 @@ For more details about this platform, please refer to the documentation at
|
||||
https://home-assistant.io/components/sensor.efergy/
|
||||
"""
|
||||
import logging
|
||||
|
||||
import requests
|
||||
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.const import CONF_CURRENCY
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.helpers.entity import Entity
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
@ -21,7 +22,6 @@ CONF_UTC_OFFSET = 'utc_offset'
|
||||
CONF_MONITORED_VARIABLES = 'monitored_variables'
|
||||
CONF_SENSOR_TYPE = 'type'
|
||||
|
||||
CONF_CURRENCY = 'currency'
|
||||
CONF_PERIOD = 'period'
|
||||
|
||||
CONF_INSTANT = 'instant_readings'
|
||||
@ -60,17 +60,18 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||
"""Set up the Efergy sensor."""
|
||||
app_token = config.get(CONF_APPTOKEN)
|
||||
utc_offset = str(config.get(CONF_UTC_OFFSET))
|
||||
|
||||
dev = []
|
||||
for variable in config[CONF_MONITORED_VARIABLES]:
|
||||
if variable[CONF_SENSOR_TYPE] == CONF_CURRENT_VALUES:
|
||||
url_string = _RESOURCE + 'getCurrentValuesSummary?token=' \
|
||||
+ app_token
|
||||
response = get(url_string, timeout=10)
|
||||
url_string = '{}getCurrentValuesSummary?token={}'.format(
|
||||
_RESOURCE, app_token)
|
||||
response = requests.get(url_string, timeout=10)
|
||||
for sensor in response.json():
|
||||
sid = sensor['sid']
|
||||
dev.append(EfergySensor(variable[CONF_SENSOR_TYPE], app_token,
|
||||
utc_offset, variable[CONF_PERIOD],
|
||||
variable[CONF_CURRENCY], sid))
|
||||
dev.append(EfergySensor(
|
||||
variable[CONF_SENSOR_TYPE], app_token, utc_offset,
|
||||
variable[CONF_PERIOD], variable[CONF_CURRENCY], sid))
|
||||
dev.append(EfergySensor(
|
||||
variable[CONF_SENSOR_TYPE], app_token, utc_offset,
|
||||
variable[CONF_PERIOD], variable[CONF_CURRENCY]))
|
||||
@ -86,7 +87,7 @@ class EfergySensor(Entity):
|
||||
"""Initialize the sensor."""
|
||||
self.sid = sid
|
||||
if sid:
|
||||
self._name = 'efergy_' + sid
|
||||
self._name = 'efergy_{}'.format(sid)
|
||||
else:
|
||||
self._name = SENSOR_TYPES[sensor_type][0]
|
||||
self.type = sensor_type
|
||||
@ -96,7 +97,8 @@ class EfergySensor(Entity):
|
||||
self.period = period
|
||||
self.currency = currency
|
||||
if self.type == 'cost':
|
||||
self._unit_of_measurement = self.currency + '/' + self.period
|
||||
self._unit_of_measurement = '{}/{}'.format(
|
||||
self.currency, self.period)
|
||||
else:
|
||||
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."""
|
||||
try:
|
||||
if self.type == 'instant_readings':
|
||||
url_string = _RESOURCE + 'getInstant?token=' + self.app_token
|
||||
response = get(url_string, timeout=10)
|
||||
url_string = '{}getInstant?token={}'.format(
|
||||
_RESOURCE, self.app_token)
|
||||
response = requests.get(url_string, timeout=10)
|
||||
self._state = response.json()['reading']
|
||||
elif self.type == 'amount':
|
||||
url_string = _RESOURCE + 'getEnergy?token=' + self.app_token \
|
||||
+ '&offset=' + self.utc_offset + '&period=' \
|
||||
+ self.period
|
||||
response = get(url_string, timeout=10)
|
||||
url_string = '{}getEnergy?token={}&offset={}&period={}'.format(
|
||||
_RESOURCE, self.app_token, self.utc_offset, self.period)
|
||||
response = requests.get(url_string, timeout=10)
|
||||
self._state = response.json()['sum']
|
||||
elif self.type == 'budget':
|
||||
url_string = _RESOURCE + 'getBudget?token=' + self.app_token
|
||||
response = get(url_string, timeout=10)
|
||||
url_string = '{}getBudget?token={}'.format(
|
||||
_RESOURCE, self.app_token)
|
||||
response = requests.get(url_string, timeout=10)
|
||||
self._state = response.json()['status']
|
||||
elif self.type == 'cost':
|
||||
url_string = _RESOURCE + 'getCost?token=' + self.app_token \
|
||||
+ '&offset=' + self.utc_offset + '&period=' \
|
||||
+ self.period
|
||||
response = get(url_string, timeout=10)
|
||||
url_string = '{}getCost?token={}&offset={}&period={}'.format(
|
||||
_RESOURCE, self.app_token, self.utc_offset, self.period)
|
||||
response = requests.get(url_string, timeout=10)
|
||||
self._state = response.json()['sum']
|
||||
elif self.type == 'current_values':
|
||||
url_string = _RESOURCE + 'getCurrentValuesSummary?token=' \
|
||||
+ self.app_token
|
||||
response = get(url_string, timeout=10)
|
||||
url_string = '{}getCurrentValuesSummary?token={}'.format(
|
||||
_RESOURCE, self.app_token)
|
||||
response = requests.get(url_string, timeout=10)
|
||||
for sensor in response.json():
|
||||
if self.sid == sensor['sid']:
|
||||
measurement = next(iter(sensor['data'][0].values()))
|
||||
self._state = measurement
|
||||
else:
|
||||
self._state = 'Unknown'
|
||||
except (RequestException, ValueError, KeyError):
|
||||
self._state = None
|
||||
except (requests.RequestException, ValueError, KeyError):
|
||||
_LOGGER.warning("Could not update status for %s", self.name)
|
||||
|
@ -14,21 +14,20 @@ ONE_SENSOR_CONFIG = {
|
||||
'platform': 'efergy',
|
||||
'app_token': token,
|
||||
'utc_offset': '300',
|
||||
'monitored_variables': [{'type': 'amount', 'period': 'day'},
|
||||
{'type': 'instant_readings'},
|
||||
{'type': 'budget'},
|
||||
{'type': 'cost', 'period': 'day', 'currency': '$'},
|
||||
{'type': 'current_values'}
|
||||
]
|
||||
'monitored_variables': [
|
||||
{'type': 'amount', 'period': 'day'},
|
||||
{'type': 'instant_readings'},
|
||||
{'type': 'budget'},
|
||||
{'type': 'cost', 'period': 'day', 'currency': '$'},
|
||||
{'type': 'current_values'},
|
||||
]
|
||||
}
|
||||
|
||||
MULTI_SENSOR_CONFIG = {
|
||||
'platform': 'efergy',
|
||||
'app_token': multi_sensor_token,
|
||||
'utc_offset': '300',
|
||||
'monitored_variables': [
|
||||
{'type': 'current_values'}
|
||||
]
|
||||
'monitored_variables': [{'type': 'current_values'}],
|
||||
}
|
||||
|
||||
|
||||
@ -36,22 +35,23 @@ def mock_responses(mock):
|
||||
"""Mock responses for Efergy."""
|
||||
base_url = 'https://engage.efergy.com/mobile_proxy/'
|
||||
mock.get(
|
||||
base_url + 'getInstant?token=' + token,
|
||||
'{}getInstant?token={}'.format(base_url, token),
|
||||
text=load_fixture('efergy_instant.json'))
|
||||
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'))
|
||||
mock.get(
|
||||
base_url + 'getBudget?token=' + token,
|
||||
'{}getBudget?token={}'.format(base_url, token),
|
||||
text=load_fixture('efergy_budget.json'))
|
||||
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'))
|
||||
mock.get(
|
||||
base_url + 'getCurrentValuesSummary?token=' + token,
|
||||
'{}getCurrentValuesSummary?token={}'.format(base_url, token),
|
||||
text=load_fixture('efergy_current_values_single.json'))
|
||||
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'))
|
||||
|
||||
|
||||
@ -69,7 +69,7 @@ class TestEfergySensor(unittest.TestCase):
|
||||
self.DEVICES.append(device)
|
||||
|
||||
def setUp(self):
|
||||
"""Initialize values for this testcase class."""
|
||||
"""Initialize values for this test case class."""
|
||||
self.hass = get_test_home_assistant()
|
||||
self.config = ONE_SENSOR_CONFIG
|
||||
|
||||
@ -82,27 +82,31 @@ class TestEfergySensor(unittest.TestCase):
|
||||
"""Test for successfully setting up the Efergy platform."""
|
||||
mock_responses(mock)
|
||||
assert setup_component(self.hass, 'sensor', {
|
||||
'sensor': ONE_SENSOR_CONFIG})
|
||||
self.assertEqual('38.21',
|
||||
self.hass.states.get('sensor.energy_consumed').state)
|
||||
self.assertEqual('1580',
|
||||
self.hass.states.get('sensor.energy_usage').state)
|
||||
self.assertEqual('ok',
|
||||
self.hass.states.get('sensor.energy_budget').state)
|
||||
self.assertEqual('5.27',
|
||||
self.hass.states.get('sensor.energy_cost').state)
|
||||
self.assertEqual('1628',
|
||||
self.hass.states.get('sensor.efergy_728386').state)
|
||||
'sensor': ONE_SENSOR_CONFIG,
|
||||
})
|
||||
|
||||
self.assertEqual(
|
||||
'38.21', self.hass.states.get('sensor.energy_consumed').state)
|
||||
self.assertEqual(
|
||||
'1580', self.hass.states.get('sensor.energy_usage').state)
|
||||
self.assertEqual(
|
||||
'ok', self.hass.states.get('sensor.energy_budget').state)
|
||||
self.assertEqual(
|
||||
'5.27', self.hass.states.get('sensor.energy_cost').state)
|
||||
self.assertEqual(
|
||||
'1628', self.hass.states.get('sensor.efergy_728386').state)
|
||||
|
||||
@requests_mock.Mocker()
|
||||
def test_multi_sensor_readings(self, mock):
|
||||
"""Test for multiple sensors in one household."""
|
||||
mock_responses(mock)
|
||||
assert setup_component(self.hass, 'sensor', {
|
||||
'sensor': MULTI_SENSOR_CONFIG})
|
||||
self.assertEqual('218',
|
||||
self.hass.states.get('sensor.efergy_728386').state)
|
||||
self.assertEqual('1808',
|
||||
self.hass.states.get('sensor.efergy_0').state)
|
||||
self.assertEqual('312',
|
||||
self.hass.states.get('sensor.efergy_728387').state)
|
||||
'sensor': MULTI_SENSOR_CONFIG,
|
||||
})
|
||||
|
||||
self.assertEqual(
|
||||
'218', self.hass.states.get('sensor.efergy_728386').state)
|
||||
self.assertEqual(
|
||||
'1808', self.hass.states.get('sensor.efergy_0').state)
|
||||
self.assertEqual(
|
||||
'312', self.hass.states.get('sensor.efergy_728387').state)
|
||||
|
5
tests/fixtures/efergy_budget.json
vendored
5
tests/fixtures/efergy_budget.json
vendored
@ -1 +1,4 @@
|
||||
{"status":"ok", "monthly_budget":250.0000}
|
||||
{
|
||||
"status": "ok",
|
||||
"monthly_budget": 250.0000
|
||||
}
|
6
tests/fixtures/efergy_cost.json
vendored
6
tests/fixtures/efergy_cost.json
vendored
@ -1 +1,5 @@
|
||||
{"sum":"5.27","duration":70320,"units":"GBP"}
|
||||
{
|
||||
"sum": "5.27",
|
||||
"duration": 70320,
|
||||
"units": "GBP"
|
||||
}
|
6
tests/fixtures/efergy_energy.json
vendored
6
tests/fixtures/efergy_energy.json
vendored
@ -1 +1,5 @@
|
||||
{"sum":"38.21","duration":70320,"units":"kWh"}
|
||||
{
|
||||
"sum": "38.21",
|
||||
"duration": 70320,
|
||||
"units": "kWh"
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user