DLMS-SPODES 0.86.22__tar.gz → 0.87.0__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 (175) hide show
  1. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/PKG-INFO +1 -1
  2. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/pyproject.toml +1 -1
  3. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/collection.py +16 -0
  4. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py +0 -7
  5. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/parameter.py +57 -42
  6. dlms_spodes-0.87.0/src/DLMS_SPODES/cosem_interface_classes/parameters.py +41 -0
  7. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/pardata.py +3 -2
  8. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/settings.py +28 -0
  9. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/common_data_types.py +1 -1
  10. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/implementations/bitstrings.py +2 -0
  11. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/useful_types.py +4 -7
  12. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES.egg-info/PKG-INFO +1 -1
  13. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_cdt.py +3 -3
  14. dlms_spodes-0.87.0/test/test_pars.py +12 -0
  15. dlms_spodes-0.86.22/src/DLMS_SPODES/cosem_interface_classes/parameters.py +0 -26
  16. dlms_spodes-0.86.22/test/test_pars.py +0 -12
  17. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/.gitignore +0 -0
  18. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/README.md +0 -0
  19. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/config.toml +0 -0
  20. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/setup.cfg +0 -0
  21. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/Values/EN/__init__.py +0 -0
  22. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/Values/EN/actors.py +0 -0
  23. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/Values/EN/relation_to_obis_names.py +0 -0
  24. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/Values/RU/__init__.py +0 -0
  25. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/Values/RU/actors.py +0 -0
  26. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/Values/RU/relation_to_obis_names.py +0 -0
  27. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/Values/__init__.py +0 -0
  28. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/__init__.py +0 -0
  29. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/configEN.ini +0 -0
  30. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/config_parser.py +0 -0
  31. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/__class_init__.py +0 -0
  32. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/__init__.py +0 -0
  33. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/a_parameter.py +0 -0
  34. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/activity_calendar.py +0 -0
  35. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/arbitrator.py +0 -0
  36. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/association_ln/__init__.py +0 -0
  37. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/association_ln/abstract.py +0 -0
  38. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/association_ln/authentication_mechanism_name.py +0 -0
  39. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/association_ln/mechanism_id.py +0 -0
  40. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/association_ln/method.py +0 -0
  41. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver0.py +0 -0
  42. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver1.py +0 -0
  43. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver2.py +0 -0
  44. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver3.py +0 -0
  45. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/association_sn/__init__.py +0 -0
  46. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/association_sn/ver0.py +0 -0
  47. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/attr_indexes.py +0 -0
  48. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/clock.py +0 -0
  49. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/data.py +0 -0
  50. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/demand_register/__init__.py +0 -0
  51. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/demand_register/ver0.py +0 -0
  52. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/disconnect_control.py +0 -0
  53. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/extended_register.py +0 -0
  54. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/gprs_modem_setup.py +0 -0
  55. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/__init__.py +0 -0
  56. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver0.py +0 -0
  57. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver1.py +0 -0
  58. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver2.py +0 -0
  59. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/__init__.py +0 -0
  60. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver0.py +0 -0
  61. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver1.py +0 -0
  62. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/iec_local_port_setup.py +0 -0
  63. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/__init__.py +0 -0
  64. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/image_transfer_status.py +0 -0
  65. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/ver0.py +0 -0
  66. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/implementations/__init__.py +0 -0
  67. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/implementations/arbitrator.py +0 -0
  68. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/implementations/data.py +0 -0
  69. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/implementations/profile_generic.py +0 -0
  70. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/ipv4_setup.py +0 -0
  71. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/limiter.py +0 -0
  72. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/ln_pattern.py +0 -0
  73. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/__init__.py +0 -0
  74. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py +0 -0
  75. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py +0 -0
  76. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/__init__.py +0 -0
  77. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/ver0.py +0 -0
  78. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/obis.py +0 -0
  79. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/overview.py +0 -0
  80. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/__init__.py +0 -0
  81. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver0.py +0 -0
  82. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py +0 -0
  83. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/push_setup/__init__.py +0 -0
  84. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver0.py +0 -0
  85. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver1.py +0 -0
  86. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver2.py +0 -0
  87. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/register.py +0 -0
  88. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/register_activation/__init__.py +0 -0
  89. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/register_activation/ver0.py +0 -0
  90. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/register_monitor.py +0 -0
  91. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/reports.py +0 -0
  92. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/schedule.py +0 -0
  93. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/script_table.py +0 -0
  94. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__init__.py +0 -0
  95. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__pycache__/__init__.cpython-311.pyc +0 -0
  96. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver0.py +0 -0
  97. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver1.py +0 -0
  98. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/single_action_schedule.py +0 -0
  99. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/special_days_table.py +0 -0
  100. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_interface_classes/tcp_udp_setup.py +0 -0
  101. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/cosem_pdu.py +0 -0
  102. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/enums.py +0 -0
  103. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/exceptions.py +0 -0
  104. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/firmwares.py +0 -0
  105. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/hdlc/__init__.py +0 -0
  106. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/hdlc/frame.py +0 -0
  107. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/hdlc/sub_layer.py +0 -0
  108. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/literals.py +0 -0
  109. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/obis/__init__.py +0 -0
  110. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/obis/abstract_objects.py +0 -0
  111. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/obis/media_id.py +0 -0
  112. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/pdu_enums.py +0 -0
  113. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/py.typed +0 -0
  114. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/relation_to_OBIS.py +0 -0
  115. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/__init__.py +0 -0
  116. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/choices.py +0 -0
  117. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/cosem_service_types.py +0 -0
  118. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/implementations/__init__.py +0 -0
  119. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/implementations/arrays.py +0 -0
  120. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/implementations/double_long_usingneds.py +0 -0
  121. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/implementations/enums.py +0 -0
  122. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/implementations/integers.py +0 -0
  123. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/implementations/long_unsigneds.py +0 -0
  124. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/implementations/octet_string.py +0 -0
  125. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES/types/implementations/structs.py +0 -0
  126. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES.egg-info/SOURCES.txt +0 -0
  127. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES.egg-info/dependency_links.txt +0 -0
  128. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES.egg-info/requires.txt +0 -0
  129. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/DLMS_SPODES.egg-info/top_level.txt +0 -0
  130. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/src/__init__.py +0 -0
  131. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/__init__.py +0 -0
  132. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/collection_init.py +0 -0
  133. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/config.toml +0 -0
  134. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/config.zip +0 -0
  135. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/init_collection.py +0 -0
  136. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test.typ +0 -0
  137. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test.xml +0 -0
  138. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_ActivityCalendar.py +0 -0
  139. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_AssociationLN.py +0 -0
  140. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_COSEMInterfaceClass.py +0 -0
  141. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_Data.py +0 -0
  142. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_DemandRegister.py +0 -0
  143. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_DisconnectControl.py +0 -0
  144. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_DisplayReadoutProfile.py +0 -0
  145. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_GSMDiagnostic.py +0 -0
  146. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_IC.py +0 -0
  147. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_ImageTransfer.py +0 -0
  148. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_KPZ.py +0 -0
  149. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_LNPatterns.py +0 -0
  150. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_Limiter.py +0 -0
  151. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_NTPSetup.py +0 -0
  152. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_Parameter.py +0 -0
  153. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_ProfileGeneric.py +0 -0
  154. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_Register.py +0 -0
  155. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_RegisterActivation.py +0 -0
  156. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_RegisterMonitor.py +0 -0
  157. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_ScalerUnitType.py +0 -0
  158. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_Schedule.py +0 -0
  159. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_Structures.py +0 -0
  160. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_a_param.py +0 -0
  161. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_benchmark_create_obj.py +0 -0
  162. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_collection.py +0 -0
  163. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_config.py +0 -0
  164. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_electric_obj.py +0 -0
  165. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_enums.py +0 -0
  166. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_hdlc.py +0 -0
  167. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_overview.py +0 -0
  168. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_report.py +0 -0
  169. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_save_type.typ +0 -0
  170. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_settings.py +0 -0
  171. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_to_xml.xml +0 -0
  172. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_to_xml2.xml +0 -0
  173. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_to_xml3.xml +0 -0
  174. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/test/test_to_xml4.xml +0 -0
  175. {dlms_spodes-0.86.22 → dlms_spodes-0.87.0}/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.22
