DLMS-SPODES 0.86.15__tar.gz → 0.86.17__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/PKG-INFO +2 -2
  2. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/pyproject.toml +2 -2
  3. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/__class_init__.py +1 -1
  4. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/activity_calendar.py +2 -1
  5. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/arbitrator.py +2 -1
  6. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver0.py +7 -1
  7. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver1.py +2 -1
  8. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver2.py +2 -1
  9. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/clock.py +2 -1
  10. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/collection.py +14 -17
  11. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py +18 -7
  12. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/data.py +4 -2
  13. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/demand_register/ver0.py +2 -1
  14. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/disconnect_control.py +2 -1
  15. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/extended_register.py +2 -1
  16. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/gprs_modem_setup.py +2 -1
  17. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver0.py +2 -1
  18. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver1.py +2 -1
  19. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/iec_local_port_setup.py +3 -2
  20. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/ver0.py +2 -1
  21. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/ipv4_setup.py +2 -1
  22. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/limiter.py +4 -1
  23. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py +2 -1
  24. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py +3 -2
  25. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/ver0.py +2 -1
  26. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/overview.py +7 -6
  27. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver0.py +2 -1
  28. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py +2 -1
  29. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver2.py +2 -1
  30. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/register.py +2 -1
  31. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/register_activation/ver0.py +2 -2
  32. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/register_monitor.py +2 -1
  33. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/schedule.py +2 -1
  34. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/script_table.py +2 -1
  35. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver0.py +2 -1
  36. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver1.py +5 -3
  37. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/single_action_schedule.py +2 -1
  38. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/special_days_table.py +2 -1
  39. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/tcp_udp_setup.py +2 -1
  40. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES.egg-info/PKG-INFO +2 -2
  41. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES.egg-info/requires.txt +1 -1
  42. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/collection_init.py +1 -1
  43. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_ActivityCalendar.py +3 -3
  44. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_AssociationLN.py +1 -1
  45. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_IC.py +1 -1
  46. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_KPZ.py +9 -9
  47. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_Limiter.py +3 -3
  48. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_NTPSetup.py +0 -1
  49. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_ProfileGeneric.py +9 -9
  50. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_RegisterActivation.py +1 -1
  51. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_RegisterMonitor.py +2 -2
  52. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_collection.py +19 -12
  53. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_enums.py +2 -2
  54. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/.gitignore +0 -0
  55. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/README.md +0 -0
  56. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/config.toml +0 -0
  57. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/setup.cfg +0 -0
  58. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/Values/EN/__init__.py +0 -0
  59. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/Values/EN/actors.py +0 -0
  60. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/Values/EN/relation_to_obis_names.py +0 -0
  61. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/Values/RU/__init__.py +0 -0
  62. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/Values/RU/actors.py +0 -0
  63. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/Values/RU/relation_to_obis_names.py +0 -0
  64. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/Values/__init__.py +0 -0
  65. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/__init__.py +0 -0
  66. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/configEN.ini +0 -0
  67. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/config_parser.py +0 -0
  68. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/__init__.py +0 -0
  69. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/a_parameter.py +0 -0
  70. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/association_ln/__init__.py +0 -0
  71. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/association_ln/abstract.py +0 -0
  72. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/association_ln/authentication_mechanism_name.py +0 -0
  73. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/association_ln/mechanism_id.py +0 -0
  74. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/association_ln/method.py +0 -0
  75. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver3.py +0 -0
  76. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/association_sn/__init__.py +0 -0
  77. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/association_sn/ver0.py +0 -0
  78. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/attr_indexes.py +0 -0
  79. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/demand_register/__init__.py +0 -0
  80. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/__init__.py +0 -0
  81. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver1.py +0 -0
  82. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver2.py +0 -0
  83. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/__init__.py +0 -0
  84. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver0.py +0 -0
  85. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/__init__.py +0 -0
  86. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/image_transfer_status.py +0 -0
  87. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/implementations/__init__.py +0 -0
  88. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/implementations/arbitrator.py +0 -0
  89. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/implementations/data.py +0 -0
  90. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/implementations/profile_generic.py +0 -0
  91. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/ln_pattern.py +0 -0
  92. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/__init__.py +0 -0
  93. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/__init__.py +0 -0
  94. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/obis.py +0 -0
  95. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/parameter.py +0 -0
  96. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/parameters.py +0 -0
  97. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/__init__.py +0 -0
  98. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/push_setup/__init__.py +0 -0
  99. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver0.py +0 -0
  100. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver1.py +0 -0
  101. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/register_activation/__init__.py +0 -0
  102. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/reports.py +0 -0
  103. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__init__.py +0 -0
  104. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__pycache__/__init__.cpython-311.pyc +0 -0
  105. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/cosem_pdu.py +0 -0
  106. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/enums.py +0 -0
  107. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/exceptions.py +0 -0
  108. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/firmwares.py +0 -0
  109. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/hdlc/__init__.py +0 -0
  110. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/hdlc/frame.py +0 -0
  111. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/hdlc/sub_layer.py +0 -0
  112. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/literals.py +0 -0
  113. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/obis/__init__.py +0 -0
  114. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/obis/abstract_objects.py +0 -0
  115. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/obis/media_id.py +0 -0
  116. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/pardata.py +0 -0
  117. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/pdu_enums.py +0 -0
  118. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/py.typed +0 -0
  119. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/relation_to_OBIS.py +0 -0
  120. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/settings.py +0 -0
  121. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/__init__.py +0 -0
  122. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/choices.py +0 -0
  123. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/common_data_types.py +0 -0
  124. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/cosem_service_types.py +0 -0
  125. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/implementations/__init__.py +0 -0
  126. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/implementations/arrays.py +0 -0
  127. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/implementations/bitstrings.py +0 -0
  128. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/implementations/double_long_usingneds.py +0 -0
  129. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/implementations/enums.py +0 -0
  130. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/implementations/integers.py +0 -0
  131. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/implementations/long_unsigneds.py +0 -0
  132. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/implementations/octet_string.py +0 -0
  133. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/implementations/structs.py +0 -0
  134. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES/types/useful_types.py +0 -0
  135. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES.egg-info/SOURCES.txt +0 -0
  136. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES.egg-info/dependency_links.txt +0 -0
  137. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/DLMS_SPODES.egg-info/top_level.txt +0 -0
  138. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/src/__init__.py +0 -0
  139. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/__init__.py +0 -0
  140. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/config.toml +0 -0
  141. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/config.zip +0 -0
  142. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/init_collection.py +0 -0
  143. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test.typ +0 -0
  144. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test.xml +0 -0
  145. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_COSEMInterfaceClass.py +0 -0
  146. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_Data.py +0 -0
  147. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_DemandRegister.py +0 -0
  148. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_DisconnectControl.py +0 -0
  149. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_DisplayReadoutProfile.py +0 -0
  150. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_GSMDiagnostic.py +0 -0
  151. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_ImageTransfer.py +0 -0
  152. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_LNPatterns.py +0 -0
  153. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_Parameter.py +0 -0
  154. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_Register.py +0 -0
  155. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_ScalerUnitType.py +0 -0
  156. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_Schedule.py +0 -0
  157. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_Structures.py +0 -0
  158. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_a_param.py +0 -0
  159. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_benchmark_create_obj.py +0 -0
  160. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_cdt.py +0 -0
  161. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_config.py +0 -0
  162. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_electric_obj.py +0 -0
  163. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_hdlc.py +0 -0
  164. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_overview.py +0 -0
  165. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_pars.py +0 -0
  166. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_report.py +0 -0
  167. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_save_type.typ +0 -0
  168. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_settings.py +0 -0
  169. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_to_xml.xml +0 -0
  170. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_to_xml2.xml +0 -0
  171. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_to_xml3.xml +0 -0
  172. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_to_xml4.xml +0 -0
  173. {dlms_spodes-0.86.15 → dlms_spodes-0.86.17}/test/test_userfulType.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: DLMS_SPODES
3
- Version: 0.86.15
3
+ Version: 0.86.17
4
4
  Summary: dlms-spodes
5
5
  Author-email: Serj Kotilevski <youserj@outlook.com>
6
6
  Project-URL: Source, https://github.com/youserj/DlmsSPODES-project
@@ -14,7 +14,7 @@ Requires-Dist: pydantic>=2.11
14
14
  Requires-Dist: cryptography>=45.0
15
15
  Requires-Dist: semver>=3.0
16
16
  Requires-Dist: typing-extensions>=4.12.2
17
- Requires-Dist: StructResult>=0.8.2
17
+ Requires-Dist: StructResult>=0.8.3
18
18
  Requires-Dist: numpy>=2.3.2
19
19
  Provides-Extra: dev
20
20
  Requires-Dist: mypy>=1.5.0; extra == "dev"
@@ -14,7 +14,7 @@ exclude = ["test","KPZ"]
14
14
 
15
15
  [project]
16
16
  name = "DLMS_SPODES"
17
- version = "0.86.15"
17
+ version = "0.86.17"
18
18
  authors = [
19
19
  {name="Serj Kotilevski", email="youserj@outlook.com"}
20
20
  ]
@@ -23,7 +23,7 @@ dependencies = [
23
23
  "cryptography>=45.0",
24
24
  "semver>=3.0",
25
25
  "typing-extensions>=4.12.2", # remove for 3.13(use for @deprecated)
26
- "StructResult>=0.8.2",
26
+ "StructResult>=0.8.3",
27
27
  "numpy>=2.3.2"
28
28
  ]
29
29
  description="dlms-spodes"
@@ -1,3 +1,3 @@
1
1
  from ..cosem_interface_classes import cosem_interface_class as ic, attr_indexes as ai
2
- from ..cosem_interface_classes.overview import ClassID, Version
2
+ from ..cosem_interface_classes.overview import ClassID
3
3
  from ..types import common_data_types as cdt, cosem_service_types as cst, useful_types as ut
@@ -1,5 +1,6 @@
1
1
  from typing_extensions import deprecated
2
2
  from typing import Self
3
+ from .overview import VERSION_0
3
4
  from .__class_init__ import *
4
5
  from ..types.implementations import integers, octet_string
5
6
 
@@ -135,7 +136,7 @@ class DayProfileTable(cdt.Array):
135
136
  class ActivityCalendar(ic.COSEMInterfaceClasses):
136
137
  """DLMS UA 1000-1 Ed. 14 4.5.5 Activity calendar"""
137
138
  CLASS_ID = ClassID.ACTIVITY_CALENDAR
138
- VERSION = Version.V0
139
+ VERSION = VERSION_0
139
140
  A_ELEMENTS = (ic.ICAElement("calendar_name_active", octet_string.ID),
140
141
  ic.ICAElement("season_profile_active", SeasonProfile),
141
142
  ic.ICAElement("week_profile_table_active", WeekProfileTable),
@@ -1,5 +1,6 @@
1
1
  from .__class_init__ import *
2
2
  from ..types.implementations import structs, integers
3
+ from .overview import VERSION_0
3
4
 
4
5
 
5
6
  class Actions(cdt.Array):
@@ -46,7 +47,7 @@ class RequestAction(cdt.Structure):
46
47
  class Arbitrator(ic.COSEMInterfaceClasses):
47
48
  """DLMS UA 1000-1 Ed. 14 4.5.12 Arbitrator"""
48
49
  CLASS_ID = ClassID.ARBITRATOR
49
- VERSION = Version.V0
50
+ VERSION = VERSION_0
50
51
  A_ELEMENTS = (ic.ICAElement("actions", Actions),
51
52
  ic.ICAElement("permission_table", PermissionsTable),
52
53
  ic.ICAElement("weightings_table", WeightingsTable),
@@ -1,4 +1,6 @@
1
+ from typing import Iterator
1
2
  from enum import IntFlag, auto
3
+ from ..parameters import Parameter
2
4
  from ... import exceptions as exc
3
5
  from ..__class_init__ import *
4
6
  from ...types import choices
@@ -7,6 +9,7 @@ from ... import pdu_enums as pdu
7
9
  from . import mechanism_id, authentication_mechanism_name
8
10
  from . import method
9
11
  from . import abstract
12
+ from ..overview import VERSION_0
10
13
 
11
14
 
12
15
  class AccessMode(abstract.AccessMode, elements=(0, 1, 2, 3)):
@@ -290,7 +293,7 @@ class CosemAttributeDescriptorWithSelection(ut.CosemAttributeDescriptorWithSelec
290
293
  class AssociationLN(ic.COSEMInterfaceClasses):
291
294
  """5.4.5 Association LN"""
292
295
  CLASS_ID = ClassID.ASSOCIATION_LN
293
- VERSION = Version.V0
296
+ VERSION = VERSION_0
294
297
  A_ELEMENTS = (ic.ICAElement("object_list", ObjectListType, selective_access=SelectiveAccessDescriptor),
295
298
  ic.ICAElement("associated_partners_id", AssociatedPartnersType),
296
299
  ic.ICAElement("application_context_name", ApplicationContextName),
@@ -389,6 +392,9 @@ class AssociationLN(ic.COSEMInterfaceClasses):
389
392
  el: ObjectListElement
390
393
  return [el.logical_name for el in self.object_list]
391
394
 
395
+ def iter_pars(self) -> Iterator[Parameter]:
396
+ return (Parameter(el.logical_name.contents) for el in self.object_list)
397
+
392
398
  def __check_empty_object_list(self):
393
399
  if self.object_list is None:
394
400
  raise exc.ITEApplication(F"empty <{self.get_attr_element(2).NAME}> in {self}")
@@ -5,6 +5,7 @@ from ..__class_init__ import *
5
5
  from ...types.implementations import structs, arrays
6
6
  from . import authentication_mechanism_name
7
7
  from . import abstract
8
+ from ..overview import VERSION_1
8
9
 
9
10
 
10
11
  class AccessMode(abstract.AccessMode, elements=tuple(range(7))):
@@ -105,7 +106,7 @@ class MechanismNameType(cdt.AXDR, authentication_mechanism_name.AuthenticationMe
105
106
 
106
107
  class AssociationLN(ver0.AssociationLN):
107
108
  """5.4.6 Association LN"""
108
- VERSION = Version.V1
109
+ VERSION = VERSION_1
109
110
  A_ELEMENTS = (ic.ICAElement("object_list", ObjectListType, selective_access=ver0.SelectiveAccessDescriptor),
110
111
  ver0.AssociationLN.get_attr_element(3), # associated_partners_id
111
112
  ic.ICAElement("application_context_name", ContextNameType),
@@ -1,11 +1,12 @@
1
1
  from ..__class_init__ import *
2
2
  from . import ver0, ver1
3
3
  from ...types.implementations import structs, arrays
4
+ from ..overview import VERSION_2
4
5
 
5
6
 
6
7
  class AssociationLN(ver1.AssociationLN):
7
8
  """5.4.7 Association LN"""
8
- VERSION = Version.V2
9
+ VERSION = VERSION_2
9
10
  A_ELEMENTS = (
10
11
  ver1.AssociationLN.get_attr_element(2), # <object_list>
11
12
  ver0.AssociationLN.get_attr_element(3), # associated_partners_id
@@ -1,6 +1,7 @@
1
1
  import datetime
2
2
  from .__class_init__ import *
3
3
  from ..types.implementations import integers
4
+ from .overview import VERSION_0
4
5
 
5
6
 
6
7
  class ClockStatus(cdt.Unsigned):
@@ -54,7 +55,7 @@ class TimeZone(cdt.Long):
54
55
  class Clock(ic.COSEMInterfaceClasses):
55
56
  """4.5.1 Clock"""
56
57
  CLASS_ID = ClassID.CLOCK
57
- VERSION = Version.V0
58
+ VERSION = VERSION_0
58
59
  A_ELEMENTS = (ic.ICAElement("time", cst.OctetStringDateTime, classifier=ic.Classifier.DYNAMIC),
59
60
  ic.ICAElement("time_zone", TimeZone, -720, 840),
60
61
  ic.ICAElement("status", ClockStatus, classifier=ic.Classifier.DYNAMIC),
@@ -57,7 +57,7 @@ from .tcp_udp_setup import TCPUDPSetup
57
57
  from .. import exceptions as exc
58
58
  from ..relation_to_OBIS import get_name
59
59
  from ..cosem_interface_classes import implementations as impl
60
- from ..cosem_interface_classes.overview import ClassID, Version, CountrySpecificIdentifiers
60
+ from ..cosem_interface_classes.overview import ClassID, CountrySpecificIdentifiers
61
61
  from . import obis as o, ln_pattern
62
62
  from .. import pdu_enums as pdu
63
63
  from ..config_parser import config, get_message
@@ -742,7 +742,7 @@ class Collection:
742
742
  except exc.EmptyObj as e:
743
743
  logger.warning(F"can't copy {target} attr={i}, skipped. {e}")
744
744
 
745
- def copy(self) -> result.Simple[Self]:
745
+ def copy(self) -> result.Simple["Collection"]:
746
746
  """copy collection with value by Association"""
747
747
  res = result.Simple(
748
748
  value=Collection(
@@ -779,7 +779,7 @@ class Collection:
779
779
  target=new_obj,
780
780
  association_id=ass_id)
781
781
  except Exception as e:
782
- res.append_err(e)
782
+ res.append_e(e, "copy object value")
783
783
  return res
784
784
 
785
785
  @property
@@ -871,7 +871,7 @@ class Collection:
871
871
  """return: DLMSObject"""
872
872
  if obj := self.__objs.get(par.obis):
873
873
  return result.Simple(obj)
874
- return result.Error.from_e(exc.NoObject(f"with {par=}"))
874
+ return result.Error.from_e(exc.NoObject(f"with {par=}"), "get object")
875
875
 
876
876
  def par2data(self, par: Parameter) -> result.Option[cdt.CommonDataType] | result.Error:
877
877
  """:return CDT by Parameter, return None if data wasn't setting"""
@@ -1122,12 +1122,12 @@ class Collection:
1122
1122
  return ret
1123
1123
 
1124
1124
  def sap2objects(self, value: enums.ClientSAP) -> result.List[ic.COSEMInterfaceClasses]:
1125
- res = result.List(msg=inspect.currentframe().f_code.co_qualname)
1126
- for ln in self.sap2association(value).get_lns():
1127
- try:
1128
- res.value.append(self.__get_object(ln.contents))
1129
- except exc.NoObject as e:
1130
- res.append_err(e)
1125
+ res = result.List()
1126
+ for par in self.sap2association(value).iter_pars():
1127
+ if isinstance(res1 := self.par2obj(par), result.Error):
1128
+ res1.append_err(res.err)
1129
+ else:
1130
+ res.append(res1.value)
1131
1131
  return res
1132
1132
 
1133
1133
  def iter_classID_objects(self,
@@ -1229,14 +1229,11 @@ class Collection:
1229
1229
  else:
1230
1230
  return obj
1231
1231
 
1232
- def obis2obj(self, obis: o.OBIS) -> result.Simple[InterfaceClass]:
1233
- res = result.Simple(
1234
- value=self.__objs.get(obis),
1235
- msg=inspect.currentframe().f_code.co_qualname
1236
- )
1232
+ def obis2obj(self, obis: o.OBIS) -> result.Simple[InterfaceClass] | result.Error:
1233
+ res = self.__objs.get(obis)
1237
1234
  if res.value is None:
1238
- res.append_err(exc.NoObject(obis))
1239
- return res
1235
+ return result.Error.from_e(exc.NoObject(obis))
1236
+ return result.Simple(res.value)
1240
1237
 
1241
1238
  def logicalName2obj(self, ln: cst.LogicalName) -> result.Simple[InterfaceClass]:
1242
1239
  return self.obis2obj(o.OBIS(ln.contents))
@@ -4,7 +4,7 @@ DLMS UA 1000-1 Ed 14
4
4
  from dataclasses import dataclass
5
5
  from functools import lru_cache
6
6
  from typing_extensions import deprecated
7
- from typing import Iterator, Type, TypeAlias, Callable, Any, Self, Literal, Optional, Protocol
7
+ from typing import Iterator, Type, TypeAlias, Callable, Any, Self, Literal, Optional, Protocol, ClassVar
8
8
  from ..types import cdt, ut, cst
9
9
  from StructResult import result
10
10
  from ..relation_to_OBIS import get_name
@@ -12,7 +12,7 @@ import logging
12
12
  from enum import IntEnum
13
13
  from itertools import count
14
14
  from .. import exceptions as exc
15
- from .overview import ClassID, Version
15
+ from .overview import ClassID
16
16
  from ..settings import settings
17
17
  from ..config_parser import get_values
18
18
  from .. import literals
@@ -215,7 +215,7 @@ Name: Literal = Literal[
215
215
 
216
216
 
217
217
  @lru_cache(150)
218
- def ClassIDVer2Name(class_id: ClassID, ver: Version) -> Name:
218
+ def ClassIDVer2Name(class_id: ClassID, ver: cdt.Unsigned) -> Name:
219
219
  """Table 3 – List of interface classes by class_id"""
220
220
  match int(class_id), int(ver):
221
221
  case 1, 0: return "Data"
@@ -326,8 +326,8 @@ def ClassIDVer2Name(class_id: ClassID, ver: Version) -> Name:
326
326
 
327
327
 
328
328
  class COSEMInterfaceClasses(Protocol):
329
- CLASS_ID: ClassID
330
- VERSION: Version | None = None
329
+ CLASS_ID: ClassVar[ut.CosemClassId]
330
+ VERSION: ClassVar[cdt.Unsigned]
331
331
  """ Identification code of the version of the class. The version of each object is retrieved together with the logical name and the class_id by reading the object_list
332
332
  attribute of an “Association LN” / ”Association SN” object. Within one logical device, all instances of a certain class must be of the same version."""
333
333
  A_ELEMENTS: tuple[ICAElement, ...]
@@ -375,15 +375,26 @@ class COSEMInterfaceClasses(Protocol):
375
375
  # print(cls.__name__)
376
376
 
377
377
  @classmethod
378
- def getAElement(cls, i: int) -> result.Simple[ICAElement] | result.Error:
378
+ @deprecated("use <getAElement>")
379
+ def get_attr_element(cls, i: int) -> ICAElement:
379
380
  """return element by order index. Override in each new class"""
380
381
  if i == 1:
381
- return result.Simple(_LN_ELEMENT)
382
+ return _LN_ELEMENT
382
383
  elif i > len(cls.A_ELEMENTS) + 1:
383
384
  raise exc.DLMSException(F"got attribute index: {i}, expected 1..{len(cls.A_ELEMENTS) + 1}")
384
385
  else:
385
386
  return cls.A_ELEMENTS[i - 2]
386
387
 
388
+ @classmethod
389
+ def getAElement(cls, i: int) -> result.Simple[ICAElement] | result.Error:
390
+ """return element by order index. Override in each new class"""
391
+ if i == 1:
392
+ return result.Simple(_LN_ELEMENT)
393
+ elif i > len(cls.A_ELEMENTS) + 1:
394
+ return result.Error.from_e(exc.DLMSException(F"got attribute index: {i}, expected 1..{len(cls.A_ELEMENTS) + 1}"))
395
+ else:
396
+ return result.Simple(cls.A_ELEMENTS[i - 2])
397
+
387
398
  @classmethod
388
399
  def get_meth_element(cls, i: int) -> ICMElement:
389
400
  """ implement in subclasses with methods """
@@ -1,13 +1,15 @@
1
1
  from __future__ import annotations
2
- from .__class_init__ import *
3
2
  from ..types import choices
3
+ from . import cosem_interface_class as ic
4
+ from .overview import ClassID
5
+ from .overview import VERSION_0
4
6
 
5
7
 
6
8
  class Data(ic.COSEMInterfaceClasses):
7
9
  """ Object stores data related to internal meter object(s). The meaning of the value is identified by the logical_name.
8
10
  The data type of the value is CHOICE. “Data” is typically used to store configuration data and parameters """
9
11
  CLASS_ID = ClassID.DATA
10
- VERSION = Version.V0
12
+ VERSION = VERSION_0
11
13
  A_ELEMENTS = ic.ICAElement("value", choices.common_dt, classifier=ic.Classifier.NOT_SPECIFIC),
12
14
 
13
15
  def characteristics_init(self):
@@ -1,12 +1,13 @@
1
1
  from ..__class_init__ import *
2
2
  from ...types import choices
3
3
  from ...types.implementations import integers
4
+ from ..overview import VERSION_0
4
5
 
5
6
 
6
7
  class DemandRegister(ic.COSEMInterfaceClasses):
7
8
  """DLMS UA 1000-1 Ed 14 4.3.4.Demand register"""
8
9
  CLASS_ID = ClassID.DEMAND_REGISTER
9
- VERSION = Version.V0
10
+ VERSION = VERSION_0
10
11
  A_ELEMENTS = (
11
12
  ic.ICAElement("current_average_value", choices.register, classifier=ic.Classifier.DYNAMIC),
12
13
  ic.ICAElement("last_average_value", choices.register, classifier=ic.Classifier.DYNAMIC),
@@ -2,6 +2,7 @@ from .__class_init__ import *
2
2
  from ..types.implementations import integers
3
3
  from itertools import chain
4
4
  from ..config_parser import get_message
5
+ from .overview import VERSION_0
5
6
 
6
7
 
7
8
  class ControlState(cdt.Enum, elements=(0, 1, 2)):
@@ -42,7 +43,7 @@ class OutputState(cdt.Boolean):
42
43
  class DisconnectControl(ic.COSEMInterfaceClasses):
43
44
  """DLMS UA 1000-1 Ed. 14 4.5.8 Disconnect control"""
44
45
  CLASS_ID = ClassID.DISCONNECT_CONTROL
45
- VERSION = Version.V0
46
+ VERSION = VERSION_0
46
47
  A_ELEMENTS = (ic.ICAElement("output_state", OutputState, classifier=ic.Classifier.DYNAMIC),
47
48
  ic.ICAElement("control_state", ControlState, classifier=ic.Classifier.DYNAMIC),
48
49
  ic.ICAElement("control_mode", ControlMode))
@@ -1,6 +1,7 @@
1
1
  from . import register
2
2
  from .__class_init__ import *
3
3
  from ..types import choices
4
+ from .overview import VERSION_0
4
5
 
5
6
 
6
7
  class ExtendedRegister(register.Register, ic.COSEMInterfaceClasses):
@@ -8,7 +9,7 @@ class ExtendedRegister(register.Register, ic.COSEMInterfaceClasses):
8
9
  the nature of the process value or of the status value. The nature of the value is described by the attribute
9
10
  “logical name” using the OBIS identification system. """
10
11
  CLASS_ID = ClassID.EXT_REGISTER
11
- VERSION = Version.V0
12
+ VERSION = VERSION_0
12
13
  A_ELEMENTS = (register.Register.get_attr_element(2),
13
14
  register.Register.get_attr_element(3),
14
15
  ic.ICAElement("status", choices.extended_register, classifier=ic.Classifier.DYNAMIC),
@@ -1,4 +1,5 @@
1
1
  from . __class_init__ import *
2
+ from ..overview import VERSION_0
2
3
 
3
4
 
4
5
  class QoSElement(cdt.Structure):
@@ -21,7 +22,7 @@ class QualityOfService(cdt.Structure):
21
22
  class GPRSModemSetup(ic.COSEMInterfaceClasses):
22
23
  """ This IC allow setting up GPRS modems, by handling all data necessary data for modem management. """
23
24
  CLASS_ID = ClassID.GPRS_MODEM_SETUP
24
- VERSION = Version.V0
25
+ VERSION = VERSION_0
25
26
  A_ELEMENTS = (ic.ICAElement("APN", cdt.OctetString),
26
27
  ic.ICAElement("PIN_code", cdt.LongUnsigned),
27
28
  ic.ICAElement("quality_of_service", QualityOfService))
@@ -2,6 +2,7 @@ import logging
2
2
 
3
3
  from ..__class_init__ import *
4
4
  from ...config_parser import get_message
5
+ from ..overview import VERSION_0
5
6
 
6
7
 
7
8
  class Status(cdt.Enum, elements=tuple(range(6))):
@@ -61,7 +62,7 @@ class GSMDiagnostic(ic.COSEMInterfaceClasses):
61
62
  to obtain diagnostic information that allows identifying communication problems in the network. An instance of the 'GSM diagnostic' class stores parameters of the GSM/GPRS
62
63
  network necessary for analysing the operation of the network."""
63
64
  CLASS_ID = ClassID.GSM_DIAGNOSTIC
64
- VERSION = Version.V0
65
+ VERSION = VERSION_0
65
66
  A_ELEMENTS = (ic.ICAElement("operator", cdt.VisibleString, classifier=ic.Classifier.DYNAMIC),
66
67
  ic.ICAElement("status", Status, 0, 255, 0, classifier=ic.Classifier.DYNAMIC),
67
68
  ic.ICAElement("cs_attachment", CSAttachment, 0, 255, 0, classifier=ic.Classifier.DYNAMIC),
@@ -1,12 +1,13 @@
1
1
  from collections import deque
2
2
  from ..__class_init__ import *
3
3
  from ...types.implementations.enums import CommSpeed
4
+ from ..overview import VERSION_0
4
5
 
5
6
 
6
7
  class IECHDLCSetup(ic.COSEMInterfaceClasses):
7
8
  """ This IC allows modelling and configuring communication channels according to Clause 8 of DLMS UA 1000-2 Ed. 8.0:2014. Several communication cnannels can be configured. """
8
9
  CLASS_ID = ClassID.IEC_HDLC_SETUP
9
- VERSION = Version.V1
10
+ VERSION = VERSION_0
10
11
  A_ELEMENTS = (ic.ICAElement("comm_speed", CommSpeed, 0, 9, 5),
11
12
  ic.ICAElement("windows_size_transmit", cdt.Unsigned, 1, 7, 1),
12
13
  ic.ICAElement("windows_size_receive", cdt.Unsigned, 1, 7, 1),
@@ -1,10 +1,11 @@
1
- from .__class_init__ import *
1
+ from ..cosem_interface_classes import cosem_interface_class as ic
2
+ from .overview import ClassID, VERSION_1
2
3
 
3
4
 
4
5
  class IECLocalPortSetup(ic.COSEMInterfaceClasses):
5
6
  """ This IC allows modelling the configuration of communication ports using the protocols specified in IEC 62056-21:2002. Several ports can be configured. """
6
7
  CLASS_ID = ClassID.IEC_LOCAL_PORT_SETUP
7
- VERSION = Version.V1
8
+ VERSION = VERSION_1
8
9
 
9
10
  def characteristics_init(self) -> None:
10
11
  """# TODO: not released ... """
@@ -1,6 +1,7 @@
1
1
  from ..__class_init__ import *
2
2
  from ...types.implementations import integers
3
3
  from . image_transfer_status import ImageTransferStatus
4
+ from ..overview import VERSION_0
4
5
 
5
6
 
6
7
  class ImageToActivateInfoElement(cdt.Structure):
@@ -35,7 +36,7 @@ class ImageBlockTransfer(cdt.Structure):
35
36
  class ImageTransfer(ic.COSEMInterfaceClasses):
36
37
  """ Instance of the Image transfer IC model the process of transferring binary files, called Images to COSEM servers. """
37
38
  CLASS_ID = ClassID.IMAGE_TRANSFER
38
- VERSION = Version.V0
39
+ VERSION = VERSION_0
39
40
  __blocks_for_update: list[bytearray]
40
41
  A_ELEMENTS = (ic.ICAElement("image_block_size", cdt.DoubleLongUnsigned),
41
42
  ic.ICAElement("image_transferred_blocks_status", cdt.BitString, classifier=ic.Classifier.DYNAMIC),
@@ -1,5 +1,6 @@
1
1
  from .__class_init__ import *
2
2
  from ..types.implementations import double_long_usingneds, arrays
3
+ from .overview import VERSION_0
3
4
 
4
5
 
5
6
  class IPOptionsElement(cdt.Structure):
@@ -17,7 +18,7 @@ class IPv4Setup(ic.COSEMInterfaceClasses):
17
18
  connection on which these settings are used. There shall be and instance of this IC in a device for each different network interface implemented. For example, if a device has
18
19
  two interfaces (using the TCP-UDP/ITv4 profile on both of them), there shall be two instances of the IPc4 setup IC in that device: one for each of these interfaces."""
19
20
  CLASS_ID = ClassID.IPV4_SETUP
20
- VERSION = Version.V0
21
+ VERSION = VERSION_0
21
22
  # TODO: more 7 attr and 3 methods
22
23
  A_ELEMENTS = (ic.ICAElement("DL_reference", cst.LogicalName),
23
24
  ic.ICAElement("IP_address", double_long_usingneds.IPAddress),
@@ -3,6 +3,9 @@ from .. import exceptions as exc
3
3
  from .__class_init__ import *
4
4
  from ..types import choices
5
5
  from ..types.implementations import structs, long_unsigneds, double_long_usingneds
6
+ from .overview import VERSION_0
7
+
8
+
6
9
  threshold_scaler_unit = cdt.ScalUnitType(b'\x02\x02\x0f\x00\x16\x07')
7
10
 
8
11
 
@@ -41,7 +44,7 @@ class Limiter(ic.COSEMInterfaceClasses):
41
44
  time, and duration. The emergency profile id element is matched to an emergency profile group id: this mechanism enables the activation of the emergency threshold only
42
45
  for a specific emergency group. """
43
46
  CLASS_ID = ClassID.LIMITER
44
- VERSION = Version.V0
47
+ VERSION = VERSION_0
45
48
  A_ELEMENTS = (ic.ICAElement("monitored_value", structs.ValueDefinition),
46
49
  ic.ICAElement("threshold_active", choices.simple_dt, classifier=ic.Classifier.DYNAMIC),
47
50
  ic.ICAElement("threshold_normal", choices.simple_dt),
@@ -1,5 +1,6 @@
1
1
  from ..__class_init__ import *
2
2
  from ...types.implementations.enums import CommSpeed
3
+ from ..overview import VERSION_0
3
4
 
4
5
 
5
6
  class InitializationStringElement(cdt.Structure):
@@ -43,7 +44,7 @@ class PSTNModemConfiguration(ic.COSEMInterfaceClasses):
43
44
  """ An instance of the 'PSTN modem configuration' IC stores data related to the initialization of modems, which are used for data transfer from/to a device. Several modems
44
45
  can be configured."""
45
46
  CLASS_ID = ClassID.MODEM_CONFIGURATION
46
- VERSION = Version.V0
47
+ VERSION = VERSION_0
47
48
  A_ELEMENTS = (ic.ICAElement("comm_speed", CommSpeed, 0, 9, 5),
48
49
  ic.ICAElement("initialization_string", InitializationString),
49
50
  ic.ICAElement("modem_profile", ModemProfile))
@@ -1,5 +1,6 @@
1
1
  from ..__class_init__ import *
2
2
  from . import ver0
3
+ from ..overview import VERSION_1
3
4
 
4
5
 
5
6
  class InitializationStringElement(cdt.Structure):
@@ -19,8 +20,8 @@ class InitializationString(cdt.Array):
19
20
 
20
21
  class ModemConfigurationVer1(ic.COSEMInterfaceClasses):
21
22
  """ This IC allow modelling the configuration and initialisation of modems used for data transfer from/to a device. Several modems can be configured."""
22
- CLASS_ID = ut.CosemClassId(27)
23
- VERSION = Version.V1
23
+ ClassID = ut.CosemClassId(27)
24
+ VERSION = VERSION_1
24
25
  A_ELEMENTS = (ver0.PSTNModemConfiguration.get_attr_element(2),
25
26
  ic.ICAElement("initialization_string", InitializationString),
26
27
  ver0.PSTNModemConfiguration.get_attr_element(4))
@@ -1,5 +1,6 @@
1
1
  from ..__class_init__ import *
2
2
  from ...types.implementations import integers
3
+ from ..overview import VERSION_0
3
4
 
4
5
 
5
6
  class ServerAddress(cdt.OctetString):
@@ -24,7 +25,7 @@ class AuthenticationKeys(cdt.Array):
24
25
  class NTPSetup(ic.COSEMInterfaceClasses):
25
26
  """DLMS UA 1000-1 Ed 14, 4.9.7 NTP setup"""
26
27
  CLASS_ID = ClassID.NTP_SETUP
27
- VERSION = Version.V0
28
+ VERSION = VERSION_0
28
29
  A_ELEMENTS = (
29
30
  ic.ICAElement("activated", cdt.Boolean, default=False),
30
31
  ic.ICAElement("server_address", ServerAddress),
@@ -1,5 +1,7 @@
1
1
  """DLMS UA 1000-1 Ed 14 4.2 Overview of the COSEM interface classes"""
2
+ from typing import Final
2
3
  from functools import lru_cache
4
+ from typing_extensions import deprecated
3
5
  from enum import IntEnum
4
6
  from dataclasses import dataclass
5
7
  from ..types import ut, cdt
@@ -119,12 +121,11 @@ class ClassID:
119
121
  return tuple(map(int, filter(lambda it: isinstance(it, ut.CosemClassId), cls.__dict__.values())))
120
122
 
121
123
 
122
- @dataclass(frozen=True)
123
- class Version:
124
- V0 = cdt.Unsigned(0)
125
- V1 = cdt.Unsigned(1)
126
- V2 = cdt.Unsigned(2)
127
- V3 = cdt.Unsigned(3)
124
+ VERSION_0: Final[cdt.Unsigned] = cdt.Unsigned(0)
125
+ VERSION_1: Final[cdt.Unsigned] = cdt.Unsigned(1)
126
+ VERSION_2: Final[cdt.Unsigned] = cdt.Unsigned(2)
127
+ VERSION_3: Final[cdt.Unsigned] = cdt.Unsigned(3)
128
+ VERSION_4: Final[cdt.Unsigned] = cdt.Unsigned(4)
128
129
 
129
130
 
130
131
  class CountrySpecificIdentifiers(IntEnum):
@@ -2,6 +2,7 @@
2
2
  from typing import Type
3
3
  from ..__class_init__ import *
4
4
  from ...types.implementations import long_unsigneds, integers
5
+ from ..overview import VERSION_0
5
6
 
6
7
 
7
8
  BUFFER = 2
@@ -35,7 +36,7 @@ class SortMethod(cdt.Enum, elements=(1, 2, 3, 4, 5, 6)):
35
36
  class ProfileGeneric(ic.COSEMInterfaceClasses):
36
37
  """5.3.1 Profile generic"""
37
38
  CLASS_ID = ClassID.PROFILE_GENERIC
38
- VERSION = Version.V0
39
+ VERSION = VERSION_0
39
40
  # todo: remove down following
40
41
  scaler_profile_key: bytes | None = None
41
42
  """ obis of scaler profile for this profile if need """
@@ -6,6 +6,7 @@ from ...relation_to_OBIS import get_name
6
6
  from ... import exceptions as exc
7
7
  from ..__class_init__ import *
8
8
  from ...types.implementations import integers, arrays, structs
9
+ from ..overview import VERSION_1
9
10
 
10
11
 
11
12
  class CaptureObjects(cdt.Array):
@@ -37,7 +38,7 @@ class AccessSelector(ut.Unsigned8):
37
38
 
38
39
  class ProfileGeneric(ver0.ProfileGeneric):
39
40
  """4.3.6 Profile generic"""
40
- VERSION = Version.V1
41
+ VERSION = VERSION_1
41
42
  A_ELEMENTS = (ic.ICAElement("buffer", arrays.SelectionAccess, classifier=ic.Classifier.DYNAMIC),
42
43
  ic.ICAElement("capture_objects", CaptureObjects),
43
44
  ver0.ProfileGeneric.get_attr_element(4),
@@ -2,6 +2,7 @@ from ..__class_init__ import *
2
2
  from ...types.implementations import structs, enums, integers
3
3
  from itertools import chain
4
4
  from ...types import choices
5
+ from ..overview import VERSION_2
5
6
 
6
7
 
7
8
  class RestrictionElement(choices.StructureMixin, cdt.Structure):
@@ -89,7 +90,7 @@ class PushProtectionParameters(cdt.Array):
89
90
  class PushSetup(ic.COSEMInterfaceClasses):
90
91
  """ DLMS UA 1000-1 Ed. 14 4.4.8.2 Push setup"""
91
92
  CLASS_ID = ClassID.PUSH_SETUP
92
- VERSION = Version.V2
93
+ VERSION = VERSION_2
93
94
  A_ELEMENTS = (ic.ICAElement("push_object_list", PushObjectList),
94
95
  ic.ICAElement("send_destination_and_method", SendDestinationAndMethod),
95
96
  ic.ICAElement("communication_window", CommunicationWindow),
@@ -1,6 +1,7 @@
1
1
  from .__class_init__ import *
2
2
  from ..types import choices
3
3
  from ..types.implementations import integers
4
+ from ..overview import VERSION_0
4
5
 
5
6
 
6
7
  class Register(ic.COSEMInterfaceClasses):
@@ -8,7 +9,7 @@ class Register(ic.COSEMInterfaceClasses):
8
9
  the nature of the process value or of the status value. The nature of the value is described by the attribute
9
10
  “logical name” using the OBIS identification system. """
10
11
  CLASS_ID = ClassID.REGISTER
11
- VERSION = Version.V0
12
+ VERSION = VERSION_0
12
13
  scaler_unit_not_settable: bool
13
14
  A_ELEMENTS = (
14
15
  ic.ICAElement("value", choices.register, classifier=ic.Classifier.NOT_SPECIFIC),