DLMS-SPODES 0.87.3__py3-none-any.whl → 0.87.6__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.
@@ -1,7 +1,7 @@
1
1
  """
2
2
  DLMS UA 1000-1 Ed 14
3
3
  """
4
- from dataclasses import dataclass
4
+ from dataclasses import dataclass, field
5
5
  from functools import lru_cache
6
6
  from typing_extensions import deprecated
7
7
  from typing import Iterator, Type, TypeAlias, Callable, Any, Self, Literal, Optional, Protocol, ClassVar
@@ -318,18 +318,27 @@ def ClassIDVer2Name(class_id: ClassID, ver: cdt.Unsigned) -> Name:
318
318
  case _: raise exc.ITEApplication(F"not find <Interface class name> with: {class_id=}, {ver=}")
319
319
 
320
320
 
321
+ @dataclass
322
+ class Cardinality:
323
+ """4.1.4 Class description notation"""
324
+ min: int = 0
325
+ max: int = -1
326
+ """default -1 as infinity"""
327
+
328
+
321
329
  class COSEMInterfaceClasses(Protocol):
322
330
  CLASS_ID: ClassVar[ut.CosemClassId]
323
331
  VERSION: ClassVar[cdt.Unsigned]
324
332
  """ 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
325
333
  attribute of an “Association LN” / ”Association SN” object. Within one logical device, all instances of a certain class must be of the same version."""
326
334
  A_ELEMENTS: tuple[ICAElement, ...]
335
+ cardinality: ClassVar[Cardinality] = field(default_factory=Cardinality)
327
336
  M_ELEMENTS: tuple[ICMElement, ...] = tuple() # empty if class not has the methods
328
- cardinality: tuple[int, int | None]
329
337
  __attributes: list[cdt.CommonDataType | None]
330
338
  __specific_methods: tuple[cdt.CommonDataType, ...] = None
331
339
  _cbs_attr_post_init: dict[int, Callable]
332
- collection: Any | None # Collection. todo: remove in future
340
+ # collection: Any | None # Collection. todo: remove in future
341
+ hash_: int
333
342
 
334
343
  def __init__(self, logical_name: cst.LogicalName | bytes | str):
335
344
  self.collection = None
@@ -534,15 +543,6 @@ class COSEMInterfaceClasses(Protocol):
534
543
  """ Cosem-Attribute-Descriptor IS/IEC 62056-53 : 2006, 8.3 Useful types """
535
544
  return self.CLASS_ID.contents + self.instance_id.contents + ut.CosemObjectAttributeId(index).contents
536
545
 
537
- @property
538
- def string_type_cardinality(self) -> str:
539
- min_cardinality, max_cardinality = self.cardinality
540
- if min_cardinality == max_cardinality:
541
- return str(min_cardinality)
542
- else:
543
- max_cardinality = str(max_cardinality) if max_cardinality else 'n'
544
- return F'{str(min_cardinality)}...{max_cardinality}'
545
-
546
546
  def reset_attribute(self, index: int):
547
547
  """ try set default to value """
548
548
  self.set_attr(index, self.get_attr_element(index).default)
@@ -302,6 +302,15 @@ class KPZAlarm1(DataStatic):
302
302
  A_ELEMENTS = DataStatic.get_attr_element(2).get_change(data_type=KPZAlarm1Values),
303
303
 
304
304
 
305
+ class SPODES3ControlAlarm1Values(cdt.IntegerFlag, cdt.DoubleLongUnsigned):
306
+ ...
307
+
308
+
309
+ class SPODES3ControlAlarm1(DataDynamic):
310
+ """СТО 34.01-5.1-006-2023v4 Таблица 13.5 Распределение событий отключения реле нагрузки по битам"""
311
+ A_ELEMENTS = DataNotSpecific.get_attr_element(2).get_change(data_type=SPODES3ControlAlarm1Values),
312
+
313
+
305
314
  class SPODES3PowerQuality1Event(DataNotSpecific):
306
315
  """СТО_34.01-5.1-006-2019v3 E.1 Статус качества сети (журнал качества сети)"""
307
316
  A_ELEMENTS = DataNotSpecific.get_attr_element(2).get_change(data_type=SPODES3PowerQuality1EventValues),
@@ -64,7 +64,6 @@ class SPODES3DisplayReadout(ver1.ProfileGeneric):
64
64
  obj = self.collection.add_if_missing(class_id=ut.CosemClassId(el_value.class_id.contents),
65
65
  version=None,
66
66
  logical_name=el_value.logical_name)
67
- # self.collection.raise_before(obj, self)
68
67
  el_value.set_name(self.collection.get_name_and_type(el_value)[0][-1])
69
68
  self.buffer_capture_objects = self.capture_objects
70
69
  buffer_elements: list[cdt.StructElement] = list()
@@ -18,6 +18,7 @@ class ActiveFirmwareIdentifier(Data):
18
18
  return cls.parse(f"0.{b}.0.2.0.255")
19
19
 
20
20
 
21
+ LDN = Data.parse("0.0.42.0.0.255")
21
22
  ACTIVE_FIRMWARE_IDENTIFIER_0 = ActiveFirmwareIdentifier.from_b()
22
23
 
23
24
 
@@ -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 ...types.choices import CommonDataTypeChoiceBase
9
10
  from ..overview import VERSION_1
10
11
 
11
12
 
@@ -36,6 +37,59 @@ class AccessSelector(ut.Unsigned8):
36
37
  raise ValueError(F'The {self.__class__.__name__} got {int(self)}, expected 1..2')
37
38
 
38
39
 
40
+ class RangeDescriptorValueChoice(CommonDataTypeChoiceBase, types=(
41
+ cdt.DoubleLong,
42
+ cdt.DoubleLongUnsigned,
43
+ cdt.OctetString,
44
+ cdt.VisibleString,
45
+ cdt.Utf8String,
46
+ cdt.Integer,
47
+ cdt.Unsigned,
48
+ cdt.LongUnsigned,
49
+ cdt.Long,
50
+ cdt.Long64Unsigned,
51
+ cdt.Float32,
52
+ cdt.Float64,
53
+ cdt.DateTime,
54
+ cdt.Date,
55
+ cdt.Time
56
+ )):
57
+ """Types of range_descriptor.from_value/to_value"""
58
+
59
+
60
+ class RangeDescriptor(cdt.Structure):
61
+ restricting_object: structs.CaptureObjectDefinition
62
+ from_value: RangeDescriptorValueChoice
63
+ to_value: RangeDescriptorValueChoice
64
+ selected_values: CaptureObjects
65
+
66
+
67
+ class Data(ut.Data):
68
+ restricting_object: structs.CaptureObjectDefinition
69
+ from_value: cdt.SimpleDataType
70
+ to_value: cdt.SimpleDataType
71
+ selected_values: CaptureObjects
72
+ from_entry: FromEntry
73
+ to_entry: cdt.DoubleLongUnsigned
74
+ from_selected_value: cdt.LongUnsigned
75
+ to_selected_value: cdt.LongUnsigned
76
+ ELEMENTS = {1: ut.SequenceElement('range_descriptor', RangeDescriptor),
77
+ 2: ut.SequenceElement('entry_descriptor', EntryDescriptor)}
78
+
79
+
80
+ class SelectiveAccessDescriptor(ut.SelectiveAccessDescriptor):
81
+ access_selector: AccessSelector
82
+ access_parameters: Data
83
+ ELEMENTS = (ut.SequenceElement('access_selector', AccessSelector),
84
+ ut.SequenceElement('access_parameters', Data))
85
+
86
+
87
+ class CosemAttributeDescriptorWithSelection(ut.CosemAttributeDescriptorWithSelection):
88
+ access_selection: SelectiveAccessDescriptor
89
+ ELEMENTS = (ut.SequenceElement('cosem_attribute_descriptor', ut.CosemAttributeDescriptor),
90
+ ut.SequenceElement('access_selection', SelectiveAccessDescriptor))
91
+
92
+
39
93
  class ProfileGeneric(ver0.ProfileGeneric):
40
94
  """4.3.6 Profile generic"""
41
95
  VERSION = VERSION_1
@@ -132,45 +186,6 @@ class ProfileGeneric(ver0.ProfileGeneric):
132
186
  """ Available after got sort object. TODO: need rewrite. maybe replace to collection level. Wrong used sort_obj, it can be any element from capture_objects"""
133
187
  if self.sort_object is None:
134
188
  raise exc.EmptyObj(F"<sort object> is empty")
135
- sort_obj: ic.COSEMInterfaceClasses = self.collection.get_object(self.sort_object.logical_name)
136
- if sort_obj.CLASS_ID.contents == self.sort_object.class_id.contents:
137
- value_type: Type[cdt.CommonDataType] = sort_obj.get_attr_data_type(int(self.sort_object.attribute_index))
138
- else:
139
- exc.NoObject(F"got {self.sort_object.class_id=}, expected {sort_obj.CLASS_ID=} from collection")
140
-
141
- class RangeDescriptor(cdt.Structure):
142
- # cb_preset = TODO: make check 'selected_values' from self.capture_objects or
143
- # cb_post_set = TODO: make check 'selected_values' from self.capture_objects
144
- DEFAULT = b'\x02\x04\x02\x04\x12\x00\x01\x09\x06\x00\x00\x01\x00\x00\xff\x0f\x02\x12\x00\x00\x09\x0c\x07\xe4\x01\x01\xff\xff\xff\xff\xff\x80\x00\xff' \
145
- b'\x09\x0c\x07\xe4\x01\x02\xff\xff\xff\xff\xff\x80\x00\xff\x01\x00'
146
- restricting_object: structs.CaptureObjectDefinition
147
- from_value: value_type
148
- to_value: value_type
149
- selected_values: CaptureObjects
150
-
151
- class Data(ut.Data):
152
- restricting_object: structs.CaptureObjectDefinition
153
- from_value: cdt.SimpleDataType
154
- to_value: cdt.SimpleDataType
155
- selected_values: CaptureObjects
156
- from_entry: FromEntry
157
- to_entry: cdt.DoubleLongUnsigned
158
- from_selected_value: cdt.LongUnsigned
159
- to_selected_value: cdt.LongUnsigned
160
- ELEMENTS = {1: ut.SequenceElement('range_descriptor', RangeDescriptor),
161
- 2: ut.SequenceElement('entry_descriptor', EntryDescriptor)}
162
-
163
- class SelectiveAccessDescriptor(ut.SelectiveAccessDescriptor):
164
- access_selector: AccessSelector
165
- access_parameters: Data
166
- ELEMENTS = (ut.SequenceElement('access_selector', AccessSelector),
167
- ut.SequenceElement('access_parameters', Data))
168
-
169
- class CosemAttributeDescriptorWithSelection(ut.CosemAttributeDescriptorWithSelection):
170
- access_selection: SelectiveAccessDescriptor
171
- ELEMENTS = (ut.SequenceElement('cosem_attribute_descriptor', ut.CosemAttributeDescriptor),
172
- ut.SequenceElement('access_selection', SelectiveAccessDescriptor))
173
-
174
189
  self.attr_descriptor_with_selection = CosemAttributeDescriptorWithSelection
175
190
  self.buffer.selective_access = SelectiveAccessDescriptor()
176
191
 
@@ -52,8 +52,6 @@ class SpecialDaysTable(ic.COSEMInterfaceClasses):
52
52
  ic.ICMElement("delete", cdt.LongUnsigned)) # Todo: was Delete.with_cb(None, self.entries.get_indexes)
53
53
 
54
54
  def characteristics_init(self):
55
- self.cardinality = (0, 1)
56
-
57
55
  self._cbs_attr_post_init.update({2: self.__set_delete})
58
56
  self.set_attr(2, None)
59
57
 
@@ -1,15 +1,31 @@
1
1
  from abc import ABC, abstractmethod
2
+ from typing import Protocol
2
3
  from itertools import count
3
4
  from ..config_parser import config
5
+ from ..settings import settings
6
+ from ..types import cdt
4
7
 
5
8
 
6
- _mid_names = config["DLMS"]["media_id_name"]
9
+ _mid_names = config["DLMS"]["media_id_name"] # todo: make with settings
7
10
 
8
11
 
9
- class MediaId(ABC):
12
+ class MediaIdProto(Protocol):
13
+ _value: tuple[int]
14
+ _inst = None
15
+ TYPE: type[cdt.CommonDataType]
16
+
17
+ def __eq__(self, other: int) -> bool:
18
+ """with integer"""
19
+
20
+ def __hash__(self) -> int:
21
+ """for hashable"""
22
+
23
+
24
+ class MediaId(MediaIdProto):
10
25
  """DLMS UA 1000-1 Ed 14. Table 53 – OBIS code structure and use of value groups. For Group A"""
11
26
  _value: tuple[int]
12
27
  _inst = None
28
+ TYPE: type[cdt.CommonDataType]
13
29
 
14
30
  @classmethod
15
31
  def from_int(cls, value: int):
@@ -24,15 +40,7 @@ class MediaId(ABC):
24
40
  case int(): return Reserved(value)
25
41
  case _: raise ValueError(F"can't create {cls.__name__} from {value=}")
26
42
 
27
- @abstractmethod
28
- def __eq__(self, other: int):
29
- """with integer"""
30
-
31
- @abstractmethod
32
- def __hash__(self):
33
- """for hashable"""
34
-
35
- def __str__(self):
43
+ def __str__(self) -> str:
36
44
  if _mid_names and (t := _mid_names.get(self.__class__.__name__)):
37
45
  return t
38
46
  else:
@@ -66,16 +74,6 @@ class TwoValueMixin:
66
74
  return self._value[0]
67
75
 
68
76
 
69
- class Singleton:
70
- _inst: MediaId | None
71
-
72
- def __new__(cls, *args, **kwargs):
73
- if cls._inst:
74
- return cls._inst
75
- else:
76
- return super().__new__(cls)
77
-
78
-
79
77
  sub_group_hash = count()
80
78
 
81
79
 
@@ -289,6 +287,7 @@ class CompactDataObjects(Abstract):
289
287
 
290
288
  class DeviceIdObjects(Abstract):
291
289
  """6_2_42"""
290
+ TYPE = cdt.DoubleLongUnsigned | cdt.OctetString | cdt.VisibleString | cdt.Utf8String | cdt.Unsigned | cdt.LongUnsigned
292
291
 
293
292
 
294
293
  class MeteringPointIdObjects(Abstract):
DLMS_SPODES/pardata.py CHANGED
@@ -1,5 +1,5 @@
1
1
  from dataclasses import dataclass
2
- from .cosem_interface_classes import Parameter
2
+ from .cosem_interface_classes.parameter import Parameter
3
3
  from typing import Optional, Iterator
4
4
  from .types import cdt
5
5
 
@@ -9,14 +9,6 @@ class ParValues[T]:
9
9
  par: Parameter
10
10
  data: T
11
11
 
12
- def __getitem__(self, item):
13
- if item == 0:
14
- return self.par
15
- elif item == 1:
16
- return self.data
17
- else:
18
- raise StopIteration
19
-
20
12
  def __iter__(self) -> Iterator[Parameter | T]:
21
13
  yield self.par
22
14
  yield self.data
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: DLMS_SPODES
3
- Version: 0.87.3
3
+ Version: 0.87.6
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
@@ -6,7 +6,7 @@ DLMS_SPODES/enums.py,sha256=13BE0owOyJBNlOI4NY1d-kpqVoHF7JPR9brkPKHLERE,17789
6
6
  DLMS_SPODES/exceptions.py,sha256=UBZRQlQIRi1CzRxWTeqX5PVNuFS770f77BAizQ99IDU,3006
7
7
  DLMS_SPODES/firmwares.py,sha256=lFRnxtq4joYhpZPxHD8Pv30-GvgcEfZCDZUYo_pIeQU,3850
8
8
  DLMS_SPODES/literals.py,sha256=5u6hreLSXgmN7Z_5pXchyBKsuPYJ5deqxKHqewQEFoI,1632
9
- DLMS_SPODES/pardata.py,sha256=yktr4g59FITC_L1kRbQuwp0PMQvGdMwXqWxpXcCDpQU,700
9
+ DLMS_SPODES/pardata.py,sha256=_VluNrP4R7PLVXa9xmqD7fiqEXQqyVXp48NieTct5jY,519
10
10
  DLMS_SPODES/pdu_enums.py,sha256=5xiV-tZTPXOcHT8XQcHWrwAMKTOmCH09Sk4iL1N7I3c,2276
11
11
  DLMS_SPODES/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  DLMS_SPODES/relation_to_OBIS.py,sha256=KcSMIQ_5amjeT0Lya3HbYoaDdz_BjZC2JLVhl2nffwo,32761
@@ -24,9 +24,9 @@ DLMS_SPODES/cosem_interface_classes/a_parameter.py,sha256=5C1DqtDDPX0U2zj_sakEiD
24
24
  DLMS_SPODES/cosem_interface_classes/activity_calendar.py,sha256=VWSiKn2LNBA1VLAAyW6Xx5rxCMwJDrqQqkRzxupMSmM,10584
25
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=9OJwRGrbFPws_VZPayHv-hzFJegIcjgoJoenIqofd5w,4525
28
- DLMS_SPODES/cosem_interface_classes/collection.py,sha256=3ivTtIv2dCanGsXqBbvcuoNqRm211S523DeZvN9dwuU,96317
29
- DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py,sha256=SIME0IC1XyX9RSsfxt0cbghN7rCyWzjqCbesQEpTCM8,23347
27
+ DLMS_SPODES/cosem_interface_classes/clock.py,sha256=vgRt9NcPAAlRZfDrlR11Q8o-wHz6uA0PnBUP2318WsY,4503
28
+ DLMS_SPODES/cosem_interface_classes/collection.py,sha256=4zafwek9zuWPLlpOZqZ0-uC7z2X-IhsVC5kCUaxhEmY,98545
29
+ DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py,sha256=tPHsO-AlCflQzWO3gARSHoBkn6-SW_Y_O2TTCzB1sK8,23184
30
30
  DLMS_SPODES/cosem_interface_classes/data.py,sha256=YSjA3Y0M5NMcfYzWPEuZw6ojIqr2UghgW_ck8dXySMU,809
31
31
  DLMS_SPODES/cosem_interface_classes/disconnect_control.py,sha256=CIx7I4QRpPxAC5iYxpbhCIuv6U2P3s6ELam8eD-kD5w,2926
32
32
  DLMS_SPODES/cosem_interface_classes/extended_register.py,sha256=xULCS11YVWjFMoaRUrm4whvH39Gx0Cu6breUos_oLCs,1153
@@ -38,14 +38,14 @@ DLMS_SPODES/cosem_interface_classes/ln_pattern.py,sha256=IPluhyGWJQLBEUjOjdfEMct
38
38
  DLMS_SPODES/cosem_interface_classes/obis.py,sha256=yEwYm5CshJx8X8uSy3QH8XIbdVPg8Tt6zPUjFgkAB0M,575
39
39
  DLMS_SPODES/cosem_interface_classes/overview.py,sha256=0eko1CW0eH397J5kM20G7RSQUzCGV6lGCMPbLsKPEqQ,7146
40
40
  DLMS_SPODES/cosem_interface_classes/parameter.py,sha256=esTD-1VzvX0rnazsHSVIR8mLuVxpdqwdjzppxj5Zz7s,18961
41
- DLMS_SPODES/cosem_interface_classes/parameters.py,sha256=VZDBm9H25VIGxUGGJ-OcVu0pAO8VJhFF2XdZTQMnmoM,4354
41
+ DLMS_SPODES/cosem_interface_classes/parameters.py,sha256=aYkpdsomVxOFCkNduYlWxxqyH8Y7Ncvn3qGYWOouSNE,4390
42
42
  DLMS_SPODES/cosem_interface_classes/register.py,sha256=Cfikftpo1Nzg_B2drOmJDwoGkbS2wXlqQpxVgXL1w2U,1886
43
43
  DLMS_SPODES/cosem_interface_classes/register_monitor.py,sha256=fNM-JrjHxQB8b5DgUOtDcnkO_hxu5bFICiuKEoZa37g,1792
44
44
  DLMS_SPODES/cosem_interface_classes/reports.py,sha256=zsWmKGqdP6uiZrH8hR5aqHJPMsyHwyrSCRf6khhFoSg,3365
45
45
  DLMS_SPODES/cosem_interface_classes/schedule.py,sha256=IT9sVrkOCdWV4uuTt8Kbu5bL6jchiVTgUqA15x1fq5s,8041
46
46
  DLMS_SPODES/cosem_interface_classes/script_table.py,sha256=aPDXwjCkrvT-yGkCOOZXWjiOZViRy6N-Tb_Gl1aTIik,3455
47
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
48
+ DLMS_SPODES/cosem_interface_classes/special_days_table.py,sha256=M9yHEviXs1_B6tI9JRU-qu9T3bXdD8Ub8MyPBsytMqI,3319
49
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
@@ -72,8 +72,8 @@ DLMS_SPODES/cosem_interface_classes/image_transfer/image_transfer_status.py,sha2
72
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
- DLMS_SPODES/cosem_interface_classes/implementations/data.py,sha256=zyhnnJ-9erdj2rZ28ZjtP7rHH704yuUkqdvJAafvaQs,18598
76
- DLMS_SPODES/cosem_interface_classes/implementations/profile_generic.py,sha256=oibO3EV9fRHxxaBdMQqz436GrMMqo1BlT6lgVtzUKU0,4318
75
+ DLMS_SPODES/cosem_interface_classes/implementations/data.py,sha256=PCa_exj-y0WFt5gVTZQvIpI1wNTqTFc6ZoUSmLKz1Ys,19001
76
+ DLMS_SPODES/cosem_interface_classes/implementations/profile_generic.py,sha256=YHRV96fmvgx5FEfg9M88xuwgokqUcc3Fqmylbpa7b-0,4263
77
77
  DLMS_SPODES/cosem_interface_classes/modem_configuration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
78
  DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py,sha256=nFU3Y0fFhsOKfSl21TmA1CaWJo-N9Iqm7XlcGuSSjoQ,3071
79
79
  DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py,sha256=Ze_W-UNKmng8uWLuEDfD78bIVO0u0IlM0sBnpzeOZ1c,1776
@@ -81,7 +81,7 @@ DLMS_SPODES/cosem_interface_classes/ntp_setup/__init__.py,sha256=47DEQpj8HBSa-_T
81
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
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
84
+ DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py,sha256=-B8CWiWXif2bhjhepMz5iVwJFrwoT2kRBKJct1CzXws,10293
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
@@ -96,8 +96,7 @@ DLMS_SPODES/hdlc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
96
96
  DLMS_SPODES/hdlc/frame.py,sha256=ar5DvkPK5tUGSZcQYCpeku1Ansx7QecugvmcV-xekqI,34784
97
97
  DLMS_SPODES/hdlc/sub_layer.py,sha256=zTxe5ddTt8tliFSY145HhluLwIh57gvOG19Mc8-vnEM,2147
98
98
  DLMS_SPODES/obis/__init__.py,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
99
- DLMS_SPODES/obis/abstract_objects.py,sha256=0ZoJKRQ_7FoChC2rNSgNV573hso8JYZQKdLF3Wgaoqw,443
100
- DLMS_SPODES/obis/media_id.py,sha256=GRiwHPe9-3iCg4u_J6qf2rMc3Wjw0aJHKiSnBtNYD3o,22339
99
+ DLMS_SPODES/obis/media_id.py,sha256=D_Vm7aT6XevrIN22NQgMHReVju_VGH9mYphfh1Nn09c,22516
101
100
  DLMS_SPODES/types/__init__.py,sha256=UFiP4suA72o_kvaqUnHLGK-cedDXLl8kVHYsjXHYUDw,116
102
101
  DLMS_SPODES/types/choices.py,sha256=z7IasrlRaagOYNfRvgbpojDxf1jgYUc9cz59PH2PMi0,6350
103
102
  DLMS_SPODES/types/common_data_types.py,sha256=jUQem7YkKNL93d-F7MArMiAFu-pxfaeMY4aDPKrOkKc,96953
@@ -112,7 +111,7 @@ DLMS_SPODES/types/implementations/integers.py,sha256=Asy4X260t1Fzw_V5iw0uiDOxtfB
112
111
  DLMS_SPODES/types/implementations/long_unsigneds.py,sha256=SxmFvD2moQ03p-KZSBYK1Rv7bQSaywlHVXBfkTZG1OQ,8761
113
112
  DLMS_SPODES/types/implementations/octet_string.py,sha256=Jo_sfWcsfstiP4O6mXfBOOQlksx1c2qJMI-vbAOV-yM,294
114
113
  DLMS_SPODES/types/implementations/structs.py,sha256=GMOo6Jy8jA9d6KTLs0D-j5t0oSRvxUIwtBr_4UePwbA,2059
115
- dlms_spodes-0.87.3.dist-info/METADATA,sha256=ANlxJv9tqVDNQ2qtmssUfyu_kFHEl4V8FglWBADITRQ,1027
116
- dlms_spodes-0.87.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
117
- dlms_spodes-0.87.3.dist-info/top_level.txt,sha256=k26SRuRdwBZrSM3NgNZECAUNIDZREbJuLCnPbWtTNak,12
118
- dlms_spodes-0.87.3.dist-info/RECORD,,
114
+ dlms_spodes-0.87.6.dist-info/METADATA,sha256=wehMrVJEQXZiW2GNtUpjl6ehFbTXDoL8rLvGiAAaEWY,1027
115
+ dlms_spodes-0.87.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
116
+ dlms_spodes-0.87.6.dist-info/top_level.txt,sha256=k26SRuRdwBZrSM3NgNZECAUNIDZREbJuLCnPbWtTNak,12
117
+ dlms_spodes-0.87.6.dist-info/RECORD,,
@@ -1,17 +0,0 @@
1
- """DLMS UA 1000-1 Ed. 14. 7.4 Abstract objects (Value group A = 0)"""
2
- from struct import pack_into
3
- from ..types import cst
4
-
5
-
6
- _buf = bytearray(6)
7
-
8
-
9
- def BILLING_PERIOD_COUNTER(b: int = 0, f: int = 255):
10
- return cst.LogicalName(bytes((0, b, 0, 1, 0, f)))
11
-
12
-
13
- def SPODES3_DISPLAY_MODE():
14
- return cst.LogicalName(pack_into(">6B", _buf, 0, 0, 96, 4, 1, 255))
15
-
16
-
17
- LDN = cst.LogicalName(pack_into(">6B", _buf, 0, 0, 42, 0, 0, 255))