Custom Data Mapping (Account Info Mapping)
This document is the reference for the Account Info Mapping (Custom Parameters Mapping) on the ACS.
The mapping links the values of device parameters (read from the configured parameter paths) to columns of the cust_device1 table (typically cust1 .. cust20) shown in the device list view, with optional per-manufacturer/model scoping and active-connection-relative parameter resolution.
|
Since 2026-06 the mapping is owned by ft-configs-service and delivered to the ACS as a read-only Hazelcast snapshot.
The ACS no longer maintains a local |
1. Overview
Each mapping entry links one custom column to one or more device parameter paths. Several parameters may be listed under one column (e.g. one per data model or per vendor), but only one of them is expected to exist on a given device — its value is the one written to the column. When a device communicates with the ACS (TR-069 Inform, GetParameterValues response, USP notification/registration, MQTT publish), the ACS:
-
Resolves the mapped parameter paths for the device (taking
activeConnectioninto account). -
Subscribes to value changes of the resolved parameters (active notification); when subscriptions are (re)applied, a
GetParameterValueListtask is also queued to refresh the values from the device (see Processing Flow). -
Stores the parameter values into the mapped columns of the
cust_device1table, keyed by device serial number.
The cust_device1 values themselves remain owned by, and stored in, the ACS database — only the mapping definitions moved to ft-configs-service.
2. Ownership and Distribution
| Legacy (until 2026-06) | Current | |
|---|---|---|
Source of truth |
ACS database ( |
ft-configs-service database, managed via its REST API (with dry-run import and audit trail) |
Distribution to the ACS |
local XML file regenerated from the ACS DB; cluster sync via the Hazelcast topic |
ft-configs-service publishes a snapshot to the Hazelcast |
ACS write path |
ACS edited the file → synced to its DB → broadcast to the cluster |
none — the ACS is a pure consumer |
Per-node runtime model |
|
an in-memory near-cache rebuilt from the snapshot, indexed by manufacturer/model (plus a global bucket) — O(1) hot-path lookup, no per-session DB query for mappings |
Distribution details:
-
The
config-custom-dataIListholds a single element — the current snapshot. ft-configs-service replaces it in place (atomicset(0, …), never leaving the list empty), and the ACS reacts to the republish. -
The publish happens after the ft-configs-service write transaction commits, so the ACS only ever observes committed state.
-
An empty snapshot (no entries) is a valid state meaning "no mappings — feature disabled"; it is distinct from a missing snapshot (see Availability and Reaction to Changes).
|
The legacy local file ( |
3. Availability and Reaction to Changes
3.1. Startup autonomy
If the snapshot is missing or the Hazelcast cluster is unavailable at startup, the ACS does not fail and does not block readiness:
-
it keeps the last-known near-cache if one is available, otherwise starts with no mappings;
-
it catches up automatically when the snapshot appears (via the cache listener);
-
the degraded state is logged.
An empty snapshot (entries=[]) is a normal "disabled" state, not a degradation.
3.2. Reacting to a snapshot change
When the snapshot changes, every ACS node atomically rebuilds its local near-cache (no empty window).
Device-subscription reconciliation — turning the value-change notification off (notification value 0) for mappings that were removed — is performed by exactly one cluster node (single-owner, gated by a Hazelcast distributed lock), off the cache-event thread, by diffing the new snapshot against the cluster-authoritative previous snapshot.
Enabling notifications for added or changed mappings is not done eagerly here — it happens lazily on the affected devices' next session (see Processing Flow).
The reconciliation is idempotent and survives node restart and snapshot republish.
4. Mapping Model
A mapping is a list of column entries. Each entry targets one cust_device1 column and carries one or more parameter mappings. (These were previously the <data> and <param> elements of the local XML file; the fields are unchanged.)
4.1. Column entry
| Field | Type | Required | Description |
|---|---|---|---|
|
string |
Yes |
Target column of the |
|
string |
No |
Human-readable column title shown in the device list view (e.g. |
A column entry contains one or more parameter mappings. Multiple parameters under one column typically cover different data models (TR-098 vs TR-181) or different manufacturer/model variants. Only one of the listed parameters is expected to exist on any given device — that parameter’s value fills the column.
4.2. Parameter mapping
| Field | Type | Required | Description |
|---|---|---|---|
|
string |
Yes |
Device parameter path. Interpreted as an absolute path when |
|
boolean |
Yes |
Controls how |
|
string |
No |
Restricts the mapping to devices of this manufacturer. Empty/absent = all manufacturers. Matched case-insensitively. |
|
string |
No |
Restricts the mapping to devices of this model. Empty/absent = all models. May be combined with |
|
string |
No |
Reserved. Carried in the snapshot but not evaluated at runtime. |
|
A column entry with no parameter mappings removes all parameter mappings for that column (the column title may be kept because it can still be referenced by the UI). Removing all entries (empty snapshot) removes all mappings: previously created value-change subscriptions are turned off on affected devices (see Reacting to a snapshot change). |
5. The activeConnection Attribute
Many account-related parameters (WAN username, WAN MAC address, external IP) live under a WAN connection instance whose index differs from device to device, for example:
InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Username InternetGatewayDevice.WANDevice.2.WANConnectionDevice.1.WANIPConnection.1.Username
The instance numbers in these paths are different on different devices, so it is impossible to write one fixed path that works for every device.
The activeConnection attribute solves this: the ACS tracks, per device, which WAN connection object is currently active, and resolves the mapped parameter relative to it.
5.1. Path resolution
activeConnection=false-
The
nameattribute is used as-is — a complete, absolute parameter path (e.g.Device.ManagementServer.PeriodicInformInterval). activeConnection=true-
The
nameattribute is a relative suffix. At processing time the ACS prepends the device’s active connection object path to it:full path = <active connection object> + name
For example, with
name="Username"and the active connection object resolved asInternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1., the resolved path is:InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.Username
|
If Account mapping parameter: <name> has activeConn=true but activeConn undefined for cpe: <serial> The mapping is applied automatically on a later session once the active connection has been resolved (see below). |
5.2. How the active connection object is determined
The active connection is (re)evaluated on every TR-069 Inform and on every GetParameterValuesResponse received from the device:
-
The ACS reads the device’s
ConnectionRequestURLvalue (theInternetGatewayDevice.ManagementServer.ConnectionRequestURLorDevice.ManagementServer.ConnectionRequestURLvariant, depending on the data model) and extracts the IP address from it. -
The parameters reported in the current message are scanned for a parameter that:
-
contains
IPAddressin its name, and -
has a non-empty value containing that IP address, and
-
belongs to a WAN/IP interface subtree:
-
TR-098 (gateway): path starts with
InternetGatewayDevice.WANDevice. -
TR-181: path starts with
Device.IP.Interface.orDevice.WANDevice.
-
-
-
The parent object of the matched parameter (the path up to and including the last instance, e.g.
InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANPPPConnection.1.) becomes the device’s active connection object. -
If the result differs from the previously stored value, it is persisted on the device record (
active_conn_name_idcolumn of thecpetable) and the following is logged:Updating active connection for cpe: <serial> object: <path>
In other words: the active connection is the WAN interface whose IP address the ACS uses to reach the device for connection requests.
5.3. Behavior when the active connection changes
Mappings with activeConnection=true follow the device:
-
When the active connection object changes (e.g. the device fails over from PPP to IP WAN, or the instance index changes after a reboot), the next processing cycle:
-
subscribes to value changes (active notification, value
2) on the parameter resolved under the new active connection object, and -
cancels the subscription (notification value
0) on the parameter resolved under the previous active connection object.
-
-
The current value under the new path is then fetched and written to the mapped
custcolumn, so the column always reflects the active interface.
Mappings with activeConnection=false are unaffected by active-connection changes.
5.4. Behavior on mapping removal
When a parameter mapping with activeConnection=true is removed (or its manufacturer/model scope changes so that devices fall out of scope), the ACS resolves the per-device full path using each affected device’s stored active connection object and turns the value-change notification off for it.
For activeConnection=false mappings the same absolute path is used for all affected devices.
This off-reconciliation runs when the snapshot change is applied (see Reacting to a snapshot change), not on a device session.
6. Processing Flow
The mapping is evaluated when the ACS receives device data, across all supported protocols:
| Protocol | Trigger |
|---|---|
TR-069 (CWMP) |
Inform; GetParameterValues response (asynchronous, time-boxed at 15 s per device) |
USP (TR-369) |
Device registration; Get task response; notifications |
MQTT |
Published device data |
For a device session the flow is:
-
The mapping list applicable to the device’s manufacturer/model is loaded from the node’s in-memory near-cache (global mappings plus any scoped to the device’s manufacturer and/or model). No database query is issued for the mappings.
-
Each parameter is resolved to a full path (see Path resolution); unresolvable entries are skipped.
-
The resolved path must match the device’s data model root (
InternetGatewayDevice.,Device.orRoot.); mismatching entries are ignored for the device. -
For new devices, re-bootstrapped devices, devices whose active connection just changed, or after a mapping change has been applied to this node, the ACS:
-
enables active value-change notification (value
2) on the resolved parameters, and -
queues a
GetParameterValueListpending task for the device to refresh the current values (skipped for LWM2M devices).
-
-
The column values are merged into the mapped columns of the
cust_device1table by device serial number, taken from (in order of availability):-
the parameter values reported by the device in the current session (Inform / GPV response / USP notification / MQTT publish),
-
the values already stored in the
cpe_parametertable (merged immediately when subscriptions are applied to an already-known device), -
the response to the queued
GetParameterValueListtask, which is processed through the same flow when the device replies.
-
-
Since only one of the mapped parameters is expected to exist on a device, normally exactly one value is available per column; if more than one resolves, the first non-empty value wins.
|
The |
7. Troubleshooting
| Symptom / log message | Cause / action |
|---|---|
|
The device’s active connection object has not been resolved yet. Verify the device reports a WAN/IP |
|
Informational — the active connection object was (re)detected for the device. |
Custom column stays empty for some devices |
Check |
|
The ACS could not read the snapshot (Hazelcast unavailable, or ft-configs-service has not published yet). The node keeps its last-known mappings and recovers automatically when the snapshot appears. Verify Hazelcast connectivity and that ft-configs-service has published the |
Custom columns empty on all devices, no mappings active |
The published snapshot is empty ( |
8. Implementation Reference
| Class | Responsibility |
|---|---|
|
Consumes the |
|
Immutable per-node read model indexed by manufacturer/model (plus a global bucket); the holder publishes the current near-cache via an atomic swap |
|
Single-owner reconciliation on snapshot change: turns value-change notifications off for removed mappings (diff against the cluster-authoritative previous snapshot) |
|
Runtime evaluation: path resolution (including |
|
Active connection object detection from Inform / GPV response parameters |
|
The legacy |
9. Related Pages
-
Custom Parameters Mapping — database schema (
config_custom_data,config_custom_param; deprecated, retained until the tables are dropped) -
Configuration Guide — all ACS configuration files
-
Database — table reference