TapHome

Paradox Digiplex EVO via PRT3 (TCP)

Packet Parser → TCP
Submitted by
Last updated: 11. 2026

Requires external gateway

Paradox PRT3 (APR-PRT3) printer and home automation module, or BUS2SER, with an RS-232-to-Ethernet converter — product page

Paradox Digiplex EVO via PRT3 (TCP)

The Paradox EVO PRT3 template connects a Paradox Digiplex EVO alarm panel to TapHome through the PRT3 module and the official ASCII protocol of Paradox. The PRT3 sits on the combus of the panel and offers the protocol on its 9-pin serial port. An RS-232-to-Ethernet converter makes that port reachable on the local network, and TapHome connects to the converter over TCP — no computer is needed in between.

The template shows the arming state of one area and arms or disarms it with a user code, shows four zones with their warnings and one virtual PGM, and shows an error when the PRT3 loses the panel.

The PRT3 is a home automation interface only for Digiplex EVO panels. For Spectra SP and Magellan MG panels, use the community template Paradox Alarm Panels via PAI (MQTT).

Community template — not yet tested with TapHome on a real panel. The template was written from the official Paradox ASCII protocol manual (ASCII-EP01) and tested only against a simulated PRT3 on a local TapHome Core 2025.2, not on a real Digiplex EVO panel with a real PRT3 and converter. Verify it on your installation before you rely on it for security; feedback from the field is welcome. Download the XML on this page, or get it from the TapHome portal: Paradox EVO via PRT3 — community template, and import it as a new module.

Security: the user code is stored in TapHome and travels unencrypted. The PRT3 arms and disarms only with a user code, and the template sends that code with every arming and disarming command. The code is stored in the TapHome configuration and travels in clear text over the local network between the TapHome Core and the converter. Create a separate user in the panel for TapHome, limited to the areas TapHome controls, and use its code — never the master code.

Supported panels

PanelRequirement
Digiplex EVO48, EVO96, EVO192, EVOHDPRT3 (or BUS2SER) in home automation mode with the ASCII protocol
DGP-848version 4.11 or newer
DGP-NE96version 1.60 or newer

Spectra SP and Magellan MG panels have no official home automation interface — see Paradox Alarm Panels via PAI (MQTT).

Hardware connection

  • PRT3 to the panel: connect the four terminals of the PRT3 (red, black, green, yellow) to the combus terminals of the panel.
  • Converter to the PRT3: connect the RS-232 side of the converter to the 9-pin serial port of the PRT3 — not to the parallel port or the USB port.
  • Converter to the network: set the converter to TCP server mode with a fixed IP address and a TCP port. TapHome connects to it as a TCP client and keeps the connection open.

Serial parameters are 8N1 (8 data bits, no parity, 1 stop bit). The converter has to use exactly the same baud rate as the PRT3 — with a different baud rate TapHome receives nothing.

Configuration

Home automation mode of the PRT3

Program the PRT3 from a keypad of the panel:

  1. Press and hold [0] and enter the installer code.
  2. Enter section [4003] on EVO panels, or [953] on DGP-848 panels.
  3. Enter the 8-digit serial number of the PRT3.
  4. Enter section [016] (serial port options) and set:
OptionSettingMeaning
[1]ONSerial port enabled
[4]ONHome automation (not event reporting)
[5] and [6]OFF and OFFASCII protocol (not C-Bus)
[2] and [3]as in the PRT3 manualBaud rate: 2400, 9600, 19200 or 57600 bps — set the same rate on the converter

The PRT3 can also be programmed with the WinLoad software (version 2.62 or newer) or with the module broadcast feature of the panel.

Virtual PGM

The virtual PGM of the template is a virtual PGM of the PRT3, not a physical PGM output of the panel. Program it in the PRT3 with the panel events that switch it on and off (sections [100] to [399], ten sections per virtual PGM), so that the PRT3 sends its state to TapHome.

User for TapHome

Create a separate user in the panel for TapHome, give it access only to the areas TapHome arms and disarms, and enter its code (4 to 6 digits) at import. The template sends this code with every arming and disarming command, so the parameter must not stay empty.

