Home phone system, part 3

A T65 on a Cisco ATA186

October 29, 2026

In part 2 we got MikoPBX running. Time to connect the first phone. And not just any phone: a T65, the phone that stood in nearly every Dutch living room in the 1970s and 1980s. In this part we connect it to MikoPBX with a Cisco ATA186 analog telephone adapter.

A brown PTT T65-TDK push-button telephone on a wooden slatted bench in front of a window
One of the two T65s in my living room

What you need

The ATA186 has two phone ports, but I only use the first one on each adapter. I used two ATAs instead of one so I didn’t have to run phone cables through the house.

A white surface-mounted wall socket with four round holes for the old Dutch PTT plug and an RJ11 port below them
A socket with both the old PTT four-pin connector and RJ11

Keep in mind that “modern” telephone devices, such as ATAs, use RJ11 plugs, while older European phones come with all sorts of odd plugs: every national phone company seems to have designed its own. The Dutch PTT used a four-pin plug, and most T65s still have one. For one of my T65s I already had an adapter. The other had a broken cord, so I simply replaced it with one that already had an RJ11 plug.

Step 1: create an extension in MikoPBX

In MikoPBX, go to Extensions and click Add new employee. Fill in a name and a number from your numbering plan. The phone in my kitchen gets 21. MikoPBX generates a SIP password for you. You’ll need it in a minute.

The settings of extension 21 in MikoPBX: username Keuken, number 21 and a generated SIP password

Most settings can stay at their defaults. Under Advanced settings, I changed two things:

Creating a network filter

The network filter list shows the networks you’ve defined in MikoPBX’s firewall. If your home network isn’t in there yet, create it first:

  1. Go to Network and Firewall → Firewall and add a new rule.
  2. Give it a name, like Internal network, and enter your home network: the network address under IPv4 network and the prefix under IPv4 prefix. For most home networks that’s something like 192.168.1.0 and 24.
  3. Under the available services, allow at least SIP&RTP, so phones can register and talk. Also allow WEB if you want to reach the web interface from your home network.
  4. Under Additional parameters, switch on This is VPN or local network. Phones on this network then connect to MikoPBX directly, without NAT. Leave Never block addresses from this network off: that way MikoPBX still blocks a device that keeps trying wrong passwords, even inside your own network.
  5. Save the rule.

The new network now appears in the network filter list of every extension. More details are in the MikoPBX firewall documentation.

The firewall rule for the internal network in MikoPBX, with SIP and RTP, IAX, WEB and AMI allowed, and the option for a VPN or local network switched on

Step 2: find the ATA on the network

The ATA186 has a voice menu that you operate with the phone itself. Connect the T65 to the first phone port, pick up the handset and press the button on top of the ATA. Then dial 21#. The ATA reads out its IP address.

Open http://<ip-of-the-ata>/dev in your browser to get to the configuration pages. Check the title: it should say Cisco ATA 186 (SIP). The firmware version is listed under Device Information.

Step 3: SIP parameters

The SIP Parameters page connects the ATA to MikoPBX. The settings that matter:

Parameter Value What it does
UID0 21 The extension number for the first phone port
PWD0 the SIP password The password MikoPBX generated in step 1
DisplayName0 keuken The name others see when this phone calls
SIPRegOn 1 Register with MikoPBX, so the phone can be called
Proxy the IP address of the NAS Where MikoPBX lives
SIPPort 5060 The SIP port of MikoPBX

The second port is not used, so UID1 stays at 0.

The SIP Parameters page of the Cisco ATA186, with UID0 21, DisplayName0 keuken and the IP address of the NAS as Proxy

Click apply. As the page warns, the ATA may restart. When it’s back, the extension in MikoPBX should show as available.

Step 4: Dutch tones

Pick up the phone now and you’ll hear an American dial tone. That works, but it doesn’t sound right on a T65. Luckily, the ATA lets you customize the tones on the Tone Parameters page, and these are the Dutch values I use:

DialTone      1,30958,0,3125,0,1,0,0,0,0
BusyTone      1,30958,0,1757,0,0,4000,4000,0,0,0
ReorderTone   1,30958,0,1757,0,0,2000,2000,0,0,0,0,0,0,0,0
RingBackTone  1,30958,0,4839,0,0,8000,32000,0,0,0
RingOnOffTime 1,4,25
Tone player

Curious what they sound like? Pick a preset and press play, or enter your own values. The American dial tone is there for comparison. The player also shows the coefficients and sample counts you'd enter in the ATA.

An on or off time of 0 plays a continuous tone.