3
+ Version: 0.87.0
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.86.22"
17
+ version = "0.87.0"
18
18
  authors = [
19
19
  {name="Serj Kotilevski", email="youserj@outlook.com"}
20
20
  ]
@@ -1378,6 +1378,22 @@ class Collection:
1378
1378
  security_policy=security_policy
1379
1379
  )
1380
1380
 
1381
+ @lru_cache(maxsize=1000)
1382
+ def isnt_mutable(self,
1383
+ par: Parameter,
1384
+ association_id: int,
1385
+ security_policy: pdu.SecurityPolicy = pdu.SecurityPolicyVer0.NOTHING
1386
+ ) -> bool:
1387
+ """is not writable and STATIC data"""
1388
+ if (
1389
+ not self.is_writable(par.ln, par.i, association_id, security_policy, security_policy)
1390
+ and self.par2obj(par
1391
+ ).unwrap().getAElement(par.i
1392
+ ).unwrap().classifier == ic.Classifier.STATIC
1393
+ ):
1394
+ return True
1395
+ return False
1396
+
1381
1397
  @lru_cache(maxsize=1000)
1382
1398
  def is_accessible(self, ln: cst.LogicalName,
1383
1399
  index: int,
@@ -8,21 +8,14 @@ from typing import Iterator, Type, TypeAlias, Callable, Any, Self, Literal, Opti
8
8
  from ..types import cdt, ut, cst
9
9
  from StructResult import result
10
10
  from ..relation_to_OBIS import get_name
11
- import logging
12
11
  from enum import IntEnum
13
12
  from itertools import count
14
13
  from .. import exceptions as exc
15
14
  from .overview import ClassID
16
15
  from ..settings import settings
17
- from ..config_parser import get_values
18
16
  from .. import literals
19
17
 
20
18
 
21
- logger = logging.getLogger(__name__)
22
- logger.level = logging.INFO
23
-
24
- logger.info(F'Register start')
25
-
26
19
  _n_class = count(0)
27
20
 
28
21
 
@@ -4,6 +4,7 @@ import numpy as np
4
4
  from struct import Struct, pack, unpack_from
5
5
  from typing import Optional, cast, Iterator
6
6
  import re
7
+ from functools import cached_property
7
8
  from .. import exceptions as exc
8
9
  from .obis import OBIS
9
10
 
@@ -37,10 +38,10 @@ class Parameter:
37
38
  piece OPTIONAL
38
39
  }
39
40
  """
40
- value: bytes
41
+ _value: bytes
41
42
 
42
43
  def __bytes__(self) -> bytes:
43
- return self.value
44
+ return self._value
44
45
 
45
46
  @classmethod
46
47
  def parse(cls, value: str) -> "Parameter":
@@ -59,25 +60,29 @@ class Parameter:
59
60
  ret += (g1 + int(a)).to_bytes(2)
60
61
  return cls(ret)
61
62
 
63
+ @cached_property
64
+ def logical_name(self) -> "Parameter":
65
+ return self.get_attr(2)
66
+
62
67
  def __eq__(self, other) -> bool:
63
68
  if isinstance(other, Parameter):
64
- return cast("bool", self.value == other.value)
69
+ return cast("bool", self._value==other._value)
65
70
  return NotImplemented
66
71
 
67
72
  def __lt__(self, other: "Parameter") -> bool:
68
73
  """comparing for sort method"""
69
- if len(self.value) > len(other.value):
74
+ if len(self._value) > len(other._value):
70
75
  return True
71
76
  else:
72
77
  return False
73
78
 
74
79
  def __str__(self) -> str:
75
- if (l := len(self.value)) < 6:
80
+ if (l := len(self._value)) < 6:
76
81
  return "No valid"
77
82
  elif l == 7:
78
83
  return "No valid Index"
79
84
  else:
80
- res = F"{".".join(map(str, self.value[:6]))}"
85
+ res = F"{".".join(map(str, self._value[:6]))}"
81
86
  if l > 6:
82
87
  res += F":{"m" if self.is_method() else ""}{self.i}"
83
88
  if l > 8:
@@ -87,41 +92,51 @@ class Parameter:
87
92
  return res
88
93
 
89
94
  def validate(self) -> None:
90
- if (length := len(self.value)) < 6:
95
+ if (length := len(self._value)) < 6:
91
96
  raise exc.DLMSException(F"Parameter got {length=}, expected at least 6")
92
97
  if length == 7:
93
98
  raise exc.DLMSException(F"Parameter got wrong index")
94
99
 
95
100
  @property
96
101
  def has_index(self) -> bool:
97
- return len(self.value) > 6
102
+ return len(self._value) > 6
98
103
 
99
104
  @property
100
105
  @deprecated("use obis")
101
106
  def ln(self) -> bytes:
102
107
  """Logical Name"""
103
- return self.value[:6]
108
+ return self._value[:6]
104
109
 
105
110
  def is_method(self) -> bool:
106
- return self.value[6] == 1
111
+ return self._value[6] == 1
107
112
 
108
113
  @property
109
114
  def i(self) -> int:
110
115
  """attribute or method index"""
111
- return self.value[7]
116
+ return self._value[7]
117
+
118
+ def get_attr(self, i: int) -> "Parameter":
119
+ """get attribute"""
120
+ val = Index.pack(0, i)
121
+ return self.__class__(self._value[:6] + val)
122
+
123
+ def get_meth(self, i: int) -> "Parameter":
124
+ """get method"""
125
+ val = Index.pack(1, i)
126
+ return self.__class__(self._value[:6] + val)
112
127
 
113
128
  def set_i(self, index: int, is_method: bool = False) -> "Parameter":
114
129
  val = Index.pack(is_method, index)
115
- if len(self.value) == 6:
116
- tmp = self.value + val
130
+ if len(self._value) == 6:
131
+ tmp = self._value + val
117
132
  else:
118
- tmp = bytearray(self.value)
133
+ tmp = bytearray(self._value)
119
134
  tmp[6:8] = val
120
135
  tmp = bytes(tmp)
121
136
  return self.__class__(tmp)
122
137
 
123
138
  def append_validate(self) -> None:
124
- if (l := len(self.value)) < 7:
139
+ if (l := len(self._value)) < 7:
125
140
  raise exc.DLMSException(F"Parameter must has index before")
126
141
  elif l % 2 != 0:
127
142
  raise exc.DLMSException(F"Can't append to Parameter with piece")
@@ -129,11 +144,11 @@ class Parameter:
129
144
  def append(self, index: int) -> "Parameter":
130
145
  """add new sequence(array or struct) index element"""
131
146
  self.append_validate()
132
- return self.__class__(self.value + pack(">H", index))
147
+ return self.__class__(self._value + pack(">H", index))
133
148
 
134
149
  def extend(self, *indexes: int) -> "Parameter":
135
150
  self.append_validate()
136
- return self.__class__(self.value + pack(F">{len(indexes)}H", *indexes))
151
+ return self.__class__(self._value + pack(F">{len(indexes)}H", *indexes))
137
152
 
138
153
  def pop(self) -> tuple[Optional[int], int, "Parameter"]:
139
154
  """
