BACnet.Logging.CommonLogging 4.0.0-beta.3

This is a prerelease version of BACnet.Logging.CommonLogging.
dotnet add package BACnet.Logging.CommonLogging --version 4.0.0-beta.3
                    
NuGet\Install-Package BACnet.Logging.CommonLogging -Version 4.0.0-beta.3
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="BACnet.Logging.CommonLogging" Version="4.0.0-beta.3" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="BACnet.Logging.CommonLogging" Version="4.0.0-beta.3" />
                    
Directory.Packages.props
<PackageReference Include="BACnet.Logging.CommonLogging" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add BACnet.Logging.CommonLogging --version 4.0.0-beta.3
                    
#r "nuget: BACnet.Logging.CommonLogging, 4.0.0-beta.3"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package BACnet.Logging.CommonLogging@4.0.0-beta.3
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=BACnet.Logging.CommonLogging&version=4.0.0-beta.3&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=BACnet.Logging.CommonLogging&version=4.0.0-beta.3&prerelease
                    
Install as a Cake Tool

.NET library for BACnet

build NuGet Downloads License: MIT

BACnet logo

BACnet (ASHRAE 135) is the standard communication protocol for building-automation systems — HVAC, lighting, access control, and metering. This library is a standalone BACnet stack for .NET: add a NuGet package and talk to BACnet devices from your own code, or expose your application as a BACnet device.

Features

  • Transports — BACnet/IP (UDP, IPv4 & IPv6) with BBMD and foreign-device registration; BACnet/Ethernet (pcap); MS/TP and PTP over a serial port
  • Client and device (server) roles — send requests and/or answer them from your own object model
  • Discovery — Who-Is / I-Am and Who-Has / I-Have, including across routers
  • Data access — ReadProperty, WriteProperty, ReadPropertyMultiple, WritePropertyMultiple, ReadRange
  • Change of Value — SubscribeCOV / SubscribeProperty and COV notifications
  • Scheduling — typed read/write of Schedule and Calendar properties (Weekly_Schedule, Exception_Schedule, Date_List, Effective_Period), plus example Schedule/Calendar objects implementing the standard behavior
  • Alarms & events — event/alarm notifications, alarm summary, and acknowledgement
  • More services — object create/delete, atomic file read/write, device-communication-control, reinitialize, time synchronization
  • Segmentation of large requests and responses
  • Complete ASN.1 encode/decode of the BACnet APDU set, covered by a test suite verified against ASHRAE 135 Annex F

Packages

  • BACnet NuGet
    Core stack — pure-managed BACnet/IP, MS/TP & PTP protocol, encode/decode. No native dependencies.
  • BACnet.Ethernet NuGet
    pcap-based BACnet/Ethernet (ISO 8802-3) transport (SharpPcap / PacketDotNet).
  • BACnet.Serial NuGet
    Physical serial-port transport (System.IO.Ports) for MS/TP and PTP.
  • BACnet.Logging.CommonLogging NuGet
    Optional bridge to route the stack's logs to Common.Logging.

Supported target frameworks

Package net48 netstandard2.0 net8.0 net10.0
BACnet (core)
BACnet.Ethernet
BACnet.Serial
BACnet.Logging.CommonLogging

netstandard2.0 covers .NET 6/7 and other runtimes.

Install

dotnet add package BACnet
# optional native transports:
dotnet add package BACnet.Ethernet
dotnet add package BACnet.Serial

Getting started

A minimal Who-Is device discovery over BACnet/IP:

using System.IO.BACnet;

var client = new BacnetClient(new BacnetIpUdpProtocolTransport(0xBAC0));

client.OnIam += (sender, adr, deviceId, maxApdu, seg, vendorId)
    => Console.WriteLine($"Found device {deviceId} at {adr}");

client.Start();

client.WhoIs();

Console.ReadLine();

On a host with several network interfaces (e.g. Hyper-V/WSL/Docker virtual adapters), tell the transport which one to bind by passing its IP — otherwise it throws an error listing the candidates: new BacnetIpUdpProtocolTransport(0xBAC0, localEndpointIp: "192.168.1.50").

The Examples/ folder has runnable samples — basic read/write, a device/server, COV subscription, alarm/event handling, BBMD, a serial device, and more.

Logging

The stack uses Microsoft.Extensions.Logging. By default logging is a no-op; wire a factory once and everything logs through it:

using Microsoft.Extensions.Logging;

BacnetLogging.Factory = LoggerFactory.Create(b => b.AddConsole());

Console, Serilog, NLog, and log4net all work via their MEL providers. If you already use Common.Logging, add the BACnet.Logging.CommonLogging package and call b.AddCommonLogging().

Upgrading from 3.x to 4.0

4.0 has a few breaking changes — see MIGRATION.md for details:

  • Logging moved from Common.Logging to Microsoft.Extensions.Logging (the Log property is now ILogger).
  • Native transports split into optional packages: pcap → BACnet.Ethernet, serial → BACnet.Serial. The MS/TP and PTP protocols stay in the core; use SerialTransport.Mstp(...) / .Ptp(...) from BACnet.Serial.
  • Interface selection is explicit when the host has multiple network interfaces. In that case BacnetIpUdpProtocolTransport no longer picks one for you — Start() throws and lists the candidates. Pass the interface IP: new BacnetIpUdpProtocolTransport(0xBAC0, localEndpointIp: "192.168.1.50").
  • Renamed the misspelled enum member BacnetRejectReason.RECOGNIZED_SERVICE to UNRECOGNIZED_SERVICE (value unchanged).
  • Scheduling types are spec-shaped now: the old BACnetCalendarEntry and BacnetweekNDay are replaced by BacnetCalendarEntry / BacnetWeekNDay, and schedule properties decode into typed values (BacnetDailySchedule, BacnetSpecialEvent) instead of opaque nested constructs.

GitHub Packages

Releases are also published to GitHub Packages. To restore from there, add the source https://nuget.pkg.github.com/ela-compil/index.json (a GitHub PAT with read:packages is required).

Credits & history

The stack was originally developed by Morten Kvistgaard — with significant contributions from F. Chaxel, Steve Karg, and the BACnet Stack (in C) — as part of YABE (Yet Another BACnet Explorer). This repository was forked from the YABE SourceForge SVN and is maintained here by Jakub Bartkowiak and the Ela-compil team as an independent library on NuGet; it is a separate codebase from YABE (YABE keeps its own copy of the stack).

Trademarks

"BACnet" and the BACnet logo are registered trademarks of ASHRAE (the American Society of Heating, Refrigerating and Air-Conditioning Engineers, Inc.). This project is an independent, community-maintained implementation of the BACnet protocol; it is not affiliated with, endorsed by, or sponsored by ASHRAE or BACnet International. The name and logo are used only to identify the protocol this library implements.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 is compatible.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
4.0.0-beta.3 49 7/6/2026
4.0.0-beta.2 45 7/4/2026
4.0.0-beta.1 58 7/2/2026