Naming of devices, channels, and data points¶
This is a description how naming is handled in AIO Homematic, there are additional rules applied for HA entities and devices.
This document explains how human‑readable names are constructed for devices, channels, data points (including events and custom data points), and when unique IDs are used as a fallback.
The logic lives primarily in aiohomematic/model/support.py and relies on names stored in the CCU (device and channel names) plus some auto‑generation helpers when no explicit names are available.
Terminology¶
For a complete terminology reference, see the Glossary.
- Device: The physical device (e.g., HmIP‑BROLL) identified by a device address (e.g.,
000A1B2C3D4E00). - Channel: A sub‑unit of a device identified by a channel address (e.g.,
000A1B2C3D4E00:1). Channels may have a user‑editable name in the CCU. - Data point: A parameter on a channel (e.g.,
LEVEL,STATE). These become entities in upper layers. - Address separator:
:used between device address and channel number.
Device names¶
Function: get_device_name(central, device_address, model)
- If a custom name was set in the CCU for the device address, that name is used.
- Otherwise, an auto‑generated name is returned:
<model>_<device_address>.
Examples:
- CCU has a name:
"Livingroom Blind Controller"→ returned as is. - No CCU name: model
HmIP‑BROLL, address000A1B2C3D4E00→HmIP‑BROLL_000A1B2C3D4E00.
Channel names¶
Helpers: get_channel_name_data(channel) and _get_base_name_from_channel_or_device(channel)
- If the channel has a custom name in the CCU and it differs from the default (
"<model> <channel_address>"), that CCU channel name is used. - Otherwise a base name is derived from the device name:
- If the channel has a channel number (
channel.nonotNone), the base becomes<device_name>:<channel_no>. - If there is no channel number, the base is just
<device_name>.
The returned ChannelNameData contains:
device_name: the resolved device name (see above)channel_name: the channel part without the leading device name duplicatedfull_name:<device_name> <channel_name>(whenchannel_nameis not empty), otherwise justdevice_namesub_device_name: equals the original channel name when present, otherwisedevice_name
Examples:
- CCU channel name:
"Livingroom Blind Controller:1"→device_name="Livingroom Blind Controller",channel_name=":1",full_name="Livingroom Blind Controller :1". - No CCU channel name: device name
HmIP‑BROLL_...and channel 1 → baseHmIP‑BROLL_...:1, which yields the same fields as above.
Note about channel number detection:
_check_channel_name_with_channel_no(name)returns true when the name contains exactly one:and the part after:converts to an integer.
Data point names (regular)¶
Function: get_data_point_name_data(channel, parameter) Steps:
- Resolve a
channel_namevia_get_base_name_from_channel_or_deviceas described above. If there is none, we cannot construct a human‑readable name and fall back to unique IDs elsewhere. - Build a human‑friendly parameter name:
parameter.title().replace("_", " ")(e.g.,LEVEL→Level,WINDOW_STATE→Window State). - If the channel name includes a numeric channel suffix (
<something>:<int>): - Use the part before
:as the channel base (c_name). - When the same parameter exists on multiple channels of the device, append a channel marker to the parameter:
" ch<channel_no>"(omitted for channel 0 orNone). Determination usescentral.paramset_descriptions.is_in_multiple_channels(...). - Example full name:
<device_name> <c_name> <Parameter>[ chX]. - Otherwise, use the entire channel name plus parameter.
DataPointNameData contains:
device_name,channel_name,parameter_nameand a computednamewhich is the channel+parameter without repeating the device name at the front.full_nameis<device_name> <name>.
Examples:
- Channel name
"Livingroom Blind Controller:1", parameterLEVEL→name="Livingroom Blind Controller Level ch1",full_name="Livingroom Blind Controller Livingroom Blind Controller Level ch1"after de‑duplication yields"Livingroom Blind Controller Level ch1". - Channel name
"Window Contact", parameterSTATE→name="Window Contact State".
Event names¶
Function: get_event_name(channel, parameter)
- Similar to
get_data_point_name_data, but when a numeric channel suffix is present, the channel part in the name becomes just" ch<channel_no>"(or empty for channel 0/None), followed by the human‑friendly parameter name. - Otherwise the full channel name plus parameter is used.
Custom data point names¶
Function: get_custom_data_point_name(channel, is_only_primary_channel, ignore_multiple_channels_for_name, usage, postfix="")
- If a numeric channel suffix is present and either the current channel is the only primary channel or multiple channels should be ignored for naming, the name uses the channel base (before
:) and appends the providedpostfixas the parameter name. - If a numeric channel suffix is present and the above condition is not met, the name uses the channel base and a generated parameter marker:
"ch<no>"forDataPointUsage.CDP_PRIMARY"vch<no>"for others- Otherwise, if there is no numeric channel suffix, the channel name alone is used.
Hub data point names¶
Function: get_hub_data_point_name_data(channel_or_none, legacy_name, central_name)
- If no channel is supplied, the full name becomes
<central_name> <legacy_name>. - If a channel is supplied, the legacy name is cleaned (removing address/id parts) and used together with the resolved channel name, again trimming
:<no>when present.
Fallback to unique IDs¶
When a readable name cannot be constructed (e.g., no device/channel name information is present), the code logs a debug message and the UI is expected to use a unique ID instead. Unique IDs are built by:
generate_unique_id(central, address, parameter=None, prefix=None)for data points.generate_channel_unique_id(central, address)for channels.
Rules for IDs:
:and-are replaced with_.- Optional
parameterandprefixare appended with underscore separators. - For CCU‑internal addresses (
PROGRAM,SYSVAR,INT000..., or virtual remote addresses), the central ID is prepended to ensure global uniqueness. - IDs are always returned in lowercase.
Worked examples¶
Below are end-to-end examples showing inputs (model, addresses, CCU names, channel numbers, parameters) and the produced names.
-
Device names
-
Input: model
HmIP-BROLL, address000A1B2C3D4E00, CCU device name = "Livingroom Blind Controller" - Output device_name:
Livingroom Blind Controller - Fallback, if device name is not readable:
-
Input: model
HmIP-BROLL, address000A1B2C3D4E00, CCU device name = none- Output device_name:
HmIP-BROLL_000A1B2C3D4E00
- Output device_name:
-
Channel names
-
Input: device_name
HmIP-SWDO_00112233445566, channel address...:0, CCU channel name = default ("HmIP-SWDO ...:0") - Base:
HmIP-SWDO_00112233445566:0 - ChannelNameData.full_name:
HmIP-SWDO_00112233445566 :0 - Input: CCU channel name explicitly set to
"Window Contact"(no ":") - ChannelNameData:
- device_name:
<resolved device name> - channel_name:
Window Contact - full_name:
<device_name> Window Contact
- device_name:
- Fallback, if channel name is not readable:
-
Input: device_name
Livingroom Blind Controller, channel address...:1, CCU channel name = none- Base:
Livingroom Blind Controller:1 - ChannelNameData:
- device_name:
Livingroom Blind Controller - channel_name:
:1 - full_name:
Livingroom Blind Controller :1 - sub_device_name:
Livingroom Blind Controller:1
- Base:
-
Data point names (regular)
-
Input: channel base
Window Contact(no ":"), parameter WINDOW_STATE - Parameter friendly:
Window State - DataPointNameData.name:
Window Contact Window State - full_name:
<device_name> Window Contact Window State - Input: channel base
HmIP-WTH-2_ABCDEF01234567:0, parameter present only on channel 0 - Because parameter is not in multiple channels, no
ch0is appended; name will be based on base without suffix logic. - Input: channel base
Livingroom Blind Controller:1, parameterLEVEL, parameter appears on multiple channels - Parameter friendly:
Level - ch marker:
ch1 -
DataPointNameData:
- name:
Livingroom Blind Controller Level ch1 - full_name:
Livingroom Blind Controller Livingroom Blind Controller Level ch1→ effectively shown asLivingroom Blind Controller Level ch1
- name:
-
Event names
-
Input: channel base
HmIP-WGC_99887766554433:2, parameterMOTION - Event friendly parameter:
Motion - Numeric suffix present → channel part becomes
ch2 - DataPointNameData.name:
ch2 Motion - full_name:
<device_name> ch2 Motion - Input: channel base
Doorbell(custom channel name), parameterPRESS - DataPointNameData.name:
Doorbell Press -
full_name:
<device_name> Doorbell Press -
Custom data point names
-
Input: channel base
Kitchen Light:3, usage =CDP_PRIMARY, only_primary_channel = false, ignore_multiple_channels_for_name = false - Numeric suffix present → use base
Kitchen Lightand parameter markerch3 - DataPointNameData.name:
Kitchen Light ch3 - full_name:
<device_name> Kitchen Light ch3 - Input: channel base
Kitchen Light:3, usage =CDP_SECONDARY(not primary), only_primary_channel = false - Marker becomes
vch3 - full_name:
<device_name> Kitchen Light vch3 - Input: channel base
Kitchen Light:3, only_primary_channel = true, postfix =Brightness -
Name uses base and postfix: DataPointNameData.name:
Kitchen Light Brightness -
Hub data point names
-
Input: no channel, central_name
CCU-Main, legacy_nameprogram_trigger - HubNameData.full_name:
CCU-Main program_trigger - Input: channel base
System:0, legacy_nameINT0001_PROGRAM_STATE_ABC(contains address/id fragments) - Cleaned legacy name:
PROGRAM STATE ABC - Numeric suffix trimmed from channel → channel_name becomes
System -
HubNameData.full_name:
System PROGRAM STATE ABC -
Unique ID fallbacks
-
Input: address
ABCDEF12345678:4, parameterLEVEL - generate_unique_id →
abcdef12345678_4_level - Input: address
PROGRAM, parameterSTATE, central_idccu-main - generate_unique_id →
ccu-main_program_state - Input: virtual remote address
BidCos-RF:1, central_idccu-main - generate_channel_unique_id →
ccu-main_bidcos_rf_1
Where to find the code¶
- Main implementation:
aiohomematic/model/support.py - Device name:
get_device_name - Channel names:
get_channel_name_data,_get_base_name_from_channel_or_device,_check_channel_name_with_channel_no - Data point names:
get_data_point_name_data,get_event_name,get_custom_data_point_name,get_hub_data_point_name_data - Unique IDs:
generate_unique_id,generate_channel_unique_id