SIA-Server is a lightweight, self-hosted Python service that receives SIA protocol messages from Honeywell Galaxy Flex alarm systems and forwards them as prioritized push notifications to your phone or computer.
It was created as a replacement for the discontinued free Honeywell push notification service, allowing users to regain full control over their alarm alerts without ongoing subscription costs.
Notifications are delivered via ntfy.sh — a free, open-source push notification service. Just install the ntfy app on your phone (Android/iOS), subscribe to a topic, and you're done. No account, no registration, no subscription required.
This project was developed and tested on a Honeywell Galaxy Flex 20. It is likely compatible with other Honeywell Galaxy panels, but this has not been verified.
If your Galaxy Flex notifications suddenly stopped working, or you are looking for a simple self-hosted alternative without installing a full home automation ecosystem, this project is for you.
IMPORTANT SECURITY NOTICE By default, the communication between the alarm panel and this server is unencrypted. This server is designed to be run on a trusted local network only. Please read the full Security & Privacy Guidelines before installation.
- Self-Hosted: Runs on any local Windows or Linux machine (like a Raspberry Pi), or in a Docker container.
- Real-time Notifications: Instantly forwards alarm events to your devices.
- Prioritized Alerts: Uses ntfy.sh priorities to distinguish between urgent alarms and routine events.
- Advanced Notification Routing: Route notifications for different accounts to different ntfy.sh topics, each with its own optional authentication (Bearer Token or User/Pass).
- Robust Protocol Handling: Correctly parses the multi-message protocol used by Galaxy Flex panels.
- Broad SIA Level Support: The flexible parser can correctly handle event data from SIA Levels 0, 1, 2, and 3.
- Optional Heartbeat Server: Includes an optional server to handle the proprietary Honeywell "IP Check" heartbeat, with connection watchdog monitoring that sends notifications when a panel stops sending heartbeats.
- Connection Security Policies: Per-account
ENABLEDpolicy (Yes/No/Secure) and a configurableREJECT_POLICY(respond/drop) to control how invalid connections are handled. - Protocol State Machine: Enforces correct SIA message ordering. Any connection that does not start with a valid
ACCOUNT_IDis immediately rejected or silently dropped. - Character Encoding Fixes: Decodes the proprietary character set used by Galaxy panels (e.g., Å, Ä, Ö).
- Highly Configurable: Most user settings are in a simple
sia-server.conffile, with advanced protocol constants located in thegalaxy/directory.
- A Honeywell Galaxy Flex alarm system with an Ethernet module (e.g., A083-00-10 or E080-4).
- A Linux or Windows machine on the same network as the alarm system (a Raspberry Pi running Raspberry Pi OS is perfect).
- Python 3.
- The
python3-requestspackage and the optionalpython3-uvlooppackage (for Linux).
The project is structured to separate the server logic, protocol parsing, and configuration.
.
├── sia-server.py # The main server application
├── sia-server.conf # Main user configuration file.
├── configuration.py # Loads and validates all configuration.
├── notification.py # Handles formatting and sending of notifications.
├── ip_check.py # Optional subprocess for answering heartbeats.
├── sia_server_tester.py # Test client for sending SIA packets to the server.
├── Dockerfile # Docker container definition for portable deployment.
├── docker-compose.yml # Docker Compose configuration for easy container management.
├── README.md # This file.
├── PanelSetup.md # Panel Configuration help.
├── requirements.txt # Required python packages.
├── galaxy/
│ ├── __init__.py
│ ├── README.md # Technical description of the protocol.
│ ├── parser.py # Handles parsing of the Galaxy SIA protocol.
│ └── constants.py # Constants used in the SIA protocol.
└── asuswrt-merlin/
├── README.md # Install instructions for Asuswrt-Merlin.
├── S99siaserver # Entware service (init.d) file.
└── check-sia.sh # Watchdog script for Entware service.
This guide will walk you through the five main steps to get your server running.
The recommended way is to download the latest stable release.
- Go to the Releases page on GitHub.
- Under the latest release, download the
Source code (zip)file. - Unzip the file to your chosen directory (e.g.,
/home/pi/Scripts/sia-serveron Linux orC:\siaserveron Windows).
For Developers: Cloning with Git
If you want the latest development code, you can clone the repository directly:
git clone https://github.com/ZebMcKayhan/SIA-Server.git sia-server
cd sia-serverThis server requires Python 3. The installation steps are different for Linux and Windows.
- Install Python (if needed): Most modern Linux systems come with Python 3 pre-installed. You can check with
python3 --version. If you need to install itsudo apt update sudo apt install python3
- Install Dependencies: Use
aptto install the required packages.uvloopis an optional performance enhancement.sudo apt update sudo apt install python3-requests python3-uvloop
- Install Python: Download and install the latest Python 3 from the official Python website. Important: During installation, make sure to check the box that says "Add Python to PATH".
- Install Dependencies: Open a PowerShell or Command Prompt. It is strongly recommended to use
python -m pipto ensure you are installing packages for the correct Python interpreter.python -m pip install requests pyopensslNote: The extra package
pyopensslare optional but recommended to avoid potential HTTPS/SSL errors when sending notifications from Windows.
Before configuring the server, get the ntfy.sh app on your phone or computer.
- Follow the instructions at the ntfy.sh documentation to get the app.
- Inside the app, subscribe to a new topic. Choose a long, random, unguessable name for your topic to keep it private (e.g.,
alarm-skUHvisapP2J382MDI2). - You will use the full URL of this topic (e.g.,
https://ntfy.sh/alarm-skUHvisapP2J382MDI2) in the configuration file.
Log into your Galaxy Flex panel's installer menu and configure the Ethernet module. The numbers in parentheses are the menu codes for a Galaxy Flex 20.
- ARC IP Address: The IP of the machine running
sia-server.py(e.g.,192.168.128.10). (Menu56.1.1.1.4.1) - ARC Port: The port for the
[SIA-Server]and optionally the[IP-Check]server. (Menu56.1.1.1.4.1) - Protocol: SIA. Levels 0-3 are supported; Level 3 is recommended for the most detail. (Menu
56.1.1.1.4.2) - Account Number: Your 4 or 6-digit alarm account number. SIA Level 3 requires 6 digits. (Menu
56.1.2.1.1) - Encryption: Set to Off unless you have
galaxy/encryption.pyinstalled. (Menu56.3.3.5) - IP-Check: (Optional) To use the heartbeat feature, enable it by setting a time interval (e.g., 00:30 for 30 minutes).
00:00means disabled. (Menu56.3.3.7.1) - Eng. Test: Use this to send a test notification without generating a fault. (Menu
56.7.1)
Edit the sia-server.conf file to match your setup. The file is pre-populated with examples to guide you.
# On Linux
nano /path/to/your/sia-server/sia-server.confOn Windows, simply edit the file with a text editor like Notepad.
For most users, only three things need to be changed in sia-server.conf:
- Your account number and ntfy.sh topic — Add a section with your panel's account number and your ntfy.sh topic URL.
- Port numbers — Match the ports you configured on the alarm panel.
- Logging — Choose
Screenfor testing, orFilewith a path for permanent use.
Everything else works out of the box with sensible defaults.
Configuration Explained
The primary configuration is done in sia-server.conf. This file is designed to be user-friendly and not sensitive to Python syntax. Advanced, technical constants are located in galaxy/constants.py.
-
Site Sections (
[012345]): Each site is defined by a section where the header is the panel's unique Account Number.SITE_NAME: A friendly name for the site (e.g., "Main House"). If omitted, the account number is used.ENABLED: Controls the connection policy for this account. AcceptsYes,No, orSecure.Yes— Accept all connections to this account (default).No— Reject all connections from this account.Secure— Only accept encrypted connections. Plaintext connections will be rejected. You will need to supplygalaxy/encryption.pyto enable encryption.
NTFY_ENABLED,NTFY_TOPIC,NTFY_TITLE: Configure notification delivery for this site.NTFY_AUTH: Set toNone,Token, orUserpassfor private topics and provide the correspondingNTFY_TOKENorNTFY_USER/NTFY_PASSkeys.
-
[Default]Section: A special section for events from account numbers not specifically listed. -
[SIA-Server]Section: Configure the ports and addresses for the main server.REJECT_POLICY: Controls how invalid or unauthorised connections are handled. Acceptsrespondordrop.respond— Send a SIA REJECT frame to the client (default).drop— Silently close the connection without sending anything.
-
[IP-Check]Section: Configure the ports and addresses for the optional heartbeat server.Note: The IP Check server validates all incoming heartbeat packets before responding. It verifies the packet length and header. Invalid packets are dropped.
WATCHDOG_THRESHOLD: Controls how many missed pings trigger a lost-connection notification.2.1means 2 missed pings + 10% buffer. Set to0to disable watchdog alerts entirely.WATCHDOG_LOST_PRIO/WATCHDOG_RESTORE_PRIO: The ntfy.sh priority (1-5) for lost and restored connection notifications respectively.
-
[Logging]Section: Control the log level and output destination.LOG_LEVEL: Set the verbosity of logs (DEBUG,INFO,WARNING,ERROR).INFOis recommended for normal use.LOG_TO: ChooseScreen,File, orSyslog.Screenis best for manual testing and standardsystemdservices.Fileis best for creating a dedicated log file (e.g., on Windows or forcronjobs).
- File-Specific Settings:
LOG_FILE,LOG_MAX_MB, andLOG_BACKUP_COUNTare only used whenLOG_TO = File.
Advanced Logging: Using LOG_TO = Syslog
Setting LOG_TO = Syslog integrates the server's logging with the native operating system logger. This is an advanced option recommended for embedded systems like routers.
-
Log Format: When using
Syslog, the server uses a simpler log format (SIA-Server: LEVEL - Message) because thesyslogservice adds its own timestamps and hostname. -
On Linux/Unix Systems:
- The server will attempt to write to the standard
/dev/logsocket. - For non-standard systems, you can specify a different path with the optional
SYSLOG_SOCKETkey. - You can also change the
syslog"facility" (which controls how the systemsyslogdcategorizes the messages) using the optionalSYSLOG_FACILITYkey. Common values aredaemonorlocal0throughlocal7. This can be useful for tailoring log filtering rules on your specific system.
- The server will attempt to write to the standard
-
On Windows Systems:
- This will log messages to the Windows Event Log under the "Application" section with the source name "SIA-Server".
- Dependencies: This feature requires the
pywin32package. You must install it from an Administrator prompt:python -m pip install pywin32. - Permissions: The very first time you run the server with this option, it must be run as an Administrator to register the "SIA-Server" source in the Windows Registry. After that, it can be run as a normal user.
- If either the dependency is missing or the registration fails due to permissions, the server will print a clear warning and automatically fall back to logging to the screen.
[Notification]Section: Configures the server's resilient retry queue for handling network outages.MAX_QUE_SIZE,MAX_RETRIES,MAX_RETRY_TIMEcontrol the queue and retry behavior.PRIORITY_1throughPRIORITY_5: Assign SIA Event Codes to different priority levels.DEFAULT_PRIORITY: The priority to use for any unlisted event code.
Note: It's convenient to set
LOG_TO = Screeninsia-server.confto see live events in your terminal.
cd /path/to/your/sia-server
python3 sia-server.pyPress Ctrl+C to stop.
By default, the server looks for sia-server.conf in the current directory.
You can specify a different path using the --config argument:
python3 sia-server.py --config /path/to/your/sia-server.conf
Note: Set
LOG_TO = Fileinsia-server.confto keep a persistent log.
- Create the Service File:
sudo nano /etc/systemd/system/sia-server.service - Paste this content, changing the paths in
WorkingDirectoryandExecStart.[Unit] Description=Galaxy SIA Alarm Server After=network.target [Service] Type=simple User=pi WorkingDirectory=/home/pi/Scripts/sia-server ExecStart=/usr/bin/python3 /home/pi/Scripts/sia-server/sia-server.py Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target
Note: You may need to add firewall rules (e.g., via
ExecStartPre=&ExecStopPost=). If your firewall commands require root, you may need to remove or comment out theUser=pidirective. - Enable and Start:
sudo systemctl daemon-reload sudo systemctl enable sia-server.service sudo systemctl start sia-server.service - Manage:
- Check status & recent logs:
sudo systemctl status sia-server.service - Stop the service:
sudo systemctl stop sia-server.service - Start the service:
sudo systemctl start sia-server.service - Restart the service:
sudo systemctl restart sia-server.service - View live logs:
journalctl -u sia-server.service -f(if not logging to a file) ortail -f /path/to/your/log/file.log(if logging to a file).
- Check status & recent logs:
Note: Set
LOG_TO = Screeninsia-server.confto see live events.
cd C:\path\to\your\sia-server
python sia-server.pyNote: If your network setting is set to public, instead of private, you may need to add a rule windows firewall to accept inbound connections on the port (i.e. 10000) you are using. Search online how to do this for your windows version.
Press Ctrl+C to stop.
By default, the server looks for sia-server.conf in the current directory.
You can specify a different path using the --config argument:
python sia-server.py --config C:\path\to\your\sia-server.conf
Note: Set
LOG_TO = Fileinsia-server.confto keep a persistent log.
- Download NSSM.
- Open a Command Prompt as an Administrator.
- Run the installer:
C:\path\to\nssm.exe install SIA-Server - In the GUI that pops up:
- Path: Browse to your Python executable (e.g.,
C:\Python312\python.exe). - Startup directory: Browse to your script folder.
- Arguments:
sia-server.py
- Path: Browse to your Python executable (e.g.,
- Click Install service. You can now manage it from the Windows Services app (
services.msc).
- Docker and Docker Compose installed on your machine.
- Place your configured
sia-server.confin the same directory asdocker-compose.yml. - Check that the ports in
docker-compose.ymlmatch the ports configured insia-server.conf:
ports:
- "10000:10000" # Must match [SIA-Server] LISTEN_PORT
- "10001:10001" # Must match [IP-Check] LISTEN_PORT- Build and start the container:
docker compose up -d- The server is now running. To verify:
docker compose psdocker compose logs -fdocker compose downBy default the server logs to screen, which is captured by Docker and visible via docker compose logs.
If you prefer a persistent log file, set the following in sia-server.conf:
LOG_TO = File
LOG_FILE = /logs/sia-server.logThe log file will appear as ./logs/sia-server.log on the host machine.
The ./logs directory will be created automatically by Docker if it does not exist.
By default the container runs in UTC. Set your local timezone in docker-compose.yml:
environment:
- TZ=Europe/London # Change to your local timezonePlease read these guidelines carefully.
1. Local Network Communication (Panel to Server)
The communication between your alarm panel and this server is unencrypted. Run it on a trusted local network (LAN).
Warning: Do not expose the server's listening ports directly to the public internet. If you must, use a VPN (e.g., WireGuard).
2. Notification Privacy (Server to ntfy.sh)
- Transport Security: Communication to
ntfy.shuses HTTPS and is secure. - Topic Privacy: ntfy.sh topics are public by default. To secure them:
- Use a long, unguessable topic name.
- Consider a generic Site Name that cannot be linked to your address.
- Alternatively: Subscribe to NTFY.sh PRO to setup private channels with authentication. This server fully supports authentication via the
NTFY_AUTHsettings. - Alternatively: Host NTFY yourself to be able to setup private channels free of charge (Requires a machine with public ip)
Disclaimer: You are ultimately responsible for securing your own setup.
Looking for a fully containerized setup with Apprise notification routing and MQTT integration? @claesmathias maintains a fork of this project with Docker Compose, Apprise and Mosquitto pre-configured.
- This project was developed through a collaborative effort with Anthropic's AI assistant, Claude.
- The initial socket server structure was inspired by the nimnull/sia-server project.
- Some protocol information was found in dklemm/FlexSIA2MQTT project.
sia_server_tester.pywas contributed by @claesmathias.
This project is licensed under the MIT License.