conson-xp 1.21.0__tar.gz → 1.22.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.
- {conson_xp-1.21.0 → conson_xp-1.22.0}/PKG-INFO +32 -17
- {conson_xp-1.21.0 → conson_xp-1.22.0}/README.md +31 -16
- {conson_xp-1.21.0 → conson_xp-1.22.0}/pyproject.toml +2 -2
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/__init__.py +1 -1
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/term/term_commands.py +1 -1
- conson_xp-1.21.0/src/xp/term/app.py → conson_xp-1.22.0/src/xp/term/protocol.py +14 -45
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/term/protocol.yml +14 -14
- conson_xp-1.22.0/src/xp/term/widgets/__init__.py +7 -0
- conson_xp-1.22.0/src/xp/term/widgets/help_menu.py +55 -0
- conson_xp-1.22.0/src/xp/term/widgets/status_footer.py +53 -0
- conson_xp-1.21.0/src/xp/term/widgets/__init__.py +0 -1
- {conson_xp-1.21.0 → conson_xp-1.22.0}/LICENSE +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/__main__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_event_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/file_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/homekit/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/homekit/homekit.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/module_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/server/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/server/server_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/telegram.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/term/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/term/term.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/main.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/utils/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/utils/click_tree.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/utils/decorators.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/utils/error_handlers.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/utils/formatters.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/utils/module_type_choice.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/utils/serial_number_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/utils/system_function_choice.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/utils/xp_module_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/connection/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/connection/exceptions.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/actiontable/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/actiontable/actiontable.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/actiontable/msactiontable_xp24.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_autoreport.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_blink.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_client_config.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_connection_status.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_custom.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_datapoint.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_discover.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_event_list.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_event_raw.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_linknumber.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_logger_config.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_output.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_raw.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_receive.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/homekit/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/homekit/homekit_accessory.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/homekit/homekit_config.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/homekit/homekit_conson_config.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/log_entry.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/protocol/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/protocol/conbus_protocol.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/response.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/action_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/datapoint_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/event_telegram.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/event_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/input_action_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/input_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/module_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/module_type_code.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/output_telegram.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/reply_telegram.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/system_function.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/system_telegram.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/telegram.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/telegram_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/telegram/timeparam_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/term/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/term/protocol_keys_config.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/models/write_config_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/actiontable/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/actiontable/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/actiontable/actiontable_download_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/actiontable/msactiontable_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/conbus_blink_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/conbus_custom_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/conbus_discover_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/conbus_event_list_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/conbus_output_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/conbus_raw_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/conbus_receive_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/conbus_scan_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/conbus/write_config_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/homekit_cache_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/homekit_config_validator.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/homekit_hap_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/homekit_module_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/homekit_outlet.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/homekit/homekit_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/log_file_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/module_type_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/protocol/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/protocol/conbus_event_protocol.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/protocol/conbus_protocol.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/protocol/protocol_factory.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/protocol/telegram_protocol.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/reverse_proxy_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/server/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/server/base_server_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/server/cp20_server_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/server/device_service_factory.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/server/server_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/server/xp130_server_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/server/xp20_server_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/server/xp230_server_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/server/xp24_server_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/server/xp33_server_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/telegram/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/telegram/telegram_blink_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/telegram/telegram_discover_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/telegram/telegram_output_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/telegram/telegram_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/services/telegram/telegram_version_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/term/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/term/protocol.tcss +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/term/widgets/protocol_log.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/utils/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/utils/checksum.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/utils/dependencies.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/utils/event_helper.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/utils/logging.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/utils/serialization.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/utils/state_machine.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/utils/time_utils.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/.coverage +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/conftest.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/.coverage +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/telegram_test_data.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_actiontable_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_api/.coverage +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_api/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_blink_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_checksum_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_conbus_blink_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_conbus_datapoint_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_conbus_raw_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_conbus_receive_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_discovery_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_event_telegram_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_homekit_config_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_link_number_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_module_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_output_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_reverse_proxy_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_system_reply_telegram_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_term_logging_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_version_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_xp20_action_table_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/integration/test_xp24_action_table_integration.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_api/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_cli/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_cli/test_click_tree.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_cli/test_conbus_actiontable_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_cli/test_decorators.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_cli/test_error_handlers.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_cli/test_formatters.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_cli/test_serial_number_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_cli/test_system_function_choice.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_cli/test_term_commands.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_connection/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_connection/test_connection_init.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_connection/test_exceptions.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_encoding/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_conbus.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_conbus_client_send.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_conbus_discover.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_event_telegram.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_log_entry.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_logger_config.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_module_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_reply_telegram.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_system_telegram.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_version_telegram.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_write_config_type.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_xp20_action_table.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_xp24_action_table.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_actiontable_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_actiontable_upload_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_base_server_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_blink_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_checksum_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_conbus_event_list_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_device_service_factory.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_discovery_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_homekit_services.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_log_file_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_module_type_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_protocol.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_server_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_telegram_input_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_telegram_protocol.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_telegram_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_version_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_xp20_action_table_serializer.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_xp24_action_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_xp24_action_table_serializer.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_xp33_action_table_serializer.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_services/test_xp_server_services.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_tui/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_tui/test_protocol_log.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_utils/__init__.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_utils/test_checksum.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_utils/test_event_helper.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_utils/test_logging.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.0}/tests/unit/test_utils/test_serialization.py +0 -0
- {conson_xp-1.21.0 → conson_xp-1.22.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.
|
|
3
|
+
Version: 1.22.0
|
|
4
4
|
Summary: XP Protocol Communication Tools
|
|
5
5
|
Author-Email: ldvchosal <ldvchosal@github.com>
|
|
6
6
|
License: MIT License
|
|
@@ -60,7 +60,7 @@ Description-Content-Type: text/markdown
|
|
|
60
60
|
[](https://opensource.org/licenses/MIT)
|
|
61
61
|
[](https://mypy-lang.org/)
|
|
62
62
|
|
|
63
|
-
> **A powerful Python CLI
|
|
63
|
+
> **A powerful Python CLI toolkit for CONSON XP Protocol operations**
|
|
64
64
|
|
|
65
65
|
Control and communicate with XP devices through console bus (Conbus), parse telegrams in real-time, and integrate with smart home systems like Apple HomeKit.
|
|
66
66
|
|
|
@@ -81,7 +81,7 @@ Bridge XP devices to Apple HomeKit for seamless smart home control
|
|
|
81
81
|
Automatically discover XP servers and scan connected modules on your network
|
|
82
82
|
|
|
83
83
|
⚡ **Modern Architecture**
|
|
84
|
-
|
|
84
|
+
Comprehensive type safety and robust error handling
|
|
85
85
|
|
|
86
86
|
---
|
|
87
87
|
|
|
@@ -96,9 +96,6 @@ xp telegram parse "<E14L00I02MAK>"
|
|
|
96
96
|
|
|
97
97
|
# Discover XP servers on your network
|
|
98
98
|
xp conbus discover
|
|
99
|
-
|
|
100
|
-
# Start the REST API server
|
|
101
|
-
xp api start
|
|
102
99
|
```
|
|
103
100
|
|
|
104
101
|
## 📦 Installation
|
|
@@ -167,7 +164,32 @@ xp module search "push button"
|
|
|
167
164
|
xp module list --group-by-category
|
|
168
165
|
```
|
|
169
166
|
|
|
167
|
+
### 🖥️ Terminal UI (TUI)
|
|
168
|
+
|
|
169
|
+
**Real-time Protocol Monitor**
|
|
170
|
+
|
|
171
|
+
Launch an interactive terminal interface for live protocol monitoring and control:
|
|
170
172
|
|
|
173
|
+
```bash
|
|
174
|
+
# Start the protocol monitor TUI
|
|
175
|
+
xp term protocol
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**Features:**
|
|
179
|
+
- 📊 **Live Telegram Stream**: Real-time RX/TX telegram monitoring from Conbus server
|
|
180
|
+
- ⌨️ **Keyboard Shortcuts**: Quick access controls for common operations
|
|
181
|
+
- `Q` - Quit application
|
|
182
|
+
- `C` - Toggle connection (connect/disconnect)
|
|
183
|
+
- `R` - Reset and clear log
|
|
184
|
+
- `0-9, a-q` - Send predefined protocol telegrams
|
|
185
|
+
- 🎨 **Visual Status Indicators**: Color-coded connection states
|
|
186
|
+
- 🟢 Green - Connected
|
|
187
|
+
- 🟡 Yellow - Connecting/Disconnecting
|
|
188
|
+
- 🔴 Red - Failed
|
|
189
|
+
- ⚪ White - Disconnected
|
|
190
|
+
- 📝 **Interactive Display**: Scrollable telegram log with detailed parsing information
|
|
191
|
+
|
|
192
|
+
The TUI provides a convenient way to monitor and interact with XP devices without juggling multiple terminal commands.
|
|
171
193
|
|
|
172
194
|
### 🔧 Advanced Features
|
|
173
195
|
|
|
@@ -201,13 +223,7 @@ xp checksum calculate "E14L00I02M" --algorithm crc32
|
|
|
201
223
|
```
|
|
202
224
|
</details>
|
|
203
225
|
|
|
204
|
-
### 🌐
|
|
205
|
-
|
|
206
|
-
**REST API Server**
|
|
207
|
-
```bash
|
|
208
|
-
# Start API server with interactive docs at /docs
|
|
209
|
-
xp api start
|
|
210
|
-
```
|
|
226
|
+
### 🌐 Integration
|
|
211
227
|
|
|
212
228
|
**HomeKit Smart Home Bridge**
|
|
213
229
|
```bash
|
|
@@ -232,7 +248,7 @@ xp reverse-proxy start
|
|
|
232
248
|
|
|
233
249
|
**Layered Design**
|
|
234
250
|
```
|
|
235
|
-
CLI Layer →
|
|
251
|
+
CLI Layer → Services → Models → Connection Layer
|
|
236
252
|
```
|
|
237
253
|
|
|
238
254
|
**Key Components**: Telegram processing • Real-time Conbus communication • HomeKit bridge • Multiple XP server support • Configuration management
|
|
@@ -256,9 +272,8 @@ pdm run check
|
|
|
256
272
|
<details>
|
|
257
273
|
<summary><b>Project Structure</b></summary>
|
|
258
274
|
|
|
259
|
-
```
|
|
275
|
+
```
|
|
260
276
|
src/xp/
|
|
261
|
-
├── api/ # FastAPI REST endpoints
|
|
262
277
|
├── cli/ # Command-line interface
|
|
263
278
|
├── models/ # Core data models
|
|
264
279
|
├── services/ # Business logic
|
|
@@ -407,7 +422,7 @@ xp term protocol
|
|
|
407
422
|
```
|
|
408
423
|
</details>
|
|
409
424
|
|
|
410
|
-
**Requirements**: Python 3.10+ •
|
|
425
|
+
**Requirements**: Python 3.10+ • Pydantic • Click • HAP-python
|
|
411
426
|
|
|
412
427
|
## License
|
|
413
428
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](https://opensource.org/licenses/MIT)
|
|
8
8
|
[](https://mypy-lang.org/)
|
|
9
9
|
|
|
10
|
-
> **A powerful Python CLI
|
|
10
|
+
> **A powerful Python CLI toolkit for CONSON XP Protocol operations**
|
|
11
11
|
|
|
12
12
|
Control and communicate with XP devices through console bus (Conbus), parse telegrams in real-time, and integrate with smart home systems like Apple HomeKit.
|
|
13
13
|
|
|
@@ -28,7 +28,7 @@ Bridge XP devices to Apple HomeKit for seamless smart home control
|
|
|
28
28
|
Automatically discover XP servers and scan connected modules on your network
|
|
29
29
|
|
|
30
30
|
⚡ **Modern Architecture**
|
|
31
|
-
|
|
31
|
+
Comprehensive type safety and robust error handling
|
|
32
32
|
|
|
33
33
|
---
|
|
34
34
|
|
|
@@ -43,9 +43,6 @@ xp telegram parse "<E14L00I02MAK>"
|
|
|
43
43
|
|
|
44
44
|
# Discover XP servers on your network
|
|
45
45
|
xp conbus discover
|
|
46
|
-
|
|
47
|
-
# Start the REST API server
|
|
48
|
-
xp api start
|
|
49
46
|
```
|
|
50
47
|
|
|
51
48
|
## 📦 Installation
|
|
@@ -114,7 +111,32 @@ xp module search "push button"
|
|
|
114
111
|
xp module list --group-by-category
|
|
115
112
|
```
|
|
116
113
|
|
|
114
|
+
### 🖥️ Terminal UI (TUI)
|
|
115
|
+
|
|
116
|
+
**Real-time Protocol Monitor**
|
|
117
|
+
|
|
118
|
+
Launch an interactive terminal interface for live protocol monitoring and control:
|
|
117
119
|
|
|
120
|
+
```bash
|
|
121
|
+
# Start the protocol monitor TUI
|
|
122
|
+
xp term protocol
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Features:**
|
|
126
|
+
- 📊 **Live Telegram Stream**: Real-time RX/TX telegram monitoring from Conbus server
|
|
127
|
+
- ⌨️ **Keyboard Shortcuts**: Quick access controls for common operations
|
|
128
|
+
- `Q` - Quit application
|
|
129
|
+
- `C` - Toggle connection (connect/disconnect)
|
|
130
|
+
- `R` - Reset and clear log
|
|
131
|
+
- `0-9, a-q` - Send predefined protocol telegrams
|
|
132
|
+
- 🎨 **Visual Status Indicators**: Color-coded connection states
|
|
133
|
+
- 🟢 Green - Connected
|
|
134
|
+
- 🟡 Yellow - Connecting/Disconnecting
|
|
135
|
+
- 🔴 Red - Failed
|
|
136
|
+
- ⚪ White - Disconnected
|
|
137
|
+
- 📝 **Interactive Display**: Scrollable telegram log with detailed parsing information
|
|
138
|
+
|
|
139
|
+
The TUI provides a convenient way to monitor and interact with XP devices without juggling multiple terminal commands.
|
|
118
140
|
|
|
119
141
|
### 🔧 Advanced Features
|
|
120
142
|
|
|
@@ -148,13 +170,7 @@ xp checksum calculate "E14L00I02M" --algorithm crc32
|
|
|
148
170
|
```
|
|
149
171
|
</details>
|
|
150
172
|
|
|
151
|
-
### 🌐
|
|
152
|
-
|
|
153
|
-
**REST API Server**
|
|
154
|
-
```bash
|
|
155
|
-
# Start API server with interactive docs at /docs
|
|
156
|
-
xp api start
|
|
157
|
-
```
|
|
173
|
+
### 🌐 Integration
|
|
158
174
|
|
|
159
175
|
**HomeKit Smart Home Bridge**
|
|
160
176
|
```bash
|
|
@@ -179,7 +195,7 @@ xp reverse-proxy start
|
|
|
179
195
|
|
|
180
196
|
**Layered Design**
|
|
181
197
|
```
|
|
182
|
-
CLI Layer →
|
|
198
|
+
CLI Layer → Services → Models → Connection Layer
|
|
183
199
|
```
|
|
184
200
|
|
|
185
201
|
**Key Components**: Telegram processing • Real-time Conbus communication • HomeKit bridge • Multiple XP server support • Configuration management
|
|
@@ -203,9 +219,8 @@ pdm run check
|
|
|
203
219
|
<details>
|
|
204
220
|
<summary><b>Project Structure</b></summary>
|
|
205
221
|
|
|
206
|
-
```
|
|
222
|
+
```
|
|
207
223
|
src/xp/
|
|
208
|
-
├── api/ # FastAPI REST endpoints
|
|
209
224
|
├── cli/ # Command-line interface
|
|
210
225
|
├── models/ # Core data models
|
|
211
226
|
├── services/ # Business logic
|
|
@@ -354,7 +369,7 @@ xp term protocol
|
|
|
354
369
|
```
|
|
355
370
|
</details>
|
|
356
371
|
|
|
357
|
-
**Requirements**: Python 3.10+ •
|
|
372
|
+
**Requirements**: Python 3.10+ • Pydantic • Click • HAP-python
|
|
358
373
|
|
|
359
374
|
## License
|
|
360
375
|
|
|
@@ -22,7 +22,7 @@ dependencies = [
|
|
|
22
22
|
]
|
|
23
23
|
requires-python = ">=3.11"
|
|
24
24
|
readme = "README.md"
|
|
25
|
-
version = "1.
|
|
25
|
+
version = "1.22.0"
|
|
26
26
|
|
|
27
27
|
[project.license]
|
|
28
28
|
file = "LICENSE"
|
|
@@ -209,7 +209,7 @@ composite = [
|
|
|
209
209
|
]
|
|
210
210
|
|
|
211
211
|
[tool.pdm.scripts.clean]
|
|
212
|
-
shell = "rm -rf .coverage coverage.xml htmlcov/ .pytest_cache/ && find . -type d -name '__pycache__' -exec rm -rf {} +"
|
|
212
|
+
shell = "rm -rf .coverage coverage.xml htmlcov/ .pytest_cache/ conbus.log.* && find . -type d -name '__pycache__' -exec rm -rf {} +"
|
|
213
213
|
|
|
214
214
|
[tool.vulture]
|
|
215
215
|
exclude = [
|
|
@@ -21,7 +21,7 @@ def protocol_monitor(ctx: Context) -> None:
|
|
|
21
21
|
\b
|
|
22
22
|
xp term protocol
|
|
23
23
|
"""
|
|
24
|
-
from xp.term.
|
|
24
|
+
from xp.term.protocol import ProtocolMonitorApp
|
|
25
25
|
|
|
26
26
|
# Resolve ServiceContainer from context
|
|
27
27
|
container = ctx.obj.get("container").get_container()
|
|
@@ -4,11 +4,12 @@ from pathlib import Path
|
|
|
4
4
|
from typing import Any, Optional
|
|
5
5
|
|
|
6
6
|
from textual.app import App, ComposeResult
|
|
7
|
-
from textual.containers import Horizontal
|
|
8
|
-
from textual.widgets import DataTable, Footer, Static
|
|
7
|
+
from textual.containers import Horizontal
|
|
9
8
|
|
|
10
9
|
from xp.models.term import ProtocolKeysConfig
|
|
10
|
+
from xp.term.widgets.help_menu import HelpMenuWidget
|
|
11
11
|
from xp.term.widgets.protocol_log import ProtocolLogWidget
|
|
12
|
+
from xp.term.widgets.status_footer import StatusFooterWidget
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
class ProtocolMonitorApp(App[None]):
|
|
@@ -45,9 +46,8 @@ class ProtocolMonitorApp(App[None]):
|
|
|
45
46
|
super().__init__()
|
|
46
47
|
self.container = container
|
|
47
48
|
self.protocol_widget: Optional[ProtocolLogWidget] = None
|
|
48
|
-
self.
|
|
49
|
-
self.
|
|
50
|
-
self.help_table: Optional[DataTable] = None
|
|
49
|
+
self.help_menu: Optional[HelpMenuWidget] = None
|
|
50
|
+
self.footer_widget: Optional[StatusFooterWidget] = None
|
|
51
51
|
self.protocol_keys = self._load_protocol_keys()
|
|
52
52
|
|
|
53
53
|
def _load_protocol_keys(self) -> ProtocolKeysConfig:
|
|
@@ -70,18 +70,13 @@ class ProtocolMonitorApp(App[None]):
|
|
|
70
70
|
yield self.protocol_widget
|
|
71
71
|
|
|
72
72
|
# Help menu (hidden by default)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
with Horizontal(id="footer-container"):
|
|
82
|
-
yield Footer()
|
|
83
|
-
self.status_widget = Static("○", id="status-line")
|
|
84
|
-
yield self.status_widget
|
|
73
|
+
self.help_menu = HelpMenuWidget(
|
|
74
|
+
protocol_keys=self.protocol_keys, id="help-menu"
|
|
75
|
+
)
|
|
76
|
+
yield self.help_menu
|
|
77
|
+
|
|
78
|
+
self.footer_widget = StatusFooterWidget(id="footer-container")
|
|
79
|
+
yield self.footer_widget
|
|
85
80
|
|
|
86
81
|
def action_toggle_connection(self) -> None:
|
|
87
82
|
"""Toggle connection on 'c' key press.
|
|
@@ -122,37 +117,11 @@ class ProtocolMonitorApp(App[None]):
|
|
|
122
117
|
self._update_status,
|
|
123
118
|
)
|
|
124
119
|
|
|
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
120
|
def _update_status(self, state: Any) -> None:
|
|
132
121
|
"""Update status line with connection state.
|
|
133
122
|
|
|
134
123
|
Args:
|
|
135
124
|
state: Current connection state.
|
|
136
125
|
"""
|
|
137
|
-
if self.
|
|
138
|
-
|
|
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)
|
|
126
|
+
if self.footer_widget:
|
|
127
|
+
self.footer_widget.update_status(state)
|
|
@@ -55,85 +55,85 @@ protocol:
|
|
|
55
55
|
- E02L00I08B
|
|
56
56
|
|
|
57
57
|
"d":
|
|
58
|
-
name: "
|
|
58
|
+
name: "Link 1 On"
|
|
59
59
|
telegrams:
|
|
60
60
|
- E02L01I08M
|
|
61
61
|
- E02L01I08B
|
|
62
62
|
|
|
63
63
|
"e":
|
|
64
|
-
name: "
|
|
64
|
+
name: "Link 1 Off"
|
|
65
65
|
telegrams:
|
|
66
66
|
- E02L01I00M
|
|
67
67
|
- E02L01I00B
|
|
68
68
|
|
|
69
69
|
"f":
|
|
70
|
-
name: "
|
|
70
|
+
name: "Link 2 On"
|
|
71
71
|
telegrams:
|
|
72
72
|
- E02L02I08M
|
|
73
73
|
- E02L02I08B
|
|
74
74
|
|
|
75
75
|
"g":
|
|
76
|
-
name: "
|
|
76
|
+
name: "Link 2 Off"
|
|
77
77
|
telegrams:
|
|
78
78
|
- E02L02I00M
|
|
79
79
|
- E02L02I00B
|
|
80
80
|
|
|
81
81
|
"h":
|
|
82
|
-
name: "
|
|
82
|
+
name: "Link 3 On"
|
|
83
83
|
telegrams:
|
|
84
84
|
- E02L03I08M
|
|
85
85
|
- E02L03I08B
|
|
86
86
|
|
|
87
87
|
"i":
|
|
88
|
-
name: "
|
|
88
|
+
name: "Link 3 Off"
|
|
89
89
|
telegrams:
|
|
90
90
|
- E02L03I00M
|
|
91
91
|
- E02L03I00B
|
|
92
92
|
|
|
93
93
|
"j":
|
|
94
|
-
name: "
|
|
94
|
+
name: "Link 4 On"
|
|
95
95
|
telegrams:
|
|
96
96
|
- E02L04I08M
|
|
97
97
|
- E02L04I08B
|
|
98
98
|
|
|
99
99
|
"k":
|
|
100
|
-
name: "
|
|
100
|
+
name: "Link 4 Off"
|
|
101
101
|
telegrams:
|
|
102
102
|
- E02L04I00M
|
|
103
103
|
- E02L04I00B
|
|
104
104
|
|
|
105
105
|
"l":
|
|
106
|
-
name: "
|
|
106
|
+
name: "Link 5 On"
|
|
107
107
|
telegrams:
|
|
108
108
|
- E02L05I08M
|
|
109
109
|
- E02L05I08B
|
|
110
110
|
|
|
111
111
|
"m":
|
|
112
|
-
name: "
|
|
112
|
+
name: "Link 5 Off"
|
|
113
113
|
telegrams:
|
|
114
114
|
- E02L05I00M
|
|
115
115
|
- E02L05I00B
|
|
116
116
|
|
|
117
117
|
"n":
|
|
118
|
-
name: "
|
|
118
|
+
name: "Link 6 On"
|
|
119
119
|
telegrams:
|
|
120
120
|
- E02L06I08M
|
|
121
121
|
- E02L06I08B
|
|
122
122
|
|
|
123
123
|
"o":
|
|
124
|
-
name: "
|
|
124
|
+
name: "Link 6 Off"
|
|
125
125
|
telegrams:
|
|
126
126
|
- E02L06I00M
|
|
127
127
|
- E02L06I00B
|
|
128
128
|
|
|
129
129
|
"p":
|
|
130
|
-
name: "
|
|
130
|
+
name: "Link 7 On"
|
|
131
131
|
telegrams:
|
|
132
132
|
- E02L07I08M
|
|
133
133
|
- E02L07I08B
|
|
134
134
|
|
|
135
135
|
"q":
|
|
136
|
-
name: "
|
|
136
|
+
name: "Link 7 Off"
|
|
137
137
|
telegrams:
|
|
138
138
|
- E02L07I00M
|
|
139
139
|
- E02L07I00B
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"""TUI widgets package."""
|
|
2
|
+
|
|
3
|
+
from xp.term.widgets.help_menu import HelpMenuWidget
|
|
4
|
+
from xp.term.widgets.protocol_log import ProtocolLogWidget
|
|
5
|
+
from xp.term.widgets.status_footer import StatusFooterWidget
|
|
6
|
+
|
|
7
|
+
__all__ = ["HelpMenuWidget", "ProtocolLogWidget", "StatusFooterWidget"]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""Help Menu Widget for displaying keyboard shortcuts and protocol keys."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from textual.app import ComposeResult
|
|
6
|
+
from textual.containers import Vertical
|
|
7
|
+
from textual.widgets import DataTable
|
|
8
|
+
|
|
9
|
+
from xp.models.term import ProtocolKeysConfig
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class HelpMenuWidget(Vertical):
|
|
13
|
+
"""Help menu widget displaying keyboard shortcuts and protocol keys.
|
|
14
|
+
|
|
15
|
+
Displays a table of available keyboard shortcuts mapped to their
|
|
16
|
+
corresponding protocol commands.
|
|
17
|
+
|
|
18
|
+
Attributes:
|
|
19
|
+
protocol_keys: Configuration of protocol keys and their telegrams.
|
|
20
|
+
help_table: DataTable widget for displaying key mappings.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
protocol_keys: ProtocolKeysConfig,
|
|
26
|
+
*args: Any,
|
|
27
|
+
**kwargs: Any,
|
|
28
|
+
) -> None:
|
|
29
|
+
"""Initialize the Help Menu widget.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
protocol_keys: Configuration containing protocol key mappings.
|
|
33
|
+
args: Additional positional arguments for Vertical.
|
|
34
|
+
kwargs: Additional keyword arguments for Vertical.
|
|
35
|
+
"""
|
|
36
|
+
super().__init__(*args, **kwargs)
|
|
37
|
+
self.protocol_keys = protocol_keys
|
|
38
|
+
self.help_table: DataTable = DataTable(id="help-table", show_header=False)
|
|
39
|
+
self.help_table.can_focus = False
|
|
40
|
+
self.border_title = "Help menu"
|
|
41
|
+
self.can_focus = False
|
|
42
|
+
|
|
43
|
+
def compose(self) -> ComposeResult:
|
|
44
|
+
"""Compose the help menu layout.
|
|
45
|
+
|
|
46
|
+
Yields:
|
|
47
|
+
DataTable widget with key mappings.
|
|
48
|
+
"""
|
|
49
|
+
yield self.help_table
|
|
50
|
+
|
|
51
|
+
def on_mount(self) -> None:
|
|
52
|
+
"""Populate help table when widget mounts."""
|
|
53
|
+
self.help_table.add_columns("Key", "Command")
|
|
54
|
+
for key, config in self.protocol_keys.protocol.items():
|
|
55
|
+
self.help_table.add_row(key, config.name)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Status Footer Widget for displaying app footer with connection status."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from textual.app import ComposeResult
|
|
6
|
+
from textual.containers import Horizontal
|
|
7
|
+
from textual.widgets import Footer, Static
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class StatusFooterWidget(Horizontal):
|
|
11
|
+
"""Footer widget with connection status indicator.
|
|
12
|
+
|
|
13
|
+
Combines the Textual Footer with a status indicator dot that shows
|
|
14
|
+
the current connection state.
|
|
15
|
+
|
|
16
|
+
Attributes:
|
|
17
|
+
status_widget: Static widget displaying colored status dot.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
21
|
+
"""Initialize the Status Footer widget.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
args: Additional positional arguments for Horizontal.
|
|
25
|
+
kwargs: Additional keyword arguments for Horizontal.
|
|
26
|
+
"""
|
|
27
|
+
super().__init__(*args, **kwargs)
|
|
28
|
+
self.status_widget: Static = Static("○", id="status-line")
|
|
29
|
+
|
|
30
|
+
def compose(self) -> ComposeResult:
|
|
31
|
+
"""Compose the footer layout.
|
|
32
|
+
|
|
33
|
+
Yields:
|
|
34
|
+
Footer and status indicator widgets.
|
|
35
|
+
"""
|
|
36
|
+
yield Footer()
|
|
37
|
+
yield self.status_widget
|
|
38
|
+
|
|
39
|
+
def update_status(self, state: Any) -> None:
|
|
40
|
+
"""Update status indicator with connection state.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
state: Current connection state (ConnectionState enum).
|
|
44
|
+
"""
|
|
45
|
+
# Map states to colored dots
|
|
46
|
+
dot = {
|
|
47
|
+
"CONNECTED": "[green]●[/green]",
|
|
48
|
+
"CONNECTING": "[yellow]●[/yellow]",
|
|
49
|
+
"DISCONNECTING": "[yellow]●[/yellow]",
|
|
50
|
+
"FAILED": "[red]●[/red]",
|
|
51
|
+
"DISCONNECTED": "○",
|
|
52
|
+
}.get(state.value, "○")
|
|
53
|
+
self.status_widget.update(dot)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"""TUI widgets package."""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py
RENAMED
|
File without changes
|
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.21.0 → conson_xp-1.22.0}/src/xp/cli/commands/telegram/telegram_version_commands.py
RENAMED
|
File without changes
|
|
File without changes
|