Import parameters

Import parameterDescriptionDefault
IP address of the converterIP address of the RS-232-to-Ethernet converter in TCP server mode192.168.1.100
TCP port of the converterTCP port of the converter4001
Area numberArea in the panel, three digits (001 to 008)001
Zone 1–4 numbersZones in the panel, three digits (001 to 192)001 … 004
Virtual PGM numberVirtual PGM of the PRT3, two digits (01 to 30)01
User codeCode of the panel user created for TapHome(empty)

For more areas or zones, import the template again with other numbers and delete the devices you do not need. Each import opens its own TCP connection, so check that the converter accepts more than one.

Device capabilities

Area

Shows the state of the area and arms or disarms it.

StateWhen selected in TapHome
Disarmeddisarms the area with the user code
Armedarms the area
Force Armedforce arms the area
Armed Stayarms the area in Stay mode
Armed Instantarms the area in Instant mode
Alarmsends nothing — the state only shows an alarm reported by the panel

After each command the template asks for the state of the area again. The Area device shows a warning when the panel refused the last arming or disarming command (usually a wrong user code), when the area has a trouble and when an alarm is in memory. When the TapHome Core starts, the template sends no arming or disarming command — the area takes its state from the next answer of the panel.

Zones 1–4

Each zone shows whether it is closed or open; a tampered zone and a zone with a fire loop trouble count as not closed. Warnings show when the zone is in alarm, in fire alarm, tampered, has a fire loop trouble, has lost supervision or has a low battery. Each warning stays until the panel reports the zone as OK.

Virtual PGM

Shows the state of one virtual PGM of the PRT3. The state changes only when the PRT3 reports a change; the protocol has no request for the state of a virtual PGM, so after a start of the TapHome Core the device has no value until the next change. TapHome does not switch the virtual PGM.

Module

The template asks for the state of the area and the four zones every 5 seconds. The module shows an error when the PRT3 reports that it has lost communication with the panel, and clears it when the communication is back. When the converter is not reachable, TapHome shows the usual connection error of the module.

Not in the template

  • Panic and smoke detector reset — left out on purpose: emergency, medical and fire panic would trigger a real alarm report.
  • Zone bypass and direct control of physical PGM outputs — the PRT3 does not support them.
  • Zone and area labels — the template uses numbers only.
  • Virtual inputs and utility keys of the PRT3.

Troubleshooting

No values in TapHome

Check that the converter is reachable at the IP address and port from the import, that the converter and the PRT3 use the same baud rate, and that section [016] has options [1] and [4] ON and options [5] and [6] OFF.

Arming or disarming does nothing

A warning on the Area device that the panel refused the command means a wrong user code, or a user without access to the area. Check the code of the TapHome user and its areas in the panel.

Module error about the communication with the panel

The PRT3 lost the combus connection to the panel. Check the wiring of the four combus terminals.

A zone shows the wrong state

Check that the zone number from the import is the number of the zone in the panel, always with three digits (zone 5 is 005).

Available devices

Paradox PRT3 Module
Custom Variables
AreaNum (string)Number of the area in the panel, three digits (001 to 008)
Enter the area number with three digits (area 1 = 001) as the import parameter Area number.
Zone1Num (string)Number of zone 1 in the panel, three digits (001 to 192)
Zone2Num (string)Number of zone 2 in the panel, three digits (001 to 192)
Zone3Num (string)Number of zone 3 in the panel, three digits (001 to 192)
Zone4Num (string)Number of zone 4 in the panel, three digits (001 to 192)
PgmNum (string)Number of the virtual PGM programmed in the PRT3, two digits (01 to 30)
Program the virtual PGM in the PRT3 (activation and deactivation event) and enter its number with two digits (01) as the import parameter Virtual PGM number.
UserCode (string)User code of a separate panel user created for TapHome (4 to 6 digits), not the master code; it is sent in clear text with every arming and disarming command
Create a separate user in the panel for TapHome, limited to the areas TapHome controls, and enter its code as the import parameter User code. Do not use the master code.

Paradox PRT3

