conson-xp 1.38.0__tar.gz → 1.39.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.38.0 → conson_xp-1.39.0}/PKG-INFO +1 -1
- {conson_xp-1.38.0 → conson_xp-1.39.0}/pyproject.toml +1 -1
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/__init__.py +1 -1
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/actiontable/msactiontable_xp24.py +29 -34
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_xp24_action_table_short_format.py +27 -13
- conson_xp-1.38.0/src/xp/connection/__init__.py +0 -13
- conson_xp-1.38.0/src/xp/connection/exceptions.py +0 -22
- conson_xp-1.38.0/tests/unit/test_connection/__init__.py +0 -1
- conson_xp-1.38.0/tests/unit/test_connection/test_connection_init.py +0 -33
- conson_xp-1.38.0/tests/unit/test_connection/test_exceptions.py +0 -88
- {conson_xp-1.38.0 → conson_xp-1.39.0}/LICENSE +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/README.md +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/__main__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_event_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_export_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/file_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/homekit/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/homekit/homekit.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/module_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/server/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/server/server_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/term/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/term/term.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/term/term_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/main.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/click_tree.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/decorators.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/error_handlers.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/formatters.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/module_type_choice.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/serial_number_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/system_function_choice.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/utils/xp_module_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/actiontable/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/actiontable/actiontable.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/actiontable/msactiontable.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_autoreport.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_blink.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_client_config.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_connection_status.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_custom.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_datapoint.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_discover.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_event_list.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_event_raw.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_export.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_linknumber.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_logger_config.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_output.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_raw.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_receive.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/config/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/config/conson_module_config.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/homekit/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/homekit/homekit_accessory.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/homekit/homekit_config.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/log_entry.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/protocol/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/protocol/conbus_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/response.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/action_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/datapoint_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/event_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/event_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/input_action_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/input_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/module_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/module_type_code.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/output_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/reply_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/system_function.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/system_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/telegram_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/telegram/timeparam_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/term/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/term/connection_state.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/term/module_state.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/term/protocol_keys_config.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/term/status_message.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/term/telegram_display.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/models/write_config_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/actiontable/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/actiontable/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/actiontable/actiontable_download_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_blink_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_custom_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_discover_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_event_list_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_export_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_output_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_raw_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_receive_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/conbus_scan_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/msactiontable/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/msactiontable/msactiontable_download_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/msactiontable/msactiontable_list_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/msactiontable/msactiontable_show_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/conbus/write_config_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_cache_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_config_validator.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_hap_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_module_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_outlet.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/homekit/homekit_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/log_file_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/module_type_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/protocol/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/protocol/conbus_event_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/protocol/conbus_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/protocol/protocol_factory.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/protocol/telegram_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/reverse_proxy_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/base_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/client_buffer_manager.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/cp20_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/device_service_factory.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/xp130_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/xp20_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/xp230_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/xp24_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/server/xp33_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_blink_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_discover_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_output_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/telegram/telegram_version_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/term/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/term/protocol_monitor_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/services/term/state_monitor_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/protocol.tcss +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/state.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/state.tcss +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/widgets/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/widgets/help_menu.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/widgets/modules_list.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/widgets/protocol_log.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/term/widgets/status_footer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/checksum.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/dependencies.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/event_helper.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/logging.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/serialization.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/state_machine.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/utils/time_utils.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/.coverage +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/conftest.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/.coverage +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/telegram_test_data.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_actiontable_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_api/.coverage +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_api/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_blink_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_checksum_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_conbus_blink_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_conbus_datapoint_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_conbus_raw_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_conbus_receive_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_discovery_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_event_telegram_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_homekit_config_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_link_number_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_module_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_output_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_reverse_proxy_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_system_reply_telegram_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_term_logging_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_version_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_xp20_action_table_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/integration/test_xp24_action_table_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_api/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_click_tree.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_conbus_actiontable_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_decorators.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_error_handlers.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_formatters.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_serial_number_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_system_function_choice.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_cli/test_term_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_encoding/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_conbus.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_conbus_client_send.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_conbus_discover.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_event_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_log_entry.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_logger_config.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_module_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_reply_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_system_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_version_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_write_config_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_xp20_action_table.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_xp24_action_table.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_actiontable_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_actiontable_upload_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_base_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_blink_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_checksum_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_client_buffer_manager.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_event_list_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_event_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_output_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_conbus_scan_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_device_service_factory.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_discovery_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_homekit_services.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_log_file_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_module_type_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_protocol_monitor_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_state_monitor_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_telegram_input_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_telegram_output_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_telegram_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_telegram_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_version_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_xp20_action_table_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_xp24_action_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_xp24_action_table_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_xp33_action_table_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_services/test_xp_server_services.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_tui/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_tui/test_protocol_log.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_utils/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_utils/test_checksum.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_utils/test_event_helper.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_utils/test_logging.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_utils/test_serialization.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_utils/test_time_utils.py +0 -0
|
@@ -159,14 +159,11 @@ class Xp24MsActionTable(MsActionTable):
|
|
|
159
159
|
curtain34: bool = False # Curtain setting for inputs 3-4
|
|
160
160
|
mutual_deadtime: int = MS300 # Master timing (MS300=12 or MS500=20)
|
|
161
161
|
|
|
162
|
-
def to_short_format(self
|
|
162
|
+
def to_short_format(self) -> str:
|
|
163
163
|
"""Convert action table to short format string.
|
|
164
164
|
|
|
165
|
-
Args:
|
|
166
|
-
include_settings: Include settings after pipe separator.
|
|
167
|
-
|
|
168
165
|
Returns:
|
|
169
|
-
Short format string (e.g., "XP24 T:1 T:2 T:0 T:0").
|
|
166
|
+
Short format string with settings (e.g., "XP24 T:1 T:2 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12").
|
|
170
167
|
"""
|
|
171
168
|
# Format input actions
|
|
172
169
|
actions = [
|
|
@@ -184,16 +181,15 @@ class Xp24MsActionTable(MsActionTable):
|
|
|
184
181
|
|
|
185
182
|
result = f"XP24 {' '.join(action_parts)}"
|
|
186
183
|
|
|
187
|
-
# Add settings
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
result = f"{result} | {settings}"
|
|
184
|
+
# Add settings
|
|
185
|
+
settings = (
|
|
186
|
+
f"M12:{1 if self.mutex12 else 0} "
|
|
187
|
+
f"M34:{1 if self.mutex34 else 0} "
|
|
188
|
+
f"C12:{1 if self.curtain12 else 0} "
|
|
189
|
+
f"C34:{1 if self.curtain34 else 0} "
|
|
190
|
+
f"DT:{self.mutual_deadtime}"
|
|
191
|
+
)
|
|
192
|
+
result = f"{result} | {settings}"
|
|
197
193
|
|
|
198
194
|
return result
|
|
199
195
|
|
|
@@ -213,7 +209,7 @@ class Xp24MsActionTable(MsActionTable):
|
|
|
213
209
|
# Split by pipe to separate actions from settings
|
|
214
210
|
parts = short_str.split("|")
|
|
215
211
|
action_part = parts[0].strip()
|
|
216
|
-
settings_part = parts[1].strip()
|
|
212
|
+
settings_part = parts[1].strip()
|
|
217
213
|
|
|
218
214
|
# Parse action part
|
|
219
215
|
tokens = action_part.split()
|
|
@@ -253,23 +249,22 @@ class Xp24MsActionTable(MsActionTable):
|
|
|
253
249
|
"input4_action": input_actions[3],
|
|
254
250
|
}
|
|
255
251
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
kwargs["mutual_deadtime"] = int(value)
|
|
252
|
+
# Parse settings: M12:0 M34:1 C12:0 C34:1 DT:12
|
|
253
|
+
for setting in settings_part.split():
|
|
254
|
+
if ":" not in setting:
|
|
255
|
+
continue
|
|
256
|
+
|
|
257
|
+
key, value = setting.split(":", 1)
|
|
258
|
+
|
|
259
|
+
if key == "M12":
|
|
260
|
+
kwargs["mutex12"] = value == "1"
|
|
261
|
+
elif key == "M34":
|
|
262
|
+
kwargs["mutex34"] = value == "1"
|
|
263
|
+
elif key == "C12":
|
|
264
|
+
kwargs["curtain12"] = value == "1"
|
|
265
|
+
elif key == "C34":
|
|
266
|
+
kwargs["curtain34"] = value == "1"
|
|
267
|
+
elif key == "DT":
|
|
268
|
+
kwargs["mutual_deadtime"] = int(value)
|
|
274
269
|
|
|
275
270
|
return cls(**kwargs)
|
{conson_xp-1.38.0 → conson_xp-1.39.0}/tests/unit/test_models/test_xp24_action_table_short_format.py
RENAMED
|
@@ -27,7 +27,10 @@ class TestXp24ShortFormat:
|
|
|
27
27
|
),
|
|
28
28
|
)
|
|
29
29
|
|
|
30
|
-
assert
|
|
30
|
+
assert (
|
|
31
|
+
action_table.to_short_format()
|
|
32
|
+
== "XP24 T:1 T:2 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
|
|
33
|
+
)
|
|
31
34
|
|
|
32
35
|
def test_to_short_format_with_settings(self):
|
|
33
36
|
"""Test conversion to short format with settings."""
|
|
@@ -49,7 +52,7 @@ class TestXp24ShortFormat:
|
|
|
49
52
|
curtain12=False,
|
|
50
53
|
curtain34=False,
|
|
51
54
|
mutual_deadtime=20,
|
|
52
|
-
).to_short_format(
|
|
55
|
+
).to_short_format()
|
|
53
56
|
assert short == "XP24 T:0 T:0 T:0 T:0 | M12:1 M34:1 C12:0 C34:0 DT:20"
|
|
54
57
|
|
|
55
58
|
def test_to_short_format_mixed_actions(self):
|
|
@@ -64,7 +67,7 @@ class TestXp24ShortFormat:
|
|
|
64
67
|
type=InputActionType.SCENESET, param=TimeParam.T2MIN
|
|
65
68
|
),
|
|
66
69
|
).to_short_format()
|
|
67
|
-
assert short == "XP24 ON:4 OF:0 LS:12 SS:11"
|
|
70
|
+
assert short == "XP24 ON:4 OF:0 LS:12 SS:11 | M12:0 M34:0 C12:0 C34:0 DT:12"
|
|
68
71
|
|
|
69
72
|
def test_to_short_format_all_void(self):
|
|
70
73
|
"""Test conversion with all VOID actions."""
|
|
@@ -74,11 +77,11 @@ class TestXp24ShortFormat:
|
|
|
74
77
|
input3_action=InputAction(type=InputActionType.VOID, param=TimeParam.NONE),
|
|
75
78
|
input4_action=InputAction(type=InputActionType.VOID, param=TimeParam.NONE),
|
|
76
79
|
).to_short_format()
|
|
77
|
-
assert short == "XP24 V:0 V:0 V:0 V:0"
|
|
80
|
+
assert short == "XP24 V:0 V:0 V:0 V:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
|
|
78
81
|
|
|
79
82
|
def test_from_short_format_basic(self):
|
|
80
83
|
"""Test parsing basic short format."""
|
|
81
|
-
short = "XP24 T:1 T:2 T:0 T:0"
|
|
84
|
+
short = "XP24 T:1 T:2 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
|
|
82
85
|
action_table = Xp24MsActionTable.from_short_format(short)
|
|
83
86
|
|
|
84
87
|
assert action_table.input1_action.type == InputActionType.TOGGLE
|
|
@@ -103,7 +106,7 @@ class TestXp24ShortFormat:
|
|
|
103
106
|
|
|
104
107
|
def test_from_short_format_mixed_actions(self):
|
|
105
108
|
"""Test parsing mixed action types."""
|
|
106
|
-
short = "XP24 ON:4 OF:0 LS:12 SS:11"
|
|
109
|
+
short = "XP24 ON:4 OF:0 LS:12 SS:11 | M12:0 M34:0 C12:0 C34:0 DT:12"
|
|
107
110
|
action_table = Xp24MsActionTable.from_short_format(short)
|
|
108
111
|
|
|
109
112
|
assert action_table.input1_action.type == InputActionType.ON
|
|
@@ -135,7 +138,7 @@ class TestXp24ShortFormat:
|
|
|
135
138
|
mutual_deadtime=20,
|
|
136
139
|
)
|
|
137
140
|
|
|
138
|
-
short = original.to_short_format(
|
|
141
|
+
short = original.to_short_format()
|
|
139
142
|
restored = Xp24MsActionTable.from_short_format(short)
|
|
140
143
|
|
|
141
144
|
assert restored == original
|
|
@@ -143,22 +146,30 @@ class TestXp24ShortFormat:
|
|
|
143
146
|
def test_from_short_format_invalid_format(self):
|
|
144
147
|
"""Test that invalid format raises ValueError."""
|
|
145
148
|
with pytest.raises(ValueError, match="Invalid short format"):
|
|
146
|
-
Xp24MsActionTable.from_short_format(
|
|
149
|
+
Xp24MsActionTable.from_short_format(
|
|
150
|
+
"INVALID | M12:0 M34:0 C12:0 C34:0 DT:12"
|
|
151
|
+
)
|
|
147
152
|
|
|
148
153
|
def test_from_short_format_invalid_action_code(self):
|
|
149
154
|
"""Test that invalid action code raises ValueError."""
|
|
150
155
|
with pytest.raises(ValueError, match="Unknown action code"):
|
|
151
|
-
Xp24MsActionTable.from_short_format(
|
|
156
|
+
Xp24MsActionTable.from_short_format(
|
|
157
|
+
"XP24 XX:0 T:0 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
|
|
158
|
+
)
|
|
152
159
|
|
|
153
160
|
def test_from_short_format_invalid_param(self):
|
|
154
161
|
"""Test that invalid param raises ValueError."""
|
|
155
162
|
with pytest.raises(ValueError, match="Invalid time param"):
|
|
156
|
-
Xp24MsActionTable.from_short_format(
|
|
163
|
+
Xp24MsActionTable.from_short_format(
|
|
164
|
+
"XP24 T:999 T:0 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
|
|
165
|
+
)
|
|
157
166
|
|
|
158
167
|
def test_from_short_format_missing_colon(self):
|
|
159
168
|
"""Test that missing colon raises ValueError."""
|
|
160
169
|
with pytest.raises(ValueError, match="Invalid action format"):
|
|
161
|
-
Xp24MsActionTable.from_short_format(
|
|
170
|
+
Xp24MsActionTable.from_short_format(
|
|
171
|
+
"XP24 T1 T:0 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
|
|
172
|
+
)
|
|
162
173
|
|
|
163
174
|
def test_all_action_types(self):
|
|
164
175
|
"""Test that all action types can be converted."""
|
|
@@ -199,7 +210,7 @@ class TestXp24ShortFormat:
|
|
|
199
210
|
input1_action=InputAction(type=action_type, param=TimeParam.NONE),
|
|
200
211
|
)
|
|
201
212
|
short = action_table.to_short_format()
|
|
202
|
-
assert short.startswith(f"XP24 {expected_code}:0")
|
|
213
|
+
assert short.startswith(f"XP24 {expected_code}:0 ")
|
|
203
214
|
|
|
204
215
|
# Test round-trip
|
|
205
216
|
restored = Xp24MsActionTable.from_short_format(short)
|
|
@@ -237,7 +248,10 @@ class TestXp24ShortFormat:
|
|
|
237
248
|
),
|
|
238
249
|
)
|
|
239
250
|
short = action_table.to_short_format()
|
|
240
|
-
assert
|
|
251
|
+
assert (
|
|
252
|
+
short
|
|
253
|
+
== f"XP24 T:{time_param.value} T:0 T:0 T:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
|
|
254
|
+
)
|
|
241
255
|
|
|
242
256
|
# Test round-trip
|
|
243
257
|
restored = Xp24MsActionTable.from_short_format(short)
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"""Connection-related exceptions for XP CLI tool.
|
|
2
|
-
|
|
3
|
-
Following the architecture requirement for structured error handling.
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class XPError(Exception):
|
|
8
|
-
"""Base exception for XP CLI tool."""
|
|
9
|
-
|
|
10
|
-
pass
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class ProtocolError(XPError):
|
|
14
|
-
"""Console bus protocol errors."""
|
|
15
|
-
|
|
16
|
-
pass
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class ValidationError(XPError):
|
|
20
|
-
"""Input validation errors."""
|
|
21
|
-
|
|
22
|
-
pass
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"""Unit tests for connection handling."""
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
"""Tests for connection module initialization."""
|
|
2
|
-
|
|
3
|
-
import xp.connection as connection_module
|
|
4
|
-
from xp.connection import ProtocolError, ValidationError, XPError
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class TestConnectionInit:
|
|
8
|
-
"""Test connection module initialization."""
|
|
9
|
-
|
|
10
|
-
def test_xp_error_imported(self):
|
|
11
|
-
"""Test XPError is importable from connection module."""
|
|
12
|
-
assert hasattr(connection_module, "XPError")
|
|
13
|
-
assert connection_module.XPError is XPError
|
|
14
|
-
|
|
15
|
-
def test_protocol_error_imported(self):
|
|
16
|
-
"""Test ProtocolError is importable from connection module."""
|
|
17
|
-
assert hasattr(connection_module, "ProtocolError")
|
|
18
|
-
assert connection_module.ProtocolError is ProtocolError
|
|
19
|
-
|
|
20
|
-
def test_validation_error_imported(self):
|
|
21
|
-
"""Test ValidationError is importable from connection module."""
|
|
22
|
-
assert hasattr(connection_module, "ValidationError")
|
|
23
|
-
assert connection_module.ValidationError is ValidationError
|
|
24
|
-
|
|
25
|
-
def test_all_exports(self):
|
|
26
|
-
"""Test __all__ contains expected exports."""
|
|
27
|
-
expected = ["XPError", "ProtocolError", "ValidationError"]
|
|
28
|
-
assert connection_module.__all__ == expected
|
|
29
|
-
|
|
30
|
-
def test_all_members_accessible(self):
|
|
31
|
-
"""Test all members in __all__ are accessible."""
|
|
32
|
-
for member in connection_module.__all__:
|
|
33
|
-
assert hasattr(connection_module, member)
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
"""Tests for connection exceptions."""
|
|
2
|
-
|
|
3
|
-
import pytest
|
|
4
|
-
|
|
5
|
-
from xp.connection.exceptions import ProtocolError, ValidationError, XPError
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class TestXPError:
|
|
9
|
-
"""Test XPError base exception."""
|
|
10
|
-
|
|
11
|
-
def test_xp_error_is_exception(self):
|
|
12
|
-
"""Test XPError inherits from Exception."""
|
|
13
|
-
assert issubclass(XPError, Exception)
|
|
14
|
-
|
|
15
|
-
def test_xp_error_can_be_raised(self):
|
|
16
|
-
"""Test XPError can be raised."""
|
|
17
|
-
with pytest.raises(XPError):
|
|
18
|
-
raise XPError("Test error")
|
|
19
|
-
|
|
20
|
-
def test_xp_error_with_message(self):
|
|
21
|
-
"""Test XPError with custom message."""
|
|
22
|
-
msg = "Custom error message"
|
|
23
|
-
with pytest.raises(XPError) as exc_info:
|
|
24
|
-
raise XPError(msg)
|
|
25
|
-
assert str(exc_info.value) == msg
|
|
26
|
-
|
|
27
|
-
def test_xp_error_without_message(self):
|
|
28
|
-
"""Test XPError without message."""
|
|
29
|
-
with pytest.raises(XPError):
|
|
30
|
-
raise XPError()
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class TestProtocolError:
|
|
34
|
-
"""Test ProtocolError exception."""
|
|
35
|
-
|
|
36
|
-
def test_protocol_error_inherits_from_xp_error(self):
|
|
37
|
-
"""Test ProtocolError inherits from XPError."""
|
|
38
|
-
assert issubclass(ProtocolError, XPError)
|
|
39
|
-
|
|
40
|
-
def test_protocol_error_is_exception(self):
|
|
41
|
-
"""Test ProtocolError is also an Exception."""
|
|
42
|
-
assert issubclass(ProtocolError, Exception)
|
|
43
|
-
|
|
44
|
-
def test_protocol_error_can_be_raised(self):
|
|
45
|
-
"""Test ProtocolError can be raised."""
|
|
46
|
-
with pytest.raises(ProtocolError):
|
|
47
|
-
raise ProtocolError("Protocol error")
|
|
48
|
-
|
|
49
|
-
def test_protocol_error_with_message(self):
|
|
50
|
-
"""Test ProtocolError with custom message."""
|
|
51
|
-
msg = "Invalid protocol format"
|
|
52
|
-
with pytest.raises(ProtocolError) as exc_info:
|
|
53
|
-
raise ProtocolError(msg)
|
|
54
|
-
assert str(exc_info.value) == msg
|
|
55
|
-
|
|
56
|
-
def test_protocol_error_caught_as_xp_error(self):
|
|
57
|
-
"""Test ProtocolError can be caught as XPError."""
|
|
58
|
-
with pytest.raises(XPError):
|
|
59
|
-
raise ProtocolError("Protocol error")
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
class TestValidationError:
|
|
63
|
-
"""Test ValidationError exception."""
|
|
64
|
-
|
|
65
|
-
def test_validation_error_inherits_from_xp_error(self):
|
|
66
|
-
"""Test ValidationError inherits from XPError."""
|
|
67
|
-
assert issubclass(ValidationError, XPError)
|
|
68
|
-
|
|
69
|
-
def test_validation_error_is_exception(self):
|
|
70
|
-
"""Test ValidationError is also an Exception."""
|
|
71
|
-
assert issubclass(ValidationError, Exception)
|
|
72
|
-
|
|
73
|
-
def test_validation_error_can_be_raised(self):
|
|
74
|
-
"""Test ValidationError can be raised."""
|
|
75
|
-
with pytest.raises(ValidationError):
|
|
76
|
-
raise ValidationError("Validation failed")
|
|
77
|
-
|
|
78
|
-
def test_validation_error_with_message(self):
|
|
79
|
-
"""Test ValidationError with custom message."""
|
|
80
|
-
msg = "Invalid input data"
|
|
81
|
-
with pytest.raises(ValidationError) as exc_info:
|
|
82
|
-
raise ValidationError(msg)
|
|
83
|
-
assert str(exc_info.value) == msg
|
|
84
|
-
|
|
85
|
-
def test_validation_error_caught_as_xp_error(self):
|
|
86
|
-
"""Test ValidationError can be caught as XPError."""
|
|
87
|
-
with pytest.raises(XPError):
|
|
88
|
-
raise ValidationError("Validation error")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.38.0 → conson_xp-1.39.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.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.38.0 → conson_xp-1.39.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.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py
RENAMED
|
File without changes
|
{conson_xp-1.38.0 → conson_xp-1.39.0}/src/xp/cli/commands/telegram/telegram_version_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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|