conson-xp 1.20.0__tar.gz → 1.21.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 (296) hide show
  1. {conson_xp-1.20.0 → conson_xp-1.21.0}/PKG-INFO +1 -1
  2. {conson_xp-1.20.0 → conson_xp-1.21.0}/pyproject.toml +1 -1
  3. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/__init__.py +1 -1
  4. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/term/term_commands.py +1 -1
  5. conson_xp-1.21.0/src/xp/models/term/__init__.py +11 -0
  6. conson_xp-1.21.0/src/xp/models/term/protocol_keys_config.py +45 -0
  7. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/protocol/conbus_event_protocol.py +8 -0
  8. conson_xp-1.21.0/src/xp/term/app.py +158 -0
  9. conson_xp-1.21.0/src/xp/term/protocol.tcss +135 -0
  10. conson_xp-1.21.0/src/xp/term/protocol.yml +139 -0
  11. {conson_xp-1.20.0/src/xp/tui → conson_xp-1.21.0/src/xp/term}/widgets/protocol_log.py +157 -76
  12. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/utils/logging.py +16 -5
  13. conson_xp-1.21.0/src/xp/utils/state_machine.py +81 -0
  14. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_tui/test_protocol_log.py +17 -18
  15. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_utils/test_logging.py +12 -20
  16. conson_xp-1.20.0/src/xp/tui/app.py +0 -72
  17. conson_xp-1.20.0/src/xp/tui/protocol.tcss +0 -50
  18. {conson_xp-1.20.0 → conson_xp-1.21.0}/LICENSE +0 -0
  19. {conson_xp-1.20.0 → conson_xp-1.21.0}/README.md +0 -0
  20. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/__init__.py +0 -0
  21. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/__main__.py +0 -0
  22. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/__init__.py +0 -0
  23. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/__init__.py +0 -0
  24. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus.py +0 -0
  25. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +0 -0
  26. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
  27. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
  28. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
  29. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
  30. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
  31. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
  32. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_event_commands.py +0 -0
  33. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
  34. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
  35. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +0 -0
  36. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +0 -0
  37. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
  38. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
  39. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
  40. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
  41. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/file_commands.py +0 -0
  42. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/homekit/__init__.py +0 -0
  43. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/homekit/homekit.py +0 -0
  44. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
  45. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/module_commands.py +0 -0
  46. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
  47. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/server/__init__.py +0 -0
  48. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/server/server_commands.py +0 -0
  49. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/telegram/__init__.py +0 -0
  50. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/telegram/telegram.py +0 -0
  51. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
  52. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
  53. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
  54. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
  55. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
  56. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
  57. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/term/__init__.py +0 -0
  58. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/commands/term/term.py +0 -0
  59. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/main.py +0 -0
  60. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/utils/__init__.py +0 -0
  61. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/utils/click_tree.py +0 -0
  62. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
  63. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/utils/decorators.py +0 -0
  64. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/utils/error_handlers.py +0 -0
  65. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/utils/formatters.py +0 -0
  66. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/utils/module_type_choice.py +0 -0
  67. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/utils/serial_number_type.py +0 -0
  68. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/utils/system_function_choice.py +0 -0
  69. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/cli/utils/xp_module_type.py +0 -0
  70. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/connection/__init__.py +0 -0
  71. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/connection/exceptions.py +0 -0
  72. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/__init__.py +0 -0
  73. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/actiontable/__init__.py +0 -0
  74. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/actiontable/actiontable.py +0 -0
  75. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
  76. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/actiontable/msactiontable_xp24.py +0 -0
  77. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
  78. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/__init__.py +0 -0
  79. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus.py +0 -0
  80. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_autoreport.py +0 -0
  81. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_blink.py +0 -0
  82. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_client_config.py +0 -0
  83. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_connection_status.py +0 -0
  84. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_custom.py +0 -0
  85. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_datapoint.py +0 -0
  86. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_discover.py +0 -0
  87. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_event_list.py +0 -0
  88. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_event_raw.py +0 -0
  89. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
  90. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_linknumber.py +0 -0
  91. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_logger_config.py +0 -0
  92. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_output.py +0 -0
  93. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_raw.py +0 -0
  94. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_receive.py +0 -0
  95. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
  96. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/homekit/__init__.py +0 -0
  97. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/homekit/homekit_accessory.py +0 -0
  98. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/homekit/homekit_config.py +0 -0
  99. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/homekit/homekit_conson_config.py +0 -0
  100. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/log_entry.py +0 -0
  101. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/protocol/__init__.py +0 -0
  102. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/protocol/conbus_protocol.py +0 -0
  103. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/response.py +0 -0
  104. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/__init__.py +0 -0
  105. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/action_type.py +0 -0
  106. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/datapoint_type.py +0 -0
  107. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/event_telegram.py +0 -0
  108. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/event_type.py +0 -0
  109. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/input_action_type.py +0 -0
  110. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/input_type.py +0 -0
  111. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/module_type.py +0 -0
  112. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/module_type_code.py +0 -0
  113. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/output_telegram.py +0 -0
  114. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/reply_telegram.py +0 -0
  115. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/system_function.py +0 -0
  116. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/system_telegram.py +0 -0
  117. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/telegram.py +0 -0
  118. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/telegram_type.py +0 -0
  119. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/telegram/timeparam_type.py +0 -0
  120. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/models/write_config_type.py +0 -0
  121. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/__init__.py +0 -0
  122. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/actiontable/__init__.py +0 -0
  123. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
  124. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
  125. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +0 -0
  126. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +0 -0
  127. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +0 -0
  128. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/__init__.py +0 -0
  129. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/actiontable/__init__.py +0 -0
  130. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/actiontable/actiontable_download_service.py +0 -0
  131. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
  132. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
  133. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +0 -0
  134. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/actiontable/msactiontable_service.py +0 -0
  135. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
  136. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/conbus_blink_service.py +0 -0
  137. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/conbus_custom_service.py +0 -0
  138. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
  139. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
  140. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/conbus_discover_service.py +0 -0
  141. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/conbus_event_list_service.py +0 -0
  142. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
  143. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/conbus_output_service.py +0 -0
  144. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/conbus_raw_service.py +0 -0
  145. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/conbus_receive_service.py +0 -0
  146. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/conbus_scan_service.py +0 -0
  147. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/conbus/write_config_service.py +0 -0
  148. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/__init__.py +0 -0
  149. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/homekit_cache_service.py +0 -0
  150. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
  151. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/homekit_config_validator.py +0 -0
  152. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
  153. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
  154. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
  155. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/homekit_hap_service.py +0 -0
  156. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
  157. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
  158. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/homekit_module_service.py +0 -0
  159. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/homekit_outlet.py +0 -0
  160. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
  161. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/homekit/homekit_service.py +0 -0
  162. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/log_file_service.py +0 -0
  163. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/module_type_service.py +0 -0
  164. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/protocol/__init__.py +0 -0
  165. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/protocol/conbus_protocol.py +0 -0
  166. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/protocol/protocol_factory.py +0 -0
  167. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/protocol/telegram_protocol.py +0 -0
  168. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/reverse_proxy_service.py +0 -0
  169. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/server/__init__.py +0 -0
  170. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/server/base_server_service.py +0 -0
  171. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/server/cp20_server_service.py +0 -0
  172. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/server/device_service_factory.py +0 -0
  173. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/server/server_service.py +0 -0
  174. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/server/xp130_server_service.py +0 -0
  175. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/server/xp20_server_service.py +0 -0
  176. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/server/xp230_server_service.py +0 -0
  177. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/server/xp24_server_service.py +0 -0
  178. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/server/xp33_server_service.py +0 -0
  179. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/telegram/__init__.py +0 -0
  180. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/telegram/telegram_blink_service.py +0 -0
  181. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
  182. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
  183. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/telegram/telegram_discover_service.py +0 -0
  184. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
  185. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/telegram/telegram_output_service.py +0 -0
  186. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/telegram/telegram_service.py +0 -0
  187. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/services/telegram/telegram_version_service.py +0 -0
  188. {conson_xp-1.20.0/src/xp/tui → conson_xp-1.21.0/src/xp/term}/__init__.py +0 -0
  189. {conson_xp-1.20.0/src/xp/tui → conson_xp-1.21.0/src/xp/term}/widgets/__init__.py +0 -0
  190. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/utils/__init__.py +0 -0
  191. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/utils/checksum.py +0 -0
  192. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/utils/dependencies.py +0 -0
  193. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/utils/event_helper.py +0 -0
  194. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/utils/serialization.py +0 -0
  195. {conson_xp-1.20.0 → conson_xp-1.21.0}/src/xp/utils/time_utils.py +0 -0
  196. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/.coverage +0 -0
  197. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/__init__.py +0 -0
  198. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/conftest.py +0 -0
  199. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/.coverage +0 -0
  200. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/__init__.py +0 -0
  201. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/telegram_test_data.py +0 -0
  202. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_actiontable_integration.py +0 -0
  203. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_api/.coverage +0 -0
  204. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_api/__init__.py +0 -0
  205. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_blink_integration.py +0 -0
  206. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_checksum_integration.py +0 -0
  207. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_conbus_blink_integration.py +0 -0
  208. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_conbus_datapoint_integration.py +0 -0
  209. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_conbus_raw_integration.py +0 -0
  210. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_conbus_receive_integration.py +0 -0
  211. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_discovery_integration.py +0 -0
  212. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_event_telegram_integration.py +0 -0
  213. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_homekit_config_integration.py +0 -0
  214. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_link_number_integration.py +0 -0
  215. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_module_integration.py +0 -0
  216. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_output_integration.py +0 -0
  217. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_reverse_proxy_integration.py +0 -0
  218. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_system_reply_telegram_integration.py +0 -0
  219. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_term_logging_integration.py +0 -0
  220. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_version_integration.py +0 -0
  221. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_xp20_action_table_integration.py +0 -0
  222. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/integration/test_xp24_action_table_integration.py +0 -0
  223. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/__init__.py +0 -0
  224. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_api/__init__.py +0 -0
  225. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_cli/__init__.py +0 -0
  226. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_cli/test_click_tree.py +0 -0
  227. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_cli/test_conbus_actiontable_commands.py +0 -0
  228. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
  229. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
  230. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_cli/test_decorators.py +0 -0
  231. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_cli/test_error_handlers.py +0 -0
  232. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_cli/test_formatters.py +0 -0
  233. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_cli/test_serial_number_type.py +0 -0
  234. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_cli/test_system_function_choice.py +0 -0
  235. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_cli/test_term_commands.py +0 -0
  236. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_connection/__init__.py +0 -0
  237. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_connection/test_connection_init.py +0 -0
  238. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_connection/test_exceptions.py +0 -0
  239. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_encoding/__init__.py +0 -0
  240. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
  241. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/__init__.py +0 -0
  242. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_conbus.py +0 -0
  243. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_conbus_client_send.py +0 -0
  244. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_conbus_discover.py +0 -0
  245. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
  246. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_event_telegram.py +0 -0
  247. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_log_entry.py +0 -0
  248. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_logger_config.py +0 -0
  249. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_module_type.py +0 -0
  250. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_reply_telegram.py +0 -0
  251. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_system_telegram.py +0 -0
  252. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
  253. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_version_telegram.py +0 -0
  254. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_write_config_type.py +0 -0
  255. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_xp20_action_table.py +0 -0
  256. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_xp24_action_table.py +0 -0
  257. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
  258. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/__init__.py +0 -0
  259. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
  260. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_actiontable_service.py +0 -0
  261. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_actiontable_upload_service.py +0 -0
  262. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_base_server_service.py +0 -0
  263. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_blink_service.py +0 -0
  264. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_checksum_service.py +0 -0
  265. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
  266. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_conbus_event_list_service.py +0 -0
  267. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
  268. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
  269. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
  270. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
  271. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_device_service_factory.py +0 -0
  272. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_discovery_service.py +0 -0
  273. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
  274. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
  275. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
  276. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_homekit_services.py +0 -0
  277. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_log_file_service.py +0 -0
  278. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_module_type_service.py +0 -0
  279. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_protocol.py +0 -0
  280. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_server_service.py +0 -0
  281. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_telegram_input_service.py +0 -0
  282. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_telegram_protocol.py +0 -0
  283. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_telegram_service.py +0 -0
  284. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_version_service.py +0 -0
  285. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_xp20_action_table_serializer.py +0 -0
  286. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_xp24_action_service.py +0 -0
  287. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_xp24_action_table_serializer.py +0 -0
  288. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
  289. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_xp33_action_table_serializer.py +0 -0
  290. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_services/test_xp_server_services.py +0 -0
  291. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_tui/__init__.py +0 -0
  292. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_utils/__init__.py +0 -0
  293. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_utils/test_checksum.py +0 -0
  294. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_utils/test_event_helper.py +0 -0
  295. {conson_xp-1.20.0 → conson_xp-1.21.0}/tests/unit/test_utils/test_serialization.py +0 -0
  296. {conson_xp-1.20.0 → conson_xp-1.21.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.20.0
3
+ Version: 1.21.0
4
4
  Summary: XP Protocol Communication Tools
5
5
  Author-Email: ldvchosal <ldvchosal@github.com>
6
6
  License: MIT License
@@ -22,7 +22,7 @@ dependencies = [
22
22
  ]
23
23
  requires-python = ">=3.11"
24
24
  readme = "README.md"
25
- version = "1.20.0"
25
+ version = "1.21.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.20.0"
6
+ __version__ = "1.21.0"
7
7
  __manufacturer__ = "salchichon"
8
8
  __model__ = "xp.cli"
9
9
  __serial__ = "2025.09.23.000"
@@ -21,7 +21,7 @@ def protocol_monitor(ctx: Context) -> None:
21
21
  \b
22
22
  xp term protocol
23
23
  """
24
- from xp.tui.app import ProtocolMonitorApp
24
+ from xp.term.app import ProtocolMonitorApp
25
25
 
26
26
  # Resolve ServiceContainer from context
27
27
  container = ctx.obj.get("container").get_container()
@@ -0,0 +1,11 @@
1
+ """Terminal UI models."""
2
+
3
+ from xp.models.term.protocol_keys_config import (
4
+ ProtocolKeyConfig,
5
+ ProtocolKeysConfig,
6
+ )
7
+
8
+ __all__ = [
9
+ "ProtocolKeyConfig",
10
+ "ProtocolKeysConfig",
11
+ ]
@@ -0,0 +1,45 @@
1
+ """Protocol keys configuration model."""
2
+
3
+ from pathlib import Path
4
+ from typing import Dict
5
+
6
+ import yaml
7
+ from pydantic import BaseModel, Field
8
+
9
+
10
+ class ProtocolKeyConfig(BaseModel):
11
+ """Configuration for a single protocol key.
12
+
13
+ Attributes:
14
+ name: Human-readable command name.
15
+ telegrams: List of raw telegram strings to send (without angle brackets).
16
+ """
17
+
18
+ name: str = Field(..., description="Human-readable command name")
19
+ telegrams: list[str] = Field(..., description="List of raw telegram strings")
20
+
21
+
22
+ class ProtocolKeysConfig(BaseModel):
23
+ """Protocol keys configuration.
24
+
25
+ Attributes:
26
+ protocol: Dictionary mapping key to protocol configuration.
27
+ """
28
+
29
+ protocol: Dict[str, ProtocolKeyConfig] = Field(
30
+ default_factory=dict, description="Protocol key mappings"
31
+ )
32
+
33
+ @classmethod
34
+ def from_yaml(cls, config_path: Path) -> "ProtocolKeysConfig":
35
+ """Load protocol keys from YAML file.
36
+
37
+ Args:
38
+ config_path: Path to YAML configuration file.
39
+
40
+ Returns:
41
+ ProtocolKeysConfig instance.
42
+ """
43
+ with config_path.open("r") as f:
44
+ data = yaml.safe_load(f)
45
+ return cls(**data)
@@ -209,6 +209,14 @@ class ConbusEventProtocol(protocol.Protocol, protocol.ClientFactory):
209
209
  f"F{system_function.value}"
210
210
  f"D{data_value}"
211
211
  )
212
+ self.send_raw_telegram(payload)
213
+
214
+ def send_raw_telegram(self, payload: str) -> None:
215
+ """Send telegram with specified parameters.
216
+
217
+ Args:
218
+ payload: Telegram to send.
219
+ """
212
220
  self.telegram_queue.put_nowait(payload.encode())
213
221
  self.call_later(0.0, self.start_queue_manager)
214
222
 
@@ -0,0 +1,158 @@
1
+ """Protocol Monitor TUI Application."""
2
+
3
+ from pathlib import Path
4
+ from typing import Any, Optional
5
+
6
+ from textual.app import App, ComposeResult
7
+ from textual.containers import Horizontal, Vertical
8
+ from textual.widgets import DataTable, Footer, Static
9
+
10
+ from xp.models.term import ProtocolKeysConfig
11
+ from xp.term.widgets.protocol_log import ProtocolLogWidget
12
+
13
+
14
+ class ProtocolMonitorApp(App[None]):
15
+ """Textual app for real-time protocol monitoring.
16
+
17
+ Displays live RX/TX telegram stream from Conbus server in an interactive
18
+ terminal interface with keyboard shortcuts for control.
19
+
20
+ Attributes:
21
+ container: ServiceContainer for dependency injection.
22
+ CSS_PATH: Path to CSS stylesheet file.
23
+ BINDINGS: Keyboard bindings for app actions.
24
+ TITLE: Application title displayed in header.
25
+ ENABLE_COMMAND_PALETTE: Disable Textual's command palette feature.
26
+ """
27
+
28
+ CSS_PATH = Path(__file__).parent / "protocol.tcss"
29
+ TITLE = "Protocol Monitor"
30
+ ENABLE_COMMAND_PALETTE = False
31
+
32
+ BINDINGS = [
33
+ ("Q", "quit", "Quit"),
34
+ ("C", "toggle_connection", "Connect"),
35
+ ("R", "reset", "Reset"),
36
+ ("0-9,a-q", "protocol_keys", "Keys"),
37
+ ]
38
+
39
+ def __init__(self, container: Any) -> None:
40
+ """Initialize the Protocol Monitor app.
41
+
42
+ Args:
43
+ container: ServiceContainer for resolving services.
44
+ """
45
+ super().__init__()
46
+ self.container = container
47
+ self.protocol_widget: Optional[ProtocolLogWidget] = None
48
+ self.status_widget: Optional[Static] = None
49
+ self.status_text_widget: Optional[Static] = None
50
+ self.help_table: Optional[DataTable] = None
51
+ self.protocol_keys = self._load_protocol_keys()
52
+
53
+ def _load_protocol_keys(self) -> ProtocolKeysConfig:
54
+ """Load protocol keys from YAML config file.
55
+
56
+ Returns:
57
+ ProtocolKeysConfig instance.
58
+ """
59
+ config_path = Path(__file__).parent / "protocol.yml"
60
+ return ProtocolKeysConfig.from_yaml(config_path)
61
+
62
+ def compose(self) -> ComposeResult:
63
+ """Compose the app layout with widgets.
64
+
65
+ Yields:
66
+ ProtocolLogWidget and Footer widgets.
67
+ """
68
+ with Horizontal(id="main-container"):
69
+ self.protocol_widget = ProtocolLogWidget(container=self.container)
70
+ yield self.protocol_widget
71
+
72
+ # Help menu (hidden by default)
73
+ help_container = Vertical(id="help-menu")
74
+ help_container.border_title = "Help menu"
75
+ help_container.can_focus = False
76
+ with help_container:
77
+ self.help_table = DataTable(id="help-table", show_header=False)
78
+ self.help_table.can_focus = False
79
+ yield self.help_table
80
+
81
+ with Horizontal(id="footer-container"):
82
+ yield Footer()
83
+ self.status_widget = Static("○", id="status-line")
84
+ yield self.status_widget
85
+
86
+ def action_toggle_connection(self) -> None:
87
+ """Toggle connection on 'c' key press.
88
+
89
+ Connects if disconnected/failed, disconnects if connected/connecting.
90
+ """
91
+ if self.protocol_widget:
92
+ from xp.term.widgets.protocol_log import ConnectionState
93
+
94
+ state = self.protocol_widget.connection_state
95
+ if state in (ConnectionState.CONNECTED, ConnectionState.CONNECTING):
96
+ self.protocol_widget.disconnect()
97
+ else:
98
+ self.protocol_widget.connect()
99
+
100
+ def action_reset(self) -> None:
101
+ """Reset and clear protocol widget on 'r' key press."""
102
+ if self.protocol_widget:
103
+ self.protocol_widget.clear_log()
104
+
105
+ def on_key(self, event: Any) -> None:
106
+ """Handle key press events for protocol keys.
107
+
108
+ Args:
109
+ event: Key press event from Textual.
110
+ """
111
+ if event.key in self.protocol_keys.protocol and self.protocol_widget:
112
+ key_config = self.protocol_keys.protocol[event.key]
113
+ for telegram in key_config.telegrams:
114
+ self.protocol_widget.send_telegram(key_config.name, telegram)
115
+
116
+ def on_mount(self) -> None:
117
+ """Set up status line updates when app mounts."""
118
+ if self.protocol_widget:
119
+ self.protocol_widget.watch(
120
+ self.protocol_widget,
121
+ "connection_state",
122
+ self._update_status,
123
+ )
124
+
125
+ # Initialize help table
126
+ if self.help_table:
127
+ self.help_table.add_columns("Key", "Command")
128
+ for key, config in self.protocol_keys.protocol.items():
129
+ self.help_table.add_row(key, config.name)
130
+
131
+ def _update_status(self, state: Any) -> None:
132
+ """Update status line with connection state.
133
+
134
+ Args:
135
+ state: Current connection state.
136
+ """
137
+ if self.status_widget:
138
+ # Map states to colored dots
139
+ status_map = {
140
+ "CONNECTED": "[green]●[/green]",
141
+ "CONNECTING": "[yellow]●[/yellow]",
142
+ "DISCONNECTING": "[yellow]●[/yellow]",
143
+ "FAILED": "[red]●[/red]",
144
+ "DISCONNECTED": "○",
145
+ }
146
+ dot = status_map.get(state.value, "○")
147
+ self.status_widget.update(dot)
148
+
149
+ def on_protocol_log_widget_status_message_changed(
150
+ self, message: ProtocolLogWidget.StatusMessageChanged
151
+ ) -> None:
152
+ """Handle status message changes from protocol widget.
153
+
154
+ Args:
155
+ message: Message containing the status text.
156
+ """
157
+ if self.status_text_widget:
158
+ self.status_text_widget.update(message.message)
@@ -0,0 +1,135 @@
1
+ /* Protocol Monitor TUI Styling */
2
+
3
+ /* App-level styling */
4
+ Screen {
5
+ background: $background;
6
+ }
7
+
8
+ /* Protocol Log Widget */
9
+ ProtocolLogWidget {
10
+ border: solid $success;
11
+ width: 1fr;
12
+ height: 1fr;
13
+ background: $background;
14
+ padding: 1;
15
+ }
16
+
17
+ ProtocolLogWidget > RichLog {
18
+ background: $background !important;
19
+ scrollbar-background: $background;
20
+ }
21
+
22
+ ProtocolLogWidget > RichLog:focus {
23
+ background: $background !important;
24
+ background-tint: transparent;
25
+ }
26
+
27
+ ProtocolLogWidget > .connection-status {
28
+ color: $text;
29
+ text-align: center;
30
+ padding: 1;
31
+ }
32
+
33
+ ProtocolLogWidget > .connection-status.connecting {
34
+ color: $warning;
35
+ }
36
+
37
+ ProtocolLogWidget > .connection-status.connected {
38
+ color: $success;
39
+ }
40
+
41
+ ProtocolLogWidget > .connection-status.failed {
42
+ color: $error;
43
+ }
44
+
45
+ /* Message display styling */
46
+ .message-tx {
47
+ color: $success;
48
+ }
49
+
50
+ .message-rx {
51
+ color: $success;
52
+ }
53
+
54
+ .message-frame {
55
+ color: $text-muted;
56
+ }
57
+
58
+ /* Main container */
59
+ #main-container {
60
+ height: 1fr;
61
+ }
62
+
63
+ /* Help menu styling */
64
+ #help-menu {
65
+ width: 35;
66
+ height: 1fr;
67
+ background: $background;
68
+ border: solid $success;
69
+ padding: 1;
70
+ }
71
+
72
+ #help-menu:focus {
73
+ border: solid $success;
74
+ }
75
+
76
+ #help-title {
77
+ color: $success;
78
+ text-align: center;
79
+ text-style: bold;
80
+ margin-bottom: 1;
81
+ }
82
+
83
+ #help-table {
84
+ background: $background;
85
+ height: auto;
86
+ color: $success;
87
+ }
88
+
89
+ DataTable {
90
+ background: $background;
91
+ }
92
+
93
+ DataTable > .datatable--header {
94
+ background: $background;
95
+ color: $success;
96
+ }
97
+
98
+ DataTable > .datatable--cursor {
99
+ background: $background;
100
+ }
101
+
102
+ DataTable:focus > .datatable--cursor {
103
+ background: $background;
104
+ }
105
+
106
+ /* Footer styling */
107
+ #footer-container {
108
+ dock: bottom;
109
+ height: 1;
110
+ background: $background;
111
+ }
112
+
113
+ Footer {
114
+ width: auto;
115
+ background: $background;
116
+ color: $text;
117
+ }
118
+
119
+ #status-text {
120
+ dock: right;
121
+ width: auto;
122
+ padding: 0 1;
123
+ background: $background;
124
+ color: $text;
125
+ text-align: right;
126
+ }
127
+
128
+ #status-line {
129
+ dock: right;
130
+ width: auto;
131
+ padding: 0 1;
132
+ background: $background;
133
+ color: $text;
134
+ text-align: right;
135
+ }
@@ -0,0 +1,139 @@
1
+ protocol:
2
+ "1":
3
+ name: "Discover"
4
+ telegrams:
5
+ - S0000000000F01D00
6
+ "2":
7
+ name: "Error Code"
8
+ telegrams:
9
+ - S0020044966F02D10
10
+ "3":
11
+ name: "Module Type"
12
+ telegrams:
13
+ - S0020044966F02D00
14
+ "4":
15
+ name: "Auto Report"
16
+ telegrams:
17
+ - S0020044966F02D21
18
+ "5":
19
+ name: "Link Number"
20
+ telegrams:
21
+ - S0020044966F02D04
22
+ "6":
23
+ name: "Blink On"
24
+ telegrams:
25
+ - S0020044966F01D01
26
+ "7":
27
+ name: "Blink Off"
28
+ telegrams:
29
+ - S0020044966F01D00
30
+ "8":
31
+ name: "Output 1 On"
32
+ telegrams:
33
+ - S0020044966F02101
34
+ "9":
35
+ name: "Output 1 Off"
36
+ telegrams:
37
+ - S0020044966F02100
38
+ "0":
39
+ name: "Output State"
40
+ telegrams:
41
+ - S0020044966F02D09
42
+ "a":
43
+ name: "Module State"
44
+ telegrams:
45
+ - S0020044966F02D09
46
+ "b":
47
+ name: "All Off"
48
+ telegrams:
49
+ - E02L00I00M
50
+ - E02L00I00B
51
+ "c":
52
+ name: "All On"
53
+ telegrams:
54
+ - E02L00I08M
55
+ - E02L00I08B
56
+
57
+ "d":
58
+ name: "All 1 On"
59
+ telegrams:
60
+ - E02L01I08M
61
+ - E02L01I08B
62
+
63
+ "e":
64
+ name: "All 1 Off"
65
+ telegrams:
66
+ - E02L01I00M
67
+ - E02L01I00B
68
+
69
+ "f":
70
+ name: "All 2 On"
71
+ telegrams:
72
+ - E02L02I08M
73
+ - E02L02I08B
74
+
75
+ "g":
76
+ name: "All 2 Off"
77
+ telegrams:
78
+ - E02L02I00M
79
+ - E02L02I00B
80
+
81
+ "h":
82
+ name: "All 3 On"
83
+ telegrams:
84
+ - E02L03I08M
85
+ - E02L03I08B
86
+
87
+ "i":
88
+ name: "All 3 Off"
89
+ telegrams:
90
+ - E02L03I00M
91
+ - E02L03I00B
92
+
93
+ "j":
94
+ name: "All 4 On"
95
+ telegrams:
96
+ - E02L04I08M
97
+ - E02L04I08B
98
+
99
+ "k":
100
+ name: "All 4 Off"
101
+ telegrams:
102
+ - E02L04I00M
103
+ - E02L04I00B
104
+
105
+ "l":
106
+ name: "All 5 On"
107
+ telegrams:
108
+ - E02L05I08M
109
+ - E02L05I08B
110
+
111
+ "m":
112
+ name: "All 5 Off"
113
+ telegrams:
114
+ - E02L05I00M
115
+ - E02L05I00B
116
+
117
+ "n":
118
+ name: "All 6 On"
119
+ telegrams:
120
+ - E02L06I08M
121
+ - E02L06I08B
122
+
123
+ "o":
124
+ name: "All 6 Off"
125
+ telegrams:
126
+ - E02L06I00M
127
+ - E02L06I00B
128
+
129
+ "p":
130
+ name: "All 7 On"
131
+ telegrams:
132
+ - E02L07I08M
133
+ - E02L07I08B
134
+
135
+ "q":
136
+ name: "All 7 Off"
137
+ telegrams:
138
+ - E02L07I00M
139
+ - E02L07I00B