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.tcp.Address, local_detail_calling: int | None = None, request_cb: Optional[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, unconfirmed_cb: Optional[Callable[[Connection, EventNotificationUnconfirmed | InformationReportUnconfirmed | UnsolicitedStatusUnconfirmed], None | Awaitable[None]]] = None, **kwargs) -> Connection:
 73async def connect(addr: tcp.Address,
 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.tcp.Address = Address(host='0.0.0.0', port=102), request_cb: Optional[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, unconfirmed_cb: Optional[Callable[[Connection, EventNotificationUnconfirmed | InformationReportUnconfirmed | UnsolicitedStatusUnconfirmed], None | Awaitable[None]]] = None, *, bind_connections: bool = False, **kwargs) -> Server:
122async def listen(connection_cb: ConnectionCb,
123                 addr: tcp.Address = tcp.Address('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
146    server._log = logger.create_server_logger(mlog, kwargs.get('name'), None)
147
148    server._srv = await acse.listen(validate_cb=server._on_validate,
149                                    connection_cb=server._on_connection,
150                                    addr=addr,
151                                    bind_connections=False,
152                                    **kwargs)
153
154    server._log = logger.create_server_logger(mlog, server._srv.info.name,
155                                              server._srv.info)
156
157    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):
160class Server(aio.Resource):
161    """MMS listening server
162
163    For creating new server see `listen`.
164
165    """
166
167    @property
168    def async_group(self) -> aio.Group:
169        """Async group"""
170        return self._srv.async_group
171
172    @property
173    def info(self) -> tcp.ServerInfo:
174        """Server info"""
175        return self._srv.info
176
177    async def _on_validate(self, syntax_names, user_data):
178        syntax_name, req_user_data = user_data
179        if syntax_name != _mms_syntax_name:
180            raise Exception('invalid mms syntax name')
181
182        initiate_req = _decode(req_user_data)
183        if initiate_req[0] != 'initiate-RequestPDU':
184            raise Exception('invalid initiate request')
185
186        initiate_res = 'initiate-ResponsePDU', {
187            'negotiatedMaxServOutstandingCalling': 5,
188            'negotiatedMaxServOutstandingCalled': 5,
189            'negotiatedDataStructureNestingLevel': 4,  # TODO compatibility
190            'initResponseDetail': {
191                'negotiatedVersionNumber': 1,
192                'negotiatedParameterCBB': _parameter_cbb,
193                'servicesSupportedCalled': _service_support}}
194        if 'localDetailCalling' in initiate_req[1]:
195            initiate_res[1]['localDetailCalled'] = \
196                initiate_req[1]['localDetailCalling']
197
198        res_user_data = _encode(initiate_res)
199        return _mms_syntax_name, res_user_data
200
201    async def _on_connection(self, acse_conn):
202        try:
203            try:
204                conn = Connection(conn=acse_conn,
205                                  request_cb=self._request_cb,
206                                  unconfirmed_cb=self._unconfirmed_cb)
207
208            except Exception:
209                await aio.uncancellable(acse_conn.async_close())
210                raise
211
212            try:
213                await aio.call(self._connection_cb, conn)
214
215            except BaseException:
216                await aio.uncancellable(conn.async_close())
217                raise
218
219        except Exception as e:
220            self._log.error("error creating new incomming connection: %s",
221                            e, exc_info=e)
222            return
223
224        if not self._bind_connections:
225            return
226
227        try:
228            await conn.wait_closed()
229
230        except BaseException:
231            await aio.uncancellable(conn.async_close())
232            raise

MMS listening server

For creating new server see listen.

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

Async group

info: hat.drivers.tcp.ServerInfo
172    @property
173    def info(self) -> tcp.ServerInfo:
174        """Server info"""
175        return self._srv.info

Server info

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

MMS connection

For creating new connection see connect or listen.

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

Async group

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

Connection info

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

Send unconfirmed message

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