DLMS-SPODES 0.87.0__tar.gz → 0.87.2__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 (174) hide show
  1. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/PKG-INFO +1 -1
  2. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/pyproject.toml +1 -1
  3. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/config_parser.py +2 -7
  4. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/collection.py +6 -9
  5. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/parameter.py +26 -24
  6. dlms_spodes-0.87.2/src/DLMS_SPODES/cosem_interface_classes/parameters.py +108 -0
  7. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/hdlc/frame.py +5 -9
  8. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/implementations/integers.py +5 -0
  9. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES.egg-info/PKG-INFO +1 -1
  10. dlms_spodes-0.87.0/src/DLMS_SPODES/cosem_interface_classes/parameters.py +0 -41
  11. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/.gitignore +0 -0
  12. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/README.md +0 -0
  13. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/config.toml +0 -0
  14. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/setup.cfg +0 -0
  15. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/Values/EN/__init__.py +0 -0
  16. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/Values/EN/actors.py +0 -0
  17. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/Values/EN/relation_to_obis_names.py +0 -0
  18. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/Values/RU/__init__.py +0 -0
  19. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/Values/RU/actors.py +0 -0
  20. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/Values/RU/relation_to_obis_names.py +0 -0
  21. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/Values/__init__.py +0 -0
  22. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/__init__.py +0 -0
  23. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/configEN.ini +0 -0
  24. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/__class_init__.py +0 -0
  25. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/__init__.py +0 -0
  26. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/a_parameter.py +0 -0
  27. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/activity_calendar.py +0 -0
  28. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/arbitrator.py +0 -0
  29. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/association_ln/__init__.py +0 -0
  30. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/association_ln/abstract.py +0 -0
  31. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/association_ln/authentication_mechanism_name.py +0 -0
  32. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/association_ln/mechanism_id.py +0 -0
  33. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/association_ln/method.py +0 -0
  34. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver0.py +0 -0
  35. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver1.py +0 -0
  36. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver2.py +0 -0
  37. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver3.py +0 -0
  38. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/association_sn/__init__.py +0 -0
  39. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/association_sn/ver0.py +0 -0
  40. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/attr_indexes.py +0 -0
  41. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/clock.py +0 -0
  42. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py +0 -0
  43. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/data.py +0 -0
  44. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/demand_register/__init__.py +0 -0
  45. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/demand_register/ver0.py +0 -0
  46. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/disconnect_control.py +0 -0
  47. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/extended_register.py +0 -0
  48. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/gprs_modem_setup.py +0 -0
  49. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/__init__.py +0 -0
  50. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver0.py +0 -0
  51. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver1.py +0 -0
  52. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver2.py +0 -0
  53. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/__init__.py +0 -0
  54. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver0.py +0 -0
  55. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver1.py +0 -0
  56. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/iec_local_port_setup.py +0 -0
  57. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/__init__.py +0 -0
  58. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/image_transfer_status.py +0 -0
  59. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/ver0.py +0 -0
  60. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/implementations/__init__.py +0 -0
  61. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/implementations/arbitrator.py +0 -0
  62. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/implementations/data.py +0 -0
  63. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/implementations/profile_generic.py +0 -0
  64. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/ipv4_setup.py +0 -0
  65. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/limiter.py +0 -0
  66. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/ln_pattern.py +0 -0
  67. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/__init__.py +0 -0
  68. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py +0 -0
  69. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py +0 -0
  70. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/__init__.py +0 -0
  71. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/ver0.py +0 -0
  72. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/obis.py +0 -0
  73. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/overview.py +0 -0
  74. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/__init__.py +0 -0
  75. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver0.py +0 -0
  76. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py +0 -0
  77. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/push_setup/__init__.py +0 -0
  78. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver0.py +0 -0
  79. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver1.py +0 -0
  80. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver2.py +0 -0
  81. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/register.py +0 -0
  82. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/register_activation/__init__.py +0 -0
  83. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/register_activation/ver0.py +0 -0
  84. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/register_monitor.py +0 -0
  85. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/reports.py +0 -0
  86. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/schedule.py +0 -0
  87. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/script_table.py +0 -0
  88. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__init__.py +0 -0
  89. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__pycache__/__init__.cpython-311.pyc +0 -0
  90. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver0.py +0 -0
  91. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver1.py +0 -0
  92. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/single_action_schedule.py +0 -0
  93. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/special_days_table.py +0 -0
  94. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_interface_classes/tcp_udp_setup.py +0 -0
  95. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/cosem_pdu.py +0 -0
  96. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/enums.py +0 -0
  97. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/exceptions.py +0 -0
  98. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/firmwares.py +0 -0
  99. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/hdlc/__init__.py +0 -0
  100. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/hdlc/sub_layer.py +0 -0
  101. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/literals.py +0 -0
  102. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/obis/__init__.py +0 -0
  103. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/obis/abstract_objects.py +0 -0
  104. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/obis/media_id.py +0 -0
  105. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/pardata.py +0 -0
  106. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/pdu_enums.py +0 -0
  107. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/py.typed +0 -0
  108. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/relation_to_OBIS.py +0 -0
  109. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/settings.py +0 -0
  110. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/__init__.py +0 -0
  111. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/choices.py +0 -0
  112. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/common_data_types.py +0 -0
  113. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/cosem_service_types.py +0 -0
  114. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/implementations/__init__.py +0 -0
  115. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/implementations/arrays.py +0 -0
  116. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/implementations/bitstrings.py +0 -0
  117. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/implementations/double_long_usingneds.py +0 -0
  118. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/implementations/enums.py +0 -0
  119. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/implementations/long_unsigneds.py +0 -0
  120. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/implementations/octet_string.py +0 -0
  121. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/implementations/structs.py +0 -0
  122. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES/types/useful_types.py +0 -0
  123. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES.egg-info/SOURCES.txt +0 -0
  124. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES.egg-info/dependency_links.txt +0 -0
  125. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES.egg-info/requires.txt +0 -0
  126. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/DLMS_SPODES.egg-info/top_level.txt +0 -0
  127. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/src/__init__.py +0 -0
  128. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/__init__.py +0 -0
  129. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/collection_init.py +0 -0
  130. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/config.toml +0 -0
  131. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/config.zip +0 -0
  132. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/init_collection.py +0 -0
  133. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test.typ +0 -0
  134. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test.xml +0 -0
  135. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_ActivityCalendar.py +0 -0
  136. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_AssociationLN.py +0 -0
  137. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_COSEMInterfaceClass.py +0 -0
  138. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_Data.py +0 -0
  139. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_DemandRegister.py +0 -0
  140. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_DisconnectControl.py +0 -0
  141. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_DisplayReadoutProfile.py +0 -0
  142. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_GSMDiagnostic.py +0 -0
  143. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_IC.py +0 -0
  144. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_ImageTransfer.py +0 -0
  145. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_KPZ.py +0 -0
  146. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_LNPatterns.py +0 -0
  147. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_Limiter.py +0 -0
  148. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_NTPSetup.py +0 -0
  149. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_Parameter.py +0 -0
  150. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_ProfileGeneric.py +0 -0
  151. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_Register.py +0 -0
  152. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_RegisterActivation.py +0 -0
  153. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_RegisterMonitor.py +0 -0
  154. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_ScalerUnitType.py +0 -0
  155. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_Schedule.py +0 -0
  156. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_Structures.py +0 -0
  157. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_a_param.py +0 -0
  158. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_benchmark_create_obj.py +0 -0
  159. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_cdt.py +0 -0
  160. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_collection.py +0 -0
  161. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_config.py +0 -0
  162. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_electric_obj.py +0 -0
  163. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_enums.py +0 -0
  164. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_hdlc.py +0 -0
  165. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_overview.py +0 -0
  166. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_pars.py +0 -0
  167. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_report.py +0 -0
  168. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_save_type.typ +0 -0
  169. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_settings.py +0 -0
  170. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_to_xml.xml +0 -0
  171. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_to_xml2.xml +0 -0
  172. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_to_xml3.xml +0 -0
  173. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/test/test_to_xml4.xml +0 -0
  174. {dlms_spodes-0.87.0 → dlms_spodes-0.87.2}/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.0
3
+ Version: 0.87.2
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.0"
17
+ version = "0.87.2"
18
18
  authors = [
19
19
  {name="Serj Kotilevski", email="youserj@outlook.com"}
20
20
  ]
@@ -1,4 +1,3 @@
1
- import logging
2
1
  import os
3
2
  import tomllib
4
3
  from typing_extensions import deprecated
@@ -6,9 +5,6 @@ from typing_extensions import deprecated
6
5
 
7
6
  print("Path: ", os.getcwd())
8
7
 
9
- logger = logging.getLogger(__name__)
10
- logger.level = logging.INFO
11
-
12
8
 
13
9
  @deprecated("use settings.settings")
14
10
  def get_values(*args: str) -> dict | None:
@@ -20,7 +16,7 @@ def get_values(*args: str) -> dict | None:
20
16
  par = par[key]
21
17
  continue
22
18
  except KeyError as e:
23
- logger.info(e.args[0])
19
+ print(f"error: {e.args[0]}")
24
20
  return None
25
21
  return par
26
22
 
@@ -28,10 +24,9 @@ def get_values(*args: str) -> dict | None:
28
24
  if not os.path.isfile(path := ".//config.toml"):
29
25
  path = F"{os.path.dirname(__file__)}{path}"
30
26
  elif not os.path.isfile(path):
31
- logger.warning("NOT FIND CONFIGURATION: <config.toml>")
27
+ print("NOT FIND CONFIGURATION: <config.toml>")
32
28
  with open(path, "rb") as f:
33
29
  config = tomllib.load(f)
34
- logger.info(F"Find configuration <config.toml> with path: {f}")
35
30
  print(F"Find configuration <config.toml> with path: {f}")
36
31
 
37
32
  _messages = get_values("DLMS", "messages")
@@ -8,7 +8,6 @@ from dataclasses import dataclass
8
8
  from itertools import count, chain
9
9
  from functools import reduce, cached_property, lru_cache
10
10
  from typing import TypeAlias, Iterator, Type, Self, Callable, Literal, Iterable, Optional, Hashable
11
- import logging
12
11
  from semver import Version as SemVer
13
12
  from StructResult import result
14
13
  from ..types import common_data_types as cdt, cosem_service_types as cst, useful_types as ut
@@ -275,8 +274,6 @@ _UNDER_OVER_LIMIT_MAGNITUDES = (34, 38)
275
274
  _NOT_PROCESSING_OF_MEASUREMENT_VALUES = tuple(set(range(256)).difference((0, 93, 94, 96, 97, 98, 99))) # BlueBook DLMS UA 1000-1 Ed.14 7.5.2.1 Table 66
276
275
  _RU_CHANGE_LIMIT_LEVEL = 134
277
276
 
278
- logger = logging.getLogger(__name__)
279
- logger.level = logging.INFO
280
277
 
281
278
 
282
279
  @dataclass(frozen=True)
@@ -683,7 +680,7 @@ class Collection:
683
680
  """ all DLMS objects container with obis key """
684
681
 
685
682
  @property
686
- def id(self) -> ID | None:
683
+ def id(self) -> ID:
687
684
  return self.__id
688
685
 
689
686
  def set_id(self, value: ID):
@@ -740,7 +737,7 @@ class Collection:
740
737
  value=value.encoding,
741
738
  data_type=source.get_attr(i).__class__)
742
739
  except exc.EmptyObj as e:
743
- logger.warning(F"can't copy {target} attr={i}, skipped. {e}")
740
+ print(F"can't copy {target} attr={i}, skipped. {e}")
744
741
 
745
742
  def copy(self) -> result.Simple["Collection"]:
746
743
  """copy collection with value by Association"""
@@ -898,7 +895,7 @@ class Collection:
898
895
  func_map=func_maps[self.spec_map])(logical_name)
899
896
  new_object.collection = self
900
897
  self.__objs[o.OBIS(logical_name.contents)] = new_object
901
- logger.info(F'Create {new_object}')
898
+ print(F'Create {new_object}')
902
899
  return new_object
903
900
  except ValueError as e:
904
901
  raise ValueError(F"error getting DLMS object instance with {class_id=} {version=} {logical_name=}: {e}")
@@ -1186,7 +1183,7 @@ class Collection:
1186
1183
  obj=self.get_object(obj_def.logical_name),
1187
1184
  par=bytes([int(obj_def.attribute_index)]))
1188
1185
  except ic.EmptyAttribute as e:
1189
- logger.error(F"Can't fill Scaler and Unit for {get_name(obj_def.logical_name)}: {e}")
1186
+ print(F"Can't fill Scaler and Unit for {get_name(obj_def.logical_name)}: {e}")
1190
1187
  finally:
1191
1188
  res.append(s_u)
1192
1189
  return res
@@ -1495,7 +1492,7 @@ class Collection:
1495
1492
  continue
1496
1493
  indexes.append(-i)
1497
1494
  except exc.ITEApplication as e:
1498
- logger.error(F"skip {i}... methods for {obj}: {e}")
1495
+ print(F"skip {i}... methods for {obj}: {e}")
1499
1496
  break
1500
1497
  if len(indexes) != 0:
1501
1498
  objects[obj] = indexes
@@ -2090,7 +2087,7 @@ class Template:
2090
2087
  obj_col = col.get_object(ln)
2091
2088
  except exc.NoObject as e:
2092
2089
  ret.append(e)
2093
- logger.warning(F"<add_collection> skip obj{self}: {e}")
2090
+ print(F"<add_collection> skip obj{self}: {e}")
2094
2091
  continue
2095
2092
  for i in indexes:
2096
2093
  if (attr := obj.get_attr(i)) is not None:
@@ -1,8 +1,8 @@
1
1
  from typing_extensions import deprecated
2
- from dataclasses import dataclass
2
+ from dataclasses import dataclass, field
3
3
  import numpy as np
4
4
  from struct import Struct, pack, unpack_from
5
- from typing import Optional, cast, Iterator
5
+ from typing import Optional, cast, Iterator, Self
6
6
  import re
7
7
  from functools import cached_property
8
8
  from .. import exceptions as exc
@@ -44,7 +44,7 @@ class Parameter:
44
44
  return self._value
45
45
 
46
46
  @classmethod
47
- def parse(cls, value: str) -> "Parameter":
47
+ def parse(cls, value: str) -> Self:
48
48
  """create from string. Only LN, attr/meth type ddd.ddd.ddd.ddd.ddd.ddd:aaa, ex.: 0.0.1.0.0.255 """
49
49
  if (res := _pattern.fullmatch(value)) is None:
50
50
  raise ValueError(F"in {cls.__name__}.parse got wrong :{value:}")
@@ -64,7 +64,7 @@ class Parameter:
64
64
  def logical_name(self) -> "Parameter":
65
65
  return self.get_attr(2)
66
66
 
67
- def __eq__(self, other) -> bool:
67
+ def __eq__(self, other: object) -> bool:
68
68
  if isinstance(other, Parameter):
69
69
  return cast("bool", self._value==other._value)
70
70
  return NotImplemented
@@ -115,12 +115,12 @@ class Parameter:
115
115
  """attribute or method index"""
116
116
  return self._value[7]
117
117
 
118
- def get_attr(self, i: int) -> "Parameter":
118
+ def get_attr(self, i: int) -> Self:
119
119
  """get attribute"""
120
120
  val = Index.pack(0, i)
121
121
  return self.__class__(self._value[:6] + val)
122
122
 
123
- def get_meth(self, i: int) -> "Parameter":
123
+ def get_meth(self, i: int) -> Self:
124
124
  """get method"""
125
125
  val = Index.pack(1, i)
126
126
  return self.__class__(self._value[:6] + val)
@@ -130,9 +130,9 @@ class Parameter:
130
130
  if len(self._value) == 6:
131
131
  tmp = self._value + val
132
132
  else:
133
- tmp = bytearray(self._value)
134
- tmp[6:8] = val
135
- tmp = bytes(tmp)
133
+ tmp_ = bytearray(self._value)
134
+ tmp_[6:8] = val
135
+ tmp = bytes(tmp_)
136
136
  return self.__class__(tmp)
137
137
 
138
138
  def append_validate(self) -> None:
@@ -180,10 +180,12 @@ class Parameter:
180
180
  def piece(self) -> Optional[int]:
181
181
  if self.has_piece():
182
182
  return self._value[-1]
183
+ return None
183
184
 
184
185
  def clear_piece(self) -> "Parameter":
185
186
  if self.has_piece():
186
187
  return self.__class__(self._value[:-1])
188
+ return self
187
189
 
188
190
  def elements(self, start: int = 0) -> Iterator[int]:
189
191
  """return: index elements nested in attribute, started with"""
@@ -216,12 +218,12 @@ class Parameter:
216
218
  return max(0, (len(self._value) - 8) // 2)
217
219
 
218
220
  def set(self,
219
- a: int = None,
220
- b: int = None,
221
- c: int = None,
222
- d: int = None,
223
- e: int = None,
224
- f: int = None
221
+ a: Optional[int] = None,
222
+ b: Optional[int] = None,
223
+ c: Optional[int] = None,
224
+ d: Optional[int] = None,
225
+ e: Optional[int] = None,
226
+ f: Optional[int] = None
225
227
  ) -> "Parameter":
226
228
  val = bytearray(self._value)
227
229
  if a is not None:
@@ -238,12 +240,12 @@ class Parameter:
238
240
  val[5] = f
239
241
  return self.__class__(bytes(val))
240
242
 
241
- def __contains__(self, item: "Parameter"):
243
+ def __contains__(self, item: "Parameter") -> bool:
242
244
  return item._value in self._value
243
245
 
244
- def __getitem__(self, item) -> Optional[int]:
246
+ def __getitem__(self, item: int) -> Optional[int]:
245
247
  if self.n_elements > 0:
246
- return unpack_from(">H", self._value, item * 2 + 8)[0]
248
+ return cast(int, unpack_from(">H", self._value, item * 2 + 8)[0])
247
249
  else:
248
250
  return None
249
251
 
@@ -296,12 +298,12 @@ class ParPattern:
296
298
  positions: tuple[int, ...]
297
299
  "7 elements , -1 is SKIP, last element is attribute index if positive and method index else negative"
298
300
 
299
- def __post_init__(self):
301
+ def __post_init__(self) -> None:
300
302
  if 6 > len(self.positions) > 7:
301
303
  raise ValueError(f"positions must have exactly 6 elements, got {len(self.positions)}")
302
304
 
303
305
  @classmethod
304
- def parse(cls, pattern: str) -> 'LNPattern':
306
+ def parse(cls, pattern: str) -> "ParPattern":
305
307
  """Парсинг строк вида:
306
308
  - "a.0.(1,2,3).(0-64).0.f" (6 элементов)
307
309
  - "a.0.1.0.0.f:2" (6 элементов + индекс через :)
@@ -379,7 +381,7 @@ class ParPattern:
379
381
  @staticmethod
380
382
  def _parse_group(group_str: str) -> set[int]:
381
383
  """Парсинг групп вида '1,2,3' или '10-20'"""
382
- elements = set()
384
+ elements: set[int] = set()
383
385
  for item in group_str.split(','):
384
386
  item = item.strip()
385
387
  if '-' in item:
@@ -392,7 +394,7 @@ class ParPattern:
392
394
  # @functools.cache
393
395
  def __hash__(self) -> int:
394
396
  print("hash")
395
- hash_parts = []
397
+ hash_parts: list[Optional[bytes]] = []
396
398
  for pos in self.positions:
397
399
  if pos == -1:
398
400
  hash_parts.append(None)
@@ -475,9 +477,9 @@ class ParPattern:
475
477
  class PatternMatcher:
476
478
  """Класс для быстрого сопоставления Parameter с ParPattern"""
477
479
  patterns: dict['ParPattern', str]
478
- _masks: list[tuple[tuple[np.ndarray, ...], str]] = None
480
+ _masks: list[tuple[tuple[np.ndarray, ...], str]] = field(init=False)
479
481
 
480
- def __post_init__(self):
482
+ def __post_init__(self) -> None:
481
483
  # Предварительная обработка шаблонов
482
484
  masks = []
483
485
  for pattern, value in self.patterns.items():
@@ -0,0 +1,108 @@
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
+ class ActiveFirmwareIdentifier(Data):
15
+
16
+ @classmethod
17
+ def from_b(cls, b: int) -> "ActiveFirmwareIdentifier":
18
+ return cls.parse(f"0.{b}.0.2.0.255")
19
+
20
+
21
+ ACTIVE_FIRMWARE_IDENTIFIER_0 = ActiveFirmwareIdentifier.from_b(0)
22
+
23
+
24
+ @dataclass(frozen=True)
25
+ class Register(Data):
26
+ @property
27
+ def scaler_unit(self) -> Parameter:
28
+ return self.get_attr(3)
29
+
30
+
31
+ @dataclass(frozen=True)
32
+ class DisconnectControl(Parameter):
33
+
34
+ @classmethod
35
+ def from_b(cls, b: int) -> "DisconnectControl":
36
+ return cls.parse(f"0.{b}.96.3.10.255")
37
+
38
+ @property
39
+ def output_state(self) -> "DisconnectControl":
40
+ return self.get_attr(2)
41
+
42
+ @property
43
+ def control_state(self) -> "DisconnectControl":
44
+ return self.get_attr(3)
45
+
46
+ @property
47
+ def control_mode(self) -> "DisconnectControl":
48
+ return self.get_attr(4)
49
+
50
+ @property
51
+ def remote_disconnect(self) -> "DisconnectControl":
52
+ return self.get_meth(1)
53
+
54
+ @property
55
+ def remote_reconnect(self) -> "DisconnectControl":
56
+ return self.get_meth(2)
57
+
58
+
59
+ DISCONNECT_CONTROL_0 = DisconnectControl.from_b(0)
60
+
61
+
62
+ @dataclass(frozen=True)
63
+ class ImageTransfer(Parameter):
64
+ @classmethod
65
+ def from_e(cls, e: int = 0) -> "ImageTransfer":
66
+ return cls.parse(f"0.0.44.0.{e}.255")
67
+
68
+ @property
69
+ def image_block_size(self) -> "ImageTransfer":
70
+ return self.get_attr(2)
71
+
72
+ @property
73
+ def image_transferred_blocks_status(self) -> "ImageTransfer":
74
+ return self.get_attr(3)
75
+
76
+ @property
77
+ def image_first_not_transferred_block_number(self) -> "ImageTransfer":
78
+ return self.get_attr(4)
79
+
80
+ @property
81
+ def image_transfer_enabled(self) -> "ImageTransfer":
82
+ return self.get_attr(5)
83
+
84
+ @property
85
+ def image_transfer_status(self) -> "ImageTransfer":
86
+ return self.get_attr(6)
87
+
88
+ @property
89
+ def image_to_activate_info(self) -> "ImageTransfer":
90
+ return self.get_attr(7)
91
+
92
+ @property
93
+ def image_transfer_initiate(self) -> "ImageTransfer":
94
+ return self.get_meth(1)
95
+
96
+ @property
97
+ def image_block_transfer(self) -> "ImageTransfer":
98
+ return self.get_meth(2)
99
+
100
+ @property
101
+ def image_verify(self) -> "ImageTransfer":
102
+ return self.get_meth(3)
103
+
104
+ @property
105
+ def image_activate(self) -> "ImageTransfer":
106
+ return self.get_meth(4)
107
+
108
+
@@ -4,10 +4,6 @@ from struct import unpack, pack
4
4
  from functools import cached_property
5
5
  from typing import Deque
6
6
  from enum import IntFlag
7
- import logging
8
-
9
- logger = logging.getLogger(__name__)
10
- logger.level = logging.INFO
11
7
 
12
8
  _FLAG: int = 0x7e
13
9
 
@@ -750,13 +746,13 @@ class Frame:
750
746
  try:
751
747
  return cls(value)
752
748
  except ValueError as e:
753
- logger.info(F'Wrong Frame: {e.args[0]}')
749
+ print(F'Wrong Frame: {e.args[0]}')
754
750
  return None
755
751
  except NotEnoughDataError as e:
756
- logger.info(F'Frame Error: {e.args[0]}')
752
+ print(F'Frame Error: {e.args[0]}')
757
753
  return None
758
754
  except FormatDataError as e:
759
- logger.info(F'Frame Error: {e.args[0]}')
755
+ print(F'Frame Error: {e.args[0]}')
760
756
  value.pop(0)
761
757
  return None
762
758
 
@@ -819,7 +815,7 @@ class Frame:
819
815
  info: bytearray = bytearray(frame.info)
820
816
  break
821
817
  else:
822
- logger.warning(F'Frame {frame} not handled and deleted')
818
+ print(F'Frame {frame} not handled and deleted')
823
819
  else:
824
820
  raise ValueError('Not found information Frame')
825
821
  while frame.is_segmentation:
@@ -831,7 +827,7 @@ class Frame:
831
827
  info.extend(next_frame.info)
832
828
  frame = next_frame
833
829
  else:
834
- logger.warning(F'Frame {frame} not handled and deleted')
830
+ print(F'Frame {frame} not handled and deleted')
835
831
  return info
836
832
 
837
833
 
@@ -1,6 +1,11 @@
1
1
  """all realisation cdt.Integer subclasses"""
2
2
  from ...types import common_data_types as cdt
3
+ from typing_extensions import deprecated
3
4
 
4
5
 
6
+ @deprecated("use INTEGER_0")
5
7
  class Only0(cdt.Integer, value=0):
6
8
  """ Limited Integer only 0 """
9
+
10
+
11
+ INTEGER_0 = cdt.Integer(0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: DLMS_SPODES
3
- Version: 0.87.0
3
+ Version: 0.87.2
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
@@ -1,41 +0,0 @@
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)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes