conson-xp 1.47.0__tar.gz → 1.49.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.47.0 → conson_xp-1.49.0}/PKG-INFO +1 -1
  2. {conson_xp-1.47.0 → conson_xp-1.49.0}/pyproject.toml +1 -1
  3. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/__init__.py +1 -1
  4. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +0 -4
  5. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/protocol/conbus_protocol.py +1 -2
  6. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +4 -9
  7. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +5 -11
  8. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +5 -11
  9. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/actiontable_download_service.py +6 -3
  10. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_discover_service.py +2 -2
  11. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/msactiontable/msactiontable_upload_service.py +2 -2
  12. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/protocol/__init__.py +2 -3
  13. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/protocol/conbus_event_protocol.py +6 -3
  14. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_actiontable_integration.py +1 -2
  15. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_xp20_action_table_integration.py +2 -2
  16. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_conbus_actiontable_commands.py +3 -8
  17. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_msactiontable_upload_service.py +0 -32
  18. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp20_action_table_serializer.py +9 -10
  19. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp24_action_table_serializer.py +3 -3
  20. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp33_action_table_serializer.py +1 -1
  21. conson_xp-1.47.0/src/xp/services/protocol/conbus_protocol.py +0 -335
  22. {conson_xp-1.47.0 → conson_xp-1.49.0}/LICENSE +0 -0
  23. {conson_xp-1.47.0 → conson_xp-1.49.0}/README.md +0 -0
  24. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/__init__.py +0 -0
  25. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/__main__.py +0 -0
  26. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/__init__.py +0 -0
  27. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/__init__.py +0 -0
  28. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus.py +0 -0
  29. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
  30. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
  31. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
  32. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
  33. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
  34. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
  35. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_event_commands.py +0 -0
  36. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_export_commands.py +0 -0
  37. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
  38. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
  39. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +0 -0
  40. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +0 -0
  41. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
  42. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
  43. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
  44. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
  45. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/file_commands.py +0 -0
  46. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/homekit/__init__.py +0 -0
  47. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/homekit/homekit.py +0 -0
  48. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
  49. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/module_commands.py +0 -0
  50. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
  51. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/server/__init__.py +0 -0
  52. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/server/server_commands.py +0 -0
  53. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/__init__.py +0 -0
  54. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram.py +0 -0
  55. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
  56. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
  57. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
  58. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
  59. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
  60. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
  61. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/term/__init__.py +0 -0
  62. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/term/term.py +0 -0
  63. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/term/term_commands.py +0 -0
  64. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/main.py +0 -0
  65. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/__init__.py +0 -0
  66. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/click_tree.py +0 -0
  67. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
  68. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/decorators.py +0 -0
  69. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/error_handlers.py +0 -0
  70. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/formatters.py +0 -0
  71. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/module_type_choice.py +0 -0
  72. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/serial_number_type.py +0 -0
  73. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/system_function_choice.py +0 -0
  74. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/xp_module_type.py +0 -0
  75. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/__init__.py +0 -0
  76. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/actiontable/__init__.py +0 -0
  77. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/actiontable/actiontable.py +0 -0
  78. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/actiontable/actiontable_type.py +0 -0
  79. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
  80. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/actiontable/msactiontable_xp24.py +0 -0
  81. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
  82. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/__init__.py +0 -0
  83. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus.py +0 -0
  84. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_autoreport.py +0 -0
  85. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_blink.py +0 -0
  86. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_client_config.py +0 -0
  87. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_connection_status.py +0 -0
  88. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_custom.py +0 -0
  89. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_datapoint.py +0 -0
  90. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_discover.py +0 -0
  91. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_event_list.py +0 -0
  92. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_event_raw.py +0 -0
  93. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_export.py +0 -0
  94. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
  95. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_linknumber.py +0 -0
  96. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_logger_config.py +0 -0
  97. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_output.py +0 -0
  98. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_raw.py +0 -0
  99. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_receive.py +0 -0
  100. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
  101. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/config/__init__.py +0 -0
  102. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/config/conson_module_config.py +0 -0
  103. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/homekit/__init__.py +0 -0
  104. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/homekit/homekit_accessory.py +0 -0
  105. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/homekit/homekit_config.py +0 -0
  106. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/log_entry.py +0 -0
  107. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/protocol/__init__.py +0 -0
  108. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/response.py +0 -0
  109. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/__init__.py +0 -0
  110. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/action_type.py +0 -0
  111. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/datapoint_type.py +0 -0
  112. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/event_telegram.py +0 -0
  113. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/event_type.py +0 -0
  114. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/input_action_type.py +0 -0
  115. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/input_type.py +0 -0
  116. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/module_type.py +0 -0
  117. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/module_type_code.py +0 -0
  118. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/output_telegram.py +0 -0
  119. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/reply_telegram.py +0 -0
  120. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/system_function.py +0 -0
  121. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/system_telegram.py +0 -0
  122. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/telegram.py +0 -0
  123. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/telegram_type.py +0 -0
  124. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/timeparam_type.py +0 -0
  125. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/term/__init__.py +0 -0
  126. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/term/connection_state.py +0 -0
  127. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/term/module_state.py +0 -0
  128. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/term/protocol_keys_config.py +0 -0
  129. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/term/status_message.py +0 -0
  130. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/term/telegram_display.py +0 -0
  131. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/write_config_type.py +0 -0
  132. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/__init__.py +0 -0
  133. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/__init__.py +0 -0
  134. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
  135. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/download_state_machine.py +0 -0
  136. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
  137. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/serializer_protocol.py +0 -0
  138. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/__init__.py +0 -0
  139. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/__init__.py +0 -0
  140. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
  141. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
  142. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +0 -0
  143. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
  144. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_blink_service.py +0 -0
  145. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_custom_service.py +0 -0
  146. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
  147. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
  148. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_event_list_service.py +0 -0
  149. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
  150. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_export_service.py +0 -0
  151. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_output_service.py +0 -0
  152. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_raw_service.py +0 -0
  153. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_receive_service.py +0 -0
  154. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_scan_service.py +0 -0
  155. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/msactiontable/__init__.py +0 -0
  156. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/write_config_service.py +0 -0
  157. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/__init__.py +0 -0
  158. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_cache_service.py +0 -0
  159. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
  160. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_config_validator.py +0 -0
  161. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
  162. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
  163. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
  164. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_hap_service.py +0 -0
  165. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
  166. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
  167. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_module_service.py +0 -0
  168. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_outlet.py +0 -0
  169. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
  170. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_service.py +0 -0
  171. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/log_file_service.py +0 -0
  172. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/module_type_service.py +0 -0
  173. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/protocol/protocol_factory.py +0 -0
  174. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/protocol/telegram_protocol.py +0 -0
  175. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/reverse_proxy_service.py +0 -0
  176. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/__init__.py +0 -0
  177. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/base_server_service.py +0 -0
  178. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/client_buffer_manager.py +0 -0
  179. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/cp20_server_service.py +0 -0
  180. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/device_service_factory.py +0 -0
  181. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/server_service.py +0 -0
  182. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/xp130_server_service.py +0 -0
  183. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/xp20_server_service.py +0 -0
  184. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/xp230_server_service.py +0 -0
  185. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/xp24_server_service.py +0 -0
  186. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/xp33_server_service.py +0 -0
  187. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/__init__.py +0 -0
  188. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_blink_service.py +0 -0
  189. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
  190. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
  191. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_discover_service.py +0 -0
  192. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
  193. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_output_service.py +0 -0
  194. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_service.py +0 -0
  195. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_version_service.py +0 -0
  196. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/term/__init__.py +0 -0
  197. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/term/protocol_monitor_service.py +0 -0
  198. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/term/state_monitor_service.py +0 -0
  199. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/__init__.py +0 -0
  200. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/protocol.py +0 -0
  201. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/protocol.tcss +0 -0
  202. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/state.py +0 -0
  203. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/state.tcss +0 -0
  204. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/widgets/__init__.py +0 -0
  205. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/widgets/help_menu.py +0 -0
  206. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/widgets/modules_list.py +0 -0
  207. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/widgets/protocol_log.py +0 -0
  208. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/widgets/status_footer.py +0 -0
  209. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/__init__.py +0 -0
  210. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/checksum.py +0 -0
  211. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/dependencies.py +0 -0
  212. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/event_helper.py +0 -0
  213. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/logging.py +0 -0
  214. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/serialization.py +0 -0
  215. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/state_machine.py +0 -0
  216. {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/time_utils.py +0 -0
  217. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/.coverage +0 -0
  218. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/__init__.py +0 -0
  219. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/conftest.py +0 -0
  220. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/.coverage +0 -0
  221. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/__init__.py +0 -0
  222. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/telegram_test_data.py +0 -0
  223. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_api/.coverage +0 -0
  224. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_api/__init__.py +0 -0
  225. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_blink_integration.py +0 -0
  226. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_checksum_integration.py +0 -0
  227. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_conbus_blink_integration.py +0 -0
  228. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_conbus_datapoint_integration.py +0 -0
  229. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_conbus_raw_integration.py +0 -0
  230. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_conbus_receive_integration.py +0 -0
  231. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_discovery_integration.py +0 -0
  232. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_event_telegram_integration.py +0 -0
  233. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_homekit_config_integration.py +0 -0
  234. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_link_number_integration.py +0 -0
  235. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_module_integration.py +0 -0
  236. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_output_integration.py +0 -0
  237. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_reverse_proxy_integration.py +0 -0
  238. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_system_reply_telegram_integration.py +0 -0
  239. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_term_logging_integration.py +0 -0
  240. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_version_integration.py +0 -0
  241. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_xp24_action_table_integration.py +0 -0
  242. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/__init__.py +0 -0
  243. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_api/__init__.py +0 -0
  244. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/__init__.py +0 -0
  245. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_click_tree.py +0 -0
  246. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
  247. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_conbus_msactiontable_upload_commands.py +0 -0
  248. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
  249. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_decorators.py +0 -0
  250. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_error_handlers.py +0 -0
  251. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_formatters.py +0 -0
  252. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_serial_number_type.py +0 -0
  253. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_system_function_choice.py +0 -0
  254. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_term_commands.py +0 -0
  255. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_encoding/__init__.py +0 -0
  256. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
  257. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/__init__.py +0 -0
  258. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_conbus.py +0 -0
  259. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_conbus_client_send.py +0 -0
  260. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_conbus_discover.py +0 -0
  261. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
  262. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_event_telegram.py +0 -0
  263. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_log_entry.py +0 -0
  264. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_logger_config.py +0 -0
  265. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_module_type.py +0 -0
  266. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_reply_telegram.py +0 -0
  267. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_system_telegram.py +0 -0
  268. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
  269. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_version_telegram.py +0 -0
  270. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_write_config_type.py +0 -0
  271. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_xp20_action_table.py +0 -0
  272. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_xp24_action_table.py +0 -0
  273. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_xp24_action_table_short_format.py +0 -0
  274. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
  275. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/__init__.py +0 -0
  276. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_actiontable_download_service.py +0 -0
  277. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
  278. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_actiontable_service.py +0 -0
  279. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_actiontable_upload_service.py +0 -0
  280. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_base_server_service.py +0 -0
  281. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_blink_service.py +0 -0
  282. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_checksum_service.py +0 -0
  283. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_client_buffer_manager.py +0 -0
  284. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
  285. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_event_list_service.py +0 -0
  286. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_event_protocol.py +0 -0
  287. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
  288. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_output_service.py +0 -0
  289. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
  290. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
  291. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
  292. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_scan_service.py +0 -0
  293. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_device_service_factory.py +0 -0
  294. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_discovery_service.py +0 -0
  295. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
  296. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
  297. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
  298. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_homekit_services.py +0 -0
  299. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_log_file_service.py +0 -0
  300. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_module_type_service.py +0 -0
  301. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_protocol.py +0 -0
  302. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_protocol_monitor_service.py +0 -0
  303. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_server_service.py +0 -0
  304. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_state_monitor_service.py +0 -0
  305. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_telegram_input_service.py +0 -0
  306. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_telegram_output_service.py +0 -0
  307. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_telegram_protocol.py +0 -0
  308. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_telegram_service.py +0 -0
  309. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_version_service.py +0 -0
  310. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp24_action_service.py +0 -0
  311. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
  312. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp33_short_format.py +0 -0
  313. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp_server_services.py +0 -0
  314. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_tui/__init__.py +0 -0
  315. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_tui/test_protocol_log.py +0 -0
  316. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_utils/__init__.py +0 -0
  317. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_checksum.py +0 -0
  318. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_event_helper.py +0 -0
  319. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_logging.py +0 -0
  320. {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_serialization.py +0 -0
  321. {conson_xp-1.47.0 → conson_xp-1.49.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.47.0
3
+ Version: 1.49.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.47.0"
26
+ version = "1.49.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.47.0"
7
+ __version__ = "1.49.0"
8
8
  __manufacturer__ = "salchichon"
9
9
  __model__ = "xp.cli"
10
10
  __serial__ = "2025.09.23.000"
@@ -3,7 +3,6 @@
3
3
  import json
4
4
  from contextlib import suppress
5
5
  from pathlib import Path
6
- from typing import Any, Dict
7
6
 
8
7
  import click
9
8
  from click import Context
@@ -66,7 +65,6 @@ def conbus_download_actiontable(ctx: Context, serial_number: str) -> None:
66
65
 
67
66
  def on_actiontable_received(
68
67
  _actiontable: ActionTable,
69
- actiontable_dict: Dict[str, Any],
70
68
  actiontable_short: list[str],
71
69
  ) -> None:
72
70
  """
@@ -74,13 +72,11 @@ def conbus_download_actiontable(ctx: Context, serial_number: str) -> None:
74
72
 
75
73
  Args:
76
74
  _actiontable: a list of ActionTableEntries.
77
- actiontable_dict: action table in a dictionary.
78
75
  actiontable_short: short representation of action table.
79
76
  """
80
77
  output = {
81
78
  "serial_number": serial_number,
82
79
  "actiontable_short": actiontable_short,
83
- "actiontable": actiontable_dict,
84
80
  }
85
81
  click.echo(json.dumps(output, indent=2, default=str))
86
82
 
@@ -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>")
@@ -42,17 +42,12 @@ class Xp20MsActionTableSerializer(ActionTableSerializerProtocol):
42
42
  ValueError: If input length is not 64 characters
43
43
  """
44
44
  raw_length = len(encoded_data)
45
- if raw_length < 68: # Minimum: 4 char prefix + 64 chars data
45
+ if raw_length < 64: # Minimum: 4 char prefix + 64 chars data
46
46
  raise ValueError(
47
- f"XP20 action table data must be 68 characters long, got {len(encoded_data)}"
47
+ f"XP20 action table data must be 64 characters long, got {len(encoded_data)}"
48
48
  )
49
49
 
50
- # Remove action table count prefix (first 4 characters: AAAA, AAAB, etc.)
51
- data = encoded_data[4:]
52
-
53
- # Take first 64 chars (32 bytes) as per pseudocode
54
- hex_data = data[:64]
55
- raw_bytes = de_nibbles(hex_data)
50
+ raw_bytes = de_nibbles(encoded_data)
56
51
 
57
52
  # Decode input channels
58
53
  input_channels = []
@@ -108,7 +103,7 @@ class Xp20MsActionTableSerializer(ActionTableSerializerProtocol):
108
103
 
109
104
  encoded_data = nibbles(raw_bytes)
110
105
  # Convert raw bytes to hex string with A-P encoding
111
- return "AAAA" + encoded_data
106
+ return encoded_data
112
107
 
113
108
  @staticmethod
114
109
  def to_short_string(action_table: Xp20MsActionTable) -> list[str]:
@@ -36,19 +36,13 @@ class Xp24MsActionTableSerializer(ActionTableSerializerProtocol):
36
36
  ValueError: If data length is not 68 bytes.
37
37
  """
38
38
  raw_length = len(encoded_data)
39
- if raw_length != 68:
39
+ if raw_length != 64:
40
40
  raise ValueError(
41
- f"Msactiontable is not 68 bytes long ({raw_length}): {encoded_data}"
41
+ f"Msactiontable is not 64 bytes long ({raw_length}): {encoded_data}"
42
42
  )
43
43
 
44
- # Remove action table count AAAA, AAAB .
45
- stripped_data = encoded_data[4:]
46
-
47
- # Take first 64 chars (32 bytes) as per pseudocode
48
- hex_data = stripped_data[:64]
49
-
50
44
  # Convert hex string to bytes using deNibble (A-P encoding)
51
- data = de_nibbles(hex_data)
45
+ data = de_nibbles(encoded_data)
52
46
 
53
47
  # Decode input actions from positions 0-3 (2 bytes each)
54
48
  input_actions = []
@@ -78,7 +72,7 @@ class Xp24MsActionTableSerializer(ActionTableSerializerProtocol):
78
72
  action_table: XP24 MS action table to serialize.
79
73
 
80
74
  Returns:
81
- Serialized action table data string (68 characters).
75
+ Serialized action table data string (64 characters).
82
76
  """
83
77
  # Build byte array for the action table (32 bytes total)
84
78
  raw_bytes = bytearray()
@@ -107,7 +101,7 @@ class Xp24MsActionTableSerializer(ActionTableSerializerProtocol):
107
101
 
108
102
  # Build byte array for the action table (32 bytes total)
109
103
  # Prepend action table count "AAAA" (4 chars) -> total 68 chars
110
- return "AAAA" + nibbles(raw_bytes)
104
+ return nibbles(raw_bytes)
111
105
 
112
106
  @staticmethod
113
107
  def to_short_string(action_table: Xp24MsActionTable) -> list[str]:
@@ -139,7 +139,7 @@ class Xp33MsActionTableSerializer(ActionTableSerializerProtocol):
139
139
  encoded_data = nibbles(raw_bytes)
140
140
 
141
141
  # Convert raw bytes to hex string with A-P encoding
142
- return "AAAA" + encoded_data
142
+ return encoded_data
143
143
 
144
144
  @staticmethod
145
145
  def from_encoded_string(msactiontable_rawdata: str) -> Xp33MsActionTable:
@@ -153,22 +153,16 @@ class Xp33MsActionTableSerializer(ActionTableSerializerProtocol):
153
153
  Deserialized XP33 MS action table.
154
154
 
155
155
  Raises:
156
- ValueError: If data length is less than 68 characters.
156
+ ValueError: If data length is less than 64 characters.
157
157
  """
158
158
  raw_length = len(msactiontable_rawdata)
159
- if raw_length < 68: # Minimum: 4 char prefix + 64 chars data
159
+ if raw_length < 64: # Minimum: 4 char prefix + 64 chars data
160
160
  raise ValueError(
161
- f"Msactiontable is too short ({raw_length}), minimum 68 characters required"
161
+ f"Msactiontable is too short ({raw_length}), minimum 64 characters required"
162
162
  )
163
163
 
164
- # Remove action table count prefix (first 4 characters: AAAA, AAAB, etc.)
165
- data = msactiontable_rawdata[4:]
166
-
167
- # Take first 64 chars (32 bytes) as per pseudocode
168
- hex_data = data[:64]
169
-
170
164
  # Convert hex string to bytes using deNibble (A-P encoding)
171
- raw_bytes = de_nibbles(hex_data)
165
+ raw_bytes = de_nibbles(msactiontable_rawdata)
172
166
 
173
167
  # Decode outputs
174
168
  output1 = Xp33MsActionTableSerializer._decode_output(raw_bytes, 0)
@@ -51,7 +51,7 @@ class ActionTableDownloadService(DownloadStateMachine):
51
51
  Attributes:
52
52
  on_progress: Signal emitted with "." for each chunk received.
53
53
  on_error: Signal emitted with error message string.
54
- on_actiontable_received: Signal emitted with (ActionTable, dict, list).
54
+ on_actiontable_received: Signal emitted with (ActionTable, list).
55
55
  on_finish: Signal emitted when download and cleanup completed.
56
56
 
57
57
  Example:
@@ -65,7 +65,7 @@ class ActionTableDownloadService(DownloadStateMachine):
65
65
  on_progress: Signal = Signal(str)
66
66
  on_error: Signal = Signal(str)
67
67
  on_finish: Signal = Signal()
68
- on_actiontable_received: Signal = Signal(Any, dict[str, Any], list[str])
68
+ on_actiontable_received: Signal = Signal(Any, list[str])
69
69
 
70
70
  def __init__(
71
71
  self,
@@ -126,7 +126,10 @@ class ActionTableDownloadService(DownloadStateMachine):
126
126
  def on_enter_requesting(self) -> None:
127
127
  """Enter requesting state - send download request."""
128
128
  self.enter_download_phase() # Sets phase to DOWNLOAD
129
- self.conbus_protocol.send_download_request(serial_number=self.serial_number)
129
+ self.conbus_protocol.send_download_request(
130
+ serial_number=self.serial_number,
131
+ actiontable_type=self.serializer.download_type(),
132
+ )
130
133
  self.send_download()
131
134
 
132
135
  def on_enter_waiting_data(self) -> 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)
@@ -279,8 +279,8 @@ class MsActionTableUploadService:
279
279
  self.failed(f"Invalid msactiontable format: {e}")
280
280
  return
281
281
 
282
- # Serialize to telegram data (68 characters: AAAA + 64 data chars)
283
- self.upload_data = self.serializer.to_encoded_string(msactiontable) # type: ignore[arg-type]
282
+ # Serialize to telegram data (64 characters: AAAA + 64 data chars)
283
+ self.upload_data = "AAAA" + self.serializer.to_encoded_string(msactiontable) # type: ignore[arg-type]
284
284
 
285
285
  self.logger.debug(
286
286
  f"Upload data encoded: {len(self.upload_data)} chars (single chunk)"
@@ -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.
@@ -326,17 +326,20 @@ class ConbusEventProtocol(protocol.Protocol, protocol.ClientFactory):
326
326
  data_value=DataPointType.MODULE_ERROR_CODE.value,
327
327
  )
328
328
 
329
- def send_download_request(self, serial_number: str) -> None:
329
+ def send_download_request(
330
+ self, serial_number: str, actiontable_type: SystemFunction
331
+ ) -> None:
330
332
  """
331
333
  Send download request telegram.
332
334
 
333
335
  Args:
334
336
  serial_number: Device serial number.
337
+ actiontable_type: DOWNLOAD_ACTIONTABLE or DOWNLOAD_MSACTIONTABLE.
335
338
  """
336
339
  self.send_telegram(
337
340
  telegram_type=TelegramType.SYSTEM,
338
341
  serial_number=serial_number,
339
- system_function=SystemFunction.DOWNLOAD_ACTIONTABLE,
342
+ system_function=actiontable_type,
340
343
  data_value=NO_ERROR_CODE,
341
344
  )
342
345
 
@@ -159,14 +159,13 @@ class TestActionTableIntegration:
159
159
  def mock_start_reactor_impl():
160
160
  """Mock reactor start method that triggers callbacks."""
161
161
  # Generate dict and short format like the service does
162
- actiontable_dict = sample_actiontable.model_dump()
163
162
  actiontable_short = ActionTableSerializer.to_short_string(
164
163
  sample_actiontable
165
164
  )
166
165
  # Call the on_actiontable_received callback with data
167
166
  if callbacks["on_actiontable_received"]:
168
167
  callbacks["on_actiontable_received"](
169
- sample_actiontable, actiontable_dict, actiontable_short
168
+ sample_actiontable, actiontable_short
170
169
  )
171
170
  # Call the on_finish callback without arguments
172
171
  if callbacks["on_finish"]:
@@ -169,7 +169,7 @@ class TestXp20ActionTableIntegration:
169
169
  def test_specification_compliance(self):
170
170
  """Test compliance with the specification example."""
171
171
  spec_example = (
172
- "AAAAAAAAAAAAAAABACAEAIBACAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
172
+ "AAAAAAAAAAABACAEAIBACAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
173
173
  )
174
174
 
175
175
  # Should decode without errors
@@ -180,7 +180,7 @@ class TestXp20ActionTableIntegration:
180
180
 
181
181
  # Test that we can re-encode it
182
182
  re_encoded = Xp20MsActionTableSerializer.to_encoded_string(result)
183
- assert len(re_encoded) == 68
183
+ assert len(re_encoded) == 64
184
184
 
185
185
  # Round-trip should work
186
186
  final_result = Xp20MsActionTableSerializer.from_encoded_string(re_encoded)
@@ -118,13 +118,12 @@ class TestConbusActionTableCommands:
118
118
  else:
119
119
  if actiontable:
120
120
  # Generate dict and short format like the service does
121
- actiontable_dict = actiontable.model_dump()
122
121
  actiontable_short = ActionTableSerializer.to_short_string(
123
122
  actiontable
124
123
  )
125
124
  # Emit on_actiontable_received with data
126
125
  for callback in actiontable_received_callbacks:
127
- callback(actiontable, actiontable_dict, actiontable_short)
126
+ callback(actiontable, actiontable_short)
128
127
  # Emit on_finish without arguments
129
128
  for callback in finish_callbacks:
130
129
  callback()
@@ -186,8 +185,7 @@ class TestConbusActionTableCommands:
186
185
  # The output should contain JSON with the actiontable data
187
186
  # It may be on multiple lines due to indentation
188
187
  assert "0000012345" in result.output
189
- assert "actiontable" in result.output
190
- assert "entries" in result.output
188
+ assert "actiontable_short" in result.output
191
189
 
192
190
  def test_conbus_download_actiontable_error_handling(self, runner):
193
191
  """Test actiontable download command error handling."""
@@ -287,8 +285,7 @@ class TestConbusActionTableCommands:
287
285
  # The output should contain the actiontable data
288
286
  # It may be on multiple lines due to indentation and include progress dots
289
287
  assert "0000012345" in result.output
290
- assert "actiontable" in result.output
291
- assert "entries" in result.output
288
+ assert "actiontable_short" in result.output
292
289
 
293
290
  def test_download_actiontable_includes_short_format(
294
291
  self, runner, sample_actiontable
@@ -367,8 +364,6 @@ class TestConbusActionTableCommands:
367
364
 
368
365
  # Verify both formats are present
369
366
  assert "actiontable_short" in result.output
370
- assert "actiontable" in result.output
371
- assert "entries" in result.output
372
367
 
373
368
  def test_download_actiontable_short_with_parameter(self, runner):
374
369
  """Test actiontable_short displays parameter when non-zero."""
@@ -5,7 +5,6 @@ from unittest.mock import Mock, patch
5
5
  import pytest
6
6
 
7
7
  from xp.models.actiontable.msactiontable_xp20 import Xp20MsActionTable
8
- from xp.models.actiontable.msactiontable_xp24 import Xp24MsActionTable
9
8
  from xp.models.actiontable.msactiontable_xp33 import Xp33MsActionTable
10
9
  from xp.models.config.conson_module_config import ConsonModuleConfig
11
10
  from xp.models.protocol.conbus_protocol import TelegramReceivedEvent
@@ -146,37 +145,6 @@ class TestMsActionTableUploadService:
146
145
  data_value="00",
147
146
  )
148
147
 
149
- def test_upload_xp24_msactiontable_success(
150
- self, service, mock_conson_config, mock_xp24_serializer, mock_conbus_protocol
151
- ):
152
- """Test successful XP24 msactiontable upload."""
153
- # Setup module config
154
- module = Mock(spec=ConsonModuleConfig)
155
- module.module_type = "XP24"
156
- module.xp24_msaction_table = [
157
- "T:1 T:2 ON:0 OF:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
158
- ]
159
- mock_conson_config.find_module.return_value = module
160
-
161
- # Setup serializer - mock to_encoded_string to return 68-char string
162
- mock_msactiontable = Mock(spec=Xp24MsActionTable)
163
- mock_xp24_serializer.to_encoded_string.return_value = "AAAA" + "A" * 64
164
-
165
- # Mock from_short_format
166
- with patch(
167
- "xp.models.actiontable.msactiontable_xp24.Xp24MsActionTable.from_short_format",
168
- return_value=mock_msactiontable,
169
- ):
170
- service.start(
171
- serial_number="0020044991",
172
- xpmoduletype="xp24",
173
- )
174
-
175
- assert service.serial_number == "0020044991"
176
- assert service.xpmoduletype == "xp24"
177
- assert service.upload_data == "AAAA" + "A" * 64
178
- assert service.serializer == mock_xp24_serializer
179
-
180
148
  def test_upload_xp20_msactiontable_success(
181
149
  self, service, mock_conson_config, mock_xp20_serializer
182
150
  ):
@@ -55,14 +55,14 @@ class TestXp20MsActionTableSerializer:
55
55
  @pytest.fixture
56
56
  def sample_telegram_data(self):
57
57
  """Sample telegram data based on specification example (68 chars)."""
58
- return "AAAAAAAAAAAAAAABACAEAIBACAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
58
+ return "AAAAAAAAAAABACAEAIBACAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
59
59
 
60
60
  def test_to_data_serialization(self, sample_action_table):
61
61
  """Test serialization to telegram format."""
62
62
  result = Xp20MsActionTableSerializer.to_encoded_string(sample_action_table)
63
63
 
64
64
  # Should return 64-character hex string
65
- assert len(result) == 68
65
+ assert len(result) == 64
66
66
  assert all(c in "ABCDEFGHIJKLMNOP" for c in result)
67
67
 
68
68
  def test_from_data_deserialization(self, sample_telegram_data):
@@ -119,7 +119,7 @@ class TestXp20MsActionTableSerializer:
119
119
 
120
120
  def test_invalid_data_length(self):
121
121
  """Test that invalid data length raises ValueError."""
122
- with pytest.raises(ValueError, match="must be 68 characters long"):
122
+ with pytest.raises(ValueError, match="must be 64 characters long"):
123
123
  Xp20MsActionTableSerializer.from_encoded_string("INVALID")
124
124
 
125
125
  def test_byte_to_bits_conversion(self):
@@ -220,8 +220,7 @@ class TestXp20MsActionTableSerializer:
220
220
  action_table.input8.ta_function = True
221
221
 
222
222
  serialized = Xp20MsActionTableSerializer.to_encoded_string(action_table)
223
- # Skip the 4-character "AAAA" prefix when de-nibbling
224
- raw_bytes = de_nibbles(serialized[4:])
223
+ raw_bytes = de_nibbles(serialized)
225
224
 
226
225
  # Check bit positions
227
226
  assert raw_bytes[SHORT_LONG_INDEX] & 1 != 0 # input1 bit 0
@@ -233,7 +232,7 @@ class TestXp20MsActionTableSerializer:
233
232
  def test_specification_example(self):
234
233
  """Test with the example telegram from specification."""
235
234
  example_data = (
236
- "AAAAAAAAAAAAAAABACAEAIBACAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
235
+ "AAAAAAAAAAABACAEAIBACAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
237
236
  )
238
237
 
239
238
  # This should decode without errors
@@ -260,7 +259,7 @@ class TestXp20MsActionTableSerializer:
260
259
  """Test round-trip serialization with default/empty action table data."""
261
260
  # 64 characters - all A's represent a completely empty/default action table
262
261
  valid_msactiontable = (
263
- "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
262
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
264
263
  )
265
264
 
266
265
  # Deserialize from data
@@ -293,8 +292,8 @@ class TestXp20MsActionTableSerializer:
293
292
  telegram = "<R0020041824F17DAAAAAAAAAAABACAEAIBACAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFP>"
294
293
 
295
294
  # Extract data portion (skip header at 0-15, skip count at 16-19, take 64 chars at 20-83)
296
- data = telegram[16:84]
297
- assert len(data) == 68
295
+ data = telegram[20:84]
296
+ assert len(data) == 64
298
297
 
299
298
  # Deserialize the action table
300
299
  action_table = Xp20MsActionTableSerializer.from_encoded_string(data)
@@ -329,7 +328,7 @@ class TestXp20MsActionTableSerializer:
329
328
  telegram = "<R0020037487F17DAAAAAAAAAAABACAEAIBACAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFL>"
330
329
 
331
330
  # Test serialization with defaults
332
- serialized_table = telegram[16:84]
331
+ serialized_table = telegram[20:84]
333
332
  deserialized = Xp20MsActionTableSerializer.from_encoded_string(serialized_table)
334
333
  serialized = Xp20MsActionTableSerializer.to_encoded_string(deserialized)
335
334
 
@@ -53,7 +53,7 @@ class TestXp24MsActionTableSerializer:
53
53
  # This telegram contains non-hex characters that cause from_hex() to fail
54
54
  # Based on the debug log: '<R0020044989F17DAAAAADAAADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFA>'
55
55
  valid_telegram = (
56
- "AAAAADAAADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
56
+ "ADAAADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
57
57
  )
58
58
 
59
59
  msactiontable = Xp24MsActionTableSerializer.from_encoded_string(valid_telegram)
@@ -79,7 +79,7 @@ class TestXp24MsActionTableSerializer:
79
79
  # This telegram contains non-hex characters that cause from_hex() to fail
80
80
  # Based on the debug log: '<R0020044989F17DAAAAADAAADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFA>'
81
81
  valid_msactiontable = (
82
- "AAAAADAAADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
82
+ "ADAAADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
83
83
  )
84
84
 
85
85
  msactiontable = Xp24MsActionTableSerializer.from_encoded_string(
@@ -97,7 +97,7 @@ class TestXp24MsActionTableSerializer:
97
97
  # This telegram contains non-hex characters that cause from_hex() to fail
98
98
  # Based on the debug log: '<R0020044964F17DAAAAABAGADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFD>'
99
99
  valid_telegram = (
100
- "AAAAABAGADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
100
+ "ABAGADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
101
101
  )
102
102
 
103
103
  msactiontable = Xp24MsActionTableSerializer.from_encoded_string(valid_telegram)
@@ -424,7 +424,7 @@ class TestXp33MsActionTableSerializer:
424
424
  # Create action table with default values
425
425
 
426
426
  # Test serialization with defaults
427
- serialized_table = telegram[16:84]
427
+ serialized_table = telegram[20:84]
428
428
  deserialized = Xp33MsActionTableSerializer.from_encoded_string(serialized_table)
429
429
  serialized = Xp33MsActionTableSerializer.to_encoded_string(deserialized)
430
430