DLMS-SPODES 0.86.9__tar.gz → 0.86.11__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.9 → dlms_spodes-0.86.11}/PKG-INFO +3 -2
  2. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/pyproject.toml +11 -5
  3. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/collection.py +19 -10
  4. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/ln_pattern.py +155 -66
  5. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/parameter.py +0 -1
  6. dlms_spodes-0.86.11/src/DLMS_SPODES/cosem_interface_classes/parameters.py +18 -0
  7. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/pardata.py +1 -1
  8. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES.egg-info/PKG-INFO +3 -2
  9. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES.egg-info/SOURCES.txt +2 -0
  10. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES.egg-info/requires.txt +1 -1
  11. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_LNPatterns.py +6 -6
  12. dlms_spodes-0.86.11/test/test_pars.py +11 -0
  13. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/.gitignore +0 -0
  14. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/README.md +0 -0
  15. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/config.toml +0 -0
  16. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/setup.cfg +0 -0
  17. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/EN/__init__.py +0 -0
  18. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/EN/actors.py +0 -0
  19. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/EN/relation_to_obis_names.py +0 -0
  20. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/RU/__init__.py +0 -0
  21. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/RU/actors.py +0 -0
  22. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/RU/relation_to_obis_names.py +0 -0
  23. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/Values/__init__.py +0 -0
  24. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/__init__.py +0 -0
  25. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/configEN.ini +0 -0
  26. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/config_parser.py +0 -0
  27. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/__class_init__.py +0 -0
  28. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/__init__.py +0 -0
  29. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/a_parameter.py +0 -0
  30. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/activity_calendar.py +0 -0
  31. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/arbitrator.py +0 -0
  32. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/__init__.py +0 -0
  33. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/abstract.py +0 -0
  34. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/authentication_mechanism_name.py +0 -0
  35. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/mechanism_id.py +0 -0
  36. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/method.py +0 -0
  37. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver0.py +0 -0
  38. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver1.py +0 -0
  39. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver2.py +0 -0
  40. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_ln/ver3.py +0 -0
  41. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_sn/__init__.py +0 -0
  42. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/association_sn/ver0.py +0 -0
  43. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/attr_indexes.py +0 -0
  44. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/clock.py +0 -0
  45. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/cosem_interface_class.py +0 -0
  46. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/data.py +0 -0
  47. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/demand_register/__init__.py +0 -0
  48. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/demand_register/ver0.py +0 -0
  49. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/disconnect_control.py +0 -0
  50. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/extended_register.py +0 -0
  51. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/gprs_modem_setup.py +0 -0
  52. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/__init__.py +0 -0
  53. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver0.py +0 -0
  54. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver1.py +0 -0
  55. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/gsm_diagnostic/ver2.py +0 -0
  56. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/__init__.py +0 -0
  57. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver0.py +0 -0
  58. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/iec_hdlc_setup/ver1.py +0 -0
  59. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/iec_local_port_setup.py +0 -0
  60. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/__init__.py +0 -0
  61. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/image_transfer_status.py +0 -0
  62. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/image_transfer/ver0.py +0 -0
  63. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/implementations/__init__.py +0 -0
  64. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/implementations/arbitrator.py +0 -0
  65. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/implementations/data.py +0 -0
  66. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/implementations/profile_generic.py +0 -0
  67. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/ipv4_setup.py +0 -0
  68. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/limiter.py +0 -0
  69. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/__init__.py +0 -0
  70. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver0.py +0 -0
  71. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/modem_configuration/ver1.py +0 -0
  72. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/__init__.py +0 -0
  73. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/ntp_setup/ver0.py +0 -0
  74. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/obis.py +0 -0
  75. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/overview.py +0 -0
  76. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/__init__.py +0 -0
  77. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver0.py +0 -0
  78. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/profile_generic/ver1.py +0 -0
  79. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/push_setup/__init__.py +0 -0
  80. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver0.py +0 -0
  81. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver1.py +0 -0
  82. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/push_setup/ver2.py +0 -0
  83. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/register.py +0 -0
  84. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/register_activation/__init__.py +0 -0
  85. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/register_activation/ver0.py +0 -0
  86. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/register_monitor.py +0 -0
  87. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/reports.py +0 -0
  88. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/schedule.py +0 -0
  89. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/script_table.py +0 -0
  90. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__init__.py +0 -0
  91. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/security_setup/__pycache__/__init__.cpython-311.pyc +0 -0
  92. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver0.py +0 -0
  93. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/security_setup/ver1.py +0 -0
  94. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/single_action_schedule.py +0 -0
  95. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/special_days_table.py +0 -0
  96. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_interface_classes/tcp_udp_setup.py +0 -0
  97. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/cosem_pdu.py +0 -0
  98. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/enums.py +0 -0
  99. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/exceptions.py +0 -0
  100. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/firmwares.py +0 -0
  101. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/hdlc/__init__.py +0 -0
  102. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/hdlc/frame.py +0 -0
  103. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/hdlc/sub_layer.py +0 -0
  104. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/literals.py +0 -0
  105. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/obis/__init__.py +0 -0
  106. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/obis/abstract_objects.py +0 -0
  107. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/obis/media_id.py +0 -0
  108. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/pdu_enums.py +0 -0
  109. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/py.typed +0 -0
  110. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/relation_to_OBIS.py +0 -0
  111. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/settings.py +0 -0
  112. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/__init__.py +0 -0
  113. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/choices.py +0 -0
  114. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/common_data_types.py +0 -0
  115. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/cosem_service_types.py +0 -0
  116. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/__init__.py +0 -0
  117. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/arrays.py +0 -0
  118. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/bitstrings.py +0 -0
  119. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/double_long_usingneds.py +0 -0
  120. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/enums.py +0 -0
  121. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/integers.py +0 -0
  122. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/long_unsigneds.py +0 -0
  123. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/octet_string.py +0 -0
  124. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/implementations/structs.py +0 -0
  125. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES/types/useful_types.py +0 -0
  126. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES.egg-info/dependency_links.txt +0 -0
  127. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/DLMS_SPODES.egg-info/top_level.txt +0 -0
  128. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/src/__init__.py +0 -0
  129. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/__init__.py +0 -0
  130. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/collection_init.py +0 -0
  131. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/config.toml +0 -0
  132. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/config.zip +0 -0
  133. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/init_collection.py +0 -0
  134. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test.typ +0 -0
  135. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test.xml +0 -0
  136. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_ActivityCalendar.py +0 -0
  137. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_AssociationLN.py +0 -0
  138. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_COSEMInterfaceClass.py +0 -0
  139. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_Data.py +0 -0
  140. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_DemandRegister.py +0 -0
  141. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_DisconnectControl.py +0 -0
  142. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_DisplayReadoutProfile.py +0 -0
  143. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_GSMDiagnostic.py +0 -0
  144. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_IC.py +0 -0
  145. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_ImageTransfer.py +0 -0
  146. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_KPZ.py +0 -0
  147. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_Limiter.py +0 -0
  148. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_NTPSetup.py +0 -0
  149. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_Parameter.py +0 -0
  150. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_ProfileGeneric.py +0 -0
  151. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_Register.py +0 -0
  152. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_RegisterActivation.py +0 -0
  153. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_RegisterMonitor.py +0 -0
  154. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_ScalerUnitType.py +0 -0
  155. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_Schedule.py +0 -0
  156. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_Structures.py +0 -0
  157. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_a_param.py +0 -0
  158. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_benchmark_create_obj.py +0 -0
  159. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_cdt.py +0 -0
  160. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_collection.py +0 -0
  161. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_config.py +0 -0
  162. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_electric_obj.py +0 -0
  163. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_enums.py +0 -0
  164. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_hdlc.py +0 -0
  165. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_overview.py +0 -0
  166. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_report.py +0 -0
  167. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_save_type.typ +0 -0
  168. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_settings.py +0 -0
  169. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_to_xml.xml +0 -0
  170. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_to_xml2.xml +0 -0
  171. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_to_xml3.xml +0 -0
  172. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_to_xml4.xml +0 -0
  173. {dlms_spodes-0.86.9 → dlms_spodes-0.86.11}/test/test_userfulType.py +0 -0
@@ -1,8 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: DLMS_SPODES
3
- Version: 0.86.9
3
+ Version: 0.86.11
4
4
  Summary: dlms-spodes
5
5
  Author-email: Serj Kotilevski <youserj@outlook.com>
6
+ Project-URL: Source, https://github.com/youserj/DlmsSPODES-project
6
7
  Keywords: dlms
7
8
  Classifier: Programming Language :: Python :: 3
8
9
  Classifier: License :: OSI Approved :: MIT License
@@ -13,7 +14,7 @@ Requires-Dist: pydantic>=2.11
13
14
  Requires-Dist: cryptography>=45.0
14
15
  Requires-Dist: semver>=3.0
15
16
  Requires-Dist: typing-extensions>=4.12.2
16
- Requires-Dist: StructResult>=0.7.3
17
+ Requires-Dist: StructResult>=0.8.0
17
18
  Provides-Extra: dev
18
19
  Requires-Dist: mypy>=1.5.0; extra == "dev"
19
20
  Requires-Dist: ruff>=0.11; extra == "dev"
@@ -1,18 +1,20 @@
1
1
  [build-system]
2
2
  requires = [
3
3
  "setuptools",
4
- "setuptools-scm"]
4
+ "setuptools-scm"
5
+ ]
5
6
  build-backend = "setuptools.build_meta"
6
7
 
7
- #[tool.setuptools]
8
- #package-dir = {"" = "src"}
8
+ [tool.setuptools]
9
+ license-files = []
10
+
9
11
  [tool.setuptools.packages.find]
10
12
  where = ["src"]
11
13
  exclude = ["test","KPZ"]
12
14
 
13
15
  [project]
14
16
  name = "DLMS_SPODES"
15
- version = "0.86.9"
17
+ version = "0.86.11"
16
18
  authors = [
17
19
  {name="Serj Kotilevski", email="youserj@outlook.com"}
18
20
  ]
@@ -21,7 +23,7 @@ dependencies = [
21
23
  "cryptography>=45.0",
22
24
  "semver>=3.0",
23
25
  "typing-extensions>=4.12.2", # remove for 3.13(use for @deprecated)
24
- "StructResult>=0.7.3"
26
+ "StructResult>=0.8.0"
25
27
  ]
26
28
  description="dlms-spodes"
27
29
  readme = "README.md"
@@ -33,6 +35,10 @@ classifiers = [
33
35
  "Operating System :: OS Independent",
34
36
  ]
35
37
 
38
+ [project.urls]
39
+ Source = "https://github.com/youserj/DlmsSPODES-project"
40
+
41
+
36
42
  [project.optional-dependencies]
37
43
  dev = [
38
44
  "mypy>=1.5.0",
@@ -522,8 +522,6 @@ __func_map_for_create.update({
522
522
  (1, 0, 148, 136, 0): RegisterMap,
523
523
  (1, 94, 7, 0): ProfileGenericMap.renew(1, impl.profile_generic.SPODES3CurrentProfile),
524
524
  (1, 94, 7, (1, 2, 3, 4, 5, 6)): ProfileGenericMap.renew(1, impl.profile_generic.SPODES3ScalesProfile), # Todo: RU. Scaler-profile With 1 entry and more
525
- # KPZ
526
- (128, 0, tuple(range(20)), 0, 0): RegisterMap
527
525
  })
528
526
 
529
527
  func_maps["SPODES_3"] = get_func_map(__func_map_for_create)
@@ -537,6 +535,7 @@ __func_map_for_create.update({
537
535
  (0, 128, 96, 13, 1): ClassMap({0: impl.data.ITEBitMap}),
538
536
  (0, 128, 154, 0, 0): ClassMap({0: impl.data.KPZGSMPingIP}),
539
537
  (0, 0, 128, (100, 101, 102, 103, 150, 151, 152, 170)): DataMap,
538
+ (128, 0, tuple(range(20)), 0, 0): RegisterMap
540
539
  })
541
540
  func_maps["KPZ"]: FUNC_MAP = get_func_map(__func_map_for_create)
542
541
  # KPZ1 with bag in log event profiles
@@ -607,7 +606,7 @@ def get_filtered(objects: Iterable[InterfaceClass],
607
606
  keys: ObjFilteredKey) -> list[InterfaceClass]:
608
607
  c_ids: list[ut.CosemClassId] = list()
609
608
  patterns: list[LNPattern] = list()
610
- ch: Channel | None = None
609
+ ch: Optional[Channel] = None
611
610
  for k in keys:
612
611
  if isinstance(k, ut.CosemClassId):
613
612
  c_ids.append(k)
@@ -680,7 +679,7 @@ class Collection:
680
679
  self.__country_ver = cntr_ver
681
680
  """country version specification"""
682
681
  self.spec_map = "DLMS_6"
683
- self.__objs = dict()
682
+ self.__objs = {}
684
683
  """ all DLMS objects container with obis key """
685
684
 
686
685
  @property
@@ -1128,6 +1127,19 @@ class Collection:
1128
1127
  res.append_err(e)
1129
1128
  return res
1130
1129
 
1130
+ def iter_classID_objects(self,
1131
+ class_id: ut.CosemClassId) -> Iterator[InterfaceClass]:
1132
+ return (obj for obj in self.__objs.values() if obj.CLASS_ID == value)
1133
+
1134
+ def LNPattern2objects(self,
1135
+ pat: LNPattern) -> list[InterfaceClass]:
1136
+ ret = []
1137
+ for obj in self.__objs.values():
1138
+ if obj.logical_name in pat:
1139
+ ret.append(obj)
1140
+ return ret
1141
+
1142
+
1131
1143
  def get_attr(self, value: ut.CosemAttributeDescriptor) -> cdt.CommonDataTypes:
1132
1144
  """attribute value from descriptor"""
1133
1145
  return self.__get_object(value.instance_id.contents).get_attr(int(value.attribute_id))
@@ -1142,17 +1154,14 @@ class Collection:
1142
1154
  else:
1143
1155
  raise exc.NoObject(F"not found at least one DLMS Objects from collection with {values=}")
1144
1156
 
1157
+ @deprecated("use <iter_classID_objects>")
1145
1158
  def get_objects_by_class_id(self, value: ut.CosemClassId) -> list[InterfaceClass]:
1146
1159
  return list(filter(lambda obj: obj.CLASS_ID == value, self.__objs.values()))
1147
1160
 
1148
- def get_objects_descriptions(self) -> list[tuple[cst.LogicalName, cdt.LongUnsigned, cdt.Unsigned]]:
1149
- """ return container of objects for get device clone """
1150
- return list(map(lambda obj: (obj.logical_name, obj.CLASS_ID, obj.VERSION), self.__objs.values()))
1151
-
1152
1161
  def get_writable_attr(self) -> UsedAttributes:
1153
1162
  """return all writable {obj.ln: {attribute_index}}"""
1154
1163
  ret: UsedAttributes = dict()
1155
- for ass in self.get_objects_by_class_id(ClassID.ASSOCIATION_LN):
1164
+ for ass in self.iter_classID_objects(ClassID.ASSOCIATION_LN):
1156
1165
  if (
1157
1166
  ass.logical_name.e == 0
1158
1167
  or ass.object_list is None
@@ -1352,7 +1361,7 @@ class Collection:
1352
1361
  raise ValueError(F"absent association with {client_sap}")
1353
1362
 
1354
1363
  def sap2association(self, sap: enums.ClientSAP) -> AssociationLN:
1355
- for ass in get_filtered(self, (ClassID.ASSOCIATION_LN,)):
1364
+ for ass in self.iter_classID_objects(ClassID.ASSOCIATION_LN):
1356
1365
  if (
1357
1366
  ass.associated_partners_id is not None
1358
1367
  and ass.associated_partners_id.client_SAP == sap
@@ -1,48 +1,87 @@
1
1
  from dataclasses import dataclass
2
2
  from typing import Self, Literal
3
3
  from ..types import cst
4
+ from copy import copy
4
5
 
5
- SKIP = bytes(range(256))
6
- RANGE64 = bytes(range(65))
7
- type ObisGroup = int | set[int]
8
- type GroupLiteral = Literal['a', 'b', 'c', 'd', 'e', 'f']
6
+ SKIP: int = 0
7
+ RANGE256 = set(range(256))
8
+ RANGE64 = bytes(range(64))
9
+ RANGE64_WITH_LENGTH = b'\x40' + RANGE64
9
10
 
10
11
 
11
- @dataclass
12
+ @dataclass(frozen=True, slots=True)
12
13
  class LNPattern:
13
- """pattern for use in get_filtered.
14
- value "x.x.x.x.x.x" where x is:
15
- 0..255 - simple value
16
- a,b,c,d,e,f - for skip value in each group
17
- (y, z, ...) - set of simple values(y or z)
18
- ((y-z), ...) - set of simple values with range(from y to z)
19
- !() - as () but, set of exclude values
20
- example: "a.0.(1,2,3).(0-64).0.f"
21
14
  """
22
- __values: tuple[bytes, ...]
15
+ LNPattern ::= SEQUENCE (SIZE (6)) OF GroupPattern
16
+
17
+ GroupPattern ::= CHOICE {
18
+ skip [0] NULL, -- SKIP marker
19
+ single [1] INTEGER (0..255), -- single value
20
+ multiple [2] SEQUENCE OF INTEGER (0..255) -- set of values
21
+ }
22
+ LNPattern Binary Encoding Specification:
23
+ ---------------------------------------
24
+ A compact tag-less binary format for storing 6 OBIS-like groups.
25
+
26
+ Structure:
27
+ [L1][V1][L2][V2]...[L6][V6]
28
+ where:
29
+ - Ln: 1-byte length prefix for group n (0-255)
30
+ - Vn: Value bytes (interpretation depends on Ln)
23
31
 
24
- def __post_init__(self):
25
- if len(self.__values) != 6:
26
- raise ValueError(F"for {self.__class__.__name__} got values with length={len(self.__values)}, expected 6")
32
+ Length Semantics:
33
+ - L=0 : SKIP group (no value bytes follow)
34
+ - L=1 : Single value (V is 1-byte integer 0-255)
35
+ - L=2..255 : Value set (V contains L bytes as possible values)
36
+
37
+ Special Cases:
38
+ - Group 'b' (index 1) when marked SKIP uses predefined RANGE64 (0-64)
39
+ - Empty exclusion sets "!()" are prohibited
40
+
41
+ Example:
42
+ Pattern "a.1.(2-5).!().0.f" encodes as:
43
+ [00][01][01][04][02][03][04][05][00][01][00][00]
44
+ (SKIP|1|{2,3,4,5}|SKIP|0|SKIP)
45
+
46
+ Properties:
47
+ - Fixed overhead: 6 bytes (1 length byte per group)
48
+ - Max size: 6 + 255*6 = 1536 bytes
49
+ - Order-preserving
50
+ - Comparison-friendly memory layout
51
+ """
52
+ buffer: bytes
27
53
 
28
54
  @classmethod
29
55
  def parse(cls, value: str) -> Self:
30
- values: list[bytes] = [SKIP, SKIP, SKIP, SKIP, SKIP, SKIP]
31
- for i, val in enumerate(value.split('.', maxsplit=5)):
32
- if (
33
- len(val) == 1
34
- and (ord(val) == 97+i)
35
- ):
36
- if val == 'b':
37
- values[i] = RANGE64
38
- else:
56
+ buffer = bytearray()
57
+ parts = value.split('.', maxsplit=5)
58
+ if len(parts) != 6:
59
+ raise ValueError(f"got {len(parts)} elements, expected 6")
60
+ for i, val in enumerate(parts):
61
+ if val.isdigit():
62
+ num = int(val)
63
+ if 0 <= num <= 255:
64
+ buffer.extend((1, num))
65
+ continue
66
+ raise ValueError(f"Value {val} out of range 0-255")
67
+ if len(val) == 1:
68
+ if val == "x":
69
+ buffer.append(SKIP)
70
+ continue
71
+ elif (
72
+ i == 1
73
+ and val == "b"
74
+ ):
75
+ buffer.extend(RANGE64_WITH_LENGTH)
39
76
  continue
40
- elif val.isdigit():
41
- values[i] = int(val)
42
- if not (0 <= values[i] <= 255):
43
- raise ValueError(F"in {value=} got element {val=}, expected 0..255")
44
- elif val.startswith('(') and val.endswith(')'):
45
- el: set[int] = set()
77
+ elif ord(val) == i + 97:
78
+ buffer.append(SKIP)
79
+ continue
80
+ if val == "":
81
+ buffer.append(SKIP)
82
+ continue
83
+ if val[0]=='(' and val[-1]==')':
84
+ el = set()
46
85
  val = val.replace('(', "").replace(')', "")
47
86
  for j in val.split(","):
48
87
  j = j.replace(" ", '')
@@ -53,12 +92,16 @@ class LNPattern:
53
92
  start, end = j.split("-")
54
93
  el.update(range(
55
94
  cls.__simple_validate(start),
56
- cls.__simple_validate(end)+1))
95
+ cls.__simple_validate(end) + 1))
57
96
  case err:
58
97
  raise ValueError(F"got a lot of <-> in pattern: {value}, expected one")
59
- values[i] = bytes(el)
60
- elif val.startswith('!(') and val.endswith(')'):
61
- el: set[int] = set(range(256))
98
+ # values = bytes(el)
99
+ # buffer.extend([len(values)] + list(values))
100
+ buffer.append(len(el))
101
+ buffer.extend(el)
102
+ continue
103
+ if val.startswith('!(') and val.endswith(')'):
104
+ el = copy(RANGE256)
62
105
  val = val.replace('!(', "").replace(')', "")
63
106
  for j in val.split(","):
64
107
  j = j.replace(" ", '')
@@ -69,15 +112,18 @@ class LNPattern:
69
112
  start, end = j.split("-")
70
113
  el.difference_update(range(
71
114
  cls.__simple_validate(start),
72
- cls.__simple_validate(end)+1))
115
+ cls.__simple_validate(end) + 1))
73
116
  case err:
74
117
  raise ValueError(F"got a lot of <-> in pattern: {value}, expected one")
75
- if len(el) == 0:
76
- raise ValueError(F"no one element in group: {chr(97+i)}")
77
- values[i] = bytes(el)
78
- else:
79
- raise ValueError(F"got wrong symbol: {val} in pattern")
80
- return cls(tuple(values))
118
+ if len(el)==0:
119
+ raise ValueError(F"no one element in group: {chr(97 + i)}")
120
+ # values = bytes(el)
121
+ # buffer.extend([len(values)] + list(values))
122
+ buffer.append(len(el))
123
+ buffer.extend(el)
124
+ continue
125
+ raise ValueError(f"Invalid pattern: {val}")
126
+ return cls(bytes(buffer))
81
127
 
82
128
  @staticmethod
83
129
  def __simple_validate(value: str) -> int:
@@ -86,26 +132,66 @@ class LNPattern:
86
132
  else:
87
133
  raise ValueError(F"got not valid element: {value} in pattern, expected 0..255")
88
134
 
89
- def get_update(self, group: GroupLiteral, value: str) -> Self:
90
- """get new instance with updated group value"""
91
- # todo: make this
92
- raise RuntimeError("no implement now")
93
-
94
- def __eq__(self, other: cst.LogicalName):
95
- for i, j in zip(self.__values, other):
96
- if i == j or (i == -1):
97
- continue
98
- elif isinstance(i, set) and j in i:
135
+ def __eq__(self, other: "LNPattern") -> bool:
136
+ ptr = 0
137
+ for i in range(6):
138
+ length = self.buffer[ptr]
139
+ ptr += 1
140
+ if length == 0: # SKIP
99
141
  continue
100
- else:
101
- return False
142
+ other_byte = other.contents[i]
143
+ if length == 1: # Single byte
144
+ if self.buffer[ptr]!=other_byte:
145
+ return False
146
+ else: # Multiple bytes
147
+ if other_byte not in self.buffer[ptr:ptr + length]:
148
+ return False
149
+ ptr += length
102
150
  return True
103
151
 
104
- def __repr__(self) -> str:
105
- return F"{self.__class__.__name__}(\"{".".join(map(lambda it: str(it) if isinstance(it, int) else str(tuple(it)), self.__values))}\")"
152
+ @staticmethod
153
+ def _format_ranges(values: list[int]) -> str:
154
+ if not values:
155
+ return "!()"
156
+ ranges = []
157
+ start = end = values[0]
158
+ for num in values[1:]:
159
+ if num==end + 1:
160
+ end = num
161
+ else:
162
+ ranges.append((start, end))
163
+ start = end = num
164
+ ranges.append((start, end))
165
+ parts = []
166
+ for start, end in ranges:
167
+ if start==end:
168
+ parts.append(str(start))
169
+ elif end==start + 1: # Диапазон из 2 чисел
170
+ parts.extend([str(start), str(end)])
171
+ else:
172
+ parts.append(f"{start}-{end}")
173
+ if len(parts) > 3 and len(values) > 128: # Эмпирический порог
174
+ all_values = set(range(256))
175
+ excluded = sorted(all_values - set(values))
176
+ if len(excluded) < len(values):
177
+ return f"!({','.join(self._format_ranges(excluded))})"
178
+ return f"({','.join(parts)})"
106
179
 
107
- def __hash__(self) -> int:
108
- return hash(self.__values)
180
+ def __str__(self) -> str:
181
+ parts = []
182
+ ptr = 0
183
+ for _ in range(6):
184
+ length = self.buffer[ptr]
185
+ ptr += 1
186
+ if length == 0:
187
+ parts.append("x")
188
+ elif length == 1:
189
+ parts.append(str(self.buffer[ptr]))
190
+ else:
191
+ values = sorted(set(self.buffer[ptr:ptr + length]))
192
+ parts.append(self._format_ranges(values))
193
+ ptr += length
194
+ return ".".join(parts)
109
195
 
110
196
 
111
197
  @dataclass
@@ -115,14 +201,17 @@ class LNPatterns:
115
201
  def __iter__(self):
116
202
  return iter(self.value)
117
203
 
204
+ def __str__(self) -> str:
205
+ return f"[{" | ".join(map(str, self.value))}]"
206
+
118
207
 
119
- ABSTRACT = LNPattern.parse("0")
120
- ELECTRICITY = LNPattern.parse("1")
121
- HCA = LNPattern.parse("4")
122
- THERMAL = LNPattern.parse("(5,6)")
123
- GAS = LNPattern.parse("7")
124
- WATER = LNPattern.parse("(8,9)")
125
- OTHER_MEDIA = LNPattern.parse("15")
208
+ ABSTRACT = LNPattern.parse("0.....")
209
+ ELECTRICITY = LNPattern.parse("1.....")
210
+ HCA = LNPattern.parse("4.....")
211
+ THERMAL = LNPattern.parse("(5,6).....")
212
+ GAS = LNPattern.parse("7.....")
213
+ WATER = LNPattern.parse("(8,9).....")
214
+ OTHER_MEDIA = LNPattern.parse("15.....")
126
215
 
127
216
 
128
217
  BILLING_PERIOD_VALUES_RESET_COUNTER_ENTRIES = LNPatterns((
@@ -1,6 +1,5 @@
1
1
  from typing_extensions import deprecated
2
2
  from dataclasses import dataclass
3
- import functools
4
3
  import numpy as np
5
4
  from struct import Struct, pack, unpack_from
6
5
  from typing import Optional, cast, Iterator
@@ -0,0 +1,18 @@
1
+ from typing import Protocol, ClassVar
2
+ from functools import cached_property
3
+ from .parameter import Parameter
4
+
5
+
6
+ class Base(Protocol):
7
+ OBIS: ClassVar[Parameter]
8
+
9
+ @cached_property
10
+ def LN(self) -> Parameter:
11
+ return self.OBIS.set_i(1)
12
+
13
+
14
+ class Data(Base, Protocol):
15
+
16
+ @cached_property
17
+ def VALUE(self) -> Parameter:
18
+ return self.OBIS.set_i(2)
@@ -25,5 +25,5 @@ class ParValues[T]:
25
25
 
26
26
 
27
27
  @dataclass(frozen=True)
28
- class ParData(ParValues):
28
+ class ParData(ParValues[cdt.CommonDataType]):
29
29
  data: Optional[cdt.CommonDataType]
@@ -1,8 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: DLMS_SPODES
3
- Version: 0.86.9
3
+ Version: 0.86.11
4
4
  Summary: dlms-spodes
5
5
  Author-email: Serj Kotilevski <youserj@outlook.com>
6
+ Project-URL: Source, https://github.com/youserj/DlmsSPODES-project
6
7
  Keywords: dlms
7
8
  Classifier: Programming Language :: Python :: 3
8
9
  Classifier: License :: OSI Approved :: MIT License
@@ -13,7 +14,7 @@ Requires-Dist: pydantic>=2.11
13
14
  Requires-Dist: cryptography>=45.0
14
15
  Requires-Dist: semver>=3.0
15
16
  Requires-Dist: typing-extensions>=4.12.2
16
- Requires-Dist: StructResult>=0.7.3
17
+ Requires-Dist: StructResult>=0.8.0
17
18
  Provides-Extra: dev
18
19
  Requires-Dist: mypy>=1.5.0; extra == "dev"
19
20
  Requires-Dist: ruff>=0.11; extra == "dev"
@@ -48,6 +48,7 @@ src/DLMS_SPODES/cosem_interface_classes/ln_pattern.py
48
48
  src/DLMS_SPODES/cosem_interface_classes/obis.py
49
49
  src/DLMS_SPODES/cosem_interface_classes/overview.py
50
50
  src/DLMS_SPODES/cosem_interface_classes/parameter.py
51
+ src/DLMS_SPODES/cosem_interface_classes/parameters.py
51
52
  src/DLMS_SPODES/cosem_interface_classes/register.py
52
53
  src/DLMS_SPODES/cosem_interface_classes/register_monitor.py
53
54
  src/DLMS_SPODES/cosem_interface_classes/reports.py
@@ -159,6 +160,7 @@ test/test_electric_obj.py
159
160
  test/test_enums.py
160
161
  test/test_hdlc.py
161
162
  test/test_overview.py
163
+ test/test_pars.py
162
164
  test/test_report.py
163
165
  test/test_save_type.typ
164
166
  test/test_settings.py
@@ -2,7 +2,7 @@ pydantic>=2.11
2
2
  cryptography>=45.0
3
3
  semver>=3.0
4
4
  typing-extensions>=4.12.2
5
- StructResult>=0.7.3
5
+ StructResult>=0.8.0
6
6
 
7
7
  [dev]
8
8
  mypy>=1.5.0
@@ -11,19 +11,19 @@ from src.DLMS_SPODES.exceptions import NeedUpdate, NoObject
11
11
 
12
12
 
13
13
  class TestType(unittest.TestCase):
14
+ def setUp(self):
15
+ self.pattern = ln_pattern.LNPattern.parse("0.b.0.(1-5, 7-8).0.255")
14
16
 
15
17
  @staticmethod
16
18
  def get_pattern():
17
19
  return ln_pattern.LNPattern.parse("0.b.0.1.0.255")
18
20
 
19
21
  def test_create(self):
20
- p = self.get_pattern()
21
- print(p)
22
+ print(self.pattern)
22
23
 
23
24
  def test_equal(self):
24
- p = self.get_pattern()
25
- self.assertEqual(p, cst.LogicalName.from_obis("0.2.0.1.0.255"))
26
- self.assertNotEqual(p, cst.LogicalName.from_obis("1.0.0.1.0.255"))
25
+ self.assertEqual(self.pattern, cst.LogicalName.from_obis("0.2.0.1.0.255"))
26
+ self.assertNotEqual(self.pattern, cst.LogicalName.from_obis("1.0.0.1.0.255"))
27
27
 
28
28
  def test_country(self):
29
29
  print(ln_pattern.COUNTRY_SPECIFIC_IDENTIFIERS)
@@ -34,4 +34,4 @@ class TestType(unittest.TestCase):
34
34
 
35
35
  def test_convert(self):
36
36
  clock_pat = ln_pattern.CLOCK
37
- print(clock_pat)
37
+ print(clock_pat)
@@ -0,0 +1,11 @@
1
+ import unittest
2
+ from src.DLMS_SPODES.cosem_interface_classes.parameter import Parameter
3
+ from src.DLMS_SPODES.cosem_interface_classes import parameters as prs
4
+
5
+
6
+ class TestType(unittest.TestCase):
7
+ def test_one(self):
8
+ class My(prs.Data):
9
+ OBIS = Parameter.parse("0.0.0.1.0.255")
10
+
11
+ print(My().LN)
File without changes
File without changes
File without changes
File without changes