The format looks cryptic, but it’s not that hard. The first number is the number of frequencies: Dutch tones use a single one. The second number is the frequency, encoded as 32767 × cos(2π × f / 8000). For the Dutch 425 Hz3, that’s 30958. The fourth number is the volume. Further on are the on and off times, counted in samples of 1/8000 of a second. So 4000 means half a second: the busy tone is 425 Hz, half a second on and half a second off. The ringback tone, which you hear while the other side rings, is one second on and four seconds off (8000 and 32000 samples).

RingOnOffTime sets the ring rhythm of the phone itself: one second on, four seconds off.

Step 5: the dial plan

An analog phone has no “call” button. You pick up the handset and dial. On an analog phone network, each digit goes to the telephone exchange the moment you press the button, and the exchange does all the work. SIP works differently: a client, the ATA in this case, sends the complete phone number in a single request. So the ATA has to decide when the number is complete. That’s what the dial plan is for. This is mine:

*St4-|#St4-|112|1>#t5-|2.|3.|4.|55>#t1-|5^5|6.|7.|8.|9.|00S>#t5-|08S>#t5-|09S>#t5-|0^0.r7|0>#t5-

The rules are separated by |, and the ATA uses the first rule that fully matches. The most important symbols:

The full syntax is in the Cisco ATA administrator’s guide on ManualsLib. Cisco itself no longer hosts the documentation, since the ATA186 has been retired for years.

Rule Matches Behavior
*St4- and #St4- Codes starting with * or # Sent after 4 seconds without input
112 The emergency number Sent immediately
1>#t5- Other numbers starting with 1, like 14 numbers Sent after 5 seconds, or when you press #
2., 3., 4. Internal numbers on the three floors Sent immediately after two digits
55>#t1- 55 followed by more digits Sent one second after the last digit. This is a special case for the kitchen timer.
5^5 The other services, 50–59 except 55 Sent immediately after two digits
6. to 9. Two-digit numbers, for future use Sent immediately after two digits
00S>#t5- International numbers Sent after 5 seconds, or when you press #
08S>#t5- and 09S>#t5- 0800 and 0900 numbers, which vary in length Sent after 5 seconds, or when you press #
0^0.r7 A normal Dutch number: 0, a non-zero digit and 8 more digits Sent immediately after the tenth digit
0>#t5- Anything else starting with 0 Sent after 5 seconds, or when you press #

The result: internal calls connect the moment you dial the second digit, and normal phone numbers connect after the tenth. You only wait for numbers whose length can vary.

Step 6: a different ring for internal calls

An old phone has no display, so you can’t see who’s calling. But you can hear the difference. Internal calls ring with a different pattern than calls from outside, so you know whether it’s a housemate calling from upstairs or someone from the outside world.

The ATA can play several ring patterns. Which one it uses is decided by the SIP header Alert-Info in the incoming call. MikoPBX doesn’t set that header by default, but you can add it. Go to System files, pick /etc/asterisk/extensions.conf, set the mode to Append to end of file, and add:

[dial_create_chan-custom]
exten => s,1,NoOp(Distinctive ring)
    same => n,ExecIf($["${CHANNEL(channeltype)}" != "PJSIP"]?return)
    same => n,ExecIf($["${CHANNEL(endpoint)4}" == "SIP-"]?return)
    same => n,ExecIf($[${LEN(${CALLERID(num)})} > 0 & ${LEN(${CALLERID(num)})} <= 4]?Set(PJSIP_HEADER(add,Alert-Info)=Bellcore-dr2))
    same => n,return

MikoPBX runs dial_create_chan-custom for every outgoing channel it creates, so it’s a convenient place to add a header. The lines do this:

Bellcore-dr2 is one of a set of standard ring patterns that many ATAs and phones understand. In part 7, where the kitchen timer uses another one, you’ll find an overview of all patterns and what they sound like.

The T65 that wouldn’t ring

One of my T65s could make calls just fine, but didn’t ring when it was called. The cause turned out to be in the wiring: the EB terminal of the phone had to be connected to the b terminal. EB is for an extra bell (extra bel in Dutch), which was used in large spaces like offices and garages. The extra bell was connected between b and EB. Without an extra bell, EB had to be connected to b to make the phone’s own bell ring. You can make that connection at the screw terminals inside the phone, but it was often done inside the four-pin plug. Since I had replaced that plug with a modern cord with an RJ11 plug, I had to make the connection inside the phone instead. Someone on the KPN forum ran into the same problem with a modern modem.

Next up

The T65 can now call and be called. In part 4 we add cordless phones: a Gigaset N510 IP PRO DECT base station with five handsets.


  1. Cisco’s documentation says the phone must be set to tone dialing. Koos van den Hout found this out the hard way with a rotary T65. ↩

  2. On an American keypad, or any mobile phone, those digits spell FACTRESET. The T65, like most Dutch phones of its time, has no letters on its keys. ↩

  3. The ITU keeps an overview of the tones used in national networks (PDF, the Netherlands is on page 20). Most other European countries use the same tones. ↩