TapHome

Centrali d'allarme Paradox tramite PAI (MQTT)

Packet Parser → MQTT
Inviato da
Ultimo aggiornamento: 11. 2026

Richiede gateway esterno

PAI (Paradox Alarm Interface, open-source MQTT bridge) — pagina prodotto

Centrali d'allarme Paradox tramite PAI (MQTT)

Il template Paradox PAI collega le centrali d’allarme Paradox — Spectra SP, Magellan MG e Digiplex EVO — a TapHome via MQTT tramite PAI, il Paradox Alarm Interface. PAI è un bridge open source, non un prodotto Paradox. Gira su un piccolo computer vicino alla centrale (ad esempio un Raspberry Pi, un NAS o un computer con Home Assistant), comunica con la centrale tramite la sua porta seriale o un modulo IP150 e pubblica lo stato della centrale su un broker MQTT. TapHome legge questi messaggi e rimanda i comandi di inserimento. Paradox non pubblica il protocollo che PAI utilizza.

Il template mostra lo stato di una partizione e la inserisce o la disinserisce, mostra quattro zone con i loro avvisi e comanda un’uscita PGM. Per le centrali Digiplex EVO con il modulo PRT3 esiste un template separato che utilizza il protocollo ufficiale di Paradox e non richiede un computer: Paradox Digiplex EVO tramite PRT3 (TCP).

Template della community — non ancora testato con TapHome su una centrale reale. Il template è stato generato nel portale TapHome dalla documentazione di PAI ed è stato testato solo con un PAI e una centrale simulati su un TapHome Core 2025.2 locale, non con una vera centrale Paradox. Verificalo sulla tua installazione prima di affidarti a esso per la sicurezza; i riscontri dal campo sono benvenuti. Scarica l’XML da questa pagina o dal portale TapHome: Paradox tramite PAI — template della community, e importalo come nuovo modulo.

Sicurezza: chi può pubblicare sul broker può disinserire l’allarme. PAI inserisce e disinserisce la centrale senza il codice utente della centrale. Attiva nome utente e password sul broker MQTT (il broker integrato in TapHome lo supporta) e inseriscili in PAI e in questo template.

Centrali supportate

SerieModelliNote
Spectra SPSP4000, SP5500, SP6000, SP7000, SP65Sui modelli “+” (SP5500+, SP6000+, SP7000+) la porta seriale è bloccata per i dispositivi di altri produttori. Paradox vende un codice di sblocco, oppure collega PAI tramite un IP150
Magellan MGMG5000, MG5050, MG5050+, MG5075Anche la MG5050+ ha la porta seriale bloccata. La MG6250 è solo sperimentale in PAI
Digiplex EVOEVO48, EVO96, EVO192, EVOHDIl firmware EVO 7.50 e successivi cifra la porta seriale; PAI 3.8 lo gestisce con la password PC. EVO non ha l’inserimento Sleep

Collegamento hardware

PAI si collega alla centrale in uno di questi modi:

  • Porta seriale della centrale — con un adattatore USB-TTL verso il computer con PAI, oppure con un bridge seriale ESP32 sulla rete locale.
  • Modulo IP150 sulla rete locale. Un IP150 accetta un solo client alla volta: mentre PAI è collegato, le app Paradox Insite Gold e BlueEye non possono collegarsi tramite lo stesso modulo. Un IP150+ con firmware 6.x e l’IP180 non consentono il collegamento locale.

Il computer con PAI e il TapHome Core devono raggiungere lo stesso broker MQTT — di solito il broker integrato nel TapHome Core.

Configurazione

Broker MQTT in TapHome

Attiva il MQTT Broker in TapHome e imposta nome utente e password — vedi MQTT Broker. PAI e questo template li usano per accedere al broker.

PAI

Nella configurazione di PAI, indirizza MQTT al broker che usa TapHome. Per il broker integrato in TapHome è l’indirizzo IP del TapHome Core — il nome taphome.mqtt.broker.local funziona solo all’interno del Core, non per PAI:

1
2
3
4
5
6
7
MQTT_ENABLE: true
MQTT_HOST: 192.168.1.10        # IP address of the TapHome Core with the built-in broker
MQTT_PORT: 1883
MQTT_USERNAME: pai
MQTT_PASSWORD: 'replace-me'
MQTT_BASE_TOPIC: paradox
MQTT_RETAIN: true              # default: the broker keeps the last state for TapHome

MQTT_USE_NUMERIC_STATES può restare al valore predefinito (False); il template legge sia True/False sia 1/0.

Chiavi di partizione, zone e PGM

PAI chiama ogni partizione, zona e PGM con il suo nome nella centrale, sostituendo spazi e caratteri speciali con _ (ad esempio Front door → Front_door). Leggi le chiavi dal broker dopo l’avvio di PAI, ad esempio:

1
mosquitto_sub -h 192.168.1.10 -u pai -P 'replace-me' -t 'paradox/states/#' -v
1
2
3
paradox/states/partitions/Area_1/current_state disarmed
paradox/states/zones/Front_door/open False
paradox/states/outputs/Gate/on False

La parte dopo partitions/, zones/ e outputs/ è la chiave. Le chiavi distinguono maiuscole e minuscole.

Parametri di importazione

Parametro di importazioneDescrizionePredefinito
Indirizzo del broker MQTTtaphome.mqtt.broker.local per il broker integrato in TapHome, oppure l’indirizzo di un altro brokertaphome.mqtt.broker.local
Porta del broker MQTTPorta del broker1883
Nome utente e password del broker MQTTL’account del broker(vuoto)
Topic di base di PAIMQTT_BASE_TOPIC di PAIparadox
Chiave della partizioneChiave della partizioneArea_1
Chiavi delle zone 1–4Chiavi di quattro zoneZone_1 … Zone_4
Chiave dell’uscita PGMChiave di un’uscita PGMPGM_1

Per altre partizioni o zone, importa di nuovo il template con altre chiavi ed elimina i dispositivi che non ti servono.

Funzionalità dei dispositivi

Partizione

Mostra lo stato della partizione e la inserisce o la disinserisce.

StatoPAI current_stateQuando selezionato in TapHome
Disinseritodisarmedinvia disarm
Inseritoarmed_awayinvia arm
Inserito Stayarmed_homeinvia arm_stay
Inserito Sleeparmed_nightinvia arm_sleep (solo SP e MG)
Inserimentoarming (ritardo di uscita)non invia nulla
Allarmetriggerednon invia nulla

I comandi vengono pubblicati su paradox/control/partitions/<key> senza il flag retain, come richiede PAI. Inserimento e Allarme sono stati segnalati dalla centrale e non inviano mai un comando. All’avvio del TapHome Core, la partizione prende il suo stato dal messaggio conservato (retained) di PAI e non invia nulla.

Zone 1–4

Ogni zona mostra se è aperta o chiusa. Gli avvisi compaiono quando la zona è in allarme, manomessa o esclusa, oppure quando una zona senza fili ha la batteria scarica. Ogni avviso resta finché PAI non segnala che lo stato è cessato.

Uscita PGM

Accende o spegne un’uscita PGM della centrale e ne mostra lo stato. Se una PGM può essere comandata dipende dalla centrale e da come l’ha programmata l’installatore. All’avvio del TapHome Core, la PGM prende il suo stato da PAI e non viene commutata.

Modulo

Il modulo mostra un errore quando PAI si segnala offline (paradox/interface/availability), ad esempio quando PAI ha perso il collegamento con la centrale o si è fermato.

Senza PAI

Un’uscita PGM della centrale collegata a un ingresso TapHome (inserito, allarme) e un relè TapHome collegato a una zona a chiave della centrale funzionano con ogni centrale Paradox, con meno stati e senza i dettagli delle zone.

Risoluzione dei problemi

Nessuno stato in TapHome

Verifica che PAI sia in funzione e pubblichi (mosquitto_sub … -t 'paradox/#'), che il topic di base e le chiavi corrispondano esattamente e che in PAI sia attivo MQTT_RETAIN.

L’inserimento non fa nulla

Verifica che PAI e TapHome usino lo stesso broker e leggi in paradox/interface/command_status la risposta di PAI. Su EVO l’inserimento Sleep non è disponibile.

Errore del modulo “PAI reports offline”

PAI ha perso la centrale o si è fermato; consulta il log di PAI.

PAI non si collega alla centrale

Su SP5500+, SP6000+, SP7000+ e MG5050+ la porta seriale è bloccata — chiedi a Paradox il codice di sblocco oppure collegati tramite un IP150. Mentre PAI è collegato tramite un IP150, chiudi Insite Gold e BlueEye. Un IP150+ con firmware 6.x e un IP180 non consentono a PAI il collegamento locale.

Dispositivi disponibili

Bridge MQTT Paradox PAI Modulo
Variabili personalizzate
baseTopic (string)Topic di base di PAI (MQTT_BASE_TOPIC nella configurazione di PAI), predefinito paradox
Enter the same value as MQTT_BASE_TOPIC in the PAI configuration as the import parameter PAI base topic.

Paradox PAI MQTT Bridge

Listener
IF RECEIVEDMSG.TOPIC = baseTopic + "/interface/availability"
    paiStatus := TOSTRING(RECEIVEDMSG.PAYLOAD);
END
# PAI publishes availability as a retained message: offline = PAI lost the panel or stopped
IF paiStatus = "offline"
    ADDERROR(1, "PAI reports offline - no updates from the alarm panel. Check PAI and its connection to the panel.");
END
Partizione Interruttore multivalore

Stato di una partizione della centrale e suo inserimento o disinserimento; Inserimento e Allarme sono solo mostrati e non inviano nulla

enum string
Valori / Stati: Disinserito · Inserito · Inserito Stay · Inserito Sleep · Inserimento · Allarme
Variabile: partitionKey — Chiave della partizione come PAI la pubblica in paradox/states/partitions/<chiave>, ad esempio Area_1

Partizione

Lettura stato interruttore
RETURN(Mu);
Scrittura stato interruttore
# Only the four commands are sent. Arming and Alarm are states reported by the panel, never commands.
VAR cmd := SWITCH(Mu, 0, "disarm", 1, "arm", 2, "arm_stay", 3, "arm_sleep", "");
IF cmd != ""
    MQTTPUBLISH(baseTopic + "/control/partitions/" + partitionKey, cmd);
END
Listener
IF RECEIVEDMSG.TOPIC = baseTopic + "/states/partitions/" + partitionKey + "/current_state"
    VAR state := TOSTRING(RECEIVEDMSG.PAYLOAD);
    # PAI current_state: disarmed, arming (exit delay), armed_away, armed_home (stay), armed_night (sleep), triggered
    IF state = "disarmed"
        Mu := 0;
    ELSEIF state = "armed_away"
        Mu := 1;
    ELSEIF state = "armed_home"
        Mu := 2;
    ELSEIF state = "armed_night"
        Mu := 3;
    ELSEIF state = "arming"
        Mu := 4;
    ELSEIF state = "triggered"
        Mu := 5;
    END
END
Zona 1 Contatto reed Solo lettura

Stato di una zona della centrale (aperta o chiusa), con avvisi per allarme, manomissione, batteria scarica di una zona senza fili ed esclusione

boolean
Variabile: zoneKey — Chiave della zona come PAI la pubblica in paradox/states/zones/<chiave>, ad esempio Front_door

Zona 1

Lettura
RETURN(Rc);
Listener
VAR prefix := baseTopic + "/states/zones/" + zoneKey + "/";
VAR topic := RECEIVEDMSG.TOPIC;
IF INDEXOF(topic, prefix) = 0
    VAR payload := TOSTRING(RECEIVEDMSG.PAYLOAD);
    VAR isOn := IF(payload = "True" OR payload = "1", 1, 0);
    IF topic = prefix + "open"
        Rc := isOn;
    ELSEIF topic = prefix + "tamper"
        zoneTamper := isOn;
    ELSEIF topic = prefix + "rf_low_battery_trouble"
        zoneLowBattery := isOn;
    ELSEIF topic = prefix + "bypassed"
        zoneBypassed := isOn;
    ELSEIF topic = prefix + "alarm"
        zoneAlarm := isOn;
    END
