From 563b9c33617c69e831f0cfa4ae056c68e696165f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rune=20A=2E=20Juel=20M=C3=B8nnike?= Date: Tue, 13 Sep 2022 13:18:31 +0200 Subject: [PATCH 1/3] #48: Added sensor for year-to-date consumption. --- custom_components/eloverblik/__init__.py | 39 ++++++++++++++++-------- custom_components/eloverblik/sensor.py | 14 +++++++-- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/custom_components/eloverblik/__init__.py b/custom_components/eloverblik/__init__.py index 27885db..815c585 100644 --- a/custom_components/eloverblik/__init__.py +++ b/custom_components/eloverblik/__init__.py @@ -5,7 +5,7 @@ import voluptuous as vol from homeassistant.util import Throttle -from datetime import timedelta +from datetime import timedelta, date from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant @@ -67,28 +67,35 @@ def __init__(self, refresh_token, metering_point): self._client = Eloverblik(refresh_token) self._metering_point = metering_point - self._data = None + self._day_data = None + self._year_data = None def get_total_day(self): - if self._data != None: - return round(self._data.get_total_metering_data(), 3) + if self._day_data != None: + return round(self._day_data.get_total_metering_data(), 3) + else: + return None + + def get_total_year(self): + if self._day_data != None: + return round(self._year_data.get_total_metering_data(), 3) else: return None def get_usage_hour(self, hour): - if self._data != None: + if self._day_data != None: try: - return round(self._data.get_metering_data(hour), 3) + return round(self._day_data.get_metering_data(hour), 3) except IndexError: - self._data.get_metering_data(23) + self._day_data.get_metering_data(23) _LOGGER.info(f"Unable to get data for hour {hour}. If siwtch to daylight saving day this is not an error.") return 0 else: return None def get_data_date(self): - if self._data != None: - return self._data.data_date.date().strftime('%Y-%m-%d') + if self._day_data != None: + return self._day_data.data_date.date().strftime('%Y-%m-%d') else: return None @@ -100,11 +107,17 @@ def update(self): _LOGGER.debug("Fetching data from Eloverblik") try: - data = self._client.get_latest(self._metering_point) - if data.status == 200: - self._data = data + day_data = self._client.get_latest(self._metering_point) + if day_data.status == 200: + self._day_data = day_data + else: + _LOGGER.warn(f"Error from eloverblik when getting day data: {day_data.status} - {day_data.detailed_status}") + + year_data = self._client.get_per_month(self._metering_point) + if year_data.status == 200: + self._year_data = year_data else: - _LOGGER.warn(f"Error from eloverblik: {data.status} - {data.detailed_status}") + _LOGGER.warn(f"Error from eloverblik when getting year data: {year_data.status} - {year_data.detailed_status}") except requests.exceptions.HTTPError as he: message = None if he.response.status_code == 401: diff --git a/custom_components/eloverblik/sensor.py b/custom_components/eloverblik/sensor.py index d924d4f..b431bad 100644 --- a/custom_components/eloverblik/sensor.py +++ b/custom_components/eloverblik/sensor.py @@ -16,6 +16,7 @@ async def async_setup_entry(hass, config, async_add_entities): sensors = [] sensors.append(EloverblikEnergy("Eloverblik Energy Total", 'total', eloverblik)) + sensors.append(EloverblikEnergy("Eloverblik Energy Total (Year)", 'year_total', eloverblik)) for x in range(1, 25): sensors.append(EloverblikEnergy(f"Eloverblik Energy {x-1}-{x}", 'hour', eloverblik, x)) async_add_entities(sensors) @@ -35,8 +36,12 @@ def __init__(self, name, sensor_type, client, hour=None): if sensor_type == 'hour': self._unique_id = f"{self._data.get_metering_point()}-{hour}" - else: + elif sensor_type == 'total': self._unique_id = f"{self._data.get_metering_point()}-total" + elif sensor_type == 'year_total': + self._unique_id = f"{self._data.get_metering_point()}-year-total" + else: + raise ValueError(f"Unexpected sensor_type: {sensor_type}.") @property def name(self): @@ -75,8 +80,11 @@ def update(self): self._data_date = self._data.get_data_date() + if self._sensor_type == 'hour': + self._state = self._data.get_usage_hour(self._hour) if self._sensor_type == 'total': self._state = self._data.get_total_day() + elif self._sensor_type == 'year_total': + self._state = self._data.get_total_year() else: - self._state = self._data.get_usage_hour(self._hour) - + raise ValueError(f"Unexpected sensor_type: {self._sensor_type}.") From d997caa5dd521c0b4112b5d083fc5217c5c467ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rune=20A=2E=20Juel=20M=C3=B8nnike?= Date: Thu, 15 Sep 2022 21:04:24 +0200 Subject: [PATCH 2/3] #48: Fixed if/elif/else structure to avoid misleading errors in log. --- custom_components/eloverblik/sensor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/eloverblik/sensor.py b/custom_components/eloverblik/sensor.py index b431bad..46e7ab9 100644 --- a/custom_components/eloverblik/sensor.py +++ b/custom_components/eloverblik/sensor.py @@ -82,7 +82,7 @@ def update(self): if self._sensor_type == 'hour': self._state = self._data.get_usage_hour(self._hour) - if self._sensor_type == 'total': + elif self._sensor_type == 'total': self._state = self._data.get_total_day() elif self._sensor_type == 'year_total': self._state = self._data.get_total_year() From 06dca3de19782f8d50ff552b2b304fcf8a5aee96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rune=20M=C3=B8nnike?= Date: Tue, 27 Sep 2022 11:07:16 +0200 Subject: [PATCH 3/3] Corrected check on _year_data. --- custom_components/eloverblik/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom_components/eloverblik/__init__.py b/custom_components/eloverblik/__init__.py index 815c585..67a80f0 100644 --- a/custom_components/eloverblik/__init__.py +++ b/custom_components/eloverblik/__init__.py @@ -77,7 +77,7 @@ def get_total_day(self): return None def get_total_year(self): - if self._day_data != None: + if self._year_data != None: return round(self._year_data.get_total_metering_data(), 3) else: return None