DLMS-SPODES 0.87.1__tar.gz → 0.87.3__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.1 → dlms_spodes-0.87.3}/PKG-INFO +1 -1
  2. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/pyproject.toml +1 -1
  3. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/parameter.py +24 -22
  4. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/parameters.py +75 -2
  5. dlms_spodes-0.87.3/src/DLMS_SPODES/cosem_interface_classes/reports.py +70 -0
  6. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES.egg-info/PKG-INFO +1 -1
  7. dlms_spodes-0.87.1/src/DLMS_SPODES/cosem_interface_classes/reports.py +0 -72
  8. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/.gitignore +0 -0
  9. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/README.md +0 -0
  10. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/config.toml +0 -0
  11. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/setup.cfg +0 -0
  12. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/Values/EN/__init__.py +0 -0
  13. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/Values/EN/actors.py +0 -0
  14. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/Values/EN/relation_to_obis_names.py +0 -0
  15. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/Values/RU/__init__.py +0 -0
  16. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/Values/RU/actors.py +0 -0
  17. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/Values/RU/relation_to_obis_names.py +0 -0
  18. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/Values/__init__.py +0 -0
  19. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/__init__.py +0 -0
  20. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/configEN.ini +0 -0
  21. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/config_parser.py +0 -0
  22. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/__class_init__.py +0 -0
  23. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/__init__.py +0 -0
  24. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/a_parameter.py +0 -0
  25. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/activity_calendar.py +0 -0
  26. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/arbitrator.py +0 -0
  27. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/association_ln/__init__.py +0 -0
  28. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/association_ln/abstract.py +0 -0
  29. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/association_ln/authentication_mechanism_name.py +0 -0
  30. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/association_ln/mechanism_id.py +0 -0
  31. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/association_ln/method.py +0 -0
  32. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver0.py +0 -0
  33. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver1.py +0 -0
  34. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver2.py +0 -0
  35. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver3.py +0 -0
  36. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/association_sn/__init__.py +0 -0
  37. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/association_sn/ver0.py +0 -0
  38. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/attr_indexes.py +0 -0
  39. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/clock.py +0 -0
  40. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/collection.py +0 -0
  41. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py +0 -0
  42. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/data.py +0 -0
  43. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/demand_register/__init__.py +0 -0
  44. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/demand_register/ver0.py +0 -0
  45. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/disconnect_control.py +0 -0
  46. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/extended_register.py +0 -0
  47. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/gprs_modem_setup.py +0 -0
  48. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/__init__.py +0 -0
  49. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver0.py +0 -0
  50. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver1.py +0 -0
  51. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver2.py +0 -0
  52. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/__init__.py +0 -0
  53. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver0.py +0 -0
  54. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver1.py +0 -0
  55. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/iec_local_port_setup.py +0 -0
  56. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/__init__.py +0 -0
  57. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/image_transfer_status.py +0 -0
  58. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/ver0.py +0 -0
  59. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/implementations/__init__.py +0 -0
  60. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/implementations/arbitrator.py +0 -0
  61. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/implementations/data.py +0 -0
  62. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/implementations/profile_generic.py +0 -0
  63. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/ipv4_setup.py +0 -0
  64. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/limiter.py +0 -0
  65. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/ln_pattern.py +0 -0
  66. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/__init__.py +0 -0
  67. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py +0 -0
  68. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py +0 -0
  69. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/__init__.py +0 -0
  70. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/ver0.py +0 -0
  71. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/obis.py +0 -0
  72. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/overview.py +0 -0
  73. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/__init__.py +0 -0
  74. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver0.py +0 -0
  75. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py +0 -0
  76. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/push_setup/__init__.py +0 -0
  77. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver0.py +0 -0
  78. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver1.py +0 -0
  79. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver2.py +0 -0
  80. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/register.py +0 -0
  81. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/register_activation/__init__.py +0 -0
  82. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/register_activation/ver0.py +0 -0
  83. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/register_monitor.py +0 -0
  84. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/schedule.py +0 -0
  85. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/script_table.py +0 -0
  86. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__init__.py +0 -0
  87. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__pycache__/__init__.cpython-311.pyc +0 -0
  88. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver0.py +0 -0
  89. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver1.py +0 -0
  90. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/single_action_schedule.py +0 -0
  91. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/special_days_table.py +0 -0
  92. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_interface_classes/tcp_udp_setup.py +0 -0
  93. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/cosem_pdu.py +0 -0
  94. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/enums.py +0 -0
  95. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/exceptions.py +0 -0
  96. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/firmwares.py +0 -0
  97. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/hdlc/__init__.py +0 -0
  98. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/hdlc/frame.py +0 -0
  99. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/hdlc/sub_layer.py +0 -0
  100. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/literals.py +0 -0
  101. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/obis/__init__.py +0 -0
  102. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/obis/abstract_objects.py +0 -0
  103. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/obis/media_id.py +0 -0
  104. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/pardata.py +0 -0
  105. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/pdu_enums.py +0 -0
  106. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/py.typed +0 -0
  107. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/relation_to_OBIS.py +0 -0
  108. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/settings.py +0 -0
  109. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/__init__.py +0 -0
  110. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/choices.py +0 -0
  111. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/common_data_types.py +0 -0
  112. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/cosem_service_types.py +0 -0
  113. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/implementations/__init__.py +0 -0
  114. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/implementations/arrays.py +0 -0
  115. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/implementations/bitstrings.py +0 -0
  116. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/implementations/double_long_usingneds.py +0 -0
  117. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/implementations/enums.py +0 -0
  118. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/implementations/integers.py +0 -0
  119. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/implementations/long_unsigneds.py +0 -0
  120. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/implementations/octet_string.py +0 -0
  121. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/implementations/structs.py +0 -0
  122. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES/types/useful_types.py +0 -0
  123. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES.egg-info/SOURCES.txt +0 -0
  124. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES.egg-info/dependency_links.txt +0 -0
  125. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES.egg-info/requires.txt +0 -0
  126. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/DLMS_SPODES.egg-info/top_level.txt +0 -0
  127. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/src/__init__.py +0 -0
  128. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/__init__.py +0 -0
  129. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/collection_init.py +0 -0
  130. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/config.toml +0 -0
  131. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/config.zip +0 -0
  132. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/init_collection.py +0 -0
  133. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test.typ +0 -0
  134. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test.xml +0 -0
  135. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_ActivityCalendar.py +0 -0
  136. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_AssociationLN.py +0 -0
  137. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_COSEMInterfaceClass.py +0 -0
  138. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_Data.py +0 -0
  139. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_DemandRegister.py +0 -0
  140. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_DisconnectControl.py +0 -0
  141. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_DisplayReadoutProfile.py +0 -0
  142. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_GSMDiagnostic.py +0 -0
  143. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_IC.py +0 -0
  144. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_ImageTransfer.py +0 -0
  145. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_KPZ.py +0 -0
  146. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_LNPatterns.py +0 -0
  147. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_Limiter.py +0 -0
  148. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_NTPSetup.py +0 -0
  149. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_Parameter.py +0 -0
  150. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_ProfileGeneric.py +0 -0
  151. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_Register.py +0 -0
  152. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_RegisterActivation.py +0 -0
  153. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_RegisterMonitor.py +0 -0
  154. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_ScalerUnitType.py +0 -0
  155. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_Schedule.py +0 -0
  156. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_Structures.py +0 -0
  157. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_a_param.py +0 -0
  158. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_benchmark_create_obj.py +0 -0
  159. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_cdt.py +0 -0
  160. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_collection.py +0 -0
  161. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_config.py +0 -0
  162. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_electric_obj.py +0 -0
  163. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_enums.py +0 -0
  164. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_hdlc.py +0 -0
  165. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_overview.py +0 -0
  166. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_pars.py +0 -0
  167. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_report.py +0 -0
  168. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_save_type.typ +0 -0
  169. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_settings.py +0 -0
  170. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_to_xml.xml +0 -0
  171. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_to_xml2.xml +0 -0
  172. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_to_xml3.xml +0 -0
  173. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/test/test_to_xml4.xml +0 -0
  174. {dlms_spodes-0.87.1 → dlms_spodes-0.87.3}/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.1