Read (module)
# Poll the area and the four zones; every command ends with CR (framing)
SENDDATA("RA" + AreaNum);
SENDDATA("RZ" + Zone1Num);
SENDDATA("RZ" + Zone2Num);
SENDDATA("RZ" + Zone3Num);
SENDDATA("RZ" + Zone4Num);
Listener
VAR msg := TOSTRING(RECEIVEDBYTES);
IF INDEXOF(msg, "COMM&fail") = 0
    CommFail := 1;
END
IF INDEXOF(msg, "COMM&ok") = 0
    CommFail := 0;
END
IF CommFail = 1
    ADDERROR(1, "PRT3 reports COMM&fail: no communication between the PRT3 module and the panel");
END
Area Multi-value Switch

State of one area of the panel and arming or disarming it with the user code; Alarm is only shown and sends nothing

enum ascii
Values / States: Disarmed · Armed · Force Armed · Armed Stay · Armed Instant · Alarm

Area

Read switch state
RETURN(Mu);
Write switch state
# Alarm (5) is reported by the panel and is never a command
IF Mu = 0
    SENDDATA("AD" + AreaNum + UserCode);
ELSEIF Mu = 1
    SENDDATA("AA" + AreaNum + "A" + UserCode);
ELSEIF Mu = 2
    SENDDATA("AA" + AreaNum + "F" + UserCode);
ELSEIF Mu = 3
    SENDDATA("AA" + AreaNum + "S" + UserCode);
ELSEIF Mu = 4
    SENDDATA("AA" + AreaNum + "I" + UserCode);
END
IF Mu < 5
    SENDDATA("RA" + AreaNum);
END
Listener
VAR msg := TOSTRING(RECEIVEDBYTES);
# Area status: RA<nnn> + state (D, A, F, S, I) + M T N P A S, each O when OK
IF INDEXOF(msg, "RA" + AreaNum) = 0 AND LENGTH(msg) >= 12
    VAR st := GETAT(RECEIVEDBYTES, 5);
    IF GETAT(RECEIVEDBYTES, 10) = 65
        Mu := 5;
    ELSEIF st = 68
        Mu := 0;
    ELSEIF st = 65
        Mu := 1;
    ELSEIF st = 70
        Mu := 2;
    ELSEIF st = 83
        Mu := 3;
    ELSEIF st = 73
        Mu := 4;
    END
    AreaMemory := IF(GETAT(RECEIVEDBYTES, 6) = 77, 1, 0);
    AreaTrouble := IF(GETAT(RECEIVEDBYTES, 7) = 84, 1, 0);
END
# Answer to an arming or disarming command of this area
IF INDEXOF(msg, "AA" + AreaNum) = 0 OR INDEXOF(msg, "AD" + AreaNum) = 0
    CodeFailed := IF(INDEXOF(msg, "&fail") > 0, 1, 0);
END
IF CodeFailed = 1
    ADDWARNING(1, "The panel refused the last arming or disarming command (&fail): check the user code");
END
IF AreaTrouble = 1
    ADDWARNING(2, "Trouble in the area");
END
IF AreaMemory = 1
    ADDWARNING(3, "Alarm in memory");
END
Zone 1 Reed Contact Read-only

Closed or open state of one zone of the panel, with warnings for alarm, fire alarm, tamper, fire loop trouble, supervision lost and low battery

boolean ascii
Variable: ZoneNum — Number of the zone in the panel, three digits (001 to 192)

Zone 1

Read
RETURN(Rc);
Listener
VAR msg := TOSTRING(RECEIVEDBYTES);
# Zone status: RZ<nnn> + C, O, T, F + A F S L, each O when OK
IF INDEXOF(msg, "RZ" + ZoneNum) = 0 AND LENGTH(msg) >= 10
    VAR st := GETAT(RECEIVEDBYTES, 5);
    Rc := IF(st = 67, 0, 1);
    ZTamper := IF(st = 84, 1, 0);
    ZFireLoop := IF(st = 70, 1, 0);
    ZAlarm := IF(GETAT(RECEIVEDBYTES, 6) = 65, 1, 0);
    ZFire := IF(GETAT(RECEIVEDBYTES, 7) = 70, 1, 0);
    ZSupervision := IF(GETAT(RECEIVEDBYTES, 8) = 83, 1, 0);
    ZBattery := IF(GETAT(RECEIVEDBYTES, 9) = 76, 1, 0);
END
# Warnings are rebuilt from the stored zone state on every message
IF ZAlarm = 1
    ADDWARNING(1, "Zone in alarm");
END
IF ZFire = 1
    ADDWARNING(2, "Fire alarm");
END
IF ZTamper = 1
    ADDWARNING(3, "Zone tampered");
END
IF ZFireLoop = 1
    ADDWARNING(4, "Fire loop trouble");
END
IF ZSupervision = 1
    ADDWARNING(5, "Supervision lost");
END
IF ZBattery = 1
    ADDWARNING(6, "Low battery");
END
Zone 2 Reed Contact Read-only

Closed or open state of one zone of the panel, with warnings for alarm, fire alarm, tamper, fire loop trouble, supervision lost and low battery

boolean ascii
Variable: ZoneNum — Number of the zone in the panel, three digits (001 to 192)

Zone 2

Read
RETURN(Rc);
Listener
VAR msg := TOSTRING(RECEIVEDBYTES);
# Zone status: RZ<nnn> + C, O, T, F + A F S L, each O when OK
IF INDEXOF(msg, "RZ" + ZoneNum) = 0 AND LENGTH(msg) >= 10
    VAR st := GETAT(RECEIVEDBYTES, 5);
    Rc := IF(st = 67, 0, 1);
    ZTamper := IF(st = 84, 1, 0);
    ZFireLoop := IF(st = 70, 1, 0);
    ZAlarm := IF(GETAT(RECEIVEDBYTES, 6) = 65, 1, 0);
    ZFire := IF(GETAT(RECEIVEDBYTES, 7) = 70, 1, 0);
    ZSupervision := IF(GETAT(RECEIVEDBYTES, 8) = 83, 1, 0);
    ZBattery := IF(GETAT(RECEIVEDBYTES, 9) = 76, 1, 0);
END
# Warnings are rebuilt from the stored zone state on every message
IF ZAlarm = 1
    ADDWARNING(1, "Zone in alarm");
END
IF ZFire = 1
    ADDWARNING(2, "Fire alarm");
END
IF ZTamper = 1
    ADDWARNING(3, "Zone tampered");
END
IF ZFireLoop = 1
    ADDWARNING(4, "Fire loop trouble");
END
IF ZSupervision = 1
    ADDWARNING(5, "Supervision lost");
END
IF ZBattery = 1
    ADDWARNING(6, "Low battery");
END
Zone 3 Reed Contact Read-only

Closed or open state of one zone of the panel, with warnings for alarm, fire alarm, tamper, fire loop trouble, supervision lost and low battery

boolean ascii
Variable: ZoneNum — Number of the zone in the panel, three digits (001 to 192)

Zone 3

Read
RETURN(Rc);
Listener
VAR msg := TOSTRING(RECEIVEDBYTES);
# Zone status: RZ<nnn> + C, O, T, F + A F S L, each O when OK
IF INDEXOF(msg, "RZ" + ZoneNum) = 0 AND LENGTH(msg) >= 10
    VAR st := GETAT(RECEIVEDBYTES, 5);
    Rc := IF(st = 67, 0, 1);
    ZTamper := IF(st = 84, 1, 0);
    ZFireLoop := IF(st = 70, 1, 0);
    ZAlarm := IF(GETAT(RECEIVEDBYTES, 6) = 65, 1, 0);
    ZFire := IF(GETAT(RECEIVEDBYTES, 7) = 70, 1, 0);
    ZSupervision := IF(GETAT(RECEIVEDBYTES, 8) = 83, 1, 0);
    ZBattery := IF(GETAT(RECEIVEDBYTES, 9) = 76, 1, 0);
END
# Warnings are rebuilt from the stored zone state on every message
IF ZAlarm = 1
    ADDWARNING(1, "Zone in alarm");
