conson-xp 1.32.0__tar.gz → 1.33.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. {conson_xp-1.32.0 → conson_xp-1.33.0}/PKG-INFO +26 -1
  2. {conson_xp-1.32.0 → conson_xp-1.33.0}/README.md +25 -0
  3. {conson_xp-1.32.0 → conson_xp-1.33.0}/pyproject.toml +1 -1
  4. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/__init__.py +1 -1
  5. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/conbus_export_service.py +62 -70
  6. {conson_xp-1.32.0 → conson_xp-1.33.0}/LICENSE +0 -0
  7. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/__init__.py +0 -0
  8. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/__main__.py +0 -0
  9. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/__init__.py +0 -0
  10. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/__init__.py +0 -0
  11. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus.py +0 -0
  12. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +0 -0
  13. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
  14. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
  15. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
  16. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
  17. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
  18. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
  19. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_event_commands.py +0 -0
  20. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_export_commands.py +0 -0
  21. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
  22. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
  23. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +0 -0
  24. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +0 -0
  25. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
  26. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
  27. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
  28. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
  29. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/file_commands.py +0 -0
  30. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/homekit/__init__.py +0 -0
  31. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/homekit/homekit.py +0 -0
  32. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
  33. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/module_commands.py +0 -0
  34. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
  35. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/server/__init__.py +0 -0
  36. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/server/server_commands.py +0 -0
  37. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/telegram/__init__.py +0 -0
  38. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/telegram/telegram.py +0 -0
  39. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
  40. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
  41. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
  42. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
  43. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
  44. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
  45. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/term/__init__.py +0 -0
  46. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/term/term.py +0 -0
  47. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/commands/term/term_commands.py +0 -0
  48. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/main.py +0 -0
  49. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/utils/__init__.py +0 -0
  50. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/utils/click_tree.py +0 -0
  51. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
  52. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/utils/decorators.py +0 -0
  53. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/utils/error_handlers.py +0 -0
  54. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/utils/formatters.py +0 -0
  55. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/utils/module_type_choice.py +0 -0
  56. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/utils/serial_number_type.py +0 -0
  57. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/utils/system_function_choice.py +0 -0
  58. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/cli/utils/xp_module_type.py +0 -0
  59. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/connection/__init__.py +0 -0
  60. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/connection/exceptions.py +0 -0
  61. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/__init__.py +0 -0
  62. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/actiontable/__init__.py +0 -0
  63. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/actiontable/actiontable.py +0 -0
  64. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
  65. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/actiontable/msactiontable_xp24.py +0 -0
  66. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
  67. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/__init__.py +0 -0
  68. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus.py +0 -0
  69. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_autoreport.py +0 -0
  70. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_blink.py +0 -0
  71. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_client_config.py +0 -0
  72. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_connection_status.py +0 -0
  73. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_custom.py +0 -0
  74. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_datapoint.py +0 -0
  75. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_discover.py +0 -0
  76. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_event_list.py +0 -0
  77. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_event_raw.py +0 -0
  78. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_export.py +0 -0
  79. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
  80. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_linknumber.py +0 -0
  81. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_logger_config.py +0 -0
  82. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_output.py +0 -0
  83. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_raw.py +0 -0
  84. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_receive.py +0 -0
  85. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
  86. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/homekit/__init__.py +0 -0
  87. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/homekit/homekit_accessory.py +0 -0
  88. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/homekit/homekit_config.py +0 -0
  89. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/homekit/homekit_conson_config.py +0 -0
  90. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/log_entry.py +0 -0
  91. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/protocol/__init__.py +0 -0
  92. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/protocol/conbus_protocol.py +0 -0
  93. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/response.py +0 -0
  94. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/__init__.py +0 -0
  95. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/action_type.py +0 -0
  96. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/datapoint_type.py +0 -0
  97. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/event_telegram.py +0 -0
  98. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/event_type.py +0 -0
  99. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/input_action_type.py +0 -0
  100. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/input_type.py +0 -0
  101. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/module_type.py +0 -0
  102. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/module_type_code.py +0 -0
  103. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/output_telegram.py +0 -0
  104. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/reply_telegram.py +0 -0
  105. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/system_function.py +0 -0
  106. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/system_telegram.py +0 -0
  107. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/telegram.py +0 -0
  108. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/telegram_type.py +0 -0
  109. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/telegram/timeparam_type.py +0 -0
  110. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/term/__init__.py +0 -0
  111. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/term/connection_state.py +0 -0
  112. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/term/module_state.py +0 -0
  113. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/term/protocol_keys_config.py +0 -0
  114. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/term/status_message.py +0 -0
  115. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/term/telegram_display.py +0 -0
  116. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/models/write_config_type.py +0 -0
  117. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/__init__.py +0 -0
  118. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/actiontable/__init__.py +0 -0
  119. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
  120. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
  121. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +0 -0
  122. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +0 -0
  123. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +0 -0
  124. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/__init__.py +0 -0
  125. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/actiontable/__init__.py +0 -0
  126. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/actiontable/actiontable_download_service.py +0 -0
  127. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
  128. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
  129. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +0 -0
  130. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/actiontable/msactiontable_service.py +0 -0
  131. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
  132. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/conbus_blink_service.py +0 -0
  133. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/conbus_custom_service.py +0 -0
  134. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
  135. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
  136. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/conbus_discover_service.py +0 -0
  137. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/conbus_event_list_service.py +0 -0
  138. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
  139. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/conbus_output_service.py +0 -0
  140. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/conbus_raw_service.py +0 -0
  141. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/conbus_receive_service.py +0 -0
  142. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/conbus_scan_service.py +0 -0
  143. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/conbus/write_config_service.py +0 -0
  144. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/__init__.py +0 -0
  145. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/homekit_cache_service.py +0 -0
  146. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
  147. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/homekit_config_validator.py +0 -0
  148. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
  149. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
  150. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
  151. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/homekit_hap_service.py +0 -0
  152. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
  153. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
  154. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/homekit_module_service.py +0 -0
  155. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/homekit_outlet.py +0 -0
  156. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
  157. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/homekit/homekit_service.py +0 -0
  158. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/log_file_service.py +0 -0
  159. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/module_type_service.py +0 -0
  160. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/protocol/__init__.py +0 -0
  161. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/protocol/conbus_event_protocol.py +0 -0
  162. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/protocol/conbus_protocol.py +0 -0
  163. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/protocol/protocol_factory.py +0 -0
  164. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/protocol/telegram_protocol.py +0 -0
  165. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/reverse_proxy_service.py +0 -0
  166. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/server/__init__.py +0 -0
  167. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/server/base_server_service.py +0 -0
  168. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/server/client_buffer_manager.py +0 -0
  169. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/server/cp20_server_service.py +0 -0
  170. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/server/device_service_factory.py +0 -0
  171. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/server/server_service.py +0 -0
  172. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/server/xp130_server_service.py +0 -0
  173. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/server/xp20_server_service.py +0 -0
  174. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/server/xp230_server_service.py +0 -0
  175. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/server/xp24_server_service.py +0 -0
  176. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/server/xp33_server_service.py +0 -0
  177. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/telegram/__init__.py +0 -0
  178. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/telegram/telegram_blink_service.py +0 -0
  179. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
  180. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
  181. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/telegram/telegram_discover_service.py +0 -0
  182. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
  183. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/telegram/telegram_output_service.py +0 -0
  184. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/telegram/telegram_service.py +0 -0
  185. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/telegram/telegram_version_service.py +0 -0
  186. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/term/__init__.py +0 -0
  187. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/term/protocol_monitor_service.py +0 -0
  188. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/services/term/state_monitor_service.py +0 -0
  189. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/term/__init__.py +0 -0
  190. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/term/protocol.py +0 -0
  191. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/term/protocol.tcss +0 -0
  192. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/term/state.py +0 -0
  193. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/term/state.tcss +0 -0
  194. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/term/widgets/__init__.py +0 -0
  195. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/term/widgets/help_menu.py +0 -0
  196. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/term/widgets/modules_list.py +0 -0
  197. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/term/widgets/protocol_log.py +0 -0
  198. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/term/widgets/status_footer.py +0 -0
  199. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/utils/__init__.py +0 -0
  200. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/utils/checksum.py +0 -0
  201. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/utils/dependencies.py +0 -0
  202. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/utils/event_helper.py +0 -0
  203. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/utils/logging.py +0 -0
  204. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/utils/serialization.py +0 -0
  205. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/utils/state_machine.py +0 -0
  206. {conson_xp-1.32.0 → conson_xp-1.33.0}/src/xp/utils/time_utils.py +0 -0
  207. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/.coverage +0 -0
  208. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/__init__.py +0 -0
  209. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/conftest.py +0 -0
  210. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/.coverage +0 -0
  211. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/__init__.py +0 -0
  212. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/telegram_test_data.py +0 -0
  213. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_actiontable_integration.py +0 -0
  214. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_api/.coverage +0 -0
  215. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_api/__init__.py +0 -0
  216. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_blink_integration.py +0 -0
  217. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_checksum_integration.py +0 -0
  218. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_conbus_blink_integration.py +0 -0
  219. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_conbus_datapoint_integration.py +0 -0
  220. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_conbus_raw_integration.py +0 -0
  221. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_conbus_receive_integration.py +0 -0
  222. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_discovery_integration.py +0 -0
  223. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_event_telegram_integration.py +0 -0
  224. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_homekit_config_integration.py +0 -0
  225. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_link_number_integration.py +0 -0
  226. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_module_integration.py +0 -0
  227. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_output_integration.py +0 -0
  228. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_reverse_proxy_integration.py +0 -0
  229. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_system_reply_telegram_integration.py +0 -0
  230. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_term_logging_integration.py +0 -0
  231. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_version_integration.py +0 -0
  232. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_xp20_action_table_integration.py +0 -0
  233. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/integration/test_xp24_action_table_integration.py +0 -0
  234. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/__init__.py +0 -0
  235. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_api/__init__.py +0 -0
  236. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_cli/__init__.py +0 -0
  237. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_cli/test_click_tree.py +0 -0
  238. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_cli/test_conbus_actiontable_commands.py +0 -0
  239. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
  240. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
  241. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_cli/test_decorators.py +0 -0
  242. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_cli/test_error_handlers.py +0 -0
  243. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_cli/test_formatters.py +0 -0
  244. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_cli/test_serial_number_type.py +0 -0
  245. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_cli/test_system_function_choice.py +0 -0
  246. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_cli/test_term_commands.py +0 -0
  247. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_connection/__init__.py +0 -0
  248. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_connection/test_connection_init.py +0 -0
  249. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_connection/test_exceptions.py +0 -0
  250. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_encoding/__init__.py +0 -0
  251. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
  252. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/__init__.py +0 -0
  253. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_conbus.py +0 -0
  254. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_conbus_client_send.py +0 -0
  255. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_conbus_discover.py +0 -0
  256. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
  257. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_event_telegram.py +0 -0
  258. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_log_entry.py +0 -0
  259. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_logger_config.py +0 -0
  260. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_module_type.py +0 -0
  261. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_reply_telegram.py +0 -0
  262. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_system_telegram.py +0 -0
  263. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
  264. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_version_telegram.py +0 -0
  265. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_write_config_type.py +0 -0
  266. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_xp20_action_table.py +0 -0
  267. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_xp24_action_table.py +0 -0
  268. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
  269. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/__init__.py +0 -0
  270. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
  271. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_actiontable_service.py +0 -0
  272. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_actiontable_upload_service.py +0 -0
  273. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_base_server_service.py +0 -0
  274. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_blink_service.py +0 -0
  275. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_checksum_service.py +0 -0
  276. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_client_buffer_manager.py +0 -0
  277. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
  278. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_conbus_event_list_service.py +0 -0
  279. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_conbus_event_protocol.py +0 -0
  280. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
  281. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
  282. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
  283. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
  284. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_device_service_factory.py +0 -0
  285. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_discovery_service.py +0 -0
  286. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
  287. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
  288. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
  289. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_homekit_services.py +0 -0
  290. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_log_file_service.py +0 -0
  291. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_module_type_service.py +0 -0
  292. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_protocol.py +0 -0
  293. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_protocol_monitor_service.py +0 -0
  294. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_server_service.py +0 -0
  295. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_state_monitor_service.py +0 -0
  296. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_telegram_input_service.py +0 -0
  297. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_telegram_output_service.py +0 -0
  298. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_telegram_protocol.py +0 -0
  299. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_telegram_service.py +0 -0
  300. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_version_service.py +0 -0
  301. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_xp20_action_table_serializer.py +0 -0
  302. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_xp24_action_service.py +0 -0
  303. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_xp24_action_table_serializer.py +0 -0
  304. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
  305. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_xp33_action_table_serializer.py +0 -0
  306. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_services/test_xp_server_services.py +0 -0
  307. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_tui/__init__.py +0 -0
  308. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_tui/test_protocol_log.py +0 -0
  309. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_utils/__init__.py +0 -0
  310. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_utils/test_checksum.py +0 -0
  311. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_utils/test_event_helper.py +0 -0
  312. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_utils/test_logging.py +0 -0
  313. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_utils/test_serialization.py +0 -0
  314. {conson_xp-1.32.0 → conson_xp-1.33.0}/tests/unit/test_utils/test_time_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conson-xp
3
- Version: 1.32.0
3
+ Version: 1.33.0
4
4
  Summary: XP Protocol Communication Tools
5
5
  Author-Email: ldvchosal <ldvchosal@github.com>
6
6
  License: MIT License
@@ -91,6 +91,9 @@ Comprehensive type safety and robust error handling
91
91
  # Install with PIP (recommended)
92
92
  pip install conson-xp
93
93
 
94
+ # Export your Conbus device configuration (recommended first step)
95
+ xp conbus export
96
+
94
97
  # Parse a telegram
95
98
  xp telegram parse "<E14L00I02MAK>"
96
99
 
@@ -133,7 +136,29 @@ xp telegram validate "<E14L00I02MAK>"
133
136
  ```
134
137
 
135
138
  **Device Communication**
139
+
140
+ > **⚠️ Important**: Bridge modules (XP130, XP230) accept **only one TCP connection at a time**.
141
+ > Close any existing connections (including the official app) before using xp commands.
142
+
136
143
  ```bash
144
+ # Export device configuration (RECOMMENDED - run this first!)
145
+ # Discovers all devices and exports complete configuration to export.yml
146
+ xp conbus export
147
+
148
+ # What it does:
149
+ # - Automatically discovers all devices on the Conbus network
150
+ # - Queries 7 datapoints per device (type, version, link number, etc.)
151
+ # - Generates export.yml in conson.yml format
152
+ # - Shows real-time progress for each device
153
+ # - Handles timeouts gracefully with partial exports
154
+ #
155
+ # Example output:
156
+ # Querying device 1/12: 0020041013...
157
+ # ✓ Module type: X130 (1)
158
+ # ✓ Link number: 1
159
+ # ✓ Software version: V2.3
160
+ # Export complete: export.yml (12 devices)
161
+
137
162
  # Discover XP servers on your network
138
163
  xp conbus discover
139
164
 
@@ -38,6 +38,9 @@ Comprehensive type safety and robust error handling
38
38
  # Install with PIP (recommended)
39
39
  pip install conson-xp
40
40
 
41
+ # Export your Conbus device configuration (recommended first step)
42
+ xp conbus export
43
+
41
44
  # Parse a telegram
42
45
  xp telegram parse "<E14L00I02MAK>"
43
46
 
@@ -80,7 +83,29 @@ xp telegram validate "<E14L00I02MAK>"
80
83
  ```
81
84
 
82
85
  **Device Communication**
86
+
87
+ > **⚠️ Important**: Bridge modules (XP130, XP230) accept **only one TCP connection at a time**.
88
+ > Close any existing connections (including the official app) before using xp commands.
89
+
83
90
  ```bash
91
+ # Export device configuration (RECOMMENDED - run this first!)
92
+ # Discovers all devices and exports complete configuration to export.yml
93
+ xp conbus export
94
+
95
+ # What it does:
96
+ # - Automatically discovers all devices on the Conbus network
97
+ # - Queries 7 datapoints per device (type, version, link number, etc.)
98
+ # - Generates export.yml in conson.yml format
99
+ # - Shows real-time progress for each device
100
+ # - Handles timeouts gracefully with partial exports
101
+ #
102
+ # Example output:
103
+ # Querying device 1/12: 0020041013...
104
+ # ✓ Module type: X130 (1)
105
+ # ✓ Link number: 1
106
+ # ✓ Software version: V2.3
107
+ # Export complete: export.yml (12 devices)
108
+
84
109
  # Discover XP servers on your network
85
110
  xp conbus discover
86
111
 
@@ -22,7 +22,7 @@ dependencies = [
22
22
  ]
23
23
  requires-python = ">=3.11"
24
24
  readme = "README.md"
25
- version = "1.32.0"
25
+ version = "1.33.0"
26
26
 
27
27
  [project.license]
28
28
  file = "LICENSE"
@@ -3,7 +3,7 @@
3
3
  conson-xp package.
4
4
  """
5
5
 
6
- __version__ = "1.32.0"
6
+ __version__ = "1.33.0"
7
7
  __manufacturer__ = "salchichon"
8
8
  __model__ = "xp.cli"
9
9
  __serial__ = "2025.09.23.000"
@@ -31,8 +31,7 @@ class ConbusExportService:
31
31
  Attributes:
32
32
  conbus_protocol: Protocol for Conbus communication.
33
33
  discovered_devices: List of discovered device serial numbers.
34
- device_configs: Partial device configurations being built.
35
- device_datapoints_received: Set of datapoints received per device.
34
+ device_configs: Device configurations (ConsonModuleConfig instances).
36
35
  export_result: Final export result.
37
36
  export_status: Export status (OK, FAILED_TIMEOUT, etc.).
38
37
  on_progress: Signal emitted on device discovery (serial, current, total).
@@ -69,8 +68,7 @@ class ConbusExportService:
69
68
 
70
69
  # State management
71
70
  self.discovered_devices: list[str] = []
72
- self.device_configs: dict[str, dict[str, Any]] = {}
73
- self.device_datapoints_received: dict[str, set[str]] = {}
71
+ self.device_configs: dict[str, ConsonModuleConfig] = {}
74
72
  self.export_result = ConbusExportResponse(success=False)
75
73
  self.export_status = "OK"
76
74
  self._finalized = False # Track if export has been finalized
@@ -146,8 +144,16 @@ class ConbusExportService:
146
144
 
147
145
  self.logger.debug(f"Device discovered: {serial_number}")
148
146
  self.discovered_devices.append(serial_number)
149
- self.device_configs[serial_number] = {"serial_number": serial_number}
150
- self.device_datapoints_received[serial_number] = set()
147
+
148
+ # Create ConsonModuleConfig with placeholder values for required fields
149
+ module = ConsonModuleConfig(
150
+ name="UNKNOWN", # Will be updated when link_number arrives
151
+ serial_number=serial_number,
152
+ module_type="UNKNOWN", # Required field
153
+ module_type_code=0, # Required field
154
+ link_number=0, # Required field
155
+ )
156
+ self.device_configs[serial_number] = module
151
157
 
152
158
  # Emit progress signal
153
159
  current = len(self.discovered_devices)
@@ -188,7 +194,6 @@ class ConbusExportService:
188
194
  datapoint = DataPointType.from_code(datapoint_code)
189
195
  if datapoint:
190
196
  self._store_datapoint_value(serial_number, datapoint, value)
191
- self.device_datapoints_received[serial_number].add(datapoint_code)
192
197
  self._check_device_complete(serial_number)
193
198
  else:
194
199
  self.logger.warning(f"Unknown datapoint code: {datapoint_code}")
@@ -203,31 +208,49 @@ class ConbusExportService:
203
208
  datapoint: Datapoint type.
204
209
  value: Datapoint value.
205
210
  """
206
- config = self.device_configs[serial_number]
207
-
208
- if datapoint == DataPointType.MODULE_TYPE:
209
- config["module_type"] = value
210
- elif datapoint == DataPointType.MODULE_TYPE_CODE:
211
- try:
212
- config["module_type_code"] = int(value)
213
- except ValueError:
214
- self.logger.warning(f"Invalid module_type_code: {value}")
215
- elif datapoint == DataPointType.LINK_NUMBER:
216
- try:
217
- config["link_number"] = int(value)
218
- except ValueError:
219
- self.logger.warning(f"Invalid link_number: {value}")
220
- elif datapoint == DataPointType.MODULE_NUMBER:
221
- try:
222
- config["module_number"] = int(value)
223
- except ValueError:
224
- self.logger.warning(f"Invalid module_number: {value}")
225
- elif datapoint == DataPointType.SW_VERSION:
226
- config["sw_version"] = value
227
- elif datapoint == DataPointType.HW_VERSION:
228
- config["hw_version"] = value
229
- elif datapoint == DataPointType.AUTO_REPORT_STATUS:
230
- config["auto_report_status"] = value
211
+ module = self.device_configs[serial_number]
212
+
213
+ try:
214
+ if datapoint == DataPointType.MODULE_TYPE:
215
+ module.module_type = value
216
+ elif datapoint == DataPointType.MODULE_TYPE_CODE:
217
+ module.module_type_code = int(value)
218
+ elif datapoint == DataPointType.LINK_NUMBER:
219
+ link = int(value)
220
+ module.link_number = link
221
+ module.name = f"A{link}"
222
+ elif datapoint == DataPointType.MODULE_NUMBER:
223
+ module.module_number = int(value)
224
+ elif datapoint == DataPointType.SW_VERSION:
225
+ module.sw_version = value
226
+ elif datapoint == DataPointType.HW_VERSION:
227
+ module.hw_version = value
228
+ elif datapoint == DataPointType.AUTO_REPORT_STATUS:
229
+ module.auto_report_status = value
230
+ except (ValueError, TypeError) as e:
231
+ self.logger.warning(f"Invalid value '{value}' for {datapoint.name}: {e}")
232
+
233
+ def _is_device_complete(self, serial_number: str) -> bool:
234
+ """Check if a device has all required datapoints.
235
+
236
+ Args:
237
+ serial_number: Serial number of device.
238
+
239
+ Returns:
240
+ True if device is complete, False otherwise.
241
+ """
242
+ module = self.device_configs[serial_number]
243
+ return all(
244
+ [
245
+ module.module_type not in ("UNKNOWN", None, ""),
246
+ module.module_type_code is not None and module.module_type_code > 0,
247
+ module.link_number is not None and module.link_number > 0,
248
+ module.sw_version is not None,
249
+ module.hw_version is not None,
250
+ module.auto_report_status is not None,
251
+ module.module_number is not None,
252
+ ]
253
+ )
231
254
 
232
255
  def _check_device_complete(self, serial_number: str) -> None:
233
256
  """Check if device has all datapoints and emit completion signal.
@@ -235,29 +258,13 @@ class ConbusExportService:
235
258
  Args:
236
259
  serial_number: Serial number of device.
237
260
  """
238
- received = self.device_datapoints_received[serial_number]
239
- expected = {dp.value for dp in self.DATAPOINT_SEQUENCE}
240
-
241
- if received == expected:
261
+ if self._is_device_complete(serial_number):
242
262
  self.logger.debug(f"Device {serial_number} complete (7/7 datapoints)")
243
- config = self.device_configs[serial_number]
244
-
245
- # Build ConsonModuleConfig with name based on link_number
246
- try:
247
- # Add required 'name' field as A{link_number}
248
- if "name" not in config:
249
- link_number = config.get("link_number", 0)
250
- config["name"] = f"A{link_number}"
251
- module_config = ConsonModuleConfig(**config)
252
- self.on_device_exported.emit(module_config)
253
- except Exception as e:
254
- self.logger.error(f"Failed to build config for {serial_number}: {e}")
263
+ module = self.device_configs[serial_number]
264
+ self.on_device_exported.emit(module)
255
265
 
256
266
  # Check if all devices complete
257
- if all(
258
- len(self.device_datapoints_received[sn]) == len(self.DATAPOINT_SEQUENCE)
259
- for sn in self.discovered_devices
260
- ):
267
+ if all(self._is_device_complete(sn) for sn in self.discovered_devices):
261
268
  self.logger.debug("All devices complete")
262
269
  self._finalize_export()
263
270
 
@@ -278,20 +285,8 @@ class ConbusExportService:
278
285
  self.on_finish.emit(self.export_result)
279
286
  return
280
287
 
281
- # Build module list (including partial devices)
282
- modules = []
283
- for serial_number in self.discovered_devices:
284
- config = self.device_configs[serial_number].copy()
285
- try:
286
- # Add required 'name' field as A{link_number} if not present
287
- if "name" not in config:
288
- link_number = config.get("link_number", 0)
289
- config["name"] = f"A{link_number}"
290
- # Only include fields that were received
291
- module_config = ConsonModuleConfig(**config)
292
- modules.append(module_config)
293
- except Exception as e:
294
- self.logger.warning(f"Partial device {serial_number}: {e}")
288
+ # Convert dict values to list (already ConsonModuleConfig instances!)
289
+ modules = list(self.device_configs.values())
295
290
 
296
291
  # Sort modules by link_number
297
292
  modules.sort(key=lambda m: m.link_number if m.link_number is not None else 999)
@@ -380,9 +375,7 @@ class ConbusExportService:
380
375
 
381
376
  # Check if any devices incomplete
382
377
  incomplete = [
383
- sn
384
- for sn in self.discovered_devices
385
- if len(self.device_datapoints_received[sn]) < len(self.DATAPOINT_SEQUENCE)
378
+ sn for sn in self.discovered_devices if not self._is_device_complete(sn)
386
379
  ]
387
380
 
388
381
  if incomplete:
@@ -439,7 +432,6 @@ class ConbusExportService:
439
432
  # Reset state for reuse
440
433
  self.discovered_devices = []
441
434
  self.device_configs = {}
442
- self.device_datapoints_received = {}
443
435
  self.export_result = ConbusExportResponse(success=False)
444
436
  self.export_status = "OK"
445
437
  self._finalized = False
File without changes