hat.drivers.mms

Manufacturing Message Specification

  1"""Manufacturing Message Specification"""
  2
  3from hat.drivers.mms.connection import (
  4    ConnectionCb,
  5    RequestCb,
  6    UnconfirmedCb,
  7    connect,
  8    listen,
  9    Server,
 10    Connection)
 11
 12from hat.drivers.mms.common import (
 13    DataAccessError,
 14    ObjectClass,
 15    AaSpecificObjectName,
 16    DomainSpecificObjectName,
 17    VmdSpecificObjectName,
 18    ObjectName,
 19    AaSpecificObjectScope,
 20    DomainSpecificObjectScope,
 21    VmdSpecificObjectScope,
 22    ObjectScope,
 23    ArrayData,
 24    BcdData,
 25    BinaryTimeData,
 26    BitStringData,
 27    BooleanData,
 28    BooleanArrayData,
 29    FloatingPointData,
 30    GeneralizedTimeData,
 31    IntegerData,
 32    MmsStringData,
 33    ObjIdData,
 34    OctetStringData,
 35    StructureData,
 36    UnsignedData,
 37    UtcTimeData,
 38    VisibleStringData,
 39    Data,
 40    ArrayTypeDescription,
 41    BcdTypeDescription,
 42    BinaryTimeTypeDescription,
 43    BitStringTypeDescription,
 44    BooleanTypeDescription,
 45    FloatingPointTypeDescription,
 46    GeneralizedTimeTypeDescription,
 47    IntegerTypeDescription,
 48    MmsStringTypeDescription,
 49    ObjIdTypeDescription,
 50    OctetStringTypeDescription,
 51    StructureTypeDescription,
 52    UnsignedTypeDescription,
 53    UtcTimeTypeDescription,
 54    VisibleStringTypeDescription,
 55    TypeDescription,
 56    AddressVariableSpecification,
 57    InvalidatedVariableSpecification,
 58    NameVariableSpecification,
 59    ScatteredAccessDescriptionVariableSpecification,
 60    VariableDescriptionVariableSpecification,
 61    VariableSpecification,
 62    StatusRequest,
 63    GetNameListRequest,
 64    IdentifyRequest,
 65    GetVariableAccessAttributesRequest,
 66    GetNamedVariableListAttributesRequest,
 67    ReadRequest,
 68    WriteRequest,
 69    DefineNamedVariableListRequest,
 70    DeleteNamedVariableListRequest,
 71    Request,
 72    StatusResponse,
 73    GetNameListResponse,
 74    IdentifyResponse,
 75    GetVariableAccessAttributesResponse,
 76    GetNamedVariableListAttributesResponse,
 77    ReadResponse,
 78    WriteResponse,
 79    DefineNamedVariableListResponse,
 80    DeleteNamedVariableListResponse,
 81    Response,
 82    VmdStateError,
 83    ApplicationReferenceError,
 84    DefinitionError,
 85    ResourceError,
 86    ServiceError,
 87    ServicePreemptError,
 88    TimeResolutionError,
 89    AccessError,
 90    InitiateError,
 91    ConcludeError,
 92    CancelError,
 93    FileError,
 94    OtherError,
 95    Error,
 96    EventNotificationUnconfirmed,
 97    InformationReportUnconfirmed,
 98    UnsolicitedStatusUnconfirmed,
 99    Unconfirmed)
100
101
102__all__ = [
103    'ConnectionCb',
104    'RequestCb',
105    'UnconfirmedCb',
106    'connect',
107    'listen',
108    'Server',
109    'Connection',
110    'DataAccessError',
111    'ObjectClass',
112    'AaSpecificObjectName',
113    'DomainSpecificObjectName',
114    'VmdSpecificObjectName',
115    'ObjectName',
116    'AaSpecificObjectScope',
117    'DomainSpecificObjectScope',
118    'VmdSpecificObjectScope',
119    'ObjectScope',
120    'ArrayData',
121    'BcdData',
122    'BinaryTimeData',
123    'BitStringData',
124    'BooleanData',
125    'BooleanArrayData',
126    'FloatingPointData',
127    'GeneralizedTimeData',
128    'IntegerData',
129    'MmsStringData',
130    'ObjIdData',
131    'OctetStringData',
132    'StructureData',
133    'UnsignedData',
134    'UtcTimeData',
135    'VisibleStringData',
136    'Data',
137    'ArrayTypeDescription',
138    'BcdTypeDescription',
139    'BinaryTimeTypeDescription',
140    'BitStringTypeDescription',
141    'BooleanTypeDescription',
142    'FloatingPointTypeDescription',
143    'GeneralizedTimeTypeDescription',
144    'IntegerTypeDescription',
145    'MmsStringTypeDescription',
146    'ObjIdTypeDescription',
147    'OctetStringTypeDescription',
148    'StructureTypeDescription',
149    'UnsignedTypeDescription',
150    'UtcTimeTypeDescription',
151    'VisibleStringTypeDescription',
152    'TypeDescription',
153    'AddressVariableSpecification',
154    'InvalidatedVariableSpecification',
155    'NameVariableSpecification',
156    'ScatteredAccessDescriptionVariableSpecification',
157    'VariableDescriptionVariableSpecification',
158    'VariableSpecification',
159    'StatusRequest',
160    'GetNameListRequest',
161    'IdentifyRequest',
162    'GetVariableAccessAttributesRequest',
163    'GetNamedVariableListAttributesRequest',
164    'ReadRequest',
165    'WriteRequest',
166    'DefineNamedVariableListRequest',
167    'DeleteNamedVariableListRequest',
168    'Request',
169    'StatusResponse',
170    'GetNameListResponse',
171    'IdentifyResponse',
172    'GetVariableAccessAttributesResponse',
173    'GetNamedVariableListAttributesResponse',
174    'ReadResponse',
175    'WriteResponse',
176    'DefineNamedVariableListResponse',
177    'DeleteNamedVariableListResponse',
178    'Response',
179    'VmdStateError',
180    'ApplicationReferenceError',
181    'DefinitionError',
182    'ResourceError',
183    'ServiceError',
184    'ServicePreemptError',
185    'TimeResolutionError',
186    'AccessError',
187    'InitiateError',
188    'ConcludeError',
189    'CancelError',
190    'FileError',
191    'OtherError',
192    'Error',
193    'EventNotificationUnconfirmed',
194    'InformationReportUnconfirmed',
195    'UnsolicitedStatusUnconfirmed',
196    'Unconfirmed']
ConnectionCb = typing.Callable[[ForwardRef('Connection')], None | collections.abc.Awaitable[None]]
UnconfirmedCb = typing.Callable[[ForwardRef('Connection'), EventNotificationUnconfirmed | InformationReportUnconfirmed | UnsolicitedStatusUnconfirmed], None | collections.abc.Awaitable[None]]
async def connect( addr: hat.drivers.net.TcpAddress | pathlib.Path, local_detail_calling: int | None = None, request_cb: Callable[[Connection, StatusRequest | GetNameListRequest | IdentifyRequest | GetVariableAccessAttributesRequest | GetNamedVariableListAttributesRequest | ReadRequest | WriteRequest | DefineNamedVariableListRequest | DeleteNamedVariableListRequest], StatusResponse | GetNameListResponse | IdentifyResponse | GetVariableAccessAttributesResponse | GetNamedVariableListAttributesResponse | ReadResponse | WriteResponse | DefineNamedVariableListResponse | DeleteNamedVariableListResponse | VmdStateError | ApplicationReferenceError | DefinitionError | ResourceError | ServiceError | ServicePreemptError | TimeResolutionError | AccessError | InitiateError | ConcludeError | CancelError | FileError | OtherError | Awaitable[StatusResponse | GetNameListResponse | IdentifyResponse | GetVariableAccessAttributesResponse | GetNamedVariableListAttributesResponse | ReadResponse | WriteResponse | DefineNamedVariableListResponse | DeleteNamedVariableListResponse | VmdStateError | ApplicationReferenceError | DefinitionError | ResourceError | ServiceError | ServicePreemptError | TimeResolutionError | AccessError | InitiateError | ConcludeError | CancelError | FileError | OtherError]] | None = None, unconfirmed_cb: Callable[[Connection, EventNotificationUnconfirmed | InformationReportUnconfirmed | UnsolicitedStatusUnconfirmed], None | Awaitable[None]] | None = None, **kwargs) -> Connection:
 73async def connect(addr: net.StreamAddress,
 74                  local_detail_calling: int | None = None,
 75                  request_cb: RequestCb | None = None,
 76                  unconfirmed_cb: UnconfirmedCb | None = None,
 77                  **kwargs
 78                  ) -> 'Connection':
 79    """Connect to MMS server
 80
 81    Additional arguments are passed directly to `hat.drivers.acse.connect`
 82    (`syntax_name_list`, `app_context_name` and `user_data` are set by
 83    this coroutine).
 84
 85    """
 86    initiate_req = 'initiate-RequestPDU', {
 87        'proposedMaxServOutstandingCalling': 5,
 88        'proposedMaxServOutstandingCalled': 5,
 89        'initRequestDetail': {
 90            'proposedVersionNumber': 1,
 91            'proposedParameterCBB': _parameter_cbb,
 92            'servicesSupportedCalling': _service_support}}
 93
 94    if local_detail_calling is not None:
 95        initiate_req[1]['localDetailCalling'] = local_detail_calling
 96
 97    req_user_data = _encode(initiate_req)
 98    conn = await acse.connect(addr=addr,
 99                              syntax_name_list=[_mms_syntax_name],
100                              app_context_name=_mms_app_context_name,
101                              user_data=(_mms_syntax_name, req_user_data),
102                              **kwargs)
103
104    try:
105        res_syntax_name, res_user_data = conn.conn_res_user_data
106        if res_syntax_name != _mms_syntax_name:
107            raise Exception("invalid syntax name")
108
109        initiate_res = _decode(res_user_data)
110        if initiate_res[0] != 'initiate-ResponsePDU':
111            raise Exception("invalid initiate response")
112
113        return Connection(conn=conn,
114                          request_cb=request_cb,
115                          unconfirmed_cb=unconfirmed_cb)
116
117    except Exception:
118        await aio.uncancellable(conn.async_close())
119        raise

