A real-time web portal for monitoring and controlling DSC PowerSeries NEO alarm panels via the ITv2 (TLink) protocol. Built with Blazor Server, MudBlazor, and MediatR.
| Registry | Image | Pull Command |
|---|---|---|
| GitHub Container Registry | ghcr.io/brianhumlicek/neohub |
docker pull ghcr.io/brianhumlicek/NeoHub:latest |
| Docker Hub | brianhumlicek/neohub |
docker pull brianhumlicek/NeoHub:latest |
- Clone the repository (or download the
docker-compose.yml):
git clone https://github.com/BrianHumlicek/NeoHub.git
cd NeoHub
docker-compose.yml
version: '3.8'
services:
neohub:
image: ghcr.io/brianhumlicek/neohub:latest
container_name: neohub
ports:
- "8080:5181"
- "8443:8181"
- "3072:3072"
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://+:8080
- EnableHttps=false
volumes:
- ./persist:/app/persist
restart: unless-stoppedAlternatively, you can run the container directly using the Docker CLI:
docker run -d --name neohub \
-p 8080:5181 \
-p 8443:8181 \
-p 3072:3072 \
-e ASPNETCORE_ENVIRONMENT=Production \
-e ASPNETCORE_URLS=http://+:8080 \
-e EnableHttps=false \
-v ./persist:/app/persist \
ghcr.io/brianhumlicek/neohub:latest
- Start the container:
docker-compose up -d
-
Verify the UI is accessible at
http://localhost:8080β you should see the Connections page: -
Gather the information needed for panel programming (see Before You Begin)
Before configuring NeoHub, your DSC PowerSeries NEO panel must be programmed to connect to your NeoHub server. All programming is done in Installer Mode.
Before opening the panel keypad, gather the following information and have something to write with β you will need to record values from the panel during programming.
- Installer Code β The default is
5555. If that doesn't work, contact whoever originally commissioned the panel. A factory reset will restore the default, but will erase all existing programming and may disrupt any monitoring services currently connected to the panel. - NeoHub server IP address β The IP address of the machine running NeoHub, reachable from the panel's network.
- NeoHub listen port β Default is
3072. Only needed if you changed it. - Existing integrations β Determine if any integration slots are already in use (e.g., Alarm.com, NEO Go, or other monitoring services). You will need to choose an unused slot to avoid disrupting existing services. If you are unsure, your monitoring provider or installer can tell you.
- Firmware version β The instructions below are written for firmware v5.0+. Communicator boards with older firmware (e.g., v4.1) use different subsection numbers and a different configuration process. If your panel has firmware prior to v5.0, see Firmware v4.1 Configuration instead.
Have a place to write down these values β you will enter them into NeoHub's Settings page after programming:
- Integration ID (
[851][422]) β A 12-digit read-only identifier unique to your panel - Type 2 Access Code β The 32-character hex key you program for your chosen integration slot (only if you change it from the default)
Once you have the information above and a way to write down settings from the panel, go to your alarm keypad.
-
Enter Installer Configuration: Press
*8followed by your Installer Code (e.g.,*85555for the default) -
Navigate to the Alt Communicator section: Enter
851 -
Read the Integration ID (
[422]):- Enter subsection
422 - The display will show the first 6 digits of your Integration ID β use the right arrow to scroll and reveal the remaining 6 digits (scrolling past the end will exit the subsection)
- Write down all 12 digits and label it Integration Identification Number
[851][422]
- Enter subsection
-
Choose your integration group:
The panel supports 4 integration groups, each allowing a separate integration server (e.g., Alarm.com, NEO Go, NeoHub) to be configured independently. All groups share the same Integration ID (
[422]), but every other subsection has its own copy per group. The subsection numbers for each group are offset by 27:Parameter Group 1 Group 2 Group 3 Group 4 Type 1 Access Code 423450477504Integration Options 425452479506Polling / Notifications 426453480507Server IP Address 428455482509Server Port 429456483510Type 2 Access Code 700701702703β οΈ If you have a third-party service (e.g., Alarm.com) already configured on your panel, it is using one of these groups. Do not overwrite its settings. Pick an unused group for NeoHub. If you are unsure which groups are in use, navigate to each group's Server IP subsection (e.g.,428,455,482,509) β a non-zero IP address means that group is in use. Write down any existing values before making changes so you can restore them if needed.The remaining steps use Group 1 subsection numbers. If you are using a different group, substitute the corresponding subsection number from the table above.
-
Configure integration options (
[425,452,479,506]):- Enter subsection
425(or the corresponding subsection for your group) - This controls encryption type and connection method for your integration slot
- Ensure bits 3, 4, and 5 are set, and all other bits are clear
- Toggle a bit by pressing its number on the keypad β the display should read
--345---when correct - Press
#to save and return to the subsection menu
- Enter subsection
-
Configure polling and notification options (
[426,453,480,507]):- Enter subsection
426(or the corresponding subsection for your group) - This controls integration polling method, real-time notification enablement, and notification port selection
- Ensure only bit 3 is set β the display should read
--3----- - Press
#to save and return to the subsection menu
- Enter subsection
-
Set the Integration Server IP address (
[428,455,482,509]):- Enter subsection
428(or the corresponding subsection for your group) - Enter the IP address of your NeoHub server, 3 digits at a time, using the right arrow to advance to the next octet (e.g., for
192.168.1.100enter192β βΆ β168β βΆ β001β βΆ β100) - Press
#to save and return to the subsection menu
- Enter subsection
-
Set the Integration Server port (
[429,456,483,510]):- Enter subsection
429(or the corresponding subsection for your group) - This sets the port of the NeoHub server in hexadecimal β the default is
0C00(3072 in decimal) - If you haven't changed the listen port in NeoHub, the default should already be correct
- Press
#to save and return to the subsection menu
- Enter subsection
-
Set the Type 2 Access Code (
[700,701,702,703]):- Enter subsection
700(or the corresponding subsection for your group) - This is a 32-character hex key used to encrypt traffic between the panel and NeoHub server
- The factory default is
12345678123456781234567812345678β NeoHub will connect automatically if this is left unchanged - The value is entered 8 characters at a time, using the right arrow to advance through all 32 characters
- If you want to change it, be sure to write down the full 32-character value β you will need it when configuring the NeoHub server
- Press
#to save and return to the subsection menu
- Enter subsection
-
Exit Installer Mode: Press
*99
β οΈ Critical: The values you recorded from the panel (Integration ID and Type 2 Access Code) must exactly match what you enter into NeoHub's Settings page. If any value is wrong, the panel will not connect.
β οΈ This firmware version is still under testing. The subsection numbers differ from v5.0+.
| Subsection | Description | Notes |
|---|---|---|
[851][001] |
Panel Static IP address | |
[851][002] |
Panel Subnet mask | |
[851][003] |
Panel Gateway | |
[851][651] |
Panel Integration ID | Read-only |
[851][652] |
Access code | Default: 12345678 |
[851][664] |
Options | Keep only option 3 on |
[851][693] |
NeoHub server address | |
[851][697] |
DNS name | Clear this field (optional) |
[851][999] |
Restart | Enter 55 to restart |
NeoHub settings for v4.1:
- Only the Type 1 Access Code is needed (from
[851][652]) - Integration ID (from
[851][651]) - Server port
Once the panel has been configured, return to the NeoHub web UI. If everything is working, you should see a new connection appear on the Connections page.
- If you left the default access codes unchanged, NeoHub will automatically connect and create settings for that connection β no further action is needed.
- If you changed the Type 2 Access Code, NeoHub will detect the connection but prompt you to update the access code. Navigate to the connection's settings, enter the Type 2 Access Code you recorded, and save. Once saved, the panel should connect successfully.
### Key Components
- **DSC.TLink** β Protocol library (ITv2 framing, encryption, session management)
- **MediatR** β Decouples panel messages from business logic via notification handlers
- **Notification Handlers** β Transform panel notifications into application state
- **State Services** β Singleton stores for partition/zone status
- **Event-Driven UI** β Blazor components subscribe to state change events (zero polling)
---
## π Web UI
| Page | Route | Description |
|---|---|---|
| **Home** | `/` | Dashboard showing all partitions and zones |
| **Zone Details** | `/zones/{sessionId}/{partition}` | Detailed view of zones for a specific partition |
| **Settings** | `/settings` | Edit application configuration (auto-saved to `userSettings.json`) |
### Features
- β
**Real-time updates** β UI refreshes instantly when zones open/close
- β
**Multi-session support** β Monitor multiple panels simultaneously
- β
**Visual zone indicators** β Color-coded chips with status icons
- β
**Event-driven architecture** β No polling, all updates triggered by actual panel events
- β
**Responsive design** β Works on desktop, tablet, and mobile
---
## π Ports
| Port | Protocol | Purpose |
|---|---|---|
| `5181` | HTTP | Web UI |
| `7013` | HTTPS | Web UI (secure) |
| `3072` | TCP | Panel ITv2 connection (configurable) |
---
## π οΈ Building from Source
### Prerequisites
- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0)
### Local Development
For more details about the DSC ITv2 (TLink) protocol, see:
- DSC TLink Library (underlying protocol implementation)
- DSC Integration Guide (consult your dealer/integrator documentation)
- Verify network connectivity:
ping <panel-ip>andping <server-ip>(from panel side if accessible) - Check firewall rules allow TCP port
3072(or your configuredListenPort) - Verify panel is programmed with correct IP address and port
- Check Docker logs:
docker logs NeoHub
- The panel has connected but hasn't sent partition status yet
- This is normal on first connection β wait a few seconds
- Partition status is broadcast automatically by the panel every few minutes
- Verify the Integration ID, Type 1, and Type 2 codes in
userSettings.jsonexactly match the panel programming - Type 2 code is case-sensitive hex (A-F must match)
---
## π€ Contributing
Issues and pull requests are welcome! For major changes, please open an issue first to discuss the proposed changes.
---
## π Acknowledgements
Built with:
- [Blazor](https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor) β .NET web framework
- [MudBlazor](https://mudblazor.com/) β Material Design component library
- [MediatR](https://github.com/jbogard/MediatR) β In-process messaging
- [DSC TLink](https://github.com/BrianHumlicek/DSC-TLink) β ITv2 protocol library
