mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +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/
|
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)
|
||||||
|
@ -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)
|
||||||
|
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