From 4aa76c7082a39e81010746f9da59010ff689d0a4 Mon Sep 17 00:00:00 2001 From: Daniel Raper Date: Wed, 27 Dec 2023 21:43:15 +0000 Subject: [PATCH] Move graph timeslot calculation --- custom_components/ohme/sensor.py | 20 +++++++++++++++----- custom_components/ohme/utils.py | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/custom_components/ohme/sensor.py b/custom_components/ohme/sensor.py index 6869711..7396a97 100644 --- a/custom_components/ohme/sensor.py +++ b/custom_components/ohme/sensor.py @@ -7,8 +7,9 @@ ) from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.const import UnitOfPower, UnitOfEnergy -from homeassistant.core import HomeAssistant +from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.entity import generate_entity_id +from homeassistant.util.dt import (utcnow) from .const import DOMAIN, DATA_CLIENT, DATA_COORDINATOR, DATA_STATISTICS_COORDINATOR from .coordinator import OhmeUpdateCoordinator, OhmeStatisticsUpdateCoordinator from .utils import charge_graph_next_slot @@ -148,8 +149,17 @@ def icon(self): @property def native_value(self): - """Get value from data returned from API by coordinator""" - if self.coordinator.data and self.coordinator.data['mode'] != "DISCONNECTED": - return charge_graph_next_slot(self.coordinator.data['startTime'], self.coordinator.data['chargeGraph']['points']) + """Return pre-calculated state.""" + return self._state - return None + @callback + def _handle_coordinator_update(self) -> None: + """Calculate next timeslot. This is a bit slow so we only update on coordinator data update.""" + if self.coordinator.data is None: + self._state = None + else: + self._state = charge_graph_next_slot(self.coordinator.data['startTime'], self.coordinator.data['chargeGraph']['points']) + + self._last_updated = utcnow() + + self.async_write_ha_state() diff --git a/custom_components/ohme/utils.py b/custom_components/ohme/utils.py index 5b163f4..63d6bfa 100644 --- a/custom_components/ohme/utils.py +++ b/custom_components/ohme/utils.py @@ -16,7 +16,7 @@ def charge_graph_next_slot(charge_start, points): # Give up if we have less than 3 points if len(data) < 3: - return False + return None next_ts = None