END
# Warnings are rebuilt from the stored zone states on every message, so they stay until the panel clears them
IF zoneAlarm = 1
    ADDWARNING(1, "Zone in alarm");
END
IF zoneTamper = 1
    ADDWARNING(2, "Zone tampered");
END
IF zoneLowBattery = 1
    ADDWARNING(3, "Wireless zone: low battery");
END
IF zoneBypassed = 1
    ADDWARNING(4, "Zone bypassed");
END
Zona 2 Contatto reed Solo lettura

Stato di una zona della centrale (aperta o chiusa), con avvisi per allarme, manomissione, batteria scarica di una zona senza fili ed esclusione

boolean
Variabile: zoneKey — Chiave della zona come PAI la pubblica in paradox/states/zones/<chiave>, ad esempio Front_door

Zona 2

Lettura
RETURN(Rc);
Listener
VAR prefix := baseTopic + "/states/zones/" + zoneKey + "/";
VAR topic := RECEIVEDMSG.TOPIC;
IF INDEXOF(topic, prefix) = 0
    VAR payload := TOSTRING(RECEIVEDMSG.PAYLOAD);
    VAR isOn := IF(payload = "True" OR payload = "1", 1, 0);
    IF topic = prefix + "open"
        Rc := isOn;
    ELSEIF topic = prefix + "tamper"
        zoneTamper := isOn;
    ELSEIF topic = prefix + "rf_low_battery_trouble"
        zoneLowBattery := isOn;
    ELSEIF topic = prefix + "bypassed"
        zoneBypassed := isOn;
    ELSEIF topic = prefix + "alarm"
        zoneAlarm := isOn;
    END
END
# Warnings are rebuilt from the stored zone states on every message, so they stay until the panel clears them
IF zoneAlarm = 1
    ADDWARNING(1, "Zone in alarm");
END
IF zoneTamper = 1
    ADDWARNING(2, "Zone tampered");
END
IF zoneLowBattery = 1
    ADDWARNING(3, "Wireless zone: low battery");
END
IF zoneBypassed = 1
    ADDWARNING(4, "Zone bypassed");
END
Zona 3 Contatto reed Solo lettura

Stato di una zona della centrale (aperta o chiusa), con avvisi per allarme, manomissione, batteria scarica di una zona senza fili ed esclusione

boolean
Variabile: zoneKey — Chiave della zona come PAI la pubblica in paradox/states/zones/<chiave>, ad esempio Front_door

Zona 3

Lettura
RETURN(Rc);
Listener
VAR prefix := baseTopic + "/states/zones/" + zoneKey + "/";
VAR topic := RECEIVEDMSG.TOPIC;
IF INDEXOF(topic, prefix) = 0
    VAR payload := TOSTRING(RECEIVEDMSG.PAYLOAD);
    VAR isOn := IF(payload = "True" OR payload = "1", 1, 0);
    IF topic = prefix + "open"
        Rc := isOn;
    ELSEIF topic = prefix + "tamper"
        zoneTamper := isOn;
    ELSEIF topic = prefix + "rf_low_battery_trouble"
        zoneLowBattery := isOn;
    ELSEIF topic = prefix + "bypassed"
        zoneBypassed := isOn;
    ELSEIF topic = prefix + "alarm"
        zoneAlarm := isOn;
    END
END
# Warnings are rebuilt from the stored zone states on every message, so they stay until the panel clears them
IF zoneAlarm = 1
    ADDWARNING(1, "Zone in alarm");
END
IF zoneTamper = 1
    ADDWARNING(2, "Zone tampered");
END
IF zoneLowBattery = 1
    ADDWARNING(3, "Wireless zone: low battery");
END
IF zoneBypassed = 1
    ADDWARNING(4, "Zone bypassed");
END
Zona 4 Contatto reed Solo lettura

Stato di una zona della centrale (aperta o chiusa), con avvisi per allarme, manomissione, batteria scarica di una zona senza fili ed esclusione

boolean
Variabile: zoneKey — Chiave della zona come PAI la pubblica in paradox/states/zones/<chiave>, ad esempio Front_door

Zona 4

Lettura
RETURN(Rc);
Listener
VAR prefix := baseTopic + "/states/zones/" + zoneKey + "/";
VAR topic := RECEIVEDMSG.TOPIC;
IF INDEXOF(topic, prefix) = 0
    VAR payload := TOSTRING(RECEIVEDMSG.PAYLOAD);
    VAR isOn := IF(payload = "True" OR payload = "1", 1, 0);
    IF topic = prefix + "open"
        Rc := isOn;
    ELSEIF topic = prefix + "tamper"
        zoneTamper := isOn;
    ELSEIF topic = prefix + "rf_low_battery_trouble"
        zoneLowBattery := isOn;
    ELSEIF topic = prefix + "bypassed"
        zoneBypassed := isOn;
    ELSEIF topic = prefix + "alarm"
        zoneAlarm := isOn;
    END
END
# Warnings are rebuilt from the stored zone states on every message, so they stay until the panel clears them
IF zoneAlarm = 1
    ADDWARNING(1, "Zone in alarm");
END
IF zoneTamper = 1
    ADDWARNING(2, "Zone tampered");
END
IF zoneLowBattery = 1
    ADDWARNING(3, "Wireless zone: low battery");
END
IF zoneBypassed = 1
    ADDWARNING(4, "Zone bypassed");
END
Uscita PGM Interruttore

Accende o spegne un'uscita programmabile (PGM) della centrale e ne mostra lo stato

boolean
Valori / Stati: ON · OFF
Variabile: outputKey — Chiave dell'uscita PGM come PAI la pubblica in paradox/states/outputs/<chiave>

Uscita PGM

Lettura stato interruttore
RETURN(St);
Scrittura stato interruttore
MQTTPUBLISH(baseTopic + "/control/outputs/" + outputKey, IF(St = 1, "on", "off"));
Listener
IF RECEIVEDMSG.TOPIC = baseTopic + "/states/outputs/" + outputKey + "/on"
    VAR payload := TOSTRING(RECEIVEDMSG.PAYLOAD);
    St := IF(payload = "True" OR payload = "1", 1, 0);
END
Connessione: Packet Parser → MQTT
Possibili miglioramenti (6)
  • Zone bypass control — The template shows the bypass state of a zone as a warning but does not bypass a zone.
  • Force arming and EVO instant arming — arm_instant exists on EVO panels only; EVO has no Sleep arming, so Armed Sleep does nothing there.
  • Panic alarms — Left out on purpose: a panic command triggers a real alarm report.
  • System trouble flags — Trouble flags of the panel that PAI publishes under states/system/troubles.
  • Event stream — Live panel events PAI publishes as JSON when MQTT_PUBLISH_RAW_EVENTS is on.
  • More partitions, zones and PGM outputs — The template has one partition, four zones and one PGM. Import it again with other keys for more.

Fonti

  • PAI — Paradox Alarm Interface, project README (version 3.8.1)
    github.com 2026-11-04
  • PAI wiki — MQTT Interface (topics, states, control commands)
    github.com 2026-11-04
  • PAI — example configuration pai.conf.example
  • PAI wiki — Compatibility (panels, firmware, connections)
    github.com 2026-11-04
  • PAI wiki — Connection methods (serial, IP150, ESP32 bridge)
    github.com 2026-11-04

Hai trovato un problema con questo template?

Dicci cosa non funziona, cosa manca o come dovrebbe comportarsi il template. Il tuo feedback ci aiuta a mantenere il catalogo accurato.

Community — non revisionato

Vuoi usarlo nel tuo TapHome Core?

Apri questo template nel Customer Portal per applicarlo a una delle tue case, o crea una proposta di modifica e inviala al catalogo.

Apri nel portale