conson-xp 1.50.1__tar.gz → 1.51.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. {conson_xp-1.50.1 → conson_xp-1.51.1}/PKG-INFO +2 -1
  2. {conson_xp-1.50.1 → conson_xp-1.51.1}/README.md +1 -0
  3. {conson_xp-1.50.1 → conson_xp-1.51.1}/pyproject.toml +1 -1
  4. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/__init__.py +1 -1
  5. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_export_commands.py +8 -2
  6. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/term/term_commands.py +23 -0
  7. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/homekit/homekit_config.py +2 -0
  8. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/term/__init__.py +2 -0
  9. conson_xp-1.51.1/src/xp/models/term/accessory_state.py +50 -0
  10. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/actiontable/actiontable_download_service.py +2 -0
  11. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_export_actiontable_service.py +47 -27
  12. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/homekit_config_validator.py +1 -1
  13. conson_xp-1.51.1/src/xp/services/term/homekit_service.py +512 -0
  14. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/term/state_monitor_service.py +1 -1
  15. conson_xp-1.51.1/src/xp/term/homekit.py +116 -0
  16. conson_xp-1.51.1/src/xp/term/homekit.tcss +86 -0
  17. conson_xp-1.51.1/src/xp/term/widgets/room_list.py +232 -0
  18. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/term/widgets/status_footer.py +6 -3
  19. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/utils/dependencies.py +33 -0
  20. conson_xp-1.51.1/tests/unit/test_models/test_term/__init__.py +1 -0
  21. conson_xp-1.51.1/tests/unit/test_models/test_term/test_accessory_state.py +170 -0
  22. conson_xp-1.51.1/tests/unit/test_services/test_homekit_service.py +688 -0
  23. conson_xp-1.51.1/tests/unit/test_tui/test_homekit_app.py +145 -0
  24. conson_xp-1.51.1/tests/unit/test_tui/test_room_list.py +300 -0
  25. {conson_xp-1.50.1 → conson_xp-1.51.1}/LICENSE +0 -0
  26. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/__init__.py +0 -0
  27. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/__main__.py +0 -0
  28. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/__init__.py +0 -0
  29. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/__init__.py +0 -0
  30. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus.py +0 -0
  31. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +0 -0
  32. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
  33. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
  34. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
  35. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
  36. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
  37. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
  38. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_event_commands.py +0 -0
  39. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
  40. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
  41. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +0 -0
  42. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +0 -0
  43. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
  44. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
  45. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
  46. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
  47. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/file_commands.py +0 -0
  48. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/homekit/__init__.py +0 -0
  49. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/homekit/homekit.py +0 -0
  50. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
  51. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/module_commands.py +0 -0
  52. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
  53. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/server/__init__.py +0 -0
  54. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/server/server_commands.py +0 -0
  55. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/telegram/__init__.py +0 -0
  56. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/telegram/telegram.py +0 -0
  57. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
  58. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
  59. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
  60. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
  61. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
  62. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
  63. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/term/__init__.py +0 -0
  64. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/commands/term/term.py +0 -0
  65. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/main.py +0 -0
  66. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/utils/__init__.py +0 -0
  67. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/utils/click_tree.py +0 -0
  68. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
  69. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/utils/decorators.py +0 -0
  70. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/utils/error_handlers.py +0 -0
  71. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/utils/formatters.py +0 -0
  72. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/utils/module_type_choice.py +0 -0
  73. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/utils/serial_number_type.py +0 -0
  74. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/cli/utils/system_function_choice.py +0 -0
  75. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/__init__.py +0 -0
  76. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/actiontable/__init__.py +0 -0
  77. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/actiontable/actiontable.py +0 -0
  78. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/actiontable/actiontable_type.py +0 -0
  79. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
  80. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/actiontable/msactiontable_xp24.py +0 -0
  81. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
  82. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/__init__.py +0 -0
  83. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus.py +0 -0
  84. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_autoreport.py +0 -0
  85. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_blink.py +0 -0
  86. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_client_config.py +0 -0
  87. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_connection_status.py +0 -0
  88. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_custom.py +0 -0
  89. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_datapoint.py +0 -0
  90. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_discover.py +0 -0
  91. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_event_list.py +0 -0
  92. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_event_raw.py +0 -0
  93. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_export.py +0 -0
  94. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
  95. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_linknumber.py +0 -0
  96. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_logger_config.py +0 -0
  97. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_output.py +0 -0
  98. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_raw.py +0 -0
  99. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_receive.py +0 -0
  100. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
  101. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/config/__init__.py +0 -0
  102. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/config/conson_module_config.py +0 -0
  103. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/homekit/__init__.py +0 -0
  104. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/homekit/homekit_accessory.py +0 -0
  105. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/log_entry.py +0 -0
  106. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/protocol/__init__.py +0 -0
  107. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/protocol/conbus_protocol.py +0 -0
  108. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/response.py +0 -0
  109. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/__init__.py +0 -0
  110. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/action_type.py +0 -0
  111. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/datapoint_type.py +0 -0
  112. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/event_telegram.py +0 -0
  113. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/event_type.py +0 -0
  114. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/input_action_type.py +0 -0
  115. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/input_type.py +0 -0
  116. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/module_type.py +0 -0
  117. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/module_type_code.py +0 -0
  118. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/output_telegram.py +0 -0
  119. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/reply_telegram.py +0 -0
  120. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/system_function.py +0 -0
  121. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/system_telegram.py +0 -0
  122. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/telegram.py +0 -0
  123. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/telegram_type.py +0 -0
  124. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/telegram/timeparam_type.py +0 -0
  125. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/term/connection_state.py +0 -0
  126. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/term/module_state.py +0 -0
  127. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/term/protocol_keys_config.py +0 -0
  128. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/term/status_message.py +0 -0
  129. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/term/telegram_display.py +0 -0
  130. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/models/write_config_type.py +0 -0
  131. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/__init__.py +0 -0
  132. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/actiontable/__init__.py +0 -0
  133. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
  134. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/actiontable/download_state_machine.py +0 -0
  135. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
  136. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +0 -0
  137. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +0 -0
  138. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +0 -0
  139. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/actiontable/serializer_protocol.py +0 -0
  140. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/__init__.py +0 -0
  141. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/actiontable/__init__.py +0 -0
  142. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
  143. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
  144. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +0 -0
  145. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
  146. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_blink_service.py +0 -0
  147. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_custom_service.py +0 -0
  148. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
  149. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
  150. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_discover_service.py +0 -0
  151. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_event_list_service.py +0 -0
  152. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
  153. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_export_service.py +0 -0
  154. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_output_service.py +0 -0
  155. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_raw_service.py +0 -0
  156. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_receive_service.py +0 -0
  157. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/conbus_scan_service.py +0 -0
  158. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/conbus/write_config_service.py +0 -0
  159. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/__init__.py +0 -0
  160. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/homekit_cache_service.py +0 -0
  161. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
  162. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
  163. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
  164. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
  165. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/homekit_hap_service.py +0 -0
  166. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
  167. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
  168. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/homekit_module_service.py +0 -0
  169. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/homekit_outlet.py +0 -0
  170. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
  171. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/homekit/homekit_service.py +0 -0
  172. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/log_file_service.py +0 -0
  173. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/module_type_service.py +0 -0
  174. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/protocol/__init__.py +0 -0
  175. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/protocol/conbus_event_protocol.py +0 -0
  176. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/protocol/protocol_factory.py +0 -0
  177. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/protocol/telegram_protocol.py +0 -0
  178. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/reverse_proxy_service.py +0 -0
  179. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/server/__init__.py +0 -0
  180. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/server/base_server_service.py +0 -0
  181. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/server/client_buffer_manager.py +0 -0
  182. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/server/cp20_server_service.py +0 -0
  183. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/server/device_service_factory.py +0 -0
  184. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/server/server_service.py +0 -0
  185. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/server/xp130_server_service.py +0 -0
  186. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/server/xp20_server_service.py +0 -0
  187. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/server/xp230_server_service.py +0 -0
  188. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/server/xp24_server_service.py +0 -0
  189. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/server/xp33_server_service.py +0 -0
  190. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/telegram/__init__.py +0 -0
  191. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/telegram/telegram_blink_service.py +0 -0
  192. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
  193. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
  194. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/telegram/telegram_discover_service.py +0 -0
  195. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
  196. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/telegram/telegram_output_service.py +0 -0
  197. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/telegram/telegram_service.py +0 -0
  198. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/telegram/telegram_version_service.py +0 -0
  199. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/term/__init__.py +0 -0
  200. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/services/term/protocol_monitor_service.py +0 -0
  201. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/term/__init__.py +0 -0
  202. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/term/protocol.py +0 -0
  203. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/term/protocol.tcss +0 -0
  204. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/term/state.py +0 -0
  205. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/term/state.tcss +0 -0
  206. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/term/widgets/__init__.py +0 -0
  207. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/term/widgets/help_menu.py +0 -0
  208. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/term/widgets/modules_list.py +0 -0
  209. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/term/widgets/protocol_log.py +0 -0
  210. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/utils/__init__.py +0 -0
  211. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/utils/checksum.py +0 -0
  212. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/utils/event_helper.py +0 -0
  213. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/utils/logging.py +0 -0
  214. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/utils/serialization.py +0 -0
  215. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/utils/state_machine.py +0 -0
  216. {conson_xp-1.50.1 → conson_xp-1.51.1}/src/xp/utils/time_utils.py +0 -0
  217. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/.coverage +0 -0
  218. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/__init__.py +0 -0
  219. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/conftest.py +0 -0
  220. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/.coverage +0 -0
  221. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/__init__.py +0 -0
  222. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/telegram_test_data.py +0 -0
  223. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_actiontable_integration.py +0 -0
  224. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_api/.coverage +0 -0
  225. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_api/__init__.py +0 -0
  226. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_blink_integration.py +0 -0
  227. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_checksum_integration.py +0 -0
  228. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_conbus_blink_integration.py +0 -0
  229. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_conbus_datapoint_integration.py +0 -0
  230. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_conbus_raw_integration.py +0 -0
  231. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_conbus_receive_integration.py +0 -0
  232. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_discovery_integration.py +0 -0
  233. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_event_telegram_integration.py +0 -0
  234. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_homekit_config_integration.py +0 -0
  235. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_link_number_integration.py +0 -0
  236. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_module_integration.py +0 -0
  237. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_output_integration.py +0 -0
  238. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_reverse_proxy_integration.py +0 -0
  239. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_system_reply_telegram_integration.py +0 -0
  240. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_term_logging_integration.py +0 -0
  241. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_version_integration.py +0 -0
  242. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_xp20_action_table_integration.py +0 -0
  243. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/integration/test_xp24_action_table_integration.py +0 -0
  244. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/__init__.py +0 -0
  245. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_api/__init__.py +0 -0
  246. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_cli/__init__.py +0 -0
  247. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_cli/test_click_tree.py +0 -0
  248. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_cli/test_conbus_actiontable_commands.py +0 -0
  249. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
  250. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_cli/test_conbus_msactiontable_upload_commands.py +0 -0
  251. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
  252. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_cli/test_decorators.py +0 -0
  253. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_cli/test_error_handlers.py +0 -0
  254. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_cli/test_formatters.py +0 -0
  255. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_cli/test_serial_number_type.py +0 -0
  256. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_cli/test_system_function_choice.py +0 -0
  257. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_cli/test_term_commands.py +0 -0
  258. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_encoding/__init__.py +0 -0
  259. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
  260. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/__init__.py +0 -0
  261. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_conbus.py +0 -0
  262. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_conbus_client_send.py +0 -0
  263. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_conbus_discover.py +0 -0
  264. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
  265. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_event_telegram.py +0 -0
  266. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_log_entry.py +0 -0
  267. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_logger_config.py +0 -0
  268. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_module_type.py +0 -0
  269. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_reply_telegram.py +0 -0
  270. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_system_telegram.py +0 -0
  271. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
  272. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_version_telegram.py +0 -0
  273. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_write_config_type.py +0 -0
  274. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_xp20_action_table.py +0 -0
  275. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_xp24_action_table.py +0 -0
  276. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_xp24_action_table_short_format.py +0 -0
  277. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
  278. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/__init__.py +0 -0
  279. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_actiontable_download_service.py +0 -0
  280. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
  281. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_actiontable_service.py +0 -0
  282. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_actiontable_upload_service.py +0 -0
  283. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_base_server_service.py +0 -0
  284. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_blink_service.py +0 -0
  285. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_checksum_service.py +0 -0
  286. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_client_buffer_manager.py +0 -0
  287. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
  288. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_conbus_event_list_service.py +0 -0
  289. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_conbus_event_protocol.py +0 -0
  290. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
  291. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_conbus_output_service.py +0 -0
  292. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
  293. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
  294. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
  295. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_conbus_scan_service.py +0 -0
  296. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_device_service_factory.py +0 -0
  297. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_discovery_service.py +0 -0
  298. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
  299. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
  300. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
  301. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_homekit_services.py +0 -0
  302. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_log_file_service.py +0 -0
  303. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_module_type_service.py +0 -0
  304. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_protocol.py +0 -0
  305. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_protocol_monitor_service.py +0 -0
  306. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_server_service.py +0 -0
  307. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_state_monitor_service.py +0 -0
  308. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_telegram_input_service.py +0 -0
  309. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_telegram_output_service.py +0 -0
  310. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_telegram_protocol.py +0 -0
  311. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_telegram_service.py +0 -0
  312. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_version_service.py +0 -0
  313. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_xp20_action_table_serializer.py +0 -0
  314. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_xp24_action_service.py +0 -0
  315. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_xp24_action_table_serializer.py +0 -0
  316. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
  317. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_xp33_action_table_serializer.py +0 -0
  318. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_xp33_short_format.py +0 -0
  319. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_services/test_xp_server_services.py +0 -0
  320. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_tui/__init__.py +0 -0
  321. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_tui/test_protocol_log.py +0 -0
  322. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_utils/__init__.py +0 -0
  323. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_utils/test_checksum.py +0 -0
  324. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_utils/test_event_helper.py +0 -0
  325. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_utils/test_logging.py +0 -0
  326. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_utils/test_serialization.py +0 -0
  327. {conson_xp-1.50.1 → conson_xp-1.51.1}/tests/unit/test_utils/test_time_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conson-xp
