diff --git a/homeassistant/components/rainmachine/__init__.py b/homeassistant/components/rainmachine/__init__.py index 4844a9e68c8..4cf32185dc9 100644 --- a/homeassistant/components/rainmachine/__init__.py +++ b/homeassistant/components/rainmachine/__init__.py @@ -455,9 +455,16 @@ class RainMachineEntity(Entity): @callback def _update_state(self): """Update the state.""" - self.async_schedule_update_ha_state(True) + self.update_from_latest_data() + self.async_write_ha_state() async def async_will_remove_from_hass(self): """Disconnect dispatcher listener when removed.""" for handler in self._dispatcher_handlers: handler() + self._dispatcher_handlers = [] + + @callback + def update_from_latest_data(self): + """Update the entity.""" + raise NotImplementedError diff --git a/homeassistant/components/rainmachine/binary_sensor.py b/homeassistant/components/rainmachine/binary_sensor.py index 34b8de80b88..409ad0c9980 100644 --- a/homeassistant/components/rainmachine/binary_sensor.py +++ b/homeassistant/components/rainmachine/binary_sensor.py @@ -2,6 +2,7 @@ import logging from homeassistant.components.binary_sensor import BinarySensorDevice +from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from . import RainMachineEntity @@ -129,9 +130,15 @@ class RainMachineBinarySensor(RainMachineEntity, BinarySensorDevice): async_dispatcher_connect(self.hass, SENSOR_UPDATE_TOPIC, self._update_state) ) await self.rainmachine.async_register_sensor_api_interest(self._api_category) - await self.async_update() + self.update_from_latest_data() - async def async_update(self): + async def async_will_remove_from_hass(self): + """Disconnect dispatcher listeners and deregister API interest.""" + super().async_will_remove_from_hass() + self.rainmachine.async_deregister_sensor_api_interest(self._api_category) + + @callback + def update_from_latest_data(self): """Update the state.""" if self._sensor_type == TYPE_FLOW_SENSOR: self._state = self.rainmachine.data[DATA_PROVISION_SETTINGS]["system"].get( @@ -157,8 +164,3 @@ class RainMachineBinarySensor(RainMachineEntity, BinarySensorDevice): self._state = self.rainmachine.data[DATA_RESTRICTIONS_CURRENT]["rainSensor"] elif self._sensor_type == TYPE_WEEKDAY: self._state = self.rainmachine.data[DATA_RESTRICTIONS_CURRENT]["weekDay"] - - async def async_will_remove_from_hass(self): - """Disconnect dispatcher listeners and deregister API interest.""" - super().async_will_remove_from_hass() - self.rainmachine.async_deregister_sensor_api_interest(self._api_category) diff --git a/homeassistant/components/rainmachine/sensor.py b/homeassistant/components/rainmachine/sensor.py index 8487628a32b..371ba00dfd0 100644 --- a/homeassistant/components/rainmachine/sensor.py +++ b/homeassistant/components/rainmachine/sensor.py @@ -1,6 +1,7 @@ """This platform provides support for sensor data from RainMachine.""" import logging +from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from . import RainMachineEntity @@ -146,9 +147,15 @@ class RainMachineSensor(RainMachineEntity): async_dispatcher_connect(self.hass, SENSOR_UPDATE_TOPIC, self._update_state) ) await self.rainmachine.async_register_sensor_api_interest(self._api_category) - await self.async_update() + self.update_from_latest_data() - async def async_update(self): + async def async_will_remove_from_hass(self): + """Disconnect dispatcher listeners and deregister API interest.""" + super().async_will_remove_from_hass() + self.rainmachine.async_deregister_sensor_api_interest(self._api_category) + + @callback + def update_from_latest_data(self): """Update the sensor's state.""" if self._sensor_type == TYPE_FLOW_SENSOR_CLICK_M3: self._state = self.rainmachine.data[DATA_PROVISION_SETTINGS]["system"].get( @@ -178,8 +185,3 @@ class RainMachineSensor(RainMachineEntity): self._state = self.rainmachine.data[DATA_RESTRICTIONS_UNIVERSAL][ "freezeProtectTemp" ] - - async def async_will_remove_from_hass(self): - """Disconnect dispatcher listeners and deregister API interest.""" - super().async_will_remove_from_hass() - self.rainmachine.async_deregister_sensor_api_interest(self._api_category) diff --git a/homeassistant/components/rainmachine/switch.py b/homeassistant/components/rainmachine/switch.py index 2bf63dbf495..264de1d6782 100644 --- a/homeassistant/components/rainmachine/switch.py +++ b/homeassistant/components/rainmachine/switch.py @@ -6,6 +6,7 @@ from regenmaschine.errors import RequestError from homeassistant.components.switch import SwitchDevice from homeassistant.const import ATTR_ID +from homeassistant.core import callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from . import RainMachineEntity @@ -205,7 +206,8 @@ class RainMachineProgram(RainMachineSwitch): self.rainmachine.controller.programs.start(self._rainmachine_entity_id) ) - async def async_update(self) -> None: + @callback + def update_from_latest_data(self) -> None: """Update info for the program.""" [self._switch_data] = [ p @@ -269,7 +271,8 @@ class RainMachineZone(RainMachineSwitch): ) ) - async def async_update(self) -> None: + @callback + def update_from_latest_data(self) -> None: """Update info for the zone.""" [self._switch_data] = [ z