Entity Preferences: Use make_entity_preference() Instead of get_preference_hash()
get_preference_hash() is deprecated. Use the new make_entity_preference<T>() method to create preference objects for storing entity state. This prepares for fixing preference hash collisions that cause entities to overwrite each other’s stored data.
This is a breaking change for external components in ESPHome 2026.2.0 and later.
Background
Section titled “Background”PR #13505: Encapsulate entity preference creation to prepare for hash migration
get_preference_hash() uses fnv1_hash on the sanitized object_id, which can collide when different entity names sanitize to the same string:
- “Living Room” and “living_room” both become “living_room”
- UTF-8 names like “温度” and “湿度” both become ”__” (underscores)
This causes entities to overwrite each other’s stored preferences. See backlog#85.
The new make_entity_preference<T>() method centralizes preference creation so that when the hash algorithm is fixed in a future release, migration logic goes in one place instead of 28+ call sites. External components that continue using get_preference_hash() directly will not have their preferences automatically migrated, meaning users will lose saved state (calibration values, restore states, etc.).
What’s Changing
Section titled “What’s Changing”get_preference_hash() is marked ESPDEPRECATED and will be removed in 2027.1.0. A new make_entity_preference<T>() template method on EntityBase replaces the two-step pattern of hashing + creating a preference object:
// Before - two-step pattern (deprecated)this->pref_ = global_preferences->make_preference<float>(this->get_preference_hash());
// After - single callthis->pref_ = this->make_entity_preference<float>();Who This Affects
Section titled “Who This Affects”External components that call get_preference_hash() or get_object_id_hash() and pass the result to global_preferences->make_preference<T>(). This is a common pattern — any component that saves/restores entity state (restore modes, calibration values, last-known values) likely uses it.
Real-world examples of affected external components:
-
Components using
get_preference_hash()directly (example):this->rtc_ = global_preferences->make_preference<RestoreState>(this->get_preference_hash()); -
Components using the even older
get_object_id_hash()(example):ESPPreferenceObject storage = global_preferences->make_preference<MyData>(this->get_object_id_hash(), true);
Standard YAML configurations are not affected.
Migration Guide
Section titled “Migration Guide”Simple case — storing entity state
Section titled “Simple case — storing entity state”// Beforethis->pref_ = global_preferences->make_preference<float>(this->get_preference_hash());
// Afterthis->pref_ = this->make_entity_preference<float>();With a version constant — invalidating old data when struct layout changes
Section titled “With a version constant — invalidating old data when struct layout changes”// Beforethis->rtc_ = global_preferences->make_preference<MyRestoreState>( this->get_preference_hash() ^ RESTORE_STATE_VERSION);
// Afterthis->rtc_ = this->make_entity_preference<MyRestoreState>(RESTORE_STATE_VERSION);The version parameter is XORed with the preference key internally, matching the previous ^ version pattern.
Cross-entity — using another entity’s preference
Section titled “Cross-entity — using another entity’s preference”// Beforethis->pref_ = global_preferences->make_preference<float>( this->some_number_->get_preference_hash());
// Afterthis->pref_ = this->some_number_->make_entity_preference<float>();Using get_object_id_hash() — same collision problem
Section titled “Using get_object_id_hash() — same collision problem”Some older components use get_object_id_hash() instead of get_preference_hash(). This has the same collision issue and should also be migrated:
// Beforethis->pref_ = global_preferences->make_preference<MyData>(this->get_object_id_hash());
// Afterthis->pref_ = this->make_entity_preference<MyData>();Supporting Multiple ESPHome Versions
Section titled “Supporting Multiple ESPHome Versions”#if ESPHOME_VERSION_CODE >= VERSION_CODE(2026, 2, 0)this->pref_ = this->make_entity_preference<float>();#elsethis->pref_ = global_preferences->make_preference<float>(this->get_preference_hash());#endifTimeline
Section titled “Timeline”- ESPHome 2026.2.0 (February 2026):
get_preference_hash()deprecated,make_entity_preference<T>()available - ESPHome 2027.1.0 (January 2027):
get_preference_hash()removed
Finding Code That Needs Updates
Section titled “Finding Code That Needs Updates”# Find get_preference_hash() usagegrep -rn 'get_preference_hash' your_component/
# Find get_object_id_hash() usage (older pattern, same problem)grep -rn 'get_object_id_hash' your_component/
# Find direct make_preference calls (should use make_entity_preference instead)grep -rn 'global_preferences->make_preference' your_component/Questions?
Section titled “Questions?”If you have questions about migrating your external component, please ask in:
- ESPHome Discord - #devs channel
- ESPHome GitHub Discussions
Related Documentation
Section titled “Related Documentation”Copyright © 2026 ESPHome - A project from the Open Home Foundation
Comments
Feel free to leave a comment here to discuss this post with others. You can ask questions, share your experience, or suggest improvements. If you have a question about a specific feature or issue, please consider using the ESPHome Discord. Stick to English and follow ESPHome's code of conduct. These comments exist on a discussion on GitHub, so you can also comment there directly if you prefer.