Connect to MMS server

Additional arguments are passed directly to hat.drivers.acse.connect (syntax_name_list, app_context_name and user_data are set by this coroutine).

async def listen( connection_cb: Callable[[Connection], None | Awaitable[None]], addr: hat.drivers.net.TcpAddress | pathlib.Path = TcpAddress(host='0.0.0.0', port=102), request_cb: Callable[[Connection, StatusRequest | GetNameListRequest | IdentifyRequest | GetVariableAccessAttributesRequest | GetNamedVariableListAttributesRequest | ReadRequest | WriteRequest | DefineNamedVariableListRequest | DeleteNamedVariableListRequest], StatusResponse | GetNameListResponse | IdentifyResponse | GetVariableAccessAttributesResponse | GetNamedVariableListAttributesResponse | ReadResponse | WriteResponse | DefineNamedVariableListResponse | DeleteNamedVariableListResponse | VmdStateError | ApplicationReferenceError | DefinitionError | ResourceError | ServiceError | ServicePreemptError | TimeResolutionError | AccessError | InitiateError | ConcludeError | CancelError | FileError | OtherError | Awaitable[StatusResponse | GetNameListResponse | IdentifyResponse | GetVariableAccessAttributesResponse | GetNamedVariableListAttributesResponse | ReadResponse | WriteResponse | DefineNamedVariableListResponse | DeleteNamedVariableListResponse | VmdStateError | ApplicationReferenceError | DefinitionError | ResourceError | ServiceError | ServicePreemptError | TimeResolutionError | AccessError | InitiateError | ConcludeError | CancelError | FileError | OtherError]] | None = None, unconfirmed_cb: Callable[[Connection, EventNotificationUnconfirmed | InformationReportUnconfirmed | UnsolicitedStatusUnconfirmed], None | Awaitable[None]] | None = None, *, bind_connections: bool = False, **kwargs) -> Server:
122async def listen(connection_cb: ConnectionCb,
123                 addr: net.StreamAddress = net.TcpAddress('0.0.0.0', 102),
124                 request_cb: RequestCb | None = None,
125                 unconfirmed_cb: UnconfirmedCb | None = None,
126                 *,
127                 bind_connections: bool = False,
128                 **kwargs
129                 ) -> 'Server':
130    """Create MMS listening server
131
132    Additional arguments are passed directly to `hat.drivers.acse.listen`.
133
134    Args:
135        connection_cb: new connection callback
136        request_cb: received request callback
137        addr: local listening address
138
139    """
140    server = Server()
141    server._connection_cb = connection_cb
142    server._request_cb = request_cb
143    server._unconfirmed_cb = unconfirmed_cb
144    server._bind_connections = bind_connections
145    server._log = mlog
146
147    server._srv = await acse.listen(validate_cb=server._on_validate,
148                                    connection_cb=server._on_connection,
149                                    addr=addr,
150                                    bind_connections=False,
151                                    **kwargs)
152
153    server._log = logger.create_server_logger(mlog, server._srv.info)
154
155    return server

Create MMS listening server

Additional arguments are passed directly to hat.drivers.acse.listen.

Arguments:
  • connection_cb: new connection callback
  • request_cb: received request callback
  • addr: local listening address
class Server(hat.aio.group.Resource):
158class Server(aio.Resource):
159    """MMS listening server
160
161    For creating new server see `listen`.
162
163    """
164
165    @property
166    def async_group(self) -> aio.Group:
167        """Async group"""
168        return self._srv.async_group
169
170    @property
171    def info(self) -> net.ServerInfo:
172        """Server info"""
173        return self._srv.info
174
175    async def _on_validate(self, syntax_names, user_data):
176        syntax_name, req_user_data = user_data
177        if syntax_name != _mms_syntax_name:
178            raise Exception('invalid mms syntax name')
179
180        initiate_req = _decode(req_user_data)
181        if initiate_req[0] != 'initiate-RequestPDU':
182            raise Exception('invalid initiate request')
183
184        initiate_res = 'initiate-ResponsePDU', {
185            'negotiatedMaxServOutstandingCalling': 5,
186            'negotiatedMaxServOutstandingCalled': 5,
187            'negotiatedDataStructureNestingLevel': 4,  # TODO compatibility
188            'initResponseDetail': {
189                'negotiatedVersionNumber': 1,
190                'negotiatedParameterCBB': _parameter_cbb,
191                'servicesSupportedCalled': _service_support}}
192        if 'localDetailCalling' in initiate_req[1]:
193            initiate_res[1]['localDetailCalled'] = \
194                initiate_req[1]['localDetailCalling']
195
196        res_user_data = _encode(initiate_res)
197        return _mms_syntax_name, res_user_data
198
199    async def _on_connection(self, acse_conn):
200        try:
201            try:
202                conn = Connection(conn=acse_conn,
203                                  request_cb=self._request_cb,
204                                  unconfirmed_cb=self._unconfirmed_cb)
205
206            except Exception:
207                await aio.uncancellable(acse_conn.async_close())
208                raise
209
210            try:
211                await aio.call(self._connection_cb, conn)
212
213            except BaseException:
214                await aio.uncancellable(conn.async_close())
215                raise
216
217        except Exception as e:
218            self._log.error("error creating new incomming connection: %s",
219                            e, exc_info=e)
220            return
221
222        if not self._bind_connections:
223            return
224
225        try:
226            await conn.wait_closed()
227
228        except BaseException:
229            await aio.uncancellable(conn.async_close())
230            raise

