DLMS-SPODES 0.87.5__tar.gz → 0.87.7__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 (172) hide show
  1. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/PKG-INFO +1 -1
  2. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/pyproject.toml +1 -1
  3. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/clock.py +1 -1
  4. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/collection.py +1 -1
  5. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py +11 -12
  6. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/implementations/profile_generic.py +0 -1
  7. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/parameter.py +1 -1
  8. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/parameters.py +1 -8
  9. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py +54 -39
  10. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/special_days_table.py +0 -2
  11. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/obis/media_id.py +20 -21
  12. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES.egg-info/PKG-INFO +1 -1
  13. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_cdt.py +0 -1
  14. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/.gitignore +0 -0
  15. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/README.md +0 -0
  16. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/config.toml +0 -0
  17. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/setup.cfg +0 -0
  18. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/Values/EN/__init__.py +0 -0
  19. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/Values/EN/actors.py +0 -0
  20. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/Values/EN/relation_to_obis_names.py +0 -0
  21. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/Values/RU/__init__.py +0 -0
  22. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/Values/RU/actors.py +0 -0
  23. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/Values/RU/relation_to_obis_names.py +0 -0
  24. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/Values/__init__.py +0 -0
  25. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/__init__.py +0 -0
  26. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/configEN.ini +0 -0
  27. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/config_parser.py +0 -0
  28. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/__class_init__.py +0 -0
  29. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/__init__.py +0 -0
  30. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/a_parameter.py +0 -0
  31. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/activity_calendar.py +0 -0
  32. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/arbitrator.py +0 -0
  33. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/association_ln/__init__.py +0 -0
  34. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/association_ln/abstract.py +0 -0
  35. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/association_ln/authentication_mechanism_name.py +0 -0
  36. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/association_ln/mechanism_id.py +0 -0
  37. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/association_ln/method.py +0 -0
  38. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver0.py +0 -0
  39. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver1.py +0 -0
  40. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver2.py +0 -0
  41. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver3.py +0 -0
  42. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/association_sn/__init__.py +0 -0
  43. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/association_sn/ver0.py +0 -0
  44. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/attr_indexes.py +0 -0
  45. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/data.py +0 -0
  46. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/demand_register/__init__.py +0 -0
  47. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/demand_register/ver0.py +0 -0
  48. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/disconnect_control.py +0 -0
  49. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/extended_register.py +0 -0
  50. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/gprs_modem_setup.py +0 -0
  51. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/__init__.py +0 -0
  52. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver0.py +0 -0
  53. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver1.py +0 -0
  54. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver2.py +0 -0
  55. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/__init__.py +0 -0
  56. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver0.py +0 -0
  57. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver1.py +0 -0
  58. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/iec_local_port_setup.py +0 -0
  59. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/__init__.py +0 -0
  60. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/image_transfer_status.py +0 -0
  61. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/ver0.py +0 -0
  62. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/implementations/__init__.py +0 -0
  63. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/implementations/arbitrator.py +0 -0
  64. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/implementations/data.py +0 -0
  65. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/ipv4_setup.py +0 -0
  66. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/limiter.py +0 -0
  67. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/ln_pattern.py +0 -0
  68. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/__init__.py +0 -0
  69. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py +0 -0
  70. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py +0 -0
  71. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/__init__.py +0 -0
  72. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/ver0.py +0 -0
  73. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/obis.py +0 -0
  74. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/overview.py +0 -0
  75. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/__init__.py +0 -0
  76. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver0.py +0 -0
  77. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/push_setup/__init__.py +0 -0
  78. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver0.py +0 -0
  79. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver1.py +0 -0
  80. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver2.py +0 -0
  81. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/register.py +0 -0
  82. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/register_activation/__init__.py +0 -0
  83. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/register_activation/ver0.py +0 -0
  84. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/register_monitor.py +0 -0
  85. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/reports.py +0 -0
  86. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/schedule.py +0 -0
  87. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/script_table.py +0 -0
  88. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__init__.py +0 -0
  89. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__pycache__/__init__.cpython-311.pyc +0 -0
  90. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver0.py +0 -0
  91. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver1.py +0 -0
  92. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/single_action_schedule.py +0 -0
  93. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_interface_classes/tcp_udp_setup.py +0 -0
  94. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/cosem_pdu.py +0 -0
  95. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/enums.py +0 -0
  96. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/exceptions.py +0 -0
  97. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/firmwares.py +0 -0
  98. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/hdlc/__init__.py +0 -0
  99. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/hdlc/frame.py +0 -0
  100. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/hdlc/sub_layer.py +0 -0
  101. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/literals.py +0 -0
  102. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/obis/__init__.py +0 -0
  103. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/pardata.py +0 -0
  104. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/pdu_enums.py +0 -0
  105. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/py.typed +0 -0
  106. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/relation_to_OBIS.py +0 -0
  107. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/settings.py +0 -0
  108. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/__init__.py +0 -0
  109. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/choices.py +0 -0
  110. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/common_data_types.py +0 -0
  111. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/cosem_service_types.py +0 -0
  112. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/implementations/__init__.py +0 -0
  113. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/implementations/arrays.py +0 -0
  114. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/implementations/bitstrings.py +0 -0
  115. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/implementations/double_long_usingneds.py +0 -0
  116. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/implementations/enums.py +0 -0
  117. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/implementations/integers.py +0 -0
  118. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/implementations/long_unsigneds.py +0 -0
  119. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/implementations/octet_string.py +0 -0
  120. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/implementations/structs.py +0 -0
  121. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES/types/useful_types.py +0 -0
  122. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES.egg-info/SOURCES.txt +0 -0
  123. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES.egg-info/dependency_links.txt +0 -0
  124. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES.egg-info/requires.txt +0 -0
  125. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/DLMS_SPODES.egg-info/top_level.txt +0 -0
  126. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/src/__init__.py +0 -0
  127. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/__init__.py +0 -0
  128. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/collection_init.py +0 -0
  129. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/config.toml +0 -0
  130. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/config.zip +0 -0
  131. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/init_collection.py +0 -0
  132. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test.typ +0 -0
  133. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test.xml +0 -0
  134. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_ActivityCalendar.py +0 -0
  135. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_AssociationLN.py +0 -0
  136. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_COSEMInterfaceClass.py +0 -0
  137. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_Data.py +0 -0
  138. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_DemandRegister.py +0 -0
  139. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_DisconnectControl.py +0 -0
  140. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_DisplayReadoutProfile.py +0 -0
  141. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_GSMDiagnostic.py +0 -0
  142. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_IC.py +0 -0
  143. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_ImageTransfer.py +0 -0
  144. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_KPZ.py +0 -0
  145. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_LNPatterns.py +0 -0
  146. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_Limiter.py +0 -0
  147. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_NTPSetup.py +0 -0
  148. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_Parameter.py +0 -0
  149. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_ProfileGeneric.py +0 -0
  150. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_Register.py +0 -0
  151. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_RegisterActivation.py +0 -0
  152. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_RegisterMonitor.py +0 -0
  153. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_ScalerUnitType.py +0 -0
  154. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_Schedule.py +0 -0
  155. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_Structures.py +0 -0
  156. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_a_param.py +0 -0
  157. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_benchmark_create_obj.py +0 -0
  158. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_collection.py +0 -0
  159. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_config.py +0 -0
  160. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_electric_obj.py +0 -0
  161. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_enums.py +0 -0
  162. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_hdlc.py +0 -0
  163. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_overview.py +0 -0
  164. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_pars.py +0 -0
  165. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_report.py +0 -0
  166. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_save_type.typ +0 -0
  167. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_settings.py +0 -0
  168. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_to_xml.xml +0 -0
  169. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_to_xml2.xml +0 -0
  170. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_to_xml3.xml +0 -0
  171. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_to_xml4.xml +0 -0
  172. {dlms_spodes-0.87.5 → dlms_spodes-0.87.7}/test/test_userfulType.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: DLMS_SPODES
3
- Version: 0.87.5
3
+ Version: 0.87.7
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 @@ exclude = ["test","KPZ"]
14
14
 
15
15
  [project]
16
16
  name = "DLMS_SPODES"
17
- version = "0.87.5"
17
+ version = "0.87.7"
18
18
  authors = [
19
19
  {name="Serj Kotilevski", email="youserj@outlook.com"}
20
20
  ]
@@ -72,7 +72,7 @@ class Clock(ic.COSEMInterfaceClasses):
72
72
  ic.ICMElement("shift_time", ShiftTime))
73
73
 
74
74
  def characteristics_init(self):
75
- self.cardinality = (0, 1)
75
+ ...
76
76
 
77
77
  @property
78
78
  def time(self) -> cst.OctetStringDateTime:
@@ -1234,7 +1234,7 @@ class Collection:
1234
1234
  def obis2obj(self, obis: o.OBIS) -> result.SimpleOrError[InterfaceClass]:
1235
1235
  if obj := self.__objs.get(obis):
1236
1236
  return result.Simple(obj)
1237
- return result.Error.from_e(exc.NoObject(obis))
1237
+ return result.Error.from_e(ValueError(str(obis)), "no object")
1238
1238
 
1239
1239
  def logicalName2obj(self, ln: cst.LogicalName) -> result.SimpleOrError[InterfaceClass]:
1240
1240
  return self.obis2obj(o.OBIS(ln.contents))
@@ -1,7 +1,7 @@
1
1
  """
2
2
  DLMS UA 1000-1 Ed 14
3
3
  """
4
- from dataclasses import dataclass
4
+ from dataclasses import dataclass, field
5
5
  from functools import lru_cache
6
6
  from typing_extensions import deprecated
7
7
  from typing import Iterator, Type, TypeAlias, Callable, Any, Self, Literal, Optional, Protocol, ClassVar
@@ -318,18 +318,26 @@ def ClassIDVer2Name(class_id: ClassID, ver: cdt.Unsigned) -> Name:
318
318
  case _: raise exc.ITEApplication(F"not find <Interface class name> with: {class_id=}, {ver=}")
319
319
 
320
320
 
321
+ @dataclass
322
+ class Cardinality:
323
+ """4.1.4 Class description notation"""
324
+ min: int = 0
325
+ max: int = -1
326
+ """default -1 as infinity"""
327
+
328
+
321
329
  class COSEMInterfaceClasses(Protocol):
322
330
  CLASS_ID: ClassVar[ut.CosemClassId]
323
331
  VERSION: ClassVar[cdt.Unsigned]
324
332
  """ Identification code of the version of the class. The version of each object is retrieved together with the logical name and the class_id by reading the object_list
325
333
  attribute of an “Association LN” / ”Association SN” object. Within one logical device, all instances of a certain class must be of the same version."""
326
334
  A_ELEMENTS: tuple[ICAElement, ...]
335
+ cardinality: ClassVar[Cardinality] = field(default_factory=Cardinality)
327
336
  M_ELEMENTS: tuple[ICMElement, ...] = tuple() # empty if class not has the methods
328
- cardinality: tuple[int, int | None]
329
337
  __attributes: list[cdt.CommonDataType | None]
330
338
  __specific_methods: tuple[cdt.CommonDataType, ...] = None
331
339
  _cbs_attr_post_init: dict[int, Callable]
332
- collection: Any | None # Collection. todo: remove in future
340
+ # collection: Any | None # Collection. todo: remove in future
333
341
  hash_: int
334
342
 
335
343
  def __init__(self, logical_name: cst.LogicalName | bytes | str):
@@ -535,15 +543,6 @@ class COSEMInterfaceClasses(Protocol):
535
543
  """ Cosem-Attribute-Descriptor IS/IEC 62056-53 : 2006, 8.3 Useful types """
536
544
  return self.CLASS_ID.contents + self.instance_id.contents + ut.CosemObjectAttributeId(index).contents
537
545
 
538
- @property
539
- def string_type_cardinality(self) -> str:
540
- min_cardinality, max_cardinality = self.cardinality
541
- if min_cardinality == max_cardinality:
542
- return str(min_cardinality)
543
- else:
544
- max_cardinality = str(max_cardinality) if max_cardinality else 'n'
545
- return F'{str(min_cardinality)}...{max_cardinality}'
546
-
547
546
  def reset_attribute(self, index: int):
548
547
  """ try set default to value """
549
548
  self.set_attr(index, self.get_attr_element(index).default)
@@ -64,7 +64,6 @@ class SPODES3DisplayReadout(ver1.ProfileGeneric):
64
64
  obj = self.collection.add_if_missing(class_id=ut.CosemClassId(el_value.class_id.contents),
65
65
  version=None,
66
66
  logical_name=el_value.logical_name)
67
- # self.collection.raise_before(obj, self)
68
67
  el_value.set_name(self.collection.get_name_and_type(el_value)[0][-1])
69
68
  self.buffer_capture_objects = self.capture_objects
70
69
  buffer_elements: list[cdt.StructElement] = list()
@@ -62,7 +62,7 @@ class Parameter:
62
62
 
63
63
  @cached_property
64
64
  def logical_name(self) -> "Parameter":
65
- return self.get_attr(2)
65
+ return self.get_attr(1)
66
66
 
67
67
  def __eq__(self, other: object) -> bool:
68
68
  if isinstance(other, Parameter):
@@ -18,6 +18,7 @@ class ActiveFirmwareIdentifier(Data):
18
18
  return cls.parse(f"0.{b}.0.2.0.255")
19
19
 
20
20
 
21
+ LDN = Data.parse("0.0.42.0.0.255")
21
22
  ACTIVE_FIRMWARE_IDENTIFIER_0 = ActiveFirmwareIdentifier.from_b()
22
23
 
23
24
 
@@ -46,14 +47,6 @@ class Clock(Parameter):
46
47
  def status(self) -> "Clock":
47
48
  return self.get_attr(4)
48
49
 
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
50
  @property
58
51
  def daylight_savings_begin(self) -> "Clock":
59
52
  return self.get_attr(5)
@@ -6,6 +6,7 @@ from ...relation_to_OBIS import get_name
6
6
  from ... import exceptions as exc
7
7
  from ..__class_init__ import *
8
8
  from ...types.implementations import integers, arrays, structs
9
+ from ...types.choices import CommonDataTypeChoiceBase
9
10
  from ..overview import VERSION_1
10
11
 
11
12
 
@@ -36,6 +37,59 @@ class AccessSelector(ut.Unsigned8):
36
37
  raise ValueError(F'The {self.__class__.__name__} got {int(self)}, expected 1..2')
37
38
 
38
39
 
40
+ class RangeDescriptorValueChoice(CommonDataTypeChoiceBase, types=(
41
+ cdt.DoubleLong,
42
+ cdt.DoubleLongUnsigned,
43
+ cdt.OctetString,
44
+ cdt.VisibleString,
45
+ cdt.Utf8String,
46
+ cdt.Integer,
47
+ cdt.Unsigned,
48
+ cdt.LongUnsigned,
49
+ cdt.Long,
50
+ cdt.Long64Unsigned,
51
+ cdt.Float32,
52
+ cdt.Float64,
53
+ cdt.DateTime,
54
+ cdt.Date,
55
+ cdt.Time
56
+ )):
57
+ """Types of range_descriptor.from_value/to_value"""
58
+
59
+
60
+ class RangeDescriptor(cdt.Structure):
61
+ restricting_object: structs.CaptureObjectDefinition
62
+ from_value: RangeDescriptorValueChoice
63
+ to_value: RangeDescriptorValueChoice
64
+ selected_values: CaptureObjects
65
+
66
+
67
+ class Data(ut.Data):
68
+ restricting_object: structs.CaptureObjectDefinition
69
+ from_value: cdt.SimpleDataType
70
+ to_value: cdt.SimpleDataType
71
+ selected_values: CaptureObjects
72
+ from_entry: FromEntry
73
+ to_entry: cdt.DoubleLongUnsigned
74
+ from_selected_value: cdt.LongUnsigned
75
+ to_selected_value: cdt.LongUnsigned
76
+ ELEMENTS = {1: ut.SequenceElement('range_descriptor', RangeDescriptor),
77
+ 2: ut.SequenceElement('entry_descriptor', EntryDescriptor)}
78
+
79
+
80
+ class SelectiveAccessDescriptor(ut.SelectiveAccessDescriptor):
81
+ access_selector: AccessSelector
82
+ access_parameters: Data
83
+ ELEMENTS = (ut.SequenceElement('access_selector', AccessSelector),
84
+ ut.SequenceElement('access_parameters', Data))
85
+
86
+
87
+ class CosemAttributeDescriptorWithSelection(ut.CosemAttributeDescriptorWithSelection):
88
+ access_selection: SelectiveAccessDescriptor
89
+ ELEMENTS = (ut.SequenceElement('cosem_attribute_descriptor', ut.CosemAttributeDescriptor),
90
+ ut.SequenceElement('access_selection', SelectiveAccessDescriptor))
91
+
92
+
39
93
  class ProfileGeneric(ver0.ProfileGeneric):
40
94
  """4.3.6 Profile generic"""
41
95
  VERSION = VERSION_1
@@ -132,45 +186,6 @@ class ProfileGeneric(ver0.ProfileGeneric):
132
186
  """ Available after got sort object. TODO: need rewrite. maybe replace to collection level. Wrong used sort_obj, it can be any element from capture_objects"""
133
187
  if self.sort_object is None:
134
188
  raise exc.EmptyObj(F"<sort object> is empty")
135
- sort_obj: ic.COSEMInterfaceClasses = self.collection.get_object(self.sort_object.logical_name)
136
- if sort_obj.CLASS_ID.contents == self.sort_object.class_id.contents:
137
- value_type: Type[cdt.CommonDataType] = sort_obj.get_attr_data_type(int(self.sort_object.attribute_index))
138
- else:
139
- exc.NoObject(F"got {self.sort_object.class_id=}, expected {sort_obj.CLASS_ID=} from collection")
140
-
141
- class RangeDescriptor(cdt.Structure):
142
- # cb_preset = TODO: make check 'selected_values' from self.capture_objects or
143
- # cb_post_set = TODO: make check 'selected_values' from self.capture_objects
144
- DEFAULT = b'\x02\x04\x02\x04\x12\x00\x01\x09\x06\x00\x00\x01\x00\x00\xff\x0f\x02\x12\x00\x00\x09\x0c\x07\xe4\x01\x01\xff\xff\xff\xff\xff\x80\x00\xff' \
145
- b'\x09\x0c\x07\xe4\x01\x02\xff\xff\xff\xff\xff\x80\x00\xff\x01\x00'
146
- restricting_object: structs.CaptureObjectDefinition
147
- from_value: value_type
148
- to_value: value_type
149
- selected_values: CaptureObjects
150
-
151
- class Data(ut.Data):
152
- restricting_object: structs.CaptureObjectDefinition
153
- from_value: cdt.SimpleDataType
154
- to_value: cdt.SimpleDataType
155
- selected_values: CaptureObjects
156
- from_entry: FromEntry
157
- to_entry: cdt.DoubleLongUnsigned
158
- from_selected_value: cdt.LongUnsigned
159
- to_selected_value: cdt.LongUnsigned
160
- ELEMENTS = {1: ut.SequenceElement('range_descriptor', RangeDescriptor),
161
- 2: ut.SequenceElement('entry_descriptor', EntryDescriptor)}
162
-
163
- class SelectiveAccessDescriptor(ut.SelectiveAccessDescriptor):
164
- access_selector: AccessSelector
165
- access_parameters: Data
166
- ELEMENTS = (ut.SequenceElement('access_selector', AccessSelector),
167
- ut.SequenceElement('access_parameters', Data))
168
-
169
- class CosemAttributeDescriptorWithSelection(ut.CosemAttributeDescriptorWithSelection):
170
- access_selection: SelectiveAccessDescriptor
171
- ELEMENTS = (ut.SequenceElement('cosem_attribute_descriptor', ut.CosemAttributeDescriptor),
172
- ut.SequenceElement('access_selection', SelectiveAccessDescriptor))
173
-
174
189
  self.attr_descriptor_with_selection = CosemAttributeDescriptorWithSelection
175
190
  self.buffer.selective_access = SelectiveAccessDescriptor()
176
191
 
@@ -52,8 +52,6 @@ class SpecialDaysTable(ic.COSEMInterfaceClasses):
52
52
  ic.ICMElement("delete", cdt.LongUnsigned)) # Todo: was Delete.with_cb(None, self.entries.get_indexes)
53
53
 
54
54
  def characteristics_init(self):
55
- self.cardinality = (0, 1)
56
-
57
55
  self._cbs_attr_post_init.update({2: self.__set_delete})
58
56
  self.set_attr(2, None)
59
57
 
@@ -1,15 +1,31 @@
1
1
  from abc import ABC, abstractmethod
2
+ from typing import Protocol
2
3
  from itertools import count
3
4
  from ..config_parser import config
5
+ from ..settings import settings
6
+ from ..types import cdt
4
7
 
5
8
 
6
- _mid_names = config["DLMS"]["media_id_name"]
9
+ _mid_names = config["DLMS"]["media_id_name"] # todo: make with settings
7
10
 
8
11
 
9
- class MediaId(ABC):
12
+ class MediaIdProto(Protocol):
13
+ _value: tuple[int]
14
+ _inst = None
15
+ TYPE: type[cdt.CommonDataType]
16
+
17
+ def __eq__(self, other: int) -> bool:
18
+ """with integer"""
19
+
20
+ def __hash__(self) -> int:
21
+ """for hashable"""
22
+
23
+
24
+ class MediaId(MediaIdProto):
10
25
  """DLMS UA 1000-1 Ed 14. Table 53 – OBIS code structure and use of value groups. For Group A"""
11
26
  _value: tuple[int]
12
27
  _inst = None
28
+ TYPE: type[cdt.CommonDataType]
13
29
 
14
30
  @classmethod
15
31
  def from_int(cls, value: int):
@@ -24,15 +40,7 @@ class MediaId(ABC):
24
40
  case int(): return Reserved(value)
25
41
  case _: raise ValueError(F"can't create {cls.__name__} from {value=}")
26
42
 
27
- @abstractmethod
28
- def __eq__(self, other: int):
29
- """with integer"""
30
-
31
- @abstractmethod
32
- def __hash__(self):
33
- """for hashable"""
34
-
35
- def __str__(self):
43
+ def __str__(self) -> str:
36
44
  if _mid_names and (t := _mid_names.get(self.__class__.__name__)):
37
45
  return t
38
46
  else:
@@ -66,16 +74,6 @@ class TwoValueMixin:
66
74
  return self._value[0]
67
75
 
68
76
 
69
- class Singleton:
70
- _inst: MediaId | None
71
-
72
- def __new__(cls, *args, **kwargs):
73
- if cls._inst:
74
- return cls._inst
75
- else:
76
- return super().__new__(cls)
77
-
78
-
79
77
  sub_group_hash = count()
80
78
 
81
79
 
@@ -289,6 +287,7 @@ class CompactDataObjects(Abstract):
289
287
 
290
288
  class DeviceIdObjects(Abstract):
291
289
  """6_2_42"""
290
+ TYPE = cdt.DoubleLongUnsigned | cdt.OctetString | cdt.VisibleString | cdt.Utf8String | cdt.Unsigned | cdt.LongUnsigned
292
291
 
293
292
 
294
293
  class MeteringPointIdObjects(Abstract):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: DLMS_SPODES
3
- Version: 0.87.5
3
+ Version: 0.87.7
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
@@ -97,7 +97,6 @@ class TestType(unittest.TestCase):
97
97
  col.add(class_id=ut.CosemClassId(3), version=cdt.Unsigned(0), logical_name=cst.LogicalName.from_obis('1.0.3.29.0.255'))
98
98
  col.add(class_id=ut.CosemClassId(3), version=cdt.Unsigned(0), logical_name=cst.LogicalName.from_obis('1.0.4.29.0.255'))
99
99
  profile = col.add(class_id=ut.CosemClassId(7), version=cdt.Unsigned(1), logical_name=cst.LogicalName.from_obis('1.0.94.7.4.255'))
100
- profile.collection = col
101
100
  profile.set_attr(6, structs.CaptureObjectDefinition().encoding)
102
101
  profile.set_attr(3, bytes.fromhex('01 05 02 04 12 00 08 09 06 00 00 01 00 00 ff 0f 02 12 00 00 02 04 12 00 03 09 06 01 00 02 1d 00 ff 0f 03 12 00 00 02 04 12 00 03 09 06 01 00 01 1d 00 ff 0f 03 12 00 00 02 04 12 00 03 09 06 01 00 03 1d 00 ff 0f 03 12 00 00 02 04 12 00 03 09 06 01 00 04 1d 00 ff 0f 03 12 00 00'))
103
102
  profile.buffer.selective_access.access_selector.set_contents_from(2)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes