DLMS-SPODES 0.86.21__tar.gz → 0.86.23__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.21 → dlms_spodes-0.86.23}/PKG-INFO +1 -1
  2. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/pyproject.toml +1 -1
  3. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/collection.py +24 -21
  4. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py +0 -7
  5. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/pardata.py +3 -2
  6. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/settings.py +28 -0
  7. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/common_data_types.py +1 -1
  8. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/implementations/bitstrings.py +2 -0
  9. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/useful_types.py +4 -7
  10. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES.egg-info/PKG-INFO +1 -1
  11. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_cdt.py +3 -3
  12. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/.gitignore +0 -0
  13. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/README.md +0 -0
  14. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/config.toml +0 -0
  15. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/setup.cfg +0 -0
  16. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/Values/EN/__init__.py +0 -0
  17. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/Values/EN/actors.py +0 -0
  18. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/Values/EN/relation_to_obis_names.py +0 -0
  19. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/Values/RU/__init__.py +0 -0
  20. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/Values/RU/actors.py +0 -0
  21. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/Values/RU/relation_to_obis_names.py +0 -0
  22. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/Values/__init__.py +0 -0
  23. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/__init__.py +0 -0
  24. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/configEN.ini +0 -0
  25. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/config_parser.py +0 -0
  26. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/__class_init__.py +0 -0
  27. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/__init__.py +0 -0
  28. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/a_parameter.py +0 -0
  29. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/activity_calendar.py +0 -0
  30. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/arbitrator.py +0 -0
  31. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/association_ln/__init__.py +0 -0
  32. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/association_ln/abstract.py +0 -0
  33. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/association_ln/authentication_mechanism_name.py +0 -0
  34. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/association_ln/mechanism_id.py +0 -0
  35. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/association_ln/method.py +0 -0
  36. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver0.py +0 -0
  37. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver1.py +0 -0
  38. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver2.py +0 -0
  39. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver3.py +0 -0
  40. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/association_sn/__init__.py +0 -0
  41. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/association_sn/ver0.py +0 -0
  42. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/attr_indexes.py +0 -0
  43. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/clock.py +0 -0
  44. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/data.py +0 -0
  45. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/demand_register/__init__.py +0 -0
  46. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/demand_register/ver0.py +0 -0
  47. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/disconnect_control.py +0 -0
  48. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/extended_register.py +0 -0
  49. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/gprs_modem_setup.py +0 -0
  50. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/__init__.py +0 -0
  51. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver0.py +0 -0
  52. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver1.py +0 -0
  53. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver2.py +0 -0
  54. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/__init__.py +0 -0
  55. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver0.py +0 -0
  56. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver1.py +0 -0
  57. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/iec_local_port_setup.py +0 -0
  58. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/__init__.py +0 -0
  59. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/image_transfer_status.py +0 -0
  60. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/ver0.py +0 -0
  61. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/implementations/__init__.py +0 -0
  62. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/implementations/arbitrator.py +0 -0
  63. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/implementations/data.py +0 -0
  64. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/implementations/profile_generic.py +0 -0
  65. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/ipv4_setup.py +0 -0
  66. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/limiter.py +0 -0
  67. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/ln_pattern.py +0 -0
  68. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/__init__.py +0 -0
  69. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py +0 -0
  70. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py +0 -0
  71. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/__init__.py +0 -0
  72. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/ver0.py +0 -0
  73. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/obis.py +0 -0
  74. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/overview.py +0 -0
  75. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/parameter.py +0 -0
  76. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/parameters.py +0 -0
  77. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/__init__.py +0 -0
  78. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver0.py +0 -0
  79. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py +0 -0
  80. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/push_setup/__init__.py +0 -0
  81. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver0.py +0 -0
  82. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver1.py +0 -0
  83. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver2.py +0 -0
  84. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/register.py +0 -0
  85. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/register_activation/__init__.py +0 -0
  86. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/register_activation/ver0.py +0 -0
  87. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/register_monitor.py +0 -0
  88. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/reports.py +0 -0
  89. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/schedule.py +0 -0
  90. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/script_table.py +0 -0
  91. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__init__.py +0 -0
  92. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__pycache__/__init__.cpython-311.pyc +0 -0
  93. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver0.py +0 -0
  94. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver1.py +0 -0
  95. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/single_action_schedule.py +0 -0
  96. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/special_days_table.py +0 -0
  97. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_interface_classes/tcp_udp_setup.py +0 -0
  98. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/cosem_pdu.py +0 -0
  99. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/enums.py +0 -0
  100. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/exceptions.py +0 -0
  101. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/firmwares.py +0 -0
  102. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/hdlc/__init__.py +0 -0
  103. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/hdlc/frame.py +0 -0
  104. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/hdlc/sub_layer.py +0 -0
  105. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/literals.py +0 -0
  106. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/obis/__init__.py +0 -0
  107. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/obis/abstract_objects.py +0 -0
  108. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/obis/media_id.py +0 -0
  109. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/pdu_enums.py +0 -0
  110. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/py.typed +0 -0
  111. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/relation_to_OBIS.py +0 -0
  112. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/__init__.py +0 -0
  113. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/choices.py +0 -0
  114. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/cosem_service_types.py +0 -0
  115. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/implementations/__init__.py +0 -0
  116. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/implementations/arrays.py +0 -0
  117. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/implementations/double_long_usingneds.py +0 -0
  118. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/implementations/enums.py +0 -0
  119. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/implementations/integers.py +0 -0
  120. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/implementations/long_unsigneds.py +0 -0
  121. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/implementations/octet_string.py +0 -0
  122. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES/types/implementations/structs.py +0 -0
  123. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES.egg-info/SOURCES.txt +0 -0
  124. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES.egg-info/dependency_links.txt +0 -0
  125. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES.egg-info/requires.txt +0 -0
  126. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/DLMS_SPODES.egg-info/top_level.txt +0 -0
  127. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/src/__init__.py +0 -0
  128. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/__init__.py +0 -0
  129. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/collection_init.py +0 -0
  130. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/config.toml +0 -0
  131. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/config.zip +0 -0
  132. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/init_collection.py +0 -0
  133. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test.typ +0 -0
  134. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test.xml +0 -0
  135. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_ActivityCalendar.py +0 -0
  136. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_AssociationLN.py +0 -0
  137. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_COSEMInterfaceClass.py +0 -0
  138. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_Data.py +0 -0
  139. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_DemandRegister.py +0 -0
  140. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_DisconnectControl.py +0 -0
  141. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_DisplayReadoutProfile.py +0 -0
  142. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_GSMDiagnostic.py +0 -0
  143. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_IC.py +0 -0
  144. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_ImageTransfer.py +0 -0
  145. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_KPZ.py +0 -0
  146. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_LNPatterns.py +0 -0
  147. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_Limiter.py +0 -0
  148. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_NTPSetup.py +0 -0
  149. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_Parameter.py +0 -0
  150. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_ProfileGeneric.py +0 -0
  151. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_Register.py +0 -0
  152. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_RegisterActivation.py +0 -0
  153. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_RegisterMonitor.py +0 -0
  154. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_ScalerUnitType.py +0 -0
  155. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_Schedule.py +0 -0
  156. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_Structures.py +0 -0
  157. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_a_param.py +0 -0
  158. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_benchmark_create_obj.py +0 -0
  159. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_collection.py +0 -0
  160. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_config.py +0 -0
  161. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_electric_obj.py +0 -0
  162. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_enums.py +0 -0
  163. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_hdlc.py +0 -0
  164. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_overview.py +0 -0
  165. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_pars.py +0 -0
  166. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_report.py +0 -0
  167. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_save_type.typ +0 -0
  168. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_settings.py +0 -0
  169. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_to_xml.xml +0 -0
  170. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_to_xml2.xml +0 -0
  171. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_to_xml3.xml +0 -0
  172. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/test/test_to_xml4.xml +0 -0
  173. {dlms_spodes-0.86.21 → dlms_spodes-0.86.23}/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.21
3
+ Version: 0.86.23
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.21"
17
+ version = "0.86.23"
18
18
  authors = [
19
19
  {name="Serj Kotilevski", email="youserj@outlook.com"}
20
20
  ]
@@ -946,7 +946,7 @@ class Collection:
946
946
 
947
947
  def get_object(self, value: LNContaining) -> InterfaceClass:
948
948
  """ return object from obis<string> or raise exception if it absence """
949
- return self.__get_object(lnContents2obis(value))
949
+ return self.obis2obj(lnContents2obis(value)).unwrap()
950
950
 
951
951
  @deprecated("use <par2rep>")
952
952
  def get_report(self,
@@ -1114,7 +1114,7 @@ class Collection:
1114
1114
  """return only association objects"""
1115
1115
  ret = list()
1116
1116
  for olt in self.getASSOCIATION(ass_id).object_list:
1117
- ret.append(self.__get_object(olt.logical_name.contents))
1117
+ ret.append(self.par2obj(Parameter(olt.logical_name.contents)).unwrap())
1118
1118
  return ret
1119
1119
 
1120
1120
  def sap2objects(self, value: enums.ClientSAP) -> result.List[ic.COSEMInterfaceClasses]:
@@ -1138,11 +1138,6 @@ class Collection:
1138
1138
  ret.append(obj)
1139
1139
  return ret
1140
1140
 
1141
-
1142
- def get_attr(self, value: ut.CosemAttributeDescriptor) -> cdt.CommonDataTypes:
1143
- """attribute value from descriptor"""
1144
- return self.__get_object(value.instance_id.contents).get_attr(int(value.attribute_id))
1145
-
1146
1141
  def get_first(self, values: list[str | bytes | cst.LogicalName]) -> InterfaceClass:
1147
1142
  """ return first object from it exist in collection from value"""
1148
1143
  for val in values:
@@ -1199,7 +1194,7 @@ class Collection:
1199
1194
  def copy_obj_attr_values_from(self, other: InterfaceClass) -> bool:
1200
1195
  """ copy all attributes value from other and return bool result """
1201
1196
  try:
1202
- obj: InterfaceClass = self.__get_object(other.get_obis())
1197
+ obj: InterfaceClass = self.par2obj(Parameter(other.logical_name.contents)).unwrap()
1203
1198
  for i, attr in other.get_index_with_attributes(in_init_order=True):
1204
1199
  if i == 1:
1205
1200
  continue
@@ -1217,18 +1212,10 @@ class Collection:
1217
1212
  else:
1218
1213
  return False
1219
1214
 
1220
- @deprecated("use <obis2obj>")
1221
- def __get_object(self, obis: bytes) -> InterfaceClass:
1222
- if (obj := self.__objs.get(obis)) is None:
1223
- logical_name = cst.LogicalName(bytearray(obis))
1224
- raise exc.NoObject(F"{get_name(logical_name)}:{logical_name} is absence")
1225
- else:
1226
- return obj
1227
-
1228
1215
  def obis2obj(self, obis: o.OBIS) -> result.SimpleOrError[InterfaceClass]:
1229
1216
  if obj := self.__objs.get(obis):
1230
- return result.Error.from_e(exc.NoObject(obis))
1231
- return result.Simple(obj)
1217
+ return result.Simple(obj)
1218
+ return result.Error.from_e(exc.NoObject(obis))
1232
1219
 
1233
1220
  def logicalName2obj(self, ln: cst.LogicalName) -> result.SimpleOrError[InterfaceClass]:
1234
1221
  return self.obis2obj(o.OBIS(ln.contents))
@@ -1317,14 +1304,14 @@ class Collection:
1317
1304
 
1318
1305
  def get_script_names(self, ln: cst.LogicalName, selector: cdt.LongUnsigned) -> str:
1319
1306
  """return name from script by selector"""
1320
- obj = self.__get_object(bytes(ln))
1307
+ obj = self.par2obj(Parameter(ln.contents))
1321
1308
  if isinstance(obj, ScriptTable):
1322
1309
  for script in obj.scripts:
1323
1310
  script: ScriptTable.scripts
1324
1311
  if script.script_identifier == selector:
1325
1312
  names: list[str] = list()
1326
1313
  for action in script.actions:
1327
- action_obj = self.__get_object(bytes(action.logical_name))
1314
+ action_obj = self.par2obj(Parameter(action.logical_name.contents)).unwrap()
1328
1315
  if int(action_obj.CLASS_ID) != int(action.class_id):
1329
1316
  raise ValueError(F"got {action_obj.CLASS_ID}, expected {action.class_id}")
1330
1317
  match int(action.service_id):
@@ -1391,6 +1378,22 @@ class Collection:
1391
1378
  security_policy=security_policy
1392
1379
  )
1393
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
+
1394
1397
  @lru_cache(maxsize=1000)
1395
1398
  def is_accessible(self, ln: cst.LogicalName,
1396
1399
  index: int,
@@ -1409,7 +1412,7 @@ class Collection:
1409
1412
  def get_name_and_type(self, value: structs.CaptureObjectDefinition) -> tuple[list[str], Type[cdt.CommonDataType]]:
1410
1413
  """ return names and type of element from collection"""
1411
1414
  names: list[str] = list()
1412
- obj = self.__get_object(value.logical_name.contents)
1415
+ obj = self.par2obj(Parameter(value.logical_name.contents)).unwrap()
1413
1416
  names.append(get_name(obj.logical_name))
1414
1417
  attr_index = int(value.attribute_index)
1415
1418
  data_index = int(value.data_index)
@@ -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
 
@@ -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.21
3
+ Version: 0.86.23
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")
File without changes
File without changes
File without changes
File without changes