conson-xp 1.50.0__tar.gz → 1.50.1__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 (317) hide show
  1. {conson_xp-1.50.0 → conson_xp-1.50.1}/PKG-INFO +2 -1
  2. {conson_xp-1.50.0 → conson_xp-1.50.1}/README.md +1 -0
  3. {conson_xp-1.50.0 → conson_xp-1.50.1}/pyproject.toml +1 -1
  4. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/__init__.py +1 -1
  5. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_export_commands.py +86 -0
  6. conson_xp-1.50.1/src/xp/services/conbus/conbus_export_actiontable_service.py +308 -0
  7. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_export_service.py +5 -2
  8. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/utils/dependencies.py +2 -1
  9. {conson_xp-1.50.0 → conson_xp-1.50.1}/LICENSE +0 -0
  10. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/__init__.py +0 -0
  11. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/__main__.py +0 -0
  12. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/__init__.py +0 -0
  13. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/__init__.py +0 -0
  14. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus.py +0 -0
  15. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +0 -0
  16. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
  17. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
  18. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
  19. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
  20. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
  21. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
  22. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_event_commands.py +0 -0
  23. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
  24. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
  25. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +0 -0
  26. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +0 -0
  27. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
  28. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
  29. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
  30. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
  31. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/file_commands.py +0 -0
  32. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/homekit/__init__.py +0 -0
  33. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/homekit/homekit.py +0 -0
  34. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
  35. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/module_commands.py +0 -0
  36. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
  37. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/server/__init__.py +0 -0
  38. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/server/server_commands.py +0 -0
  39. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/__init__.py +0 -0
  40. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram.py +0 -0
  41. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
  42. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
  43. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
  44. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
  45. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
  46. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
  47. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/term/__init__.py +0 -0
  48. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/term/term.py +0 -0
  49. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/commands/term/term_commands.py +0 -0
  50. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/main.py +0 -0
  51. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/utils/__init__.py +0 -0
  52. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/utils/click_tree.py +0 -0
  53. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
  54. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/utils/decorators.py +0 -0
  55. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/utils/error_handlers.py +0 -0
  56. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/utils/formatters.py +0 -0
  57. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/utils/module_type_choice.py +0 -0
  58. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/utils/serial_number_type.py +0 -0
  59. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/cli/utils/system_function_choice.py +0 -0
  60. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/__init__.py +0 -0
  61. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/actiontable/__init__.py +0 -0
  62. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/actiontable/actiontable.py +0 -0
  63. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/actiontable/actiontable_type.py +0 -0
  64. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
  65. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/actiontable/msactiontable_xp24.py +0 -0
  66. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
  67. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/__init__.py +0 -0
  68. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus.py +0 -0
  69. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_autoreport.py +0 -0
  70. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_blink.py +0 -0
  71. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_client_config.py +0 -0
  72. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_connection_status.py +0 -0
  73. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_custom.py +0 -0
  74. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_datapoint.py +0 -0
  75. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_discover.py +0 -0
  76. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_event_list.py +0 -0
  77. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_event_raw.py +0 -0
  78. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_export.py +0 -0
  79. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
  80. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_linknumber.py +0 -0
  81. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_logger_config.py +0 -0
  82. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_output.py +0 -0
  83. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_raw.py +0 -0
  84. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_receive.py +0 -0
  85. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
  86. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/config/__init__.py +0 -0
  87. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/config/conson_module_config.py +0 -0
  88. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/homekit/__init__.py +0 -0
  89. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/homekit/homekit_accessory.py +0 -0
  90. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/homekit/homekit_config.py +0 -0
  91. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/log_entry.py +0 -0
  92. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/protocol/__init__.py +0 -0
  93. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/protocol/conbus_protocol.py +0 -0
  94. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/response.py +0 -0
  95. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/__init__.py +0 -0
  96. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/action_type.py +0 -0
  97. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/datapoint_type.py +0 -0
  98. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/event_telegram.py +0 -0
  99. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/event_type.py +0 -0
  100. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/input_action_type.py +0 -0
  101. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/input_type.py +0 -0
  102. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/module_type.py +0 -0
  103. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/module_type_code.py +0 -0
  104. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/output_telegram.py +0 -0
  105. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/reply_telegram.py +0 -0
  106. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/system_function.py +0 -0
  107. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/system_telegram.py +0 -0
  108. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/telegram.py +0 -0
  109. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/telegram_type.py +0 -0
  110. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/telegram/timeparam_type.py +0 -0
  111. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/term/__init__.py +0 -0
  112. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/term/connection_state.py +0 -0
  113. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/term/module_state.py +0 -0
  114. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/term/protocol_keys_config.py +0 -0
  115. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/term/status_message.py +0 -0
  116. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/term/telegram_display.py +0 -0
  117. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/models/write_config_type.py +0 -0
  118. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/__init__.py +0 -0
  119. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/actiontable/__init__.py +0 -0
  120. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
  121. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/actiontable/download_state_machine.py +0 -0
  122. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
  123. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +0 -0
  124. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +0 -0
  125. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +0 -0
  126. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/actiontable/serializer_protocol.py +0 -0
  127. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/__init__.py +0 -0
  128. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/actiontable/__init__.py +0 -0
  129. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/actiontable/actiontable_download_service.py +0 -0
  130. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
  131. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
  132. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +0 -0
  133. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
  134. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_blink_service.py +0 -0
  135. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_custom_service.py +0 -0
  136. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
  137. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
  138. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_discover_service.py +0 -0
  139. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_event_list_service.py +0 -0
  140. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
  141. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_output_service.py +0 -0
  142. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_raw_service.py +0 -0
  143. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_receive_service.py +0 -0
  144. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_scan_service.py +0 -0
  145. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/conbus/write_config_service.py +0 -0
  146. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/__init__.py +0 -0
  147. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_cache_service.py +0 -0
  148. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
  149. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_config_validator.py +0 -0
  150. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
  151. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
  152. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
  153. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_hap_service.py +0 -0
  154. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
  155. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
  156. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_module_service.py +0 -0
  157. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_outlet.py +0 -0
  158. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
  159. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_service.py +0 -0
  160. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/log_file_service.py +0 -0
  161. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/module_type_service.py +0 -0
  162. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/protocol/__init__.py +0 -0
  163. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/protocol/conbus_event_protocol.py +0 -0
  164. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/protocol/protocol_factory.py +0 -0
  165. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/protocol/telegram_protocol.py +0 -0
  166. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/reverse_proxy_service.py +0 -0
  167. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/server/__init__.py +0 -0
  168. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/server/base_server_service.py +0 -0
  169. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/server/client_buffer_manager.py +0 -0
  170. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/server/cp20_server_service.py +0 -0
  171. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/server/device_service_factory.py +0 -0
  172. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/server/server_service.py +0 -0
  173. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/server/xp130_server_service.py +0 -0
  174. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/server/xp20_server_service.py +0 -0
  175. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/server/xp230_server_service.py +0 -0
  176. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/server/xp24_server_service.py +0 -0
  177. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/server/xp33_server_service.py +0 -0
  178. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/telegram/__init__.py +0 -0
  179. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_blink_service.py +0 -0
  180. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
  181. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
  182. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_discover_service.py +0 -0
  183. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
  184. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_output_service.py +0 -0
  185. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_service.py +0 -0
  186. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_version_service.py +0 -0
  187. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/term/__init__.py +0 -0
  188. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/term/protocol_monitor_service.py +0 -0
  189. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/services/term/state_monitor_service.py +0 -0
  190. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/term/__init__.py +0 -0
  191. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/term/protocol.py +0 -0
  192. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/term/protocol.tcss +0 -0
  193. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/term/state.py +0 -0
  194. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/term/state.tcss +0 -0
  195. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/term/widgets/__init__.py +0 -0
  196. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/term/widgets/help_menu.py +0 -0
  197. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/term/widgets/modules_list.py +0 -0
  198. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/term/widgets/protocol_log.py +0 -0
  199. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/term/widgets/status_footer.py +0 -0
  200. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/utils/__init__.py +0 -0
  201. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/utils/checksum.py +0 -0
  202. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/utils/event_helper.py +0 -0
  203. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/utils/logging.py +0 -0
  204. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/utils/serialization.py +0 -0
  205. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/utils/state_machine.py +0 -0
  206. {conson_xp-1.50.0 → conson_xp-1.50.1}/src/xp/utils/time_utils.py +0 -0
  207. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/.coverage +0 -0
  208. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/__init__.py +0 -0
  209. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/conftest.py +0 -0
  210. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/.coverage +0 -0
  211. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/__init__.py +0 -0
  212. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/telegram_test_data.py +0 -0
  213. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_actiontable_integration.py +0 -0
  214. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_api/.coverage +0 -0
  215. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_api/__init__.py +0 -0
  216. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_blink_integration.py +0 -0
  217. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_checksum_integration.py +0 -0
  218. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_conbus_blink_integration.py +0 -0
  219. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_conbus_datapoint_integration.py +0 -0
  220. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_conbus_raw_integration.py +0 -0
  221. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_conbus_receive_integration.py +0 -0
  222. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_discovery_integration.py +0 -0
  223. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_event_telegram_integration.py +0 -0
  224. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_homekit_config_integration.py +0 -0
  225. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_link_number_integration.py +0 -0
  226. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_module_integration.py +0 -0
  227. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_output_integration.py +0 -0
  228. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_reverse_proxy_integration.py +0 -0
  229. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_system_reply_telegram_integration.py +0 -0
  230. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_term_logging_integration.py +0 -0
  231. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_version_integration.py +0 -0
  232. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_xp20_action_table_integration.py +0 -0
  233. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/integration/test_xp24_action_table_integration.py +0 -0
  234. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/__init__.py +0 -0
  235. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_api/__init__.py +0 -0
  236. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_cli/__init__.py +0 -0
  237. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_click_tree.py +0 -0
  238. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_conbus_actiontable_commands.py +0 -0
  239. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
  240. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_conbus_msactiontable_upload_commands.py +0 -0
  241. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
  242. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_decorators.py +0 -0
  243. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_error_handlers.py +0 -0
  244. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_formatters.py +0 -0
  245. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_serial_number_type.py +0 -0
  246. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_system_function_choice.py +0 -0
  247. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_term_commands.py +0 -0
  248. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_encoding/__init__.py +0 -0
  249. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
  250. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/__init__.py +0 -0
  251. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_conbus.py +0 -0
  252. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_conbus_client_send.py +0 -0
  253. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_conbus_discover.py +0 -0
  254. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
  255. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_event_telegram.py +0 -0
  256. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_log_entry.py +0 -0
  257. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_logger_config.py +0 -0
  258. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_module_type.py +0 -0
  259. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_reply_telegram.py +0 -0
  260. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_system_telegram.py +0 -0
  261. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
  262. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_version_telegram.py +0 -0
  263. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_write_config_type.py +0 -0
  264. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_xp20_action_table.py +0 -0
  265. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_xp24_action_table.py +0 -0
  266. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_xp24_action_table_short_format.py +0 -0
  267. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
  268. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/__init__.py +0 -0
  269. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_actiontable_download_service.py +0 -0
  270. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
  271. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_actiontable_service.py +0 -0
  272. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_actiontable_upload_service.py +0 -0
  273. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_base_server_service.py +0 -0
  274. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_blink_service.py +0 -0
  275. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_checksum_service.py +0 -0
  276. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_client_buffer_manager.py +0 -0
  277. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
  278. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_event_list_service.py +0 -0
  279. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_event_protocol.py +0 -0
  280. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
  281. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_output_service.py +0 -0
  282. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
  283. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
  284. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
  285. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_scan_service.py +0 -0
  286. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_device_service_factory.py +0 -0
  287. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_discovery_service.py +0 -0
  288. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
  289. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
  290. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
  291. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_homekit_services.py +0 -0
  292. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_log_file_service.py +0 -0
  293. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_module_type_service.py +0 -0
  294. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_protocol.py +0 -0
  295. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_protocol_monitor_service.py +0 -0
  296. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_server_service.py +0 -0
  297. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_state_monitor_service.py +0 -0
  298. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_telegram_input_service.py +0 -0
  299. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_telegram_output_service.py +0 -0
  300. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_telegram_protocol.py +0 -0
  301. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_telegram_service.py +0 -0
  302. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_version_service.py +0 -0
  303. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp20_action_table_serializer.py +0 -0
  304. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp24_action_service.py +0 -0
  305. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp24_action_table_serializer.py +0 -0
  306. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
  307. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp33_action_table_serializer.py +0 -0
  308. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp33_short_format.py +0 -0
  309. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp_server_services.py +0 -0
  310. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_tui/__init__.py +0 -0
  311. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_tui/test_protocol_log.py +0 -0
  312. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_utils/__init__.py +0 -0
  313. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_utils/test_checksum.py +0 -0
  314. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_utils/test_event_helper.py +0 -0
  315. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_utils/test_logging.py +0 -0
  316. {conson_xp-1.50.0 → conson_xp-1.50.1}/tests/unit/test_utils/test_serialization.py +0 -0
  317. {conson_xp-1.50.0 → conson_xp-1.50.1}/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.50.0
3
+ Version: 1.50.1
4
4
  Summary: XP Protocol Communication Tools
5
5
  Author-Email: ldvchosal <ldvchosal@github.com>
6
6
  License: MIT License
@@ -353,6 +353,7 @@ xp conbus event raw
353
353
 
354
354
 
355
355
  xp conbus export
356
+ xp conbus export actiontable
356
357
  xp conbus export config
357
358
 
358
359
 
@@ -299,6 +299,7 @@ xp conbus event raw
299
299
 
300
300
 
301
301
  xp conbus export
302
+ xp conbus export actiontable
302
303
  xp conbus export config
303
304
 
304
305
 
@@ -23,7 +23,7 @@ dependencies = [
23
23
  ]
24
24
  requires-python = ">=3.11"
25
25
  readme = "README.md"
26
- version = "1.50.0"
26
+ version = "1.50.1"
27
27
 
28
28
  [project.license]
29
29
  file = "LICENSE"
@@ -4,7 +4,7 @@ XP CLI tool for remote console bus operations.
4
4
  conson-xp package.
5
5
  """
6
6
 
7
- __version__ = "1.50.0"
7
+ __version__ = "1.50.1"
8
8
  __manufacturer__ = "salchichon"
9
9
  __model__ = "xp.cli"
10
10
  __serial__ = "2025.09.23.000"
@@ -6,8 +6,12 @@ import click
6
6
 
7
7
  from xp.cli.commands.conbus.conbus import conbus_export
8
8
  from xp.cli.utils.decorators import connection_command
9
+ from xp.models.actiontable.actiontable_type import ActionTableType
9
10
  from xp.models.conbus.conbus_export import ConbusExportResponse
10
11
  from xp.models.config.conson_module_config import ConsonModuleConfig
12
+ from xp.services.conbus.conbus_export_actiontable_service import (
13
+ ConbusActiontableExportService,
14
+ )
11
15
  from xp.services.conbus.conbus_export_service import ConbusExportService
12
16
 
13
17
 
@@ -91,3 +95,85 @@ def export_conbus_config(ctx: click.Context) -> None:
91
95
  service.on_finish.connect(on_finish)
92
96
  service.set_timeout(5)
93
97
  service.start_reactor()
98
+
99
+
100
+ @conbus_export.command("actiontable")
101
+ @click.pass_context
102
+ @connection_command()
103
+ def export_conbus_actiontable(ctx: click.Context) -> None:
104
+ r"""
105
+ Export Conbus device actiontable to YAML file.
106
+
107
+ Read device list from conson.yml
108
+ Export export.yml file in conson.yml format.
109
+
110
+ Args:
111
+ ctx: Click context object.
112
+
113
+ Examples:
114
+ \b
115
+ # Export device metadata to export.yml
116
+ xp conbus export
117
+ xp conbus export actiontable
118
+ """
119
+
120
+ def on_progress(serial_number: str, current: int, total: int) -> None:
121
+ """
122
+ Handle progress updates during export.
123
+
124
+ Args:
125
+ serial_number: Serial number of discovered device.
126
+ current: Current device number.
127
+ total: Total devices discovered.
128
+ """
129
+ click.echo(f"Querying device {current}/{total}: {serial_number}...")
130
+
131
+ def on_device_actiontable_exported(
132
+ module: ConsonModuleConfig,
133
+ actiontable_type: ActionTableType,
134
+ actiontable_short: str,
135
+ ) -> None:
136
+ """
137
+ Handle device export completion.
138
+
139
+ Args:
140
+ module: Exported module configuration.
141
+ actiontable_type: Type of action table exported.
142
+ actiontable_short: Short representation of the action table.
143
+ """
144
+ serial_number = module.serial_number or "UNKNOWN"
145
+ click.echo(f" ✓ Module: {serial_number})")
146
+ click.echo(f" ✓ Action type: {actiontable_type}")
147
+ click.echo(f" ✓ Action table: {actiontable_short}")
148
+
149
+ def on_finish(result: ConbusExportResponse) -> None:
150
+ """
151
+ Handle export completion.
152
+
153
+ Args:
154
+ result: Export result.
155
+
156
+ Raises:
157
+ ClickException: When export fails with error message from result.
158
+ """
159
+ # Try to stop reactor (may already be stopped)
160
+ with suppress(Exception):
161
+ service.stop_reactor()
162
+
163
+ if result.success:
164
+ click.echo(
165
+ f"\nExport complete: {result.output_file} ({result.device_count} devices)"
166
+ )
167
+ else:
168
+ click.echo(f"Error: {result.error}", err=True)
169
+ raise click.ClickException(result.error or "Export failed")
170
+
171
+ service: ConbusActiontableExportService = (
172
+ ctx.obj.get("container").get_container().resolve(ConbusActiontableExportService)
173
+ )
174
+ with service:
175
+ service.on_progress.connect(on_progress)
176
+ service.on_device_actiontable_exported.connect(on_device_actiontable_exported)
177
+ service.on_finish.connect(on_finish)
178
+ service.set_timeout(5)
179
+ service.start_reactor()
@@ -0,0 +1,308 @@
1
+ """Conbus export service for exporting device configurations."""
2
+
3
+ import asyncio
4
+ import logging
5
+ from pathlib import Path
6
+ from queue import SimpleQueue
7
+ from typing import Any, Optional, Tuple
8
+
9
+ import yaml
10
+ from psygnal import Signal
11
+
12
+ from xp.models.actiontable.actiontable_type import ActionTableType, ActionTableType2
13
+ from xp.models.conbus.conbus_export import ConbusExportResponse
14
+ from xp.models.config.conson_module_config import (
15
+ ConsonModuleConfig,
16
+ ConsonModuleListConfig,
17
+ )
18
+ from xp.services.conbus.actiontable.actiontable_download_service import (
19
+ ActionTableDownloadService,
20
+ )
21
+
22
+
23
+ class ConbusActiontableExportService:
24
+ """
25
+ Service for exporting Conbus device configurations.
26
+
27
+ Discovers all devices on the Conbus network and queries their configuration
28
+ datapoints to generate a structured export file compatible with conson.yml format.
29
+
30
+ Attributes:
31
+ download_service: Download service for exporting device configurations.
32
+ export_result: Final export result.
33
+ export_status: Export status (OK, FAILED_TIMEOUT, etc.).
34
+ on_progress: Signal emitted on device discovery (serial, current, total).
35
+ on_device_actiontable_exported: Signal emitted when device export completes.
36
+ on_finish: Signal emitted when export finishes.
37
+ ACTIONTABLE_SEQUENCE: Sequence of actiontable to query for each device.
38
+ """
39
+
40
+ # Signals (class attributes)
41
+ on_progress: Signal = Signal(str, int, int) # serial, current, total
42
+ on_device_actiontable_exported: Signal = Signal(
43
+ ConsonModuleConfig, ActionTableType, str
44
+ )
45
+ on_finish: Signal = Signal(ConbusExportResponse)
46
+
47
+ ACTIONTABLE_SEQUENCE = [
48
+ ActionTableType2.ACTIONTABLE,
49
+ ActionTableType2.MSACTIONTABLE,
50
+ ]
51
+
52
+ def __init__(
53
+ self,
54
+ download_service: ActionTableDownloadService,
55
+ module_list: ConsonModuleListConfig,
56
+ ) -> None:
57
+ """
58
+ Initialize the Conbus export service.
59
+
60
+ Args:
61
+ download_service: Protocol for downloading actiontables.
62
+ module_list: module to export.
63
+ """
64
+ self.logger = logging.getLogger(__name__)
65
+ self.download_service = download_service
66
+ self._module_list: ConsonModuleListConfig = module_list
67
+ # State management
68
+ self.device_queue: SimpleQueue[Tuple[ConsonModuleConfig, ActionTableType]] = (
69
+ SimpleQueue()
70
+ ) # FIFO
71
+ for module in self._module_list.root:
72
+ self.device_queue.put((module, ActionTableType.ACTIONTABLE))
73
+ if module.module_type == "xp20":
74
+ self.device_queue.put((module, ActionTableType.MSACTIONTABLE_XP20))
75
+ if module.module_type == "xp24":
76
+ self.device_queue.put((module, ActionTableType.MSACTIONTABLE_XP24))
77
+ if module.module_type == "xp33":
78
+ self.device_queue.put((module, ActionTableType.MSACTIONTABLE_XP33))
79
+
80
+ self.current_module: Optional[ConsonModuleConfig] = None
81
+ self.curent_actiontable_type: Optional[ActionTableType] = None
82
+ self.export_result = ConbusExportResponse(success=False)
83
+ self.export_status = "OK"
84
+ # Connect protocol signals
85
+ self._connect_signals()
86
+
87
+ def on_module_actiontable_received(
88
+ self, actiontable: Any, short_actiontable: list[str]
89
+ ) -> None:
90
+ """
91
+ Handle actiontable received event.
92
+
93
+ Args:
94
+ actiontable: Full actiontable data.
95
+ short_actiontable: Short representation of the actiontable.
96
+ """
97
+ if not self.curent_actiontable_type:
98
+ self._fail("Invalid state (curent_actiontable_type)")
99
+ return
100
+
101
+ if not self.current_module:
102
+ self._fail("Invalid state (current_module)")
103
+ return
104
+
105
+ if self.curent_actiontable_type == ActionTableType.ACTIONTABLE:
106
+ self.current_module.action_table = short_actiontable
107
+ elif self.curent_actiontable_type == ActionTableType.MSACTIONTABLE_XP20:
108
+ self.current_module.xp20_msaction_table = short_actiontable
109
+ elif self.curent_actiontable_type == ActionTableType.MSACTIONTABLE_XP24:
110
+ self.current_module.xp24_msaction_table = short_actiontable
111
+ elif self.curent_actiontable_type == ActionTableType.MSACTIONTABLE_XP33:
112
+ self.current_module.xp33_msaction_table = short_actiontable
113
+
114
+ self.on_device_actiontable_exported.emit(
115
+ self.current_module, self.curent_actiontable_type, actiontable
116
+ )
117
+
118
+ def on_module_finish(self) -> None:
119
+ """Handle module export completion."""
120
+ self._save_action_table()
121
+ has_next_module = self.configure()
122
+ if not has_next_module:
123
+ self._succeed()
124
+
125
+ def on_module_progress(self) -> None:
126
+ """Handle module progress event and emit progress signal."""
127
+ serial_number = (
128
+ self.current_module.serial_number if self.current_module else "UNKNOWN"
129
+ )
130
+ total_modules = len(self._module_list.root)
131
+ current_index = total_modules - self.device_queue.qsize()
132
+
133
+ self.on_progress.emit(serial_number, current_index, total_modules)
134
+
135
+ def on_module_error(self, error_message: str) -> None:
136
+ """
137
+ Handle module error event.
138
+
139
+ Args:
140
+ error_message: Error message from module.
141
+ """
142
+ self._fail(error_message)
143
+
144
+ def _save_action_table(self) -> None:
145
+ """Write export to YAML file."""
146
+ self.logger.info("Saving action table")
147
+
148
+ if not self._module_list:
149
+ self._fail("FAILED_NO_DEVICES")
150
+ return
151
+
152
+ try:
153
+ # Write to file
154
+ path = "export.yml"
155
+ output_path = Path(path)
156
+
157
+ # Use Pydantic's model_dump to serialize, excluding only internal fields
158
+ data = self._module_list.model_dump(
159
+ exclude={
160
+ "root": {
161
+ "__all__": {
162
+ "enabled",
163
+ "conbus_ip",
164
+ "conbus_port",
165
+ "action_table",
166
+ }
167
+ }
168
+ },
169
+ exclude_none=True,
170
+ )
171
+
172
+ # Export as list at root level (not wrapped in 'root:' key)
173
+ modules_list = data.get("root", [])
174
+
175
+ with output_path.open("w") as f:
176
+ # Dump each module separately with blank lines between them
177
+ for i, module in enumerate(modules_list):
178
+ # Add blank line before each module except the first
179
+ if i > 0:
180
+ f.write("\n")
181
+
182
+ # Dump single item as list element
183
+ yaml_str = yaml.safe_dump(
184
+ [module],
185
+ default_flow_style=False,
186
+ sort_keys=False,
187
+ allow_unicode=True,
188
+ )
189
+ # Remove the trailing newline and write
190
+ f.write(yaml_str.rstrip("\n") + "\n")
191
+
192
+ self.logger.info(f"Export written to {path}")
193
+ self.export_result.output_file = path
194
+
195
+ except Exception as e:
196
+ self._fail(f"Failed to create export: {e}")
197
+
198
+ def configure(self) -> bool:
199
+ """
200
+ Configure export service.
201
+
202
+ Returns:
203
+ True if there is a module to export, False otherwise.
204
+ """
205
+ self.download_service.reset()
206
+ (self.current_module, self.curent_actiontable_type) = (
207
+ self.device_queue.get_nowait()
208
+ )
209
+ if not (self.current_module or self.curent_actiontable_type):
210
+ self.logger.error("No module to export")
211
+ return False
212
+
213
+ self.download_service.configure(
214
+ self.current_module.serial_number,
215
+ self.curent_actiontable_type,
216
+ )
217
+ self.download_service.do_connect()
218
+ return True
219
+
220
+ def set_event_loop(self, event_loop: asyncio.AbstractEventLoop) -> None:
221
+ """
222
+ Set event loop for async operations.
223
+
224
+ Args:
225
+ event_loop: Event loop to use.
226
+ """
227
+ self.logger.debug("Set event loop")
228
+ self.download_service.set_event_loop(event_loop)
229
+
230
+ def set_timeout(self, timeout_seconds: float) -> None:
231
+ """
232
+ Set timeout.
233
+
234
+ Args:
235
+ timeout_seconds: Timeout in seconds.
236
+ """
237
+ self.download_service.set_timeout(timeout_seconds)
238
+
239
+ def start_reactor(self) -> None:
240
+ """Start the reactor."""
241
+ self.download_service.start_reactor()
242
+
243
+ def stop_reactor(self) -> None:
244
+ """Stop the reactor."""
245
+ self.download_service.stop_reactor()
246
+
247
+ def __enter__(self) -> "ConbusActiontableExportService":
248
+ """
249
+ Enter context manager.
250
+
251
+ Returns:
252
+ Self for context manager protocol.
253
+ """
254
+ # Reset state for reuse
255
+ self.export_result = ConbusExportResponse(success=False)
256
+ self.export_status = "OK"
257
+ self._connect_signals()
258
+ return self
259
+
260
+ def __exit__(
261
+ self, _exc_type: Optional[type], _exc_val: Optional[Exception], _exc_tb: Any
262
+ ) -> None:
263
+ """Exit context manager and disconnect signals."""
264
+ self._disconnect_signals()
265
+ self.stop_reactor()
266
+
267
+ def _connect_signals(self) -> None:
268
+ """Connect download service signals to handlers."""
269
+ self.download_service.on_actiontable_received.connect(
270
+ self.on_module_actiontable_received
271
+ )
272
+ self.download_service.on_finish.connect(self.on_module_finish)
273
+ self.download_service.on_progress.connect(self.on_module_progress)
274
+ self.download_service.on_error.connect(self.on_module_error)
275
+
276
+ def _disconnect_signals(self) -> None:
277
+ """Disconnect download service signals from handlers."""
278
+ self.download_service.on_actiontable_received.connect(
279
+ self.on_module_actiontable_received
280
+ )
281
+ self.download_service.on_finish.disconnect(self.on_module_finish)
282
+ self.download_service.on_progress.disconnect(self.on_module_progress)
283
+ self.download_service.on_error.disconnect(self.on_module_error)
284
+
285
+ self.on_progress.disconnect()
286
+ self.on_device_actiontable_exported.disconnect()
287
+ self.on_finish.disconnect()
288
+
289
+ def _fail(self, error: str) -> None:
290
+ """
291
+ Handle export failure.
292
+
293
+ Args:
294
+ error: Error message.
295
+ """
296
+ self.logger.error(error)
297
+ self.export_result.success = False
298
+ self.export_result.error = error
299
+ self.export_result.export_status = "FAILED"
300
+ self.on_finish.emit(self.export_result)
301
+
302
+ def _succeed(self) -> None:
303
+ """Handle export success."""
304
+ self.logger.info("Export succeed")
305
+ self.export_result.success = True
306
+ self.export_result.error = None
307
+ self.export_result.export_status = "OK"
308
+ self.on_finish.emit(self.export_result)
@@ -57,16 +57,19 @@ class ConbusExportService:
57
57
  DataPointType.AUTO_REPORT_STATUS,
58
58
  ]
59
59
 
60
- def __init__(self, conbus_protocol: ConbusEventProtocol) -> None:
60
+ def __init__(
61
+ self, conbus_protocol: ConbusEventProtocol, telegram_service: TelegramService
62
+ ) -> None:
61
63
  """
62
64
  Initialize the Conbus export service.
63
65
 
64
66
  Args:
65
67
  conbus_protocol: Protocol for Conbus communication.
68
+ telegram_service: TelegramService for telegram parsing.
66
69
  """
67
70
  self.logger = logging.getLogger(__name__)
68
71
  self.conbus_protocol = conbus_protocol
69
- self.telegram_service = TelegramService()
72
+ self.telegram_service = telegram_service
70
73
 
71
74
  # State management
72
75
  self.discovered_devices: list[str] = []
@@ -211,7 +211,8 @@ class ServiceContainer:
211
211
  self.container.register(
212
212
  ConbusExportService,
213
213
  factory=lambda: ConbusExportService(
214
- conbus_protocol=self.container.resolve(ConbusEventProtocol)
214
+ conbus_protocol=self.container.resolve(ConbusEventProtocol),
215
+ telegram_service=self.container.resolve(TelegramService),
215
216
  ),
216
217
  scope=punq.Scope.singleton,
217
218
  )
File without changes