MMS listening server

For creating new server see listen.

async_group: hat.aio.group.Group
165    @property
166    def async_group(self) -> aio.Group:
167        """Async group"""
168        return self._srv.async_group

Async group

170    @property
171    def info(self) -> net.ServerInfo:
172        """Server info"""
173        return self._srv.info

Server info

class Connection(hat.aio.group.Resource):
233class Connection(aio.Resource):
234    """MMS connection
235
236    For creating new connection see `connect` or `listen`.
237
238    """
239
240    def __init__(self,
241                 conn: acse.Connection,
242                 request_cb: RequestCb,
243                 unconfirmed_cb: UnconfirmedCb):
244        self._conn = conn
245        self._request_cb = request_cb
246        self._unconfirmed_cb = unconfirmed_cb
247        self._loop = asyncio.get_running_loop()
248        self._next_invoke_ids = itertools.count(0)
249        self._response_futures = {}
250        self._close_pdu = 'conclude-RequestPDU', None
251        self._async_group = aio.Group()
252        self._log = logger.create_connection_logger(mlog, conn.info)
253        self._comm_log = logger.CommunicationLogger(mlog, conn.info)
254
255        self.async_group.spawn(aio.call_on_cancel, self._on_close)
256        self.async_group.spawn(self._receive_loop)
257        self.async_group.spawn(aio.call_on_done, conn.wait_closing(),
258                               self.close)
259
260        self.async_group.spawn(aio.call_on_cancel, self._comm_log.log,
261                               common.CommLogAction.CLOSE)
262        self._comm_log.log(common.CommLogAction.OPEN)
263
264    @property
265    def async_group(self) -> aio.Group:
266        """Async group"""
267        return self._async_group
268
269    @property
270    def info(self) -> acse.ConnectionInfo:
271        """Connection info"""
272        return self._conn.info
273
274    async def send_unconfirmed(self, unconfirmed: common.Unconfirmed):
275        """Send unconfirmed message"""
276        if not self.is_open:
277            raise ConnectionError()
278
279        pdu = 'unconfirmed-PDU', {
280            'service': encoder.encode_unconfirmed(unconfirmed)}
281        data = _mms_syntax_name, _encode(pdu)
282
283        self._comm_log.log(common.CommLogAction.SEND, unconfirmed)
284
285        await self._conn.send(data)
286
287    async def send_confirmed(self,
288                             req: common.Request
289                             ) -> common.Response | common.Error:
290        """Send confirmed request and wait for response"""
291        if not self.is_open:
292            raise ConnectionError()
293
294        invoke_id = next(self._next_invoke_ids)
295        pdu = 'confirmed-RequestPDU', {
296            'invokeID': invoke_id,
297            'service': encoder.encode_request(req)}
298        data = _mms_syntax_name, _encode(pdu)
299
300        self._comm_log.log(common.CommLogAction.SEND, req)
301
302        await self._conn.send(data)
303
304        if not self.is_open:
305            raise ConnectionError()
306
307        try:
308            future = self._loop.create_future()
309            self._response_futures[invoke_id] = future
310            return await future
311
312        finally:
313            self._response_futures.pop(invoke_id, None)
314
315    async def _on_close(self):
316        if self._conn.is_open:
317            try:
318                data = _mms_syntax_name, _encode(self._close_pdu)
319
320                await self._conn.send(data)
321                await self._conn.drain()
322
323                # TODO: wait for response in case of conclude-RequestPDU
324
325            except Exception as e:
326                self._log.error("on close error: %s", e, exc_info=e)
327
328        await self._conn.async_close()
329
330    async def _receive_loop(self):
331        try:
332            while True:
333                syntax_name, entity = await self._conn.receive()
334                if syntax_name != _mms_syntax_name:
335                    continue
336
337                name, data = _decode(entity)
338
339                if name == 'unconfirmed-PDU':
340                    await self._process_unconfirmed(data)
341
342                elif name == 'confirmed-RequestPDU':
343                    await self._process_request(data)
344
345                elif name == 'confirmed-ResponsePDU':
346                    await self._process_response(data)
347
348                elif name == 'confirmed-ErrorPDU':
349                    await self._process_error(data)
350
351                elif name == 'conclude-RequestPDU':
352                    self._close_pdu = 'conclude-ResponsePDU', None
353                    break
354
355                else:
356                    raise Exception('unsupported pdu')
357
358        except ConnectionError:
359            pass
360
361        except Exception as e:
362            self._log.error("receive loop error: %s", e, exc_info=e)
363
364        finally:
365            self.close()
366
367            for response_future in self._response_futures.values():
368                if not response_future.done():
369                    response_future.set_exception(ConnectionError())
370
371    async def _process_unconfirmed(self, data):
372        unconfirmed = encoder.decode_unconfirmed(data['service'])
373
374        self._comm_log.log(common.CommLogAction.RECEIVE, unconfirmed)
375
376        if self._unconfirmed_cb is None:
377            raise Exception('unconfirmed_cb not defined')
378
379        await aio.call(self._unconfirmed_cb, self, unconfirmed)
380
381    async def _process_request(self, data):
382        invoke_id = data['invokeID']
383        req = encoder.decode_request(data['service'])
384
385        self._comm_log.log(common.CommLogAction.RECEIVE, req)
386
387        if self._request_cb is None:
388            raise Exception('request_cb not defined')
389
390        res = await aio.call(self._request_cb, self, req)
391
392        if isinstance(res, common.Response):
393            res_pdu = 'confirmed-ResponsePDU', {
394                'invokeID': invoke_id,
395                'service': encoder.encode_response(res)}
396
397        elif isinstance(res, common.Error):
398            res_pdu = 'confirmed-ErrorPDU', {
399                'invokeID': invoke_id,
400                'serviceError': encoder.encode_error(res)}
401
402        else:
403            raise TypeError('unsupported response/error type')
404
405        res_data = _mms_syntax_name, _encode(res_pdu)
406
407        self._comm_log.log(common.CommLogAction.SEND, res)
408
409        await self._conn.send(res_data)
410
411    async def _process_response(self, data):
412        invoke_id = data['invokeID']
413        res = encoder.decode_response(data['service'])
414
415        self._comm_log.log(common.CommLogAction.RECEIVE, res)
416
417        future = self._response_futures.get(invoke_id)
418        if not future or future.done():
419            self._log.warning("dropping confirmed response (invoke_id: %s)",
420                              invoke_id)
421            return
422
423        future.set_result(res)
424
425    async def _process_error(self, data):
426        invoke_id = data['invokeID']
427        error = encoder.decode_error(data['serviceError'])
428
429        self._comm_log.log(common.CommLogAction.RECEIVE, error)
430
431        future = self._response_futures.get(invoke_id)
432        if not future or future.done():
433            self._log.warning("dropping confirmed error (invoke_id: %s)",
434                              invoke_id)
435            return
436
437        future.set_result(error)

MMS connection

For creating new connection see connect or listen.

240    def __init__(self,
241                 conn: acse.Connection,
242                 request_cb: RequestCb,
243                 unconfirmed_cb: UnconfirmedCb):
244        self._conn = conn
245        self._request_cb = request_cb
246        self._unconfirmed_cb = unconfirmed_cb
247        self._loop = asyncio.get_running_loop()
248        self._next_invoke_ids = itertools.count(0)
249        self._response_futures = {}
250        self._close_pdu = 'conclude-RequestPDU', None
251        self._async_group = aio.Group()
252        self._log = logger.create_connection_logger(mlog, conn.info)
253        self._comm_log = logger.CommunicationLogger(mlog, conn.info)
254
255        self.async_group.spawn(aio.call_on_cancel, self._on_close)
256        self.async_group.spawn(self._receive_loop)
257        self.async_group.spawn(aio.call_on_done, conn.wait_closing(),
258                               self.close)
259
260        self.async_group.spawn(aio.call_on_cancel, self._comm_log.log,
261                               common.CommLogAction.CLOSE)
262        self._comm_log.log(common.CommLogAction.OPEN)
async_group: hat.aio.group.Group
264    @property
265    def async_group(self) -> aio.Group:
266        """Async group"""
267        return self._async_group

Async group

269    @property
270    def info(self) -> acse.ConnectionInfo:
271        """Connection info"""
272        return self._conn.info

Connection info

async def send_unconfirmed( self, unconfirmed: EventNotificationUnconfirmed | InformationReportUnconfirmed | UnsolicitedStatusUnconfirmed):
274    async def send_unconfirmed(self, unconfirmed: common.Unconfirmed):
275        """Send unconfirmed message"""
276        if not self.is_open:
277            raise ConnectionError()
278
279        pdu = 'unconfirmed-PDU', {
280            'service': encoder.encode_unconfirmed(unconfirmed)}
281        data = _mms_syntax_name, _encode(pdu)
282
283        self._comm_log.log(common.CommLogAction.SEND, unconfirmed)
284
285        await self._conn.send(data)

Send unconfirmed message

287    async def send_confirmed(self,
288                             req: common.Request
289                             ) -> common.Response | common.Error:
290        """Send confirmed request and wait for response"""
291        if not self.is_open:
292            raise ConnectionError()
293
294        invoke_id = next(self._next_invoke_ids)
295        pdu = 'confirmed-RequestPDU', {
296            'invokeID': invoke_id,
297            'service': encoder.encode_request(req)}
298        data = _mms_syntax_name, _encode(pdu)
299
300        self._comm_log.log(common.CommLogAction.SEND, req)
301
302        await self._conn.send(data)
303
304        if not self.is_open:
305            raise ConnectionError()
306
307        try:
308            future = self._loop.create_future()
309            self._response_futures[invoke_id] = future
310            return await future
311
312        finally:
313            self._response_futures.pop(invoke_id, None)

Send confirmed request and wait for response

class DataAccessError(enum.Enum):
13class DataAccessError(enum.Enum):
14    OBJECT_INVALIDATED = 0
15    HARDWARE_FAULT = 1
16    TEMPORARILY_UNAVAILABLE = 2
17    OBJECT_ACCESS_DENIED = 3
18    OBJECT_UNDEFINED = 4
19    INVALID_ADDRESS = 5
20    TYPE_UNSUPPORTED = 6
21    TYPE_INCONSISTENT = 7
22    OBJECT_ATTRIBUTE_INCONSISTENT = 8
23    OBJECT_ACCESS_UNSUPPORTED = 9
24    OBJECT_NON_EXISTENT = 10
25    OBJECT_VALUE_INVALID = 11
OBJECT_INVALIDATED = <DataAccessError.OBJECT_INVALIDATED: 0>
HARDWARE_FAULT = <DataAccessError.HARDWARE_FAULT: 1>
TEMPORARILY_UNAVAILABLE = <DataAccessError.TEMPORARILY_UNAVAILABLE: 2>
OBJECT_ACCESS_DENIED = <DataAccessError.OBJECT_ACCESS_DENIED: 3>
OBJECT_UNDEFINED = <DataAccessError.OBJECT_UNDEFINED: 4>
INVALID_ADDRESS = <DataAccessError.INVALID_ADDRESS: 5>
TYPE_UNSUPPORTED = <DataAccessError.TYPE_UNSUPPORTED: 6>
TYPE_INCONSISTENT = <DataAccessError.TYPE_INCONSISTENT: 7>
OBJECT_ATTRIBUTE_INCONSISTENT = <DataAccessError.OBJECT_ATTRIBUTE_INCONSISTENT: 8>
OBJECT_ACCESS_UNSUPPORTED = <DataAccessError.OBJECT_ACCESS_UNSUPPORTED: 9>
OBJECT_NON_EXISTENT = <DataAccessError.OBJECT_NON_EXISTENT: 10>
OBJECT_VALUE_INVALID = <DataAccessError.OBJECT_VALUE_INVALID: 11>
class ObjectClass(enum.Enum):
28class ObjectClass(enum.Enum):
29    NAMED_VARIABLE = 0
30    NAMED_VARIABLE_LIST = 2
31    JOURNAL = 8
32    DOMAIN = 9
33    UNDEFINED = 0xFF
NAMED_VARIABLE = <ObjectClass.NAMED_VARIABLE: 0>
NAMED_VARIABLE_LIST = <ObjectClass.NAMED_VARIABLE_LIST: 2>
JOURNAL = <ObjectClass.JOURNAL: 8>
DOMAIN = <ObjectClass.DOMAIN: 9>
UNDEFINED = <ObjectClass.UNDEFINED: 255>
class AaSpecificObjectName(typing.NamedTuple):
38class AaSpecificObjectName(typing.NamedTuple):
39    identifier: str

AaSpecificObjectName(identifier,)

AaSpecificObjectName(identifier: str)

Create new instance of AaSpecificObjectName(identifier,)

identifier: str

Alias for field number 0

class DomainSpecificObjectName(typing.NamedTuple):
42class DomainSpecificObjectName(typing.NamedTuple):
43    domain_id: str
44    item_id: str

DomainSpecificObjectName(domain_id, item_id)

DomainSpecificObjectName(domain_id: str, item_id: str)

Create new instance of DomainSpecificObjectName(domain_id, item_id)

domain_id: str

Alias for field number 0

item_id: str

Alias for field number 1

class VmdSpecificObjectName(typing.NamedTuple):
47class VmdSpecificObjectName(typing.NamedTuple):
48    identifier: str

VmdSpecificObjectName(identifier,)

VmdSpecificObjectName(identifier: str)

Create new instance of VmdSpecificObjectName(identifier,)

identifier: str

Alias for field number 0

class AaSpecificObjectScope(typing.NamedTuple):
58class AaSpecificObjectScope(typing.NamedTuple):
59    pass

AaSpecificObjectScope()

AaSpecificObjectScope()

Create new instance of AaSpecificObjectScope()

class DomainSpecificObjectScope(typing.NamedTuple):
62class DomainSpecificObjectScope(typing.NamedTuple):
63    identifier: str

DomainSpecificObjectScope(identifier,)

DomainSpecificObjectScope(identifier: str)

Create new instance of DomainSpecificObjectScope(identifier,)

identifier: str

Alias for field number 0

class VmdSpecificObjectScope(typing.NamedTuple):
66class VmdSpecificObjectScope(typing.NamedTuple):
67    pass

VmdSpecificObjectScope()

VmdSpecificObjectScope()

Create new instance of VmdSpecificObjectScope()

class ArrayData(typing.NamedTuple):
77class ArrayData(typing.NamedTuple):
78    elements: Collection['Data']

ArrayData(elements,)

ArrayData(elements: Collection['Data'])

Create new instance of ArrayData(elements,)

class BcdData(typing.NamedTuple):
81class BcdData(typing.NamedTuple):
82    value: int

BcdData(value,)

BcdData(value: int)

Create new instance of BcdData(value,)

value: int

Alias for field number 0

class BinaryTimeData(typing.NamedTuple):
85class BinaryTimeData(typing.NamedTuple):
86    value: datetime.datetime

BinaryTimeData(value,)

BinaryTimeData(value: datetime.datetime)

Create new instance of BinaryTimeData(value,)

value: datetime.datetime

Alias for field number 0

class BitStringData(typing.NamedTuple):
89class BitStringData(typing.NamedTuple):
90    value: Collection[bool]

BitStringData(value,)

BitStringData(value: Collection[bool])

Create new instance of BitStringData(value,)

value: Collection[bool]

Alias for field number 0

class BooleanData(typing.NamedTuple):
93class BooleanData(typing.NamedTuple):
94    value: bool

BooleanData(value,)

BooleanData(value: bool)

Create new instance of BooleanData(value,)

value: bool

Alias for field number 0

class BooleanArrayData(typing.NamedTuple):
97class BooleanArrayData(typing.NamedTuple):
98    value: Collection[bool]

BooleanArrayData(value,)

BooleanArrayData(value: Collection[bool])

Create new instance of BooleanArrayData(value,)

value: Collection[bool]

Alias for field number 0

class FloatingPointData(typing.NamedTuple):
101class FloatingPointData(typing.NamedTuple):
102    value: float

FloatingPointData(value,)

FloatingPointData(value: float)

Create new instance of FloatingPointData(value,)

value: float

Alias for field number 0

class GeneralizedTimeData(typing.NamedTuple):
105class GeneralizedTimeData(typing.NamedTuple):
106    value: str

GeneralizedTimeData(value,)

GeneralizedTimeData(value: str)

Create new instance of GeneralizedTimeData(value,)

value: str

Alias for field number 0

class IntegerData(typing.NamedTuple):
109class IntegerData(typing.NamedTuple):
110    value: int

IntegerData(value,)

IntegerData(value: int)

Create new instance of IntegerData(value,)

value: int

Alias for field number 0

class MmsStringData(typing.NamedTuple):
113class MmsStringData(typing.NamedTuple):
114    value: str

MmsStringData(value,)

MmsStringData(value: str)

Create new instance of MmsStringData(value,)

value: str

Alias for field number 0

class ObjIdData(typing.NamedTuple):
117class ObjIdData(typing.NamedTuple):
118    value: asn1.ObjectIdentifier

ObjIdData(value,)

ObjIdData(value: tuple[int, ...])

Create new instance of ObjIdData(value,)

value: tuple[int, ...]

Alias for field number 0

class OctetStringData(typing.NamedTuple):
121class OctetStringData(typing.NamedTuple):
122    value: util.Bytes

OctetStringData(value,)

OctetStringData(value: bytes | bytearray | memoryview)

Create new instance of OctetStringData(value,)

value: bytes | bytearray | memoryview

Alias for field number 0

class StructureData(typing.NamedTuple):
125class StructureData(typing.NamedTuple):
126    elements: Collection['Data']

StructureData(elements,)

StructureData(elements: Collection['Data'])

Create new instance of StructureData(elements,)

class UnsignedData(typing.NamedTuple):
129class UnsignedData(typing.NamedTuple):
130    value: int

UnsignedData(value,)

UnsignedData(value: int)

Create new instance of UnsignedData(value,)

value: int

Alias for field number 0

class UtcTimeData(typing.NamedTuple):
133class UtcTimeData(typing.NamedTuple):
134    value: datetime.datetime
135    leap_second: bool
136    clock_failure: bool
137    not_synchronized: bool
138    accuracy: int | None
139    """accurate fraction bits [0,24]"""

UtcTimeData(value, leap_second, clock_failure, not_synchronized, accuracy)

UtcTimeData( value: datetime.datetime, leap_second: bool, clock_failure: bool, not_synchronized: bool, accuracy: int | None)

Create new instance of UtcTimeData(value, leap_second, clock_failure, not_synchronized, accuracy)

value: datetime.datetime

Alias for field number 0

leap_second: bool

Alias for field number 1

clock_failure: bool

Alias for field number 2

not_synchronized: bool

Alias for field number 3

accuracy: int | None

accurate fraction bits [0,24]

class VisibleStringData(typing.NamedTuple):
142class VisibleStringData(typing.NamedTuple):
143    value: str

VisibleStringData(value,)

VisibleStringData(value: str)

Create new instance of VisibleStringData(value,)

value: str

Alias for field number 0

class ArrayTypeDescription(typing.NamedTuple):
166class ArrayTypeDescription(typing.NamedTuple):
167    number_of_elements: int
168    element_type: typing.Union['TypeDescription', ObjectName]

ArrayTypeDescription(number_of_elements, element_type)

ArrayTypeDescription( number_of_elements: int, element_type: ForwardRef('TypeDescription') | AaSpecificObjectName | DomainSpecificObjectName | VmdSpecificObjectName)

Create new instance of ArrayTypeDescription(number_of_elements, element_type)

number_of_elements: int

Alias for field number 0

class BcdTypeDescription(typing.NamedTuple):
171class BcdTypeDescription(typing.NamedTuple):
172    xyz: int

BcdTypeDescription(xyz,)

BcdTypeDescription(xyz: int)

Create new instance of BcdTypeDescription(xyz,)

xyz: int

Alias for field number 0

class BinaryTimeTypeDescription(typing.NamedTuple):
175class BinaryTimeTypeDescription(typing.NamedTuple):
176    xyz: bool

BinaryTimeTypeDescription(xyz,)

BinaryTimeTypeDescription(xyz: bool)

Create new instance of BinaryTimeTypeDescription(xyz,)

xyz: bool

Alias for field number 0

class BitStringTypeDescription(typing.NamedTuple):
179class BitStringTypeDescription(typing.NamedTuple):
180    xyz: int

BitStringTypeDescription(xyz,)

BitStringTypeDescription(xyz: int)

Create new instance of BitStringTypeDescription(xyz,)

xyz: int

Alias for field number 0

class BooleanTypeDescription(typing.NamedTuple):
183class BooleanTypeDescription(typing.NamedTuple):
184    pass

BooleanTypeDescription()

BooleanTypeDescription()

Create new instance of BooleanTypeDescription()

class FloatingPointTypeDescription(typing.NamedTuple):
187class FloatingPointTypeDescription(typing.NamedTuple):
188    format_width: int
189    exponent_width: int

FloatingPointTypeDescription(format_width, exponent_width)

FloatingPointTypeDescription(format_width: int, exponent_width: int)

Create new instance of FloatingPointTypeDescription(format_width, exponent_width)

format_width: int

Alias for field number 0

exponent_width: int

Alias for field number 1

class GeneralizedTimeTypeDescription(typing.NamedTuple):
192class GeneralizedTimeTypeDescription(typing.NamedTuple):
193    pass

GeneralizedTimeTypeDescription()

GeneralizedTimeTypeDescription()

Create new instance of GeneralizedTimeTypeDescription()

class IntegerTypeDescription(typing.NamedTuple):
196class IntegerTypeDescription(typing.NamedTuple):
197    xyz: int

IntegerTypeDescription(xyz,)

IntegerTypeDescription(xyz: int)

Create new instance of IntegerTypeDescription(xyz,)

xyz: int

Alias for field number 0

class MmsStringTypeDescription(typing.NamedTuple):
200class MmsStringTypeDescription(typing.NamedTuple):
201    xyz: int

MmsStringTypeDescription(xyz,)

MmsStringTypeDescription(xyz: int)

Create new instance of MmsStringTypeDescription(xyz,)

xyz: int

Alias for field number 0

class ObjIdTypeDescription(typing.NamedTuple):
204class ObjIdTypeDescription(typing.NamedTuple):
205    pass

ObjIdTypeDescription()

ObjIdTypeDescription()

Create new instance of ObjIdTypeDescription()

class OctetStringTypeDescription(typing.NamedTuple):
208class OctetStringTypeDescription(typing.NamedTuple):
209    xyz: int

OctetStringTypeDescription(xyz,)

OctetStringTypeDescription(xyz: int)

Create new instance of OctetStringTypeDescription(xyz,)

xyz: int

Alias for field number 0

class StructureTypeDescription(typing.NamedTuple):
212class StructureTypeDescription(typing.NamedTuple):
213    components: Collection[tuple[str | None,
214                                 typing.Union['TypeDescription', ObjectName]]]

StructureTypeDescription(components,)

StructureTypeDescription( components: Collection[tuple[str | None, ForwardRef('TypeDescription') | AaSpecificObjectName | DomainSpecificObjectName | VmdSpecificObjectName]])

Create new instance of StructureTypeDescription(components,)

class UnsignedTypeDescription(typing.NamedTuple):
217class UnsignedTypeDescription(typing.NamedTuple):
218    xyz: int

UnsignedTypeDescription(xyz,)

UnsignedTypeDescription(xyz: int)

Create new instance of UnsignedTypeDescription(xyz,)

xyz: int

Alias for field number 0

class UtcTimeTypeDescription(typing.NamedTuple):
221class UtcTimeTypeDescription(typing.NamedTuple):
222    pass

UtcTimeTypeDescription()

UtcTimeTypeDescription()

Create new instance of UtcTimeTypeDescription()

class VisibleStringTypeDescription(typing.NamedTuple):
225class VisibleStringTypeDescription(typing.NamedTuple):
226    xyz: int

VisibleStringTypeDescription(xyz,)

VisibleStringTypeDescription(xyz: int)

Create new instance of VisibleStringTypeDescription(xyz,)

xyz: int

Alias for field number 0

class AddressVariableSpecification(typing.NamedTuple):
248class AddressVariableSpecification(typing.NamedTuple):
249    address: int | str | util.Bytes

AddressVariableSpecification(address,)

AddressVariableSpecification(address: int | str | bytes | bytearray | memoryview)

Create new instance of AddressVariableSpecification(address,)

address: int | str | bytes | bytearray | memoryview

Alias for field number 0

class InvalidatedVariableSpecification(typing.NamedTuple):
252class InvalidatedVariableSpecification(typing.NamedTuple):
253    pass

InvalidatedVariableSpecification()

InvalidatedVariableSpecification()

Create new instance of InvalidatedVariableSpecification()

class NameVariableSpecification(typing.NamedTuple):
256class NameVariableSpecification(typing.NamedTuple):
257    name: ObjectName

NameVariableSpecification(name,)

Create new instance of NameVariableSpecification(name,)

class ScatteredAccessDescriptionVariableSpecification(typing.NamedTuple):
260class ScatteredAccessDescriptionVariableSpecification(typing.NamedTuple):
261    specifications: Collection['VariableSpecification']

ScatteredAccessDescriptionVariableSpecification(specifications,)

ScatteredAccessDescriptionVariableSpecification(specifications: Collection['VariableSpecification'])

Create new instance of ScatteredAccessDescriptionVariableSpecification(specifications,)

class VariableDescriptionVariableSpecification(typing.NamedTuple):
264class VariableDescriptionVariableSpecification(typing.NamedTuple):
265    address: int | str | util.Bytes
266    type_specification: TypeDescription | ObjectName

VariableDescriptionVariableSpecification(address, type_specification)

address: int | str | bytes | bytearray | memoryview

Alias for field number 0

class StatusRequest(typing.NamedTuple):
279class StatusRequest(typing.NamedTuple):
280    pass

StatusRequest()

StatusRequest()

Create new instance of StatusRequest()

class GetNameListRequest(typing.NamedTuple):
283class GetNameListRequest(typing.NamedTuple):
284    object_class: ObjectClass
285    object_scope: ObjectScope
286    continue_after: str | None

GetNameListRequest(object_class, object_scope, continue_after)

GetNameListRequest( object_class: ObjectClass, object_scope: AaSpecificObjectScope | DomainSpecificObjectScope | VmdSpecificObjectScope, continue_after: str | None)

Create new instance of GetNameListRequest(object_class, object_scope, continue_after)

object_class: ObjectClass

Alias for field number 0

Alias for field number 1

continue_after: str | None

Alias for field number 2

class IdentifyRequest(typing.NamedTuple):
289class IdentifyRequest(typing.NamedTuple):
290    pass

IdentifyRequest()

IdentifyRequest()

Create new instance of IdentifyRequest()

class GetVariableAccessAttributesRequest(typing.NamedTuple):
293class GetVariableAccessAttributesRequest(typing.NamedTuple):
294    value: ObjectName | int | str | util.Bytes

GetVariableAccessAttributesRequest(value,)

GetVariableAccessAttributesRequest( value: AaSpecificObjectName | DomainSpecificObjectName | VmdSpecificObjectName | int | str | bytes | bytearray | memoryview)

Create new instance of GetVariableAccessAttributesRequest(value,)

value: AaSpecificObjectName | DomainSpecificObjectName | VmdSpecificObjectName | int | str | bytes | bytearray | memoryview

Alias for field number 0

class GetNamedVariableListAttributesRequest(typing.NamedTuple):
297class GetNamedVariableListAttributesRequest(typing.NamedTuple):
298    value: ObjectName

GetNamedVariableListAttributesRequest(value,)

GetNamedVariableListAttributesRequest( value: AaSpecificObjectName | DomainSpecificObjectName | VmdSpecificObjectName)

Create new instance of GetNamedVariableListAttributesRequest(value,)

class ReadRequest(typing.NamedTuple):
301class ReadRequest(typing.NamedTuple):
302    value: Collection[VariableSpecification] | ObjectName

ReadRequest(value,)

class WriteRequest(typing.NamedTuple):
305class WriteRequest(typing.NamedTuple):
306    specification: Collection[VariableSpecification] | ObjectName
307    data: Collection[Data]

WriteRequest(specification, data)

class DefineNamedVariableListRequest(typing.NamedTuple):
310class DefineNamedVariableListRequest(typing.NamedTuple):
311    name: ObjectName
312    specification: Collection[VariableSpecification]

DefineNamedVariableListRequest(name, specification)

Create new instance of DefineNamedVariableListRequest(name, specification)

class DeleteNamedVariableListRequest(typing.NamedTuple):
315class DeleteNamedVariableListRequest(typing.NamedTuple):
316    names: Collection[ObjectName]

DeleteNamedVariableListRequest(names,)

DeleteNamedVariableListRequest( names: Collection[AaSpecificObjectName | DomainSpecificObjectName | VmdSpecificObjectName])

Create new instance of DeleteNamedVariableListRequest(names,)

Alias for field number 0

class StatusResponse(typing.NamedTuple):
332class StatusResponse(typing.NamedTuple):
333    logical: int
334    physical: int

StatusResponse(logical, physical)

StatusResponse(logical: int, physical: int)

Create new instance of StatusResponse(logical, physical)

logical: int

Alias for field number 0

physical: int

Alias for field number 1

class GetNameListResponse(typing.NamedTuple):
337class GetNameListResponse(typing.NamedTuple):
338    identifiers: Collection[str]
339    more_follows: bool

GetNameListResponse(identifiers, more_follows)

GetNameListResponse(identifiers: Collection[str], more_follows: bool)

Create new instance of GetNameListResponse(identifiers, more_follows)

identifiers: Collection[str]

Alias for field number 0

more_follows: bool

Alias for field number 1

class IdentifyResponse(typing.NamedTuple):
342class IdentifyResponse(typing.NamedTuple):
343    vendor: str
344    model: str
345    revision: str
346    syntaxes: Collection[asn1.ObjectIdentifier] | None

IdentifyResponse(vendor, model, revision, syntaxes)

IdentifyResponse( vendor: str, model: str, revision: str, syntaxes: Collection[tuple[int, ...]] | None)

Create new instance of IdentifyResponse(vendor, model, revision, syntaxes)

vendor: str

Alias for field number 0

model: str

Alias for field number 1

revision: str

Alias for field number 2

syntaxes: Collection[tuple[int, ...]] | None

Alias for field number 3

class GetVariableAccessAttributesResponse(typing.NamedTuple):
349class GetVariableAccessAttributesResponse(typing.NamedTuple):
350    mms_deletable: bool
351    type_description: TypeDescription

GetVariableAccessAttributesResponse(mms_deletable, type_description)

mms_deletable: bool

Alias for field number 0

class GetNamedVariableListAttributesResponse(typing.NamedTuple):
354class GetNamedVariableListAttributesResponse(typing.NamedTuple):
355    mms_deletable: bool
356    specification: Collection[VariableSpecification]

GetNamedVariableListAttributesResponse(mms_deletable, specification)

Create new instance of GetNamedVariableListAttributesResponse(mms_deletable, specification)

mms_deletable: bool

Alias for field number 0

class ReadResponse(typing.NamedTuple):
359class ReadResponse(typing.NamedTuple):
360    results: Collection[DataAccessError | Data]

ReadResponse(results,)

class WriteResponse(typing.NamedTuple):
363class WriteResponse(typing.NamedTuple):
364    results: Collection[DataAccessError | None]

WriteResponse(results,)

WriteResponse(results: Collection[DataAccessError | None])

Create new instance of WriteResponse(results,)

results: Collection[DataAccessError | None]

Alias for field number 0

class DefineNamedVariableListResponse(typing.NamedTuple):
367class DefineNamedVariableListResponse(typing.NamedTuple):
368    pass

DefineNamedVariableListResponse()

DefineNamedVariableListResponse()

Create new instance of DefineNamedVariableListResponse()

class DeleteNamedVariableListResponse(typing.NamedTuple):
371class DeleteNamedVariableListResponse(typing.NamedTuple):
372    matched: int
373    deleted: int

DeleteNamedVariableListResponse(matched, deleted)

DeleteNamedVariableListResponse(matched: int, deleted: int)

Create new instance of DeleteNamedVariableListResponse(matched, deleted)

matched: int

Alias for field number 0

deleted: int

Alias for field number 1

class VmdStateError(enum.Enum):
389class VmdStateError(enum.Enum):
390    OTHER = 0
391    VMD_STATE_CONFLICT = 1
392    VMD_OPERATIONAL_PROBLEM = 2
393    DOMAIN_TRANSFER_PROBLEM = 3
394    STATE_MACHINE_ID_INVALID = 4
OTHER = <VmdStateError.OTHER: 0>
VMD_STATE_CONFLICT = <VmdStateError.VMD_STATE_CONFLICT: 1>
VMD_OPERATIONAL_PROBLEM = <VmdStateError.VMD_OPERATIONAL_PROBLEM: 2>
DOMAIN_TRANSFER_PROBLEM = <VmdStateError.DOMAIN_TRANSFER_PROBLEM: 3>
STATE_MACHINE_ID_INVALID = <VmdStateError.STATE_MACHINE_ID_INVALID: 4>
class ApplicationReferenceError(enum.Enum):
397class ApplicationReferenceError(enum.Enum):
398    OTHER = 0
399    APPLICATION_UNREACHABLE = 1
400    CONNECTION_LOST = 2
401    APPLICATION_REFERENCE_INVALID = 3
402    CONTEXT_UNSUPPORTED = 4
APPLICATION_UNREACHABLE = <ApplicationReferenceError.APPLICATION_UNREACHABLE: 1>
APPLICATION_REFERENCE_INVALID = <ApplicationReferenceError.APPLICATION_REFERENCE_INVALID: 3>
class DefinitionError(enum.Enum):
405class DefinitionError(enum.Enum):
406    OTHER = 0
407    OBJECT_UNDEFINED = 1
408    INVALID_ADDRESS = 2
409    TYPE_UNSUPPORTED = 3
410    TYPE_INCONSISTENT = 4
411    OBJECT_EXISTS = 5
412    OBJECT_ATTRIBUTE_INCONSISTENT = 6
OTHER = <DefinitionError.OTHER: 0>
OBJECT_UNDEFINED = <DefinitionError.OBJECT_UNDEFINED: 1>
INVALID_ADDRESS = <DefinitionError.INVALID_ADDRESS: 2>
TYPE_UNSUPPORTED = <DefinitionError.TYPE_UNSUPPORTED: 3>
TYPE_INCONSISTENT = <DefinitionError.TYPE_INCONSISTENT: 4>
OBJECT_EXISTS = <DefinitionError.OBJECT_EXISTS: 5>
OBJECT_ATTRIBUTE_INCONSISTENT = <DefinitionError.OBJECT_ATTRIBUTE_INCONSISTENT: 6>
class ResourceError(enum.Enum):
415class ResourceError(enum.Enum):
416    OTHER = 0
417    MEMORY_UNAVAILABLE = 1
418    PROCESSOR_RESOURCE_UNAVAILABLE = 2
419    MASS_STORAGE_UNAVAILABLE = 3
420    CAPABILITY_UNAVAILABLE = 4
421    CAPABILITY_UNKNOWN = 5
OTHER = <ResourceError.OTHER: 0>
MEMORY_UNAVAILABLE = <ResourceError.MEMORY_UNAVAILABLE: 1>
PROCESSOR_RESOURCE_UNAVAILABLE = <ResourceError.PROCESSOR_RESOURCE_UNAVAILABLE: 2>
MASS_STORAGE_UNAVAILABLE = <ResourceError.MASS_STORAGE_UNAVAILABLE: 3>
CAPABILITY_UNAVAILABLE = <ResourceError.CAPABILITY_UNAVAILABLE: 4>
CAPABILITY_UNKNOWN = <ResourceError.CAPABILITY_UNKNOWN: 5>
class ServiceError(enum.Enum):
424class ServiceError(enum.Enum):
425    OTHER = 0
426    PRIMITIVES_OUT_OF_SEQUENCE = 1
427    OBJECT_STATE_CONFLICT = 2
428    PDU_SIZE = 3
429    CONTINUATION_INVALID = 4
430    OBJECT_CONSTRAINT_CONFLICT = 5
OTHER = <ServiceError.OTHER: 0>
PRIMITIVES_OUT_OF_SEQUENCE = <ServiceError.PRIMITIVES_OUT_OF_SEQUENCE: 1>
OBJECT_STATE_CONFLICT = <ServiceError.OBJECT_STATE_CONFLICT: 2>
PDU_SIZE = <ServiceError.PDU_SIZE: 3>
CONTINUATION_INVALID = <ServiceError.CONTINUATION_INVALID: 4>
OBJECT_CONSTRAINT_CONFLICT = <ServiceError.OBJECT_CONSTRAINT_CONFLICT: 5>
class ServicePreemptError(enum.Enum):
433class ServicePreemptError(enum.Enum):
434    OTHER = 0
435    TIMEOUT = 1
436    DEADLOCK = 2
437    CANCEL = 3
class TimeResolutionError(enum.Enum):
440class TimeResolutionError(enum.Enum):
441    OTHER = 0
442    UNSUPPORTABLE_TIME_RESOLUTION = 1
UNSUPPORTABLE_TIME_RESOLUTION = <TimeResolutionError.UNSUPPORTABLE_TIME_RESOLUTION: 1>
class AccessError(enum.Enum):
445class AccessError(enum.Enum):
446    OTHER = 0
447    OBJECT_ACCESS_UNSUPPORTED = 1
448    OBJECT_NON_EXISTENT = 2
449    OBJECT_ACCESS_DENIED = 3
450    OBJECT_INVALIDATED = 4
OTHER = <AccessError.OTHER: 0>
OBJECT_ACCESS_UNSUPPORTED = <AccessError.OBJECT_ACCESS_UNSUPPORTED: 1>
OBJECT_NON_EXISTENT = <AccessError.OBJECT_NON_EXISTENT: 2>
OBJECT_ACCESS_DENIED = <AccessError.OBJECT_ACCESS_DENIED: 3>
OBJECT_INVALIDATED = <AccessError.OBJECT_INVALIDATED: 4>
class InitiateError(enum.Enum):
453class InitiateError(enum.Enum):
454    OTHER = 0
455    MAX_SERVICES_OUTSTANDING_CALLING_INSUFFICIENT = 3
456    MAX_SERVICES_OUTSTANDING_CALLED_INSUFFICIENT = 4
457    SERVICE_CBB_INSUFFICIENT = 5
458    PARAMETER_CBB_INSUFFICIENT = 6
459    NESTING_LEVEL_INSUFFICIENT = 7
OTHER = <InitiateError.OTHER: 0>
MAX_SERVICES_OUTSTANDING_CALLING_INSUFFICIENT = <InitiateError.MAX_SERVICES_OUTSTANDING_CALLING_INSUFFICIENT: 3>
MAX_SERVICES_OUTSTANDING_CALLED_INSUFFICIENT = <InitiateError.MAX_SERVICES_OUTSTANDING_CALLED_INSUFFICIENT: 4>
SERVICE_CBB_INSUFFICIENT = <InitiateError.SERVICE_CBB_INSUFFICIENT: 5>
PARAMETER_CBB_INSUFFICIENT = <InitiateError.PARAMETER_CBB_INSUFFICIENT: 6>
NESTING_LEVEL_INSUFFICIENT = <InitiateError.NESTING_LEVEL_INSUFFICIENT: 7>
class ConcludeError(enum.Enum):
462class ConcludeError(enum.Enum):
463    OTHER = 0
464    FURTHER_COMMUNICATION_REQUIRED = 1
OTHER = <ConcludeError.OTHER: 0>
FURTHER_COMMUNICATION_REQUIRED = <ConcludeError.FURTHER_COMMUNICATION_REQUIRED: 1>
class CancelError(enum.Enum):
467class CancelError(enum.Enum):
468    OTHER = 0
469    INVOKE_ID_UNKNOWN = 1
470    CANCEL_NOT_POSSIBLE = 2
OTHER = <CancelError.OTHER: 0>
INVOKE_ID_UNKNOWN = <CancelError.INVOKE_ID_UNKNOWN: 1>
CANCEL_NOT_POSSIBLE = <CancelError.CANCEL_NOT_POSSIBLE: 2>
class FileError(enum.Enum):
473class FileError(enum.Enum):
474    OTHER = 0
475    FILENAME_AMBIGUOUS = 1
476    FILE_BUSY = 2
477    FILENAME_SYNTAX_ERROR = 3
478    CONTENT_TYPE_INVALID = 4
479    POSITION_INVALID = 5
480    FILE_ACCESS_DENIED = 6
481    FILE_NON_EXISTENT = 7
482    DUPLICATE_FILENAME = 8
483    INSUFFICIENT_SPACE_IN_FILESTORE = 9
OTHER = <FileError.OTHER: 0>
FILENAME_AMBIGUOUS = <FileError.FILENAME_AMBIGUOUS: 1>
FILE_BUSY = <FileError.FILE_BUSY: 2>
FILENAME_SYNTAX_ERROR = <FileError.FILENAME_SYNTAX_ERROR: 3>
CONTENT_TYPE_INVALID = <FileError.CONTENT_TYPE_INVALID: 4>
POSITION_INVALID = <FileError.POSITION_INVALID: 5>
FILE_ACCESS_DENIED = <FileError.FILE_ACCESS_DENIED: 6>
FILE_NON_EXISTENT = <FileError.FILE_NON_EXISTENT: 7>
DUPLICATE_FILENAME = <FileError.DUPLICATE_FILENAME: 8>
INSUFFICIENT_SPACE_IN_FILESTORE = <FileError.INSUFFICIENT_SPACE_IN_FILESTORE: 9>
class OtherError(typing.NamedTuple):
486class OtherError(typing.NamedTuple):
487    value: int

OtherError(value,)

OtherError(value: int)

Create new instance of OtherError(value,)

value: int

Alias for field number 0

class EventNotificationUnconfirmed(typing.NamedTuple):
507class EventNotificationUnconfirmed(typing.NamedTuple):
508    enrollment: ObjectName
509    condition: ObjectName
510    severity: int
511    time: Data | int | None

EventNotificationUnconfirmed(enrollment, condition, severity, time)

Create new instance of EventNotificationUnconfirmed(enrollment, condition, severity, time)

Alias for field number 0

Alias for field number 1

severity: int

Alias for field number 2

class InformationReportUnconfirmed(typing.NamedTuple):
514class InformationReportUnconfirmed(typing.NamedTuple):
515    specification: Collection[VariableSpecification] | ObjectName
516    data: Collection[DataAccessError | Data]

InformationReportUnconfirmed(specification, data)

class UnsolicitedStatusUnconfirmed(typing.NamedTuple):
519class UnsolicitedStatusUnconfirmed(typing.NamedTuple):
520    logical: int
521    physical: int

UnsolicitedStatusUnconfirmed(logical, physical)

UnsolicitedStatusUnconfirmed(logical: int, physical: int)

Create new instance of UnsolicitedStatusUnconfirmed(logical, physical)

logical: int

Alias for field number 0

physical: int

Alias for field number 1