conson-xp 1.49.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 (321) hide show
  1. {conson_xp-1.49.0 → conson_xp-1.50.1}/PKG-INFO +2 -1
  2. {conson_xp-1.49.0 → conson_xp-1.50.1}/README.md +1 -0
  3. {conson_xp-1.49.0 → conson_xp-1.50.1}/pyproject.toml +1 -1
  4. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/__init__.py +1 -1
  5. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +4 -13
  6. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_export_commands.py +86 -0
  7. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +56 -13
  8. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/actiontable/actiontable_type.py +13 -0
  9. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +99 -19
  10. conson_xp-1.50.1/src/xp/services/conbus/conbus_export_actiontable_service.py +308 -0
  11. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_export_service.py +5 -2
  12. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/utils/dependencies.py +5 -35
  13. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_conbus_msactiontable_upload_commands.py +17 -104
  14. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_actiontable_upload_service.py +79 -4
  15. conson_xp-1.49.0/src/xp/cli/utils/xp_module_type.py +0 -55
  16. conson_xp-1.49.0/src/xp/services/conbus/msactiontable/__init__.py +0 -1
  17. conson_xp-1.49.0/src/xp/services/conbus/msactiontable/msactiontable_upload_service.py +0 -332
  18. conson_xp-1.49.0/tests/unit/test_services/test_msactiontable_upload_service.py +0 -471
  19. {conson_xp-1.49.0 → conson_xp-1.50.1}/LICENSE +0 -0
  20. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/__init__.py +0 -0
  21. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/__main__.py +0 -0
  22. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/__init__.py +0 -0
  23. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/__init__.py +0 -0
  24. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus.py +0 -0
  25. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
  26. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
  27. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
  28. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
  29. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
  30. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
  31. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_event_commands.py +0 -0
  32. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
  33. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
  34. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +0 -0
  35. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
  36. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
  37. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
  38. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
  39. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/file_commands.py +0 -0
  40. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/homekit/__init__.py +0 -0
  41. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/homekit/homekit.py +0 -0
  42. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
  43. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/module_commands.py +0 -0
  44. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
  45. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/server/__init__.py +0 -0
  46. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/server/server_commands.py +0 -0
  47. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/__init__.py +0 -0
  48. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram.py +0 -0
  49. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
  50. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
  51. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
  52. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
  53. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
  54. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
  55. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/term/__init__.py +0 -0
  56. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/term/term.py +0 -0
  57. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/commands/term/term_commands.py +0 -0
  58. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/main.py +0 -0
  59. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/utils/__init__.py +0 -0
  60. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/utils/click_tree.py +0 -0
  61. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
  62. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/utils/decorators.py +0 -0
  63. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/utils/error_handlers.py +0 -0
  64. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/utils/formatters.py +0 -0
  65. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/utils/module_type_choice.py +0 -0
  66. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/utils/serial_number_type.py +0 -0
  67. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/cli/utils/system_function_choice.py +0 -0
  68. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/__init__.py +0 -0
  69. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/actiontable/__init__.py +0 -0
  70. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/actiontable/actiontable.py +0 -0
  71. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
  72. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/actiontable/msactiontable_xp24.py +0 -0
  73. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
  74. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/__init__.py +0 -0
  75. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus.py +0 -0
  76. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_autoreport.py +0 -0
  77. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_blink.py +0 -0
  78. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_client_config.py +0 -0
  79. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_connection_status.py +0 -0
  80. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_custom.py +0 -0
  81. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_datapoint.py +0 -0
  82. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_discover.py +0 -0
  83. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_event_list.py +0 -0
  84. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_event_raw.py +0 -0
  85. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_export.py +0 -0
  86. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
  87. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_linknumber.py +0 -0
  88. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_logger_config.py +0 -0
  89. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_output.py +0 -0
  90. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_raw.py +0 -0
  91. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_receive.py +0 -0
  92. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
  93. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/config/__init__.py +0 -0
  94. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/config/conson_module_config.py +0 -0
  95. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/homekit/__init__.py +0 -0
  96. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/homekit/homekit_accessory.py +0 -0
  97. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/homekit/homekit_config.py +0 -0
  98. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/log_entry.py +0 -0
  99. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/protocol/__init__.py +0 -0
  100. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/protocol/conbus_protocol.py +0 -0
  101. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/response.py +0 -0
  102. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/__init__.py +0 -0
  103. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/action_type.py +0 -0
  104. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/datapoint_type.py +0 -0
  105. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/event_telegram.py +0 -0
  106. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/event_type.py +0 -0
  107. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/input_action_type.py +0 -0
  108. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/input_type.py +0 -0
  109. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/module_type.py +0 -0
  110. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/module_type_code.py +0 -0
  111. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/output_telegram.py +0 -0
  112. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/reply_telegram.py +0 -0
  113. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/system_function.py +0 -0
  114. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/system_telegram.py +0 -0
  115. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/telegram.py +0 -0
  116. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/telegram_type.py +0 -0
  117. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/telegram/timeparam_type.py +0 -0
  118. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/term/__init__.py +0 -0
  119. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/term/connection_state.py +0 -0
  120. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/term/module_state.py +0 -0
  121. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/term/protocol_keys_config.py +0 -0
  122. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/term/status_message.py +0 -0
  123. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/term/telegram_display.py +0 -0
  124. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/models/write_config_type.py +0 -0
  125. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/__init__.py +0 -0
  126. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/actiontable/__init__.py +0 -0
  127. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
  128. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/actiontable/download_state_machine.py +0 -0
  129. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
  130. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +0 -0
  131. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +0 -0
  132. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +0 -0
  133. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/actiontable/serializer_protocol.py +0 -0
  134. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/__init__.py +0 -0
  135. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/actiontable/__init__.py +0 -0
  136. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/actiontable/actiontable_download_service.py +0 -0
  137. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
  138. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
  139. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
  140. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_blink_service.py +0 -0
  141. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_custom_service.py +0 -0
  142. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
  143. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
  144. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_discover_service.py +0 -0
  145. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_event_list_service.py +0 -0
  146. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
  147. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_output_service.py +0 -0
  148. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_raw_service.py +0 -0
  149. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_receive_service.py +0 -0
  150. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/conbus_scan_service.py +0 -0
  151. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/conbus/write_config_service.py +0 -0
  152. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/__init__.py +0 -0
  153. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_cache_service.py +0 -0
  154. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
  155. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_config_validator.py +0 -0
  156. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
  157. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
  158. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
  159. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_hap_service.py +0 -0
  160. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
  161. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
  162. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_module_service.py +0 -0
  163. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_outlet.py +0 -0
  164. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
  165. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/homekit/homekit_service.py +0 -0
  166. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/log_file_service.py +0 -0
  167. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/module_type_service.py +0 -0
  168. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/protocol/__init__.py +0 -0
  169. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/protocol/conbus_event_protocol.py +0 -0
  170. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/protocol/protocol_factory.py +0 -0
  171. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/protocol/telegram_protocol.py +0 -0
  172. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/reverse_proxy_service.py +0 -0
  173. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/server/__init__.py +0 -0
  174. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/server/base_server_service.py +0 -0
  175. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/server/client_buffer_manager.py +0 -0
  176. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/server/cp20_server_service.py +0 -0
  177. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/server/device_service_factory.py +0 -0
  178. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/server/server_service.py +0 -0
  179. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/server/xp130_server_service.py +0 -0
  180. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/server/xp20_server_service.py +0 -0
  181. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/server/xp230_server_service.py +0 -0
  182. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/server/xp24_server_service.py +0 -0
  183. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/server/xp33_server_service.py +0 -0
  184. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/telegram/__init__.py +0 -0
  185. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_blink_service.py +0 -0
  186. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
  187. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
  188. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_discover_service.py +0 -0
  189. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
  190. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_output_service.py +0 -0
  191. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_service.py +0 -0
  192. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/telegram/telegram_version_service.py +0 -0
  193. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/term/__init__.py +0 -0
  194. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/term/protocol_monitor_service.py +0 -0
  195. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/services/term/state_monitor_service.py +0 -0
  196. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/term/__init__.py +0 -0
  197. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/term/protocol.py +0 -0
  198. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/term/protocol.tcss +0 -0
  199. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/term/state.py +0 -0
  200. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/term/state.tcss +0 -0
  201. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/term/widgets/__init__.py +0 -0
  202. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/term/widgets/help_menu.py +0 -0
  203. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/term/widgets/modules_list.py +0 -0
  204. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/term/widgets/protocol_log.py +0 -0
  205. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/term/widgets/status_footer.py +0 -0
  206. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/utils/__init__.py +0 -0
  207. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/utils/checksum.py +0 -0
  208. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/utils/event_helper.py +0 -0
  209. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/utils/logging.py +0 -0
  210. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/utils/serialization.py +0 -0
  211. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/utils/state_machine.py +0 -0
  212. {conson_xp-1.49.0 → conson_xp-1.50.1}/src/xp/utils/time_utils.py +0 -0
  213. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/.coverage +0 -0
  214. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/__init__.py +0 -0
  215. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/conftest.py +0 -0
  216. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/.coverage +0 -0
  217. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/__init__.py +0 -0
  218. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/telegram_test_data.py +0 -0
  219. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_actiontable_integration.py +0 -0
  220. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_api/.coverage +0 -0
  221. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_api/__init__.py +0 -0
  222. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_blink_integration.py +0 -0
  223. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_checksum_integration.py +0 -0
  224. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_conbus_blink_integration.py +0 -0
  225. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_conbus_datapoint_integration.py +0 -0
  226. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_conbus_raw_integration.py +0 -0
  227. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_conbus_receive_integration.py +0 -0
  228. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_discovery_integration.py +0 -0
  229. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_event_telegram_integration.py +0 -0
  230. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_homekit_config_integration.py +0 -0
  231. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_link_number_integration.py +0 -0
  232. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_module_integration.py +0 -0
  233. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_output_integration.py +0 -0
  234. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_reverse_proxy_integration.py +0 -0
  235. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_system_reply_telegram_integration.py +0 -0
  236. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_term_logging_integration.py +0 -0
  237. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_version_integration.py +0 -0
  238. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_xp20_action_table_integration.py +0 -0
  239. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/integration/test_xp24_action_table_integration.py +0 -0
  240. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/__init__.py +0 -0
  241. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_api/__init__.py +0 -0
  242. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_cli/__init__.py +0 -0
  243. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_click_tree.py +0 -0
  244. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_conbus_actiontable_commands.py +0 -0
  245. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
  246. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
  247. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_decorators.py +0 -0
  248. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_error_handlers.py +0 -0
  249. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_formatters.py +0 -0
  250. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_serial_number_type.py +0 -0
  251. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_system_function_choice.py +0 -0
  252. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_cli/test_term_commands.py +0 -0
  253. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_encoding/__init__.py +0 -0
  254. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
  255. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/__init__.py +0 -0
  256. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_conbus.py +0 -0
  257. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_conbus_client_send.py +0 -0
  258. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_conbus_discover.py +0 -0
  259. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
  260. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_event_telegram.py +0 -0
  261. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_log_entry.py +0 -0
  262. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_logger_config.py +0 -0
  263. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_module_type.py +0 -0
  264. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_reply_telegram.py +0 -0
  265. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_system_telegram.py +0 -0
  266. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
  267. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_version_telegram.py +0 -0
  268. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_write_config_type.py +0 -0
  269. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_xp20_action_table.py +0 -0
  270. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_xp24_action_table.py +0 -0
  271. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_xp24_action_table_short_format.py +0 -0
  272. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
  273. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/__init__.py +0 -0
  274. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_actiontable_download_service.py +0 -0
  275. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
  276. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_actiontable_service.py +0 -0
  277. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_base_server_service.py +0 -0
  278. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_blink_service.py +0 -0
  279. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_checksum_service.py +0 -0
  280. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_client_buffer_manager.py +0 -0
  281. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
  282. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_event_list_service.py +0 -0
  283. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_event_protocol.py +0 -0
  284. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
  285. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_output_service.py +0 -0
  286. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
  287. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
  288. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
  289. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_conbus_scan_service.py +0 -0
  290. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_device_service_factory.py +0 -0
  291. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_discovery_service.py +0 -0
  292. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
  293. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
  294. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
  295. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_homekit_services.py +0 -0
  296. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_log_file_service.py +0 -0
  297. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_module_type_service.py +0 -0
  298. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_protocol.py +0 -0
  299. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_protocol_monitor_service.py +0 -0
  300. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_server_service.py +0 -0
  301. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_state_monitor_service.py +0 -0
  302. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_telegram_input_service.py +0 -0
  303. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_telegram_output_service.py +0 -0
  304. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_telegram_protocol.py +0 -0
  305. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_telegram_service.py +0 -0
  306. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_version_service.py +0 -0
  307. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp20_action_table_serializer.py +0 -0
  308. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp24_action_service.py +0 -0
  309. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp24_action_table_serializer.py +0 -0
  310. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
  311. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp33_action_table_serializer.py +0 -0
  312. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp33_short_format.py +0 -0
  313. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_services/test_xp_server_services.py +0 -0
  314. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_tui/__init__.py +0 -0
  315. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_tui/test_protocol_log.py +0 -0
  316. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_utils/__init__.py +0 -0
  317. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_utils/test_checksum.py +0 -0
  318. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_utils/test_event_helper.py +0 -0
  319. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_utils/test_logging.py +0 -0
  320. {conson_xp-1.49.0 → conson_xp-1.50.1}/tests/unit/test_utils/test_serialization.py +0 -0
  321. {conson_xp-1.49.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.49.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.49.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.49.0"
7
+ __version__ = "1.50.1"
8
8
  __manufacturer__ = "salchichon"
9
9
  __model__ = "xp.cli"
10
10
  __serial__ = "2025.09.23.000"
@@ -1,8 +1,6 @@
1
1
  """ActionTable CLI commands."""
2
2
 
3
3
  import json
4
- from contextlib import suppress
5
- from pathlib import Path
6
4
 
7
5
  import click
8
6
  from click import Context
@@ -13,10 +11,9 @@ from xp.cli.utils.decorators import (
13
11
  )
14
12
  from xp.cli.utils.serial_number_type import SERIAL
15
13
  from xp.models.actiontable.actiontable import ActionTable
16
- from xp.models.actiontable.actiontable_type import ActionTableType
14
+ from xp.models.actiontable.actiontable_type import ActionTableType, ActionTableType2
17
15
  from xp.models.config.conson_module_config import (
18
16
  ConsonModuleConfig,
19
- ConsonModuleListConfig,
20
17
  )
21
18
  from xp.services.conbus.actiontable.actiontable_download_service import (
22
19
  ActionTableDownloadService,
@@ -164,18 +161,12 @@ def conbus_upload_actiontable(ctx: Context, serial_number: str) -> None:
164
161
 
165
162
  with service:
166
163
  # Load config to get entry count for success message
167
- config_path = Path.cwd() / "conson.yml"
168
- if config_path.exists():
169
- with suppress(Exception):
170
- config = ConsonModuleListConfig.from_yaml(str(config_path))
171
- module = config.find_module(serial_number)
172
- if module and module.action_table:
173
- entries_count = len(module.action_table)
174
-
175
164
  service.on_progress.connect(progress_callback)
176
165
  service.on_finish.connect(on_finish)
177
166
  service.on_error.connect(on_error)
178
- service.start(serial_number=serial_number)
167
+ service.start(
168
+ serial_number=serial_number, actiontable_type=ActionTableType2.ACTIONTABLE
169
+ )
179
170
  service.start_reactor()
180
171
 
181
172
 
@@ -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()
@@ -1,7 +1,7 @@
1
1
  """XP24 Action Table CLI commands."""
2
2
 
3
3
  import json
4
- from typing import Any, Union
4
+ from typing import Any, Optional, Union
5
5
 
6
6
  import click
7
7
  from click import Context
@@ -11,8 +11,7 @@ from xp.cli.utils.decorators import (
11
11
  connection_command,
12
12
  )
13
13
  from xp.cli.utils.serial_number_type import SERIAL
14
- from xp.cli.utils.xp_module_type import XP_MODULE_TYPE
15
- from xp.models.actiontable.actiontable_type import ActionTableType
14
+ from xp.models.actiontable.actiontable_type import ActionTableType, ActionTableType2
16
15
  from xp.models.config.conson_module_config import ConsonModuleConfig
17
16
  from xp.services.conbus.actiontable.actiontable_download_service import (
18
17
  ActionTableDownloadService,
@@ -23,11 +22,59 @@ from xp.services.conbus.actiontable.actiontable_list_service import (
23
22
  from xp.services.conbus.actiontable.actiontable_show_service import (
24
23
  ActionTableShowService,
25
24
  )
26
- from xp.services.conbus.msactiontable.msactiontable_upload_service import (
27
- MsActionTableUploadService,
25
+ from xp.services.conbus.actiontable.actiontable_upload_service import (
26
+ ActionTableUploadService,
28
27
  )
29
28
 
30
29
 
30
+ class XpModuleTypeChoice(click.ParamType):
31
+ """
32
+ Click parameter type for validating XP module types.
33
+
34
+ Attributes:
35
+ name: The parameter type name.
36
+ choices: List of valid module type strings.
37
+ """
38
+
39
+ name = "xpmoduletype"
40
+
41
+ def __init__(self) -> None:
42
+ """Initialize the XpModuleTypeChoice parameter type."""
43
+ self.choices = ["xp20", "xp24", "xp31", "xp33"]
44
+
45
+ def convert(
46
+ self,
47
+ value: Any,
48
+ param: Optional[click.Parameter],
49
+ ctx: Optional[click.Context],
50
+ ) -> Any:
51
+ """
52
+ Convert and validate XP module type input.
53
+
54
+ Args:
55
+ value: The input value to convert.
56
+ param: The Click parameter.
57
+ ctx: The Click context.
58
+
59
+ Returns:
60
+ Lowercase module type string if valid, None if input is None.
61
+ """
62
+ if value is None:
63
+ return value
64
+ normalized_value = value.lower()
65
+ if normalized_value in self.choices:
66
+ return normalized_value
67
+ choices_list = "\n".join(f" - {choice}" for choice in sorted(self.choices))
68
+ self.fail(
69
+ f"{value!r} is not a valid choice. Choose from:\n{choices_list}",
70
+ param,
71
+ ctx,
72
+ )
73
+
74
+
75
+ XP_MODULE_TYPE = XpModuleTypeChoice()
76
+
77
+
31
78
  def _get_actiontable_type(xpmoduletype: str) -> ActionTableType:
32
79
  """
33
80
  Map xpmoduletype string to ActionTableType enum.
@@ -244,22 +291,18 @@ def conbus_show_msactiontable(ctx: Context, serial_number: str) -> None:
244
291
 
245
292
  @conbus_msactiontable.command("upload", short_help="Upload MSActionTable")
246
293
  @click.argument("serial_number", type=SERIAL)
247
- @click.argument("xpmoduletype", type=XP_MODULE_TYPE)
248
294
  @click.pass_context
249
295
  @connection_command()
250
- def conbus_upload_msactiontable(
251
- ctx: Context, serial_number: str, xpmoduletype: str
252
- ) -> None:
296
+ def conbus_upload_msactiontable(ctx: Context, serial_number: str) -> None:
253
297
  """
254
298
  Upload MS action table from conson.yml to XP module.
255
299
 
256
300
  Args:
257
301
  ctx: Click context object.
258
302
  serial_number: 10-digit module serial number.
259
- xpmoduletype: XP module type.
260
303
  """
261
- service: MsActionTableUploadService = (
262
- ctx.obj.get("container").get_container().resolve(MsActionTableUploadService)
304
+ service: ActionTableUploadService = (
305
+ ctx.obj.get("container").get_container().resolve(ActionTableUploadService)
263
306
  )
264
307
 
265
308
  def on_progress(progress: str) -> None:
@@ -300,7 +343,7 @@ def conbus_upload_msactiontable(
300
343
  service.on_finish.connect(on_finish)
301
344
  service.start(
302
345
  serial_number=serial_number,
303
- xpmoduletype=xpmoduletype,
346
+ actiontable_type=ActionTableType2.MSACTIONTABLE,
304
347
  )
305
348
  service.start_reactor()
306
349
 
@@ -18,3 +18,16 @@ class ActionTableType(str, Enum):
18
18
  MSACTIONTABLE_XP20 = "msactiontable_xp20"
19
19
  MSACTIONTABLE_XP24 = "msactiontable_xp24"
20
20
  MSACTIONTABLE_XP33 = "msactiontable_xp33"
21
+
22
+
23
+ class ActionTableType2(str, Enum):
24
+ """
25
+ ActionTable types for download/upload operations.
26
+
27
+ Attributes:
28
+ ACTIONTABLE: Standard action table.
29
+ MSACTIONTABLE: MS action table.
30
+ """
31
+
32
+ ACTIONTABLE = "actiontable"
33
+ MSACTIONTABLE = "msactiontable"
@@ -5,18 +5,32 @@ from typing import Any, Optional
5
5
 
6
6
  from psygnal import Signal
7
7
 
8
- from xp.models.config.conson_module_config import ConsonModuleListConfig
8
+ from xp.models.actiontable.actiontable_type import ActionTableType2
9
+ from xp.models.config.conson_module_config import (
10
+ ConsonModuleConfig,
11
+ ConsonModuleListConfig,
12
+ )
9
13
  from xp.models.protocol.conbus_protocol import TelegramReceivedEvent
10
14
  from xp.models.telegram.system_function import SystemFunction
11
15
  from xp.models.telegram.telegram_type import TelegramType
12
16
  from xp.services.actiontable.actiontable_serializer import ActionTableSerializer
17
+ from xp.services.actiontable.msactiontable_xp20_serializer import (
18
+ Xp20MsActionTableSerializer,
19
+ )
20
+ from xp.services.actiontable.msactiontable_xp24_serializer import (
21
+ Xp24MsActionTableSerializer,
22
+ )
23
+ from xp.services.actiontable.msactiontable_xp33_serializer import (
24
+ Xp33MsActionTableSerializer,
25
+ )
13
26
  from xp.services.protocol.conbus_event_protocol import ConbusEventProtocol
14
27
  from xp.services.telegram.telegram_service import TelegramService
15
28
 
16
29
 
17
30
  class ActionTableUploadService:
18
31
  """
19
- TCP client service for uploading action tables to Conbus modules.
32
+ TCP client service for uploading action tables and MS action tables to Conbus
33
+ modules.
20
34
 
21
35
  Manages TCP socket connections, handles telegram generation and transmission,
22
36
  and processes server responses for action table uploads.
@@ -35,6 +49,9 @@ class ActionTableUploadService:
35
49
  self,
36
50
  conbus_protocol: ConbusEventProtocol,
37
51
  actiontable_serializer: ActionTableSerializer,
52
+ xp20ms_serializer: Xp20MsActionTableSerializer,
53
+ xp24ms_serializer: Xp24MsActionTableSerializer,
54
+ xp33ms_serializer: Xp33MsActionTableSerializer,
38
55
  telegram_service: TelegramService,
39
56
  conson_config: ConsonModuleListConfig,
40
57
  ) -> None:
@@ -44,14 +61,22 @@ class ActionTableUploadService:
44
61
  Args:
45
62
  conbus_protocol: ConbusEventProtocol for communication.
46
63
  actiontable_serializer: Action table serializer.
64
+ xp20ms_serializer: XP20 MS action table serializer.
65
+ xp24ms_serializer: XP24 MS action table serializer.
66
+ xp33ms_serializer: XP33 MS action table serializer.
47
67
  telegram_service: Telegram service for parsing.
48
68
  conson_config: Conson module list configuration.
49
69
  """
50
70
  self.conbus_protocol = conbus_protocol
51
- self.serializer = actiontable_serializer
71
+ self.actiontable_serializer = actiontable_serializer
72
+ self.xp20ms_serializer = xp20ms_serializer
73
+ self.xp24ms_serializer = xp24ms_serializer
74
+ self.xp33ms_serializer = xp33ms_serializer
52
75
  self.telegram_service = telegram_service
53
76
  self.conson_config = conson_config
54
77
  self.serial_number: str = ""
78
+ self.xpmoduletype: str = ""
79
+ self.actiontable_type: ActionTableType2 = ActionTableType2.ACTIONTABLE
55
80
 
56
81
  # Upload state
57
82
  self.upload_data_chunks: list[str] = []
@@ -70,10 +95,17 @@ class ActionTableUploadService:
70
95
  def connection_made(self) -> None:
71
96
  """Handle connection established event."""
72
97
  self.logger.debug("Connection established, sending upload actiontable telegram")
98
+
99
+ system_function = (
100
+ SystemFunction.UPLOAD_ACTIONTABLE
101
+ if self.actiontable_type == ActionTableType2.ACTIONTABLE
102
+ else SystemFunction.UPLOAD_MSACTIONTABLE
103
+ )
104
+
73
105
  self.conbus_protocol.send_telegram(
74
106
  telegram_type=TelegramType.SYSTEM,
75
107
  serial_number=self.serial_number,
76
- system_function=SystemFunction.UPLOAD_ACTIONTABLE,
108
+ system_function=system_function,
77
109
  data_value="00",
78
110
  )
79
111
 
@@ -127,10 +159,16 @@ class ActionTableUploadService:
127
159
  # Second character: 'A' + chunk_index (sequential counter A-O for 15 chunks)
128
160
  prefix_hex = f"AAA{ord('A') + self.current_chunk_index:c}"
129
161
 
162
+ system_function = (
163
+ SystemFunction.ACTIONTABLE
164
+ if self.actiontable_type == ActionTableType2.ACTIONTABLE
165
+ else SystemFunction.MSACTIONTABLE
166
+ )
167
+
130
168
  self.conbus_protocol.send_telegram(
131
169
  telegram_type=TelegramType.SYSTEM,
132
170
  serial_number=self.serial_number,
133
- system_function=SystemFunction.ACTIONTABLE,
171
+ system_function=system_function,
134
172
  data_value=f"{prefix_hex}{chunk}",
135
173
  )
136
174
  self.current_chunk_index += 1
@@ -169,19 +207,24 @@ class ActionTableUploadService:
169
207
  def start(
170
208
  self,
171
209
  serial_number: str,
210
+ actiontable_type: ActionTableType2,
172
211
  timeout_seconds: Optional[float] = None,
173
212
  ) -> None:
174
213
  """
175
- Upload action table to module.
214
+ Upload action table or MS action table to module.
176
215
 
177
216
  Uploads the action table configuration to the specified module.
217
+ Module type will decide which actiontable to use.
178
218
 
179
219
  Args:
180
220
  serial_number: Module serial number.
221
+ actiontable_type: True if actionTable false for MS action table.
181
222
  timeout_seconds: Optional timeout in seconds.
182
223
  """
183
224
  self.logger.info("Starting actiontable upload")
184
225
  self.serial_number = serial_number
226
+ self.actiontable_type = actiontable_type
227
+
185
228
  if timeout_seconds:
186
229
  self.conbus_protocol.timeout_seconds = timeout_seconds
187
230
 
@@ -193,29 +236,65 @@ class ActionTableUploadService:
193
236
 
194
237
  # Parse action table strings to ActionTable object
195
238
  try:
196
- module_action_table = module.action_table or []
197
- action_table = self.serializer.from_short_string(module_action_table)
239
+ encoded_data = self.get_encoded_action_table(module)
240
+ # Chunk the data into 64 byte chunks
241
+ chunk_size = 64
242
+ self.upload_data_chunks = [
243
+ encoded_data[i : i + chunk_size]
244
+ for i in range(0, len(encoded_data), chunk_size)
245
+ ]
246
+ self.current_chunk_index = 0
247
+
198
248
  except ValueError as e:
199
249
  self.logger.error(f"Invalid action table format: {e}")
200
250
  self.failed(f"Invalid action table format: {e}")
201
251
  return
202
252
 
203
- # Encode action table to hex string
204
- encoded_data = self.serializer.to_encoded_string(action_table)
205
-
206
- # Chunk the data into 64 byte chunks
207
- chunk_size = 64
208
- self.upload_data_chunks = [
209
- encoded_data[i : i + chunk_size]
210
- for i in range(0, len(encoded_data), chunk_size)
211
- ]
212
- self.current_chunk_index = 0
213
-
214
253
  self.logger.debug(
215
254
  f"Upload data encoded: {len(encoded_data)} chars, "
216
255
  f"{len(self.upload_data_chunks)} chunks"
217
256
  )
218
257
 
258
+ def get_encoded_action_table(self, module: ConsonModuleConfig) -> str:
259
+ """
260
+ Get encoded action table string for upload.
261
+
262
+ Args:
263
+ module: Module configuration containing action table data.
264
+
265
+ Returns:
266
+ Hex-encoded action table string ready for transmission.
267
+ """
268
+ msactiontable = (
269
+ True if self.actiontable_type == ActionTableType2.MSACTIONTABLE else False
270
+ )
271
+ # Parse MS action table from short format (first element)
272
+ if msactiontable and module.module_type.lower() == "xp20":
273
+ xp20_short_table = module.xp20_msaction_table or []
274
+ xp20_actiontable = self.xp20ms_serializer.from_short_string(
275
+ xp20_short_table
276
+ )
277
+ encoded_string = self.xp20ms_serializer.to_encoded_string(xp20_actiontable)
278
+ elif msactiontable and module.module_type.lower() == "xp24":
279
+ xp24_short_table = module.xp24_msaction_table or []
280
+ xp24_actiontable = self.xp24ms_serializer.from_short_string(
281
+ xp24_short_table
282
+ )
283
+ encoded_string = self.xp24ms_serializer.to_encoded_string(xp24_actiontable)
284
+ elif msactiontable and module.module_type.lower() == "xp33":
285
+ xp33_short_table = module.xp33_msaction_table or []
286
+ xp33_actiontable = self.xp33ms_serializer.from_short_string(
287
+ xp33_short_table
288
+ )
289
+ encoded_string = self.xp33ms_serializer.to_encoded_string(xp33_actiontable)
290
+ else:
291
+ short_table = module.action_table or []
292
+ actiontable = self.actiontable_serializer.from_short_string(short_table)
293
+ encoded_string = self.actiontable_serializer.to_encoded_string(actiontable)
294
+
295
+ # Serialize to telegram data (64 characters: AAAA + 64 data chars)
296
+ return encoded_string
297
+
219
298
  def set_timeout(self, timeout_seconds: float) -> None:
220
299
  """
221
300
  Set operation timeout.
@@ -243,6 +322,7 @@ class ActionTableUploadService:
243
322
  self.upload_data_chunks = []
244
323
  self.current_chunk_index = 0
245
324
  self.serial_number = ""
325
+ self.xpmoduletype = ""
246
326
  return self
247
327
 
248
328
  def __exit__(self, _exc_type: Any, _exc_val: Any, _exc_tb: Any) -> None: