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.
- DLMS_SPODES/cosem_interface_classes/clock.py +1 -1
- DLMS_SPODES/cosem_interface_classes/collection.py +389 -367
- DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py +12 -12
- DLMS_SPODES/cosem_interface_classes/implementations/data.py +9 -0
- DLMS_SPODES/cosem_interface_classes/implementations/profile_generic.py +0 -1
- DLMS_SPODES/cosem_interface_classes/parameters.py +1 -0
- DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py +54 -39
- DLMS_SPODES/cosem_interface_classes/special_days_table.py +0 -2
- DLMS_SPODES/obis/media_id.py +20 -21
- DLMS_SPODES/pardata.py +1 -9
- {dlms_spodes-0.87.3.dist-info → dlms_spodes-0.87.6.dist-info}/METADATA +1 -1
- {dlms_spodes-0.87.3.dist-info → dlms_spodes-0.87.6.dist-info}/RECORD +14 -15
- DLMS_SPODES/obis/abstract_objects.py +0 -17
- {dlms_spodes-0.87.3.dist-info → dlms_spodes-0.87.6.dist-info}/WHEEL +0 -0
- {dlms_spodes-0.87.3.dist-info → dlms_spodes-0.87.6.dist-info}/top_level.txt +0 -0
|
@@ -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()
|
|
@@ -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
|
|
DLMS_SPODES/obis/media_id.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
@@ -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=
|
|
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=
|
|
28
|
-
DLMS_SPODES/cosem_interface_classes/collection.py,sha256=
|
|
29
|
-
DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
76
|
-
DLMS_SPODES/cosem_interface_classes/implementations/profile_generic.py,sha256=
|
|
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
|
|
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/
|
|
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.
|
|
116
|
-
dlms_spodes-0.87.
|
|
117
|
-
dlms_spodes-0.87.
|
|
118
|
-
dlms_spodes-0.87.
|
|
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))
|
|
File without changes
|
|
File without changes
|