Commit Graph
26515 Commits
Author SHA1 Message Date
J. Nick Koston 5e3d1f8de2 Merge branch 'dev' into binary-sensor-remove-optional-state 2026-03-22 17:09:40 -10:00
Jesse Hills 7ecdf6db2e Merge pull request #15084 from esphome/bump-2026.3.1
2026.3.1
2026.3.1
2026-03-23 16:09:32 +13:00
J. Nick Koston 8a3b5a8def [core] Fix placement new storage name for templated types (#15096) 2026-03-23 16:09:23 +13:00
J. Nick Koston 65f02ac690 Merge remote-tracking branch 'upstream/fix-pstorage-template-namespace' into binary-sensor-remove-optional-state 2026-03-22 16:59:09 -10:00
J. Nick Koston 6c95f2e706 [core] Fix placement new storage name for templated types
When Pvariable types contain template arguments with :: (e.g.
Automation<std::optional<bool>>), the namespace extraction logic
incorrectly split on :: inside the template params, producing
invalid C++ identifiers like Automation<std__automation_id__pstorage.

Fix by stripping template arguments before extracting the namespace.
Extract the logic into a testable _extract_component_ns helper.
2026-03-22 16:56:35 -10:00
J. Nick Koston 9578376f46 [sensor] Remove USE_SENSOR_FILTER guard from SensorRawStateTrigger
add_on_raw_state_callback is always available now (delegates to
callback_ without filters). SensorRawStateTrigger doesn't need
the guard, and on_raw_value doesn't need to set USE_SENSOR_FILTER.

Without filters raw == filtered, so the trigger fires with the
correct value either way — no wasted RAM on filter infrastructure.
2026-03-22 16:51:01 -10:00
J. Nick Koston 30b5c3fb71 [sensor] Keep add_on_raw_state_callback always available
Delegate to callback_ when USE_SENSOR_FILTER is off since raw state
equals filtered state without filters. This avoids requiring external
components to know about USE_SENSOR_FILTER.
2026-03-22 16:49:20 -10:00
J. Nick Koston 9291b71176 [binary_sensor] Move set_trigger_on_initial_state off StatefulEntityBase
set_trigger_on_initial_state is only called from codegen on concrete
BinarySensor instances. It's an implementation detail of BinarySensor,
not part of the StatefulEntityBase contract. Only get_trigger_on_initial_state
remains as a pure virtual — subclasses decide how to control it.
2026-03-22 16:45:00 -10:00
J. Nick Koston 8aa9a82c13 [binary_sensor] Clarify trigger_on_initial_state docs - subclass decides storage 2026-03-22 16:43:37 -10:00
J. Nick Koston a6e230d665 [binary_sensor] Restore comment about USE_BINARY_SENSOR guard 2026-03-22 16:40:47 -10:00
J. Nick Koston 1a8cbe92ff [binary_sensor] Update StatefulEntityBase docs to reflect virtual dispatch design 2026-03-22 16:39:28 -10:00
J. Nick Koston 3fd28eeea2 [binary_sensor] Inline send_state_internal - virtual dispatch prevents template bloat 2026-03-22 16:38:38 -10:00
J. Nick Koston 0417de007a [binary_sensor] Restore virtual set_new_state, remove on_state_changed hook
Making set_new_state virtual means callers like send_state_internal
and invalidate_state resolve via vtable dispatch to the .cpp, avoiding
template bloat without needing out-of-line tricks or hiding declarations.

BinarySensor overrides set_new_state directly for logging and
ControllerRegistry notification, matching the original pattern.
2026-03-22 16:37:54 -10:00
J. Nick Koston 27d38baf0d [binary_sensor] Fix invalidate_state: keep inline on base, hide on BinarySensor
invalidate_state() can't be declaration-only on a template class.
Keep it inline on StatefulEntityBase, and add a hiding declaration
on BinarySensor with an out-of-line definition in the .cpp to prevent
template bloat from automation.h and filter.cpp callers.
2026-03-22 16:36:17 -10:00
J. Nick Koston df733708d5 Merge branch 'dev' into binary-sensor-remove-optional-state 2026-03-22 16:33:32 -10:00
J. Nick Koston a827410ecf [binary_sensor] Fix clang-tidy naming: no trailing underscore on virtual methods
- set_new_state → set_new_state_ (protected non-virtual, trailing underscore)
- on_state_changed_ → on_state_changed (virtual, no trailing underscore)
- set_state_value_ → set_state_value (virtual, no trailing underscore)

Update StatefulEntityBase docs to list on_state_changed and invalidate_state.
2026-03-22 16:27:34 -10:00
J. Nick Koston 98d9fd76b3 [mqtt] Fix const-correctness for trigger constructors (#15093) 2026-03-22 16:27:20 -10:00
J. Nick Koston 6992219e34 [core] Attribute placement new storage symbols to components (#15092) 2026-03-22 16:27:07 -10:00
J. Nick Koston 349f45f582 [binary_sensor] Move send_state_internal and invalidate_state to .cpp
set_new_state is a template method (~189 bytes when instantiated).
Inlining callers like send_state_internal and invalidate_state causes
the template code to be duplicated at every call site (publish_state,
Filter::output, BinarySensorInvalidateAction::play, etc.), adding
~384 bytes of flash.

Keep these as out-of-line definitions in the .cpp so the template
is instantiated once.
2026-03-22 16:26:16 -10:00
J. Nick Koston 58498bacff [binary_sensor] Skip old_state construction when no full_state_callbacks registered 2026-03-22 16:21:25 -10:00
J. Nick Koston 14c54597ce [binary_sensor] Make set_new_state non-virtual, add on_state_changed_ hook
set_new_state is only called internally. Making it non-virtual
eliminates a vtable entry and allows the compiler to inline it.

BinarySensor now overrides on_state_changed_() for logging and
ControllerRegistry notification instead of overriding set_new_state.
2026-03-22 16:20:29 -10:00
J. Nick Koston 5a44d4f14d Merge branch 'binary-sensor-remove-optional-state' into integration 2026-03-22 16:18:17 -10:00
J. Nick Koston 5854fa1d82 [binary_sensor] Access flags_ directly in set_new_state to reduce flash 2026-03-22 16:17:35 -10:00
J. Nick Koston e28c9d191c [binary_sensor] Move send_state_internal to header for devirtualization 2026-03-22 16:16:59 -10:00
J. Nick Koston 2833401cc1 [binary_sensor] Simplify else-if in set_new_state 2026-03-22 16:15:24 -10:00
J. Nick Koston 1e2c5fbc4e [binary_sensor] Update state before firing callbacks in set_new_state
Move set_has_state and set_state_value_ before callback invocations
so callback code can inspect the entity's current state via
get_state()/has_state(). The old state is passed as a parameter.

Addresses Copilot review feedback.
2026-03-22 16:13:35 -10:00
J. Nick Koston db3cfaa3fc [binary_sensor] Reduce flash: un-inline send_state_internal, optimize set_new_state
Move send_state_internal back to .cpp to avoid duplicating it at each
call site (publish_state and Filter::output).

Optimize set_new_state to compare has_state + value directly instead
of constructing optional<T> on stack for the comparison. Optionals
are only constructed in the changed path for callbacks that need them.
2026-03-22 16:11:06 -10:00
J. Nick Koston fc1186895c [binary_sensor] Fix stale comment in StatefulEntityBase docs 2026-03-22 16:03:44 -10:00
J. Nick Koston 047a744ed3 [binary_sensor] Inline send_state_internal into header 2026-03-22 16:02:51 -10:00
J. Nick Koston e406fb25cb [binary_sensor] Move trigger_on_initial_state out of EntityBase flags into BinarySensor
Use pure virtual get/set methods on StatefulEntityBase instead of
storing the flag in EntityBase::flags_. This keeps EntityBase clean
and avoids mixing binary_sensor-specific state into the base entity.
2026-03-22 16:01:39 -10:00
J. Nick Koston 98b0aea6bf [binary_sensor] Restore comment on state member 2026-03-22 16:00:07 -10:00
J. Nick Koston 7754e517f2 [binary_sensor] Add documentation comments to StatefulEntityBase 2026-03-22 15:59:33 -10:00
J. Nick Koston 91944988ef [binary_sensor] Remove redundant optional<bool> state_ from StatefulEntityBase
Replace optional<T> state_ in StatefulEntityBase with pure virtual
get_state()/set_state_value_() that subclasses implement. BinarySensor
stores its value in the existing public bool state member and uses
EntityBase::flags_.has_state instead of the optional's discriminant.

Move trigger_on_initial_state_ into EntityBase::flags_ (1 bit from
reserved), eliminating the standalone bool and its padding.

Saves 8 bytes per BinarySensor instance:
- optional<bool> (2B) + padding (2B) = 4B removed
- bool trigger_on_initial_state_ (1B) + padding (3B) = 4B removed
2026-03-22 15:58:31 -10:00
J. Nick Koston c082ba7d64 [sensor] Fix deprecation version to 2026.4.0, removal to 2026.10.0 2026-03-22 15:44:32 -10:00
J. Nick Koston a3a1a8799a [sensor] Deprecate .raw_state, guard raw_callback_ behind USE_SENSOR_FILTER
Deprecate direct access to sensor .raw_state member in favor of
get_raw_state(). This prepares for eventually compiling out raw_state
on builds without sensor filters, saving 4 bytes per sensor instance.

Guard raw_callback_ and add_on_raw_state_callback behind
USE_SENSOR_FILTER, saving 4 bytes per sensor on builds without
filters immediately.

Guard SensorRawStateTrigger behind USE_SENSOR_FILTER and ensure
on_raw_value automation sets USE_SENSOR_FILTER define.

Fix nextion sensor to stop directly writing .raw_state/.state
members - the publish=false path was redundantly setting already-current
values.

Migrate haier hon_climate from .raw_state to get_raw_state().
2026-03-22 15:36:17 -10:00
J. Nick Koston 03c714892e Merge remote-tracking branch 'upstream/dev' into precompute-tag-forced-varint-fields
# Conflicts:
#	esphome/components/api/proto.h
2026-03-22 15:33:06 -10:00
J. Nick Koston fbe3e7d99c [api] Emit raw tag+value writes for forced fixed32 key fields (#15051) 2026-03-22 15:28:46 -10:00
J. Nick Koston 73c8ac0acc Merge branch 'analyze-memory-pstorage-attribution' into integration 2026-03-22 15:20:09 -10:00
J. Nick Koston 6393190957 Handle esphome:: prefix in type namespace and format top symbols 2026-03-22 15:19:47 -10:00
J. Nick Koston 9cdc17566a [combination] Use FixedVector and parent pointer to enable inline Callback storage (#14947) 2026-03-22 15:06:45 -10:00
J. Nick Koston 20420d0016 Merge remote-tracking branch 'upstream/analyze-memory-pstorage-attribution' into integration 2026-03-22 15:05:20 -10:00
J. Nick Koston 8aeb3c5212 Merge remote-tracking branch 'upstream/dev' into integration 2026-03-22 15:05:18 -10:00
J. Nick Koston 2d10f8abd3 [analyze-memory] Attribute placement new storage symbols to components
Embed component namespace in storage variable names so analyze-memory
can reliably attribute them. Display as "storage for {id}" in reports
and always show regardless of size threshold.
2026-03-22 15:03:36 -10:00
J. Nick Koston 2cdb301fc4 Merge branch 'devirtualize-api-dispatch' into devirtualize-decode 2026-03-22 14:44:52 -10:00
J. Nick Koston 9c1e319aa8 Merge branch 'dev' into devirtualize-api-dispatch 2026-03-22 14:44:31 -10:00
cd05462e9f [core] Use placement new allocation for Pvariables (#15079)
Co-authored-by: J. Nick Koston <nick@home-assistant.io>
Co-authored-by: J. Nick Koston <nick@koston.org>
2026-03-22 14:42:04 -10:00
J. Nick KostonandClaude Opus 4.6 83d02c602a [logger] Fix dummy_main.cpp Logger constructor for clang-tidy (#15088)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 13:25:04 +13:00
J. Nick Koston d60ab8e20f Merge branch 'kamilcuk/use-placement-new' into integration 2026-03-22 14:19:43 -10:00
J. Nick Koston 5b1b285220 Merge branch 'kamilcuk/use-placement-new' of https://github.com/Kamilcuk/esphome into kamilcuk/use-placement-new 2026-03-22 14:19:29 -10:00
J. Nick Koston 2d47c31fbf nits 2026-03-22 14:19:22 -10:00