3
+ Version: 0.87.3
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.1"
17
+ version = "0.87.3"
18
18
  authors = [
19
19
  {name="Serj Kotilevski", email="youserj@outlook.com"}
20
20
  ]
@@ -1,5 +1,5 @@
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
5
  from typing import Optional, cast, Iterator, Self
@@ -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():
@@ -12,11 +12,13 @@ class Data(Parameter):
12
12
 
13
13
 
14
14
  class ActiveFirmwareIdentifier(Data):
15
- def from_b(self, b: int) -> "ActiveFirmwareIdentifier":
15
+
16
+ @classmethod
17
+ def from_b(cls, b: int = 0) -> "ActiveFirmwareIdentifier":
16
18
  return cls.parse(f"0.{b}.0.2.0.255")
17
19
 
18
20
 
19
- ACTIVE_FIRMWARE_IDENTIFIER_0 = ActiveFirmwareIdentifier.from_b(0)
21
+ ACTIVE_FIRMWARE_IDENTIFIER_0 = ActiveFirmwareIdentifier.from_b()
20
22
 
21
23
 
22
24
  @dataclass(frozen=True)
@@ -26,6 +28,77 @@ class Register(Data):
26
28
  return self.get_attr(3)
27
29
 
28
30
 
31
+ @dataclass(frozen=True)
32
+ class Clock(Parameter):
33
+ @classmethod
34
+ def from_be(cls, b: int = 0, e: int = 0) -> "Clock":
35
+ return cls.parse(f"0.{b}.1.0.{e}.255")
36
+
37
+ @property
38
+ def time(self) -> "Clock":
39
+ return self.get_attr(2)
40
+
41
+ @property
42
+ def time_zone(self) -> "Clock":
43
+ return self.get_attr(3)
44
+
45
+ @property
46
+ def status(self) -> "Clock":
47
+ return self.get_attr(4)
48
+
49
+ @property
50
+ def time_zone(self) -> "Clock":
51
+ return self.get_attr(3)
52
+
53
+ @property
54
+ def status(self) -> "Clock":
55
+ return self.get_attr(4)
56
+
57
+ @property
58
+ def daylight_savings_begin(self) -> "Clock":
59
+ return self.get_attr(5)
60
+
61
+ @property
62
+ def daylight_savings_end(self) -> "Clock":
63
+ return self.get_attr(6)
64
+
65
+ @property
66
+ def daylight_savings_deviation(self) -> "Clock":
67
+ return self.get_attr(7)
68
+
69
+ @property
70
+ def daylight_savings_enabled(self) -> "Clock":
71
+ return self.get_attr(8)
72
+
73
+ @property
74
+ def clock_base(self) -> "Clock":
75
+ return self.get_attr(9)
76
+
77
+ @property
78
+ def adjust_to_quarter(self) -> "Clock":
79
+ return self.get_meth(1)
80
+
81
+ @property
82
+ def adjust_to_measuring_period(self) -> "Clock":
83
+ return self.get_meth(2)
84
+
85
+ @property
86
+ def adjust_to_minute(self) -> "Clock":
87
+ return self.get_meth(3)
88
+
89
+ @property
90
+ def adjust_to_preset_time(self) -> "Clock":
91
+ return self.get_meth(4)
92
+
93
+ @property
94
+ def preset_adjusting_time(self) -> "Clock":
95
+ return self.get_meth(5)
96
+
97
+ @property
98
+ def shift_time(self) -> "Clock":
99
+ return self.get_meth(6)
100
+
101
+
29
102
  @dataclass(frozen=True)
30
103
  class DisconnectControl(Parameter):
31
104
 
@@ -0,0 +1,70 @@
1
+ from typing import Any, Iterable
2
+ from StructResult import result
3
+ from . import cosem_interface_class as ic
4
+ from ..types import cdt
5
+ from .parameter import Parameter
6
+ from ..cosem_interface_classes import collection
7
+ from ..config_parser import get_values
8
+ from ..settings import settings
9
+
10
+
11
+ def from_obj(
12
+ col: collection.Collection,
13
+ obj: ic.COSEMInterfaceClasses,
14
+ attr_index_par: tuple[int, ...]
15
+ ) -> result.SimpleOrError[str]:
16
+ if not hasattr(from_obj, "struct_pattern"):
17
+ from_obj.struct_pattern = dict(settings.report.struct)
18
+ ret: str = F"[{collection.get_name(obj.logical_name)}]\n"
19
+ for i in attr_index_par:
20
+ par = Parameter(obj.logical_name.contents).set_i(i)
21
+ if isinstance(res_data := col.par2data(par), result.Error):
22
+ return res_data
23
+ a_data = res_data.value
24
+ if isinstance(a_data, cdt.SimpleDataType):
25
+ rep = col.par2rep(par, a_data)
26
+ ret += F" {obj.get_attr_element(i)}: {rep.msg}{f" {rep.unit}" if rep.unit else ""}\n"
27
+ elif isinstance(a_data, cdt.ComplexDataType):
28
+ ret += F" [{obj.get_attr_element(i)}]\n"
29
+ stack: list[tuple[Any, Any]] = [("", iter(a_data))]
30
+ while stack:
31
+ name, value_it = stack[-1]
32
+ indent = F"{' ' * (len(stack) + 1)}"
33
+ data = next(value_it, None)
34
+ if data:
35
+ if not isinstance(name, str):
36
+ name = str(next(name))
37
+ if isinstance(data, cdt.Array):
38
+ ret += F"{indent}[{name}]\n"
39
+ stack.append(("*", iter(data)))
40
+ elif isinstance(data, cdt.Structure):
41
+ if (pattern := from_obj.struct_pattern.get(data.__class__.__name__)):
42
+ val = list(pattern)
43
+ val.reverse()
44
+ result_ = str()
45
+ while val:
46
+ match val.pop():
47
+ case "%":
48
+ par_ = val.pop()
49
+ index = int(val.pop() + val.pop())
50
+ match par_:
51
+ case "n":
52
+ result_ += str(data.ELEMENTS[index])
53
+ case "v":
54
+ result_ += str(data[index])
55
+ case err:
56
+ raise ValueError(F"unknown macros &{err}{index}")
57
+ case symbol:
58
+ result_ += symbol
59
+ ret += F"{indent}{result_}\n"
60
+ else:
61
+ if name=="":
62
+ ret += "\n"
63
+ else:
64
+ ret += F"{indent}[{name}]\n"
65
+ stack.append((iter(data.ELEMENTS), iter(data)))
66
+ else:
67
+ ret += F"{indent}{name}: {data}\n"
68
+ else:
69
+ stack.pop()
70
+ return result.Simple(ret)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: DLMS_SPODES
3
- Version: 0.87.1
3
+ Version: 0.87.3
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,72 +0,0 @@
1
- from typing import Any
2
- from .collection import ic, cdt
3
- from ..cosem_interface_classes import collection
4
- from ..config_parser import get_values
5
-
6
-
7
- def get_obj_report(
8
- obj: ic.COSEMInterfaceClasses,
9
- attr_index_par: tuple[int | Any, ...]) -> str:
10
- struct_report: dict | None = get_values("DLMS", "report", "struct")
11
- ret = str()
12
- ret += F"[{collection.get_name(obj.logical_name)}]\n"
13
- for i in attr_index_par:
14
- if isinstance(i, int):
15
- pass
16
- else:
17
- i, par = i[0], i[1:]
18
- value = obj.get_attr(i)
19
- if isinstance(value, cdt.SimpleDataType):
20
- match obj, i:
21
- case collection.impl.data.DLMSDeviceIDObject(), 2: value = value.to_str()
22
- case _: pass
23
- if isinstance(value, cdt.OctetString):
24
- pass
25
- if hasattr(value, "report"):
26
- value = value.report
27
- ret += F" {obj.get_attr_element(i)}: {value}\n"
28
- elif isinstance(value, cdt.ComplexDataType):
29
- ret += F" [{obj.get_attr_element(i)}]\n"
30
- stack: list = [("", iter(value))]
31
- while stack:
32
- name, value_it = stack[-1]
33
- indent = F"{' '*(len(stack) + 1)}"
34
- value = next(value_it, None)
35
- if value:
36
- if not isinstance(name, str):
37
- name = next(name).NAME
38
- if isinstance(value, cdt.Array):
39
- ret += F"{indent}[{name}]\n"
40
- stack.append(("*", iter(value)))
41
- elif isinstance(value, cdt.Structure):
42
- if struct_report and (pattern := struct_report.get(value.__class__.__name__)):
43
- val = list(pattern)
44
- val.reverse()
45
- result = str()
46
- while val:
47
- i = val.pop()
48
- match i:
49
- case "%":
50
- par = val.pop()
51
- index = int(val.pop() + val.pop())
52
- match par:
53
- case "n":
54
- result += value.ELEMENTS[index].NAME
55
- case "v":
56
- result += str(value[index])
57
- case err:
58
- raise ValueError(F"unknown macros &{err}{index}")
59
- case symbol:
60
- result += symbol
61
- ret += F"{indent}{result}\n"
62
- else:
63
- if name == "":
64
- ret += "\n"
65
- else:
66
- ret += F"{indent}[{name}]\n"
67
- stack.append((iter(value.ELEMENTS), iter(value)))
68
- else:
69
- ret += F"{indent}{name}: {value}\n"
70
- else:
71
- stack.pop()
72
- return ret
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes