Release Notes

This page contains release notes.

Version 0.13.6

There have been lots of changes in the span between the previous published version and this one and I haven’t quite figured out how to extract the relevent content from the git log. More to come.

Version 0.13.0

This is a big release, with no API changes since the 0.12.1 version, but the setup now detects which version of Python is running and switches between source directories: py25, py27, and py34.

There is now a test directory, so in addition to the build and install options there is test, which uses nose for running the scripts:

$ python setup.py test

If you have more than one version of Python installed on your machine you can use tox to run the tests will all of the supported versions (currently limited to Python2.7 and Python3.4 due to substantial changes in unittest):

$ tox

At some point there will be a documentation page that decribes the changes between the distributions, as well as a guide for new applications.

Version 0.12.1

  • Add backup-in-progress to the Device Status enumeration r331
  • Correct the restoreFailure in BackupState r332
  • Check for read-only object when writing to a file r333
  • Wrong initial value for no segmentation (old enumeration syntax) r334
  • Wrong parameter r335
  • Missed variable name change r336
  • Mask errors writing the history file like they are when reading r337
  • Make sure that the vendor identifier is provided, and that localDate and localTime are not r338
  • Add simple string parsing to Date and Time r339
  • Bump the version number, provide more focused classifiers, include release notes r340

Version 0.12.0

  • Switch from distutils to setuptools to build a wheel r323
  • Updated to use twine to upload after building both an egg and a wheel r324
  • ReallyLongCamelCaseTypo r325
  • The pieces inside the AtomicReadFileACK should not have been context encoded, but the choice is context encoded r326
  • Additional properties and object types to get closer to 2012 edition r327
  • Additional properties and enumerations r328
  • Replace ‘except X, T:’ with ‘except X as T:’ for more modern code r329
  • Bump the version number and include release notes this time r330

Version 0.11.0

  • Merge the 0.10.6 release r311
  • Examples of a RecurringTask and using that to read property values. r312
  • Minor documentation update, adding –color option r313
  • IP-to-IP router sample r314
  • Additional helper application for decoding UDP packet contents in hex r315
  • The ‘description’ property is optional, by giving it a default value it was always being created. r316
  • Spelling typo r317
  • Missing enumerations r318
  • WhatIsNetworkNumber and NetworkNumberIs decoding (no other support yet) r319
  • typo r320
  • reStructured text version of readme r321
  • Bump the version number r322

Version 0.10.6

  • Release notes from previous version. r304
  • The accessCredential object type was missing. r305
  • Incorrect number of formatting parameters to match actual parameters, only appeared as warnings during debugging, but is definitely annoying. r306
  • New ReadRange sample code to assist with a developer question, keep them coming! r307
  • The ClientCOV components are not supposed to be context encoded. r308
  • A change to make sure that an array property isn’t None (uninitialized) before attempting to index into it. r309
  • Bump the version number and update these release notes. r310

Version 0.10.5

  • Bill Roberts submitted a patch to clean up an old underscore, and I missed the edit earlier. Thanks Bill! r302
  • Bump the version number, release notes to come later. r303

Version 0.10.4

This version contains bug fixes.

  • Some BACneteer had an issue with MultiState Value Objects so I added some sample code to present one of these on the network so I could check to make sure the encoding/decoding of property values was working correctly.

    There was an issue with constructed data with elements that were arrays, the elements should have had Python list semantics rather than BACnet array semantics, so there is some additional checking for this in the decoding. r282

  • A branch was created for dealing with unicode strings rather than the default string encoding. No final decision has been made on this issue, I need more experience. r283 r284 r285 r286 r287 r289 r290 r291 r292

  • Delete an unecessary import (a.k.a., “flake”). r288

  • Handle the various combinations of present/missing values for the object identifier and object list keyword arguments to the device object better. r293

  • The Random Analog Value Object sample code used the object identifier keyword argument in a non-standard way, and I thought this fixed it, but it seems to have re-introduced some debugging code as well. This needs investigation. r294

  • For sequences that specify “any atomic value” which is application encoded, the constructed data decoder presents those values as instances of one of the subclasses of Atomic rather that presenting them as Any which needs more work decoding for the BACpypes developer. r295

  • This patch takes advantage of the r295 and applies it to the Schedule Object and the TimeValue, used in SpecialEvent, used in the exception Schedule. r296

  • In the Read Property sample code, if the value has a debug_contents API then it is called and this gives a little bit more detailed output. r297

  • New Schedule Object sample code. r298

  • The fileIdentifier parameter of the Atomic Read/Write File services is application encoded, not context encoded. r299

  • Bill Roberts submitted some patches to clean up element encoding errors, thank you Bill! r300

  • Bump the version number and release. Notes to be committed later. r301

