DLMS-SPODES 0.87.2__py3-none-any.whl → 0.87.5__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.
@@ -330,6 +330,7 @@ class COSEMInterfaceClasses(Protocol):
330
330
  __specific_methods: tuple[cdt.CommonDataType, ...] = None
331
331
  _cbs_attr_post_init: dict[int, Callable]
332
332
  collection: Any | None # Collection. todo: remove in future
333
+ hash_: int
333
334
 
334
335
  def __init__(self, logical_name: cst.LogicalName | bytes | str):
335
336
  self.collection = None
@@ -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),
@@ -14,11 +14,11 @@ class Data(Parameter):
14
14
  class ActiveFirmwareIdentifier(Data):
15
15
 
16
16
  @classmethod
17
- def from_b(cls, b: int) -> "ActiveFirmwareIdentifier":
17
+ def from_b(cls, b: int = 0) -> "ActiveFirmwareIdentifier":
18
18
  return cls.parse(f"0.{b}.0.2.0.255")
19
19
 
20
20
 
21
- ACTIVE_FIRMWARE_IDENTIFIER_0 = ActiveFirmwareIdentifier.from_b(0)
21
+ ACTIVE_FIRMWARE_IDENTIFIER_0 = ActiveFirmwareIdentifier.from_b()
22
22
 
23
23
 
24
24
  @dataclass(frozen=True)
@@ -28,6 +28,77 @@ class Register(Data):
28
28
  return self.get_attr(3)
29
29
 
30
30
 
31
+ @dataclass(frozen=True)
32
+ class Clock(Parameter):
33
+ @classmethod
34
+ def from_be(cls, b: int = 0, e: int = 0) -> "Clock":
35
+ return cls.parse(f"0.{b}.1.0.{e}.255")
36
+
37
+ @property
38
+ def time(self) -> "Clock":
39
+ return self.get_attr(2)
40
+
41
+ @property
42
+ def time_zone(self) -> "Clock":
43
+ return self.get_attr(3)
44
+
45
+ @property
46
+ def status(self) -> "Clock":
47
+ return self.get_attr(4)
48
+
49
+ @property
50
+ def time_zone(self) -> "Clock":
51
+ return self.get_attr(3)
52
+
53
+ @property
54
+ def status(self) -> "Clock":
55
+ return self.get_attr(4)
56
+
57
+ @property
58
+ def daylight_savings_begin(self) -> "Clock":
59
+ return self.get_attr(5)
60
+
61
+ @property
62
+ def daylight_savings_end(self) -> "Clock":
63
+ return self.get_attr(6)
64
+
65
+ @property
66
+ def daylight_savings_deviation(self) -> "Clock":
67
+ return self.get_attr(7)
68
+
69
+ @property
70
+ def daylight_savings_enabled(self) -> "Clock":
71
+ return self.get_attr(8)
72
+
73
+ @property
74
+ def clock_base(self) -> "Clock":
75
+ return self.get_attr(9)
76
+
77
+ @property
78
+ def adjust_to_quarter(self) -> "Clock":
79
+ return self.get_meth(1)
80
+
81
+ @property
82
+ def adjust_to_measuring_period(self) -> "Clock":
83
+ return self.get_meth(2)
84
+
85
+ @property
86
+ def adjust_to_minute(self) -> "Clock":
87
+ return self.get_meth(3)
88
+
89
+ @property
90
+ def adjust_to_preset_time(self) -> "Clock":
91
+ return self.get_meth(4)
92
+
93
+ @property
94
+ def preset_adjusting_time(self) -> "Clock":
95
+ return self.get_meth(5)
96
+
97
+ @property
98
+ def shift_time(self) -> "Clock":
99
+ return self.get_meth(6)
100
+
101
+
31
102
  @dataclass(frozen=True)
32
103
  class DisconnectControl(Parameter):
33
104
 
@@ -1,72 +1,70 @@
1
- from typing import Any
2
- from .collection import ic, cdt
1
+ from typing import Any, Iterable
2
+ from StructResult import result
3
+ from . import cosem_interface_class as ic
4
+ from ..types import cdt
5
+ from .parameter import Parameter
3
6
  from ..cosem_interface_classes import collection
4
7
  from ..config_parser import get_values
8
+ from ..settings import settings
5
9
 
6
10
 
7
- def get_obj_report(
11
+ def from_obj(
12
+ col: collection.Collection,
8
13
  obj: ic.COSEMInterfaceClasses,
9
- attr_index_par: tuple[int | Any, ...]) -> str:
10
- struct_report: dict | None = get_values("DLMS", "report", "struct")
11
- ret = str()
12
- ret += F"[{collection.get_name(obj.logical_name)}]\n"
14
+ attr_index_par: tuple[int, ...]
15
+ ) -> result.SimpleOrError[str]:
16
+ if not hasattr(from_obj, "struct_pattern"):
17
+ from_obj.struct_pattern = dict(settings.report.struct)
18
+ ret: str = F"[{collection.get_name(obj.logical_name)}]\n"
13
19
  for i in attr_index_par:
14
- if isinstance(i, int):
15
- pass
16
- else:
17
- i, par = i[0], i[1:]
18
- value = obj.get_attr(i)
19
- if isinstance(value, cdt.SimpleDataType):
20
- match obj, i:
21
- case collection.impl.data.DLMSDeviceIDObject(), 2: value = value.to_str()
22
- case _: pass
23
- if isinstance(value, cdt.OctetString):
24
- pass
25
- if hasattr(value, "report"):
26
- value = value.report
27
- ret += F" {obj.get_attr_element(i)}: {value}\n"
28
- elif isinstance(value, cdt.ComplexDataType):
20
+ par = Parameter(obj.logical_name.contents).set_i(i)
21
+ if isinstance(res_data := col.par2data(par), result.Error):
22
+ return res_data
23
+ a_data = res_data.value
24
+ if isinstance(a_data, cdt.SimpleDataType):
25
+ rep = col.par2rep(par, a_data)
26
+ ret += F" {obj.get_attr_element(i)}: {rep.msg}{f" {rep.unit}" if rep.unit else ""}\n"
27
+ elif isinstance(a_data, cdt.ComplexDataType):
29
28
  ret += F" [{obj.get_attr_element(i)}]\n"
30
- stack: list = [("", iter(value))]
29
+ stack: list[tuple[Any, Any]] = [("", iter(a_data))]
31
30
  while stack:
32
31
  name, value_it = stack[-1]
33
- indent = F"{' '*(len(stack) + 1)}"
34
- value = next(value_it, None)
35
- if value:
32
+ indent = F"{' ' * (len(stack) + 1)}"
33
+ data = next(value_it, None)
34
+ if data:
36
35
  if not isinstance(name, str):
37
- name = next(name).NAME
38
- if isinstance(value, cdt.Array):
36
+ name = str(next(name))
37
+ if isinstance(data, cdt.Array):
39
38
  ret += F"{indent}[{name}]\n"
40
- stack.append(("*", iter(value)))
41
- elif isinstance(value, cdt.Structure):
42
- if struct_report and (pattern := struct_report.get(value.__class__.__name__)):
39
+ stack.append(("*", iter(data)))
40
+ elif isinstance(data, cdt.Structure):
41
+ if (pattern := from_obj.struct_pattern.get(data.__class__.__name__)):
43
42
  val = list(pattern)
44
43
  val.reverse()
45
- result = str()
44
+ result_ = str()
46
45
  while val:
47
- i = val.pop()
48
- match i:
46
+ match val.pop():
49
47
  case "%":
50
- par = val.pop()
48
+ par_ = val.pop()
51
49
  index = int(val.pop() + val.pop())
52
- match par:
50
+ match par_:
53
51
  case "n":
54
- result += value.ELEMENTS[index].NAME
52
+ result_ += str(data.ELEMENTS[index])
55
53
  case "v":
56
- result += str(value[index])
54
+ result_ += str(data[index])
57
55
  case err:
58
56
  raise ValueError(F"unknown macros &{err}{index}")
59
57
  case symbol:
60
- result += symbol
61
- ret += F"{indent}{result}\n"
58
+ result_ += symbol
59
+ ret += F"{indent}{result_}\n"
62
60
  else:
63
- if name == "":
61
+ if name=="":
64
62
  ret += "\n"
65
63
  else:
66
64
  ret += F"{indent}[{name}]\n"
67
- stack.append((iter(value.ELEMENTS), iter(value)))
65
+ stack.append((iter(data.ELEMENTS), iter(data)))
68
66
  else:
69
- ret += F"{indent}{name}: {value}\n"
67
+ ret += F"{indent}{name}: {data}\n"
70
68
  else:
71
69
  stack.pop()
72
- return ret
70
+ return result.Simple(ret)
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.2
3
+ Version: 0.87.5
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
@@ -25,8 +25,8 @@ DLMS_SPODES/cosem_interface_classes/activity_calendar.py,sha256=VWSiKn2LNBA1VLAA
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
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
28
+ DLMS_SPODES/cosem_interface_classes/collection.py,sha256=4zafwek9zuWPLlpOZqZ0-uC7z2X-IhsVC5kCUaxhEmY,98545
29
+ DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py,sha256=pY3UoW7XVV2TJ5cjphKsQZnngA8Q9S6TsjjZnMDLKb4,23363
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,10 +38,10 @@ 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=mrLO0eIi_0Q5Wyug_3pAX2ucZUNyxTuV_5QPbuETbFI,2678
41
+ DLMS_SPODES/cosem_interface_classes/parameters.py,sha256=VZDBm9H25VIGxUGGJ-OcVu0pAO8VJhFF2XdZTQMnmoM,4354
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
- DLMS_SPODES/cosem_interface_classes/reports.py,sha256=9kOt9Ztyp5D59j3k3x5URy7WD1qlFNMa8xFlMu7nUmA,3320
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
@@ -72,7 +72,7 @@ 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
75
+ DLMS_SPODES/cosem_interface_classes/implementations/data.py,sha256=PCa_exj-y0WFt5gVTZQvIpI1wNTqTFc6ZoUSmLKz1Ys,19001
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
78
  DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py,sha256=nFU3Y0fFhsOKfSl21TmA1CaWJo-N9Iqm7XlcGuSSjoQ,3071
@@ -96,7 +96,6 @@ 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
99
  DLMS_SPODES/obis/media_id.py,sha256=GRiwHPe9-3iCg4u_J6qf2rMc3Wjw0aJHKiSnBtNYD3o,22339
101
100
  DLMS_SPODES/types/__init__.py,sha256=UFiP4suA72o_kvaqUnHLGK-cedDXLl8kVHYsjXHYUDw,116
102
101
  DLMS_SPODES/types/choices.py,sha256=z7IasrlRaagOYNfRvgbpojDxf1jgYUc9cz59PH2PMi0,6350
@@ -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.2.dist-info/METADATA,sha256=u0_IQbaywetOsTcXCN1Yckn9qduLGkK__ANW4LAH1Uk,1027
116
- dlms_spodes-0.87.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
117
- dlms_spodes-0.87.2.dist-info/top_level.txt,sha256=k26SRuRdwBZrSM3NgNZECAUNIDZREbJuLCnPbWtTNak,12
118
- dlms_spodes-0.87.2.dist-info/RECORD,,
114
+ dlms_spodes-0.87.5.dist-info/METADATA,sha256=dqBhrE-dP748FIQpNtLEBN5seqiaVed7N6t-x44BfVU,1027
115
+ dlms_spodes-0.87.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
116
+ dlms_spodes-0.87.5.dist-info/top_level.txt,sha256=k26SRuRdwBZrSM3NgNZECAUNIDZREbJuLCnPbWtTNak,12
117
+ dlms_spodes-0.87.5.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))