BACnet Schedule Sync¶
NF can discover BACnet schedule objects on the network and manage them alongside locally created schedules. Synchronization keeps the NF representation and the device schedule in agreement.
Discovery and Import¶
When NF scans a BACnet device (via Discover > Scan Objects), schedule objects are automatically imported into the schedule service. The import reads:
- Object name
- Weekly schedule (7 daily timetables)
- Exception schedule (special events)
- Schedule default value
- Effective period
- Out of service flag
Imported schedules appear on the Schedules page with a BACnet source badge showing the originating device ID and object instance.
Note
If a schedule for the same device and object already exists, the import updates it rather than creating a duplicate.
Sync Modes¶
Each device-sourced schedule has a sync mode that controls how changes flow:
| Mode | Direction | Behavior |
|---|---|---|
| Read-only | Device → NF | Schedule rules are imported from the device and cannot be edited in NF. Use the Sync button to pull the latest version. |
| Bidirectional | Device ↔ NF | Rules can be edited in NF and written back to the device. Changes from either side are tracked in the sync log. |
| None | — | No automatic sync. The schedule was imported once and is now independent. |
Change the sync mode in the schedule editor. New imports default to Read-only.
Sync Interval¶
For read-only and bidirectional schedules, you can set a sync interval that controls how often NF automatically re-reads the schedule from the device. Set to zero for manual-only sync.
Syncing from a Device¶
Click Sync in the schedule editor (or call SyncSchedule via
the API) to re-read the schedule from its BACnet device. The sync:
- Reads the current weekly schedule, exception schedule, default value, effective period, and out-of-service flag from the device.
- Updates the NF schedule with the new rule data.
- Preserves NF-only settings: targets, priority for writing, sync mode, and "expose as BACnet" flag.
- Logs the change in the sync log.
- Triggers immediate re-evaluation of the effective value.
If the sync fails (device offline, timeout, etc.), the error is
recorded in the schedule's last_sync_error field and displayed in
the UI.
Writing Back to a Device¶
For schedules in Bidirectional sync mode, click Write to
Device (or call WriteScheduleToSource) to push local changes
back to the BACnet device. The write-back sends:
- Weekly schedule
- Exception schedule
- Schedule default value
Write-back errors are recorded in the sync log entry for that operation.
Warning
Writing back overwrites the device's schedule rules entirely. Other properties on the device (like schedule targets configured natively on the controller) are not affected.
Sync Log¶
Every sync operation -- whether from the device or to the device -- is recorded in the schedule's sync log. View it in the Sync Log tab of the schedule editor.
Each entry shows:
| Field | Description |
|---|---|
| Origin | Device (pulled from device) or Local (pushed from NF or edited via API) |
| Timestamp | When the change occurred |
| Changed fields | Which parts of the schedule were modified (e.g., weekly schedule, special events) |
| Actor | What initiated the change (e.g., scan:260001, api, sync) |
| Error | Write-back error message, if any |
The sync log retains the most recent 500 entries per schedule.
Exposing Local Schedules as BACnet¶
Local schedules (not imported from a device) can be exposed as BACnet schedule objects on the gateway's local device. This allows external BACnet clients (other controllers, BMS front-ends) to read the schedule's present value and timetable data.
Enable this with the Expose as BACnet toggle in the schedule editor. When enabled, NF:
- Creates a local BACnet schedule object with an auto-assigned instance number.
- Keeps the object's weekly schedule, exception schedule, default value, and present value synchronized with the NF schedule.
- Removes the object if the toggle is disabled or the schedule is deleted.
Note
Exported BACnet objects are identified by a description field
containing hpl-managed:<uuid>. They are excluded from
re-import to prevent sync loops.