Skip to main content
This page covers the core configuration keys for logging, panel communication, and runtime behavior. For restricting which resources PAI monitors, see Resource limits.

Logging

LOGGING_LEVEL_CONSOLE
int
default:"20"
Logging level for console output. Uses standard Python logging module levels: DEBUG=10, INFO=20, WARNING=30, ERROR=40, CRITICAL=50.
LOGGING_LEVEL_FILE
int
default:"40"
Logging level for file output. Only used when LOGGING_FILE is set. Uses the same integer levels as LOGGING_LEVEL_CONSOLE.
LOGGING_FILE
string | null
default:"null"
Path to the log file. Set to None to disable file logging. Example: '/var/log/paradox.log'.
LOGGING_FILE_MAX_SIZE
int
default:"10"
Maximum size of the log file in megabytes before it is rotated. Valid range: 0 to 4294967295.
LOGGING_FILE_MAX_FILES
int
default:"2"
Number of rotated log files to keep. Valid range: 0 to 4294967295.
LOGGING_DUMP_PACKETS
boolean
default:"false"
Log raw packets to the log output. Useful for low-level debugging of serial or IP communication.
LOGGING_DUMP_MESSAGES
boolean
default:"false"
Log decoded messages to the log output.
LOGGING_DUMP_STATUS
boolean
default:"false"
Log panel status updates to the log output.
LOGGING_DUMP_EVENTS
boolean
default:"false"
Log detailed event information to the log output.
Enable LOGGING_DUMP_PACKETS and LOGGING_DUMP_MESSAGES together when diagnosing communication issues with a panel. Avoid leaving them enabled in production as they produce high log volume.

Panel behavior

PASSWORD
string | int | bytes | null
default:"null"
PC password for the alarm panel. Set to None if the panel has no PC password configured. The password is a 4-digit hex value found in Babyware under: right-click panel → Properties → PC Communication (Babyware) tab.Example: PASSWORD = '0000'
KEEP_ALIVE_INTERVAL
int
default:"10"
Interval in seconds between status update requests sent to the panel. Lowering this increases responsiveness but also communication overhead.
IO_TIMEOUT
float
default:"0.5"
Timeout in seconds for individual I/O operations. Increase this if you experience timeout errors on slow or unreliable connections.
LABEL_ENCODING
string
default:"'paradox-en'"
Character encoding used when decoding zone, partition, and user labels from the panel. Use paradox-* encodings for Paradox panels, or any standard Python codec name from the Python codecs documentation.
LABEL_REFRESH_INTERVAL
int
default:"900"
Interval in seconds between full label refreshes from the panel. Defaults to 15 * 60 (15 minutes). Valid range: 0 to 4294967295.
OUTPUT_PULSE_DURATION
float
default:"1"
Duration in seconds of a PGM output pulse when a pulse command is issued. Valid range: 0 to 4294967295.

Time synchronization

SYNC_TIME
boolean
default:"false"
When enabled, PAI periodically synchronizes the panel clock when it drifts beyond SYNC_TIME_MIN_DRIFT seconds.
SYNC_TIME_MIN_DRIFT
int
default:"120"
Minimum clock drift in seconds before a time sync is triggered. Minimum allowed value is 120. Valid range: 120 to 4294967295.
SYNC_TIME_TIMEZONE
string
default:"''"
Timezone to use when synchronizing the panel clock. When empty, the PAI host system timezone is used. Accepts standard IANA timezone names such as 'Europe/London' or 'America/New_York'.

Power monitoring

POWER_UPDATE_INTERVAL
int
default:"60"
Interval in seconds between updates of the battery, DC, and VDC voltage readings from the panel. Valid range: 0 to 4294967295.
PUSH_POWER_UPDATE_WITHOUT_CHANGE
boolean
default:"true"
When True, PAI always publishes power readings to interfaces even if the values have not changed since the last update.
PUSH_UPDATE_WITHOUT_CHANGE
boolean
default:"false"
When True, PAI publishes all state updates to interfaces even when the state has not changed. This applies to all resource types, not just power. Enabling this can produce significant additional traffic.

Example

pai.conf
import logging

# Logging
LOGGING_LEVEL_CONSOLE = logging.INFO
LOGGING_LEVEL_FILE = logging.ERROR
LOGGING_FILE = '/var/log/paradox.log'
LOGGING_FILE_MAX_SIZE = 10
LOGGING_FILE_MAX_FILES = 2

# Panel
PASSWORD = '0000'
KEEP_ALIVE_INTERVAL = 10
IO_TIMEOUT = 0.5
LABEL_ENCODING = 'paradox-en'
LABEL_REFRESH_INTERVAL = 15 * 60
OUTPUT_PULSE_DURATION = 1

# Time sync
SYNC_TIME = True
SYNC_TIME_MIN_DRIFT = 120
SYNC_TIME_TIMEZONE = 'Europe/London'

# Power
POWER_UPDATE_INTERVAL = 60
PUSH_POWER_UPDATE_WITHOUT_CHANGE = True
PUSH_UPDATE_WITHOUT_CHANGE = False

Build docs developers (and LLMs) love