@@ -141,20 +156,20 @@ class Parameter:
141
156
  ex.: Parameter("0.0.0.0.0.0:2 1/1/1 p3") => (1, Parameter("0.0.0.0.0.0:2 1/1"))
142
157
  """
143
158
  if self.has_piece():
144
- return self.value[-1], int.from_bytes(self.value[-3:-1]), self.__class__(self.value[:-3])
159
+ return self._value[-1], int.from_bytes(self._value[-3:-1]), self.__class__(self._value[:-3])
145
160
  else:
146
- return None, int.from_bytes(self.value[-2:]), self.__class__(self.value[:-2])
161
+ return None, int.from_bytes(self._value[-2:]), self.__class__(self._value[:-2])
147
162
 
148
163
  def set_piece(self, index: int) -> "Parameter":
149
164
  """add new sequence(array or struct) index element"""
150
- if len(self.value) >= 7:
151
- return self.__class__(self.value + pack("B", index))
165
+ if len(self._value) >= 7:
166
+ return self.__class__(self._value + pack("B", index))
152
167
  else:
153
168
  raise exc.DLMSException(F"Parameter must has index before")
154
169
 
155
170
  def has_piece(self) -> bool:
156
171
  if (
157
- (l := len(self.value)) >= 9
172
+ (l := len(self._value)) >= 9
158
173
  and l % 2 != 0
159
174
  ):
160
175
  return True
@@ -164,22 +179,22 @@ class Parameter:
164
179
  @property
165
180
  def piece(self) -> Optional[int]:
166
181
  if self.has_piece():
167
- return self.value[-1]
182
+ return self._value[-1]
168
183
 
169
184
  def clear_piece(self) -> "Parameter":
170
185
  if self.has_piece():
171
- return self.__class__(self.value[:-1])
186
+ return self.__class__(self._value[:-1])
172
187
 
173
188
  def elements(self, start: int = 0) -> Iterator[int]:
174
189
  """return: index elements nested in attribute, started with"""
175
190
  for i in range(8 + start, 8 + 2 * self.n_elements, 2):
176
- res = int.from_bytes(self.value[i:i+2], "big")
191
+ res = int.from_bytes(self._value[i:i + 2], "big")
177
192
  yield res
178
193
 
179
194
  def __iter__(self) -> Iterator[int]:
180
- for it in self.value[:6]:
195
+ for it in self._value[:6]:
181
196
  yield it
182
- if self.value[6] == 1:
197
+ if self._value[6] == 1:
183
198
  yield -self.i
184
199
  else:
185
200
  yield self.i
@@ -190,15 +205,15 @@ class Parameter:
190
205
  if self.n_elements == 0:
191
206
  raise ValueError("Parameter hasn't elements")
192
207
  if self.has_piece():
193
- val = self.value[-3: -1]
208
+ val = self._value[-3: -1]
194
209
  else:
195
- val = self.value[-2:]
210
+ val = self._value[-2:]
196
211
  return int.from_bytes(val, "big")
197
212
 
198
213
  @property
199
214
  def n_elements(self) -> int:
200
215
  """return: amount of elements nested in attribute"""
201
- return max(0, (len(self.value) - 8) // 2)
216
+ return max(0, (len(self._value) - 8) // 2)
202
217
 
203
218
  def set(self,
204
219
  a: int = None,
@@ -208,7 +223,7 @@ class Parameter:
208
223
  e: int = None,
209
224
  f: int = None
210
225
  ) -> "Parameter":
211
- val = bytearray(self.value)
226
+ val = bytearray(self._value)
212
227
  if a is not None:
213
228
  val[0] = a
214
229
  if b is not None:
@@ -224,52 +239,52 @@ class Parameter:
224
239
  return self.__class__(bytes(val))
225
240
 
226
241
  def __contains__(self, item: "Parameter"):
227
- return item.value in self.value
242
+ return item._value in self._value
228
243
 
229
244
  def __getitem__(self, item) -> Optional[int]:
230
245
  if self.n_elements > 0:
231
- return unpack_from(">H", self.value, item*2 + 8)[0]
246
+ return unpack_from(">H", self._value, item * 2 + 8)[0]
232
247
  else:
233
248
  return None
234
249
 
235
250
  @property
236
251
  def a(self) -> int:
237
- return self.value[0]
252
+ return self._value[0]
238
253
 
239
254
  @property
240
255
  def b(self) -> int:
241
- return self.value[1]
256
+ return self._value[1]
242
257
 
243
258
  @property
244
259
  def c(self) -> int:
245
- return self.value[2]
260
+ return self._value[2]
246
261
 
247
262
  @property
248
263
  def d(self) -> int:
249
- return self.value[3]
264
+ return self._value[3]
250
265
 
251
266
  @property
252
267
  def e(self) -> int:
253
- return self.value[4]
268
+ return self._value[4]
254
269
 
255
270
  @property
256
271
  def f(self) -> int:
257
- return self.value[5]
272
+ return self._value[5]
258
273
 
259
274
  @property
260
275
  def attr(self) -> "Parameter":
261
276
  if self.has_index:
262
- return Parameter(self.value[:8])
277
+ return Parameter(self._value[:8])
263
278
  else:
264
279
  raise exc.DLMSException(F"Parameter must has index before")
265
280
 
266
281
  @property
267
282
  def obj(self) -> "Parameter":
268
- return Parameter(self.value[:6])
283
+ return Parameter(self._value[:6])
269
284
 
270
285
  @property
271
286
  def obis(self) -> OBIS:
272
- return OBIS(self.value[:6])
287
+ return OBIS(self._value[:6])
273
288
 
274
289
 
275
290
  RANGE64 = bytes(range(65)) # Предвычисленный диапазон 0-64
@@ -0,0 +1,41 @@
1
+ from dataclasses import dataclass
2
+ from functools import cached_property
3
+ from typing import Self
4
+ from .parameter import Parameter
5
+
6
+
7
+ @dataclass(frozen=True)
8
+ class Data(Parameter):
9
+ @property
10
+ def value(self) -> Parameter:
11
+ return self.get_attr(2)
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class Register(Data):
16
+ @property
17
+ def scaler_unit(self) -> Parameter:
18
+ return self.get_attr(3)
19
+
20
+
21
+ @dataclass(frozen=True)
22
+ class DisconnectControl(Parameter):
23
+
24
+ @classmethod
25
+ def from_b(cls, b: int) -> "DisconnectControl":
26
+ return cls.parse(f"0.{b}.96.3.10.255")
27
+
28
+ @property
29
+ def output_state(self) -> "DisconnectControl":
30
+ return self.get_attr(2)
31
+
32
+ @property
33
+ def control_state(self) -> "DisconnectControl":
34
+ return self.get_attr(3)
35
+
36
+ @property
37
+ def control_mode(self) -> "DisconnectControl":
38
+ return self.get_attr(4)
39
+
40
+
41
+ DISCONNECT_CONTROL_0 = DisconnectControl.from_b(0)
@@ -18,7 +18,8 @@ class ParValues[T]:
18
18
  raise StopIteration
19
19
 
20
20
  def __iter__(self) -> Iterator[Parameter | T]:
21
- return iter((self.par, self.data))
21
+ yield self.par
22
+ yield self.data
22
23
 
23
24
  def __str__(self):
24
25
  return F"{self.par} - {self.data}"
@@ -26,4 +27,4 @@ class ParValues[T]:
26
27
 
27
28
  @dataclass(frozen=True)
28
29
  class ParData(ParValues[cdt.CommonDataType]):
29
- data: Optional[cdt.CommonDataType]
30
+ data: cdt.CommonDataType
@@ -478,11 +478,39 @@ class _AmNames(BaseModel):
478
478
  xDLMS_context_info: str = "xDLMS context info"
479
479
 
480
480
 
481
+ class Conformance(BaseModel):
482
+ reserved_zero: str = "reserved-zero"
483
+ general_protection: str = "general-protection"
484
+ general_block_transfer: str = "general-block-transfer"
485
+ read: str = "read"
486
+ write: str = "write"
487
+ unconfirmed_write: str = "unconfirmed-write"
488
+ reserved_six: str = "reserved-six"
489
+ reserved_seven: str = "reserved-seven"
490
+ attribute0_supported_with_set: str = "attribute0-supported-with-set"
491
+ priority_mgmt_supported: str = "priority-mgmt-supported"
492
+ attribute0_supported_with_get: str = "attribute0-supported-with-get"
493
+ block_transfer_with_get_or_read: str = "block-transfer-with-get-or-read"
494
+ block_transfer_with_set_or_write: str = "block-transfer-with-set-or-write"
495
+ block_transfer_with_action: str = "block-transfer-with-action"
496
+ multiple_references: str = "multiple-references"
497
+ information_report: str = "information-report"
498
+ data_notification: str = "data-notification"
499
+ access: str = "access"
500
+ parameterized_access: str = "parameterized-access"
501
+ get: str = "get"
502
+ set: str = "set"
503
+ selective_access: str = "selective-access"
504
+ event_notification: str = "event-notification"
505
+ action: str = "action"
506
+
507
+
481
508
  class Settings(BaseModel):
482
509
  collection: _Collection = Field(default_factory=_Collection)
483
510
  report: _Report = Field(default_factory=_Report)
484
511
  firmwares: list[_Firmware] = Field(default_factory=list)
485
512
  am_names: _AmNames = Field(default_factory=_AmNames)
513
+ class_name: dict[int, str] = Field(default={1: "Data"})
486
514
 
487
515
 
488
516
  if not os.path.isfile(path := ".//config.toml"):
@@ -1669,7 +1669,7 @@ class OctetString(_String, SimpleDataType):
1669
1669
  temp = list()
1670
1670
  for i in self.contents:
1671
1671
  temp.append(i if i > 32 else 63)
1672
- return bytes(temp).decode(encoding)
1672
+ return bytes(temp).decode(encoding, errors="ignore")
1673
1673
 
1674
1674
  def pretty_str(self) -> str:
1675
1675
  """decode to utf-8 or hex labal"""
@@ -1,5 +1,7 @@
1
1
  from ...types import common_data_types as cdt
2
2
  from ...config_parser import get_values
3
+ from ...settings import settings
4
+
3
5
 
4
6
  base = get_values("DLMS", "Conformance")
5
7
 
@@ -5,7 +5,7 @@ from typing import Type, Any, Callable
5
5
  from dataclasses import dataclass
6
6
  from ..types import common_data_types as cdt
7
7
  from ..exceptions import DLMSException
8
- from ..config_parser import get_values
8
+ from ..settings import settings
9
9
 
10
10
 
11
11
  class UserfulTypesException(DLMSException):
@@ -401,9 +401,9 @@ class CosemClassId(Unsigned16):
401
401
  - class_id-s from 32 768 to 65 535 are reserved for user group specific ICs.
402
402
  The DLMS UA reserves the right to assign ranges to individual manufacturers or user groups. """
