conson-xp 1.48.0__tar.gz → 1.50.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. {conson_xp-1.48.0 → conson_xp-1.50.0}/PKG-INFO +1 -1
  2. {conson_xp-1.48.0 → conson_xp-1.50.0}/pyproject.toml +1 -1
  3. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/__init__.py +1 -1
  4. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +4 -13
  5. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +56 -13
  6. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/actiontable/actiontable_type.py +13 -0
  7. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/protocol/conbus_protocol.py +1 -2
  8. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +99 -19
  9. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/conbus_discover_service.py +2 -2
  10. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/protocol/__init__.py +2 -3
  11. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/protocol/conbus_event_protocol.py +1 -1
  12. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/utils/dependencies.py +3 -34
  13. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_cli/test_conbus_msactiontable_upload_commands.py +17 -104
  14. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_actiontable_upload_service.py +79 -4
  15. conson_xp-1.48.0/src/xp/cli/utils/xp_module_type.py +0 -55
  16. conson_xp-1.48.0/src/xp/services/conbus/msactiontable/__init__.py +0 -1
  17. conson_xp-1.48.0/src/xp/services/conbus/msactiontable/msactiontable_upload_service.py +0 -332
  18. conson_xp-1.48.0/src/xp/services/protocol/conbus_protocol.py +0 -335
  19. conson_xp-1.48.0/tests/unit/test_services/test_msactiontable_upload_service.py +0 -471
  20. {conson_xp-1.48.0 → conson_xp-1.50.0}/LICENSE +0 -0
  21. {conson_xp-1.48.0 → conson_xp-1.50.0}/README.md +0 -0
  22. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/__init__.py +0 -0
  23. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/__main__.py +0 -0
  24. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/__init__.py +0 -0
  25. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/__init__.py +0 -0
  26. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus.py +0 -0
  27. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
  28. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
  29. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
  30. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
  31. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
  32. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
  33. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_event_commands.py +0 -0
  34. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_export_commands.py +0 -0
  35. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
  36. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
  37. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +0 -0
  38. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
  39. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
  40. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
  41. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
  42. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/file_commands.py +0 -0
  43. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/homekit/__init__.py +0 -0
  44. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/homekit/homekit.py +0 -0
  45. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
  46. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/module_commands.py +0 -0
  47. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
  48. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/server/__init__.py +0 -0
  49. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/server/server_commands.py +0 -0
  50. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/telegram/__init__.py +0 -0
  51. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/telegram/telegram.py +0 -0
  52. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
  53. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
  54. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
  55. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
  56. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
  57. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
  58. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/term/__init__.py +0 -0
  59. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/term/term.py +0 -0
  60. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/commands/term/term_commands.py +0 -0
  61. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/main.py +0 -0
  62. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/utils/__init__.py +0 -0
  63. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/utils/click_tree.py +0 -0
  64. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
  65. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/utils/decorators.py +0 -0
  66. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/utils/error_handlers.py +0 -0
  67. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/utils/formatters.py +0 -0
  68. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/utils/module_type_choice.py +0 -0
  69. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/utils/serial_number_type.py +0 -0
  70. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/cli/utils/system_function_choice.py +0 -0
  71. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/__init__.py +0 -0
  72. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/actiontable/__init__.py +0 -0
  73. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/actiontable/actiontable.py +0 -0
  74. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
  75. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/actiontable/msactiontable_xp24.py +0 -0
  76. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
  77. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/__init__.py +0 -0
  78. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus.py +0 -0
  79. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_autoreport.py +0 -0
  80. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_blink.py +0 -0
  81. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_client_config.py +0 -0
  82. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_connection_status.py +0 -0
  83. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_custom.py +0 -0
  84. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_datapoint.py +0 -0
  85. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_discover.py +0 -0
  86. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_event_list.py +0 -0
  87. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_event_raw.py +0 -0
  88. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_export.py +0 -0
  89. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
  90. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_linknumber.py +0 -0
  91. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_logger_config.py +0 -0
  92. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_output.py +0 -0
  93. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_raw.py +0 -0
  94. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_receive.py +0 -0
  95. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
  96. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/config/__init__.py +0 -0
  97. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/config/conson_module_config.py +0 -0
  98. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/homekit/__init__.py +0 -0
  99. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/homekit/homekit_accessory.py +0 -0
  100. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/homekit/homekit_config.py +0 -0
  101. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/log_entry.py +0 -0
  102. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/protocol/__init__.py +0 -0
  103. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/response.py +0 -0
  104. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/__init__.py +0 -0
  105. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/action_type.py +0 -0
  106. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/datapoint_type.py +0 -0
  107. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/event_telegram.py +0 -0
  108. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/event_type.py +0 -0
  109. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/input_action_type.py +0 -0
  110. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/input_type.py +0 -0
  111. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/module_type.py +0 -0
  112. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/module_type_code.py +0 -0
  113. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/output_telegram.py +0 -0
  114. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/reply_telegram.py +0 -0
  115. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/system_function.py +0 -0
  116. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/system_telegram.py +0 -0
  117. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/telegram.py +0 -0
  118. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/telegram_type.py +0 -0
  119. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/telegram/timeparam_type.py +0 -0
  120. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/term/__init__.py +0 -0
  121. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/term/connection_state.py +0 -0
  122. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/term/module_state.py +0 -0
  123. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/term/protocol_keys_config.py +0 -0
  124. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/term/status_message.py +0 -0
  125. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/term/telegram_display.py +0 -0
  126. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/models/write_config_type.py +0 -0
  127. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/__init__.py +0 -0
  128. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/actiontable/__init__.py +0 -0
  129. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
  130. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/actiontable/download_state_machine.py +0 -0
  131. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
  132. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +0 -0
  133. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +0 -0
  134. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +0 -0
  135. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/actiontable/serializer_protocol.py +0 -0
  136. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/__init__.py +0 -0
  137. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/actiontable/__init__.py +0 -0
  138. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/actiontable/actiontable_download_service.py +0 -0
  139. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
  140. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
  141. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
  142. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/conbus_blink_service.py +0 -0
  143. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/conbus_custom_service.py +0 -0
  144. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
  145. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
  146. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/conbus_event_list_service.py +0 -0
  147. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
  148. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/conbus_export_service.py +0 -0
  149. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/conbus_output_service.py +0 -0
  150. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/conbus_raw_service.py +0 -0
  151. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/conbus_receive_service.py +0 -0
  152. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/conbus_scan_service.py +0 -0
  153. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/conbus/write_config_service.py +0 -0
  154. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/__init__.py +0 -0
  155. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/homekit_cache_service.py +0 -0
  156. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
  157. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/homekit_config_validator.py +0 -0
  158. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
  159. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
  160. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
  161. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/homekit_hap_service.py +0 -0
  162. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
  163. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
  164. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/homekit_module_service.py +0 -0
  165. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/homekit_outlet.py +0 -0
  166. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
  167. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/homekit/homekit_service.py +0 -0
  168. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/log_file_service.py +0 -0
  169. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/module_type_service.py +0 -0
  170. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/protocol/protocol_factory.py +0 -0
  171. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/protocol/telegram_protocol.py +0 -0
  172. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/reverse_proxy_service.py +0 -0
  173. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/server/__init__.py +0 -0
  174. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/server/base_server_service.py +0 -0
  175. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/server/client_buffer_manager.py +0 -0
  176. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/server/cp20_server_service.py +0 -0
  177. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/server/device_service_factory.py +0 -0
  178. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/server/server_service.py +0 -0
  179. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/server/xp130_server_service.py +0 -0
  180. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/server/xp20_server_service.py +0 -0
  181. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/server/xp230_server_service.py +0 -0
  182. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/server/xp24_server_service.py +0 -0
  183. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/server/xp33_server_service.py +0 -0
  184. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/telegram/__init__.py +0 -0
  185. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/telegram/telegram_blink_service.py +0 -0
  186. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
  187. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
  188. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/telegram/telegram_discover_service.py +0 -0
  189. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
  190. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/telegram/telegram_output_service.py +0 -0
  191. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/telegram/telegram_service.py +0 -0
  192. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/telegram/telegram_version_service.py +0 -0
  193. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/term/__init__.py +0 -0
  194. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/term/protocol_monitor_service.py +0 -0
  195. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/services/term/state_monitor_service.py +0 -0
  196. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/term/__init__.py +0 -0
  197. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/term/protocol.py +0 -0
  198. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/term/protocol.tcss +0 -0
  199. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/term/state.py +0 -0
  200. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/term/state.tcss +0 -0
  201. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/term/widgets/__init__.py +0 -0
  202. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/term/widgets/help_menu.py +0 -0
  203. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/term/widgets/modules_list.py +0 -0
  204. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/term/widgets/protocol_log.py +0 -0
  205. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/term/widgets/status_footer.py +0 -0
  206. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/utils/__init__.py +0 -0
  207. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/utils/checksum.py +0 -0
  208. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/utils/event_helper.py +0 -0
  209. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/utils/logging.py +0 -0
  210. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/utils/serialization.py +0 -0
  211. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/utils/state_machine.py +0 -0
  212. {conson_xp-1.48.0 → conson_xp-1.50.0}/src/xp/utils/time_utils.py +0 -0
  213. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/.coverage +0 -0
  214. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/__init__.py +0 -0
  215. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/conftest.py +0 -0
  216. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/.coverage +0 -0
  217. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/__init__.py +0 -0
  218. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/telegram_test_data.py +0 -0
  219. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_actiontable_integration.py +0 -0
  220. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_api/.coverage +0 -0
  221. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_api/__init__.py +0 -0
  222. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_blink_integration.py +0 -0
  223. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_checksum_integration.py +0 -0
  224. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_conbus_blink_integration.py +0 -0
  225. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_conbus_datapoint_integration.py +0 -0
  226. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_conbus_raw_integration.py +0 -0
  227. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_conbus_receive_integration.py +0 -0
  228. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_discovery_integration.py +0 -0
  229. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_event_telegram_integration.py +0 -0
  230. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_homekit_config_integration.py +0 -0
  231. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_link_number_integration.py +0 -0
  232. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_module_integration.py +0 -0
  233. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_output_integration.py +0 -0
  234. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_reverse_proxy_integration.py +0 -0
  235. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_system_reply_telegram_integration.py +0 -0
  236. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_term_logging_integration.py +0 -0
  237. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_version_integration.py +0 -0
  238. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_xp20_action_table_integration.py +0 -0
  239. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/integration/test_xp24_action_table_integration.py +0 -0
  240. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/__init__.py +0 -0
  241. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_api/__init__.py +0 -0
  242. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_cli/__init__.py +0 -0
  243. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_cli/test_click_tree.py +0 -0
  244. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_cli/test_conbus_actiontable_commands.py +0 -0
  245. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
  246. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
  247. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_cli/test_decorators.py +0 -0
  248. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_cli/test_error_handlers.py +0 -0
  249. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_cli/test_formatters.py +0 -0
  250. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_cli/test_serial_number_type.py +0 -0
  251. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_cli/test_system_function_choice.py +0 -0
  252. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_cli/test_term_commands.py +0 -0
  253. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_encoding/__init__.py +0 -0
  254. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
  255. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/__init__.py +0 -0
  256. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_conbus.py +0 -0
  257. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_conbus_client_send.py +0 -0
  258. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_conbus_discover.py +0 -0
  259. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
  260. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_event_telegram.py +0 -0
  261. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_log_entry.py +0 -0
  262. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_logger_config.py +0 -0
  263. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_module_type.py +0 -0
  264. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_reply_telegram.py +0 -0
  265. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_system_telegram.py +0 -0
  266. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
  267. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_version_telegram.py +0 -0
  268. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_write_config_type.py +0 -0
  269. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_xp20_action_table.py +0 -0
  270. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_xp24_action_table.py +0 -0
  271. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_xp24_action_table_short_format.py +0 -0
  272. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
  273. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/__init__.py +0 -0
  274. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_actiontable_download_service.py +0 -0
  275. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
  276. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_actiontable_service.py +0 -0
  277. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_base_server_service.py +0 -0
  278. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_blink_service.py +0 -0
  279. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_checksum_service.py +0 -0
  280. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_client_buffer_manager.py +0 -0
  281. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
  282. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_conbus_event_list_service.py +0 -0
  283. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_conbus_event_protocol.py +0 -0
  284. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
  285. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_conbus_output_service.py +0 -0
  286. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
  287. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
  288. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
  289. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_conbus_scan_service.py +0 -0
  290. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_device_service_factory.py +0 -0
  291. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_discovery_service.py +0 -0
  292. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
  293. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
  294. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
  295. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_homekit_services.py +0 -0
  296. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_log_file_service.py +0 -0
  297. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_module_type_service.py +0 -0
  298. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_protocol.py +0 -0
  299. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_protocol_monitor_service.py +0 -0
  300. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_server_service.py +0 -0
  301. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_state_monitor_service.py +0 -0
  302. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_telegram_input_service.py +0 -0
  303. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_telegram_output_service.py +0 -0
  304. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_telegram_protocol.py +0 -0
  305. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_telegram_service.py +0 -0
  306. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_version_service.py +0 -0
  307. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_xp20_action_table_serializer.py +0 -0
  308. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_xp24_action_service.py +0 -0
  309. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_xp24_action_table_serializer.py +0 -0
  310. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
  311. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_xp33_action_table_serializer.py +0 -0
  312. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_xp33_short_format.py +0 -0
  313. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_services/test_xp_server_services.py +0 -0
  314. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_tui/__init__.py +0 -0
  315. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_tui/test_protocol_log.py +0 -0
  316. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_utils/__init__.py +0 -0
  317. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_utils/test_checksum.py +0 -0
  318. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_utils/test_event_helper.py +0 -0
  319. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_utils/test_logging.py +0 -0
  320. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_utils/test_serialization.py +0 -0
  321. {conson_xp-1.48.0 → conson_xp-1.50.0}/tests/unit/test_utils/test_time_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conson-xp
3
- Version: 1.48.0
3
+ Version: 1.50.0
4
4
  Summary: XP Protocol Communication Tools
5
5
  Author-Email: ldvchosal <ldvchosal@github.com>
6
6
  License: MIT License
@@ -23,7 +23,7 @@ dependencies = [
23
23
  ]
24
24
  requires-python = ">=3.11"
25
25
  readme = "README.md"
26
- version = "1.48.0"
26
+ version = "1.50.0"
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.48.0"
7
+ __version__ = "1.50.0"
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
 
@@ -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"
@@ -13,7 +13,6 @@ from xp.models.telegram.datapoint_type import DataPointType
13
13
 
14
14
  if TYPE_CHECKING:
15
15
  from xp.services.protocol.conbus_event_protocol import ConbusEventProtocol
16
- from xp.services.protocol.conbus_protocol import ConbusProtocol
17
16
  from xp.services.protocol.telegram_protocol import TelegramProtocol
18
17
 
19
18
 
@@ -266,7 +265,7 @@ class TelegramEvent(BaseEvent):
266
265
  checksum_valid: Checksum valid true or false.
267
266
  """
268
267
 
269
- protocol: Union[TelegramProtocol, ConbusProtocol, ConbusEventProtocol] = Field(
268
+ protocol: Union[TelegramProtocol, ConbusEventProtocol] = Field(
270
269
  description="TelegramProtocol instance"
271
270
  )
272
271
  frame: str = Field(description="Frame <S0123450001F02D12FK>")
@@ -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:
@@ -25,7 +25,7 @@ class ConbusDiscoverService:
25
25
  """
26
26
  Service for discovering modules on Conbus servers.
27
27
 
28
- Uses ConbusProtocol to provide discovery functionality for finding
28
+ Uses ConbusEventProtocol to provide discovery functionality for finding
29
29
  modules connected to the Conbus network.
30
30
 
31
31
  Attributes:
@@ -45,7 +45,7 @@ class ConbusDiscoverService:
45
45
  Initialize the Conbus discover service.
46
46
 
47
47
  Args:
48
- conbus_protocol: ConbusProtocol.
48
+ conbus_protocol: ConbusEventProtocol instance for communication.
49
49
  """
50
50
  self.conbus_protocol: ConbusEventProtocol = conbus_protocol
51
51
  self.conbus_protocol.on_connection_made.connect(self.connection_made)
@@ -8,12 +8,11 @@ from xp.models.protocol.conbus_protocol import (
8
8
  TelegramReceivedEvent,
9
9
  )
10
10
  from xp.services.protocol.conbus_event_protocol import ConbusEventProtocol
11
- from xp.services.protocol.conbus_protocol import ConbusProtocol
12
11
  from xp.services.protocol.telegram_protocol import TelegramProtocol
13
12
 
14
- __all__ = ["TelegramProtocol", "ConbusProtocol", "ConbusEventProtocol"]
13
+ __all__ = ["TelegramProtocol", "ConbusEventProtocol"]
15
14
 
16
- # Rebuild models after TelegramProtocol and ConbusProtocol are imported to resolve forward references
15
+ # Rebuild models after TelegramProtocol and ConbusEventProtocol are imported to resolve forward references
17
16
  ConnectionMadeEvent.model_rebuild()
18
17
  InvalidTelegramReceivedEvent.model_rebuild()
19
18
  ModuleDiscoveredEvent.model_rebuild()
@@ -98,7 +98,7 @@ class ConbusEventProtocol(protocol.Protocol, protocol.ClientFactory):
98
98
  telegram_service: TelegramService,
99
99
  ) -> None:
100
100
  """
101
- Initialize ConbusProtocol.
101
+ Initialize ConbusEventProtocol.
102
102
 
103
103
  Args:
104
104
  cli_config: Configuration for Conbus client connection.
@@ -51,9 +51,6 @@ from xp.services.conbus.conbus_output_service import ConbusOutputService
51
51
  from xp.services.conbus.conbus_raw_service import ConbusRawService
52
52
  from xp.services.conbus.conbus_receive_service import ConbusReceiveService
53
53
  from xp.services.conbus.conbus_scan_service import ConbusScanService
54
- from xp.services.conbus.msactiontable.msactiontable_upload_service import (
55
- MsActionTableUploadService,
56
- )
57
54
  from xp.services.conbus.write_config_service import WriteConfigService
58
55
  from xp.services.homekit.homekit_cache_service import HomeKitCacheService
59
56
  from xp.services.homekit.homekit_conbus_service import HomeKitConbusService
@@ -336,6 +333,9 @@ class ServiceContainer:
336
333
  factory=lambda: ActionTableUploadService(
337
334
  conbus_protocol=self.container.resolve(ConbusEventProtocol),
338
335
  actiontable_serializer=self.container.resolve(ActionTableSerializer),
336
+ xp20ms_serializer=self.container.resolve(Xp20MsActionTableSerializer),
337
+ xp24ms_serializer=self.container.resolve(Xp24MsActionTableSerializer),
338
+ xp33ms_serializer=self.container.resolve(Xp33MsActionTableSerializer),
339
339
  telegram_service=self.container.resolve(TelegramService),
340
340
  conson_config=self.container.resolve(ConsonModuleListConfig),
341
341
  ),
@@ -372,37 +372,6 @@ class ServiceContainer:
372
372
  scope=punq.Scope.singleton,
373
373
  )
374
374
 
375
- self.container.register(
376
- ActionTableDownloadService,
377
- factory=lambda: ActionTableDownloadService(
378
- conbus_protocol=self.container.resolve(ConbusEventProtocol),
379
- actiontable_serializer=self.container.resolve(ActionTableSerializer),
380
- msactiontable_serializer_xp20=self.container.resolve(
381
- Xp20MsActionTableSerializer
382
- ),
383
- msactiontable_serializer_xp24=self.container.resolve(
384
- Xp24MsActionTableSerializer
385
- ),
386
- msactiontable_serializer_xp33=self.container.resolve(
387
- Xp33MsActionTableSerializer
388
- ),
389
- ),
390
- scope=punq.Scope.singleton,
391
- )
392
-
393
- self.container.register(
394
- MsActionTableUploadService,
395
- factory=lambda: MsActionTableUploadService(
396
- conbus_protocol=self.container.resolve(ConbusEventProtocol),
397
- xp20ms_serializer=self.container.resolve(Xp20MsActionTableSerializer),
398
- xp24ms_serializer=self.container.resolve(Xp24MsActionTableSerializer),
399
- xp33ms_serializer=self.container.resolve(Xp33MsActionTableSerializer),
400
- telegram_service=self.container.resolve(TelegramService),
401
- conson_config=self.container.resolve(ConsonModuleListConfig),
402
- ),
403
- scope=punq.Scope.singleton,
404
- )
405
-
406
375
  self.container.register(
407
376
  ConbusCustomService,
408
377
  factory=lambda: ConbusCustomService(