Connect your building automation system to Home Assistant — no YAML, no hassle.
Monitor sensors, control outputs, and automate your BACnet/IP devices through a simple GUI.
HACS Compatible · GUI-only setup · Real-time COV updates · ASHRAE 135 compliant
This custom integration lets Home Assistant talk to BACnet/IP devices — the protocol used in professional building automation for HVAC, lighting, access control, and energy management.
In plain terms: if your building has BACnet controllers, thermostats, sensors, or actuators, this integration brings them into Home Assistant so you can monitor and control them from your dashboard, automations, and scripts.
No YAML configuration required. Everything is set up through the Home Assistant GUI.
- Three-step setup wizard — network → discover devices → select objects
- Automatic device discovery — finds BACnet devices on your network via Who-Is / I-Am
- Cross-subnet support — reach devices on other VLANs through BBMD / Foreign Device Registration
- Real-time updates via COV — Change of Value subscriptions for instant state changes, with automatic polling fallback
- Configurable COV increment — control how sensitive COV notifications are for analog objects
- Read and write — monitor sensors and control outputs with proper BACnet Priority Array handling
- Device identity — automatically reads vendor name, model, and firmware version from the device
- Custom device naming — choose your own device name during setup
- Flexible entity naming — use BACnet
objectNameordescriptionfor display names - Domain mapping — override default entity types per object (e.g. make a sensor into a number)
- Selective import — only import the objects you actually need
- Configurable write priority — per-device select entity to change the BACnet write priority (disabled by default)
- Automatic outage recovery — detects network outages and reconnects the BACnet client automatically
| BACnet Object | Default entity | Writable? |
|---|---|---|
| Analog Input | Sensor | No |
| Analog Output | Number | Yes |
| Analog Value | Sensor | Auto-detected |
| Binary Input | Binary sensor | No |
| Binary Output | Switch | Yes |
| Binary Value | Switch | Auto-detected |
| Multi-State Input | Sensor | No |
| Multi-State Output | Number | Yes |
| Multi-State Value | Sensor | Auto-detected |
Value objects may or may not support writes — the integration auto-detects this by checking for a Priority Array during discovery.
- Click the HACS badge at the top of this page, or:
- Open HACS → Integrations → ⋮ → Custom repositories
- Paste this repository URL and select category Integration
- Click Download
- Restart Home Assistant
Copy the custom_components/bacnet folder into your Home Assistant config/custom_components/ directory and restart.
Go to Settings → Devices & Services → Add Integration and search for BACnet IP.
| Setting | What it does | Default |
|---|---|---|
| Local IP address | Which network interface to use (leave empty for auto-detect) | Auto |
| Local port | BACnet/IP UDP port | 47808 |
| Target device address | Direct IP of a specific device (leave empty to discover all) | — |
| Device ID | BACnet Device Object Instance number (only needed with target address) | Auto |
| Enable BBMD | Turn on if devices are on a different subnet/VLAN | Off |
| BBMD address | IP:port of the BBMD router | — |
| BBMD TTL | Foreign device registration lifetime in seconds | 900 |
The integration discovers BACnet devices on the network and shows them in a dropdown. Pick the one you want to add.
- Enter a device name (pre-filled with the BACnet device name — you can change it)
- Use Select All or pick individual objects to import
- Click Submit — your entities are created and data starts flowing immediately
After setup, click Configure on the integration card to adjust:
| Option | What it does | Default |
|---|---|---|
| Enable COV | Use Change of Value subscriptions for real-time updates | On |
| COV increment | Minimum value change before a COV notification is sent (analog objects only). Set to 0 to use the device default. |
0.1 |
| Polling interval | How often to poll objects without COV support (in seconds) | 30 |
| Use description | Show BACnet description (property 28) instead of objectName as entity name |
Off |
| Domain mapping | Change the HA entity type per object (e.g. sensor → number, switch → binary_sensor) | Auto |
| Per-object COV override | Override Enable COV for an individual object — shown as a checkbox next to its domain mapping. Objects with no override use the device-wide Enable COV setting. | Follows Enable COV |
| Live metadata properties | Opt-in per property (object_name, description, units) for a live push update via BACnet's SubscribeCOVProperty service, instead of periodic re-reads. Each one is a separate COV subscription on the device — leave off unless you need instant updates and know your device supports it. |
None |
Changes take effect immediately — the integration reloads automatically.
A Write Priority select entity is added to every BACnet device. It is disabled by default to keep dashboards clean.
To use it:
- Go to Settings → Devices & Services → BACnet → your device
- Find the Write Priority entity and enable it
- Use the dropdown to select your desired priority level
Available levels: 8 (Manual Operator), 9, 12, 13, 14, 15, 16 (default — lowest), 17
BACnet Priority Array levels run 1–16. Priority 16 is the safest default. Use level 8 if your BAS requires Manual Operator override. The selected priority persists across HA restarts.
By default, changes to an object's objectName, description, or units on the BACnet device are picked up automatically within about an hour (or sooner if the object also has active COV traffic) — see issue #26. No action is needed for this baseline behavior.
If you need those changes reflected immediately, enable one or more properties under Live metadata properties in Configure. This uses BACnet's SubscribeCOVProperty service (ASHRAE 135-2012 Addendum ar) to get a live push the moment the property changes on the device — but:
- It's a separate COV subscription per property, per object. Enabling all three on 20 objects adds 60 extra subscriptions on top of the 20 already used for live values — many devices cap total COV subscriptions well below that.
- Not all devices implement this addendum. Unsupported properties/devices silently fall back to the default periodic behavior above — no error, no user action needed.
Every entity exposes additional BACnet metadata as state attributes:
| Attribute | Description |
|---|---|
bacnet_object_type |
BACnet object type name (e.g. "Analog Input") |
bacnet_instance |
BACnet object instance number |
bacnet_commandable |
Whether this object supports writes |
bacnet_units |
Engineering units (e.g. "degrees-celsius") |
bacnet_description |
BACnet description property |
bacnet_status_flags |
BACnet status flags array |
bacnet_update_method |
How this entity is updated: COV or polling |
bacnet_cov_increment |
Configured COV sensitivity (analog objects with active COV only) |
The integration automatically reads device identity from BACnet during discovery:
- Manufacturer — from BACnet
vendorName(property 121) - Model — from BACnet
modelName(property 70) - Software version — from
applicationSoftwareVersion - Firmware version — from
firmwareRevision
This information appears in the Home Assistant device registry, so you can see exactly what hardware you're working with.
All writes to commandable objects use the BACnet Priority Array (ASHRAE 135):
- Turn ON / Set value → writes at the configured priority level (default: 16)
- Turn OFF → writes
inactive(0) at the same priority level
The priority level is controlled by the Write Priority select entity on the device (disabled by default — see Configuration options above).
Binary outputs use the Enumerated BACnet type (0 = inactive, 1 = active), compliant with ASHRAE 135.
| Problem | Likely cause | Solution |
|---|---|---|
| "No devices found" | Device not running or on a different subnet | Verify the device is reachable on UDP 47808 |
| "Cannot connect" | Port 47808 already in use | Stop other BACnet software or use a different port |
| Entities show "Unavailable" | Device went offline | Restart the device — entities recover automatically |
| COV not working | Device doesn't support COV | This is normal — polling activates as fallback |
| Write has no effect | Object is not commandable | Check the bacnet_commandable attribute |
| Values don't update | COV increment too high, or polling interval too long | Lower the COV increment or reduce the polling interval |
| Entities go unavailable after network blip | Expected — the integration detects outages and reconnects automatically. Entities recover once the device is reachable again. | No action needed |
| Write has no effect at expected priority | Device requires a specific priority level | Enable the Write Priority entity and select the correct level |
Add this to your configuration.yaml for detailed BACnet logs:
logger:
logs:
custom_components.bacnet: debug- Home Assistant 2024.1.0 or newer
- Python 3.11+
- Network UDP port 47808 accessible between HA and BACnet devices
- Cross-subnet A BBMD or BACnet router if devices are on a different network
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-improvement) - Submit a Pull Request
GPL-3.0 — see LICENSE for details.
Developed by BRDC
Powered by BACpypes3 · Built for Home Assistant