403
403
 
404
- def __str__(self):
405
- if _class_names:
406
- return _class_names.get(self, repr(self))
404
+ def __str__(self) -> str:
405
+ if res := settings.class_name.get(int(self)):
406
+ return res
407
407
  else:
408
408
  return repr(self)
409
409
 
@@ -411,9 +411,6 @@ class CosemClassId(Unsigned16):
411
411
  return F"{self.__class__.__name__}({int(self)})"
412
412
 
413
413
 
414
- _class_names = {CosemClassId(k): v for k, v in class_names.items()} if (class_names := get_values("DLMS", "class_name")) else None
415
-
416
-
417
414
  class CosemObjectInstanceId(OCTET_STRING, UsefulType):
418
415
  LENGTH = 6
419
416
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: DLMS_SPODES
3
- Version: 0.86.22
3
+ Version: 0.87.0
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
@@ -63,10 +63,10 @@ class TestType(unittest.TestCase):
63
63
 
64
64
  def test_DateTime(self):
65
65
  data: cdt.DateTime
66
- data = cdt.DateTime.parse("1.1.0001")
67
- data = cdt.DateTime.parse("00:00:00")
68
- data = cdt.DateTime.parse("__.__.____ __:00")
66
+ data = cdt.DateTime.parse("1.1.2001")
67
+ # data = cdt.DateTime.parse("__.__.____ __:00")
69
68
  z = data.get_right_nearest_datetime(datetime.datetime.now(tz=datetime.timezone.utc))
69
+ z1 = data.get_left_nearest_datetime(datetime.datetime.now(tz=datetime.timezone.utc))
70
70
  pattern = datetime.datetime(2021, 1, 1, 10, tzinfo=datetime.timezone.utc)
71
71
  self.assertEqual((new := cdt.DateTime(pattern)).to_datetime(), pattern, 'init from datetime and decoding')
72
72
  data = cdt.DateTime("01.__.2021 10:00 700")
@@ -0,0 +1,12 @@
1
+ import unittest
2
+ from src.DLMS_SPODES.cosem_interface_classes.parameter import Parameter
3
+ from src.DLMS_SPODES.cosem_interface_classes import parameters as prs
4
+
5
+
6
+ class TestType(unittest.TestCase):
7
+ def test_one(self):
8
+ My = prs.Data.parse("0.0.0.1.0.255")
9
+ My2 = prs.Data.parse("0.0.1.1.0.255")
10
+ My3 = prs.Register.parse("0.2.1.1.0.255")
11
+
12
+ print(My.logical_name, My2.logical_name, My3.scaler_unit)
@@ -1,26 +0,0 @@
1
- from dataclasses import dataclass
2
- from functools import cached_property
3
- from .parameter import Parameter
4
-
5
-
6
- @dataclass
7
- class Base:
8
- OBIS: Parameter
9
-
10
- @cached_property
11
- def LN(self) -> Parameter:
12
- return self.OBIS.set_i(1)
13
-
14
-
15
- @dataclass
16
- class Data(Base):
17
- @cached_property
18
- def VALUE(self) -> Parameter:
19
- return self.OBIS.set_i(2)
20
-
21
-
22
- @dataclass
23
- class Register(Data):
24
- @cached_property
25
- def SCALER_UNIT(self) -> Parameter:
26
- return self.OBIS.set_i(3)
@@ -1,12 +0,0 @@
1
- import unittest
2
- from src.DLMS_SPODES.cosem_interface_classes.parameter import Parameter
3
- from src.DLMS_SPODES.cosem_interface_classes import parameters as prs
4
-
5
-
6
- class TestType(unittest.TestCase):
7
- def test_one(self):
8
- My = prs.Data(Parameter.parse("0.0.0.1.0.255"))
9
- My2 = prs.Data(Parameter.parse("0.0.1.1.0.255"))
10
- My3 = prs.Register(Parameter.parse("0.2.1.1.0.255"))
11
-
12
- print(My.LN, My2.LN, My3.SCALER_UNIT)
File without changes
File without changes
File without changes
File without changes