conson-xp 1.47.0__tar.gz → 1.49.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.47.0 → conson_xp-1.49.0}/PKG-INFO +1 -1
- {conson_xp-1.47.0 → conson_xp-1.49.0}/pyproject.toml +1 -1
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/__init__.py +1 -1
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +0 -4
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/protocol/conbus_protocol.py +1 -2
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +4 -9
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +5 -11
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +5 -11
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/actiontable_download_service.py +6 -3
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_discover_service.py +2 -2
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/msactiontable/msactiontable_upload_service.py +2 -2
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/protocol/__init__.py +2 -3
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/protocol/conbus_event_protocol.py +6 -3
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_actiontable_integration.py +1 -2
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_xp20_action_table_integration.py +2 -2
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_conbus_actiontable_commands.py +3 -8
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_msactiontable_upload_service.py +0 -32
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp20_action_table_serializer.py +9 -10
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp24_action_table_serializer.py +3 -3
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp33_action_table_serializer.py +1 -1
- conson_xp-1.47.0/src/xp/services/protocol/conbus_protocol.py +0 -335
- {conson_xp-1.47.0 → conson_xp-1.49.0}/LICENSE +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/README.md +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/__main__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_event_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_export_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/file_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/homekit/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/homekit/homekit.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/module_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/server/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/server/server_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/term/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/term/term.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/term/term_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/main.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/click_tree.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/decorators.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/error_handlers.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/formatters.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/module_type_choice.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/serial_number_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/system_function_choice.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/utils/xp_module_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/actiontable/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/actiontable/actiontable.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/actiontable/actiontable_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/actiontable/msactiontable_xp24.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_autoreport.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_blink.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_client_config.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_connection_status.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_custom.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_datapoint.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_discover.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_event_list.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_event_raw.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_export.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_linknumber.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_logger_config.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_output.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_raw.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_receive.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/config/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/config/conson_module_config.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/homekit/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/homekit/homekit_accessory.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/homekit/homekit_config.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/log_entry.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/protocol/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/response.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/action_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/datapoint_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/event_telegram.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/event_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/input_action_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/input_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/module_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/module_type_code.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/output_telegram.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/reply_telegram.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/system_function.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/system_telegram.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/telegram.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/telegram_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/telegram/timeparam_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/term/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/term/connection_state.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/term/module_state.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/term/protocol_keys_config.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/term/status_message.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/term/telegram_display.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/models/write_config_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/download_state_machine.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/serializer_protocol.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_blink_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_custom_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_event_list_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_export_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_output_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_raw_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_receive_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_scan_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/msactiontable/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/conbus/write_config_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_cache_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_config_validator.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_hap_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_module_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_outlet.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/log_file_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/module_type_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/protocol/protocol_factory.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/protocol/telegram_protocol.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/reverse_proxy_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/base_server_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/client_buffer_manager.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/cp20_server_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/device_service_factory.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/server_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/xp130_server_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/xp20_server_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/xp230_server_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/xp24_server_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/server/xp33_server_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_blink_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_discover_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_output_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_version_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/term/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/term/protocol_monitor_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/term/state_monitor_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/protocol.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/protocol.tcss +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/state.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/state.tcss +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/widgets/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/widgets/help_menu.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/widgets/modules_list.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/widgets/protocol_log.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/term/widgets/status_footer.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/checksum.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/dependencies.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/event_helper.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/logging.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/serialization.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/state_machine.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/utils/time_utils.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/.coverage +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/conftest.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/.coverage +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/telegram_test_data.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_api/.coverage +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_api/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_blink_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_checksum_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_conbus_blink_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_conbus_datapoint_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_conbus_raw_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_conbus_receive_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_discovery_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_event_telegram_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_homekit_config_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_link_number_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_module_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_output_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_reverse_proxy_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_system_reply_telegram_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_term_logging_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_version_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_xp24_action_table_integration.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_api/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_click_tree.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_conbus_msactiontable_upload_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_decorators.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_error_handlers.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_formatters.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_serial_number_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_system_function_choice.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_term_commands.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_encoding/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_conbus.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_conbus_client_send.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_conbus_discover.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_event_telegram.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_log_entry.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_logger_config.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_module_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_reply_telegram.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_system_telegram.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_version_telegram.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_write_config_type.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_xp20_action_table.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_xp24_action_table.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_xp24_action_table_short_format.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_actiontable_download_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_actiontable_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_actiontable_upload_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_base_server_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_blink_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_checksum_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_client_buffer_manager.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_event_list_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_event_protocol.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_output_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_scan_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_device_service_factory.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_discovery_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_homekit_services.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_log_file_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_module_type_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_protocol.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_protocol_monitor_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_server_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_state_monitor_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_telegram_input_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_telegram_output_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_telegram_protocol.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_telegram_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_version_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp24_action_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp33_short_format.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp_server_services.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_tui/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_tui/test_protocol_log.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_utils/__init__.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_checksum.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_event_helper.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_logging.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_serialization.py +0 -0
- {conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_time_utils.py +0 -0
{conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py
RENAMED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
import json
|
|
4
4
|
from contextlib import suppress
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import Any, Dict
|
|
7
6
|
|
|
8
7
|
import click
|
|
9
8
|
from click import Context
|
|
@@ -66,7 +65,6 @@ def conbus_download_actiontable(ctx: Context, serial_number: str) -> None:
|
|
|
66
65
|
|
|
67
66
|
def on_actiontable_received(
|
|
68
67
|
_actiontable: ActionTable,
|
|
69
|
-
actiontable_dict: Dict[str, Any],
|
|
70
68
|
actiontable_short: list[str],
|
|
71
69
|
) -> None:
|
|
72
70
|
"""
|
|
@@ -74,13 +72,11 @@ def conbus_download_actiontable(ctx: Context, serial_number: str) -> None:
|
|
|
74
72
|
|
|
75
73
|
Args:
|
|
76
74
|
_actiontable: a list of ActionTableEntries.
|
|
77
|
-
actiontable_dict: action table in a dictionary.
|
|
78
75
|
actiontable_short: short representation of action table.
|
|
79
76
|
"""
|
|
80
77
|
output = {
|
|
81
78
|
"serial_number": serial_number,
|
|
82
79
|
"actiontable_short": actiontable_short,
|
|
83
|
-
"actiontable": actiontable_dict,
|
|
84
80
|
}
|
|
85
81
|
click.echo(json.dumps(output, indent=2, default=str))
|
|
86
82
|
|
|
@@ -13,7 +13,6 @@ from xp.models.telegram.datapoint_type import DataPointType
|
|
|
13
13
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
15
15
|
from xp.services.protocol.conbus_event_protocol import ConbusEventProtocol
|
|
16
|
-
from xp.services.protocol.conbus_protocol import ConbusProtocol
|
|
17
16
|
from xp.services.protocol.telegram_protocol import TelegramProtocol
|
|
18
17
|
|
|
19
18
|
|
|
@@ -266,7 +265,7 @@ class TelegramEvent(BaseEvent):
|
|
|
266
265
|
checksum_valid: Checksum valid true or false.
|
|
267
266
|
"""
|
|
268
267
|
|
|
269
|
-
protocol: Union[TelegramProtocol,
|
|
268
|
+
protocol: Union[TelegramProtocol, ConbusEventProtocol] = Field(
|
|
270
269
|
description="TelegramProtocol instance"
|
|
271
270
|
)
|
|
272
271
|
frame: str = Field(description="Frame <S0123450001F02D12FK>")
|
{conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_xp20_serializer.py
RENAMED
|
@@ -42,17 +42,12 @@ class Xp20MsActionTableSerializer(ActionTableSerializerProtocol):
|
|
|
42
42
|
ValueError: If input length is not 64 characters
|
|
43
43
|
"""
|
|
44
44
|
raw_length = len(encoded_data)
|
|
45
|
-
if raw_length <
|
|
45
|
+
if raw_length < 64: # Minimum: 4 char prefix + 64 chars data
|
|
46
46
|
raise ValueError(
|
|
47
|
-
f"XP20 action table data must be
|
|
47
|
+
f"XP20 action table data must be 64 characters long, got {len(encoded_data)}"
|
|
48
48
|
)
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
data = encoded_data[4:]
|
|
52
|
-
|
|
53
|
-
# Take first 64 chars (32 bytes) as per pseudocode
|
|
54
|
-
hex_data = data[:64]
|
|
55
|
-
raw_bytes = de_nibbles(hex_data)
|
|
50
|
+
raw_bytes = de_nibbles(encoded_data)
|
|
56
51
|
|
|
57
52
|
# Decode input channels
|
|
58
53
|
input_channels = []
|
|
@@ -108,7 +103,7 @@ class Xp20MsActionTableSerializer(ActionTableSerializerProtocol):
|
|
|
108
103
|
|
|
109
104
|
encoded_data = nibbles(raw_bytes)
|
|
110
105
|
# Convert raw bytes to hex string with A-P encoding
|
|
111
|
-
return
|
|
106
|
+
return encoded_data
|
|
112
107
|
|
|
113
108
|
@staticmethod
|
|
114
109
|
def to_short_string(action_table: Xp20MsActionTable) -> list[str]:
|
{conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_xp24_serializer.py
RENAMED
|
@@ -36,19 +36,13 @@ class Xp24MsActionTableSerializer(ActionTableSerializerProtocol):
|
|
|
36
36
|
ValueError: If data length is not 68 bytes.
|
|
37
37
|
"""
|
|
38
38
|
raw_length = len(encoded_data)
|
|
39
|
-
if raw_length !=
|
|
39
|
+
if raw_length != 64:
|
|
40
40
|
raise ValueError(
|
|
41
|
-
f"Msactiontable is not
|
|
41
|
+
f"Msactiontable is not 64 bytes long ({raw_length}): {encoded_data}"
|
|
42
42
|
)
|
|
43
43
|
|
|
44
|
-
# Remove action table count AAAA, AAAB .
|
|
45
|
-
stripped_data = encoded_data[4:]
|
|
46
|
-
|
|
47
|
-
# Take first 64 chars (32 bytes) as per pseudocode
|
|
48
|
-
hex_data = stripped_data[:64]
|
|
49
|
-
|
|
50
44
|
# Convert hex string to bytes using deNibble (A-P encoding)
|
|
51
|
-
data = de_nibbles(
|
|
45
|
+
data = de_nibbles(encoded_data)
|
|
52
46
|
|
|
53
47
|
# Decode input actions from positions 0-3 (2 bytes each)
|
|
54
48
|
input_actions = []
|
|
@@ -78,7 +72,7 @@ class Xp24MsActionTableSerializer(ActionTableSerializerProtocol):
|
|
|
78
72
|
action_table: XP24 MS action table to serialize.
|
|
79
73
|
|
|
80
74
|
Returns:
|
|
81
|
-
Serialized action table data string (
|
|
75
|
+
Serialized action table data string (64 characters).
|
|
82
76
|
"""
|
|
83
77
|
# Build byte array for the action table (32 bytes total)
|
|
84
78
|
raw_bytes = bytearray()
|
|
@@ -107,7 +101,7 @@ class Xp24MsActionTableSerializer(ActionTableSerializerProtocol):
|
|
|
107
101
|
|
|
108
102
|
# Build byte array for the action table (32 bytes total)
|
|
109
103
|
# Prepend action table count "AAAA" (4 chars) -> total 68 chars
|
|
110
|
-
return
|
|
104
|
+
return nibbles(raw_bytes)
|
|
111
105
|
|
|
112
106
|
@staticmethod
|
|
113
107
|
def to_short_string(action_table: Xp24MsActionTable) -> list[str]:
|
{conson_xp-1.47.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_xp33_serializer.py
RENAMED
|
@@ -139,7 +139,7 @@ class Xp33MsActionTableSerializer(ActionTableSerializerProtocol):
|
|
|
139
139
|
encoded_data = nibbles(raw_bytes)
|
|
140
140
|
|
|
141
141
|
# Convert raw bytes to hex string with A-P encoding
|
|
142
|
-
return
|
|
142
|
+
return encoded_data
|
|
143
143
|
|
|
144
144
|
@staticmethod
|
|
145
145
|
def from_encoded_string(msactiontable_rawdata: str) -> Xp33MsActionTable:
|
|
@@ -153,22 +153,16 @@ class Xp33MsActionTableSerializer(ActionTableSerializerProtocol):
|
|
|
153
153
|
Deserialized XP33 MS action table.
|
|
154
154
|
|
|
155
155
|
Raises:
|
|
156
|
-
ValueError: If data length is less than
|
|
156
|
+
ValueError: If data length is less than 64 characters.
|
|
157
157
|
"""
|
|
158
158
|
raw_length = len(msactiontable_rawdata)
|
|
159
|
-
if raw_length <
|
|
159
|
+
if raw_length < 64: # Minimum: 4 char prefix + 64 chars data
|
|
160
160
|
raise ValueError(
|
|
161
|
-
f"Msactiontable is too short ({raw_length}), minimum
|
|
161
|
+
f"Msactiontable is too short ({raw_length}), minimum 64 characters required"
|
|
162
162
|
)
|
|
163
163
|
|
|
164
|
-
# Remove action table count prefix (first 4 characters: AAAA, AAAB, etc.)
|
|
165
|
-
data = msactiontable_rawdata[4:]
|
|
166
|
-
|
|
167
|
-
# Take first 64 chars (32 bytes) as per pseudocode
|
|
168
|
-
hex_data = data[:64]
|
|
169
|
-
|
|
170
164
|
# Convert hex string to bytes using deNibble (A-P encoding)
|
|
171
|
-
raw_bytes = de_nibbles(
|
|
165
|
+
raw_bytes = de_nibbles(msactiontable_rawdata)
|
|
172
166
|
|
|
173
167
|
# Decode outputs
|
|
174
168
|
output1 = Xp33MsActionTableSerializer._decode_output(raw_bytes, 0)
|
|
@@ -51,7 +51,7 @@ class ActionTableDownloadService(DownloadStateMachine):
|
|
|
51
51
|
Attributes:
|
|
52
52
|
on_progress: Signal emitted with "." for each chunk received.
|
|
53
53
|
on_error: Signal emitted with error message string.
|
|
54
|
-
on_actiontable_received: Signal emitted with (ActionTable,
|
|
54
|
+
on_actiontable_received: Signal emitted with (ActionTable, list).
|
|
55
55
|
on_finish: Signal emitted when download and cleanup completed.
|
|
56
56
|
|
|
57
57
|
Example:
|
|
@@ -65,7 +65,7 @@ class ActionTableDownloadService(DownloadStateMachine):
|
|
|
65
65
|
on_progress: Signal = Signal(str)
|
|
66
66
|
on_error: Signal = Signal(str)
|
|
67
67
|
on_finish: Signal = Signal()
|
|
68
|
-
on_actiontable_received: Signal = Signal(Any,
|
|
68
|
+
on_actiontable_received: Signal = Signal(Any, list[str])
|
|
69
69
|
|
|
70
70
|
def __init__(
|
|
71
71
|
self,
|
|
@@ -126,7 +126,10 @@ class ActionTableDownloadService(DownloadStateMachine):
|
|
|
126
126
|
def on_enter_requesting(self) -> None:
|
|
127
127
|
"""Enter requesting state - send download request."""
|
|
128
128
|
self.enter_download_phase() # Sets phase to DOWNLOAD
|
|
129
|
-
self.conbus_protocol.send_download_request(
|
|
129
|
+
self.conbus_protocol.send_download_request(
|
|
130
|
+
serial_number=self.serial_number,
|
|
131
|
+
actiontable_type=self.serializer.download_type(),
|
|
132
|
+
)
|
|
130
133
|
self.send_download()
|
|
131
134
|
|
|
132
135
|
def on_enter_waiting_data(self) -> None:
|
|
@@ -25,7 +25,7 @@ class ConbusDiscoverService:
|
|
|
25
25
|
"""
|
|
26
26
|
Service for discovering modules on Conbus servers.
|
|
27
27
|
|
|
28
|
-
Uses
|
|
28
|
+
Uses ConbusEventProtocol to provide discovery functionality for finding
|
|
29
29
|
modules connected to the Conbus network.
|
|
30
30
|
|
|
31
31
|
Attributes:
|
|
@@ -45,7 +45,7 @@ class ConbusDiscoverService:
|
|
|
45
45
|
Initialize the Conbus discover service.
|
|
46
46
|
|
|
47
47
|
Args:
|
|
48
|
-
conbus_protocol:
|
|
48
|
+
conbus_protocol: ConbusEventProtocol instance for communication.
|
|
49
49
|
"""
|
|
50
50
|
self.conbus_protocol: ConbusEventProtocol = conbus_protocol
|
|
51
51
|
self.conbus_protocol.on_connection_made.connect(self.connection_made)
|
|
@@ -279,8 +279,8 @@ class MsActionTableUploadService:
|
|
|
279
279
|
self.failed(f"Invalid msactiontable format: {e}")
|
|
280
280
|
return
|
|
281
281
|
|
|
282
|
-
# Serialize to telegram data (
|
|
283
|
-
self.upload_data = self.serializer.to_encoded_string(msactiontable) # type: ignore[arg-type]
|
|
282
|
+
# Serialize to telegram data (64 characters: AAAA + 64 data chars)
|
|
283
|
+
self.upload_data = "AAAA" + self.serializer.to_encoded_string(msactiontable) # type: ignore[arg-type]
|
|
284
284
|
|
|
285
285
|
self.logger.debug(
|
|
286
286
|
f"Upload data encoded: {len(self.upload_data)} chars (single chunk)"
|
|
@@ -8,12 +8,11 @@ from xp.models.protocol.conbus_protocol import (
|
|
|
8
8
|
TelegramReceivedEvent,
|
|
9
9
|
)
|
|
10
10
|
from xp.services.protocol.conbus_event_protocol import ConbusEventProtocol
|
|
11
|
-
from xp.services.protocol.conbus_protocol import ConbusProtocol
|
|
12
11
|
from xp.services.protocol.telegram_protocol import TelegramProtocol
|
|
13
12
|
|
|
14
|
-
__all__ = ["TelegramProtocol", "
|
|
13
|
+
__all__ = ["TelegramProtocol", "ConbusEventProtocol"]
|
|
15
14
|
|
|
16
|
-
# Rebuild models after TelegramProtocol and
|
|
15
|
+
# Rebuild models after TelegramProtocol and ConbusEventProtocol are imported to resolve forward references
|
|
17
16
|
ConnectionMadeEvent.model_rebuild()
|
|
18
17
|
InvalidTelegramReceivedEvent.model_rebuild()
|
|
19
18
|
ModuleDiscoveredEvent.model_rebuild()
|
|
@@ -98,7 +98,7 @@ class ConbusEventProtocol(protocol.Protocol, protocol.ClientFactory):
|
|
|
98
98
|
telegram_service: TelegramService,
|
|
99
99
|
) -> None:
|
|
100
100
|
"""
|
|
101
|
-
Initialize
|
|
101
|
+
Initialize ConbusEventProtocol.
|
|
102
102
|
|
|
103
103
|
Args:
|
|
104
104
|
cli_config: Configuration for Conbus client connection.
|
|
@@ -326,17 +326,20 @@ class ConbusEventProtocol(protocol.Protocol, protocol.ClientFactory):
|
|
|
326
326
|
data_value=DataPointType.MODULE_ERROR_CODE.value,
|
|
327
327
|
)
|
|
328
328
|
|
|
329
|
-
def send_download_request(
|
|
329
|
+
def send_download_request(
|
|
330
|
+
self, serial_number: str, actiontable_type: SystemFunction
|
|
331
|
+
) -> None:
|
|
330
332
|
"""
|
|
331
333
|
Send download request telegram.
|
|
332
334
|
|
|
333
335
|
Args:
|
|
334
336
|
serial_number: Device serial number.
|
|
337
|
+
actiontable_type: DOWNLOAD_ACTIONTABLE or DOWNLOAD_MSACTIONTABLE.
|
|
335
338
|
"""
|
|
336
339
|
self.send_telegram(
|
|
337
340
|
telegram_type=TelegramType.SYSTEM,
|
|
338
341
|
serial_number=serial_number,
|
|
339
|
-
system_function=
|
|
342
|
+
system_function=actiontable_type,
|
|
340
343
|
data_value=NO_ERROR_CODE,
|
|
341
344
|
)
|
|
342
345
|
|
|
@@ -159,14 +159,13 @@ class TestActionTableIntegration:
|
|
|
159
159
|
def mock_start_reactor_impl():
|
|
160
160
|
"""Mock reactor start method that triggers callbacks."""
|
|
161
161
|
# Generate dict and short format like the service does
|
|
162
|
-
actiontable_dict = sample_actiontable.model_dump()
|
|
163
162
|
actiontable_short = ActionTableSerializer.to_short_string(
|
|
164
163
|
sample_actiontable
|
|
165
164
|
)
|
|
166
165
|
# Call the on_actiontable_received callback with data
|
|
167
166
|
if callbacks["on_actiontable_received"]:
|
|
168
167
|
callbacks["on_actiontable_received"](
|
|
169
|
-
sample_actiontable,
|
|
168
|
+
sample_actiontable, actiontable_short
|
|
170
169
|
)
|
|
171
170
|
# Call the on_finish callback without arguments
|
|
172
171
|
if callbacks["on_finish"]:
|
{conson_xp-1.47.0 → conson_xp-1.49.0}/tests/integration/test_xp20_action_table_integration.py
RENAMED
|
@@ -169,7 +169,7 @@ class TestXp20ActionTableIntegration:
|
|
|
169
169
|
def test_specification_compliance(self):
|
|
170
170
|
"""Test compliance with the specification example."""
|
|
171
171
|
spec_example = (
|
|
172
|
-
"
|
|
172
|
+
"AAAAAAAAAAABACAEAIBACAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
|
|
173
173
|
)
|
|
174
174
|
|
|
175
175
|
# Should decode without errors
|
|
@@ -180,7 +180,7 @@ class TestXp20ActionTableIntegration:
|
|
|
180
180
|
|
|
181
181
|
# Test that we can re-encode it
|
|
182
182
|
re_encoded = Xp20MsActionTableSerializer.to_encoded_string(result)
|
|
183
|
-
assert len(re_encoded) ==
|
|
183
|
+
assert len(re_encoded) == 64
|
|
184
184
|
|
|
185
185
|
# Round-trip should work
|
|
186
186
|
final_result = Xp20MsActionTableSerializer.from_encoded_string(re_encoded)
|
{conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_conbus_actiontable_commands.py
RENAMED
|
@@ -118,13 +118,12 @@ class TestConbusActionTableCommands:
|
|
|
118
118
|
else:
|
|
119
119
|
if actiontable:
|
|
120
120
|
# Generate dict and short format like the service does
|
|
121
|
-
actiontable_dict = actiontable.model_dump()
|
|
122
121
|
actiontable_short = ActionTableSerializer.to_short_string(
|
|
123
122
|
actiontable
|
|
124
123
|
)
|
|
125
124
|
# Emit on_actiontable_received with data
|
|
126
125
|
for callback in actiontable_received_callbacks:
|
|
127
|
-
callback(actiontable,
|
|
126
|
+
callback(actiontable, actiontable_short)
|
|
128
127
|
# Emit on_finish without arguments
|
|
129
128
|
for callback in finish_callbacks:
|
|
130
129
|
callback()
|
|
@@ -186,8 +185,7 @@ class TestConbusActionTableCommands:
|
|
|
186
185
|
# The output should contain JSON with the actiontable data
|
|
187
186
|
# It may be on multiple lines due to indentation
|
|
188
187
|
assert "0000012345" in result.output
|
|
189
|
-
assert "
|
|
190
|
-
assert "entries" in result.output
|
|
188
|
+
assert "actiontable_short" in result.output
|
|
191
189
|
|
|
192
190
|
def test_conbus_download_actiontable_error_handling(self, runner):
|
|
193
191
|
"""Test actiontable download command error handling."""
|
|
@@ -287,8 +285,7 @@ class TestConbusActionTableCommands:
|
|
|
287
285
|
# The output should contain the actiontable data
|
|
288
286
|
# It may be on multiple lines due to indentation and include progress dots
|
|
289
287
|
assert "0000012345" in result.output
|
|
290
|
-
assert "
|
|
291
|
-
assert "entries" in result.output
|
|
288
|
+
assert "actiontable_short" in result.output
|
|
292
289
|
|
|
293
290
|
def test_download_actiontable_includes_short_format(
|
|
294
291
|
self, runner, sample_actiontable
|
|
@@ -367,8 +364,6 @@ class TestConbusActionTableCommands:
|
|
|
367
364
|
|
|
368
365
|
# Verify both formats are present
|
|
369
366
|
assert "actiontable_short" in result.output
|
|
370
|
-
assert "actiontable" in result.output
|
|
371
|
-
assert "entries" in result.output
|
|
372
367
|
|
|
373
368
|
def test_download_actiontable_short_with_parameter(self, runner):
|
|
374
369
|
"""Test actiontable_short displays parameter when non-zero."""
|
{conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_msactiontable_upload_service.py
RENAMED
|
@@ -5,7 +5,6 @@ from unittest.mock import Mock, patch
|
|
|
5
5
|
import pytest
|
|
6
6
|
|
|
7
7
|
from xp.models.actiontable.msactiontable_xp20 import Xp20MsActionTable
|
|
8
|
-
from xp.models.actiontable.msactiontable_xp24 import Xp24MsActionTable
|
|
9
8
|
from xp.models.actiontable.msactiontable_xp33 import Xp33MsActionTable
|
|
10
9
|
from xp.models.config.conson_module_config import ConsonModuleConfig
|
|
11
10
|
from xp.models.protocol.conbus_protocol import TelegramReceivedEvent
|
|
@@ -146,37 +145,6 @@ class TestMsActionTableUploadService:
|
|
|
146
145
|
data_value="00",
|
|
147
146
|
)
|
|
148
147
|
|
|
149
|
-
def test_upload_xp24_msactiontable_success(
|
|
150
|
-
self, service, mock_conson_config, mock_xp24_serializer, mock_conbus_protocol
|
|
151
|
-
):
|
|
152
|
-
"""Test successful XP24 msactiontable upload."""
|
|
153
|
-
# Setup module config
|
|
154
|
-
module = Mock(spec=ConsonModuleConfig)
|
|
155
|
-
module.module_type = "XP24"
|
|
156
|
-
module.xp24_msaction_table = [
|
|
157
|
-
"T:1 T:2 ON:0 OF:0 | M12:0 M34:0 C12:0 C34:0 DT:12"
|
|
158
|
-
]
|
|
159
|
-
mock_conson_config.find_module.return_value = module
|
|
160
|
-
|
|
161
|
-
# Setup serializer - mock to_encoded_string to return 68-char string
|
|
162
|
-
mock_msactiontable = Mock(spec=Xp24MsActionTable)
|
|
163
|
-
mock_xp24_serializer.to_encoded_string.return_value = "AAAA" + "A" * 64
|
|
164
|
-
|
|
165
|
-
# Mock from_short_format
|
|
166
|
-
with patch(
|
|
167
|
-
"xp.models.actiontable.msactiontable_xp24.Xp24MsActionTable.from_short_format",
|
|
168
|
-
return_value=mock_msactiontable,
|
|
169
|
-
):
|
|
170
|
-
service.start(
|
|
171
|
-
serial_number="0020044991",
|
|
172
|
-
xpmoduletype="xp24",
|
|
173
|
-
)
|
|
174
|
-
|
|
175
|
-
assert service.serial_number == "0020044991"
|
|
176
|
-
assert service.xpmoduletype == "xp24"
|
|
177
|
-
assert service.upload_data == "AAAA" + "A" * 64
|
|
178
|
-
assert service.serializer == mock_xp24_serializer
|
|
179
|
-
|
|
180
148
|
def test_upload_xp20_msactiontable_success(
|
|
181
149
|
self, service, mock_conson_config, mock_xp20_serializer
|
|
182
150
|
):
|
{conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp20_action_table_serializer.py
RENAMED
|
@@ -55,14 +55,14 @@ class TestXp20MsActionTableSerializer:
|
|
|
55
55
|
@pytest.fixture
|
|
56
56
|
def sample_telegram_data(self):
|
|
57
57
|
"""Sample telegram data based on specification example (68 chars)."""
|
|
58
|
-
return "
|
|
58
|
+
return "AAAAAAAAAAABACAEAIBACAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
|
|
59
59
|
|
|
60
60
|
def test_to_data_serialization(self, sample_action_table):
|
|
61
61
|
"""Test serialization to telegram format."""
|
|
62
62
|
result = Xp20MsActionTableSerializer.to_encoded_string(sample_action_table)
|
|
63
63
|
|
|
64
64
|
# Should return 64-character hex string
|
|
65
|
-
assert len(result) ==
|
|
65
|
+
assert len(result) == 64
|
|
66
66
|
assert all(c in "ABCDEFGHIJKLMNOP" for c in result)
|
|
67
67
|
|
|
68
68
|
def test_from_data_deserialization(self, sample_telegram_data):
|
|
@@ -119,7 +119,7 @@ class TestXp20MsActionTableSerializer:
|
|
|
119
119
|
|
|
120
120
|
def test_invalid_data_length(self):
|
|
121
121
|
"""Test that invalid data length raises ValueError."""
|
|
122
|
-
with pytest.raises(ValueError, match="must be
|
|
122
|
+
with pytest.raises(ValueError, match="must be 64 characters long"):
|
|
123
123
|
Xp20MsActionTableSerializer.from_encoded_string("INVALID")
|
|
124
124
|
|
|
125
125
|
def test_byte_to_bits_conversion(self):
|
|
@@ -220,8 +220,7 @@ class TestXp20MsActionTableSerializer:
|
|
|
220
220
|
action_table.input8.ta_function = True
|
|
221
221
|
|
|
222
222
|
serialized = Xp20MsActionTableSerializer.to_encoded_string(action_table)
|
|
223
|
-
|
|
224
|
-
raw_bytes = de_nibbles(serialized[4:])
|
|
223
|
+
raw_bytes = de_nibbles(serialized)
|
|
225
224
|
|
|
226
225
|
# Check bit positions
|
|
227
226
|
assert raw_bytes[SHORT_LONG_INDEX] & 1 != 0 # input1 bit 0
|
|
@@ -233,7 +232,7 @@ class TestXp20MsActionTableSerializer:
|
|
|
233
232
|
def test_specification_example(self):
|
|
234
233
|
"""Test with the example telegram from specification."""
|
|
235
234
|
example_data = (
|
|
236
|
-
"
|
|
235
|
+
"AAAAAAAAAAABACAEAIBACAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
|
|
237
236
|
)
|
|
238
237
|
|
|
239
238
|
# This should decode without errors
|
|
@@ -260,7 +259,7 @@ class TestXp20MsActionTableSerializer:
|
|
|
260
259
|
"""Test round-trip serialization with default/empty action table data."""
|
|
261
260
|
# 64 characters - all A's represent a completely empty/default action table
|
|
262
261
|
valid_msactiontable = (
|
|
263
|
-
"
|
|
262
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
|
|
264
263
|
)
|
|
265
264
|
|
|
266
265
|
# Deserialize from data
|
|
@@ -293,8 +292,8 @@ class TestXp20MsActionTableSerializer:
|
|
|
293
292
|
telegram = "<R0020041824F17DAAAAAAAAAAABACAEAIBACAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFP>"
|
|
294
293
|
|
|
295
294
|
# Extract data portion (skip header at 0-15, skip count at 16-19, take 64 chars at 20-83)
|
|
296
|
-
data = telegram[
|
|
297
|
-
assert len(data) ==
|
|
295
|
+
data = telegram[20:84]
|
|
296
|
+
assert len(data) == 64
|
|
298
297
|
|
|
299
298
|
# Deserialize the action table
|
|
300
299
|
action_table = Xp20MsActionTableSerializer.from_encoded_string(data)
|
|
@@ -329,7 +328,7 @@ class TestXp20MsActionTableSerializer:
|
|
|
329
328
|
telegram = "<R0020037487F17DAAAAAAAAAAABACAEAIBACAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFL>"
|
|
330
329
|
|
|
331
330
|
# Test serialization with defaults
|
|
332
|
-
serialized_table = telegram[
|
|
331
|
+
serialized_table = telegram[20:84]
|
|
333
332
|
deserialized = Xp20MsActionTableSerializer.from_encoded_string(serialized_table)
|
|
334
333
|
serialized = Xp20MsActionTableSerializer.to_encoded_string(deserialized)
|
|
335
334
|
|
{conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp24_action_table_serializer.py
RENAMED
|
@@ -53,7 +53,7 @@ class TestXp24MsActionTableSerializer:
|
|
|
53
53
|
# This telegram contains non-hex characters that cause from_hex() to fail
|
|
54
54
|
# Based on the debug log: '<R0020044989F17DAAAAADAAADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFA>'
|
|
55
55
|
valid_telegram = (
|
|
56
|
-
"
|
|
56
|
+
"ADAAADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
|
|
57
57
|
)
|
|
58
58
|
|
|
59
59
|
msactiontable = Xp24MsActionTableSerializer.from_encoded_string(valid_telegram)
|
|
@@ -79,7 +79,7 @@ class TestXp24MsActionTableSerializer:
|
|
|
79
79
|
# This telegram contains non-hex characters that cause from_hex() to fail
|
|
80
80
|
# Based on the debug log: '<R0020044989F17DAAAAADAAADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFA>'
|
|
81
81
|
valid_msactiontable = (
|
|
82
|
-
"
|
|
82
|
+
"ADAAADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
|
|
83
83
|
)
|
|
84
84
|
|
|
85
85
|
msactiontable = Xp24MsActionTableSerializer.from_encoded_string(
|
|
@@ -97,7 +97,7 @@ class TestXp24MsActionTableSerializer:
|
|
|
97
97
|
# This telegram contains non-hex characters that cause from_hex() to fail
|
|
98
98
|
# Based on the debug log: '<R0020044964F17DAAAAABAGADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFD>'
|
|
99
99
|
valid_telegram = (
|
|
100
|
-
"
|
|
100
|
+
"ABAGADAAADAAADAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
|
|
101
101
|
)
|
|
102
102
|
|
|
103
103
|
msactiontable = Xp24MsActionTableSerializer.from_encoded_string(valid_telegram)
|
{conson_xp-1.47.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp33_action_table_serializer.py
RENAMED
|
@@ -424,7 +424,7 @@ class TestXp33MsActionTableSerializer:
|
|
|
424
424
|
# Create action table with default values
|
|
425
425
|
|
|
426
426
|
# Test serialization with defaults
|
|
427
|
-
serialized_table = telegram[
|
|
427
|
+
serialized_table = telegram[20:84]
|
|
428
428
|
deserialized = Xp33MsActionTableSerializer.from_encoded_string(serialized_table)
|
|
429
429
|
serialized = Xp33MsActionTableSerializer.to_encoded_string(deserialized)
|
|
430
430
|
|