--- title: "Entities event setup" --- ## Reasoning Entities may need to subscribe to events, eg. from the integration library, and update state when a new event comes in. In order to do this correctly, the entities should subscribe and register the update callback in the entity method `async_added_to_hass`. This entity method is called after the entity has been registered by the entity platform helper and the entity will now have all its interfaces available to call, such as `self.hass` and `self.async_write_ha_state`. Registering an update callback before this stage will cause errors if the callback eg. tries to access `self.hass` or write a state update. To avoid memory leaks, the entities should unsubscribe from the events, ie. unregister the update callback, in the entity method `async_will_remove_from_hass`. ## Example implementation In the example below, the `self.client.events.subscribe` returns a function that when called, unsubscribes the entity from the event. So we subscribe to the event in `async_added_to_hass` and unsubscribe in `async_will_remove_from_hass`. `sensor.py` ```python {10-13,15-19} showLineNumbers class MySensor(SensorEntity): """Representation of a sensor.""" unsubscribe: Callable[[], None] = None def __init__(self, client: MyClient) -> None: """Initialize the sensor.""" self.client = client async def async_added_to_hass(self) -> None: """Subscribe to the events.""" await super().async_added_to_hass() self.unsubscribe = self.client.events.subscribe("my_event", self._handle_event) async def async_will_remove_from_hass(self) -> None: """Unsubscribe from the events.""" if self.unsubscribe: self.unsubscribe() await super().async_will_remove_from_hass() async def _handle_event(self, event: Event) -> None: """Handle the event.""" ... self.async_write_ha_state() ``` :::info The above example can be simplified using lifecycle functions. This saves the need to store the callback function in the entity. ```python showLineNumbers async def async_added_to_hass(self) -> None: """Subscribe to the events.""" await super().async_added_to_hass() self.async_on_remove( self.client.events.subscribe("my_event", self._handle_event) ) ``` ::: ## Exceptions There are no exceptions to this rule.