Skip to content

Migrate from get_object_id_hash() to make_entity_preference() for preferences #201

@bdraco

Description

@bdraco

Summary

ESPHome has added a new make_entity_preference<T>() helper on EntityBase (PR #13505) that encapsulates preference creation and will handle automatic preference migration when the hash algorithm is updated to fix collisions.

This component uses get_object_id_hash() for preference keys, which is the old API that predates even get_preference_hash() (which added device-awareness to avoid collisions across devices). Components using get_object_id_hash() directly are vulnerable to hash collisions when different entity names sanitize to the same string (e.g. "Living Room" and "living_room" both become "living_room"), and will not participate in automatic preference migration.

Current usage

In components/aux_ac/aux_ac.h:

ESPPreferenceObject storage = global_preferences->make_preference<ac_save_command_t[POS_MODE_OFF + 1]>(this->get_object_id_hash(), true);

Recommended migration

// Before:
ESPPreferenceObject storage = global_preferences->make_preference<ac_save_command_t[POS_MODE_OFF + 1]>(this->get_object_id_hash(), true);

// After:
ESPPreferenceObject storage = this->make_entity_preference<ac_save_command_t[POS_MODE_OFF + 1]>();

Note: if the second parameter true was being used for a specific purpose (e.g. the in_flash flag), check if make_entity_preference handles that or if additional adjustments are needed.

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions