1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-12 08:12:22 +01:00

handle collisions

This commit is contained in:
J. Nick Koston
2025-06-22 10:01:53 +02:00
parent 57599f7a98
commit bf8d8b6e63

View File

@@ -517,44 +517,44 @@ async def to_code(config: ConfigType) -> None:
# Process devices and areas # Process devices and areas
devices: list[dict[str, str]] devices: list[dict[str, str]]
if devices := config[CONF_DEVICES]: if not (devices := config[CONF_DEVICES]):
# Reserve space for devices return
cg.add(cg.RawStatement(f"App.reserve_device({len(devices)});"))
cg.add_define("USE_DEVICES")
# Process additional areas # Reserve space for devices
areas: list[dict[str, str]] cg.add(cg.RawStatement(f"App.reserve_device({len(devices)});"))
if areas := config[CONF_AREAS]: cg.add_define("USE_DEVICES")
for area_conf in areas:
area_id = area_conf[CONF_ID]
area_ids.add(area_id)
area = cg.new_Pvariable(area_id)
area_id_hash = fnv1a_32bit_hash(area_id)
area_name = area_conf[CONF_NAME]
_verify_no_collisions(area_hashes, area_id, area_id_hash, CONF_AREAS)
cg.add(area.set_area_id(area_id_hash))
cg.add(area.set_name(area_name))
cg.add(cg.App.register_area(area))
# Process devices # Process additional areas
for dev_conf in devices: areas: list[dict[str, str]]
device_id = dev_conf[CONF_ID] if areas := config[CONF_AREAS]:
device_id_hash = fnv1a_32bit_hash(device_id) for area_conf in areas:
device_name = dev_conf[CONF_NAME] area_id = area_conf[CONF_ID]
_verify_no_collisions( area_ids.add(area_id)
device_hashes, device_id, device_id_hash, CONF_DEVICES area = cg.new_Pvariable(area_id)
) area_id_hash = fnv1a_32bit_hash(area_id)
dev = cg.new_Pvariable(device_id) area_name = area_conf[CONF_NAME]
cg.add(dev.set_device_id(device_id_hash)) _verify_no_collisions(area_hashes, area_id, area_id_hash, CONF_AREAS)
cg.add(dev.set_name(device_name)) cg.add(area.set_area_id(area_id_hash))
if CONF_AREA_ID in dev_conf: cg.add(area.set_name(area_name))
# Get the area variable and use its area_id cg.add(cg.App.register_area(area))
area_id = dev_conf[CONF_AREA_ID]
area_id_hash = fnv1a_32bit_hash(area_id) # Process devices
if area_id not in area_ids: for dev_conf in devices:
raise vol.Invalid( device_id = dev_conf[CONF_ID]
f"Device '{device_name}' has an area_id '{area_id}' that does not exist.", device_id_hash = fnv1a_32bit_hash(device_id)
path=[CONF_DEVICES, dev_conf[CONF_ID], CONF_AREA_ID], device_name = dev_conf[CONF_NAME]
) _verify_no_collisions(device_hashes, device_id, device_id_hash, CONF_DEVICES)
cg.add(dev.set_area_id(area_id_hash)) dev = cg.new_Pvariable(device_id)
cg.add(cg.App.register_device(dev)) cg.add(dev.set_device_id(device_id_hash))
cg.add(dev.set_name(device_name))
if CONF_AREA_ID in dev_conf:
# Get the area variable and use its area_id
area_id = dev_conf[CONF_AREA_ID]
area_id_hash = fnv1a_32bit_hash(area_id)
if area_id not in area_ids:
raise vol.Invalid(
f"Device '{device_name}' has an area_id '{area_id}' that does not exist.",
path=[CONF_DEVICES, dev_conf[CONF_ID], CONF_AREA_ID],
)
cg.add(dev.set_area_id(area_id_hash))
cg.add(cg.App.register_device(dev))