Skip to content

Commit

Permalink
fix: Moved various sensor updates out of update loop and into state p…
Browse files Browse the repository at this point in the history
…roperty which should stabilize updates
  • Loading branch information
BottlecapDave committed Aug 9, 2023
1 parent 799d6c8 commit 662a32b
Show file tree
Hide file tree
Showing 33 changed files with 139 additions and 175 deletions.
3 changes: 2 additions & 1 deletion custom_components/octopus_energy/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,16 @@

DATA_CONFIG = "CONFIG"
DATA_ELECTRICITY_RATES_COORDINATOR = "ELECTRICITY_RATES_COORDINATOR"
DATA_CLIENT = "CLIENT"
DATA_ELECTRICITY_RATES = "ELECTRICITY_RATES"
DATA_CLIENT = "CLIENT"
DATA_GAS_TARIFF_CODE = "GAS_TARIFF_CODE"
DATA_ACCOUNT_ID = "ACCOUNT_ID"
DATA_ACCOUNT = "ACCOUNT"
DATA_ACCOUNT_COORDINATOR = "ACCOUNT_COORDINATOR"
DATA_SAVING_SESSIONS = "SAVING_SESSIONS"
DATA_SAVING_SESSIONS_COORDINATOR = "SAVING_SESSIONS_COORDINATOR"
DATA_KNOWN_TARIFF = "KNOWN_TARIFF"
DATA_GAS_RATES_COORDINATOR = "DATA_GAS_RATES_COORDINATOR"
DATA_GAS_RATES = "GAS_RATES"
DATA_INTELLIGENT_DISPATCHES = "INTELLIGENT_DISPATCHES"
DATA_INTELLIGENT_DISPATCHES_COORDINATOR = "INTELLIGENT_DISPATCHES_COORDINATOR"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ async def async_setup_electricity_rates_coordinator(hass, account_id: str):
hass.data[DOMAIN][DATA_ELECTRICITY_RATES] = []

if DATA_ELECTRICITY_RATES_COORDINATOR in hass.data[DOMAIN]:
_LOGGER.info("Rates coordinator has already been configured, so skipping")
_LOGGER.info("Electricity rates coordinator has already been configured, so skipping")
return

async def async_update_electricity_rates_data():
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
from ..const import (
DOMAIN,
DATA_CLIENT,
DATA_ELECTRICITY_STANDING_CHARGES_COORDINATOR,
DATA_ELECTRICITY_STANDING_CHARGES,
DATA_ACCOUNT,
)
Expand Down Expand Up @@ -62,10 +61,6 @@ async def async_refresh_electricity_standing_charges_data(
async def async_setup_electricity_standing_charges_coordinator(hass, account_id: str):
# Reset data rates as we might have new information
hass.data[DOMAIN][DATA_ELECTRICITY_STANDING_CHARGES] = []

if DATA_ELECTRICITY_STANDING_CHARGES_COORDINATOR in hass.data[DOMAIN]:
_LOGGER.info("Rates coordinator has already been configured, so skipping")
return

async def async_update_electricity_standing_charges_data():
"""Fetch data from API endpoint."""
Expand All @@ -83,7 +78,7 @@ async def async_update_electricity_standing_charges_data():

return hass.data[DOMAIN][DATA_ELECTRICITY_STANDING_CHARGES]

hass.data[DOMAIN][DATA_ELECTRICITY_STANDING_CHARGES_COORDINATOR] = DataUpdateCoordinator(
coordinator = DataUpdateCoordinator(
hass,
_LOGGER,
name="electricity_standing_charges",
Expand All @@ -93,6 +88,6 @@ async def async_update_electricity_standing_charges_data():
update_interval=timedelta(minutes=1),
)

await hass.data[DOMAIN][DATA_ELECTRICITY_STANDING_CHARGES_COORDINATOR].async_config_entry_first_refresh()
await coordinator.async_config_entry_first_refresh()

return hass.data[DOMAIN][DATA_ELECTRICITY_STANDING_CHARGES_COORDINATOR]
return coordinator
2 changes: 2 additions & 0 deletions custom_components/octopus_energy/coordinators/gas_rates.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ async def async_refresh_gas_rates_data(

async def async_create_gas_rate_coordinator(hass, client: OctopusEnergyApiClient):
"""Create gas rate coordinator"""
# Reset data rates as we might have new information
hass.data[DOMAIN][DATA_GAS_RATES] = []

async def async_update_data():
"""Fetch data from API endpoint."""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
from ..const import (
DOMAIN,
DATA_CLIENT,
DATA_GAS_STANDING_CHARGES_COORDINATOR,
DATA_GAS_STANDING_CHARGES,
DATA_ACCOUNT,
)
Expand Down Expand Up @@ -62,10 +61,6 @@ async def async_refresh_gas_standing_charges_data(
async def async_setup_gas_standing_charges_coordinator(hass, account_id: str):
# Reset data rates as we might have new information
hass.data[DOMAIN][DATA_GAS_STANDING_CHARGES] = []

if DATA_GAS_STANDING_CHARGES_COORDINATOR in hass.data[DOMAIN]:
_LOGGER.info("Rates coordinator has already been configured, so skipping")
return

async def async_update_gas_standing_charges_data():
"""Fetch data from API endpoint."""
Expand All @@ -83,7 +78,7 @@ async def async_update_gas_standing_charges_data():

return hass.data[DOMAIN][DATA_GAS_STANDING_CHARGES]

hass.data[DOMAIN][DATA_GAS_STANDING_CHARGES_COORDINATOR] = DataUpdateCoordinator(
coordinator = DataUpdateCoordinator(
hass,
_LOGGER,
name="gas_standing_charges",
Expand All @@ -93,6 +88,6 @@ async def async_update_gas_standing_charges_data():
update_interval=timedelta(minutes=1),
)

await hass.data[DOMAIN][DATA_GAS_STANDING_CHARGES_COORDINATOR].async_config_entry_first_refresh()
await coordinator.async_config_entry_first_refresh()

return hass.data[DOMAIN][DATA_GAS_STANDING_CHARGES_COORDINATOR]
return coordinator
2 changes: 1 addition & 1 deletion custom_components/octopus_energy/electricity/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ def __sort_consumption(consumption_data):

minimum_consumption_records = 2

async def async_calculate_electricity_consumption_and_cost(
def calculate_electricity_consumption_and_cost(
consumption_data,
rate_data,
standing_charge,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

from .base import (OctopusEnergyElectricitySensor)

from . import async_calculate_electricity_consumption_and_cost
from . import calculate_electricity_consumption_and_cost

_LOGGER = logging.getLogger(__name__)

Expand Down Expand Up @@ -77,18 +77,11 @@ def last_reset(self):
@property
def state(self):
"""Retrieve the current days accumulative consumption"""
return self._state

@property
def should_poll(self) -> bool:
return True

async def async_update(self):
consumption_data = self.coordinator.data if self.coordinator.data is not None else None
rate_data = self._rates_coordinator.data[self._mpan] if self._rates_coordinator.data is not None and self._mpan in self._rates_coordinator.data else None
standing_charge = self._standing_charge_coordinator.data[self._mpan]["value_inc_vat"] if self._standing_charge_coordinator.data is not None and self._mpan in self._standing_charge_coordinator.data and "value_inc_vat" in self._standing_charge_coordinator.data[self._mpan] else None

consumption_and_cost = await async_calculate_electricity_consumption_and_cost(
consumption_and_cost = calculate_electricity_consumption_and_cost(
consumption_data,
rate_data,
standing_charge,
Expand Down Expand Up @@ -116,6 +109,8 @@ async def async_update(self):
}, consumption_and_cost["charges"]))
}

return self._state

async def async_added_to_hass(self):
"""Call when entity about to be added to hass."""
# If not None, we got an initial value.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
)

from . import (
async_calculate_electricity_consumption_and_cost,
calculate_electricity_consumption_and_cost,
)

from .base import (OctopusEnergyElectricitySensor)
Expand Down Expand Up @@ -88,18 +88,11 @@ def last_reset(self):
@property
def state(self):
"""Retrieve the current days accumulative consumption"""
return self._state

@property
def should_poll(self) -> bool:
return True

async def async_update(self):
consumption_data = self.coordinator.data if self.coordinator.data is not None else None
rate_data = self._rates_coordinator.data[self._mpan] if self._rates_coordinator.data is not None and self._mpan in self._rates_coordinator.data else None
standing_charge = self._standing_charge_coordinator.data[self._mpan]["value_inc_vat"] if self._standing_charge_coordinator.data is not None and self._mpan in self._standing_charge_coordinator.data and "value_inc_vat" in self._standing_charge_coordinator.data[self._mpan] else None

consumption_and_cost = await async_calculate_electricity_consumption_and_cost(
consumption_and_cost = calculate_electricity_consumption_and_cost(
consumption_data,
rate_data,
standing_charge,
Expand All @@ -115,6 +108,8 @@ async def async_update(self):

self._attributes["last_calculated_timestamp"] = consumption_and_cost["last_calculated_timestamp"]

return self._state

async def async_added_to_hass(self):
"""Call when entity about to be added to hass."""
# If not None, we got an initial value.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
)

from . import (
async_calculate_electricity_consumption_and_cost,
calculate_electricity_consumption_and_cost,
)

from .base import (OctopusEnergyElectricitySensor)
Expand Down Expand Up @@ -88,18 +88,11 @@ def last_reset(self):
@property
def state(self):
"""Retrieve the current days accumulative consumption"""
return self._state

@property
def should_poll(self) -> bool:
return True

async def async_update(self):
consumption_data = self.coordinator.data if self.coordinator.data is not None else None
rate_data = self._rates_coordinator.data[self._mpan] if self._rates_coordinator.data is not None and self._mpan in self._rates_coordinator.data else None
standing_charge = self._standing_charge_coordinator.data[self._mpan]["value_inc_vat"] if self._standing_charge_coordinator.data is not None and self._mpan in self._standing_charge_coordinator.data and "value_inc_vat" in self._standing_charge_coordinator.data[self._mpan] else None

consumption_and_cost = await async_calculate_electricity_consumption_and_cost(
consumption_and_cost = calculate_electricity_consumption_and_cost(
consumption_data,
rate_data,
standing_charge,
Expand All @@ -115,6 +108,8 @@ async def async_update(self):

self._attributes["last_calculated_timestamp"] = consumption_and_cost["last_calculated_timestamp"]

return self._state

async def async_added_to_hass(self):
"""Call when entity about to be added to hass."""
# If not None, we got an initial value.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
SensorStateClass
)
from . import (
async_calculate_electricity_consumption_and_cost,
calculate_electricity_consumption_and_cost,
)

from .base import (OctopusEnergyElectricitySensor)
Expand Down Expand Up @@ -85,18 +85,11 @@ def last_reset(self):
@property
def state(self):
"""Retrieve the currently calculated state"""
return self._state

@property
def should_poll(self):
return True

async def async_update(self):
consumption_data = self.coordinator.data if self.coordinator.data is not None else None
rate_data = self._rates_coordinator.data[self._mpan] if self._rates_coordinator.data is not None and self._mpan in self._rates_coordinator.data else None
standing_charge = self._standing_charge_coordinator.data[self._mpan]["value_inc_vat"] if self._standing_charge_coordinator.data is not None and self._mpan in self._standing_charge_coordinator.data and "value_inc_vat" in self._standing_charge_coordinator.data[self._mpan] else None

consumption_and_cost = await async_calculate_electricity_consumption_and_cost(
consumption_and_cost = calculate_electricity_consumption_and_cost(
consumption_data,
rate_data,
standing_charge,
Expand Down Expand Up @@ -130,6 +123,8 @@ async def async_update(self):
}, consumption_and_cost["charges"]))
}

return self._state

async def async_added_to_hass(self):
"""Call when entity about to be added to hass."""
# If not None, we got an initial value.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
SensorStateClass
)
from . import (
async_calculate_electricity_consumption_and_cost,
calculate_electricity_consumption_and_cost,
)

from .base import (OctopusEnergyElectricitySensor)
Expand Down Expand Up @@ -76,10 +76,6 @@ def extra_state_attributes(self):
"""Attributes of the sensor."""
return self._attributes

@property
def should_poll(self):
return True

@property
def last_reset(self):
"""Return the time when the sensor was last reset, if any."""
Expand All @@ -88,14 +84,11 @@ def last_reset(self):
@property
def state(self):
"""Retrieve the currently calculated state"""
return self._state

async def async_update(self):
consumption_data = self.coordinator.data if self.coordinator.data is not None else None
rate_data = self._rates_coordinator.data[self._mpan] if self._rates_coordinator.data is not None and self._mpan in self._rates_coordinator.data else None
standing_charge = self._standing_charge_coordinator.data[self._mpan]["value_inc_vat"] if self._standing_charge_coordinator.data is not None and self._mpan in self._standing_charge_coordinator.data and "value_inc_vat" in self._standing_charge_coordinator.data[self._mpan] else None

consumption_and_cost = await async_calculate_electricity_consumption_and_cost(
consumption_and_cost = calculate_electricity_consumption_and_cost(
consumption_data,
rate_data,
standing_charge,
Expand All @@ -111,6 +104,8 @@ async def async_update(self):

self._attributes["last_calculated_timestamp"] = consumption_and_cost["last_calculated_timestamp"]

return self._state

async def async_added_to_hass(self):
"""Call when entity about to be added to hass."""
# If not None, we got an initial value.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
SensorStateClass
)
from . import (
async_calculate_electricity_consumption_and_cost,
calculate_electricity_consumption_and_cost,
)

from .base import (OctopusEnergyElectricitySensor)
Expand Down Expand Up @@ -84,18 +84,11 @@ def last_reset(self):
@property
def state(self):
"""Retrieve the currently calculated state"""
return self._state

@property
def should_poll(self):
return True

async def async_update(self):
consumption_data = self.coordinator.data if self.coordinator.data is not None else None
rate_data = self._rates_coordinator.data[self._mpan] if self._rates_coordinator.data is not None and self._mpan in self._rates_coordinator.data else None
standing_charge = self._standing_charge_coordinator.data[self._mpan]["value_inc_vat"] if self._standing_charge_coordinator.data is not None and self._mpan in self._standing_charge_coordinator.data and "value_inc_vat" in self._standing_charge_coordinator.data[self._mpan] else None

consumption_and_cost = await async_calculate_electricity_consumption_and_cost(
consumption_and_cost = calculate_electricity_consumption_and_cost(
consumption_data,
rate_data,
standing_charge,
Expand All @@ -111,6 +104,8 @@ async def async_update(self):

self._attributes["last_calculated_timestamp"] = consumption_and_cost["last_calculated_timestamp"]

return self._state

async def async_added_to_hass(self):
"""Call when entity about to be added to hass."""
# If not None, we got an initial value.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
)

from . import (
async_calculate_electricity_consumption_and_cost,
calculate_electricity_consumption_and_cost,
)

from .base import (OctopusEnergyElectricitySensor)
Expand Down Expand Up @@ -95,11 +95,16 @@ def should_poll(self) -> bool:
return True

async def async_update(self):
await super().async_update()

if not self.enabled:
return

consumption_data = self.coordinator.data["consumption"] if self.coordinator.data is not None and "consumption" in self.coordinator.data else None
rate_data = self.coordinator.data["rates"] if self.coordinator.data is not None and "rates" in self.coordinator.data else None
standing_charge = self.coordinator.data["standing_charge"] if self.coordinator.data is not None and "standing_charge" in self.coordinator.data else None

consumption_and_cost = await async_calculate_electricity_consumption_and_cost(
consumption_and_cost = calculate_electricity_consumption_and_cost(
consumption_data,
rate_data,
standing_charge,
Expand Down
Loading

0 comments on commit 662a32b

Please sign in to comment.