Skip to content

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, address 000A1B2C3D4E00HmIP-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.no not None), 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 duplicated
  • full_name: <device_name> <channel_name> (when channel_name is not empty), otherwise just device_name
  • sub_device_name: equals the original channel name when present, otherwise device_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 → base HmIP-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:

  1. Resolve a channel_name via _get_base_name_from_channel_or_device as described above. If there is none, we cannot construct a human-readable name and fall back to unique IDs elsewhere.
  2. Build a human-friendly parameter name: parameter.title().replace("_", " ") (e.g., LEVELLevel, WINDOW_STATEWindow State).
  3. If the channel name includes a numeric channel suffix (<something>:<int>):
  4. Use the part before : as the channel base (c_name).
  5. 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 or None). Determination uses central.paramset_descriptions.is_in_multiple_channels(...).
  6. Example full name: <device_name> <c_name> <Parameter>[ chX].
  7. Otherwise, use the entire channel name plus parameter.

DataPointNameData contains:

  • device_name, channel_name, parameter_name and a computed name which is the channel+parameter without repeating the device name at the front. full_name is <device_name> <name>.

Examples:

  • Channel name "Livingroom Blind Controller:1", parameter LEVELname="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", parameter STATEname="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 provided postfix as 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>" for DataPointUsage.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 parameter and prefix are 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.

  1. Device names

  2. Input: model HmIP-BROLL, address 000A1B2C3D4E00, CCU device name = "Livingroom Blind Controller"

  3. Output device_name: Livingroom Blind Controller
  4. Fallback, if device name is not readable:
  5. Input: model HmIP-BROLL, address 000A1B2C3D4E00, CCU device name = none

    • Output device_name: HmIP-BROLL_000A1B2C3D4E00
  6. Channel names

  7. Input: device_name HmIP-SWDO_00112233445566, channel address ...:0, CCU channel name = default ("HmIP-SWDO ...:0")

  8. Base: HmIP-SWDO_00112233445566:0
  9. ChannelNameData.full_name: HmIP-SWDO_00112233445566 :0
  10. Input: CCU channel name explicitly set to "Window Contact" (no ":")
  11. ChannelNameData:
    • device_name: <resolved device name>
    • channel_name: Window Contact
    • full_name: <device_name> Window Contact
  12. Fallback, if channel name is not readable:
  13. 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
  14. Data point names (regular)

  15. Input: channel base Window Contact (no ":"), parameter WINDOW_STATE

  16. Parameter friendly: Window State
  17. DataPointNameData.name: Window Contact Window State
  18. full_name: <device_name> Window Contact Window State
  19. Input: channel base HmIP-WTH-2_ABCDEF01234567:0, parameter present only on channel 0
  20. Because parameter is not in multiple channels, no ch0 is appended; name will be based on base without suffix logic.
  21. Input: channel base Livingroom Blind Controller:1, parameter LEVEL, parameter appears on multiple channels
  22. Parameter friendly: Level
  23. ch marker: ch1
  24. DataPointNameData:

    • name: Livingroom Blind Controller Level ch1
    • full_name: Livingroom Blind Controller Livingroom Blind Controller Level ch1 → effectively shown as Livingroom Blind Controller Level ch1
  25. Event names

  26. Input: channel base HmIP-WGC_99887766554433:2, parameter MOTION

  27. Event friendly parameter: Motion
  28. Numeric suffix present → channel part becomes ch2
  29. DataPointNameData.name: ch2 Motion
  30. full_name: <device_name> ch2 Motion
  31. Input: channel base Doorbell (custom channel name), parameter PRESS
  32. DataPointNameData.name: Doorbell Press
  33. full_name: <device_name> Doorbell Press

  34. Custom data point names

  35. Input: channel base Kitchen Light:3, usage = CDP_PRIMARY, only_primary_channel = false, ignore_multiple_channels_for_name = false

  36. Numeric suffix present → use base Kitchen Light and parameter marker ch3
  37. DataPointNameData.name: Kitchen Light ch3
  38. full_name: <device_name> Kitchen Light ch3
  39. Input: channel base Kitchen Light:3, usage = CDP_SECONDARY (not primary), only_primary_channel = false
  40. Marker becomes vch3
  41. full_name: <device_name> Kitchen Light vch3
  42. Input: channel base Kitchen Light:3, only_primary_channel = true, postfix = Brightness
  43. Name uses base and postfix: DataPointNameData.name: Kitchen Light Brightness

  44. Hub data point names

  45. Input: no channel, central_name CCU-Main, legacy_name program_trigger

  46. HubNameData.full_name: CCU-Main program_trigger
  47. Input: channel base System:0, legacy_name INT0001_PROGRAM_STATE_ABC (contains address/id fragments)
  48. Cleaned legacy name: PROGRAM STATE ABC
  49. Numeric suffix trimmed from channel → channel_name becomes System
  50. HubNameData.full_name: System PROGRAM STATE ABC

  51. Unique ID fallbacks

  52. Input: address ABCDEF12345678:4, parameter LEVEL

  53. generate_unique_id → abcdef12345678_4_level
  54. Input: address PROGRAM, parameter STATE, central_id ccu-main
  55. generate_unique_id → ccu-main_program_state
  56. Input: virtual remote address BidCos-RF:1, central_id ccu-main
  57. 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