What one press writes
The DMR Helper button on the project page opens a dialog titled DMR Channel Helper. You pick a network, then the repeaters and the talk groups you want from it, and one press of Generate Channels adds three kinds of row to the open project. Only three — and knowing which three saves a lot of hunting later.
- Channels — one for every (repeater, talk group, timeslot) the network says exists. Each takes the repeater's colour code and the timeslot of that membership, and the frequencies come across inverted: the repeater's transmit frequency becomes the channel's RX, its receive frequency becomes the channel's TX. Held against a network's published table the two columns look swapped, and that is right — you receive what the repeater transmits.
Busy Lock/TX Permitis set toSame Color Code, or toAlwayswhen the repeater's two frequencies are the same. - Talk Groups rows — the codeplug's own contact list — one for each talk group in your selection the project did not already carry.
- Zones, unless you untick
Put the new channels in zones.
Nothing else on a generated channel is filled in, and that catches people out. No RX group, no scan list, no radio ID: a generated channel's DMR RX Group List, Scan Lists and Radio ID are all empty, and nothing on the Settings tab is touched. DMR Mode is left at its default Simplex, on a duplex repeater as much as a simplex one. The network itself is only ever read.
A generation is not a step you can take back. There is no undo (How AesApp WebCPS works), and what it made is ordinary project rows afterwards — removing them means deleting them by hand. A refused generation is a different animal: every refusal returns before anything is written, so nothing is half-done and it is perfectly safe to walk into one and try again.
It is a copy, not a subscription
The helper re-reads the network on every run, so a network owner's edit is live the moment they make it. What never happens is that edit reaching channels you generated last week. Those are plain rows in your project now, with no thread back to where they came from — and an .rdt import, a read from the radio or a conversion to another model cuts even the memory of it.
Regeneration is add-only. It never updates a channel and never deletes one, and — with Rename duplicates automatically left off, as it ships — the whole run is refused if a single channel it would create repeats a name and a pair of frequencies the project already holds. Which is exactly what an unchanged network gives you. With that box ticked the run is accepted instead: every colliding name is renumbered before the check sees it, so the whole batch lands a second time beside the originals. There is no resync mode. It is not hidden behind a plan or a setting; it does not exist.
So there is one way a network's change reaches your project: delete the channels it affects, then generate again. Re-running in the hope of picking the change up gives you the worst of both ends — a refusal when nothing moved, and, when one frequency did move, a new channel sitting next to the stale one while the unchanged pairs still trip the refusal on the rest of the batch.
Changing a network that is not yours
A network you did not build is read-only to you, and an imported one is read-only to everyone: the next catalogue import replaces it whole. To change one, copy it — Clone to my networks on the network's page, or Clone beside it under All Networks or Public Networks on the Networks page. You get a private network of your own with every zone, talk group and repeater the original had, and which repeater carries which talk group on which timeslot. Its name ends in (copy); its abbreviation does not change, so {network_abbr} names channels exactly as the original's did. Pick it in the Network list like any other.
It is a copy in the sense of the section above: nothing the original's owner or the catalogue changes afterwards reaches it, and nothing you change reaches the original. On its page you can add and remove talk groups and repeaters and, when the network is small enough to draw, tick in the TalkGroup / Repeater Matrix which repeater carries what. Most imported networks list their memberships one by one, so on a copy of one a talk group or repeater you add is carried nowhere until you tick it there. Clones count against a daily allowance, shown under Usage in the account menu.
Why the count is not repeaters times talk groups
The number in the dialog's footer is the network's own matrix of which repeater carries which talk group, resolved for your selection. It is not the product of the two lists, and it can land on either side of it.
- A small curated network means "every talk group on every repeater, except the pairs the owner excluded", so exclusions pull the count below the product.
- An imported network enumerates only the memberships that exist — typically a handful per site out of thousands of talk groups — which pulls it far below.
- One talk group can sit on both timeslots of one repeater, and that is two channels. This is common, not exotic.
- A talk group you add under
Add a talk group not listed abovebypasses the matrix and goes on every repeater you picked. Add one to a thirty-repeater selection and the count rises by thirty.
The footer is worth reading rather than skipping, because it resolves the same memberships the generation will, from the same place — the count it prints is the count you get. It also reports how full the radio is, and those figures count every channel row including the two fixed VFO rows, so an empty project reports two in use.
One reading trap: the footer goes blank both when your selection is incomplete and when the preview request itself failed. A blank footer under a full selection means the preview did not answer, not that zero channels would be created.
Two pickers, and the server chooses
The dialog draws one of two completely different interfaces, and it never says which or why — so if yours looks nothing like a friend's, this is the reason. The server decides from the size of the network: up to 500 repeaters and 500 talk groups you get flat tick lists (Talk Groups and Repeaters); past either limit you get a filtered search instead, with Talk groups on the selected repeaters beside it, because rendering thousands of checkboxes locks up the browser tab.
The two modes differ in a way that matters:
- In list mode nothing starts ticked. In search mode a repeater's talk groups arrive already ticked under
Timeslot 1andTimeslot 2, and ticking or unticking any repeater rebuilds that whole pane — which re-ticks talk groups you had just cleared. Choose your repeaters first, prune the talk groups last. Select AllandDeselect Allact only on rows the filter is showing, as the note beside the list-mode pair says. Either way the generation reads every ticked box, shown or hidden. Tick a whole list, then filter it, and you generate for the whole list.- Search results are capped at 200 rows and ordered by callsign, so a broad search over a large state returns an alphabetical first page and a site further down the alphabet looks missing until you narrow the filters with
Callsign or city,CountryorState / Province.
The naming template is a key, not a label
This is the part worth understanding before you press anything, and the part that produces most first-time refusals. A channel name here is not decoration: a channel's name together with its RX and TX frequencies is the triple the codeplug resolves zone and scan-list membership by, so that triple has to be unique in the project (How AesApp WebCPS works explains what is held by name and what by number). The helper enforces it for the whole batch at once: if any generated channel would repeat the name and both frequencies of another, or of one the project already holds, the refusal begins Generation would create duplicate channel(s) (same name and frequencies) and nothing is written.
The comparison ignores letter case, so Alpha North and alpha north on one repeater collide. Same name on different frequencies is fine and common. One duplicate escapes the check altogether: a talk group ticked in the list and entered again under Add a talk group not listed above is de-duplicated only against the other hand-added entries. Give it a different name there and you quietly get two channels for one talk group, both bound to the same contact row.
What each block resolves to
| Block | Resolves to |
|---|---|
{network} | The network's name, with a leading catalogue scope like [USA] removed — the prefix would eat half a 16-character name without telling you which network it is. |
{network_abbr} | The network's abbreviation. |
{tg} | The talk group's full name. |
{tg_abbr} | The talk group's abbreviation. |
{tg_id} | The talk-group number. |
{repeater} | The repeater's name. |
{repeater_abbr} | The repeater's abbreviation or site code. |
{ts} | The timeslot this channel is on, from the membership — not the talk group's own default slot. |
{cc} | The repeater's colour code. |
{ts} earns its own sentence. It is the only block that can tell apart the two channels produced by a talk group carried on both slots of one repeater, so it is the only way that pair gets past the duplicate check on its own. The pre-filled template {tg_abbr} {repeater} cannot, which is why a duplicate refusal is the commonest first experience of this tool — if that is where you are, add {ts} and try again. {repeater} or {repeater_abbr} is what separates several sites carrying the same talk group.
Ticking Rename duplicates automatically is the other way out, and both the footer and the generation honour it: colliding names get a number appended. Use it to get one selection past a template collision, and never as a way to re-run a generation — the refusal it removes is the same one that stops a re-run from doubling your batch. It is off by default on purpose: a template that collides is usually the wrong template for the selection, and numbering the collisions away hides that rather than fixing it.
Sixteen characters the radio can store
The resolved name is cut to 16 characters silently, mid-word, with nothing on screen to say it happened. Each character the radio is not given is then respelled in one it is: a Latin letter loses its accent or is spelled out (é e, ü ue, ß ss), and where the radio cannot show a script at all its letters are written in Latin ones. Then the generation is refused if the result does not fit the radio's name field, which holds 16 bytes of the radio's own character set: GBK on the AT-D878UVII, AT-D578UV(III) Plus and AT-D168UV, two bytes a Chinese, Cyrillic or Greek letter; Windows-1252 on the AT-D890UV and the DM-32UV, one byte a character; and GBK on the RT-4D, two bytes a Chinese character.
For plain ASCII the check never fires. For anything else it can, and with {tg} in the template the wall is invisible until you hit it: the BrandMeister talk group named Διεθνές Ελλάδα is 14 characters, so the character cut leaves it whole, and on the AT-D890UV it is written Diethnes Ellada; but on the AT-D878UVII its Greek letters take two bytes each, 28 in all, so the check refuses the entire run with a message ending Adjust your naming template. Rename duplicates automatically does not help — it only rewrites names that collide. The answer is a template that yields fewer bytes for that network: {tg_id}, {cc}, {ts}, {repeater_abbr}, and {tg_abbr} where the abbreviation itself is short.
The contact name may not be the talk group's name
Each generated channel's DMR Contact is bound by name to a row in the project's Talk Groups table, and the build resolves that name to the first matching row. So two talk groups whose names share a 16-character prefix would collapse onto one contact, and every channel for the loser would quietly point at the wrong conversation. Real catalogues are full of these: DMR+ has fifteen talk groups whose names all truncate to TAC english, and ADN carries Sweden ten times.
So the helper cuts each name to 16 bytes and then makes it unique inside your project by appending the talk group's DMR ID. Finding TAC english 133 where you expected a longer name is that mechanism working, not a bug.
Two consequences worth knowing:
- An existing row always wins. If the project already has a
Talk Groupsrow for that number, the channel binds to whatever that row is called, and the row is left alone — name,Call Type,Call Alertand position all survive. So renaming a contact by hand is safe across later generations. - Rows are added for what you ticked, not for what was generated. A talk group you selected that the matrix gave no channel for still gets a contact row. Nothing in this tool ever removes one, so an abandoned experiment leaves contacts behind for you to delete from the
Talk Groupstab.
One side effect has no warning at all: on a project whose Talk Groups tab is empty, the first generation back-fills that table from your existing channels' contacts before it allocates anything. Empty that tab by hand while the channels keep their contacts, and the next generation puts a row back for every talk group they name.
Zones are grouped from the data, not from a preference
The rule under the checkbox says one zone per repeater when they are all in one area, otherwise grouped by state or country. What it leaves out is where the line is drawn: you get a zone per repeater only when every chosen repeater resolves to the same region and the batch needs no more zones than the radio holds in total. Region means the repeater's state, or its country when there is no state, or Other; a site's zone is named from its abbreviation, or its name, callsign or city. So two sites in Washington and one in Oregon do not give three site zones — they give one zone per state. Sub-state regions are never invented, because the repeater data carries no county or metro area, and a made-up boundary presented as a place name is worse than a coarse one.
Zones are matched by name, which is what makes a second generation extend a repeater's zone rather than sit beside it as a duplicate — and also means two repeaters sharing an abbreviation share a zone. A zone that fills up continues as <name> 2, <name> 3.
When the radio's zone ceiling is reached, the rest of the batch is left with no zone at all, and nothing on screen says so — the dialog just closes. Channels with no zone are reachable only by scrolling the full channel list on the radio. The batch is planned against the model's total zone ceiling rather than the room actually left in your project, so a project already near the ceiling is where this bites. After a generation into a busy project, check the Zones tab.
A generation can also fill a zone that was empty, and nothing here re-points the zone-index settings that moves. That trap and what to check are in How AesApp WebCPS works. Adding members to a zone that already had some moves none of those settings.
Where the new channels land
Generated channels are numbered repeater by repeater: all of the first repeater's talk groups, then the next repeater's, in the talk groups' stored order rather than the order you ticked them. Anything you added by hand comes after the whole network batch. That order decides each channel's No., and therefore each zone's member order and which channel a zone's empty A Channel resolves to.
After the last channel is resolved on the server at the moment you press the button, so it is right even if something else edited the project meanwhile. At position renumbers every channel from there on. Zone and scan-list member orders move with them, but the settings that name a channel by its absolute number do not: on the AT-D878UVII those are Analog: Emergency Channel and Digital: Emergency Channel; on the AT-D578UV(III) Plus they are Emergency Channel (Analog) and Emergency Channel (Digital) plus Digital Report Channel 1 through Digital Report Channel 8. Nothing re-points them, so they end up naming different channels. At position also has no ceiling: type 900 into a two-hundred-channel project and it is accepted, leaving a gap in the numbering behind the batch. After the last channel avoids both problems.
What is left for you to finish
A generated channel transmits and receives on the right talk group, and that is where the helper stops. Per channel, before the codeplug is worth writing:
DMR RX Group List— empty. The field names the set of Group Call talk groups the channel watches, so a generated channel watches none. Create the groups on theRX Groupstab first.Scan Listsand the per-channelRadio ID, both empty.DMR Mode, left atSimplexon every generated channel, duplex repeaters included — the helper never sets it and does not infer it from the frequency pair. One built field follows it: on a channel carrying no stored value of its own,Through Mode(Idle TXon the AT-D890UV) is builtOnfor every mode exceptRepeater.- Whether the talk group is actually carried. A talk group that is user-activated rather than always on looks identical in the picker and in the generated channel — there is no badge, and none of it survives into the channel. On a typical network most memberships are user-activated, and a channel for one of those is silent until somebody keys the talk group up. That is not a fault in your codeplug.
Nothing reports what a generation did, either. The dialog closes; the channel table and the Zones tab are where you find out.
Who can use it, and when it will not run
The tool is free and unmetered. There is no plan gate and no usage quota on a generation, on any tier — About AesApp WebCPS covers what plans do govern. What can still stop you:
- Edit rights. The
DMR Helperbutton is only rendered for the project's owner (and an administrator). A viewer of a shared or public project has no way in, and would not get far anyway: both the footer count and the generation count as writes. Clone the project and generate into your own copy. - A private network, or a shared one you have not opened. The
Networklist holds the networks on yourAll Networkslist: your own, every public one, and each shared one you have opened by its link while signed in. Someone else's private network is not in it, and a shared one appears once you open its link. - A live desktop write. While the desktop app holds a write lease on the project, every write is refused — and the footer count is a write. So the footer goes blank while
Generate Channelsstays enabled, and pressing it is how you find out: the refusal beginsThis codeplug is being written to a radio right now — it is read-only until the write finishesand ends with the minutes remaining. Wait for the write to end. - A project in the trash. A deleted project stops answering on every tab, this one included, until it is restored.
Two more you will meet. Reopening the dialog rebuilds the Network list, so nothing is selected — but the previous run's ticks are still on screen and Generate Channels is still enabled, and pressing it answers Network not found. Re-pick the network. And These repeaters carry no talk groups we know of. is not a refusal at all: the chosen sites have no memberships we hold, or every talk group is excluded for them. Add a talk group not listed above is the way past it, since a talk group added there ignores the matrix.
Once the channels look right, writing them to your radio is the next chapter, and When it goes wrong sorts a failed generation from a failed write.