DLMS-SPODES 0.86.15__py3-none-any.whl → 0.86.17__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. DLMS_SPODES/cosem_interface_classes/__class_init__.py +1 -1
  2. DLMS_SPODES/cosem_interface_classes/activity_calendar.py +2 -1
  3. DLMS_SPODES/cosem_interface_classes/arbitrator.py +2 -1
  4. DLMS_SPODES/cosem_interface_classes/association_ln/ver0.py +7 -1
  5. DLMS_SPODES/cosem_interface_classes/association_ln/ver1.py +2 -1
  6. DLMS_SPODES/cosem_interface_classes/association_ln/ver2.py +2 -1
  7. DLMS_SPODES/cosem_interface_classes/clock.py +2 -1
  8. DLMS_SPODES/cosem_interface_classes/collection.py +14 -17
  9. DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py +18 -7
  10. DLMS_SPODES/cosem_interface_classes/data.py +4 -2
  11. DLMS_SPODES/cosem_interface_classes/demand_register/ver0.py +2 -1
  12. DLMS_SPODES/cosem_interface_classes/disconnect_control.py +2 -1
  13. DLMS_SPODES/cosem_interface_classes/extended_register.py +2 -1
  14. DLMS_SPODES/cosem_interface_classes/gprs_modem_setup.py +2 -1
  15. DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver0.py +2 -1
  16. DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver1.py +2 -1
  17. DLMS_SPODES/cosem_interface_classes/iec_local_port_setup.py +3 -2
  18. DLMS_SPODES/cosem_interface_classes/image_transfer/ver0.py +2 -1
  19. DLMS_SPODES/cosem_interface_classes/ipv4_setup.py +2 -1
  20. DLMS_SPODES/cosem_interface_classes/limiter.py +4 -1
  21. DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py +2 -1
  22. DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py +3 -2
  23. DLMS_SPODES/cosem_interface_classes/ntp_setup/ver0.py +2 -1
  24. DLMS_SPODES/cosem_interface_classes/overview.py +7 -6
  25. DLMS_SPODES/cosem_interface_classes/profile_generic/ver0.py +2 -1
  26. DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py +2 -1
  27. DLMS_SPODES/cosem_interface_classes/push_setup/ver2.py +2 -1
  28. DLMS_SPODES/cosem_interface_classes/register.py +2 -1
  29. DLMS_SPODES/cosem_interface_classes/register_activation/ver0.py +2 -2
  30. DLMS_SPODES/cosem_interface_classes/register_monitor.py +2 -1
  31. DLMS_SPODES/cosem_interface_classes/schedule.py +2 -1
  32. DLMS_SPODES/cosem_interface_classes/script_table.py +2 -1
  33. DLMS_SPODES/cosem_interface_classes/security_setup/ver0.py +2 -1
  34. DLMS_SPODES/cosem_interface_classes/security_setup/ver1.py +5 -3
  35. DLMS_SPODES/cosem_interface_classes/single_action_schedule.py +2 -1
  36. DLMS_SPODES/cosem_interface_classes/special_days_table.py +2 -1
  37. DLMS_SPODES/cosem_interface_classes/tcp_udp_setup.py +2 -1
  38. {dlms_spodes-0.86.15.dist-info → dlms_spodes-0.86.17.dist-info}/METADATA +2 -2
  39. {dlms_spodes-0.86.15.dist-info → dlms_spodes-0.86.17.dist-info}/RECORD +41 -41
  40. {dlms_spodes-0.86.15.dist-info → dlms_spodes-0.86.17.dist-info}/WHEEL +0 -0
  41. {dlms_spodes-0.86.15.dist-info → dlms_spodes-0.86.17.dist-info}/top_level.txt +0 -0
@@ -1,3 +1,3 @@
1
1
  from ..cosem_interface_classes import cosem_interface_class as ic, attr_indexes as ai
2
- from ..cosem_interface_classes.overview import ClassID, Version
2
+ from ..cosem_interface_classes.overview import ClassID
3
3
  from ..types import common_data_types as cdt, cosem_service_types as cst, useful_types as ut
@@ -1,5 +1,6 @@
1
1
  from typing_extensions import deprecated
2
2
  from typing import Self
3
+ from .overview import VERSION_0
3
4
  from .__class_init__ import *
4
5
  from ..types.implementations import integers, octet_string
5
6
 
@@ -135,7 +136,7 @@ class DayProfileTable(cdt.Array):
135
136
  class ActivityCalendar(ic.COSEMInterfaceClasses):
136
137
  """DLMS UA 1000-1 Ed. 14 4.5.5 Activity calendar"""
137
138
  CLASS_ID = ClassID.ACTIVITY_CALENDAR
138
- VERSION = Version.V0
139
+ VERSION = VERSION_0
139
140
  A_ELEMENTS = (ic.ICAElement("calendar_name_active", octet_string.ID),
140
141
  ic.ICAElement("season_profile_active", SeasonProfile),
141
142
  ic.ICAElement("week_profile_table_active", WeekProfileTable),
@@ -1,5 +1,6 @@
1
1
  from .__class_init__ import *
2
2
  from ..types.implementations import structs, integers
3
+ from .overview import VERSION_0
3
4
 
4
5
 
5
6
  class Actions(cdt.Array):
@@ -46,7 +47,7 @@ class RequestAction(cdt.Structure):
46
47
  class Arbitrator(ic.COSEMInterfaceClasses):
47
48
  """DLMS UA 1000-1 Ed. 14 4.5.12 Arbitrator"""
48
49
  CLASS_ID = ClassID.ARBITRATOR
49
- VERSION = Version.V0
50
+ VERSION = VERSION_0
50
51
  A_ELEMENTS = (ic.ICAElement("actions", Actions),
51
52
  ic.ICAElement("permission_table", PermissionsTable),
52
53
  ic.ICAElement("weightings_table", WeightingsTable),
@@ -1,4 +1,6 @@
1
+ from typing import Iterator
1
2
  from enum import IntFlag, auto
3
+ from ..parameters import Parameter
2
4
  from ... import exceptions as exc
3
5
  from ..__class_init__ import *
4
6
  from ...types import choices
@@ -7,6 +9,7 @@ from ... import pdu_enums as pdu
7
9
  from . import mechanism_id, authentication_mechanism_name
8
10
  from . import method
9
11
  from . import abstract
12
+ from ..overview import VERSION_0
10
13
 
11
14
 
12
15
  class AccessMode(abstract.AccessMode, elements=(0, 1, 2, 3)):
@@ -290,7 +293,7 @@ class CosemAttributeDescriptorWithSelection(ut.CosemAttributeDescriptorWithSelec
290
293
  class AssociationLN(ic.COSEMInterfaceClasses):
291
294
  """5.4.5 Association LN"""
292
295
  CLASS_ID = ClassID.ASSOCIATION_LN
293
- VERSION = Version.V0
296
+ VERSION = VERSION_0
294
297
  A_ELEMENTS = (ic.ICAElement("object_list", ObjectListType, selective_access=SelectiveAccessDescriptor),
295
298
  ic.ICAElement("associated_partners_id", AssociatedPartnersType),
296
299
  ic.ICAElement("application_context_name", ApplicationContextName),
@@ -389,6 +392,9 @@ class AssociationLN(ic.COSEMInterfaceClasses):
389
392
  el: ObjectListElement
390
393
  return [el.logical_name for el in self.object_list]
391
394
 
395
+ def iter_pars(self) -> Iterator[Parameter]:
396
+ return (Parameter(el.logical_name.contents) for el in self.object_list)
397
+
392
398
  def __check_empty_object_list(self):
393
399
  if self.object_list is None:
394
400
  raise exc.ITEApplication(F"empty <{self.get_attr_element(2).NAME}> in {self}")
@@ -5,6 +5,7 @@ from ..__class_init__ import *
5
5
  from ...types.implementations import structs, arrays
6
6
  from . import authentication_mechanism_name
7
7
  from . import abstract
8
+ from ..overview import VERSION_1
8
9
 
9
10
 
10
11
  class AccessMode(abstract.AccessMode, elements=tuple(range(7))):
@@ -105,7 +106,7 @@ class MechanismNameType(cdt.AXDR, authentication_mechanism_name.AuthenticationMe
105
106
 
106
107
  class AssociationLN(ver0.AssociationLN):
107
108
  """5.4.6 Association LN"""
108
- VERSION = Version.V1
109
+ VERSION = VERSION_1
109
110
  A_ELEMENTS = (ic.ICAElement("object_list", ObjectListType, selective_access=ver0.SelectiveAccessDescriptor),
110
111
  ver0.AssociationLN.get_attr_element(3), # associated_partners_id
111
112
  ic.ICAElement("application_context_name", ContextNameType),
@@ -1,11 +1,12 @@
1
1
  from ..__class_init__ import *
2
2
  from . import ver0, ver1
3
3
  from ...types.implementations import structs, arrays
4
+ from ..overview import VERSION_2
4
5
 
5
6
 
6
7
  class AssociationLN(ver1.AssociationLN):
7
8
  """5.4.7 Association LN"""
8
- VERSION = Version.V2
9
+ VERSION = VERSION_2
9
10
  A_ELEMENTS = (
10
11
  ver1.AssociationLN.get_attr_element(2), # <object_list>
11
12
  ver0.AssociationLN.get_attr_element(3), # associated_partners_id
@@ -1,6 +1,7 @@
1
1
  import datetime
2
2
  from .__class_init__ import *
3
3
  from ..types.implementations import integers
4
+ from .overview import VERSION_0
4
5
 
5
6
 
6
7
  class ClockStatus(cdt.Unsigned):
@@ -54,7 +55,7 @@ class TimeZone(cdt.Long):
54
55
  class Clock(ic.COSEMInterfaceClasses):
55
56
  """4.5.1 Clock"""
56
57
  CLASS_ID = ClassID.CLOCK
57
- VERSION = Version.V0
58
+ VERSION = VERSION_0
58
59
  A_ELEMENTS = (ic.ICAElement("time", cst.OctetStringDateTime, classifier=ic.Classifier.DYNAMIC),
59
60
  ic.ICAElement("time_zone", TimeZone, -720, 840),
60
61
  ic.ICAElement("status", ClockStatus, classifier=ic.Classifier.DYNAMIC),
@@ -57,7 +57,7 @@ from .tcp_udp_setup import TCPUDPSetup
57
57
  from .. import exceptions as exc
58
58
  from ..relation_to_OBIS import get_name
59
59
  from ..cosem_interface_classes import implementations as impl
60
- from ..cosem_interface_classes.overview import ClassID, Version, CountrySpecificIdentifiers
60
+ from ..cosem_interface_classes.overview import ClassID, CountrySpecificIdentifiers
61
61
  from . import obis as o, ln_pattern
62
62
  from .. import pdu_enums as pdu
63
63
  from ..config_parser import config, get_message
@@ -742,7 +742,7 @@ class Collection:
742
742
  except exc.EmptyObj as e:
743
743
  logger.warning(F"can't copy {target} attr={i}, skipped. {e}")
744
744
 
745
- def copy(self) -> result.Simple[Self]:
745
+ def copy(self) -> result.Simple["Collection"]:
746
746
  """copy collection with value by Association"""
747
747
  res = result.Simple(
748
748
  value=Collection(
@@ -779,7 +779,7 @@ class Collection:
779
779
  target=new_obj,
780
780
  association_id=ass_id)
781
781
  except Exception as e:
782
- res.append_err(e)
782
+ res.append_e(e, "copy object value")
783
783
  return res
784
784
 
785
785
  @property
@@ -871,7 +871,7 @@ class Collection:
871
871
  """return: DLMSObject"""
872
872
  if obj := self.__objs.get(par.obis):
873
873
  return result.Simple(obj)
874
- return result.Error.from_e(exc.NoObject(f"with {par=}"))
874
+ return result.Error.from_e(exc.NoObject(f"with {par=}"), "get object")
875
875
 
876
876
  def par2data(self, par: Parameter) -> result.Option[cdt.CommonDataType] | result.Error:
877
877
  """:return CDT by Parameter, return None if data wasn't setting"""
@@ -1122,12 +1122,12 @@ class Collection:
1122
1122
  return ret
1123
1123
 
1124
1124
  def sap2objects(self, value: enums.ClientSAP) -> result.List[ic.COSEMInterfaceClasses]:
1125
- res = result.List(msg=inspect.currentframe().f_code.co_qualname)
1126
- for ln in self.sap2association(value).get_lns():
1127
- try:
1128
- res.value.append(self.__get_object(ln.contents))
1129
- except exc.NoObject as e:
1130
- res.append_err(e)
1125
+ res = result.List()
1126
+ for par in self.sap2association(value).iter_pars():
1127
+ if isinstance(res1 := self.par2obj(par), result.Error):
1128
+ res1.append_err(res.err)
1129
+ else:
1130
+ res.append(res1.value)
1131
1131
  return res
1132
1132
 
1133
1133
  def iter_classID_objects(self,
@@ -1229,14 +1229,11 @@ class Collection:
1229
1229
  else:
1230
1230
  return obj
1231
1231
 
1232
- def obis2obj(self, obis: o.OBIS) -> result.Simple[InterfaceClass]:
1233
- res = result.Simple(
1234
- value=self.__objs.get(obis),
1235
- msg=inspect.currentframe().f_code.co_qualname
1236
- )
1232
+ def obis2obj(self, obis: o.OBIS) -> result.Simple[InterfaceClass] | result.Error:
1233
+ res = self.__objs.get(obis)
1237
1234
  if res.value is None:
1238
- res.append_err(exc.NoObject(obis))
1239
- return res
1235
+ return result.Error.from_e(exc.NoObject(obis))
1236
+ return result.Simple(res.value)
1240
1237
 
1241
1238
  def logicalName2obj(self, ln: cst.LogicalName) -> result.Simple[InterfaceClass]:
1242
1239
  return self.obis2obj(o.OBIS(ln.contents))
@@ -4,7 +4,7 @@ DLMS UA 1000-1 Ed 14
4
4
  from dataclasses import dataclass
5
5
  from functools import lru_cache
6
6
  from typing_extensions import deprecated
7
- from typing import Iterator, Type, TypeAlias, Callable, Any, Self, Literal, Optional, Protocol
7
+ from typing import Iterator, Type, TypeAlias, Callable, Any, Self, Literal, Optional, Protocol, ClassVar
8
8
  from ..types import cdt, ut, cst
9
9
  from StructResult import result
10
10
  from ..relation_to_OBIS import get_name
@@ -12,7 +12,7 @@ import logging
12
12
  from enum import IntEnum
13
13
  from itertools import count
14
14
  from .. import exceptions as exc
15
- from .overview import ClassID, Version
15
+ from .overview import ClassID
16
16
  from ..settings import settings
17
17
  from ..config_parser import get_values
18
18
  from .. import literals
@@ -215,7 +215,7 @@ Name: Literal = Literal[
215
215
 
216
216
 
217
217
  @lru_cache(150)
218
- def ClassIDVer2Name(class_id: ClassID, ver: Version) -> Name:
218
+ def ClassIDVer2Name(class_id: ClassID, ver: cdt.Unsigned) -> Name:
219
219
  """Table 3 – List of interface classes by class_id"""
220
220
  match int(class_id), int(ver):
221
221
  case 1, 0: return "Data"
@@ -326,8 +326,8 @@ def ClassIDVer2Name(class_id: ClassID, ver: Version) -> Name:
326
326
 
327
327
 
328
328
  class COSEMInterfaceClasses(Protocol):
329
- CLASS_ID: ClassID
330
- VERSION: Version | None = None
329
+ CLASS_ID: ClassVar[ut.CosemClassId]
330
+ VERSION: ClassVar[cdt.Unsigned]
331
331
  """ Identification code of the version of the class. The version of each object is retrieved together with the logical name and the class_id by reading the object_list
332
332
  attribute of an “Association LN” / ”Association SN” object. Within one logical device, all instances of a certain class must be of the same version."""
333
333
  A_ELEMENTS: tuple[ICAElement, ...]
@@ -375,15 +375,26 @@ class COSEMInterfaceClasses(Protocol):
375
375
  # print(cls.__name__)
376
376
 
377
377
  @classmethod
378
- def getAElement(cls, i: int) -> result.Simple[ICAElement] | result.Error:
378
+ @deprecated("use <getAElement>")
379
+ def get_attr_element(cls, i: int) -> ICAElement:
379
380
  """return element by order index. Override in each new class"""
380
381
  if i == 1:
381
- return result.Simple(_LN_ELEMENT)
382
+ return _LN_ELEMENT
382
383
  elif i > len(cls.A_ELEMENTS) + 1:
383
384
  raise exc.DLMSException(F"got attribute index: {i}, expected 1..{len(cls.A_ELEMENTS) + 1}")
384
385
  else:
385
386
  return cls.A_ELEMENTS[i - 2]
386
387
 
388
+ @classmethod
389
+ def getAElement(cls, i: int) -> result.Simple[ICAElement] | result.Error:
390
+ """return element by order index. Override in each new class"""
391
+ if i == 1:
392
+ return result.Simple(_LN_ELEMENT)
393
+ elif i > len(cls.A_ELEMENTS) + 1:
394
+ return result.Error.from_e(exc.DLMSException(F"got attribute index: {i}, expected 1..{len(cls.A_ELEMENTS) + 1}"))
395
+ else:
396
+ return result.Simple(cls.A_ELEMENTS[i - 2])
397
+
387
398
  @classmethod
388
399
  def get_meth_element(cls, i: int) -> ICMElement:
389
400
  """ implement in subclasses with methods """
@@ -1,13 +1,15 @@
1
1
  from __future__ import annotations
2
- from .__class_init__ import *
3
2
  from ..types import choices
3
+ from . import cosem_interface_class as ic
4
+ from .overview import ClassID
5
+ from .overview import VERSION_0
4
6
 
5
7
 
6
8
  class Data(ic.COSEMInterfaceClasses):
7
9
  """ Object stores data related to internal meter object(s). The meaning of the value is identified by the logical_name.
8
10
  The data type of the value is CHOICE. “Data” is typically used to store configuration data and parameters """
9
11
  CLASS_ID = ClassID.DATA
10
- VERSION = Version.V0
12
+ VERSION = VERSION_0
11
13
  A_ELEMENTS = ic.ICAElement("value", choices.common_dt, classifier=ic.Classifier.NOT_SPECIFIC),
12
14
 
13
15
  def characteristics_init(self):
@@ -1,12 +1,13 @@
1
1
  from ..__class_init__ import *
2
2
  from ...types import choices
3
3
  from ...types.implementations import integers
4
+ from ..overview import VERSION_0
4
5
 
5
6
 
6
7
  class DemandRegister(ic.COSEMInterfaceClasses):
7
8
  """DLMS UA 1000-1 Ed 14 4.3.4.Demand register"""
8
9
  CLASS_ID = ClassID.DEMAND_REGISTER
9
- VERSION = Version.V0
10
+ VERSION = VERSION_0
10
11
  A_ELEMENTS = (
11
12
  ic.ICAElement("current_average_value", choices.register, classifier=ic.Classifier.DYNAMIC),
12
13
  ic.ICAElement("last_average_value", choices.register, classifier=ic.Classifier.DYNAMIC),
@@ -2,6 +2,7 @@ from .__class_init__ import *
2
2
  from ..types.implementations import integers
3
3
  from itertools import chain
4
4
  from ..config_parser import get_message
5
+ from .overview import VERSION_0
5
6
 
6
7
 
7
8
  class ControlState(cdt.Enum, elements=(0, 1, 2)):
@@ -42,7 +43,7 @@ class OutputState(cdt.Boolean):
42
43
  class DisconnectControl(ic.COSEMInterfaceClasses):
43
44
  """DLMS UA 1000-1 Ed. 14 4.5.8 Disconnect control"""
44
45
  CLASS_ID = ClassID.DISCONNECT_CONTROL
45
- VERSION = Version.V0
46
+ VERSION = VERSION_0
46
47
  A_ELEMENTS = (ic.ICAElement("output_state", OutputState, classifier=ic.Classifier.DYNAMIC),
47
48
  ic.ICAElement("control_state", ControlState, classifier=ic.Classifier.DYNAMIC),
48
49
  ic.ICAElement("control_mode", ControlMode))
@@ -1,6 +1,7 @@
1
1
  from . import register
2
2
  from .__class_init__ import *
3
3
  from ..types import choices
4
+ from .overview import VERSION_0
4
5
 
5
6
 
6
7
  class ExtendedRegister(register.Register, ic.COSEMInterfaceClasses):
@@ -8,7 +9,7 @@ class ExtendedRegister(register.Register, ic.COSEMInterfaceClasses):
8
9
  the nature of the process value or of the status value. The nature of the value is described by the attribute
9
10
  “logical name” using the OBIS identification system. """
10
11
  CLASS_ID = ClassID.EXT_REGISTER
11
- VERSION = Version.V0
12
+ VERSION = VERSION_0
12
13
  A_ELEMENTS = (register.Register.get_attr_element(2),
13
14
  register.Register.get_attr_element(3),
14
15
  ic.ICAElement("status", choices.extended_register, classifier=ic.Classifier.DYNAMIC),
@@ -1,4 +1,5 @@
1
1
  from . __class_init__ import *
2
+ from ..overview import VERSION_0
2
3
 
3
4
 
4
5
  class QoSElement(cdt.Structure):
@@ -21,7 +22,7 @@ class QualityOfService(cdt.Structure):
21
22
  class GPRSModemSetup(ic.COSEMInterfaceClasses):
22
23
  """ This IC allow setting up GPRS modems, by handling all data necessary data for modem management. """
23
24
  CLASS_ID = ClassID.GPRS_MODEM_SETUP
24
- VERSION = Version.V0
25
+ VERSION = VERSION_0
25
26
  A_ELEMENTS = (ic.ICAElement("APN", cdt.OctetString),
26
27
  ic.ICAElement("PIN_code", cdt.LongUnsigned),
27
28
  ic.ICAElement("quality_of_service", QualityOfService))
@@ -2,6 +2,7 @@ import logging
2
2
 
3
3
  from ..__class_init__ import *
4
4
  from ...config_parser import get_message
5
+ from ..overview import VERSION_0
5
6
 
6
7
 
7
8
  class Status(cdt.Enum, elements=tuple(range(6))):
@@ -61,7 +62,7 @@ class GSMDiagnostic(ic.COSEMInterfaceClasses):
61
62
  to obtain diagnostic information that allows identifying communication problems in the network. An instance of the 'GSM diagnostic' class stores parameters of the GSM/GPRS
62
63
  network necessary for analysing the operation of the network."""
63
64
  CLASS_ID = ClassID.GSM_DIAGNOSTIC
64
- VERSION = Version.V0
65
+ VERSION = VERSION_0
65
66
  A_ELEMENTS = (ic.ICAElement("operator", cdt.VisibleString, classifier=ic.Classifier.DYNAMIC),
66
67
  ic.ICAElement("status", Status, 0, 255, 0, classifier=ic.Classifier.DYNAMIC),
67
68
  ic.ICAElement("cs_attachment", CSAttachment, 0, 255, 0, classifier=ic.Classifier.DYNAMIC),
@@ -1,12 +1,13 @@
1
1
  from collections import deque
2
2
  from ..__class_init__ import *
3
3
  from ...types.implementations.enums import CommSpeed
4
+ from ..overview import VERSION_0
4
5
 
5
6
 
6
7
  class IECHDLCSetup(ic.COSEMInterfaceClasses):
7
8
  """ This IC allows modelling and configuring communication channels according to Clause 8 of DLMS UA 1000-2 Ed. 8.0:2014. Several communication cnannels can be configured. """
8
9
  CLASS_ID = ClassID.IEC_HDLC_SETUP
9
- VERSION = Version.V1
10
+ VERSION = VERSION_0
10
11
  A_ELEMENTS = (ic.ICAElement("comm_speed", CommSpeed, 0, 9, 5),
11
12
  ic.ICAElement("windows_size_transmit", cdt.Unsigned, 1, 7, 1),
12
13
  ic.ICAElement("windows_size_receive", cdt.Unsigned, 1, 7, 1),
@@ -1,10 +1,11 @@
1
- from .__class_init__ import *
1
+ from ..cosem_interface_classes import cosem_interface_class as ic
2
+ from .overview import ClassID, VERSION_1
2
3
 
3
4
 
4
5
  class IECLocalPortSetup(ic.COSEMInterfaceClasses):
5
6
  """ This IC allows modelling the configuration of communication ports using the protocols specified in IEC 62056-21:2002. Several ports can be configured. """
6
7
  CLASS_ID = ClassID.IEC_LOCAL_PORT_SETUP
7
- VERSION = Version.V1
8
+ VERSION = VERSION_1
8
9
 
9
10
  def characteristics_init(self) -> None:
10
11
  """# TODO: not released ... """
@@ -1,6 +1,7 @@
1
1
  from ..__class_init__ import *
2
2
  from ...types.implementations import integers
3
3
  from . image_transfer_status import ImageTransferStatus
4
+ from ..overview import VERSION_0
4
5
 
5
6
 
6
7
  class ImageToActivateInfoElement(cdt.Structure):
@@ -35,7 +36,7 @@ class ImageBlockTransfer(cdt.Structure):
35
36
  class ImageTransfer(ic.COSEMInterfaceClasses):
36
37
  """ Instance of the Image transfer IC model the process of transferring binary files, called Images to COSEM servers. """
37
38
  CLASS_ID = ClassID.IMAGE_TRANSFER
38
- VERSION = Version.V0
39
+ VERSION = VERSION_0
39
40
  __blocks_for_update: list[bytearray]
40
41
  A_ELEMENTS = (ic.ICAElement("image_block_size", cdt.DoubleLongUnsigned),
41
42
  ic.ICAElement("image_transferred_blocks_status", cdt.BitString, classifier=ic.Classifier.DYNAMIC),
@@ -1,5 +1,6 @@
1
1
  from .__class_init__ import *
2
2
  from ..types.implementations import double_long_usingneds, arrays
3
+ from .overview import VERSION_0
3
4
 
4
5
 
5
6
  class IPOptionsElement(cdt.Structure):
@@ -17,7 +18,7 @@ class IPv4Setup(ic.COSEMInterfaceClasses):
17
18
  connection on which these settings are used. There shall be and instance of this IC in a device for each different network interface implemented. For example, if a device has
18
19
  two interfaces (using the TCP-UDP/ITv4 profile on both of them), there shall be two instances of the IPc4 setup IC in that device: one for each of these interfaces."""
19
20
  CLASS_ID = ClassID.IPV4_SETUP
20
- VERSION = Version.V0
21
+ VERSION = VERSION_0
21
22
  # TODO: more 7 attr and 3 methods
22
23
  A_ELEMENTS = (ic.ICAElement("DL_reference", cst.LogicalName),
23
24
  ic.ICAElement("IP_address", double_long_usingneds.IPAddress),
@@ -3,6 +3,9 @@ from .. import exceptions as exc
3
3
  from .__class_init__ import *
4
4
  from ..types import choices
5
5
  from ..types.implementations import structs, long_unsigneds, double_long_usingneds
6
+ from .overview import VERSION_0
7
+
8
+
6
9
  threshold_scaler_unit = cdt.ScalUnitType(b'\x02\x02\x0f\x00\x16\x07')
7
10
 
8
11
 
@@ -41,7 +44,7 @@ class Limiter(ic.COSEMInterfaceClasses):
41
44
  time, and duration. The emergency profile id element is matched to an emergency profile group id: this mechanism enables the activation of the emergency threshold only
42
45
  for a specific emergency group. """
43
46
  CLASS_ID = ClassID.LIMITER
44
- VERSION = Version.V0
47
+ VERSION = VERSION_0
45
48
  A_ELEMENTS = (ic.ICAElement("monitored_value", structs.ValueDefinition),
46
49
  ic.ICAElement("threshold_active", choices.simple_dt, classifier=ic.Classifier.DYNAMIC),
47
50
  ic.ICAElement("threshold_normal", choices.simple_dt),
@@ -1,5 +1,6 @@
1
1
  from ..__class_init__ import *
2
2
  from ...types.implementations.enums import CommSpeed
3
+ from ..overview import VERSION_0
3
4
 
4
5
 
5
6
  class InitializationStringElement(cdt.Structure):
@@ -43,7 +44,7 @@ class PSTNModemConfiguration(ic.COSEMInterfaceClasses):
43
44
  """ An instance of the 'PSTN modem configuration' IC stores data related to the initialization of modems, which are used for data transfer from/to a device. Several modems
44
45
  can be configured."""
45
46
  CLASS_ID = ClassID.MODEM_CONFIGURATION
46
- VERSION = Version.V0
47
+ VERSION = VERSION_0
47
48
  A_ELEMENTS = (ic.ICAElement("comm_speed", CommSpeed, 0, 9, 5),
48
49
  ic.ICAElement("initialization_string", InitializationString),
49
50
  ic.ICAElement("modem_profile", ModemProfile))
@@ -1,5 +1,6 @@
1
1
  from ..__class_init__ import *
2
2
  from . import ver0
3
+ from ..overview import VERSION_1
3
4
 
4
5
 
5
6
  class InitializationStringElement(cdt.Structure):
@@ -19,8 +20,8 @@ class InitializationString(cdt.Array):
19
20
 
20
21
  class ModemConfigurationVer1(ic.COSEMInterfaceClasses):
21
22
  """ This IC allow modelling the configuration and initialisation of modems used for data transfer from/to a device. Several modems can be configured."""
22
- CLASS_ID = ut.CosemClassId(27)
23
- VERSION = Version.V1
23
+ ClassID = ut.CosemClassId(27)
24
+ VERSION = VERSION_1
24
25
  A_ELEMENTS = (ver0.PSTNModemConfiguration.get_attr_element(2),
25
26
  ic.ICAElement("initialization_string", InitializationString),
26
27
  ver0.PSTNModemConfiguration.get_attr_element(4))
@@ -1,5 +1,6 @@
1
1
  from ..__class_init__ import *
2
2
  from ...types.implementations import integers
3
+ from ..overview import VERSION_0
3
4
 
4
5
 
5
6
  class ServerAddress(cdt.OctetString):
@@ -24,7 +25,7 @@ class AuthenticationKeys(cdt.Array):
24
25
  class NTPSetup(ic.COSEMInterfaceClasses):
25
26
  """DLMS UA 1000-1 Ed 14, 4.9.7 NTP setup"""
26
27
  CLASS_ID = ClassID.NTP_SETUP
27
- VERSION = Version.V0
28
+ VERSION = VERSION_0
28
29
  A_ELEMENTS = (
29
30
  ic.ICAElement("activated", cdt.Boolean, default=False),
30
31
  ic.ICAElement("server_address", ServerAddress),
@@ -1,5 +1,7 @@
1
1
  """DLMS UA 1000-1 Ed 14 4.2 Overview of the COSEM interface classes"""
2
+ from typing import Final
2
3
  from functools import lru_cache
4
+ from typing_extensions import deprecated
3
5
  from enum import IntEnum
4
6
  from dataclasses import dataclass
5
7
  from ..types import ut, cdt
@@ -119,12 +121,11 @@ class ClassID:
119
121
  return tuple(map(int, filter(lambda it: isinstance(it, ut.CosemClassId), cls.__dict__.values())))
120
122
 
121
123
 
122
- @dataclass(frozen=True)
123
- class Version:
124
- V0 = cdt.Unsigned(0)
125
- V1 = cdt.Unsigned(1)
126
- V2 = cdt.Unsigned(2)
127
- V3 = cdt.Unsigned(3)
124
+ VERSION_0: Final[cdt.Unsigned] = cdt.Unsigned(0)
125
+ VERSION_1: Final[cdt.Unsigned] = cdt.Unsigned(1)
126
+ VERSION_2: Final[cdt.Unsigned] = cdt.Unsigned(2)
127
+ VERSION_3: Final[cdt.Unsigned] = cdt.Unsigned(3)
128
+ VERSION_4: Final[cdt.Unsigned] = cdt.Unsigned(4)
128
129
 
129
130
 
130
131
  class CountrySpecificIdentifiers(IntEnum):
@@ -2,6 +2,7 @@
2
2
  from typing import Type
3
3
  from ..__class_init__ import *
4
4
  from ...types.implementations import long_unsigneds, integers
5
+ from ..overview import VERSION_0
5
6
 
6
7
 
7
8
  BUFFER = 2
@@ -35,7 +36,7 @@ class SortMethod(cdt.Enum, elements=(1, 2, 3, 4, 5, 6)):
35
36
  class ProfileGeneric(ic.COSEMInterfaceClasses):
36
37
  """5.3.1 Profile generic"""
37
38
  CLASS_ID = ClassID.PROFILE_GENERIC
38
- VERSION = Version.V0
39
+ VERSION = VERSION_0
39
40
  # todo: remove down following
40
41
  scaler_profile_key: bytes | None = None
41
42
  """ obis of scaler profile for this profile if need """
@@ -6,6 +6,7 @@ from ...relation_to_OBIS import get_name
6
6
  from ... import exceptions as exc
7
7
  from ..__class_init__ import *
8
8
  from ...types.implementations import integers, arrays, structs
9
+ from ..overview import VERSION_1
9
10
 
10
11
 
11
12
  class CaptureObjects(cdt.Array):
@@ -37,7 +38,7 @@ class AccessSelector(ut.Unsigned8):
37
38
 
38
39
  class ProfileGeneric(ver0.ProfileGeneric):
39
40
  """4.3.6 Profile generic"""
40
- VERSION = Version.V1
41
+ VERSION = VERSION_1
41
42
  A_ELEMENTS = (ic.ICAElement("buffer", arrays.SelectionAccess, classifier=ic.Classifier.DYNAMIC),
42
43
  ic.ICAElement("capture_objects", CaptureObjects),
43
44
  ver0.ProfileGeneric.get_attr_element(4),
@@ -2,6 +2,7 @@ from ..__class_init__ import *
2
2
  from ...types.implementations import structs, enums, integers
3
3
  from itertools import chain
4
4
  from ...types import choices
5
+ from ..overview import VERSION_2
5
6
 
6
7
 
7
8
  class RestrictionElement(choices.StructureMixin, cdt.Structure):
@@ -89,7 +90,7 @@ class PushProtectionParameters(cdt.Array):
89
90
  class PushSetup(ic.COSEMInterfaceClasses):
90
91
  """ DLMS UA 1000-1 Ed. 14 4.4.8.2 Push setup"""
91
92
  CLASS_ID = ClassID.PUSH_SETUP
92
- VERSION = Version.V2
93
+ VERSION = VERSION_2
93
94
  A_ELEMENTS = (ic.ICAElement("push_object_list", PushObjectList),
94
95
  ic.ICAElement("send_destination_and_method", SendDestinationAndMethod),
95
96
  ic.ICAElement("communication_window", CommunicationWindow),
@@ -1,6 +1,7 @@
1
1
  from .__class_init__ import *
2
2
  from ..types import choices
3
3
  from ..types.implementations import integers
4
+ from ..overview import VERSION_0
4
5
 
5
6
 
6
7
  class Register(ic.COSEMInterfaceClasses):
@@ -8,7 +9,7 @@ class Register(ic.COSEMInterfaceClasses):
8
9
  the nature of the process value or of the status value. The nature of the value is described by the attribute
9
10
  “logical name” using the OBIS identification system. """
10
11
  CLASS_ID = ClassID.REGISTER
11
- VERSION = Version.V0
12
+ VERSION = VERSION_0
12
13
  scaler_unit_not_settable: bool
13
14
  A_ELEMENTS = (
14
15
  ic.ICAElement("value", choices.register, classifier=ic.Classifier.NOT_SPECIFIC),
@@ -1,7 +1,7 @@
1
1
  from ..__class_init__ import *
2
2
  from ...types import cst
3
3
  from ...types.implementations import long_unsigneds
4
-
4
+ from ..overview import VERSION_0
5
5
 
6
6
  class ObjectDefinition(cdt.Structure):
7
7
  class_id: long_unsigneds.ClassId
@@ -30,7 +30,7 @@ class RegisterActivation(ic.COSEMInterfaceClasses):
30
30
  the nature of the process value or of the status value. The nature of the value is described by the attribute
31
31
  “logical name” using the OBIS identification system. """
32
32
  CLASS_ID = ClassID.REGISTER_ACTIVATION
33
- VERSION = Version.V0
33
+ VERSION = VERSION_0
34
34
  A_ELEMENTS = (
35
35
  ic.ICAElement(
36
36
  NAME="register_assignment",
@@ -1,6 +1,7 @@
1
1
  from .__class_init__ import *
2
2
  from ..types import choices
3
3
  from ..types.implementations import structs
4
+ from .overview import VERSION_0
4
5
  threshold_scaler_unit = cdt.ScalUnitType(b'\x02\x02\x0f\x00\x16\x07')
5
6
 
6
7
 
@@ -24,7 +25,7 @@ class RegisterMonitor(ic.COSEMInterfaceClasses):
24
25
  """ DLMS UA 1000-1 Ed.14. 4.5.6. This IC allows modelling the function of monitoring of values modelled by “Data”, “Register”, “Extended register” or “Demand register” objects.
25
26
  It allows specifying thresholds, the value monitored, and a set of scripts (see 4.5.2) that are executed when the value monitored crosses a threshold """
26
27
  CLASS_ID = ClassID.REGISTER_MONITOR
27
- VERSION = Version.V0
28
+ VERSION = VERSION_0
28
29
  A_ELEMENTS = (ic.ICAElement("thresholds", Thresholds),
29
30
  ic.ICAElement("monitored_value", structs.ValueDefinition),
30
31
  ic.ICAElement("actions", Actions))
@@ -1,6 +1,7 @@
1
1
  from typing import Callable, Self
2
2
  from itertools import count
3
3
  from .__class_init__ import *
4
+ from .overview import VERSION_0
4
5
 
5
6
 
6
7
  class Index(cdt.LongUnsigned, min=1, max=9999):
@@ -133,7 +134,7 @@ class Schedule(ic.COSEMInterfaceClasses):
133
134
  If the clock is put forward, then all scripts, which fall into the forwarding interval (and would therefore get lost) are executed.
134
135
  If the clock is put back, re-execution of the scripts, which fall into the backwarding interval is suppressed. """
135
136
  CLASS_ID = ClassID.SCHEDULE
136
- VERSION = Version.V0
137
+ VERSION = VERSION_0
137
138
  A_ELEMENTS = ic.ICAElement("entries", Entries),
138
139
  M_ELEMENTS = (ic.ICMElement("enable_disable", DataED),
139
140
  ic.ICMElement("insert", ScheduleTableEntry),
@@ -1,5 +1,6 @@
1
1
  from .__class_init__ import *
2
2
  from ..types import choices
3
+ from .overview import VERSION_0
3
4
 
4
5
 
5
6
  class ServiceId(cdt.Enum, elements=(1, 2)):
@@ -46,7 +47,7 @@ class Scripts(cdt.Array):
46
47
  class ScriptTable(ic.COSEMInterfaceClasses):
47
48
  """Script table"""
48
49
  CLASS_ID = ClassID.SCRIPT_TABLE
49
- VERSION = Version.V0
50
+ VERSION = VERSION_0
50
51
  A_ELEMENTS = ic.ICAElement("scripts", Scripts),
51
52
  M_ELEMENTS = ic.ICMElement("execute", cdt.LongUnsigned),
52
53
 
@@ -1,4 +1,5 @@
1
1
  from ..__class_init__ import *
2
+ from ..overview import VERSION_0
2
3
 
3
4
 
4
5
  class SecurityPolicy(cdt.Enum, elements=tuple(range(16))):
@@ -30,7 +31,7 @@ class SecuritySetup(ic.COSEMInterfaceClasses):
30
31
  and/or third party indentify by their respective system titles. They also provide methods to increase the level of security and to manage symmetric keys, asymmetric key pairs
31
32
  and certificates """
32
33
  CLASS_ID = ClassID.SECURITY_SETUP
33
- VERSION = Version.V0
34
+ VERSION = VERSION_0
34
35
  A_ELEMENTS = (ic.ICAElement("security_policy", SecurityPolicy, 0, 3, 0),
35
36
  ic.ICAElement("security_suite", SecuritySuite, 0, 0, 0),
36
37
  ic.ICAElement("client_system_title", cdt.OctetString, classifier=ic.Classifier.DYNAMIC),
@@ -1,5 +1,6 @@
1
1
  from . import ver0
2
2
  from ..__class_init__ import *
3
+ from ..overview import VERSION_1
3
4
  from ...types import choices
4
5
 
5
6
 
@@ -99,11 +100,12 @@ class CertificateIdentification(choices.StructureMixin, cdt.Structure):
99
100
 
100
101
 
101
102
  class SecuritySetup(ver0.SecuritySetup):
102
- VERSION = Version.V1
103
+ VERSION = VERSION_1
103
104
  A_ELEMENTS = (ic.ICAElement("security_policy", SecurityPolicyVer1),
104
105
  ic.ICAElement("security_suite", SecuritySuite),
105
- ver0.SecuritySetup.get_attr_element(4),
106
- ver0.SecuritySetup.get_attr_element(5),
106
+ ver0.SecuritySetup.getAElement(3).unwrap(),
107
+ ver0.SecuritySetup.getAElement(4).unwrap(),
108
+ ver0.SecuritySetup.getAElement(5).unwrap(),
107
109
  ic.ICAElement("certificates", Certificates, classifier=ic.Classifier.DYNAMIC))
108
110
 
109
111
  M_ELEMENTS = (ic.ICMElement("security_activate", SecurityPolicyVer1),
@@ -1,5 +1,6 @@
1
1
  from .__class_init__ import *
2
2
  from ..types.implementations import structs
3
+ from .overview import VERSION_0
3
4
 
4
5
 
5
6
  class TYPE(cdt.Enum, elements=(1, 2, 3, 4, 5)):
@@ -22,7 +23,7 @@ class SingleActionSchedule(ic.COSEMInterfaceClasses):
22
23
  """ This IC allows modelling the execution of periodic actions within a meter. Such actions are not necessarily linked to tariffication
23
24
  (see “Activity calendar” or “Schedule”). """
24
25
  CLASS_ID = ClassID.SINGLE_ACTION_SCHEDULE
25
- VERSION = Version.V0
26
+ VERSION = VERSION_0
26
27
  A_ELEMENTS = (ic.ICAElement("executed_script", structs.ActionItem),
27
28
  ic.ICAElement("type", TYPE),
28
29
  ic.ICAElement("execution_time", ExecutionTime))
@@ -1,5 +1,6 @@
1
1
  import datetime
2
2
  from .__class_init__ import *
3
+ from .overview import VERSION_0
3
4
 
4
5
 
5
6
  class SpecDayEntry(cdt.Structure):
@@ -45,7 +46,7 @@ class SpecialDaysTable(ic.COSEMInterfaceClasses):
45
46
  """ The interface class allows defining dates, which will override normal switching behaviour for special days. The interface class works in
46
47
  conjunction with the class "Schedule" or "Activity calendar" and the linking data item is day_id """
47
48
  CLASS_ID = ClassID.SPECIAL_DAYS_TABLE
48
- VERSION = Version.V0
49
+ VERSION = VERSION_0
49
50
  A_ELEMENTS = ic.ICAElement("entries", Entries),
50
51
  M_ELEMENTS = (ic.ICMElement("insert", SpecDayEntry),
51
52
  ic.ICMElement("delete", cdt.LongUnsigned)) # Todo: was Delete.with_cb(None, self.entries.get_indexes)
@@ -1,4 +1,5 @@
1
1
  from .__class_init__ import *
2
+ from .overview import VERSION_0
2
3
 
3
4
 
4
5
  class TCPUDPSetup(ic.COSEMInterfaceClasses):
@@ -10,7 +11,7 @@ class TCPUDPSetup(ic.COSEMInterfaceClasses):
10
11
  devices hosting COSEM APs.
11
12
  When a COSEM physical device supports various data link layers - for example Ethernet and PPP - an instance of the TCP-UDP setup object is necessary for each of them. """
12
13
  CLASS_ID = ClassID.TCP_UDP_SETUP
13
- VERSION = Version.V0
14
+ VERSION = VERSION_0
14
15
  A_ELEMENTS = (ic.ICAElement("TCP_UDP_port", cdt.LongUnsigned, default=4059),
15
16
  ic.ICAElement("IP_reference", cst.LogicalName),
16
17
  ic.ICAElement("MMS", cdt.LongUnsigned, 40, 535, 535), # TODO: max, def not according by BlueBook
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: DLMS_SPODES
3
- Version: 0.86.15
3
+ Version: 0.86.17
4
4
  Summary: dlms-spodes
5
5
  Author-email: Serj Kotilevski <youserj@outlook.com>
6
6
  Project-URL: Source, https://github.com/youserj/DlmsSPODES-project
@@ -14,7 +14,7 @@ Requires-Dist: pydantic>=2.11
14
14
  Requires-Dist: cryptography>=45.0
15
15
  Requires-Dist: semver>=3.0
16
16
  Requires-Dist: typing-extensions>=4.12.2
17
- Requires-Dist: StructResult>=0.8.2
17
+ Requires-Dist: StructResult>=0.8.3
18
18
  Requires-Dist: numpy>=2.3.2
19
19
  Provides-Extra: dev
20
20
  Requires-Dist: mypy>=1.5.0; extra == "dev"
@@ -18,79 +18,79 @@ DLMS_SPODES/Values/EN/relation_to_obis_names.py,sha256=aRLHGfP3KoHOO3ncwcCN4osVN
18
18
  DLMS_SPODES/Values/RU/__init__.py,sha256=FVBOniaIeM6Mv24u0h_1fsEz2xyJZgyR7CWb9aW-DAc,46
19
19
  DLMS_SPODES/Values/RU/actors.py,sha256=-c50F71Z2LBarTAcItCJuejKXgYdHs6KBshsbYemSmE,446
20
20
  DLMS_SPODES/Values/RU/relation_to_obis_names.py,sha256=HxAdrLHu6y6yc2zFGpLBE4CLs44G0aB7x9Bql7h6e4M,31818
21
- DLMS_SPODES/cosem_interface_classes/__class_init__.py,sha256=PQENBxURG1xaQLJw9BAwaRaEv1gh2U5hweDO_079O54,246
21
+ DLMS_SPODES/cosem_interface_classes/__class_init__.py,sha256=ehpli4d4XnBUjoJtbOM9VxaDAmIpDimMr66RnbSfmwM,237
22
22
  DLMS_SPODES/cosem_interface_classes/__init__.py,sha256=1YTGhRTnVYjbKi-bcWBbGUkodWVNJQvFw_mlTYEpteg,115
23
23
  DLMS_SPODES/cosem_interface_classes/a_parameter.py,sha256=5C1DqtDDPX0U2zj_sakEiDy6jgYTFW7H4-70Lv65pkI,363
24
- DLMS_SPODES/cosem_interface_classes/activity_calendar.py,sha256=1kKRxBmMRKaKRYpR3xfqQpLGtFMcYK3mEykuNYZVT88,10552
25
- DLMS_SPODES/cosem_interface_classes/arbitrator.py,sha256=CvrYknl6xfg8hZR5RijzWsMh34XBQKsQ0nQp_Jtm__E,3208
24
+ DLMS_SPODES/cosem_interface_classes/activity_calendar.py,sha256=VWSiKn2LNBA1VLAAyW6Xx5rxCMwJDrqQqkRzxupMSmM,10584
25
+ DLMS_SPODES/cosem_interface_classes/arbitrator.py,sha256=S9TguoMG6O5DpMBp6mpcJpw6PHanvh4SEAN3M_v6qts,3240
26
26
  DLMS_SPODES/cosem_interface_classes/attr_indexes.py,sha256=aUSnT-dKoBsDbwLhlgtLIHGRl7PZrT-ld2ThCEUjUeA,328
27
- DLMS_SPODES/cosem_interface_classes/clock.py,sha256=AQiMtW13_Y74M2kYYfhZsKGPWtHqOkBNvEPX2QCfXfg,4493
28
- DLMS_SPODES/cosem_interface_classes/collection.py,sha256=PwhbNP9_S_Bp1nt3xxza46rvMS4j8WWoml94MCI80nQ,96575
29
- DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py,sha256=UqU0l2YZbx3WB-ziZyfoPoXtStYPgttAtJKdW0GZYb4,23002
30
- DLMS_SPODES/cosem_interface_classes/data.py,sha256=ELFfBX_VFsKRpAB7SVUp1sBnhjDgttGXa96jSYYLOH8,734
31
- DLMS_SPODES/cosem_interface_classes/disconnect_control.py,sha256=21qKu4cpOEeiuhQAk4tGcfsm32ibCgQv8W3vVdOO4Wo,2894
32
- DLMS_SPODES/cosem_interface_classes/extended_register.py,sha256=myVtqPxCZAm-JlgCB-KQeNrBLLptUXj2Bh9HEIOiHHA,1121
33
- DLMS_SPODES/cosem_interface_classes/gprs_modem_setup.py,sha256=TM0PcTNOmk0GApHwp-F_9kvjsEGYUyLDRrqvJ6zdwdo,1419
34
- DLMS_SPODES/cosem_interface_classes/iec_local_port_setup.py,sha256=Tu6WB8S7gT-9X7IWYuFFIdtNnbkHM_prG_f-Ock8jUM,410
35
- DLMS_SPODES/cosem_interface_classes/ipv4_setup.py,sha256=kFixHUH8D7_hVRvOWAQPdcUjCcJT5QtjincOQew2vDU,2823
36
- DLMS_SPODES/cosem_interface_classes/limiter.py,sha256=a4vyTbglRUPRxP9dGhyrcyYwO5bjy0r-KfG6Kim5sek,5249
27
+ DLMS_SPODES/cosem_interface_classes/clock.py,sha256=9OJwRGrbFPws_VZPayHv-hzFJegIcjgoJoenIqofd5w,4525
28
+ DLMS_SPODES/cosem_interface_classes/collection.py,sha256=CzL89O6YCj4aGz5kjNozoxdB7f-peFbwSRKNpnnenjU,96520
29
+ DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py,sha256=LUtooNc45Fvk2d7oIPRT41zJDQnyo5Y3S5T-90WV7QE,23506
30
+ DLMS_SPODES/cosem_interface_classes/data.py,sha256=YSjA3Y0M5NMcfYzWPEuZw6ojIqr2UghgW_ck8dXySMU,809
31
+ DLMS_SPODES/cosem_interface_classes/disconnect_control.py,sha256=CIx7I4QRpPxAC5iYxpbhCIuv6U2P3s6ELam8eD-kD5w,2926
32
+ DLMS_SPODES/cosem_interface_classes/extended_register.py,sha256=xULCS11YVWjFMoaRUrm4whvH39Gx0Cu6breUos_oLCs,1153
33
+ DLMS_SPODES/cosem_interface_classes/gprs_modem_setup.py,sha256=IPeEd9-vK8OMe-gGD-dP3qteIiWYV6QMV3GpT48edDU,1452
34
+ DLMS_SPODES/cosem_interface_classes/iec_local_port_setup.py,sha256=I5JrwsVwQOgpxeGByHL5SBc7c_CCYdwr2J0egAiBIO8,487
35
+ DLMS_SPODES/cosem_interface_classes/ipv4_setup.py,sha256=7o8-zNALz0Pxzz8T2QNH_G-oITOMuoGoJqtfGc6mMV4,2855
36
+ DLMS_SPODES/cosem_interface_classes/limiter.py,sha256=LDVoix4L2yq4yPxbfSv6zoyA5p_i5DK_uQ6XaES4ass,5285
37
37
  DLMS_SPODES/cosem_interface_classes/ln_pattern.py,sha256=IPluhyGWJQLBEUjOjdfEMct8JP_4orUwF92c3sQfSNM,13921
38
38
  DLMS_SPODES/cosem_interface_classes/obis.py,sha256=yEwYm5CshJx8X8uSy3QH8XIbdVPg8Tt6zPUjFgkAB0M,575
39
- DLMS_SPODES/cosem_interface_classes/overview.py,sha256=4RjE6_5x_dDGv4M5J2rjT8MZDF-Q4nFE8JSOUA7OD84,6973
39
+ DLMS_SPODES/cosem_interface_classes/overview.py,sha256=0eko1CW0eH397J5kM20G7RSQUzCGV6lGCMPbLsKPEqQ,7146
40
40
  DLMS_SPODES/cosem_interface_classes/parameter.py,sha256=ukoDSqGutYV4K4QSaM7i9zKYm8eyqQ8gnOWvqqAeDCo,18252
41
41
  DLMS_SPODES/cosem_interface_classes/parameters.py,sha256=UOsqKZeqxDjqtXOcpnxInwgmFTWOkCar9ZuIOaIEjvo,513
42
- DLMS_SPODES/cosem_interface_classes/register.py,sha256=ClnkQ9-lg9NCxxCtFLR0soQ7VuNdigHia9qx1suGVZE,1854
43
- DLMS_SPODES/cosem_interface_classes/register_monitor.py,sha256=CrcFqas157kGaaDDwy8a0DKy5wK1Jm-tzCOBGBLuIKM,1760
42
+ DLMS_SPODES/cosem_interface_classes/register.py,sha256=T5CGgjEm8PefpMWRDvo6rxSLVin5Wtax72LQmhF6fmw,1887
43
+ DLMS_SPODES/cosem_interface_classes/register_monitor.py,sha256=fNM-JrjHxQB8b5DgUOtDcnkO_hxu5bFICiuKEoZa37g,1792
44
44
  DLMS_SPODES/cosem_interface_classes/reports.py,sha256=9kOt9Ztyp5D59j3k3x5URy7WD1qlFNMa8xFlMu7nUmA,3320
45
- DLMS_SPODES/cosem_interface_classes/schedule.py,sha256=2UU4th1v4iNxyr9cFLrr7HdrQU-Dn_LFcP0iurJky4Q,8009
46
- DLMS_SPODES/cosem_interface_classes/script_table.py,sha256=wVztpF7yxDXFnxeCz6AbKvzHJOWTRuLmXeLxVajEEqE,3423
47
- DLMS_SPODES/cosem_interface_classes/single_action_schedule.py,sha256=qLw0Z7uCF0FuHyJ81UFt0PV7hJW4WKYB_4sytAX32NA,1676
48
- DLMS_SPODES/cosem_interface_classes/special_days_table.py,sha256=pzJJlIsdNEBTJ-IoWUWFj5qZGGjGEU0oF2g3Y--9Fw4,3324
49
- DLMS_SPODES/cosem_interface_classes/tcp_udp_setup.py,sha256=GTRxaBwnE5jBNd1GKu2NpbzINtOj-fSHdGPqkNE2cJ8,2214
45
+ DLMS_SPODES/cosem_interface_classes/schedule.py,sha256=IT9sVrkOCdWV4uuTt8Kbu5bL6jchiVTgUqA15x1fq5s,8041
46
+ DLMS_SPODES/cosem_interface_classes/script_table.py,sha256=aPDXwjCkrvT-yGkCOOZXWjiOZViRy6N-Tb_Gl1aTIik,3455
47
+ DLMS_SPODES/cosem_interface_classes/single_action_schedule.py,sha256=UGRO-x2q1du3CupfB4KQtUyyUAcbJGqph_apIe0QfFY,1708
48
+ DLMS_SPODES/cosem_interface_classes/special_days_table.py,sha256=etTcvCBYqkJe6vFYuD87VKY1KeD45b2567ifvf3MRgk,3356
49
+ DLMS_SPODES/cosem_interface_classes/tcp_udp_setup.py,sha256=m7P0XTxupoi5XCq3nsqHKD_lhbEj3tQj-65Acx2S53A,2246
50
50
  DLMS_SPODES/cosem_interface_classes/association_ln/__init__.py,sha256=Y3YnJNv4fFcnnEp3MH3wCBt3u8odMWK9TqnDTagHrSE,22
51
51
  DLMS_SPODES/cosem_interface_classes/association_ln/abstract.py,sha256=komQiQ3ax4kVZuC2xS_PgSeYVSr04LbTzAfGt9rSwGg,866
52
52
  DLMS_SPODES/cosem_interface_classes/association_ln/authentication_mechanism_name.py,sha256=y5DdsGDD1cLmPB56tMmpQ7uQXH_XLTLaXipztjp3lBA,1254
53
53
  DLMS_SPODES/cosem_interface_classes/association_ln/mechanism_id.py,sha256=lVEs0qPD_g8Yi2dxenZtbgAPbWSF6nJwTz-cHrqanWA,693
54
54
  DLMS_SPODES/cosem_interface_classes/association_ln/method.py,sha256=IZOGHm9jvit4qJv-8c_mXYM3Jkf2ruKAdXf-KFbOs50,127
55
- DLMS_SPODES/cosem_interface_classes/association_ln/ver0.py,sha256=cR7w8PVrlio2R9t81oaclypIWcE0lb4pnBeoM_NPnno,21100
56
- DLMS_SPODES/cosem_interface_classes/association_ln/ver1.py,sha256=_S58wg32qLK2FP4ocpGQt9f_byXDLK5GveJDeEq9Ivo,5409
57
- DLMS_SPODES/cosem_interface_classes/association_ln/ver2.py,sha256=I2Ewy36cQmi2lki3W4dKNMSDinTK4VWKFNsIZYmMaZo,1550
55
+ DLMS_SPODES/cosem_interface_classes/association_ln/ver0.py,sha256=zLvU15TrWJ-6uDmAionO07iWh-ovPYxGjqXOcrBed8M,21330
56
+ DLMS_SPODES/cosem_interface_classes/association_ln/ver1.py,sha256=G-GiAkQ0tQC6KdT6k-jVJNG-2RkqbSkugOnM12iDgr8,5442
57
+ DLMS_SPODES/cosem_interface_classes/association_ln/ver2.py,sha256=Ayx3YJuWTxnCgWrJjylJk95SuuefH-r9rjHvlJ3Nvcs,1583
58
58
  DLMS_SPODES/cosem_interface_classes/association_ln/ver3.py,sha256=hGcEbDhsiIb71upDU3NyqbsGWKnhHYIX5MGAJd5rqg4,154
59
59
  DLMS_SPODES/cosem_interface_classes/association_sn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  DLMS_SPODES/cosem_interface_classes/association_sn/ver0.py,sha256=4kadthdoyc4JzmsEghXNtNFV0X_QNHMDEHzHlkDPe3c,393
61
61
  DLMS_SPODES/cosem_interface_classes/demand_register/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
- DLMS_SPODES/cosem_interface_classes/demand_register/ver0.py,sha256=ORWYDPX0VvUnxShFeNXBTu3hXM9Yn-aJjURKQGhQphA,2169
62
+ DLMS_SPODES/cosem_interface_classes/demand_register/ver0.py,sha256=JUoLCQPPiXxtg2zBgvvzorEo1AqNfml1R4z4lde5Xek,2202
63
63
  DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
- DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver0.py,sha256=zqYIafvbo7OvFpbAoApz0AlgOYB15KEwfYOLy_BaC8A,3641
64
+ DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver0.py,sha256=bYMnb0C4aBIebDbJ1w7A9h9sDkOZ-OzbfqpuZEVgHJA,3674
65
65
  DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver1.py,sha256=11DD_djO3jAvvwoXBYUwyuydIPhe8jDFzh4VMZCsxbI,1395
66
66
  DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver2.py,sha256=p6oPrUn_PbmXYlcSYa30zPTnZQzo1pkXSVIwIH5pBHI,329
67
67
  DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
68
  DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver0.py,sha256=VqQswAp2vwuwEkAIgb5Gh-ZNTGiCuGCUVGfXkw9vvE0,369
69
- DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver1.py,sha256=zejEtuVR8-vh5h33Kx5fAgSDiRnwUi63CMjvIk_9PkA,2106
69
+ DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver1.py,sha256=NQjLhPwg1f4naWf7toFWJO9oj8ZsWU2bsccEgYo85ig,2139
70
70
  DLMS_SPODES/cosem_interface_classes/image_transfer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
71
  DLMS_SPODES/cosem_interface_classes/image_transfer/image_transfer_status.py,sha256=xbG5QTJqjylUQPFSc_Ajh-FtxMEUsK-VxEfuumx4j80,537
72
- DLMS_SPODES/cosem_interface_classes/image_transfer/ver0.py,sha256=YD1Col7297zKt2HcjgZZ4EkahSvSuC0DruX07-hk2uo,5338
72
+ DLMS_SPODES/cosem_interface_classes/image_transfer/ver0.py,sha256=rnHj2XnK1Zr4CvPG_MrPSoBBcdh883rwqdIus1RxKMw,5371
73
73
  DLMS_SPODES/cosem_interface_classes/implementations/__init__.py,sha256=z4OfnPPyYr6f94rj-PU3---Wk05ddduf9MkmWxhczXA,77
74
74
  DLMS_SPODES/cosem_interface_classes/implementations/arbitrator.py,sha256=cMhYLi9ZFqfJ0yxjONHq9JZZJ3QuzrF0jtPjk4nf0eo,573
75
75
  DLMS_SPODES/cosem_interface_classes/implementations/data.py,sha256=g-3SZCSodet9gILK7SsrTPc72Fsq87YDtaZTb0Vucdc,18561
76
76
  DLMS_SPODES/cosem_interface_classes/implementations/profile_generic.py,sha256=oibO3EV9fRHxxaBdMQqz436GrMMqo1BlT6lgVtzUKU0,4318
77
77
  DLMS_SPODES/cosem_interface_classes/modem_configuration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
- DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py,sha256=6fzbsID_cOmYsl3alLHHcMM1zpD7NjsK77NzTViQOmo,3038
79
- DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py,sha256=NdwOSjBptUVIWTAUnui8KwnSMfFsk_PqVhkCwUXFAOI,1744
78
+ DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py,sha256=nFU3Y0fFhsOKfSl21TmA1CaWJo-N9Iqm7XlcGuSSjoQ,3071
79
+ DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py,sha256=Ze_W-UNKmng8uWLuEDfD78bIVO0u0IlM0sBnpzeOZ1c,1776
80
80
  DLMS_SPODES/cosem_interface_classes/ntp_setup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
- DLMS_SPODES/cosem_interface_classes/ntp_setup/ver0.py,sha256=1llnh_n9fXH2gaw6Po4RPZOXKeAd2z6LTZa-g0kUBRQ,2011
81
+ DLMS_SPODES/cosem_interface_classes/ntp_setup/ver0.py,sha256=1Eaf9dnqK8kFbn38Op-PxbHg1b63QwAQEY41f3ZXF2E,2044
82
82
  DLMS_SPODES/cosem_interface_classes/profile_generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
- DLMS_SPODES/cosem_interface_classes/profile_generic/ver0.py,sha256=LB3bQP_nEDCIwTAVyGN_3Ks2V0_B3ZX9-8RlP3VZibQ,4187
84
- DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py,sha256=2wQpY67UyFLMPilYTOVt1erH8Q2HEwb3TMG8LRyxYV4,10735
83
+ DLMS_SPODES/cosem_interface_classes/profile_generic/ver0.py,sha256=AhOPl9gCwWNCZ-Hvn-pG5SRg2yP1kPljnG_Uelr_BXg,4220
84
+ DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py,sha256=9kt0XvrlFskBbBHqHkHed8d1Y8M9Mz2uK7Ae0PTZBBc,10768
85
85
  DLMS_SPODES/cosem_interface_classes/push_setup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
86
  DLMS_SPODES/cosem_interface_classes/push_setup/ver0.py,sha256=JDbN0uyXM9iAWQe7JOgkz5DxibdcUQQrxPfTCII7CJ8,385
87
87
  DLMS_SPODES/cosem_interface_classes/push_setup/ver1.py,sha256=D25GXpg2uLl2nQ6eQMScFyId4ZhKdUwcU7jWUP3egG4,348
88
- DLMS_SPODES/cosem_interface_classes/push_setup/ver2.py,sha256=JETQHdKxNLcPH7HA6hcwZVY0LM0RkX3lK1XlgWAw_8w,5470
88
+ DLMS_SPODES/cosem_interface_classes/push_setup/ver2.py,sha256=3fACVNqDDSWSwOpEcRA3BKQgST_MoBWr8L_ITs-yPf4,5503
89
89
  DLMS_SPODES/cosem_interface_classes/register_activation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
- DLMS_SPODES/cosem_interface_classes/register_activation/ver0.py,sha256=Nqzt2doeeXqAy1inwR5XdV9xrw_1NfmLtGFLAYS7N7s,2232
90
+ DLMS_SPODES/cosem_interface_classes/register_activation/ver0.py,sha256=LDv8FgupwaHqo-YXEggYPFTHx2zfLMdXDocteEl0ub8,2263
91
91
  DLMS_SPODES/cosem_interface_classes/security_setup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
- DLMS_SPODES/cosem_interface_classes/security_setup/ver0.py,sha256=WxNSsluhBX3k8vP_7YRdiSVYTKU9CjICHED5cXOGtCE,2346
93
- DLMS_SPODES/cosem_interface_classes/security_setup/ver1.py,sha256=1pvbnQvRTnMa8Nt81RWt2h6_lxO2l--lDY6x0_-sb_A,4852
92
+ DLMS_SPODES/cosem_interface_classes/security_setup/ver0.py,sha256=INRPYsWdVKOngm17uR7EgJ5VBlAcpWaAk-uiFIbh9lo,2379
93
+ DLMS_SPODES/cosem_interface_classes/security_setup/ver1.py,sha256=Xs8aSme9Qu4ekT9E4FQrapdxP7yS2B6pE8SKDQaFDtk,4956
94
94
  DLMS_SPODES/cosem_interface_classes/security_setup/__pycache__/__init__.cpython-311.pyc,sha256=1ZbhthOjr77pX0c1vW5wX8q9pGvIcz_kAKr6ZemvpSA,210
95
95
  DLMS_SPODES/hdlc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
96
  DLMS_SPODES/hdlc/frame.py,sha256=se-IFXdHGF9z4eXNtWm3BJZUZdC4e9BQPym-HTGQcgg,34905
@@ -112,7 +112,7 @@ DLMS_SPODES/types/implementations/integers.py,sha256=KAcaTY8ZwhBaJThbLSr39Oh_-9h
112
112
  DLMS_SPODES/types/implementations/long_unsigneds.py,sha256=SxmFvD2moQ03p-KZSBYK1Rv7bQSaywlHVXBfkTZG1OQ,8761
113
113
  DLMS_SPODES/types/implementations/octet_string.py,sha256=Jo_sfWcsfstiP4O6mXfBOOQlksx1c2qJMI-vbAOV-yM,294
114
114
  DLMS_SPODES/types/implementations/structs.py,sha256=GMOo6Jy8jA9d6KTLs0D-j5t0oSRvxUIwtBr_4UePwbA,2059
115
- dlms_spodes-0.86.15.dist-info/METADATA,sha256=CmQXE_kE5LeR5CBTKbyvW8udIx9XQDrFLnG40mO2Z1c,1028
116
- dlms_spodes-0.86.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
117
- dlms_spodes-0.86.15.dist-info/top_level.txt,sha256=k26SRuRdwBZrSM3NgNZECAUNIDZREbJuLCnPbWtTNak,12
118
- dlms_spodes-0.86.15.dist-info/RECORD,,
115
+ dlms_spodes-0.86.17.dist-info/METADATA,sha256=LZ5AqlVfCAElssNp-M7lqXSFuDlytoSfRFFHerKKR-g,1028
116
+ dlms_spodes-0.86.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
117
+ dlms_spodes-0.86.17.dist-info/top_level.txt,sha256=k26SRuRdwBZrSM3NgNZECAUNIDZREbJuLCnPbWtTNak,12
118
+ dlms_spodes-0.86.17.dist-info/RECORD,,