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.
- DLMS_SPODES/cosem_interface_classes/__class_init__.py +1 -1
- DLMS_SPODES/cosem_interface_classes/activity_calendar.py +2 -1
- DLMS_SPODES/cosem_interface_classes/arbitrator.py +2 -1
- DLMS_SPODES/cosem_interface_classes/association_ln/ver0.py +7 -1
- DLMS_SPODES/cosem_interface_classes/association_ln/ver1.py +2 -1
- DLMS_SPODES/cosem_interface_classes/association_ln/ver2.py +2 -1
- DLMS_SPODES/cosem_interface_classes/clock.py +2 -1
- DLMS_SPODES/cosem_interface_classes/collection.py +14 -17
- DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py +18 -7
- DLMS_SPODES/cosem_interface_classes/data.py +4 -2
- DLMS_SPODES/cosem_interface_classes/demand_register/ver0.py +2 -1
- DLMS_SPODES/cosem_interface_classes/disconnect_control.py +2 -1
- DLMS_SPODES/cosem_interface_classes/extended_register.py +2 -1
- DLMS_SPODES/cosem_interface_classes/gprs_modem_setup.py +2 -1
- DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver0.py +2 -1
- DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver1.py +2 -1
- DLMS_SPODES/cosem_interface_classes/iec_local_port_setup.py +3 -2
- DLMS_SPODES/cosem_interface_classes/image_transfer/ver0.py +2 -1
- DLMS_SPODES/cosem_interface_classes/ipv4_setup.py +2 -1
- DLMS_SPODES/cosem_interface_classes/limiter.py +4 -1
- DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py +2 -1
- DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py +3 -2
- DLMS_SPODES/cosem_interface_classes/ntp_setup/ver0.py +2 -1
- DLMS_SPODES/cosem_interface_classes/overview.py +7 -6
- DLMS_SPODES/cosem_interface_classes/profile_generic/ver0.py +2 -1
- DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py +2 -1
- DLMS_SPODES/cosem_interface_classes/push_setup/ver2.py +2 -1
- DLMS_SPODES/cosem_interface_classes/register.py +2 -1
- DLMS_SPODES/cosem_interface_classes/register_activation/ver0.py +2 -2
- DLMS_SPODES/cosem_interface_classes/register_monitor.py +2 -1
- DLMS_SPODES/cosem_interface_classes/schedule.py +2 -1
- DLMS_SPODES/cosem_interface_classes/script_table.py +2 -1
- DLMS_SPODES/cosem_interface_classes/security_setup/ver0.py +2 -1
- DLMS_SPODES/cosem_interface_classes/security_setup/ver1.py +5 -3
- DLMS_SPODES/cosem_interface_classes/single_action_schedule.py +2 -1
- DLMS_SPODES/cosem_interface_classes/special_days_table.py +2 -1
- DLMS_SPODES/cosem_interface_classes/tcp_udp_setup.py +2 -1
- {dlms_spodes-0.86.15.dist-info → dlms_spodes-0.86.17.dist-info}/METADATA +2 -2
- {dlms_spodes-0.86.15.dist-info → dlms_spodes-0.86.17.dist-info}/RECORD +41 -41
- {dlms_spodes-0.86.15.dist-info → dlms_spodes-0.86.17.dist-info}/WHEEL +0 -0
- {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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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,
|
|
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[
|
|
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.
|
|
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(
|
|
1126
|
-
for
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
res.
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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:
|
|
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:
|
|
330
|
-
VERSION:
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
23
|
-
VERSION =
|
|
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 =
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
103
|
+
VERSION = VERSION_1
|
|
103
104
|
A_ELEMENTS = (ic.ICAElement("security_policy", SecurityPolicyVer1),
|
|
104
105
|
ic.ICAElement("security_suite", SecuritySuite),
|
|
105
|
-
ver0.SecuritySetup.
|
|
106
|
-
ver0.SecuritySetup.
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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.
|
|
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.
|
|
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=
|
|
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=
|
|
25
|
-
DLMS_SPODES/cosem_interface_classes/arbitrator.py,sha256=
|
|
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=
|
|
28
|
-
DLMS_SPODES/cosem_interface_classes/collection.py,sha256=
|
|
29
|
-
DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py,sha256=
|
|
30
|
-
DLMS_SPODES/cosem_interface_classes/data.py,sha256=
|
|
31
|
-
DLMS_SPODES/cosem_interface_classes/disconnect_control.py,sha256=
|
|
32
|
-
DLMS_SPODES/cosem_interface_classes/extended_register.py,sha256=
|
|
33
|
-
DLMS_SPODES/cosem_interface_classes/gprs_modem_setup.py,sha256=
|
|
34
|
-
DLMS_SPODES/cosem_interface_classes/iec_local_port_setup.py,sha256=
|
|
35
|
-
DLMS_SPODES/cosem_interface_classes/ipv4_setup.py,sha256=
|
|
36
|
-
DLMS_SPODES/cosem_interface_classes/limiter.py,sha256=
|
|
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=
|
|
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=
|
|
43
|
-
DLMS_SPODES/cosem_interface_classes/register_monitor.py,sha256=
|
|
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=
|
|
46
|
-
DLMS_SPODES/cosem_interface_classes/script_table.py,sha256=
|
|
47
|
-
DLMS_SPODES/cosem_interface_classes/single_action_schedule.py,sha256=
|
|
48
|
-
DLMS_SPODES/cosem_interface_classes/special_days_table.py,sha256=
|
|
49
|
-
DLMS_SPODES/cosem_interface_classes/tcp_udp_setup.py,sha256=
|
|
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=
|
|
56
|
-
DLMS_SPODES/cosem_interface_classes/association_ln/ver1.py,sha256=
|
|
57
|
-
DLMS_SPODES/cosem_interface_classes/association_ln/ver2.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
79
|
-
DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py,sha256=
|
|
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=
|
|
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=
|
|
84
|
-
DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
93
|
-
DLMS_SPODES/cosem_interface_classes/security_setup/ver1.py,sha256=
|
|
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.
|
|
116
|
-
dlms_spodes-0.86.
|
|
117
|
-
dlms_spodes-0.86.
|
|
118
|
-
dlms_spodes-0.86.
|
|
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,,
|
|
File without changes
|
|
File without changes
|