Version 0.10.3

This version contains some enhancements and bug fixes.

  • Sangeeth Saravanaraj submitted an enchancement that allows the ConsoleCmd class to accept stdin and stdout parameters and replaces the print statements with self.stdout.write calls. Thank you! r276
  • This is a new filter that looks for Who-Is and I-Am messages related to a specific device instance number in a pcap file. r277
  • This minor enhancement allows longs in the object type for an object identifier __init__ parameter rather than just ints. r278
  • Application service access point encode and decoding errors bail out of the effort rather than raising an error. There is a very long running application that I have that would decode an APDU incorrectly every once in a great while, but it was very difficult to track down. I think this was actually field device that was adding additional cruft on the end of a packet and BACpypes would raise an error. I need the stack to toss these errant PDUs out as if they never happened. It would be nice if there was a logging hook that developers could use to track when this happens. r279
  • This is a pair of sample applications for proprietary object types and proprietary properties to demonstrate how to extend the core types. r280
  • Bump the version number and update these release notes. r281

Version 0.10.2

This version contains bug fixes.

  • The invokeID for outbound client requests must be unique per server, but can be the same value for different servers. I had solved this problem once before in the sample HTTP server code, but didn’t migrate the code into the core library. At some point there was some other code that couldn’t generate more than 255 requests, so this never got tested. Other BACneteers are more aggressive! r272
  • The segment count of a confirmed ack is at least one, even if there is no PDU data. This was solved on the client side (in the client segmentation state machine for seeing if requests needed to be segmented on the way out) but not on the server side. This fixes that bug. r273
  • The ReadPropertyMultipleServer code would see that an object didn’t exist and build an error response, which was oblitered by the default code at the bottom of the loop so it was never returned. Now if any of the read access specifications refers to an object that doesn’t exist the request will correctly return an error. r274
  • Bump the version number and update these release notes. r275

Version 0.10.1

This version contains more contributions that should have been included in the previous release, but I updated the library in a different order than the mailing list. Sigh.

  • The library did not return the correct error for writing to immutable properties. r269
  • The lowerCamelCase for CharacterStringValue objects was incorrect and didn’t match the enumeration value. r270
  • Bump the version number and update these release notes. r271

Version 0.10

This version contains updates courtesy of contributions from other BACpypes users, of whom I am grateful!

  • The consolelogging module ConfigArgumentParser inherits from the built-in ArgumentParser class, but the parse_args didn’t have the same function signature. r264
  • The MultipleReadProperty new sample application has a list of points and it shows how to put those points into a queue so each one of them can be read sequentially. r265
  • The Read Access and Stream Access choices in the atomic file services were backwards, stream access is choice zero (0) and record access is one (1). r266
  • In the process of confirming that the file access services were in fact wrong, I decided to update the sample applications and give them better names. r267
  • Bump the version number and update these release notes. r268

Version 0.9.5

I have been working more on converting PDU’s into JSON content that can be archived and searched in MongoDB.

  • Simple bug, while I was updated in the __init__ calling chain I got the class name wrong. r260
  • When there is network layer traffic on a port that is not the “local port” it still needs to be processed by the local NetworkServiceElement. And trying to debug this problem, there was no debugger for the NSE! r261
  • As I have been shuffling around JSON-like content in various applications it became harder and harder to manage if the result of calling dict_content was going to return PCI layer information (the NPCI, APCI, or BVLCI), or the “data” portion of the packet. I also took the opportunity to use simpler names. r262
  • Bump the version number and update these release notes. r263

Version 0.9.4

This revision is an annouced release. The combination of r258 and r256 makes this important to get out to the community sooner rather than later.

  • The TimeSynchronizationRequest application layer PDUs have their time parameter application encoded, not context encoded. r258
  • Bump the version number and update these release notes. r259