3
- Version: 1.50.1
3
+ Version: 1.51.1
4
4
  Summary: XP Protocol Communication Tools
5
5
  Author-Email: ldvchosal <ldvchosal@github.com>
6
6
  License: MIT License
@@ -450,6 +450,7 @@ xp telegram version
450
450
 
451
451
 
452
452
  xp term
453
+ xp term homekit
453
454
  xp term protocol
454
455
  xp term state
455
456
 
@@ -396,6 +396,7 @@ xp telegram version
396
396
 
397
397
 
398
398
  xp term
399
+ xp term homekit
399
400
  xp term protocol
400
401
  xp term state
401
402
 
@@ -23,7 +23,7 @@ dependencies = [
23
23
  ]
24
24
  requires-python = ">=3.11"
25
25
  readme = "README.md"
26
- version = "1.50.1"
26
+ version = "1.51.1"
27
27
 
28
28
  [project.license]
29
29
  file = "LICENSE"
@@ -4,7 +4,7 @@ XP CLI tool for remote console bus operations.
4
4
  conson-xp package.
5
5
  """
6
6
 
7
- __version__ = "1.50.1"
7
+ __version__ = "1.51.1"
8
8
  __manufacturer__ = "salchichon"
9
9
  __model__ = "xp.cli"
10
10
  __serial__ = "2025.09.23.000"
@@ -117,16 +117,21 @@ def export_conbus_actiontable(ctx: click.Context) -> None:
117
117
  xp conbus export actiontable
118
118
  """
119
119
 
120
- def on_progress(serial_number: str, current: int, total: int) -> None:
120
+ def on_progress(
121
+ serial_number: str, actiontable_type: str, current: int, total: int
122
+ ) -> None:
121
123
  """
122
124
  Handle progress updates during export.
123
125
 
124
126
  Args:
125
127
  serial_number: Serial number of discovered device.
128
+ actiontable_type: Type of action table being exported.
126
129
  current: Current device number.
127
130
  total: Total devices discovered.
128
131
  """
129
- click.echo(f"Querying device {current}/{total}: {serial_number}...")
132
+ click.echo(
133
+ f"Querying device {current}/{total}: {serial_number} / {actiontable_type}."
134
+ )
130
135
 
131
136
  def on_device_actiontable_exported(
132
137
  module: ConsonModuleConfig,
@@ -176,4 +181,5 @@ def export_conbus_actiontable(ctx: click.Context) -> None:
176
181
  service.on_device_actiontable_exported.connect(on_device_actiontable_exported)
177
182
  service.on_finish.connect(on_finish)
178
183
  service.set_timeout(5)
184
+ service.configure()
179
185
  service.start_reactor()
@@ -48,3 +48,26 @@ def state_monitor(ctx: Context) -> None:
48
48
 
49
49
  # Resolve StateMonitorApp from container and run
50
50
  ctx.obj.get("container").get_container().resolve(StateMonitorApp).run()
51
+
52
+
53
+ @term.command("homekit")
54
+ @click.pass_context
55
+ def homekit_monitor(ctx: Context) -> None:
56
+ r"""
57
+ Start TUI for HomeKit accessory monitoring.
58
+
59
+ Displays HomeKit rooms and accessories with real-time state updates
60
+ in an interactive terminal interface. Press action keys (a-z) to
61
+ toggle accessories.
62
+
63
+ Args:
64
+ ctx: Click context object.
65
+
66
+ Examples:
67
+ \b
68
+ xp term homekit
69
+ """
70
+ from xp.term.homekit import HomekitApp
71
+
72
+ # Resolve HomekitApp from container and run
73
+ ctx.obj.get("container").get_container().resolve(HomekitApp).run()
@@ -61,6 +61,7 @@ class HomekitAccessoryConfig(BaseModel):
61
61
  service: Service type for the accessory.
62
62
  on_action: on code for the accessory.
63
63
  off_action: off code for the accessory.
64
+ toggle_action: Optional toggle action code for the accessory.
64
65
  hap_accessory: Optional HAP accessory identifier.
65
66
  """
66
67
 
@@ -72,6 +73,7 @@ class HomekitAccessoryConfig(BaseModel):
72
73
  service: str
73
74
  on_action: str
74
75
  off_action: str
76
+ toggle_action: Optional[str] = None
75
77
  hap_accessory: Optional[int] = None
76
78
 
77
79
 
@@ -1,5 +1,6 @@
1
1
  """Terminal UI models."""
2
2
 
3
+ from xp.models.term.accessory_state import AccessoryState
3
4
  from xp.models.term.module_state import ModuleState
4
5
  from xp.models.term.protocol_keys_config import (
5
6
  ProtocolKeyConfig,
@@ -7,6 +8,7 @@ from xp.models.term.protocol_keys_config import (
7
8
  )
8
9
 
9
10
  __all__ = [
11
+ "AccessoryState",
10
12
  "ModuleState",
11
13
  "ProtocolKeyConfig",
12
14
  "ProtocolKeysConfig",
@@ -0,0 +1,50 @@
1
+ """Accessory state data model for Homekit TUI."""
2
+
3
+ from dataclasses import dataclass
4
+ from datetime import datetime
5
+ from typing import Optional
6
+
7
+
8
+ @dataclass
9
+ class AccessoryState:
10
+ """
11
+ State of a HomeKit accessory for TUI display.
12
+
13
+ Attributes:
14
+ room_name: Room containing the accessory (e.g., "Salon").
15
+ accessory_name: Accessory display name (e.g., "Variateur salon").
16
+ action: Action key (a-z) for toggle control.
17
+ output_state: Output state ("ON", "OFF", "?").
18
+ dimming_state: Dimming percentage for dimmable modules, "-" if OFF, empty otherwise.
19
+ module_name: Module identifier (e.g., "A12").
20
+ serial_number: Module serial number.
21
+ module_type: Module type (e.g., "XP24", "XP33LED").
22
+ error_status: Status code ("OK" or error like "E10").
23
+ output: Module output number (1-based for display).
24
+ sort: Sort accessories according to homekit.yml configuration.
25
+ last_update: Last communication timestamp. None if never updated.
26
+ toggle_action: Raw toggle action telegram (e.g., "E02L12I02").
27
+ """
28
+
29
+ room_name: str
30
+ accessory_name: str
31
+ action: str
32
+ output_state: str
33
+ dimming_state: str
34
+ module_name: str
35
+ serial_number: str
36
+ module_type: str
37
+ error_status: str
38
+ output: int
39
+ sort: int
40
+ last_update: Optional[datetime] = None
41
+ toggle_action: Optional[str] = None
42
+
43
+ def is_dimmable(self) -> bool:
44
+ """
45
+ Check if accessory is dimmable.
46
+
47
+ Returns:
48
+ True if module type is XP33LR or XP33LED, False otherwise.
49
+ """
50
+ return self.module_type in ("XP33LR", "XP33LED")
@@ -292,6 +292,8 @@ class ActionTableDownloadService(DownloadStateMachine):
292
292
  raise RuntimeError("Cannot configure while download in progress")
293
293
  self.logger.info("Configuring actiontable download")
294
294
  self.serial_number = serial_number
295
+ self.actiontable_data = []
296
+
295
297
  if actiontable_type == ActionTableType.ACTIONTABLE:
296
298
  self.serializer = self.actiontable_serializer
297
299
  elif actiontable_type == ActionTableType.MSACTIONTABLE_XP20:
@@ -3,7 +3,7 @@
3
3
  import asyncio
4
4
  import logging
5
5
  from pathlib import Path
6
- from queue import SimpleQueue
6
+ from queue import Empty, SimpleQueue
7
7
  from typing import Any, Optional, Tuple
8
8
 
9
9
  import yaml
@@ -38,7 +38,7 @@ class ConbusActiontableExportService:
38
38
  """
39
39
 
40
40
  # Signals (class attributes)
41
- on_progress: Signal = Signal(str, int, int) # serial, current, total
41
+ on_progress: Signal = Signal(str, str, int, int) # serial, current, total
42
42
  on_device_actiontable_exported: Signal = Signal(
43
43
  ConsonModuleConfig, ActionTableType, str
44
44
  )
@@ -64,25 +64,35 @@ class ConbusActiontableExportService:
64
64
  self.logger = logging.getLogger(__name__)
65
65
  self.download_service = download_service
66
66
  self._module_list: ConsonModuleListConfig = module_list
67
+ self._module_dic: dict[str, ConsonModuleConfig] = {
68
+ module.serial_number: module for module in module_list.root
69
+ }
67
70
  # State management
68
- self.device_queue: SimpleQueue[Tuple[ConsonModuleConfig, ActionTableType]] = (
71
+ self.device_queue: SimpleQueue[Tuple[str, ActionTableType]] = (
69
72
  SimpleQueue()
70
73
  ) # FIFO
71
74
  for module in self._module_list.root:
72
- self.device_queue.put((module, ActionTableType.ACTIONTABLE))
73
- if module.module_type == "xp20":
74
- self.device_queue.put((module, ActionTableType.MSACTIONTABLE_XP20))
75
- if module.module_type == "xp24":
76
- self.device_queue.put((module, ActionTableType.MSACTIONTABLE_XP24))
77
- if module.module_type == "xp33":
78
- self.device_queue.put((module, ActionTableType.MSACTIONTABLE_XP33))
75
+ self.logger.info("Export module %s", module)
76
+ if module.module_type.lower() == "xp20":
77
+ self.device_queue.put(
78
+ (module.serial_number, ActionTableType.MSACTIONTABLE_XP20)
79
+ )
80
+ if module.module_type.lower() == "xp24":
81
+ self.device_queue.put(
82
+ (module.serial_number, ActionTableType.MSACTIONTABLE_XP24)
83
+ )
84
+ if module.module_type.lower() == "xp33":
85
+ self.device_queue.put(
86
+ (module.serial_number, ActionTableType.MSACTIONTABLE_XP33)
87
+ )
88
+ self.device_queue.put((module.serial_number, ActionTableType.ACTIONTABLE))
89
+
90
+ self.logger.info("Export module %s", self.device_queue.qsize())
79
91
 
80
92
  self.current_module: Optional[ConsonModuleConfig] = None
81
- self.curent_actiontable_type: Optional[ActionTableType] = None
93
+ self.current_actiontable_type: Optional[ActionTableType] = None
82
94
  self.export_result = ConbusExportResponse(success=False)
83
95
  self.export_status = "OK"
84
- # Connect protocol signals
85
- self._connect_signals()
86
96
 
87
97
  def on_module_actiontable_received(
88
98
  self, actiontable: Any, short_actiontable: list[str]
@@ -94,7 +104,7 @@ class ConbusActiontableExportService:
94
104
  actiontable: Full actiontable data.
95
105
  short_actiontable: Short representation of the actiontable.
96
106
  """
97
- if not self.curent_actiontable_type:
107
+ if not self.current_actiontable_type:
98
108
  self._fail("Invalid state (curent_actiontable_type)")
99
109
  return
100
110
 
@@ -102,17 +112,17 @@ class ConbusActiontableExportService:
102
112
  self._fail("Invalid state (current_module)")
103
113
  return
104
114
 
105
- if self.curent_actiontable_type == ActionTableType.ACTIONTABLE:
115
+ if self.current_actiontable_type == ActionTableType.ACTIONTABLE:
106
116
  self.current_module.action_table = short_actiontable
107
- elif self.curent_actiontable_type == ActionTableType.MSACTIONTABLE_XP20:
117
+ elif self.current_actiontable_type == ActionTableType.MSACTIONTABLE_XP20:
108
118
  self.current_module.xp20_msaction_table = short_actiontable
109
- elif self.curent_actiontable_type == ActionTableType.MSACTIONTABLE_XP24:
119
+ elif self.current_actiontable_type == ActionTableType.MSACTIONTABLE_XP24:
110
120
  self.current_module.xp24_msaction_table = short_actiontable
111
- elif self.curent_actiontable_type == ActionTableType.MSACTIONTABLE_XP33:
121
+ elif self.current_actiontable_type == ActionTableType.MSACTIONTABLE_XP33:
112
122
  self.current_module.xp33_msaction_table = short_actiontable
113
123
 
114
124
  self.on_device_actiontable_exported.emit(
115
- self.current_module, self.curent_actiontable_type, actiontable
125
+ self.current_module, self.current_actiontable_type, short_actiontable
116
126
  )
117
127
 
118
128
  def on_module_finish(self) -> None:
@@ -127,10 +137,13 @@ class ConbusActiontableExportService:
127
137
  serial_number = (
128
138
  self.current_module.serial_number if self.current_module else "UNKNOWN"
129
139
  )
140
+ current_actiontable_type = self.current_actiontable_type or "UNKNOWN"
130
141
  total_modules = len(self._module_list.root)
131
142
  current_index = total_modules - self.device_queue.qsize()
132
143
 
133
- self.on_progress.emit(serial_number, current_index, total_modules)
144
+ self.on_progress.emit(
145
+ serial_number, current_actiontable_type, current_index, total_modules
146
+ )
134
147
 
135
148
  def on_module_error(self, error_message: str) -> None:
136
149
  """
@@ -162,7 +175,6 @@ class ConbusActiontableExportService:
162
175
  "enabled",
163
176
  "conbus_ip",
164
177
  "conbus_port",
165
- "action_table",
166
178
  }
167
179
  }
168
180
  },
@@ -203,16 +215,24 @@ class ConbusActiontableExportService:
203
215
  True if there is a module to export, False otherwise.
204
216
  """
205
217
  self.download_service.reset()
206
- (self.current_module, self.curent_actiontable_type) = (
207
- self.device_queue.get_nowait()
208
- )
209
- if not (self.current_module or self.curent_actiontable_type):
218
+ try:
219
+ (current_serial_number, self.current_actiontable_type) = (
220
+ self.device_queue.get_nowait()
221
+ )
222
+ except Empty:
223
+ return False
224
+
225
+ self.current_module = self._module_dic[current_serial_number]
226
+ if not (self.current_module or self.current_actiontable_type):
210
227
  self.logger.error("No module to export")
211
228
  return False
212
229
 
230
+ self.logger.info(
231
+ f"Downloading {self.current_module.serial_number} / {self.current_actiontable_type}"
232
+ )
213
233
  self.download_service.configure(
214
234
  self.current_module.serial_number,
215
- self.curent_actiontable_type,
235
+ self.current_actiontable_type,
216
236
  )
217
237
  self.download_service.do_connect()
218
238
  return True
@@ -275,7 +295,7 @@ class ConbusActiontableExportService:
275
295
 
276
296
  def _disconnect_signals(self) -> None:
277
297
  """Disconnect download service signals from handlers."""
278
- self.download_service.on_actiontable_received.connect(
298
+ self.download_service.on_actiontable_received.disconnect(
279
299
  self.on_module_actiontable_received
280
300
  )
281
301
  self.download_service.on_finish.disconnect(self.on_module_finish)
@@ -221,7 +221,7 @@ class CrossReferenceValidator:
221
221
  # Define output limits by module type
222
222
  output_limits = {
223
223
  "XP130": 0, # Example limits
224
- "XP20": 0,
224
+ "XP20": 8,
225
225
  "XP24": 4,
226
226
  "XP33": 3,
227
227
  "XP33LR": 3,