END
IF ZFire = 1
    ADDWARNING(2, "Fire alarm");
END
IF ZTamper = 1
    ADDWARNING(3, "Zone tampered");
END
IF ZFireLoop = 1
    ADDWARNING(4, "Fire loop trouble");
END
IF ZSupervision = 1
    ADDWARNING(5, "Supervision lost");
END
IF ZBattery = 1
    ADDWARNING(6, "Low battery");
END
Zone 4 Reed Contact Read-only

Closed or open state of one zone of the panel, with warnings for alarm, fire alarm, tamper, fire loop trouble, supervision lost and low battery

boolean ascii
Variable: ZoneNum — Number of the zone in the panel, three digits (001 to 192)

Zone 4

Read
RETURN(Rc);
Listener
VAR msg := TOSTRING(RECEIVEDBYTES);
# Zone status: RZ<nnn> + C, O, T, F + A F S L, each O when OK
IF INDEXOF(msg, "RZ" + ZoneNum) = 0 AND LENGTH(msg) >= 10
    VAR st := GETAT(RECEIVEDBYTES, 5);
    Rc := IF(st = 67, 0, 1);
    ZTamper := IF(st = 84, 1, 0);
    ZFireLoop := IF(st = 70, 1, 0);
    ZAlarm := IF(GETAT(RECEIVEDBYTES, 6) = 65, 1, 0);
    ZFire := IF(GETAT(RECEIVEDBYTES, 7) = 70, 1, 0);
    ZSupervision := IF(GETAT(RECEIVEDBYTES, 8) = 83, 1, 0);
    ZBattery := IF(GETAT(RECEIVEDBYTES, 9) = 76, 1, 0);
END
# Warnings are rebuilt from the stored zone state on every message
IF ZAlarm = 1
    ADDWARNING(1, "Zone in alarm");
END
IF ZFire = 1
    ADDWARNING(2, "Fire alarm");
END
IF ZTamper = 1
    ADDWARNING(3, "Zone tampered");
END
IF ZFireLoop = 1
    ADDWARNING(4, "Fire loop trouble");
END
IF ZSupervision = 1
    ADDWARNING(5, "Supervision lost");
END
IF ZBattery = 1
    ADDWARNING(6, "Low battery");
END
Virtual PGM Reed Contact Read-only

State of one virtual PGM of the PRT3, switched on and off by the panel events programmed for it; it only reports to TapHome

boolean ascii

Virtual PGM

Read
RETURN(Rc);
Listener
VAR msg := TOSTRING(RECEIVEDBYTES);
IF INDEXOF(msg, "PGM" + PgmNum + "ON") = 0
    Rc := 1;
END
IF INDEXOF(msg, "PGM" + PgmNum + "OFF") = 0
    Rc := 0;
END
Connection: Packet Parser → TCP
Possible improvements (8)
  • Emergency, medical and fire panic — Left out on purpose: a panic command triggers a real alarm report.
  • Smoke detector reset — Left out on purpose.
  • Virtual inputs 1–16 — TapHome could open and close virtual inputs of the PRT3 to trigger actions in the panel; not in the template.
  • Zone, area and user labels — The panel returns 16-character labels; the template uses numbers only.
  • Utility keys — Utility key commands of the PRT3, not in the template.
  • System events — The PRT3 sends live events (zone open, arming, alarm); the template reads states by polling every 5 s instead.
  • Zone bypass and direct control of physical PGM outputs — The PRT3 ASCII protocol has no command for either.
  • More areas and zones — The template has one area, four zones and one virtual PGM. Import it again with other numbers for more; the converter usually accepts one TCP client, so check whether it allows a second connection.

Sources

  • Paradox APR-PRT3 Printer Module — ASCII Protocol Programming Instructions (ASCII-EP01)

Found a problem with this device template?

Tell us what's wrong, what's missing, or how the template should behave. We rely on your feedback to keep the catalog accurate.

Community — unreviewed

Want to use this in your TapHome Core?

Open this template in the Customer Portal to apply it to one of your homes, or to draft a refinement and submit it back to the catalog.

Open in portal