Version 0.9.3

This release just has some minor bug fixes, but in order to get a large collection of applications running quickly it was simpler to make minor release and install it on other machines. The version was release to PyPI but never annouced.

Revisions r255 through r257.

  • A simple copy/paste error from some other sample code. r255
  • When shuffling data around to other applications and databases (like MongoDB) there are problems with raw string data, a.k.a., octet strings, or in Python3 terms byte strings. This is a simple mechanism to make hex strings out of the data portion of tag data. This is subject to change to some other format as we get more experience with data in other applications. r256
  • Remove the “flakes” (modules that were imported but not used). r257

Version 0.9.2

Apart from the usual bug fixes and small new features, this release changes almost all of the __init__ functions to use super() rather than calling the parent class initializer.

New School Initialization

For example, while the old code did this:

class Foo(Bar):

    def __init__(self):
        Bar.__init__(self)
        self.foo = 12

New the code does this:

class Foo(Bar):

    def __init__(self, *args, **kwargs):
        super(Foo, self).__init__(*args, **kwargs)
        self.foo = 12

If you draw an inheritance tree starting with PDUData at the top and ending with something like ReadPropertyRequest at the bottom, you will see lots of branching and merging. Calling the parent class directly may lead to the same base class being “initialized” more than once which was causing all kinds of havoc.

Simply replacing the one with the new wasn’t quite good enough however, because it could lead to a situation where a keyword arguement needed to be “consumed” if it existed because it didn’t make sense for the parent class or any of its parents. In many cases this works:

class Foo(Bar):

    def __init__(self, foo_arg=None, *args, **kwargs):
        super(Foo, self).__init__(*args, **kwargs)
        self.foo = 12

When the parent class initializer gets called the foo_arg will be a regular parameter and won’t be in the kwargs that get passed up the inheritance tree. However, with Sequence and Choice there is no knowledge of what the keyword parameters are going to be without going through the associated element lists. So those two classes go to great lengths to divide the kwargs into “mine” and “other”.

New User Data PDU Attribute

I have been working on a fairly complicated application that is a combination of being a BBMD on multiple networks and router between them. The twist is that there are rules that govern what segments of the networks can see each other. To manage this, there needed to be a way to attach an object at the bottom of the stack when a PDU is received and make sure that context information is maintained all the way up through the stack to the application layer and then back down again.

To accomplish this there is a pduUserData attribute you can set and as long as the stack is dealing with that PDU or the derived encoded/decoded PDUs, that reference is maintained.

Revisions r246 through r254.

  • The sample HTTP server was using the old syle argument parser and the old version didn’t have the options leading to confusion. r246
  • Set the ‘reuse’ flag for broadcast sockets. A BACneteer has a workstation with two physical adapters connected to the same LAN with different IP addresses assigned for each one. Two BACpypes applications were attempting to bind to the same broadcast address, this allows that scenerio to work. r247
  • Fix the help string and add a little more error checking to the ReadPropertyMultiple.py sample application. r248
  • Add the –color option to debugging. This wraps the output of the LoggingFormatter with ANSI CSI escape codes so the output from different log handlers is output in different colors. When debugging is turned on for many modules it helps! r249
  • The WriteProperty method now has a ‘’direct’’ parameter, this fixes the function signatures of the sample applications to include it. r250
  • Change the __init__ functions to use super(), see explanation above. r251
  • Bump the minor version number. r252
  • Update the getting started document to include the new color debugging option. There should be more explanation of what that means exactly, along with a link to the Wikipedia color code tables. r253
  • Update these release notes. r254

Version 0.9.1

Most of this release is just documentation, but it includes some new functionality for translating PDUs into dictionaries. The new dict_contents functions will most likely have some bugs, so consider that API unstable.

Revisions r238 through r245.

  • For some new users of BACpypes, particularly those that were also new to BACnet, it can be a struggle getting something to work. This is the start of a new documentation section to speed that process along. r238 r239 r240
  • For multithreaded applications it is sometimes handly to override the default spin value, which is the maximum amount of time that the application should be stuck in the asyncore.loop() function. The developer could import the core module and change the CORE value before calling run(), but that seems excessively hackish. r241
  • Apparently there should not be a dependancy on setuptools for developers that want to install the library without it. In revision r227 I changed the setup.py file, but that broke the release script. I’m not completely sure this is correct, but it seems to work. r242
  • This revision includes a new dict_contents() function that encodes PDU content into a dict-like object (a real dict by default, but the developer can provide any other class that supports __setitem__). This is the first step in a long road to translate PDU data into JSON, then into BSON to be streamed into a MongoDB database for analysis applications. r243
  • Bump the version number before releasing it. r244
  • Update these release notes. r245

Version 0.9

There are a number of significant changes in BACpypes in this release, some of which may break existing code so it is getting a minor release number. While this project is getting inexorably closer to a 1.0 release, we’re not there yet.

The biggest change is the addition of a set of derived classes of Property that match the names of the way properties are described in the standard; OptionalProperty, ReadableProperty, and WritableProperty. This takes over from the awkward and difficult-to-maintain combinations of optional and mutable constructor parameters. I went through the standard again and matched the class name with the object definition and it is much cleaner.

This change was brought about by working on the BACowl project where I wanted the generated ontology to more closely match the content of the standard. This is the first instance where I’ve used the ontology design to change application code.

Revisions r227 through r234.

  • At some point setuptools was replaced with distutils and this needed to change while I was getting the code working on Windows. r227

  • Added the new property classes and renamed the existing Property class instances. There are object types that are not complete (not every object type has every property defined) and these will be cleaned up and added in a minor release in the near future. r228

  • The UDP module had some print statements and a traceback call that sent content to stdout, errors should go to stderr. r229

  • With the new property classes there needed to be a simpler and cleaner way managing the __init__ keyword parameters for a LocalDeviceObject. During testing I had created objects with no name or object identifier and it seemed like some error checking was warrented, so that was added to add_object and delete_object. r230

  • This commit is the first pass at changing the way object classes are registered. There is now a new vendor_id parameter so that derived classes of a standard object can be registered. For example, if vendor Snork has a custom SnorkAnalogInputObject class (derived from AnalogInputObject of course) then both classes can be registered.

    The get_object_class has a cooresponding vendor_id parameter, so if a client application is looking for the appropriate class, pass the vendorIdentifier property value from the deivce object of the server and if there isn’t a specific one defined, the standard class will be returned.

    The new and improved registration function would be a lot nicer as a decorator, but optional named parameters make and interesting twist. So depending on the combination of parameters it returns a decorator, which is an interesting twist on recursion.

    At some point there will be a tutorial covering just this functionality, and before this project hits version 1.0, there will be a similar mechanism for vendor defined enumerations, especially PropertyIdentifier, and this will also follow the BACowl ontology conventions.

    This commit also includes a few minor changes like changing the name klass to the not-so-cute cls, property to propid because the former is a reserved word, and the dictionary of registered objects from object_types to registered_object_types. r231

  • Simple wrapping of the command line argument interpretation for a sample application. r232

  • The CommandableMixin isn’t appropriate for BinaryValueObject type, so I replaced it with a DateValueObject. r233

  • I managed to install Sphinx on my Windows laptop and this just added a build script to make it easier to put in these release notes. r235

  • This adds the relaease notes page and a link to it for documentation, committed so I could continue working on it from a variety of different places. I usually wouldn’t make a commit just for this unless I was working in a branch, but because I’m working in the trunk rather than using a service like DropBox I decided to let myself get away with it. r234 r236

  • Committed the final version of these notes and bumped the minor version number. r237

Version 0.8

Placeholder for 0.8 release notes.

Revisions r224 through r226.

  • Placeholder for comments about revision 224. r224
  • Placeholder for comments about revision 225. r225
  • Bump the minor version number. r226

Version 0.7.5

Placeholder for 0.8 release notes.

Revisions r217 through r223.

  • Placeholder for comments about revision 217. r217
  • Placeholder for comments about revision 218. r218
  • Placeholder for comments about revision 219. r219
  • Placeholder for comments about revision 220. r220
  • Placeholder for comments about revision 221. r221
  • Placeholder for comments about revision 222. r222
  • Bump the patch version number. r223

Version 0.7.4

Lost to the sands of time.