conson-xp 1.36.0__tar.gz → 1.38.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 (325) hide show
  1. {conson_xp-1.36.0 → conson_xp-1.38.0}/PKG-INFO +6 -1
  2. {conson_xp-1.36.0 → conson_xp-1.38.0}/README.md +5 -0
  3. {conson_xp-1.36.0 → conson_xp-1.38.0}/pyproject.toml +1 -1
  4. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/__init__.py +1 -1
  5. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/__init__.py +2 -0
  6. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/__init__.py +2 -0
  7. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus.py +26 -0
  8. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +18 -9
  9. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +5 -2
  10. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_event_commands.py +1 -7
  11. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_export_commands.py +7 -6
  12. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +2 -0
  13. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +2 -0
  14. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +2 -0
  15. conson_xp-1.38.0/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +175 -0
  16. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_output_commands.py +4 -0
  17. conson_xp-1.38.0/src/xp/models/actiontable/msactiontable.py +9 -0
  18. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/actiontable/msactiontable_xp20.py +14 -14
  19. conson_xp-1.38.0/src/xp/models/actiontable/msactiontable_xp24.py +275 -0
  20. conson_xp-1.38.0/src/xp/models/actiontable/msactiontable_xp33.py +93 -0
  21. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_export.py +6 -2
  22. conson_xp-1.38.0/src/xp/models/config/__init__.py +1 -0
  23. conson_xp-1.36.0/src/xp/models/homekit/homekit_conson_config.py → conson_xp-1.38.0/src/xp/models/config/conson_module_config.py +3 -1
  24. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/protocol/conbus_protocol.py +1 -1
  25. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/datapoint_type.py +30 -0
  26. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +12 -0
  27. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +13 -1
  28. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +12 -0
  29. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/actiontable/actiontable_download_service.py +8 -5
  30. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/actiontable/actiontable_list_service.py +2 -1
  31. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/actiontable/actiontable_show_service.py +2 -2
  32. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +1 -1
  33. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/conbus_datapoint_service.py +1 -1
  34. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/conbus_event_list_service.py +1 -1
  35. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/conbus_export_service.py +1 -1
  36. conson_xp-1.38.0/src/xp/services/conbus/msactiontable/__init__.py +1 -0
  37. conson_xp-1.36.0/src/xp/services/conbus/actiontable/msactiontable_service.py → conson_xp-1.38.0/src/xp/services/conbus/msactiontable/msactiontable_download_service.py +9 -6
  38. conson_xp-1.38.0/src/xp/services/conbus/msactiontable/msactiontable_list_service.py +92 -0
  39. conson_xp-1.38.0/src/xp/services/conbus/msactiontable/msactiontable_show_service.py +89 -0
  40. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/homekit_config_validator.py +1 -1
  41. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/homekit_conson_validator.py +1 -1
  42. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/homekit_dimminglight.py +1 -1
  43. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/homekit_lightbulb.py +1 -1
  44. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/homekit_module_service.py +1 -1
  45. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/homekit_outlet.py +1 -1
  46. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/protocol/conbus_event_protocol.py +7 -3
  47. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/server/server_service.py +1 -1
  48. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/term/state_monitor_service.py +1 -1
  49. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/utils/dependencies.py +36 -14
  50. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_actiontable_integration.py +1 -1
  51. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_homekit_config_integration.py +1 -1
  52. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_xp20_action_table_integration.py +3 -3
  53. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_xp24_action_table_integration.py +23 -13
  54. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_cli/test_conbus_actiontable_commands.py +2 -2
  55. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_xp24_action_table.py +10 -10
  56. conson_xp-1.38.0/tests/unit/test_models/test_xp24_action_table_short_format.py +244 -0
  57. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_actiontable_service.py +4 -4
  58. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_conbus_event_list_service.py +1 -1
  59. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_homekit_config_validator.py +4 -4
  60. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_homekit_conson_service.py +1 -1
  61. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_homekit_services.py +1 -1
  62. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_state_monitor_service.py +1 -1
  63. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_xp24_action_table_serializer.py +10 -4
  64. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_xp24_action_table_service.py +26 -11
  65. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_xp33_action_table_serializer.py +1 -1
  66. conson_xp-1.36.0/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +0 -92
  67. conson_xp-1.36.0/src/xp/models/actiontable/msactiontable_xp24.py +0 -58
  68. conson_xp-1.36.0/src/xp/models/actiontable/msactiontable_xp33.py +0 -65
  69. {conson_xp-1.36.0 → conson_xp-1.38.0}/LICENSE +0 -0
  70. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/__init__.py +0 -0
  71. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/__main__.py +0 -0
  72. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
  73. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
  74. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
  75. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
  76. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
  77. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
  78. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
  79. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
  80. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/file_commands.py +0 -0
  81. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/homekit/__init__.py +0 -0
  82. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/homekit/homekit.py +0 -0
  83. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
  84. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/module_commands.py +0 -0
  85. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
  86. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/server/__init__.py +0 -0
  87. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/server/server_commands.py +0 -0
  88. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/telegram/__init__.py +0 -0
  89. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/telegram/telegram.py +0 -0
  90. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
  91. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
  92. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
  93. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
  94. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
  95. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
  96. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/term/__init__.py +0 -0
  97. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/term/term.py +0 -0
  98. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/commands/term/term_commands.py +0 -0
  99. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/main.py +0 -0
  100. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/utils/__init__.py +0 -0
  101. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/utils/click_tree.py +0 -0
  102. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
  103. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/utils/decorators.py +0 -0
  104. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/utils/error_handlers.py +0 -0
  105. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/utils/formatters.py +0 -0
  106. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/utils/module_type_choice.py +0 -0
  107. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/utils/serial_number_type.py +0 -0
  108. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/utils/system_function_choice.py +0 -0
  109. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/cli/utils/xp_module_type.py +0 -0
  110. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/connection/__init__.py +0 -0
  111. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/connection/exceptions.py +0 -0
  112. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/__init__.py +0 -0
  113. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/actiontable/__init__.py +0 -0
  114. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/actiontable/actiontable.py +0 -0
  115. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/__init__.py +0 -0
  116. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus.py +0 -0
  117. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_autoreport.py +0 -0
  118. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_blink.py +0 -0
  119. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_client_config.py +0 -0
  120. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_connection_status.py +0 -0
  121. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_custom.py +0 -0
  122. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_datapoint.py +0 -0
  123. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_discover.py +0 -0
  124. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_event_list.py +0 -0
  125. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_event_raw.py +0 -0
  126. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
  127. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_linknumber.py +0 -0
  128. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_logger_config.py +0 -0
  129. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_output.py +0 -0
  130. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_raw.py +0 -0
  131. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_receive.py +0 -0
  132. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
  133. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/homekit/__init__.py +0 -0
  134. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/homekit/homekit_accessory.py +0 -0
  135. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/homekit/homekit_config.py +0 -0
  136. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/log_entry.py +0 -0
  137. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/protocol/__init__.py +0 -0
  138. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/response.py +0 -0
  139. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/__init__.py +0 -0
  140. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/action_type.py +0 -0
  141. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/event_telegram.py +0 -0
  142. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/event_type.py +0 -0
  143. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/input_action_type.py +0 -0
  144. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/input_type.py +0 -0
  145. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/module_type.py +0 -0
  146. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/module_type_code.py +0 -0
  147. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/output_telegram.py +0 -0
  148. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/reply_telegram.py +0 -0
  149. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/system_function.py +0 -0
  150. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/system_telegram.py +0 -0
  151. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/telegram.py +0 -0
  152. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/telegram_type.py +0 -0
  153. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/telegram/timeparam_type.py +0 -0
  154. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/term/__init__.py +0 -0
  155. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/term/connection_state.py +0 -0
  156. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/term/module_state.py +0 -0
  157. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/term/protocol_keys_config.py +0 -0
  158. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/term/status_message.py +0 -0
  159. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/term/telegram_display.py +0 -0
  160. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/models/write_config_type.py +0 -0
  161. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/__init__.py +0 -0
  162. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/actiontable/__init__.py +0 -0
  163. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
  164. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
  165. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/__init__.py +0 -0
  166. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/actiontable/__init__.py +0 -0
  167. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
  168. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/conbus_blink_service.py +0 -0
  169. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/conbus_custom_service.py +0 -0
  170. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
  171. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/conbus_discover_service.py +0 -0
  172. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
  173. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/conbus_output_service.py +0 -0
  174. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/conbus_raw_service.py +0 -0
  175. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/conbus_receive_service.py +0 -0
  176. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/conbus_scan_service.py +0 -0
  177. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/conbus/write_config_service.py +0 -0
  178. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/__init__.py +0 -0
  179. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/homekit_cache_service.py +0 -0
  180. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
  181. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
  182. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/homekit_hap_service.py +0 -0
  183. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
  184. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
  185. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/homekit/homekit_service.py +0 -0
  186. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/log_file_service.py +0 -0
  187. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/module_type_service.py +0 -0
  188. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/protocol/__init__.py +0 -0
  189. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/protocol/conbus_protocol.py +0 -0
  190. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/protocol/protocol_factory.py +0 -0
  191. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/protocol/telegram_protocol.py +0 -0
  192. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/reverse_proxy_service.py +0 -0
  193. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/server/__init__.py +0 -0
  194. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/server/base_server_service.py +0 -0
  195. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/server/client_buffer_manager.py +0 -0
  196. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/server/cp20_server_service.py +0 -0
  197. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/server/device_service_factory.py +0 -0
  198. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/server/xp130_server_service.py +0 -0
  199. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/server/xp20_server_service.py +0 -0
  200. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/server/xp230_server_service.py +0 -0
  201. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/server/xp24_server_service.py +0 -0
  202. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/server/xp33_server_service.py +0 -0
  203. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/telegram/__init__.py +0 -0
  204. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/telegram/telegram_blink_service.py +0 -0
  205. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
  206. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
  207. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/telegram/telegram_discover_service.py +0 -0
  208. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
  209. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/telegram/telegram_output_service.py +0 -0
  210. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/telegram/telegram_service.py +0 -0
  211. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/telegram/telegram_version_service.py +0 -0
  212. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/term/__init__.py +0 -0
  213. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/services/term/protocol_monitor_service.py +0 -0
  214. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/term/__init__.py +0 -0
  215. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/term/protocol.py +0 -0
  216. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/term/protocol.tcss +0 -0
  217. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/term/state.py +0 -0
  218. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/term/state.tcss +0 -0
  219. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/term/widgets/__init__.py +0 -0
  220. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/term/widgets/help_menu.py +0 -0
  221. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/term/widgets/modules_list.py +0 -0
  222. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/term/widgets/protocol_log.py +0 -0
  223. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/term/widgets/status_footer.py +0 -0
  224. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/utils/__init__.py +0 -0
  225. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/utils/checksum.py +0 -0
  226. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/utils/event_helper.py +0 -0
  227. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/utils/logging.py +0 -0
  228. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/utils/serialization.py +0 -0
  229. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/utils/state_machine.py +0 -0
  230. {conson_xp-1.36.0 → conson_xp-1.38.0}/src/xp/utils/time_utils.py +0 -0
  231. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/.coverage +0 -0
  232. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/__init__.py +0 -0
  233. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/conftest.py +0 -0
  234. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/.coverage +0 -0
  235. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/__init__.py +0 -0
  236. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/telegram_test_data.py +0 -0
  237. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_api/.coverage +0 -0
  238. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_api/__init__.py +0 -0
  239. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_blink_integration.py +0 -0
  240. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_checksum_integration.py +0 -0
  241. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_conbus_blink_integration.py +0 -0
  242. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_conbus_datapoint_integration.py +0 -0
  243. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_conbus_raw_integration.py +0 -0
  244. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_conbus_receive_integration.py +0 -0
  245. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_discovery_integration.py +0 -0
  246. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_event_telegram_integration.py +0 -0
  247. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_link_number_integration.py +0 -0
  248. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_module_integration.py +0 -0
  249. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_output_integration.py +0 -0
  250. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_reverse_proxy_integration.py +0 -0
  251. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_system_reply_telegram_integration.py +0 -0
  252. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_term_logging_integration.py +0 -0
  253. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/integration/test_version_integration.py +0 -0
  254. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/__init__.py +0 -0
  255. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_api/__init__.py +0 -0
  256. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_cli/__init__.py +0 -0
  257. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_cli/test_click_tree.py +0 -0
  258. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
  259. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
  260. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_cli/test_decorators.py +0 -0
  261. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_cli/test_error_handlers.py +0 -0
  262. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_cli/test_formatters.py +0 -0
  263. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_cli/test_serial_number_type.py +0 -0
  264. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_cli/test_system_function_choice.py +0 -0
  265. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_cli/test_term_commands.py +0 -0
  266. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_connection/__init__.py +0 -0
  267. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_connection/test_connection_init.py +0 -0
  268. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_connection/test_exceptions.py +0 -0
  269. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_encoding/__init__.py +0 -0
  270. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
  271. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/__init__.py +0 -0
  272. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_conbus.py +0 -0
  273. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_conbus_client_send.py +0 -0
  274. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_conbus_discover.py +0 -0
  275. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
  276. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_event_telegram.py +0 -0
  277. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_log_entry.py +0 -0
  278. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_logger_config.py +0 -0
  279. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_module_type.py +0 -0
  280. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_reply_telegram.py +0 -0
  281. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_system_telegram.py +0 -0
  282. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
  283. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_version_telegram.py +0 -0
  284. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_write_config_type.py +0 -0
  285. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_xp20_action_table.py +0 -0
  286. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
  287. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/__init__.py +0 -0
  288. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
  289. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_actiontable_upload_service.py +0 -0
  290. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_base_server_service.py +0 -0
  291. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_blink_service.py +0 -0
  292. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_checksum_service.py +0 -0
  293. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_client_buffer_manager.py +0 -0
  294. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
  295. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_conbus_event_protocol.py +0 -0
  296. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
  297. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_conbus_output_service.py +0 -0
  298. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
  299. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
  300. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
  301. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_conbus_scan_service.py +0 -0
  302. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_device_service_factory.py +0 -0
  303. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_discovery_service.py +0 -0
  304. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
  305. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_log_file_service.py +0 -0
  306. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_module_type_service.py +0 -0
  307. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_protocol.py +0 -0
  308. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_protocol_monitor_service.py +0 -0
  309. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_server_service.py +0 -0
  310. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_telegram_input_service.py +0 -0
  311. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_telegram_output_service.py +0 -0
  312. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_telegram_protocol.py +0 -0
  313. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_telegram_service.py +0 -0
  314. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_version_service.py +0 -0
  315. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_xp20_action_table_serializer.py +0 -0
  316. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_xp24_action_service.py +0 -0
  317. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_services/test_xp_server_services.py +0 -0
  318. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_tui/__init__.py +0 -0
  319. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_tui/test_protocol_log.py +0 -0
  320. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_utils/__init__.py +0 -0
  321. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_utils/test_checksum.py +0 -0
  322. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_utils/test_event_helper.py +0 -0
  323. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_utils/test_logging.py +0 -0
  324. {conson_xp-1.36.0 → conson_xp-1.38.0}/tests/unit/test_utils/test_serialization.py +0 -0
  325. {conson_xp-1.36.0 → conson_xp-1.38.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.36.0
3
+ Version: 1.38.0
4
4
  Summary: XP Protocol Communication Tools
5
5
  Author-Email: ldvchosal <ldvchosal@github.com>
6
6
  License: MIT License
@@ -350,7 +350,10 @@ xp conbus event
350
350
  xp conbus event list
351
351
  xp conbus event raw
352
352
 
353
+
353
354
  xp conbus export
355
+ xp conbus export config
356
+
354
357
 
355
358
  xp conbus lightlevel
356
359
  xp conbus lightlevel get
@@ -371,6 +374,8 @@ xp conbus modulenumber set
371
374
 
372
375
  xp conbus msactiontable
373
376
  xp conbus msactiontable download
377
+ xp conbus msactiontable list
378
+ xp conbus msactiontable show
374
379
 
375
380
 
376
381
  xp conbus output
@@ -297,7 +297,10 @@ xp conbus event
297
297
  xp conbus event list
298
298
  xp conbus event raw
299
299
 
300
+
300
301
  xp conbus export
302
+ xp conbus export config
303
+
301
304
 
302
305
  xp conbus lightlevel
303
306
  xp conbus lightlevel get
@@ -318,6 +321,8 @@ xp conbus modulenumber set
318
321
 
319
322
  xp conbus msactiontable
320
323
  xp conbus msactiontable download
324
+ xp conbus msactiontable list
325
+ xp conbus msactiontable show
321
326
 
322
327
 
323
328
  xp conbus output
@@ -22,7 +22,7 @@ dependencies = [
22
22
  ]
23
23
  requires-python = ">=3.11"
24
24
  readme = "README.md"
25
- version = "1.36.0"
25
+ version = "1.38.0"
26
26
 
27
27
  [project.license]
28
28
  file = "LICENSE"
@@ -3,7 +3,7 @@
3
3
  conson-xp package.
4
4
  """
5
5
 
6
- __version__ = "1.36.0"
6
+ __version__ = "1.38.0"
7
7
  __manufacturer__ = "salchichon"
8
8
  __model__ = "xp.cli"
9
9
  __serial__ = "2025.09.23.000"
@@ -8,6 +8,7 @@ from xp.cli.commands.conbus.conbus import (
8
8
  conbus_autoreport,
9
9
  conbus_blink,
10
10
  conbus_datapoint,
11
+ conbus_export,
11
12
  conbus_lightlevel,
12
13
  conbus_linknumber,
13
14
  conbus_modulenumber,
@@ -101,6 +102,7 @@ __all__ = [
101
102
  "conbus_msactiontable",
102
103
  "conbus_actiontable",
103
104
  "conbus_event",
105
+ "conbus_export",
104
106
  "file",
105
107
  "module",
106
108
  "reverse_proxy",
@@ -6,6 +6,7 @@ from xp.cli.commands.conbus.conbus import (
6
6
  conbus_autoreport,
7
7
  conbus_blink,
8
8
  conbus_datapoint,
9
+ conbus_export,
9
10
  conbus_lightlevel,
10
11
  conbus_linknumber,
11
12
  conbus_msactiontable,
@@ -22,4 +23,5 @@ __all__ = [
22
23
  "conbus_lightlevel",
23
24
  "conbus_msactiontable",
24
25
  "conbus_actiontable",
26
+ "conbus_export",
25
27
  ]
@@ -117,6 +117,30 @@ def conbus_actiontable() -> None:
117
117
  pass
118
118
 
119
119
 
120
+ @click.group(
121
+ "event",
122
+ cls=HelpColorsGroup,
123
+ help_headers_color="yellow",
124
+ help_options_color="green",
125
+ short_help="Export operations",
126
+ )
127
+ def conbus_event() -> None:
128
+ """Event telegrams to Conbus modules."""
129
+ pass
130
+
131
+
132
+ @click.group(
133
+ "export",
134
+ cls=HelpColorsGroup,
135
+ help_headers_color="yellow",
136
+ help_options_color="green",
137
+ short_help="Export operations",
138
+ )
139
+ def conbus_export() -> None:
140
+ """Download ActionTable from Conbus modules."""
141
+ pass
142
+
143
+
120
144
  conbus.add_command(conbus_blink)
121
145
  conbus.add_command(conbus_output)
122
146
  conbus.add_command(conbus_datapoint)
@@ -126,3 +150,5 @@ conbus.add_command(conbus_autoreport)
126
150
  conbus.add_command(conbus_lightlevel)
127
151
  conbus.add_command(conbus_msactiontable)
128
152
  conbus.add_command(conbus_actiontable)
153
+ conbus.add_command(conbus_event)
154
+ conbus.add_command(conbus_export)
@@ -3,6 +3,7 @@
3
3
  import json
4
4
  from contextlib import suppress
5
5
  from pathlib import Path
6
+ from typing import Any, Dict
6
7
 
7
8
  import click
8
9
  from click import Context
@@ -12,12 +13,13 @@ from xp.cli.utils.decorators import (
12
13
  connection_command,
13
14
  )
14
15
  from xp.cli.utils.serial_number_type import SERIAL
15
- from xp.models.homekit.homekit_conson_config import (
16
+ from xp.models.actiontable.actiontable import ActionTable
17
+ from xp.models.config.conson_module_config import (
16
18
  ConsonModuleConfig,
17
19
  ConsonModuleListConfig,
18
20
  )
19
21
  from xp.services.conbus.actiontable.actiontable_download_service import (
20
- ActionTableService,
22
+ ActionTableDownloadService,
21
23
  )
22
24
  from xp.services.conbus.actiontable.actiontable_list_service import (
23
25
  ActionTableListService,
@@ -47,8 +49,8 @@ def conbus_download_actiontable(ctx: Context, serial_number: str) -> None:
47
49
  ctx: Click context object.
48
50
  serial_number: 10-digit module serial number.
49
51
  """
50
- service: ActionTableService = (
51
- ctx.obj.get("container").get_container().resolve(ActionTableService)
52
+ service: ActionTableDownloadService = (
53
+ ctx.obj.get("container").get_container().resolve(ActionTableDownloadService)
52
54
  )
53
55
 
54
56
  def on_progress(progress: str) -> None:
@@ -57,15 +59,20 @@ def conbus_download_actiontable(ctx: Context, serial_number: str) -> None:
57
59
  Args:
58
60
  progress: Progress message string.
59
61
  """
60
- click.echo(progress)
62
+ click.echo(progress, nl=False)
61
63
 
62
- def on_finish(result: tuple) -> None:
64
+ def on_finish(
65
+ _actiontable: ActionTable,
66
+ actiontable_dict: Dict[str, Any],
67
+ actiontable_short: list[str],
68
+ ) -> None:
63
69
  """Handle successful completion of action table download.
64
70
 
65
71
  Args:
66
- result: Tuple of (_actiontable, actiontable_dict, actiontable_short).
72
+ _actiontable: a list of ActionTableEntries.
73
+ actiontable_dict: action table in a dictionary.
74
+ actiontable_short: short representation of action table.
67
75
  """
68
- _actiontable, actiontable_dict, actiontable_short = result
69
76
  output = {
70
77
  "serial_number": serial_number,
71
78
  "actiontable_short": actiontable_short,
@@ -214,7 +221,9 @@ def conbus_show_actiontable(ctx: Context, serial_number: str) -> None:
214
221
  Args:
215
222
  module: Dictionary containing module configuration.
216
223
  """
217
- click.echo(json.dumps(module.model_dump(), indent=2, default=str))
224
+ module_data = module.model_dump()
225
+ module_data.pop("msactiontable", None)
226
+ click.echo(json.dumps(module_data, indent=2, default=str))
218
227
 
219
228
  def error_callback(error: str) -> None:
220
229
  """Handle errors during action table show.
@@ -57,8 +57,11 @@ def get_autoreport_command(ctx: Context, serial_number: str) -> None:
57
57
  with service:
58
58
  service.on_finish.connect(on_finish)
59
59
  service.query_datapoint(
60
- serial_number=serial_number, datapoint_type=DataPointType.AUTO_REPORT_STATUS
60
+ serial_number=serial_number,
61
+ datapoint_type=DataPointType.AUTO_REPORT_STATUS,
62
+ timeout_seconds=1.0,
61
63
  )
64
+ service.start_reactor()
62
65
 
63
66
 
64
67
  @conbus_autoreport.command("set", short_help="Set auto report status for a module")
@@ -104,6 +107,6 @@ def set_autoreport_command(ctx: Context, serial_number: str, status: str) -> Non
104
107
  serial_number=serial_number,
105
108
  datapoint_type=DataPointType.AUTO_REPORT_STATUS,
106
109
  data_value=data_value,
107
- timeout_seconds=0.5,
110
+ timeout_seconds=1.0,
108
111
  )
109
112
  service.start_reactor()
@@ -4,7 +4,7 @@ import json
4
4
 
5
5
  import click
6
6
 
7
- from xp.cli.commands.conbus.conbus import conbus
7
+ from xp.cli.commands.conbus.conbus import conbus, conbus_event
8
8
  from xp.cli.utils.decorators import connection_command
9
9
  from xp.cli.utils.module_type_choice import MODULE_TYPE
10
10
  from xp.models import ConbusEventRawResponse
@@ -12,12 +12,6 @@ from xp.services.conbus.conbus_event_list_service import ConbusEventListService
12
12
  from xp.services.conbus.conbus_event_raw_service import ConbusEventRawService
13
13
 
14
14
 
15
- @click.group(name="event")
16
- def conbus_event() -> None:
17
- """Send event telegrams to Conbus modules."""
18
- pass
19
-
20
-
21
15
  @conbus_event.command("list")
22
16
  @click.pass_context
23
17
  def list_events(ctx: click.Context) -> None:
@@ -1,21 +1,21 @@
1
- """Conbus export CLI command."""
1
+ """Conbus export CLI commands."""
2
2
 
3
3
  from contextlib import suppress
4
4
 
5
5
  import click
6
6
 
7
- from xp.cli.commands.conbus.conbus import conbus
7
+ from xp.cli.commands.conbus.conbus import conbus_export
8
8
  from xp.cli.utils.decorators import connection_command
9
9
  from xp.models.conbus.conbus_export import ConbusExportResponse
10
- from xp.models.homekit.homekit_conson_config import ConsonModuleConfig
10
+ from xp.models.config.conson_module_config import ConsonModuleConfig
11
11
  from xp.services.conbus.conbus_export_service import ConbusExportService
12
12
 
13
13
 
14
- @conbus.command("export")
14
+ @conbus_export.command("config")
15
15
  @click.pass_context
16
16
  @connection_command()
17
17
  def export_conbus_config(ctx: click.Context) -> None:
18
- r"""Export Conbus device configuration to YAML file.
18
+ r"""Export Conbus device metadata to YAML file.
19
19
 
20
20
  Discovers all devices on the Conbus network and queries their configuration
21
21
  datapoints to generate a complete export.yml file in conson.yml format.
@@ -25,8 +25,9 @@ def export_conbus_config(ctx: click.Context) -> None:
25
25
 
26
26
  Examples:
27
27
  \b
28
- # Export to export.yml in current directory
28
+ # Export device metadata to export.yml
29
29
  xp conbus export
30
+ xp conbus export config
30
31
  """
31
32
 
32
33
  def on_progress(serial_number: str, current: int, total: int) -> None:
@@ -200,6 +200,7 @@ def xp_lightlevel_get(
200
200
  result["output_number"] = output_number
201
201
  result["lightlevel_level"] = lightlevel_level
202
202
  click.echo(json.dumps(result, indent=2))
203
+ service.stop_reactor()
203
204
 
204
205
  with service:
205
206
  service.on_finish.connect(on_finish)
@@ -208,3 +209,4 @@ def xp_lightlevel_get(
208
209
  datapoint_type=DataPointType.MODULE_LIGHT_LEVEL,
209
210
  timeout_seconds=0.5,
210
211
  )
212
+ service.start_reactor()
@@ -93,6 +93,7 @@ def get_linknumber_command(ctx: click.Context, serial_number: str) -> None:
93
93
  result = service_response.to_dict()
94
94
  result["linknumber_value"] = linknumber_value
95
95
  click.echo(json.dumps(result, indent=2))
96
+ service.stop_reactor()
96
97
 
97
98
  with service:
98
99
  service.on_finish.connect(on_finish)
@@ -101,3 +102,4 @@ def get_linknumber_command(ctx: click.Context, serial_number: str) -> None:
101
102
  datapoint_type=DataPointType.LINK_NUMBER,
102
103
  timeout_seconds=0.5,
103
104
  )
105
+ service.start_reactor()
@@ -95,6 +95,7 @@ def get_modulenumber_command(ctx: click.Context, serial_number: str) -> None:
95
95
  result = service_response.to_dict()
96
96
  result["modulenumber_value"] = modulenumber_value
97
97
  click.echo(json.dumps(result, indent=2))
98
+ service.stop_reactor()
98
99
 
99
100
  with service:
100
101
  service.on_finish.connect(on_finish)
@@ -103,3 +104,4 @@ def get_modulenumber_command(ctx: click.Context, serial_number: str) -> None:
103
104
  datapoint_type=DataPointType.MODULE_NUMBER,
104
105
  timeout_seconds=0.5,
105
106
  )
107
+ service.start_reactor()
@@ -0,0 +1,175 @@
1
+ """XP24 Action Table CLI commands."""
2
+
3
+ import json
4
+ from typing import Union
5
+
6
+ import click
7
+ from click import Context
8
+
9
+ from xp.cli.commands.conbus.conbus import conbus_msactiontable
10
+ from xp.cli.utils.decorators import (
11
+ connection_command,
12
+ )
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.msactiontable_xp20 import Xp20MsActionTable
16
+ from xp.models.actiontable.msactiontable_xp24 import Xp24MsActionTable
17
+ from xp.models.actiontable.msactiontable_xp33 import Xp33MsActionTable
18
+ from xp.models.config.conson_module_config import ConsonModuleConfig
19
+ from xp.services.conbus.msactiontable.msactiontable_download_service import (
20
+ MsActionTableDownloadService,
21
+ )
22
+ from xp.services.conbus.msactiontable.msactiontable_list_service import (
23
+ MsActionTableListService,
24
+ )
25
+ from xp.services.conbus.msactiontable.msactiontable_show_service import (
26
+ MsActionTableShowService,
27
+ )
28
+
29
+
30
+ @conbus_msactiontable.command("download", short_help="Download MSActionTable")
31
+ @click.argument("serial_number", type=SERIAL)
32
+ @click.argument("xpmoduletype", type=XP_MODULE_TYPE)
33
+ @click.pass_context
34
+ @connection_command()
35
+ def conbus_download_msactiontable(
36
+ ctx: Context, serial_number: str, xpmoduletype: str
37
+ ) -> None:
38
+ """Download MS action table from XP24 module.
39
+
40
+ Args:
41
+ ctx: Click context object.
42
+ serial_number: 10-digit module serial number.
43
+ xpmoduletype: XP module type.
44
+ """
45
+ service: MsActionTableDownloadService = (
46
+ ctx.obj.get("container").get_container().resolve(MsActionTableDownloadService)
47
+ )
48
+
49
+ def on_progress(progress: str) -> None:
50
+ """Handle progress updates during MS action table download.
51
+
52
+ Args:
53
+ progress: Progress message string.
54
+ """
55
+ click.echo(progress, nl=False)
56
+
57
+ def on_finish(
58
+ msaction_table: Union[
59
+ Xp20MsActionTable, Xp24MsActionTable, Xp33MsActionTable, None
60
+ ],
61
+ msaction_table_short: str,
62
+ ) -> None:
63
+ """Handle successful completion of MS action table download.
64
+
65
+ Args:
66
+ msaction_table: Downloaded MS action table object or None if failed.
67
+ msaction_table_short: Short version of MS action table object or None if failed.
68
+
69
+ Raises:
70
+ Abort: If action table download failed.
71
+ """
72
+ service.stop_reactor()
73
+ if msaction_table is None:
74
+ click.echo("Error: Failed to download MS action table")
75
+ raise click.Abort()
76
+
77
+ output = {
78
+ "serial_number": serial_number,
79
+ "xpmoduletype": xpmoduletype,
80
+ "msaction_table_short": msaction_table_short,
81
+ "msaction_table": msaction_table.model_dump(),
82
+ }
83
+ click.echo(json.dumps(output, indent=2, default=str))
84
+
85
+ def on_error(error: str) -> None:
86
+ """Handle errors during MS action table download.
87
+
88
+ Args:
89
+ error: Error message string.
90
+ """
91
+ click.echo(f"Error: {error}")
92
+
93
+ with service:
94
+ service.on_progress.connect(on_progress)
95
+ service.on_error.connect(on_error)
96
+ service.on_finish.connect(on_finish)
97
+ service.start(
98
+ serial_number=serial_number,
99
+ xpmoduletype=xpmoduletype,
100
+ )
101
+ service.start_reactor()
102
+
103
+
104
+ @conbus_msactiontable.command("list", short_help="List modules with MsActionTable")
105
+ @click.pass_context
106
+ def conbus_list_msactiontable(ctx: Context) -> None:
107
+ """List all modules with action table configurations from conson.yml.
108
+
109
+ Args:
110
+ ctx: Click context object.
111
+ """
112
+ service: MsActionTableListService = (
113
+ ctx.obj.get("container").get_container().resolve(MsActionTableListService)
114
+ )
115
+
116
+ def on_finish(module_list: dict) -> None:
117
+ """Handle successful completion of action table list.
118
+
119
+ Args:
120
+ module_list: Dictionary containing modules and total count.
121
+ """
122
+ click.echo(json.dumps(module_list, indent=2, default=str))
123
+
124
+ def on_error(error: str) -> None:
125
+ """Handle errors during action table list.
126
+
127
+ Args:
128
+ error: Error message string.
129
+ """
130
+ click.echo(error)
131
+
132
+ with service:
133
+ service.on_finish.connect(on_finish)
134
+ service.on_error.connect(on_error)
135
+ service.start()
136
+
137
+
138
+ @conbus_msactiontable.command("show", short_help="Show MsActionTable configuration")
139
+ @click.argument("serial_number", type=SERIAL)
140
+ @click.pass_context
141
+ def conbus_show_msactiontable(ctx: Context, serial_number: str) -> None:
142
+ """Show ms action table configuration for a specific module from conson.yml.
143
+
144
+ Args:
145
+ ctx: Click context object.
146
+ serial_number: 10-digit module serial number.
147
+ """
148
+ service: MsActionTableShowService = (
149
+ ctx.obj.get("container").get_container().resolve(MsActionTableShowService)
150
+ )
151
+
152
+ def on_finish(module: ConsonModuleConfig) -> None:
153
+ """Handle successful completion of action table show.
154
+
155
+ Args:
156
+ module: Dictionary containing module configuration.
157
+ """
158
+ module_data = module.model_dump()
159
+ module_data.pop("action_table", None)
160
+ click.echo(json.dumps(module_data, indent=2, default=str))
161
+
162
+ def error_callback(error: str) -> None:
163
+ """Handle errors during action table show.
164
+
165
+ Args:
166
+ error: Error message string.
167
+ """
168
+ click.echo(error)
169
+
170
+ with service:
171
+ service.start(
172
+ serial_number=serial_number,
173
+ finish_callback=on_finish,
174
+ error_callback=error_callback,
175
+ )
@@ -121,6 +121,7 @@ def xp_output_status(ctx: click.Context, serial_number: str) -> None:
121
121
  response: Datapoint response object.
122
122
  """
123
123
  click.echo(json.dumps(response.to_dict(), indent=2))
124
+ service.stop_reactor()
124
125
 
125
126
  with service:
126
127
  service.on_finish.connect(on_finish)
@@ -128,6 +129,7 @@ def xp_output_status(ctx: click.Context, serial_number: str) -> None:
128
129
  serial_number=serial_number,
129
130
  datapoint_type=DataPointType.MODULE_OUTPUT_STATE,
130
131
  )
132
+ service.start_reactor()
131
133
 
132
134
 
133
135
  @conbus_output.command("state")
@@ -156,6 +158,7 @@ def xp_module_state(ctx: click.Context, serial_number: str) -> None:
156
158
  response: Datapoint response object.
157
159
  """
158
160
  click.echo(json.dumps(response.to_dict(), indent=2))
161
+ service.stop_reactor()
159
162
 
160
163
  with service:
161
164
  service.on_finish.connect(on_finish)
@@ -163,3 +166,4 @@ def xp_module_state(ctx: click.Context, serial_number: str) -> None:
163
166
  serial_number=serial_number,
164
167
  datapoint_type=DataPointType.MODULE_STATE,
165
168
  )
169
+ service.start_reactor()
@@ -0,0 +1,9 @@
1
+ """Base class for MS Action Table models."""
2
+
3
+ from pydantic import BaseModel
4
+
5
+
6
+ class MsActionTable(BaseModel):
7
+ """Base class for all MS Action Table types (XP20, XP24, XP33)."""
8
+
9
+ pass
@@ -1,10 +1,11 @@
1
1
  """XP20 Action Table models for input actions and settings."""
2
2
 
3
- from dataclasses import dataclass, field
3
+ from pydantic import BaseModel, Field
4
4
 
5
+ from xp.models.actiontable.msactiontable import MsActionTable
5
6
 
6
- @dataclass
7
- class InputChannel:
7
+
8
+ class InputChannel(BaseModel):
8
9
  """Configuration for a single input channel in XP20 action table.
9
10
 
10
11
  Attributes:
@@ -19,13 +20,12 @@ class InputChannel:
19
20
  invert: bool = False
20
21
  short_long: bool = False
21
22
  group_on_off: bool = False
22
- and_functions: list[bool] = field(default_factory=lambda: [False] * 8)
23
+ and_functions: list[bool] = Field(default_factory=lambda: [False] * 8)
23
24
  sa_function: bool = False
24
25
  ta_function: bool = False
25
26
 
26
27
 
27
- @dataclass
28
- class Xp20MsActionTable:
28
+ class Xp20MsActionTable(MsActionTable):
29
29
  """XP20 Action Table for managing 8 input channels.
30
30
 
31
31
  Contains configuration for 8 input channels (input1 through input8),
@@ -43,11 +43,11 @@ class Xp20MsActionTable:
43
43
  input8: Configuration for input channel 8.
44
44
  """
45
45
 
46
- input1: InputChannel = field(default_factory=InputChannel)
47
- input2: InputChannel = field(default_factory=InputChannel)
48
- input3: InputChannel = field(default_factory=InputChannel)
49
- input4: InputChannel = field(default_factory=InputChannel)
50
- input5: InputChannel = field(default_factory=InputChannel)
51
- input6: InputChannel = field(default_factory=InputChannel)
52
- input7: InputChannel = field(default_factory=InputChannel)
53
- input8: InputChannel = field(default_factory=InputChannel)
46
+ input1: InputChannel = Field(default_factory=InputChannel)
47
+ input2: InputChannel = Field(default_factory=InputChannel)
48
+ input3: InputChannel = Field(default_factory=InputChannel)
49
+ input4: InputChannel = Field(default_factory=InputChannel)
50
+ input5: InputChannel = Field(default_factory=InputChannel)
51
+ input6: InputChannel = Field(default_factory=InputChannel)
52
+ input7: InputChannel = Field(default_factory=InputChannel)
53
+ input8: InputChannel = Field(default_factory=InputChannel)