ESPHome 2026.4.0
Loading...
Searching...
No Matches
esphome::StatefulEntityBase< T > Class Template Referenceabstract

Base class for entities that track a typed state value with change-detection and callbacks. More...

#include <entity_base.h>

Inheritance diagram for esphome::StatefulEntityBase< T >:
esphome::EntityBase

Public Member Functions

virtual const T & get_state () const =0
 Return the current state value. Only valid when has_state() is true.
 
get_state_default (T default_value) const
 Return the current state if available, otherwise return the provided default.
 
void invalidate_state ()
 Clear the state — sets has_state() to false and fires callbacks with nullopt.
 
template<typename F >
void add_full_state_callback (F &&callback)
 
template<typename F >
void add_on_state_callback (F &&callback)
 
- Public Member Functions inherited from esphome::EntityBase
const StringRefget_name () const
 
bool has_own_name () const
 
ESPDEPRECATED("object_id mangles names and all object_id methods are planned for removal " "(see https://github.com/esphome/backlog/issues/76). " "Now is the time to stop using object_id. If still needed, use get_object_id_to() " "which will remain available longer. get_object_id() will be removed in 2026.7.0", "2025.12.0") std uint32_t get_object_id_hash () const
 
StringRef get_object_id_to (std::span< char, OBJECT_ID_MAX_LEN > buf) const
 Get object_id with zero heap allocation For static case: returns StringRef to internal storage (buffer unused) For dynamic case: formats into buffer and returns StringRef to buffer.
 
size_t write_object_id_to (char *buf, size_t buf_size) const
 Write object_id directly to buffer, returns length written (excluding null) Useful for building compound strings without intermediate buffer.
 
bool is_internal () const
 
 ESPDEPRECATED ("set_internal() is undefined behavior at runtime — components and Home Assistant are NOT " "notified. Use the 'internal:' YAML key instead. Will be removed in 2027.3.0.", "2026.3.0") void set_internal(bool internal)
 
bool is_disabled_by_default () const
 
EntityCategory get_entity_category () const
 
const char * get_device_class_to (std::span< char, MAX_DEVICE_CLASS_LENGTH > buffer) const
 
template<typename T = int>
StringRef get_device_class_ref () const
 
template<typename T = int>
std::string get_device_class () const
 
 ESPDEPRECATED ("Use get_device_class_to() instead. Will be removed in ESPHome 2026.9.0", "2026.3.0") StringRef get_device_class_ref() const
 
ESPDEPRECATED("Use get_device_class_to() instead. Will be removed in ESPHome 2026.9.0", "2026.3.0") std StringRef get_unit_of_measurement_ref () const
 
ESPDEPRECATED("Use get_unit_of_measurement_ref() instead for better performance (avoids string copy). Will be " "removed in ESPHome 2026.9.0", "2026.3.0") std const char * get_icon_to (std::span< char, MAX_ICON_LENGTH > buffer) const
 Get the unit of measurement as std::string (deprecated, prefer get_unit_of_measurement_ref())
 
template<typename T = int>
StringRef get_icon_ref () const
 
template<typename T = int>
std::string get_icon () const
 
 ESPDEPRECATED ("Use get_icon_to() instead. Will be removed in ESPHome 2026.9.0", "2026.3.0") StringRef get_icon_ref() const
 
ESPDEPRECATED("Use get_icon_to() instead. Will be removed in ESPHome 2026.9.0", "2026.3.0") std uint32_t get_device_id () const
 
Deviceget_device () const
 
bool has_state () const
 
void set_has_state (bool state)
 
 ESPDEPRECATED ("Use make_entity_preference<T>() instead, or preferences won't be migrated. " "See https://github.com/esphome/backlog/issues/85. Will be removed in 2027.1.0.", "2026.7.0") uint32_t get_preference_hash()
 Get a unique hash for storing preferences/settings for this entity.
 
template<typename T >
ESPPreferenceObject make_entity_preference (uint32_t version=0)
 Create a preference object for storing this entity's state/settings.
 

Protected Member Functions

virtual bool get_trigger_on_initial_state () const =0
 Subclasses return whether callbacks should fire on the very first state.
 
virtual bool set_new_state (const optional< T > &new_state)
 Apply a new state, de-duplicating and firing callbacks as needed.
 
virtual void set_state_value (const T &value)=0
 Subclasses implement this to store the actual value into their own storage.
 
- Protected Member Functions inherited from esphome::EntityBase
friend void::setup ()
 
friend void::original_setup ()
 
void configure_entity_ (const char *name, uint32_t object_id_hash, uint32_t entity_fields)
 Combined entity setup from codegen: set name, object_id hash, entity string indices, and flags.
 
void set_device_ (Device *device)
 
ESPPreferenceObject make_entity_preference_ (size_t size, uint32_t version)
 Non-template helper for make_entity_preference() to avoid code bloat.
 
void calc_object_id_ ()
 

Protected Attributes

LazyCallbackManager< void(optional< T > previous, optional< T > current)> full_state_callbacks_
 
LazyCallbackManager< void(T)> state_callbacks_
 
- Protected Attributes inherited from esphome::EntityBase
StringRef name_
 
uint32_t object_id_hash_ {}
 
Devicedevice_ {}
 
struct esphome::EntityBase::EntityFlags flags_
 
uint8_t device_class_idx_ {}
 
uint8_t uom_idx_ {}
 
uint8_t icon_idx_ {}
 

Detailed Description

template<typename T>
class esphome::StatefulEntityBase< T >

Base class for entities that track a typed state value with change-detection and callbacks.

This class does not store the state value — subclasses own their storage. Whether a state has been set is tracked by EntityBase::has_state().

Subclasses must implement:

Subclasses may override set_new_state() to add behavior (logging, notifications) after calling the base implementation. Since set_new_state() is virtual, callers like invalidate_state() dispatch through the vtable to the subclass override in the .cpp, avoiding template code bloat at inline call sites. Subclasses may also add a fast-path dedup check before calling set_new_state() to skip virtual dispatch entirely when the state hasn't changed.

Callback behavior:

  • full_state_callbacks_: fired on every change, receives optional<T> previous and current
  • state_callbacks_: fired only when the new state has a value, and either this is not the first state (had_state) or trigger_on_initial_state is set
Template Parameters
TThe type of the state value

Definition at line 322 of file entity_base.h.

Member Function Documentation

◆ add_full_state_callback()

template<typename T >
template<typename F >
void esphome::StatefulEntityBase< T >::add_full_state_callback ( F && callback)
inline

Definition at line 331 of file entity_base.h.

◆ add_on_state_callback()

template<typename T >
template<typename F >
void esphome::StatefulEntityBase< T >::add_on_state_callback ( F && callback)
inline

Definition at line 334 of file entity_base.h.

◆ get_state()

template<typename T >
virtual const T & esphome::StatefulEntityBase< T >::get_state ( ) const
pure virtual

Return the current state value. Only valid when has_state() is true.

Implemented in esphome::binary_sensor::BinarySensor.

◆ get_state_default()

template<typename T >
T esphome::StatefulEntityBase< T >::get_state_default ( T default_value) const
inline

Return the current state if available, otherwise return the provided default.

Definition at line 327 of file entity_base.h.

◆ get_trigger_on_initial_state()

template<typename T >
virtual bool esphome::StatefulEntityBase< T >::get_trigger_on_initial_state ( ) const
protectedpure virtual

Subclasses return whether callbacks should fire on the very first state.

Implemented in esphome::binary_sensor::BinarySensor.

◆ invalidate_state()

template<typename T >
void esphome::StatefulEntityBase< T >::invalidate_state ( )
inline

Clear the state — sets has_state() to false and fires callbacks with nullopt.

Definition at line 329 of file entity_base.h.

◆ set_new_state()

template<typename T >
virtual bool esphome::StatefulEntityBase< T >::set_new_state ( const optional< T > & new_state)
inlineprotectedvirtual

Apply a new state, de-duplicating and firing callbacks as needed.

Pass nullopt to invalidate (clear) the state. Pass a value to set it. Returns true if the state actually changed, false if it was the same. Subclasses may override to add logging/notifications after calling the base.

Reimplemented in esphome::binary_sensor::BinarySensor.

Definition at line 348 of file entity_base.h.

◆ set_state_value()

template<typename T >
virtual void esphome::StatefulEntityBase< T >::set_state_value ( const T & value)
protectedpure virtual

Subclasses implement this to store the actual value into their own storage.

Implemented in esphome::binary_sensor::BinarySensor.

Field Documentation

◆ full_state_callbacks_

template<typename T >
LazyCallbackManager<void(optional<T> previous, optional<T> current)> esphome::StatefulEntityBase< T >::full_state_callbacks_
protected

Definition at line 378 of file entity_base.h.

◆ state_callbacks_

template<typename T >
LazyCallbackManager<void(T)> esphome::StatefulEntityBase< T >::state_callbacks_
protected

Definition at line 379 of file entity_base.h.


The documentation for this class was generated from the following file: