diff --git a/py25/bacpypes/__init__.py b/py25/bacpypes/__init__.py index 584efe09..6e27fd0e 100755 --- a/py25/bacpypes/__init__.py +++ b/py25/bacpypes/__init__.py @@ -18,7 +18,7 @@ # Project Metadata # -__version__ = '0.18.5' +__version__ = '0.18.7' __author__ = 'Joel Bender' __email__ = 'joel@carrickbender.com' diff --git a/py25/bacpypes/basetypes.py b/py25/bacpypes/basetypes.py index 945028c2..ea73c9ac 100755 --- a/py25/bacpypes/basetypes.py +++ b/py25/bacpypes/basetypes.py @@ -9,7 +9,7 @@ from .primitivedata import Atomic, BitString, Boolean, CharacterString, Date, Double, \ Enumerated, Integer, Null, ObjectIdentifier, OctetString, Real, Time, \ - Unsigned, Unsigned16, Tag + Unsigned, Unsigned8, Unsigned16, Tag from .constructeddata import Any, AnyAtomic, ArrayOf, Choice, Element, \ Sequence, SequenceOf @@ -95,8 +95,7 @@ class ObjectTypesSupported(BitString): , 'accessUser':35 , 'accessZone':36 , 'credentialDataInput':37 - , 'networkPort':56 - , 'networkSecurity':38 + , 'networkSecurity':38 # removed revision 22 , 'bitstringValue':39 , 'characterstringValue':40 , 'datePatternValue':41 @@ -113,8 +112,16 @@ class ObjectTypesSupported(BitString): , 'alertEnrollment':52 , 'channel':53 , 'lightingOutput':54 + , 'binaryLightingOutput':55 + , 'networkPort':56 + , 'elevatorGroup':57 + , 'escalator':58 + , 'lift':59 + , 'staging':60 + , 'auditLog':61 + , 'auditReporter':62 } - bitLen = 55 + bitLen = 63 class ResultFlags(BitString): bitNames = \ @@ -167,8 +174,16 @@ class ServicesSupported(BitString): , 'subscribeCOVProperty':38 , 'getEventInformation':39 , 'writeGroup':40 + , 'subscribeCOVPropertyMultiple':41 + , 'confirmedCOVNotificationMultiple':42 + , 'unconfirmedCOVNotificationMultiple':43 + , 'confirmedAuditNotification':44 + , 'auditLogQuery':45 + , 'unconfirmedAuditNotification':46 + , 'whoAmI':47 + , 'youAre':48 } - bitLen = 41 + bitLen = 49 class StatusFlags(BitString): bitNames = \ @@ -758,20 +773,27 @@ class ErrorCode(Enumerated): , 'badDestinationDeviceId':87 , 'badSignature':88 , 'badSourceAddress':89 - , 'badTimestamp':90 + , 'badTimestamp':90 #Removed revision 22 , 'busy':82 - , 'cannotUseKey':91 - , 'cannotVerifyMessageId':92 + , 'bvlcFunctionUnknown':143 + , 'bvlcProprietaryFunctionUnknown':144 + , 'cannotUseKey':91 #Removed revision 22 + , 'cannotVerifyMessageId':92 #Removed revision 22 , 'characterSetNotSupported':41 , 'communicationDisabled':83 , 'configurationInProgress':2 - , 'correctKeyRevision':93 + , 'correctKeyRevision':93 #Removed revision 22 , 'covSubscriptionFailed':43 , 'datatypeNotSupported':47 , 'deleteFdtEntryFailed':120 , 'deviceBusy':3 - , 'destinationDeviceIdRequired':94 + , 'destinationDeviceIdRequired':94 #Removed revision 22 , 'distributeBroadcastFailed':121 + , 'dnsError':192 + , 'dnsNameResolutionFailed':190 + , 'dnsResolverFailure':191 + , 'dnsUnavailable':189 + , 'duplicateEntry': 137 , 'duplicateMessage':95 , 'duplicateName':48 , 'duplicateObjectId':49 @@ -780,28 +802,51 @@ class ErrorCode(Enumerated): , 'encryptionRequired':97 , 'fileAccessDenied':5 , 'fileFull':128 + , 'headerEncodingError':145 + , 'headerNotUnderstood':146 + , 'httpError':165 + , 'httpNoUpgrade':153 + , 'httpNotAServer':164 + , 'httpResourceNotLocal':154 + , 'httpProxyAuthenticationFailed':155 + , 'httpResponseTimeout':156 + , 'httpResponseSyntaxError':157 + , 'httpResponseValueError':158 + , 'httpResponseMissingHeader':159 + , 'httpTemporaryUnavailable':163 + , 'httpUnexpectedResponseCode':152 + , 'httpUpgradeRequired':161 + , 'httpUpgradeError':162 + , 'httpWebsocketHeaderError':160 , 'inconsistentConfiguration':129 , 'inconsistentObjectType':130 , 'inconsistentParameters':7 , 'inconsistentSelectionCriterion':8 - , 'incorrectKey':98 + , 'incorrectKey':98 #Removed revision 22 , 'internalError':131 , 'invalidArrayIndex':42 , 'invalidConfigurationData':46 + , 'invalidDataEncoding':142 , 'invalidDataType':9 , 'invalidEventState':73 , 'invalidFileAccessMethod':10 , 'invalidFileStartPosition':11 - , 'invalidKeyData':99 + , 'invalidKeyData':99 #Removed revision 22 , 'invalidParameterDataType':13 , 'invalidTag':57 , 'invalidTimeStamp':14 - , 'keyUpdateInProgress':100 + , 'invalidValueInThisState':138 + , 'ipAddressNotReachable':198 + , 'ipError':199 + , 'keyUpdateInProgress':100 #Removed revision 22 , 'listElementNotFound':81 + , 'listItemNotNumbered':140 + , 'listItemNotTimestamped': 141 , 'logBufferFull':75 , 'loggedValuePurged':76 , 'malformedMessage':101 , 'messageTooLong':113 + , 'messageIncomplete':147 , 'missingRequiredParameter':16 , 'networkDown':58 , 'noAlarmConfigured':74 @@ -811,10 +856,12 @@ class ErrorCode(Enumerated): , 'noSpaceToAddListElement':19 , 'noSpaceToWriteProperty':20 , 'noVtSessionsAvailable':21 + , 'nodeDuplicateVmac':151 + , 'notABacnetScHub':148 , 'notConfigured':132 , 'notConfiguredForTriggeredLogging':78 , 'notCovProperty':44 - , 'notKeyServer':102 + , 'notKeyServer':102 #Removed revision 22 , 'notRouterToDnet':110 , 'objectDeletionNotPermitted':23 , 'objectIdentifierAlreadyExists':24 @@ -824,6 +871,7 @@ class ErrorCode(Enumerated): , 'outOfMemory':133 , 'parameterOutOfRange':80 , 'passwordFailure':26 + , 'payloadExpected':149 , 'propertyIsNotAList':22 , 'propertyIsNotAnArray':50 , 'readAccessDenied':27 @@ -847,19 +895,34 @@ class ErrorCode(Enumerated): , 'serviceRequestDenied':29 , 'sourceSecurityRequired':104 , 'success':84 + , 'tcpClosedByLocal':195 + , 'tcpClosedOther':196 + , 'tcpConnectTimeout':193 + , 'tcpConnectionRefused':194 + , 'tcpError':197 , 'timeout':30 - , 'tooManyKeys':105 + , 'tlsClientAuthenticationFailed':182 + , 'tlsClientCertificateError':180 + , 'tlsClientCertificateExpired':184 + , 'tlsClientCertificateRevoked':186 + , 'tleError':188 + , 'tlsServerAuthenticationFailed':183 + , 'tlsServerCertificateError':181 + , 'tlsServerCertificateExpired':185 + , 'tlsServerCertificateRevoked':187 + , 'tooManyKeys':105 #Removed revision 22 + , 'unexpectedData':150 , 'unknownAuthenticationType':106 , 'unknownDevice':70 , 'unknownFileSize':122 - , 'unknownKey':107 - , 'unknownKeyRevision':108 + , 'unknownKey':107 #Removed revision 22 + , 'unknownKeyRevision':108 #Removed revision 22 , 'unknownNetworkMessage':112 , 'unknownObject':31 , 'unknownProperty':32 , 'unknownSubscription':79 , 'umknownRoute':71 - , 'unknownSourceMessage':109 + , 'unknownSourceMessage':109 #Removed revision 22 , 'unknownVtClass':34 , 'unknownVtSession':35 , 'unsupportedObjectType':36 @@ -868,6 +931,20 @@ class ErrorCode(Enumerated): , 'valueTooLong':134 , 'vtSessionAlreadyClosed':38 , 'vtSessionTerminationFailure':39 + , 'websocket-close-error':168 + , 'websocket-closed-abnormally':173 + , 'websocket-closed-by-peer':169 + , 'websocket-data-against-policy':175 + , 'websocket-data-inconsistent':174 + , 'websocket-data-not-accepted':172 + , 'websocket-endpoint-leaves':170 + , 'websocket-error':179 + , 'websocket-extension-missing':177 + , 'websocket-frame-too-long':176 + , 'websocket-protocol-error':171 + , 'websocket-request-unavailable':178 + , 'websocket-scheme-not-supported':166 + , 'websocket-unknown-control-message':167 , 'writeAccessDenied':40 , 'writeBdtFailed':116 } @@ -1108,9 +1185,9 @@ class PropertyIdentifier(Enumerated): enumerations = \ { 'absenteeLimit':244 , 'tags':486 - , 'profileLocation':91 + , 'profileLocation':485 , 'eventDetectionEnabled':353 - , 'apduLength':388 + , 'apduLength':399 , 'linkSpeed':420 , 'linkSpeeds':421 , 'linkSpeedAutonegotiate':422 @@ -1140,7 +1217,7 @@ class PropertyIdentifier(Enumerated): , 'ipv6DefaultGateway':439 , 'bacnetIPv6MulticastAddress':440 , 'ipv6DNSServer':441 - , 'ipv6AutoAddressingEnabled':442 + , 'ipv6AutoAddressingEnable':442 , 'ipv6DHCPLeaseTime':443 , 'ipv6DHCPLeaseTimeRemaining':444 , 'ipv6DHCPServer':445 @@ -1364,7 +1441,7 @@ class PropertyIdentifier(Enumerated): , 'negativeAccessRules':288 , 'networkAccessSecurityPolicies':332 , 'networkNumber':425 - , 'networkNumberQuality':427 + , 'networkNumberQuality':426 , 'networkType': 427 , 'nodeSubtype':207 , 'nodeType':208 @@ -1539,6 +1616,7 @@ class Reliability(Enumerated): , 'proprietaryCommandFailure': 22 , 'faultsListed': 23 , 'referencedObjectFault': 24 + , 'multiStateOutOfRange':25 } class RestartReason(Enumerated): @@ -1552,6 +1630,7 @@ class RestartReason(Enumerated): , 'hardwareWatchdog':5 , 'softwareWatchdog':6 , 'suspended':7 + , 'activateChanges': 8 } class SecurityLevel(Enumerated): @@ -1680,41 +1759,42 @@ class RouterEntryStatus(Enumerated): class HostAddress(Choice): choiceElements = \ - [ Element('none', Null) - , Element('ipAddress', OctetString) # 4 octets for B/IP or 16 octets for B/IPv6 - , Element('name', CharacterString) # Internet host name (see RFC 1123) + [ Element('none', Null, 0) + , Element('ipAddress', OctetString, 1) # 4 octets for B/IP or 16 octets for B/IPv6 + , Element('name', CharacterString, 2) # Internet host name (see RFC 1123) ] class HostNPort(Sequence): sequenceElements = \ - [ Element('host', HostAddress) - , Element('port', Unsigned16) + [ Element('host', HostAddress, 0) + , Element('port', Unsigned16, 1) ] class BDTEntry(Sequence): sequenceElements = \ - [ Element('bbmdAddress', HostNPort) - , Element('broadcastMask', OctetString) # shall be present if BACnet/IP, and absent for BACnet/IPv6 + [ Element('bbmdAddress', HostNPort, 0) + , Element('broadcastMask', OctetString, 1) # shall be present if BACnet/IP, and absent for BACnet/IPv6 ] class FDTEntry(Sequence): sequenceElements = \ - [ Element('bacnetIPAddress', OctetString) # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant - , Element('timeToLive', Unsigned16) # time to live in seconds at the time of registration - , Element('remainingTimeToLive', Unsigned16) # remaining time to live in seconds, incl. grace period + [ Element('bacnetIPAddress', OctetString, 0) # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant + , Element('timeToLive', Unsigned16, 1) # time to live in seconds at the time of registration + , Element('remainingTimeToLive', Unsigned16, 2) # remaining time to live in seconds, incl. grace period ] class VMACEntry(Sequence): sequenceElements = \ - [ Element('virtualMACAddress', OctetString) # maximum size 6 octets - , Element('nativeMACAddress', OctetString) + [ Element('virtualMACAddress', OctetString, 0) # maximum size 6 octets + , Element('nativeMACAddress', OctetString, 1) ] class RouterEntry(Sequence): sequenceElements = \ - [ Element('networkNumber', Unsigned16) - , Element('macAddress', OctetString) - , Element('status', RouterEntryStatus) # Defined Above + [ Element('networkNumber', Unsigned16, 0) + , Element('macAddress', OctetString, 1) + , Element('status', RouterEntryStatus, 2) # Defined Above + , Element('performanceIndex', Unsigned8, 3, True) ] class NameValue(Sequence): diff --git a/py25/bacpypes/object.py b/py25/bacpypes/object.py index 4368d2be..fb02c38a 100755 --- a/py25/bacpypes/object.py +++ b/py25/bacpypes/object.py @@ -1979,11 +1979,11 @@ class NetworkPortObject(Object): , ReadableProperty('protocolLevel', ProtocolLevel) #482 , OptionalProperty('referencePort', Unsigned) #483 , ReadableProperty('networkNumber', Unsigned16) #425 - , ReadableProperty('networkNumberQuality', NetworkNumberQuality) #427 + , ReadableProperty('networkNumberQuality', NetworkNumberQuality) #426 , ReadableProperty('changesPending', Boolean) #416 , OptionalProperty('command', NetworkPortCommand) #417 , OptionalProperty('macAddress', OctetString) #423 - , ReadableProperty('apduLength', Unsigned) #388 + , ReadableProperty('apduLength', Unsigned) #399 , ReadableProperty('linkSpeed', Real) #420 , OptionalProperty('linkSpeeds', ArrayOf(Real)) #421 , OptionalProperty('eventTimeStamps', ArrayOf(TimeStamp)) #130 @@ -2014,7 +2014,7 @@ class NetworkPortObject(Object): , OptionalProperty('ipv6DefaultGateway', OctetString) #439 , OptionalProperty('bacnetIPv6MulticastAddress', OctetString) #440 , OptionalProperty('ipv6DNSServer', OctetString) #441 - , OptionalProperty('ipv6AutoAddressingEnabled', Boolean) #442 + , OptionalProperty('ipv6AutoAddressingEnable', Boolean) #442 , OptionalProperty('ipv6DHCPLeaseTime', Unsigned) #443 , OptionalProperty('ipv6DHCPLeaseTimeRemaining', Unsigned) #444 , OptionalProperty('ipv6DHCPServer', OctetString) #445 @@ -2039,7 +2039,7 @@ class NetworkPortObject(Object): , ReadableProperty('reliabilityEvaluationInhibit', Boolean) #357 , OptionalProperty('propertyList', ArrayOf(PropertyIdentifier)) #371 , OptionalProperty('tags', ArrayOf(NameValue)) #486 - , OptionalProperty('profileLocation', CharacterString) #91 + , OptionalProperty('profileLocation', CharacterString) #485 , OptionalProperty('profileName', CharacterString) #168 ] diff --git a/py27/bacpypes/__init__.py b/py27/bacpypes/__init__.py index 584efe09..6e27fd0e 100755 --- a/py27/bacpypes/__init__.py +++ b/py27/bacpypes/__init__.py @@ -18,7 +18,7 @@ # Project Metadata # -__version__ = '0.18.5' +__version__ = '0.18.7' __author__ = 'Joel Bender' __email__ = 'joel@carrickbender.com' diff --git a/py27/bacpypes/basetypes.py b/py27/bacpypes/basetypes.py index e62a2958..9c266707 100755 --- a/py27/bacpypes/basetypes.py +++ b/py27/bacpypes/basetypes.py @@ -117,8 +117,7 @@ class ObjectTypesSupported(BitString): , 'accessUser':35 , 'accessZone':36 , 'credentialDataInput':37 - , 'networkPort':56 - , 'networkSecurity':38 + , 'networkSecurity':38 # removed revision 22 , 'bitstringValue':39 , 'characterstringValue':40 , 'datePatternValue':41 @@ -135,8 +134,16 @@ class ObjectTypesSupported(BitString): , 'alertEnrollment':52 , 'channel':53 , 'lightingOutput':54 + , 'binaryLightingOutput':55 + , 'networkPort':56 + , 'elevatorGroup':57 + , 'escalator':58 + , 'lift':59 + , 'staging':60 + , 'auditLog':61 + , 'auditReporter':62 } - bitLen = 55 + bitLen = 63 class PriorityFilter(BitString): bitNames = \ @@ -210,8 +217,16 @@ class ServicesSupported(BitString): , 'subscribeCOVProperty':38 , 'getEventInformation':39 , 'writeGroup':40 + , 'subscribeCOVPropertyMultiple':41 + , 'confirmedCOVNotificationMultiple':42 + , 'unconfirmedCOVNotificationMultiple':43 + , 'confirmedAuditNotification':44 + , 'auditLogQuery':45 + , 'unconfirmedAuditNotification':46 + , 'whoAmI':47 + , 'youAre':48 } - bitLen = 41 + bitLen = 49 class StatusFlags(BitString): bitNames = \ @@ -842,20 +857,26 @@ class ErrorCode(Enumerated): , 'badDestinationDeviceId':87 , 'badSignature':88 , 'badSourceAddress':89 - , 'badTimestamp':90 + , 'badTimestamp':90 #Removed revision 22 , 'busy':82 - , 'cannotUseKey':91 - , 'cannotVerifyMessageId':92 + , 'bvlcFunctionUnknown':143 + , 'bvlcProprietaryFunctionUnknown':144 + , 'cannotUseKey':91 #Removed revision 22 + , 'cannotVerifyMessageId':92 #Removed revision 22 , 'characterSetNotSupported':41 , 'communicationDisabled':83 , 'configurationInProgress':2 - , 'correctKeyRevision':93 + , 'correctKeyRevision':93 #Removed revision 22 , 'covSubscriptionFailed':43 , 'datatypeNotSupported':47 , 'deleteFdtEntryFailed':120 , 'deviceBusy':3 - , 'destinationDeviceIdRequired':94 + , 'destinationDeviceIdRequired':94 #Removed revision 22 , 'distributeBroadcastFailed':121 + , 'dnsNameResolutionFailed':190 + , 'dnsResolverFailure':191 + , 'dnsUnavailable':189 + , 'duplicateEntry': 137 , 'duplicateMessage':95 , 'duplicateName':48 , 'duplicateObjectId':49 @@ -864,14 +885,31 @@ class ErrorCode(Enumerated): , 'encryptionRequired':97 , 'fileAccessDenied':5 , 'fileFull':128 + , 'headerEncodingError':145 + , 'headerNotUnderstood':146 + , 'httpError':165 + , 'httpNoUpgrade':153 + , 'httpNotAServer':164 + , 'httpResourceNotLocal':154 + , 'httpProxyAuthenticationFailed':155 + , 'httpResponseTimeout':156 + , 'httpResponseSyntaxError':157 + , 'httpResponseValueError':158 + , 'httpResponseMissingHeader':159 + , 'httpTemporaryUnavailable':163 + , 'httpUnexpectedResponseCode':152 + , 'httpUpgradeRequired':161 + , 'httpUpgradeError':162 + , 'httpWebsocketHeaderError':160 , 'inconsistentConfiguration':129 , 'inconsistentObjectType':130 , 'inconsistentParameters':7 , 'inconsistentSelectionCriterion':8 - , 'incorrectKey':98 + , 'incorrectKey':98 #Removed revision 22 , 'internalError':131 , 'invalidArrayIndex':42 , 'invalidConfigurationData':46 + , 'invalidDataEncoding':142 , 'invalidDataType':9 , 'invalidEventState':73 , 'invalidFileAccessMethod':10 @@ -880,12 +918,18 @@ class ErrorCode(Enumerated): , 'invalidParameterDataType':13 , 'invalidTag':57 , 'invalidTimeStamp':14 - , 'keyUpdateInProgress':100 + , 'invalidValueInThisState':138 + , 'ipAddressNotReachable':198 + , 'ipError':199 + , 'keyUpdateInProgress':100 #Removed revision 22 , 'listElementNotFound':81 + , 'listItemNotNumbered':140 + , 'listItemNotTimestamped': 141 , 'logBufferFull':75 , 'loggedValuePurged':76 , 'malformedMessage':101 , 'messageTooLong':113 + , 'messageIncomplete':147 , 'missingRequiredParameter':16 , 'networkDown':58 , 'noAlarmConfigured':74 @@ -895,10 +939,12 @@ class ErrorCode(Enumerated): , 'noSpaceToAddListElement':19 , 'noSpaceToWriteProperty':20 , 'noVtSessionsAvailable':21 + , 'nodeDuplicateVmac':151 + , 'notABacnetScHub':148 , 'notConfigured':132 , 'notConfiguredForTriggeredLogging':78 , 'notCovProperty':44 - , 'notKeyServer':102 + , 'notKeyServer':102 #Removed revision 22 , 'notRouterToDnet':110 , 'objectDeletionNotPermitted':23 , 'objectIdentifierAlreadyExists':24 @@ -908,6 +954,7 @@ class ErrorCode(Enumerated): , 'outOfMemory':133 , 'parameterOutOfRange':80 , 'passwordFailure':26 + , 'payloadExpected':149 , 'propertyIsNotAList':22 , 'propertyIsNotAnArray':50 , 'readAccessDenied':27 @@ -931,19 +978,34 @@ class ErrorCode(Enumerated): , 'serviceRequestDenied':29 , 'sourceSecurityRequired':104 , 'success':84 + , 'tcpClosedByLocal':195 + , 'tcpClosedOther':196 + , 'tcpConnectTimeout':193 + , 'tcpConnectionRefused':194 + , 'tcpError':197 , 'timeout':30 - , 'tooManyKeys':105 + , 'tlsClientAuthenticationFailed':182 + , 'tlsClientCertificateError':180 + , 'tlsClientCertificateExpired':184 + , 'tlsClientCertificateRevoked':186 + , 'tleError':188 + , 'tlsServerAuthenticationFailed':183 + , 'tlsServerCertificateError':181 + , 'tlsServerCertificateExpired':185 + , 'tlsServerCertificateRevoked':187 + , 'tooManyKeys':105 #Removed revision 22 + , 'unexpectedData':150 , 'unknownAuthenticationType':106 , 'unknownDevice':70 , 'unknownFileSize':122 - , 'unknownKey':107 - , 'unknownKeyRevision':108 + , 'unknownKey':107 #Removed revision 22 + , 'unknownKeyRevision':108 #Removed revision 22 , 'unknownNetworkMessage':112 , 'unknownObject':31 , 'unknownProperty':32 , 'unknownSubscription':79 , 'umknownRoute':71 - , 'unknownSourceMessage':109 + , 'unknownSourceMessage':109 #Removed revision 22 , 'unknownVtClass':34 , 'unknownVtSession':35 , 'unsupportedObjectType':36 @@ -952,6 +1014,20 @@ class ErrorCode(Enumerated): , 'valueTooLong':134 , 'vtSessionAlreadyClosed':38 , 'vtSessionTerminationFailure':39 + , 'websocket-close-error':168 + , 'websocket-closed-abnormally':173 + , 'websocket-closed-by-peer':169 + , 'websocket-data-against-policy':175 + , 'websocket-data-inconsistent':174 + , 'websocket-data-not-accepted':172 + , 'websocket-endpoint-leaves':170 + , 'websocket-error':179 + , 'websocket-extension-missing':177 + , 'websocket-frame-too-long':176 + , 'websocket-protocol-error':171 + , 'websocket-request-unavailable':178 + , 'websocket-scheme-not-supported':166 + , 'websocket-unknown-control-message':167 , 'writeAccessDenied':40 , 'writeBdtFailed':116 } @@ -1326,7 +1402,7 @@ class PropertyIdentifier(Enumerated): , 'all':8 , 'allowGroupDelayInhibit':365 , 'allWritesSuccessful':9 - , 'apduLength':388 + , 'apduLength':399 , 'apduSegmentTimeout':10 , 'apduTimeout':11 , 'applicationSoftwareVersion':12 @@ -1509,7 +1585,7 @@ class PropertyIdentifier(Enumerated): , 'ipDNSServer':406 , 'ipSubnetMask':411 , 'ipv6Address':436 - , 'ipv6AutoAddressingEnabled':442 + , 'ipv6AutoAddressingEnable':442 , 'ipv6DefaultGateway':439 , 'ipv6DHCPLeaseTime':443 , 'ipv6DHCPLeaseTimeRemaining':444 @@ -1602,7 +1678,7 @@ class PropertyIdentifier(Enumerated): , 'networkAccessSecurityPolicies':332 , 'networkInterfaceName':424 , 'networkNumber':425 - , 'networkNumberQuality':427 + , 'networkNumberQuality':426 , 'networkType': 427 , 'nextStoppingFloor':476 , 'nodeSubtype':207 @@ -1650,7 +1726,7 @@ class PropertyIdentifier(Enumerated): , 'priorityForWriting':88 , 'processIdentifier':89 , 'processIdentifierFilter':361 - , 'profileLocation':91 + , 'profileLocation':485 , 'profileName':168 , 'programChange':90 , 'programLocation':91 @@ -1837,6 +1913,7 @@ class Reliability(Enumerated): , 'proprietaryCommandFailure': 22 , 'faultsListed': 23 , 'referencedObjectFault': 24 + , 'multiStateOutOfRange':25 } class RestartReason(Enumerated): @@ -1850,6 +1927,7 @@ class RestartReason(Enumerated): , 'hardwareWatchdog':5 , 'softwareWatchdog':6 , 'suspended':7 + , 'activateChanges': 8 } class SecurityLevel(Enumerated): @@ -1997,34 +2075,35 @@ class RouterEntryStatus(Enumerated): class HostAddress(Choice): choiceElements = \ - [ Element('none', Null) - , Element('ipAddress', OctetString) # 4 octets for B/IP or 16 octets for B/IPv6 - , Element('name', CharacterString) # Internet host name (see RFC 1123) + [ Element('none', Null, 0) + , Element('ipAddress', OctetString, 1) # 4 octets for B/IP or 16 octets for B/IPv6 + , Element('name', CharacterString, 2) # Internet host name (see RFC 1123) ] class HostNPort(Sequence): sequenceElements = \ - [ Element('host', HostAddress) - , Element('port', Unsigned16) + [ Element('host', HostAddress, 0) + , Element('port', Unsigned16, 1) ] class BDTEntry(Sequence): sequenceElements = \ - [ Element('bbmdAddress', HostNPort) - , Element('broadcastMask', OctetString) # shall be present if BACnet/IP, and absent for BACnet/IPv6 + [ Element('bbmdAddress', HostNPort, 0) + , Element('broadcastMask', OctetString, 1) # shall be present if BACnet/IP, and absent for BACnet/IPv6 ] class FDTEntry(Sequence): sequenceElements = \ - [ Element('bacnetIPAddress', OctetString) # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant - , Element('timeToLive', Unsigned16) # time to live in seconds at the time of registration - , Element('remainingTimeToLive', Unsigned16) # remaining time to live in seconds, incl. grace period + [ Element('bacnetIPAddress', OctetString, 0) # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant + , Element('timeToLive', Unsigned16, 1) # time to live in seconds at the time of registration + , Element('remainingTimeToLive', Unsigned16, 2) # remaining time to live in seconds, incl. grace period + , Element('performanceIndex', Unsigned8, 3, True) ] class VMACEntry(Sequence): sequenceElements = \ - [ Element('virtualMACAddress', OctetString) # maximum size 6 octets - , Element('nativeMACAddress', OctetString) + [ Element('virtualMACAddress', OctetString, 0) # maximum size 6 octets + , Element('nativeMACAddress', OctetString, 1) ] class PropertyReference(Sequence): diff --git a/py27/bacpypes/object.py b/py27/bacpypes/object.py index 82ffd281..c1aab9f2 100755 --- a/py27/bacpypes/object.py +++ b/py27/bacpypes/object.py @@ -2340,11 +2340,11 @@ class NetworkPortObject(Object): , ReadableProperty('protocolLevel', ProtocolLevel) #482 , OptionalProperty('referencePort', Unsigned) #483 , ReadableProperty('networkNumber', Unsigned16) #425 - , ReadableProperty('networkNumberQuality', NetworkNumberQuality) #427 + , ReadableProperty('networkNumberQuality', NetworkNumberQuality) #426 , ReadableProperty('changesPending', Boolean) #416 , OptionalProperty('command', NetworkPortCommand) #417 , OptionalProperty('macAddress', OctetString) #423 - , ReadableProperty('apduLength', Unsigned) #388 + , ReadableProperty('apduLength', Unsigned) #399 , ReadableProperty('linkSpeed', Real) #420 , OptionalProperty('linkSpeeds', ArrayOf(Real)) #421 , OptionalProperty('linkSpeedAutonegotiate', Boolean) #422 @@ -2374,7 +2374,7 @@ class NetworkPortObject(Object): , OptionalProperty('ipv6DefaultGateway', OctetString) #439 , OptionalProperty('bacnetIPv6MulticastAddress', OctetString) #440 , OptionalProperty('ipv6DNSServer', OctetString) #441 - , OptionalProperty('ipv6AutoAddressingEnabled', Boolean) #442 + , OptionalProperty('ipv6AutoAddressingEnable', Boolean) #442 , OptionalProperty('ipv6DHCPLeaseTime', Unsigned) #443 , OptionalProperty('ipv6DHCPLeaseTimeRemaining', Unsigned) #444 , OptionalProperty('ipv6DHCPServer', OctetString) #445 diff --git a/py34/bacpypes/__init__.py b/py34/bacpypes/__init__.py index 49cd7867..3a06c8ef 100755 --- a/py34/bacpypes/__init__.py +++ b/py34/bacpypes/__init__.py @@ -18,7 +18,7 @@ # Project Metadata # -__version__ = '0.18.6' +__version__ = '0.18.7' __author__ = 'Joel Bender' __email__ = 'joel@carrickbender.com' diff --git a/py34/bacpypes/basetypes.py b/py34/bacpypes/basetypes.py index e62a2958..b8334036 100755 --- a/py34/bacpypes/basetypes.py +++ b/py34/bacpypes/basetypes.py @@ -117,8 +117,7 @@ class ObjectTypesSupported(BitString): , 'accessUser':35 , 'accessZone':36 , 'credentialDataInput':37 - , 'networkPort':56 - , 'networkSecurity':38 + , 'networkSecurity':38 # removed revision 22 , 'bitstringValue':39 , 'characterstringValue':40 , 'datePatternValue':41 @@ -135,8 +134,16 @@ class ObjectTypesSupported(BitString): , 'alertEnrollment':52 , 'channel':53 , 'lightingOutput':54 + , 'binaryLightingOutput':55 + , 'networkPort':56 + , 'elevatorGroup':57 + , 'escalator':58 + , 'lift':59 + , 'staging':60 + , 'auditLog':61 + , 'auditReporter':62 } - bitLen = 55 + bitLen = 63 class PriorityFilter(BitString): bitNames = \ @@ -210,8 +217,16 @@ class ServicesSupported(BitString): , 'subscribeCOVProperty':38 , 'getEventInformation':39 , 'writeGroup':40 + , 'subscribeCOVPropertyMultiple':41 + , 'confirmedCOVNotificationMultiple':42 + , 'unconfirmedCOVNotificationMultiple':43 + , 'confirmedAuditNotification':44 + , 'auditLogQuery':45 + , 'unconfirmedAuditNotification':46 + , 'whoAmI':47 + , 'youAre':48 } - bitLen = 41 + bitLen = 49 class StatusFlags(BitString): bitNames = \ @@ -842,20 +857,27 @@ class ErrorCode(Enumerated): , 'badDestinationDeviceId':87 , 'badSignature':88 , 'badSourceAddress':89 - , 'badTimestamp':90 + , 'badTimestamp':90 #Removed revision 22 , 'busy':82 - , 'cannotUseKey':91 - , 'cannotVerifyMessageId':92 + , 'bvlcFunctionUnknown':143 + , 'bvlcProprietaryFunctionUnknown':144 + , 'cannotUseKey':91 #Removed revision 22 + , 'cannotVerifyMessageId':92 #Removed revision 22 , 'characterSetNotSupported':41 , 'communicationDisabled':83 , 'configurationInProgress':2 - , 'correctKeyRevision':93 + , 'correctKeyRevision':93 #Removed revision 22 , 'covSubscriptionFailed':43 , 'datatypeNotSupported':47 , 'deleteFdtEntryFailed':120 , 'deviceBusy':3 - , 'destinationDeviceIdRequired':94 + , 'destinationDeviceIdRequired':94 #Removed revision 22 , 'distributeBroadcastFailed':121 + , 'dnsError':192 + , 'dnsNameResolutionFailed':190 + , 'dnsResolverFailure':191 + , 'dnsUnavailable':189 + , 'duplicateEntry': 137 , 'duplicateMessage':95 , 'duplicateName':48 , 'duplicateObjectId':49 @@ -864,28 +886,51 @@ class ErrorCode(Enumerated): , 'encryptionRequired':97 , 'fileAccessDenied':5 , 'fileFull':128 + , 'headerEncodingError':145 + , 'headerNotUnderstood':146 + , 'httpError':165 + , 'httpNoUpgrade':153 + , 'httpNotAServer':164 + , 'httpResourceNotLocal':154 + , 'httpProxyAuthenticationFailed':155 + , 'httpResponseTimeout':156 + , 'httpResponseSyntaxError':157 + , 'httpResponseValueError':158 + , 'httpResponseMissingHeader':159 + , 'httpTemporaryUnavailable':163 + , 'httpUnexpectedResponseCode':152 + , 'httpUpgradeRequired':161 + , 'httpUpgradeError':162 + , 'httpWebsocketHeaderError':160 , 'inconsistentConfiguration':129 , 'inconsistentObjectType':130 , 'inconsistentParameters':7 , 'inconsistentSelectionCriterion':8 - , 'incorrectKey':98 + , 'incorrectKey':98 #Removed revision 22 , 'internalError':131 , 'invalidArrayIndex':42 , 'invalidConfigurationData':46 + , 'invalidDataEncoding':142 , 'invalidDataType':9 , 'invalidEventState':73 , 'invalidFileAccessMethod':10 , 'invalidFileStartPosition':11 - , 'invalidKeyData':99 + , 'invalidKeyData':99 #Removed revision 22 , 'invalidParameterDataType':13 , 'invalidTag':57 , 'invalidTimeStamp':14 - , 'keyUpdateInProgress':100 + , 'invalidValueInThisState':138 + , 'ipAddressNotReachable':198 + , 'ipError':199 + , 'keyUpdateInProgress':100 #Removed revision 22 , 'listElementNotFound':81 + , 'listItemNotNumbered':140 + , 'listItemNotTimestamped': 141 , 'logBufferFull':75 , 'loggedValuePurged':76 , 'malformedMessage':101 , 'messageTooLong':113 + , 'messageIncomplete':147 , 'missingRequiredParameter':16 , 'networkDown':58 , 'noAlarmConfigured':74 @@ -895,10 +940,12 @@ class ErrorCode(Enumerated): , 'noSpaceToAddListElement':19 , 'noSpaceToWriteProperty':20 , 'noVtSessionsAvailable':21 + , 'nodeDuplicateVmac':151 + , 'notABacnetScHub':148 , 'notConfigured':132 , 'notConfiguredForTriggeredLogging':78 , 'notCovProperty':44 - , 'notKeyServer':102 + , 'notKeyServer':102 #Removed revision 22 , 'notRouterToDnet':110 , 'objectDeletionNotPermitted':23 , 'objectIdentifierAlreadyExists':24 @@ -908,6 +955,7 @@ class ErrorCode(Enumerated): , 'outOfMemory':133 , 'parameterOutOfRange':80 , 'passwordFailure':26 + , 'payloadExpected':149 , 'propertyIsNotAList':22 , 'propertyIsNotAnArray':50 , 'readAccessDenied':27 @@ -931,19 +979,34 @@ class ErrorCode(Enumerated): , 'serviceRequestDenied':29 , 'sourceSecurityRequired':104 , 'success':84 + , 'tcpClosedByLocal':195 + , 'tcpClosedOther':196 + , 'tcpConnectTimeout':193 + , 'tcpConnectionRefused':194 + , 'tcpError':197 , 'timeout':30 - , 'tooManyKeys':105 + , 'tlsClientAuthenticationFailed':182 + , 'tlsClientCertificateError':180 + , 'tlsClientCertificateExpired':184 + , 'tlsClientCertificateRevoked':186 + , 'tleError':188 + , 'tlsServerAuthenticationFailed':183 + , 'tlsServerCertificateError':181 + , 'tlsServerCertificateExpired':185 + , 'tlsServerCertificateRevoked':187 + , 'tooManyKeys':105 #Removed revision 22 + , 'unexpectedData':150 , 'unknownAuthenticationType':106 , 'unknownDevice':70 , 'unknownFileSize':122 - , 'unknownKey':107 - , 'unknownKeyRevision':108 + , 'unknownKey':107 #Removed revision 22 + , 'unknownKeyRevision':108 #Removed revision 22 , 'unknownNetworkMessage':112 , 'unknownObject':31 , 'unknownProperty':32 , 'unknownSubscription':79 , 'umknownRoute':71 - , 'unknownSourceMessage':109 + , 'unknownSourceMessage':109 #Removed revision 22 , 'unknownVtClass':34 , 'unknownVtSession':35 , 'unsupportedObjectType':36 @@ -952,6 +1015,20 @@ class ErrorCode(Enumerated): , 'valueTooLong':134 , 'vtSessionAlreadyClosed':38 , 'vtSessionTerminationFailure':39 + , 'websocket-close-error':168 + , 'websocket-closed-abnormally':173 + , 'websocket-closed-by-peer':169 + , 'websocket-data-against-policy':175 + , 'websocket-data-inconsistent':174 + , 'websocket-data-not-accepted':172 + , 'websocket-endpoint-leaves':170 + , 'websocket-error':179 + , 'websocket-extension-missing':177 + , 'websocket-frame-too-long':176 + , 'websocket-protocol-error':171 + , 'websocket-request-unavailable':178 + , 'websocket-scheme-not-supported':166 + , 'websocket-unknown-control-message':167 , 'writeAccessDenied':40 , 'writeBdtFailed':116 } @@ -1326,7 +1403,7 @@ class PropertyIdentifier(Enumerated): , 'all':8 , 'allowGroupDelayInhibit':365 , 'allWritesSuccessful':9 - , 'apduLength':388 + , 'apduLength':399 , 'apduSegmentTimeout':10 , 'apduTimeout':11 , 'applicationSoftwareVersion':12 @@ -1509,7 +1586,7 @@ class PropertyIdentifier(Enumerated): , 'ipDNSServer':406 , 'ipSubnetMask':411 , 'ipv6Address':436 - , 'ipv6AutoAddressingEnabled':442 + , 'ipv6AutoAddressingEnable':442 , 'ipv6DefaultGateway':439 , 'ipv6DHCPLeaseTime':443 , 'ipv6DHCPLeaseTimeRemaining':444 @@ -1602,7 +1679,7 @@ class PropertyIdentifier(Enumerated): , 'networkAccessSecurityPolicies':332 , 'networkInterfaceName':424 , 'networkNumber':425 - , 'networkNumberQuality':427 + , 'networkNumberQuality':426 , 'networkType': 427 , 'nextStoppingFloor':476 , 'nodeSubtype':207 @@ -1650,7 +1727,7 @@ class PropertyIdentifier(Enumerated): , 'priorityForWriting':88 , 'processIdentifier':89 , 'processIdentifierFilter':361 - , 'profileLocation':91 + , 'profileLocation':485 , 'profileName':168 , 'programChange':90 , 'programLocation':91 @@ -1837,6 +1914,7 @@ class Reliability(Enumerated): , 'proprietaryCommandFailure': 22 , 'faultsListed': 23 , 'referencedObjectFault': 24 + , 'multiStateOutOfRange':25 } class RestartReason(Enumerated): @@ -1850,6 +1928,7 @@ class RestartReason(Enumerated): , 'hardwareWatchdog':5 , 'softwareWatchdog':6 , 'suspended':7 + , 'activateChanges':8 } class SecurityLevel(Enumerated): @@ -1997,34 +2076,34 @@ class RouterEntryStatus(Enumerated): class HostAddress(Choice): choiceElements = \ - [ Element('none', Null) - , Element('ipAddress', OctetString) # 4 octets for B/IP or 16 octets for B/IPv6 - , Element('name', CharacterString) # Internet host name (see RFC 1123) + [ Element('none', Null, 0) + , Element('ipAddress', OctetString, 1) # 4 octets for B/IP or 16 octets for B/IPv6 + , Element('name', CharacterString, 2) # Internet host name (see RFC 1123) ] class HostNPort(Sequence): sequenceElements = \ - [ Element('host', HostAddress) - , Element('port', Unsigned16) + [ Element('host', HostAddress, 0) + , Element('port', Unsigned16, 1) ] class BDTEntry(Sequence): sequenceElements = \ - [ Element('bbmdAddress', HostNPort) - , Element('broadcastMask', OctetString) # shall be present if BACnet/IP, and absent for BACnet/IPv6 + [ Element('bbmdAddress', HostNPort, 0) + , Element('broadcastMask', OctetString, 1) # shall be present if BACnet/IP, and absent for BACnet/IPv6 ] class FDTEntry(Sequence): sequenceElements = \ - [ Element('bacnetIPAddress', OctetString) # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant - , Element('timeToLive', Unsigned16) # time to live in seconds at the time of registration - , Element('remainingTimeToLive', Unsigned16) # remaining time to live in seconds, incl. grace period + [ Element('bacnetIPAddress', OctetString, 0) # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant + , Element('timeToLive', Unsigned16, 1) # time to live in seconds at the time of registration + , Element('remainingTimeToLive', Unsigned16, 2) # remaining time to live in seconds, incl. grace period ] class VMACEntry(Sequence): sequenceElements = \ - [ Element('virtualMACAddress', OctetString) # maximum size 6 octets - , Element('nativeMACAddress', OctetString) + [ Element('virtualMACAddress', OctetString, 0) # maximum size 6 octets + , Element('nativeMACAddress', OctetString, 1) ] class PropertyReference(Sequence): @@ -2035,9 +2114,10 @@ class PropertyReference(Sequence): class RouterEntry(Sequence): sequenceElements = \ - [ Element('networkNumber', Unsigned16) - , Element('macAddress', OctetString) - , Element('status', RouterEntryStatus) # Defined Above + [ Element('networkNumber', Unsigned16, 0) + , Element('macAddress', OctetString, 1) + , Element('status', RouterEntryStatus, 2) # Defined Above + , Element('performanceIndex', Unsigned8, 3, True) ] @bacpypes_debugging diff --git a/py34/bacpypes/object.py b/py34/bacpypes/object.py index ef58862a..1485e5a1 100644 --- a/py34/bacpypes/object.py +++ b/py34/bacpypes/object.py @@ -2341,11 +2341,11 @@ class NetworkPortObject(Object): , ReadableProperty('protocolLevel', ProtocolLevel) #482 , OptionalProperty('referencePort', Unsigned) #483 , ReadableProperty('networkNumber', Unsigned16) #425 - , ReadableProperty('networkNumberQuality', NetworkNumberQuality) #427 + , ReadableProperty('networkNumberQuality', NetworkNumberQuality) #426 , ReadableProperty('changesPending', Boolean) #416 , OptionalProperty('command', NetworkPortCommand) #417 , OptionalProperty('macAddress', OctetString) #423 - , ReadableProperty('apduLength', Unsigned) #388 + , ReadableProperty('apduLength', Unsigned) #399 , ReadableProperty('linkSpeed', Real) #420 , OptionalProperty('linkSpeeds', ArrayOf(Real)) #421 , OptionalProperty('linkSpeedAutonegotiate', Boolean) #422 @@ -2375,7 +2375,7 @@ class NetworkPortObject(Object): , OptionalProperty('ipv6DefaultGateway', OctetString) #439 , OptionalProperty('bacnetIPv6MulticastAddress', OctetString) #440 , OptionalProperty('ipv6DNSServer', OctetString) #441 - , OptionalProperty('ipv6AutoAddressingEnabled', Boolean) #442 + , OptionalProperty('ipv6AutoAddressingEnable', Boolean) #442 , OptionalProperty('ipv6DHCPLeaseTime', Unsigned) #443 , OptionalProperty('ipv6DHCPLeaseTimeRemaining', Unsigned) #444 , OptionalProperty('ipv6DHCPServer', OctetString) #445 diff --git a/samples/OpenWeatherServer.py b/samples/OpenWeatherServer.py index 6183c0d0..094f6974 100644 --- a/samples/OpenWeatherServer.py +++ b/samples/OpenWeatherServer.py @@ -185,8 +185,8 @@ def flatten(x, prefix="$"): yield (prefix, x) -@recurring_function(APPINTERVAL) @bacpypes_debugging +# @recurring_function(APPINTERVAL) def update_weather_data(): """Read the current weather data from the API and set the object values.""" if _debug: diff --git a/sandbox/network_port_object.py b/sandbox/network_port_object.py index 9d99530f..8e0cf95a 100644 --- a/sandbox/network_port_object.py +++ b/sandbox/network_port_object.py @@ -1,36 +1,130 @@ - from bacpypes.object import Object, ReadableProperty, OptionalProperty -from bacpypes.primitivedata import Atomic, BitString, Boolean, CharacterString, Date, \ - Double, Integer, ObjectIdentifier, ObjectType, OctetString, Real, Time, \ - Unsigned, Tag, Enumerated, Null - -from bacpypes.constructeddata import AnyAtomic, Array, ArrayOf, List, ListOf, \ - Choice, Element, Sequence - -from bacpypes.basetypes import AccessCredentialDisable, AccessCredentialDisableReason, \ - AccessEvent, AccessPassbackMode, AccessRule, AccessThreatLevel, \ - AccessUserType, AccessZoneOccupancyState, AccumulatorRecord, Action, \ - ActionList, AddressBinding, AssignedAccessRights, AuthenticationFactor, \ - AuthenticationFactorFormat, AuthenticationPolicy, AuthenticationStatus, \ - AuthorizationException, AuthorizationMode, BackupState, BinaryPV, \ - COVSubscription, CalendarEntry, ChannelValue, ClientCOV, \ - CredentialAuthenticationFactor, DailySchedule, DateRange, DateTime, \ - Destination, DeviceObjectPropertyReference, DeviceObjectReference, \ - DeviceStatus, DoorAlarmState, DoorSecuredStatus, DoorStatus, DoorValue, \ - EngineeringUnits, EventNotificationSubscription, EventParameter, \ - EventState, EventTransitionBits, EventType, FaultParameter, FaultType, \ - FileAccessMethod, LifeSafetyMode, LifeSafetyOperation, LifeSafetyState, \ - LightingCommand, LightingInProgress, LightingTransition, LimitEnable, \ - LockStatus, LogMultipleRecord, LogRecord, LogStatus, LoggingType, \ - Maintenance, NetworkSecurityPolicy, NodeType, NotifyType, \ - ObjectPropertyReference, ObjectTypesSupported, OptionalCharacterString, \ - Polarity, PortPermission, Prescale, PriorityArray, ProcessIdSelection, \ - ProgramError, ProgramRequest, ProgramState, PropertyAccessResult, \ - PropertyIdentifier, Recipient, Reliability, RestartReason, Scale, \ - SecurityKeySet, SecurityLevel, Segmentation, ServicesSupported, \ - SetpointReference, ShedLevel, ShedState, SilencedState, SpecialEvent, \ - StatusFlags, TimeStamp, VTClass, VTSession, WriteStatus +from bacpypes.primitivedata import ( + Atomic, + BitString, + Boolean, + CharacterString, + Date, + Double, + Integer, + ObjectIdentifier, + ObjectType, + OctetString, + Real, + Time, + Unsigned, + Tag, + Enumerated, + Null, +) + +from bacpypes.constructeddata import ( + AnyAtomic, + Array, + ArrayOf, + List, + ListOf, + Choice, + Element, + Sequence, +) + +from bacpypes.basetypes import ( + AccessCredentialDisable, + AccessCredentialDisableReason, + AccessEvent, + AccessPassbackMode, + AccessRule, + AccessThreatLevel, + AccessUserType, + AccessZoneOccupancyState, + AccumulatorRecord, + Action, + ActionList, + AddressBinding, + AssignedAccessRights, + AuthenticationFactor, + AuthenticationFactorFormat, + AuthenticationPolicy, + AuthenticationStatus, + AuthorizationException, + AuthorizationMode, + BackupState, + BinaryPV, + COVSubscription, + CalendarEntry, + ChannelValue, + ClientCOV, + CredentialAuthenticationFactor, + DailySchedule, + DateRange, + DateTime, + Destination, + DeviceObjectPropertyReference, + DeviceObjectReference, + DeviceStatus, + DoorAlarmState, + DoorSecuredStatus, + DoorStatus, + DoorValue, + EngineeringUnits, + EventNotificationSubscription, + EventParameter, + EventState, + EventTransitionBits, + EventType, + FaultParameter, + FaultType, + FileAccessMethod, + LifeSafetyMode, + LifeSafetyOperation, + LifeSafetyState, + LightingCommand, + LightingInProgress, + LightingTransition, + LimitEnable, + LockStatus, + LogMultipleRecord, + LogRecord, + LogStatus, + LoggingType, + Maintenance, + NetworkSecurityPolicy, + NodeType, + NotifyType, + ObjectPropertyReference, + ObjectTypesSupported, + OptionalCharacterString, + Polarity, + PortPermission, + Prescale, + PriorityArray, + ProcessIdSelection, + ProgramError, + ProgramRequest, + ProgramState, + PropertyAccessResult, + PropertyIdentifier, + Recipient, + Reliability, + RestartReason, + Scale, + SecurityKeySet, + SecurityLevel, + Segmentation, + ServicesSupported, + SetpointReference, + ShedLevel, + ShedState, + SilencedState, + SpecialEvent, + StatusFlags, + TimeStamp, + VTClass, + VTSession, + WriteStatus, +) # TODO: add to objectIdentifier enumeration # TODO: add to objectTypesSupported @@ -38,17 +132,15 @@ # TODO: fix property names - - # # NEW PRIMITIVES # -class Unsigned8(Unsigned): +class Unsigned8(Unsigned): _app_tag = Tag.unsignedAppTag - def __init__(self,arg = None): + def __init__(self, arg=None): Unsigned.__init__(self, arg) self.value = 0 @@ -65,7 +157,6 @@ def __init__(self,arg = None): else: raise TypeError("invalid constructor datatype") - @classmethod def is_valid(cls, arg): """Return True if arg is valid value for the class.""" @@ -76,10 +167,9 @@ def __str__(self): class Unsigned16(Unsigned): - _app_tag = Tag.unsignedAppTag - def __init__(self,arg = None): + def __init__(self, arg=None): Unsigned.__init__(self, arg) self.value = 0 @@ -96,7 +186,6 @@ def __init__(self,arg = None): else: raise TypeError("invalid constructor datatype") - @classmethod def is_valid(cls, arg): """Return True if arg is valid value for the class.""" @@ -105,194 +194,207 @@ def is_valid(cls, arg): def __str__(self): return "%s(%s)" % (self.__class__.__name__, self.value) + # # NEW BASETYPES # # Enumerations + class NetworkType(Enumerated): - enumerations = \ - { 'ethernet':0 - , 'arcnet':1 - , 'mstp':2 - , 'ptp':3 - , 'lontalk':4 - , 'ipv4':5 - , 'zigbee':6 - , 'virtual': 7 + enumerations = { + "ethernet": 0, + "arcnet": 1, + "mstp": 2, + "ptp": 3, + "lontalk": 4, + "ipv4": 5, + "zigbee": 6, + "virtual": 7 # , 'non-bacnet': 8 Removed in Version 1, Revision 18 - , 'ipv6':9 - , 'serial':10 - } + , + "ipv6": 9, + "serial": 10, + } + class ProtocolLevel(Enumerated): - enumerations = \ - { 'physical':0 - , 'protocol':1 - , 'bacnetApplication':2 - , 'nonBacnetApplication':3 - } + enumerations = { + "physical": 0, + "protocol": 1, + "bacnetApplication": 2, + "nonBacnetApplication": 3, + } + class NetworkNumberQuality(Enumerated): - enumerations = \ - { 'unknown':0 - , 'learned':1 - , 'learnedConfigured':2 - , 'configured':3 - } + enumerations = {"unknown": 0, "learned": 1, "learnedConfigured": 2, "configured": 3} + class NetworkPortCommand(Enumerated): - enumerations = \ - { 'idle':0 - , 'discardChanges':1 - , 'renewFdDRegistration':2 - , 'restartSlaveDiscovery':3 - , 'renewDHCP':4 - , 'restartAutonegotiation':5 - , 'disconnect':6 - , 'restartPort':7 - } + enumerations = { + "idle": 0, + "discardChanges": 1, + "renewFdDRegistration": 2, + "restartSlaveDiscovery": 3, + "renewDHCP": 4, + "restartAutonegotiation": 5, + "disconnect": 6, + "restartPort": 7, + } + class IPMode(Enumerated): - enumerations = \ - { 'normal':0 - , 'foreign':1 - , 'bbmd':2 - } + enumerations = {"normal": 0, "foreign": 1, "bbmd": 2} + class RouterEntryStatus(Enumerated): # This was defined directly in the RouterEntry Sequence in the standard, but I moved it up here because # I didn't see anywhere else you defined something that way. - enumerations = \ - { 'available':0 - , 'busy':1 - , 'disconnected':2 - } + enumerations = {"available": 0, "busy": 1, "disconnected": 2} + # Choices + class HostAddress(Choice): - choiceElements = \ - [ Element('none', Null) - , Element('ipAddress', OctetString) # 4 octets for B/IP or 16 octets for B/IPv6 - , Element('name', CharacterString) # Internet host name (see RFC 1123) - ] + choiceElements = [ + Element("none", Null), + Element("ipAddress", OctetString), # 4 octets for B/IP or 16 octets for B/IPv6 + Element("name", CharacterString), # Internet host name (see RFC 1123) + ] + # Sequences + class HostNPort(Sequence): - sequenceElements = \ - [ Element('host', HostAddress) - , Element('port', Unsigned16) - ] + sequenceElements = [Element("host", HostAddress), Element("port", Unsigned16)] + class BDTEntry(Sequence): - sequenceElements = \ - [ Element('bbmdAddress', HostNPort) - , Element('broadcastMask', OctetString) # shall be present if BACnet/IP, and absent for BACnet/IPv6 - ] + sequenceElements = [ + Element("bbmdAddress", HostNPort), + Element( + "broadcastMask", OctetString + ), # shall be present if BACnet/IP, and absent for BACnet/IPv6 + ] + class FDTEntry(Sequence): - sequenceElements = \ - [ Element('bacnetIPAddress', OctetString) # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant - , Element('timeToLive', Unsigned16) # time to live in seconds at the time of registration - , Element('remainingTimeToLive', Unsigned16) # remaining time to live in seconds, incl. grace period - ] + sequenceElements = [ + Element( + "bacnetIPAddress", OctetString + ), # the 6-octet B/IP or 18-octet B/IPv6 address of the registrant + Element( + "timeToLive", Unsigned16 + ), # time to live in seconds at the time of registration + Element( + "remainingTimeToLive", Unsigned16 + ), # remaining time to live in seconds, incl. grace period + ] + class VMACEntry(Sequence): - sequenceElements = \ - [ Element('virtualMACAddress', OctetString) # maximum size 6 octets - , Element('nativeMACAddress', OctetString) - ] + sequenceElements = [ + Element("virtualMACAddress", OctetString), # maximum size 6 octets + Element("nativeMACAddress", OctetString), + ] + class RouterEntry(Sequence): - sequenceElements = \ - [ Element('networkNumber', Unsigned16) - , Element('macAddress', OctetString) - , Element('status', RouterEntryStatus) # Defined Above - ] + sequenceElements = [ + Element("networkNumber", Unsigned16), + Element("macAddress", OctetString), + Element("status", RouterEntryStatus), # Defined Above + ] + class NameValue(Sequence): - sequenceElements = \ - [ Element('name', CharacterString) - , Element('value', Atomic) # IS ATOMIC CORRECT HERE? value is limited to primitive datatypes and BACnetDateTime - ] + sequenceElements = [ + Element("name", CharacterString), + Element( + "value", Atomic + ), # IS ATOMIC CORRECT HERE? value is limited to primitive datatypes and BACnetDateTime + ] + # # NEW OBJECT # + class NetworkPortObject(Object): - objectType = 'NetworkPort' #56 - properties = \ - [ ReadableProperty('statusFlags', StatusFlags) #111 - , ReadableProperty('reliability', Reliability) #103 - , ReadableProperty('outOfService', Boolean) #81 - , ReadableProperty('networkType', NetworkType) #427 - , ReadableProperty('protocolLevel', ProtocolLevel) #482 - , OptionalProperty('referencePort', Unsigned) #483 - , ReadableProperty('networkNumber', Unsigned16) #425 - , ReadableProperty('networkNumberQuality', NetworkNumberQuality) #427 - , ReadableProperty('changesPending', Boolean) #416 - , OptionalProperty('command', NetworkPortCommand) #417 - , OptionalProperty('macAddress', OctetString) #423 - , ReadableProperty('apduLength', Unsigned) #388 - , ReadableProperty('linkSpeed', Real) #420 - , OptionalProperty('linkSpeeds', ArrayOf(Real)) #421 - , OptionalProperty('eventTimeStamps', ArrayOf(TimeStamp)) #130 - , OptionalProperty('linkSpeedAutonegotiate', Boolean) #422 - , OptionalProperty('networkInterfaceName', CharacterString) #424 - , OptionalProperty('ipMode', IPMode) #408 - , OptionalProperty('ipAddress', OctetString) #400 - , OptionalProperty('ipUDPPort', Unsigned16) #412 - , OptionalProperty('ipSubnetMask', OctetString) #411 - , OptionalProperty('ipDefaultGateway', OctetString) #401 - , OptionalProperty('ipMulticastAddress', OctetString) #409 - , OptionalProperty('ipDNSServer', ArrayOf(OctetString)) #406 - , OptionalProperty('ipDHCPEnable', Boolean) #402 - , OptionalProperty('ipDHCPLeaseTime', Unsigned) #403 - , OptionalProperty('ipDHCPLeaseTimeRemaining', Unsigned) #404 - , OptionalProperty('ipDHCPServer', OctetString) #405 - , OptionalProperty('ipNATTraversal', Boolean) #410 - , OptionalProperty('ipGlobalAddress', HostNPort) #407 - , OptionalProperty('broadcastDistributionTable', ListOf(BDTEntry)) #414 - , OptionalProperty('acceptFDRegistrations', Boolean) #413 - , OptionalProperty('bbmdForeignDeviceTable', ListOf(FDTEntry)) #415 - , OptionalProperty('fdBBMDAddress', HostNPort) #418 - , OptionalProperty('fdSubscriptionLifetime', Unsigned16) #419 - , OptionalProperty('ipv6Mode', IPMode) #435 - , OptionalProperty('ipv6Address', OctetString) #436 - , OptionalProperty('ipv6PrefixLength', Unsigned8) #437 - , OptionalProperty('ipv6UDPPort', Unsigned16) #438 - , OptionalProperty('ipv6DefaultGateway', OctetString) #439 - , OptionalProperty('ipv6MulticastAddress', OctetString) #440 - , OptionalProperty('ipv6DNSServer', OctetString) #441 - , OptionalProperty('ipv6AutoAddressingEnabled', Boolean) #442 - , OptionalProperty('ipv6DHCPLeaseTime', Unsigned) #443 - , OptionalProperty('ipv6DHCPLeaseTimeRemaining', Unsigned) #444 - , OptionalProperty('ipv6DHCPServer', OctetString) #445 - , OptionalProperty('ipv6ZoneIndex', CharacterString) #446 - , OptionalProperty('maxMasters', Unsigned8) # range 0-127 #64 - , OptionalProperty('maxInfoFrames', Unsigned8) #63 - , OptionalProperty('slaveProxyEnable', Boolean) #172 - , OptionalProperty('manualSlaveAddressBinding', ListOf(AddressBinding)) #170 - , OptionalProperty('autoSlaveDiscovery', Boolean) #169 - , OptionalProperty('slaveAddressBinding', ListOf(AddressBinding)) #171 - , OptionalProperty('virtualMACAddressTable', ListOf(VMACEntry)) #429 - , OptionalProperty('routingTable', ListOf(RouterEntry)) #428 - , OptionalProperty('eventDetectionEnabled', Boolean) #353 - , OptionalProperty('notificationClass', Unsigned) #17 - , OptionalProperty('eventEnable', EventTransitionBits) #35 - , OptionalProperty('ackedTransitions', EventTransitionBits) #0 - , OptionalProperty('notifyType', NotifyType) #72 - , OptionalProperty('eventTimeStamps', ArrayOf(TimeStamp, 3)) #130 - , OptionalProperty('eventMessageTexts', ArrayOf(CharacterString, 3)) #351 - , OptionalProperty('eventMessageTextsConfig', ArrayOf(CharacterString, 3)) #352 - , OptionalProperty('eventState', EventState) #36 - , ReadableProperty('reliabilityEvaluationInhibit', Boolean) #357 - , OptionalProperty('propertyList', ArrayOf(PropertyIdentifier)) #371 - , OptionalProperty('tags', ArrayOf(NameValue)) #486 - , OptionalProperty('profileLocation', CharacterString) #91 - , OptionalProperty('profileName', CharacterString) #168 - ] + objectType = "NetworkPort" # 56 + properties = [ + ReadableProperty("statusFlags", StatusFlags), # 111 + ReadableProperty("reliability", Reliability), # 103 + ReadableProperty("outOfService", Boolean), # 81 + ReadableProperty("networkType", NetworkType), # 427 + ReadableProperty("protocolLevel", ProtocolLevel), # 482 + OptionalProperty("referencePort", Unsigned), # 483 + ReadableProperty("networkNumber", Unsigned16), # 425 + ReadableProperty("networkNumberQuality", NetworkNumberQuality), # 426 + ReadableProperty("changesPending", Boolean), # 416 + OptionalProperty("command", NetworkPortCommand), # 417 + OptionalProperty("macAddress", OctetString), # 423 + ReadableProperty("apduLength", Unsigned), # 399 + ReadableProperty("linkSpeed", Real), # 420 + OptionalProperty("linkSpeeds", ArrayOf(Real)), # 421 + OptionalProperty("eventTimeStamps", ArrayOf(TimeStamp)), # 130 + OptionalProperty("linkSpeedAutonegotiate", Boolean), # 422 + OptionalProperty("networkInterfaceName", CharacterString), # 424 + OptionalProperty("ipMode", IPMode), # 408 + OptionalProperty("ipAddress", OctetString), # 400 + OptionalProperty("ipUDPPort", Unsigned16), # 412 + OptionalProperty("ipSubnetMask", OctetString), # 411 + OptionalProperty("ipDefaultGateway", OctetString), # 401 + OptionalProperty("ipMulticastAddress", OctetString), # 409 + OptionalProperty("ipDNSServer", ArrayOf(OctetString)), # 406 + OptionalProperty("ipDHCPEnable", Boolean), # 402 + OptionalProperty("ipDHCPLeaseTime", Unsigned), # 403 + OptionalProperty("ipDHCPLeaseTimeRemaining", Unsigned), # 404 + OptionalProperty("ipDHCPServer", OctetString), # 405 + OptionalProperty("ipNATTraversal", Boolean), # 410 + OptionalProperty("ipGlobalAddress", HostNPort), # 407 + OptionalProperty("broadcastDistributionTable", ListOf(BDTEntry)), # 414 + OptionalProperty("acceptFDRegistrations", Boolean), # 413 + OptionalProperty("bbmdForeignDeviceTable", ListOf(FDTEntry)), # 415 + OptionalProperty("fdBBMDAddress", HostNPort), # 418 + OptionalProperty("fdSubscriptionLifetime", Unsigned16), # 419 + OptionalProperty("ipv6Mode", IPMode), # 435 + OptionalProperty("ipv6Address", OctetString), # 436 + OptionalProperty("ipv6PrefixLength", Unsigned8), # 437 + OptionalProperty("ipv6UDPPort", Unsigned16), # 438 + OptionalProperty("ipv6DefaultGateway", OctetString), # 439 + OptionalProperty("ipv6MulticastAddress", OctetString), # 440 + OptionalProperty("ipv6DNSServer", OctetString), # 441 + OptionalProperty("ipv6AutoAddressingEnable", Boolean), # 442 + OptionalProperty("ipv6DHCPLeaseTime", Unsigned), # 443 + OptionalProperty("ipv6DHCPLeaseTimeRemaining", Unsigned), # 444 + OptionalProperty("ipv6DHCPServer", OctetString), # 445 + OptionalProperty("ipv6ZoneIndex", CharacterString), # 446 + OptionalProperty("maxMasters", Unsigned8), # range 0-127 #64 + OptionalProperty("maxInfoFrames", Unsigned8), # 63 + OptionalProperty("slaveProxyEnable", Boolean), # 172 + OptionalProperty("manualSlaveAddressBinding", ListOf(AddressBinding)), # 170 + OptionalProperty("autoSlaveDiscovery", Boolean), # 169 + OptionalProperty("slaveAddressBinding", ListOf(AddressBinding)), # 171 + OptionalProperty("virtualMACAddressTable", ListOf(VMACEntry)), # 429 + OptionalProperty("routingTable", ListOf(RouterEntry)), # 428 + OptionalProperty("eventDetectionEnabled", Boolean), # 353 + OptionalProperty("notificationClass", Unsigned), # 17 + OptionalProperty("eventEnable", EventTransitionBits), # 35 + OptionalProperty("ackedTransitions", EventTransitionBits), # 0 + OptionalProperty("notifyType", NotifyType), # 72 + OptionalProperty("eventTimeStamps", ArrayOf(TimeStamp, 3)), # 130 + OptionalProperty("eventMessageTexts", ArrayOf(CharacterString, 3)), # 351 + OptionalProperty("eventMessageTextsConfig", ArrayOf(CharacterString, 3)), # 352 + OptionalProperty("eventState", EventState), # 36 + ReadableProperty("reliabilityEvaluationInhibit", Boolean), # 357 + OptionalProperty("propertyList", ArrayOf(PropertyIdentifier)), # 371 + OptionalProperty("tags", ArrayOf(NameValue)), # 486 + OptionalProperty("profileLocation", CharacterString), # 91 + OptionalProperty("profileName", CharacterString), # 168 + ] diff --git a/setup.py b/setup.py index 5ffef004..0ec7eacd 100644 --- a/setup.py +++ b/setup.py @@ -21,6 +21,8 @@ (3, 6): 'py34', (3, 7): 'py34', (3, 8): 'py34', + (3, 9): 'py34', + (3, 10): 'py34', }.get(version_info, None) if not source_folder: raise EnvironmentError("unsupported version of Python")