conson-xp 1.38.0__tar.gz → 1.40.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.40.0}/PKG-INFO +1 -1
- {conson_xp-1.38.0 → conson_xp-1.40.0}/pyproject.toml +1 -1
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/__init__.py +1 -1
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +72 -15
- conson_xp-1.40.0/src/xp/models/actiontable/msactiontable_xp20.py +143 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/actiontable/msactiontable_xp24.py +33 -39
- conson_xp-1.40.0/src/xp/models/actiontable/msactiontable_xp33.py +360 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/config/conson_module_config.py +6 -2
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +2 -2
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +1 -1
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +2 -2
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/msactiontable/msactiontable_download_service.py +4 -4
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/msactiontable/msactiontable_list_service.py +9 -1
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_xp24_action_table_integration.py +2 -2
- conson_xp-1.40.0/tests/unit/test_models/test_xp20_action_table.py +515 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_xp24_action_table_short_format.py +31 -17
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_xp20_action_table_serializer.py +35 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_xp24_action_table_service.py +1 -3
- conson_xp-1.40.0/tests/unit/test_services/test_xp33_short_format.py +436 -0
- 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/src/xp/models/actiontable/msactiontable.py +0 -9
- conson_xp-1.38.0/src/xp/models/actiontable/msactiontable_xp20.py +0 -53
- conson_xp-1.38.0/src/xp/models/actiontable/msactiontable_xp33.py +0 -93
- 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/tests/unit/test_models/test_xp20_action_table.py +0 -229
- {conson_xp-1.38.0 → conson_xp-1.40.0}/LICENSE +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/README.md +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/__main__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_event_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_export_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/file_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/homekit/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/homekit/homekit.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/module_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/server/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/server/server_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/telegram/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/telegram/telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/term/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/term/term.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/term/term_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/main.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/utils/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/utils/click_tree.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/utils/decorators.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/utils/error_handlers.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/utils/formatters.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/utils/module_type_choice.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/utils/serial_number_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/utils/system_function_choice.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/utils/xp_module_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/actiontable/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/actiontable/actiontable.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_autoreport.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_blink.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_client_config.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_connection_status.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_custom.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_datapoint.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_discover.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_event_list.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_event_raw.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_export.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_linknumber.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_logger_config.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_output.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_raw.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_receive.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/config/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/homekit/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/homekit/homekit_accessory.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/homekit/homekit_config.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/log_entry.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/protocol/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/protocol/conbus_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/response.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/action_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/datapoint_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/event_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/event_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/input_action_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/input_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/module_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/module_type_code.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/output_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/reply_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/system_function.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/system_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/telegram_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/telegram/timeparam_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/term/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/term/connection_state.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/term/module_state.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/term/protocol_keys_config.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/term/status_message.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/term/telegram_display.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/models/write_config_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/actiontable/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/actiontable/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/actiontable/actiontable_download_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/conbus_blink_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/conbus_custom_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/conbus_discover_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/conbus_event_list_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/conbus_export_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/conbus_output_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/conbus_raw_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/conbus_receive_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/conbus_scan_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/msactiontable/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/msactiontable/msactiontable_show_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/conbus/write_config_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/homekit_cache_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/homekit_config_validator.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/homekit_hap_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/homekit_module_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/homekit_outlet.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/homekit/homekit_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/log_file_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/module_type_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/protocol/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/protocol/conbus_event_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/protocol/conbus_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/protocol/protocol_factory.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/protocol/telegram_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/reverse_proxy_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/server/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/server/base_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/server/client_buffer_manager.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/server/cp20_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/server/device_service_factory.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/server/server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/server/xp130_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/server/xp20_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/server/xp230_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/server/xp24_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/server/xp33_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/telegram/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/telegram/telegram_blink_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/telegram/telegram_discover_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/telegram/telegram_output_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/telegram/telegram_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/telegram/telegram_version_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/term/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/term/protocol_monitor_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/services/term/state_monitor_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/term/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/term/protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/term/protocol.tcss +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/term/state.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/term/state.tcss +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/term/widgets/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/term/widgets/help_menu.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/term/widgets/modules_list.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/term/widgets/protocol_log.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/term/widgets/status_footer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/utils/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/utils/checksum.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/utils/dependencies.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/utils/event_helper.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/utils/logging.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/utils/serialization.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/utils/state_machine.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/utils/time_utils.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/.coverage +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/conftest.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/.coverage +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/telegram_test_data.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_actiontable_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_api/.coverage +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_api/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_blink_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_checksum_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_conbus_blink_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_conbus_datapoint_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_conbus_raw_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_conbus_receive_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_discovery_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_event_telegram_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_homekit_config_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_link_number_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_module_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_output_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_reverse_proxy_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_system_reply_telegram_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_term_logging_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_version_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/integration/test_xp20_action_table_integration.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_api/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_cli/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_cli/test_click_tree.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_cli/test_conbus_actiontable_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_cli/test_decorators.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_cli/test_error_handlers.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_cli/test_formatters.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_cli/test_serial_number_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_cli/test_system_function_choice.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_cli/test_term_commands.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_encoding/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_conbus.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_conbus_client_send.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_conbus_discover.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_event_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_log_entry.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_logger_config.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_module_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_reply_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_system_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_version_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_write_config_type.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_xp24_action_table.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_actiontable_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_actiontable_upload_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_base_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_blink_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_checksum_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_client_buffer_manager.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_conbus_event_list_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_conbus_event_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_conbus_output_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_conbus_scan_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_device_service_factory.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_discovery_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_homekit_services.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_log_file_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_module_type_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_protocol_monitor_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_server_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_state_monitor_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_telegram_input_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_telegram_output_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_telegram_protocol.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_telegram_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_version_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_xp24_action_service.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_xp24_action_table_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_xp33_action_table_serializer.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_services/test_xp_server_services.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_tui/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_tui/test_protocol_log.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_utils/__init__.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_utils/test_checksum.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_utils/test_event_helper.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_utils/test_logging.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_utils/test_serialization.py +0 -0
- {conson_xp-1.38.0 → conson_xp-1.40.0}/tests/unit/test_utils/test_time_utils.py +0 -0
{conson_xp-1.38.0 → conson_xp-1.40.0}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py
RENAMED
|
@@ -55,29 +55,30 @@ def conbus_download_msactiontable(
|
|
|
55
55
|
click.echo(progress, nl=False)
|
|
56
56
|
|
|
57
57
|
def on_finish(
|
|
58
|
-
msaction_table: Union[
|
|
59
|
-
|
|
60
|
-
],
|
|
61
|
-
msaction_table_short: str,
|
|
58
|
+
msaction_table: Union[Xp20MsActionTable, Xp24MsActionTable, Xp33MsActionTable],
|
|
59
|
+
msaction_table_short: list[str],
|
|
62
60
|
) -> None:
|
|
63
|
-
"""Handle successful completion of MS action table download.
|
|
61
|
+
"""Handle successful completion of XP24 MS action table download.
|
|
64
62
|
|
|
65
63
|
Args:
|
|
66
|
-
msaction_table: Downloaded MS action table object
|
|
67
|
-
msaction_table_short: Short version of MS action table
|
|
68
|
-
|
|
69
|
-
Raises:
|
|
70
|
-
Abort: If action table download failed.
|
|
64
|
+
msaction_table: Downloaded XP MS action table object.
|
|
65
|
+
msaction_table_short: Short version of XP24 MS action table.
|
|
71
66
|
"""
|
|
72
67
|
service.stop_reactor()
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
68
|
+
|
|
69
|
+
# Format short representation based on module type
|
|
70
|
+
short_field_name = f"{xpmoduletype}_msaction_table"
|
|
71
|
+
# XP24 returns single-element list, XP20/XP33 return multi-line lists
|
|
72
|
+
short_value: Union[str, list[str]]
|
|
73
|
+
if len(msaction_table_short) == 1:
|
|
74
|
+
short_value = msaction_table_short[0]
|
|
75
|
+
else:
|
|
76
|
+
short_value = msaction_table_short
|
|
76
77
|
|
|
77
78
|
output = {
|
|
78
79
|
"serial_number": serial_number,
|
|
79
80
|
"xpmoduletype": xpmoduletype,
|
|
80
|
-
|
|
81
|
+
short_field_name: short_value,
|
|
81
82
|
"msaction_table": msaction_table.model_dump(),
|
|
82
83
|
}
|
|
83
84
|
click.echo(json.dumps(output, indent=2, default=str))
|
|
@@ -93,6 +94,8 @@ def conbus_download_msactiontable(
|
|
|
93
94
|
with service:
|
|
94
95
|
service.on_progress.connect(on_progress)
|
|
95
96
|
service.on_error.connect(on_error)
|
|
97
|
+
|
|
98
|
+
# Connect to the appropriate signal based on module type
|
|
96
99
|
service.on_finish.connect(on_finish)
|
|
97
100
|
service.start(
|
|
98
101
|
serial_number=serial_number,
|
|
@@ -155,9 +158,37 @@ def conbus_show_msactiontable(ctx: Context, serial_number: str) -> None:
|
|
|
155
158
|
Args:
|
|
156
159
|
module: Dictionary containing module configuration.
|
|
157
160
|
"""
|
|
161
|
+
click.echo(f"\nModule: {module.name} ({module.serial_number})")
|
|
162
|
+
|
|
163
|
+
# Display short format if action table exists
|
|
164
|
+
if module.xp33_msaction_table:
|
|
165
|
+
click.echo("Short:")
|
|
166
|
+
for line in module.xp33_msaction_table:
|
|
167
|
+
click.echo(f" - {line}")
|
|
168
|
+
elif module.xp24_msaction_table:
|
|
169
|
+
click.echo("Short:")
|
|
170
|
+
for line in module.xp24_msaction_table:
|
|
171
|
+
click.echo(f" - {line}")
|
|
172
|
+
elif module.xp20_msaction_table:
|
|
173
|
+
click.echo("Short:")
|
|
174
|
+
for line in module.xp20_msaction_table:
|
|
175
|
+
click.echo(f" - {line}")
|
|
176
|
+
|
|
177
|
+
# Display full YAML format
|
|
178
|
+
click.echo("Full:")
|
|
158
179
|
module_data = module.model_dump()
|
|
159
180
|
module_data.pop("action_table", None)
|
|
160
|
-
|
|
181
|
+
|
|
182
|
+
# Show the action table in YAML format
|
|
183
|
+
if module.xp33_msaction_table:
|
|
184
|
+
yaml_dict = {"xp33_msaction_table": module_data}
|
|
185
|
+
click.echo(_format_yaml(yaml_dict, indent=2))
|
|
186
|
+
elif module.xp24_msaction_table:
|
|
187
|
+
yaml_dict = {"xp24_msaction_table": module_data}
|
|
188
|
+
click.echo(_format_yaml(yaml_dict, indent=2))
|
|
189
|
+
elif module.xp20_msaction_table:
|
|
190
|
+
yaml_dict = {"xp20_msaction_table": module_data}
|
|
191
|
+
click.echo(_format_yaml(yaml_dict, indent=2))
|
|
161
192
|
|
|
162
193
|
def error_callback(error: str) -> None:
|
|
163
194
|
"""Handle errors during action table show.
|
|
@@ -173,3 +204,29 @@ def conbus_show_msactiontable(ctx: Context, serial_number: str) -> None:
|
|
|
173
204
|
finish_callback=on_finish,
|
|
174
205
|
error_callback=error_callback,
|
|
175
206
|
)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def _format_yaml(data: dict, indent: int = 0) -> str:
|
|
210
|
+
"""Format a dictionary as YAML-like output.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
data: Dictionary to format.
|
|
214
|
+
indent: Current indentation level.
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
YAML-like formatted string.
|
|
218
|
+
"""
|
|
219
|
+
lines: list[str] = []
|
|
220
|
+
for key, value in data.items():
|
|
221
|
+
if isinstance(value, dict):
|
|
222
|
+
lines.extend((f"{' ' * indent}{key}:", _format_yaml(value, indent + 2)))
|
|
223
|
+
elif isinstance(value, list):
|
|
224
|
+
lines.append(f"{' ' * indent}{key}:")
|
|
225
|
+
for item in value:
|
|
226
|
+
if isinstance(item, dict):
|
|
227
|
+
lines.append(_format_yaml(item, indent + 2))
|
|
228
|
+
else:
|
|
229
|
+
lines.append(f"{' ' * (indent + 2)}- {item}")
|
|
230
|
+
else:
|
|
231
|
+
lines.append(f"{' ' * indent}{key}: {value}")
|
|
232
|
+
return "\n".join(lines)
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"""XP20 Action Table models for input actions and settings."""
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class InputChannel(BaseModel):
|
|
7
|
+
"""Configuration for a single input channel in XP20 action table.
|
|
8
|
+
|
|
9
|
+
Attributes:
|
|
10
|
+
invert: Input inversion flag
|
|
11
|
+
short_long: Short/long press detection flag
|
|
12
|
+
group_on_off: Group on/off function flag
|
|
13
|
+
and_functions: 8-bit AND function configuration array
|
|
14
|
+
sa_function: SA function flag
|
|
15
|
+
ta_function: TA function flag
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
invert: bool = False
|
|
19
|
+
short_long: bool = False
|
|
20
|
+
group_on_off: bool = False
|
|
21
|
+
and_functions: list[bool] = Field(default_factory=lambda: [False] * 8)
|
|
22
|
+
sa_function: bool = False
|
|
23
|
+
ta_function: bool = False
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class Xp20MsActionTable(BaseModel):
|
|
27
|
+
"""XP20 Action Table for managing 8 input channels.
|
|
28
|
+
|
|
29
|
+
Contains configuration for 8 input channels (input1 through input8),
|
|
30
|
+
each with flags for inversion, short/long press detection, group functions,
|
|
31
|
+
AND functions, SA functions, and TA functions.
|
|
32
|
+
|
|
33
|
+
Attributes:
|
|
34
|
+
input1: Configuration for input channel 1.
|
|
35
|
+
input2: Configuration for input channel 2.
|
|
36
|
+
input3: Configuration for input channel 3.
|
|
37
|
+
input4: Configuration for input channel 4.
|
|
38
|
+
input5: Configuration for input channel 5.
|
|
39
|
+
input6: Configuration for input channel 6.
|
|
40
|
+
input7: Configuration for input channel 7.
|
|
41
|
+
input8: Configuration for input channel 8.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
input1: InputChannel = Field(default_factory=InputChannel)
|
|
45
|
+
input2: InputChannel = Field(default_factory=InputChannel)
|
|
46
|
+
input3: InputChannel = Field(default_factory=InputChannel)
|
|
47
|
+
input4: InputChannel = Field(default_factory=InputChannel)
|
|
48
|
+
input5: InputChannel = Field(default_factory=InputChannel)
|
|
49
|
+
input6: InputChannel = Field(default_factory=InputChannel)
|
|
50
|
+
input7: InputChannel = Field(default_factory=InputChannel)
|
|
51
|
+
input8: InputChannel = Field(default_factory=InputChannel)
|
|
52
|
+
|
|
53
|
+
def to_short_format(self) -> list[str]:
|
|
54
|
+
"""Convert action table to short format string.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
Short format string with each channel on a separate line.
|
|
58
|
+
Example:
|
|
59
|
+
CH1 I:0 S:0 G:0 AND:00000000 SA:0 TA:0
|
|
60
|
+
CH2 I:0 S:0 G:0 AND:00000000 SA:0 TA:0
|
|
61
|
+
...
|
|
62
|
+
"""
|
|
63
|
+
lines = []
|
|
64
|
+
for i in range(1, 9):
|
|
65
|
+
channel = getattr(self, f"input{i}")
|
|
66
|
+
# Convert and_functions list to binary string
|
|
67
|
+
and_bits = "".join("1" if bit else "0" for bit in channel.and_functions)
|
|
68
|
+
line = (
|
|
69
|
+
f"CH{i} "
|
|
70
|
+
f"I:{1 if channel.invert else 0} "
|
|
71
|
+
f"S:{1 if channel.short_long else 0} "
|
|
72
|
+
f"G:{1 if channel.group_on_off else 0} "
|
|
73
|
+
f"AND:{and_bits} "
|
|
74
|
+
f"SA:{1 if channel.sa_function else 0} "
|
|
75
|
+
f"TA:{1 if channel.ta_function else 0}"
|
|
76
|
+
)
|
|
77
|
+
lines.append(line)
|
|
78
|
+
return lines
|
|
79
|
+
|
|
80
|
+
@classmethod
|
|
81
|
+
def from_short_format(cls, short_str: list[str]) -> "Xp20MsActionTable":
|
|
82
|
+
"""Parse short format string into action table.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
short_str: Short format string with 8 channel lines.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
Xp20MsActionTable instance.
|
|
89
|
+
|
|
90
|
+
Raises:
|
|
91
|
+
ValueError: If format is invalid.
|
|
92
|
+
"""
|
|
93
|
+
import re
|
|
94
|
+
|
|
95
|
+
if len(short_str) != 8:
|
|
96
|
+
raise ValueError(f"Expected 8 channel lines, got {len(short_str)}")
|
|
97
|
+
|
|
98
|
+
pattern = re.compile(
|
|
99
|
+
r"^CH([1-8]) I:([01]) S:([01]) G:([01]) AND:([01]{8}) SA:([01]) TA:([01])$"
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
channels = {}
|
|
103
|
+
for line in short_str:
|
|
104
|
+
line = line.strip()
|
|
105
|
+
match = pattern.match(line)
|
|
106
|
+
if not match:
|
|
107
|
+
raise ValueError(f"Invalid channel format: {line}")
|
|
108
|
+
|
|
109
|
+
ch_num = int(match.group(1))
|
|
110
|
+
invert = match.group(2) == "1"
|
|
111
|
+
short_long = match.group(3) == "1"
|
|
112
|
+
group_on_off = match.group(4) == "1"
|
|
113
|
+
and_bits = match.group(5)
|
|
114
|
+
sa_function = match.group(6) == "1"
|
|
115
|
+
ta_function = match.group(7) == "1"
|
|
116
|
+
|
|
117
|
+
# Convert binary string to list of bools
|
|
118
|
+
and_functions = [bit == "1" for bit in and_bits]
|
|
119
|
+
|
|
120
|
+
channels[ch_num] = InputChannel(
|
|
121
|
+
invert=invert,
|
|
122
|
+
short_long=short_long,
|
|
123
|
+
group_on_off=group_on_off,
|
|
124
|
+
and_functions=and_functions,
|
|
125
|
+
sa_function=sa_function,
|
|
126
|
+
ta_function=ta_function,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
# Verify all channels are present
|
|
130
|
+
for i in range(1, 9):
|
|
131
|
+
if i not in channels:
|
|
132
|
+
raise ValueError(f"Missing channel {i}")
|
|
133
|
+
|
|
134
|
+
return cls(
|
|
135
|
+
input1=channels[1],
|
|
136
|
+
input2=channels[2],
|
|
137
|
+
input3=channels[3],
|
|
138
|
+
input4=channels[4],
|
|
139
|
+
input5=channels[5],
|
|
140
|
+
input6=channels[6],
|
|
141
|
+
input7=channels[7],
|
|
142
|
+
input8=channels[8],
|
|
143
|
+
)
|
|
@@ -4,7 +4,6 @@ from typing import Any, ClassVar, Union
|
|
|
4
4
|
|
|
5
5
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
6
6
|
|
|
7
|
-
from xp.models.actiontable.msactiontable import MsActionTable
|
|
8
7
|
from xp.models.telegram.input_action_type import InputActionType
|
|
9
8
|
from xp.models.telegram.timeparam_type import TimeParam
|
|
10
9
|
|
|
@@ -82,7 +81,7 @@ class InputAction(BaseModel):
|
|
|
82
81
|
raise ValueError(f"Invalid type for TimeParam: {type(v)}")
|
|
83
82
|
|
|
84
83
|
|
|
85
|
-
class Xp24MsActionTable(
|
|
84
|
+
class Xp24MsActionTable(BaseModel):
|
|
86
85
|
"""XP24 Action Table for managing input actions and settings.
|
|
87
86
|
|
|
88
87
|
Each input has an action type (TOGGLE, ON, LEVELSET, etc.)
|
|
@@ -159,14 +158,11 @@ class Xp24MsActionTable(MsActionTable):
|
|
|
159
158
|
curtain34: bool = False # Curtain setting for inputs 3-4
|
|
160
159
|
mutual_deadtime: int = MS300 # Master timing (MS300=12 or MS500=20)
|
|
161
160
|
|
|
162
|
-
def to_short_format(self
|
|
161
|
+
def to_short_format(self) -> list[str]:
|
|
163
162
|
"""Convert action table to short format string.
|
|
164
163
|
|
|
165
|
-
Args:
|
|
166
|
-
include_settings: Include settings after pipe separator.
|
|
167
|
-
|
|
168
164
|
Returns:
|
|
169
|
-
Short format string (e.g., "XP24 T:1 T:2 T:0 T:0").
|
|
165
|
+
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
166
|
"""
|
|
171
167
|
# Format input actions
|
|
172
168
|
actions = [
|
|
@@ -184,21 +180,20 @@ class Xp24MsActionTable(MsActionTable):
|
|
|
184
180
|
|
|
185
181
|
result = f"XP24 {' '.join(action_parts)}"
|
|
186
182
|
|
|
187
|
-
# Add settings
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
result = f"{result} | {settings}"
|
|
183
|
+
# Add settings
|
|
184
|
+
settings = (
|
|
185
|
+
f"M12:{1 if self.mutex12 else 0} "
|
|
186
|
+
f"M34:{1 if self.mutex34 else 0} "
|
|
187
|
+
f"C12:{1 if self.curtain12 else 0} "
|
|
188
|
+
f"C34:{1 if self.curtain34 else 0} "
|
|
189
|
+
f"DT:{self.mutual_deadtime}"
|
|
190
|
+
)
|
|
191
|
+
result = f"{result} | {settings}"
|
|
197
192
|
|
|
198
|
-
return result
|
|
193
|
+
return [result]
|
|
199
194
|
|
|
200
195
|
@classmethod
|
|
201
|
-
def from_short_format(cls, short_str: str) -> "Xp24MsActionTable":
|
|
196
|
+
def from_short_format(cls, short_str: list[str]) -> "Xp24MsActionTable":
|
|
202
197
|
"""Parse short format string into action table.
|
|
203
198
|
|
|
204
199
|
Args:
|
|
@@ -211,9 +206,9 @@ class Xp24MsActionTable(MsActionTable):
|
|
|
211
206
|
ValueError: If format is invalid.
|
|
212
207
|
"""
|
|
213
208
|
# Split by pipe to separate actions from settings
|
|
214
|
-
parts = short_str.split("|")
|
|
209
|
+
parts = short_str[0].split("|")
|
|
215
210
|
action_part = parts[0].strip()
|
|
216
|
-
settings_part = parts[1].strip()
|
|
211
|
+
settings_part = parts[1].strip()
|
|
217
212
|
|
|
218
213
|
# Parse action part
|
|
219
214
|
tokens = action_part.split()
|
|
@@ -253,23 +248,22 @@ class Xp24MsActionTable(MsActionTable):
|
|
|
253
248
|
"input4_action": input_actions[3],
|
|
254
249
|
}
|
|
255
250
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
kwargs["mutual_deadtime"] = int(value)
|
|
251
|
+
# Parse settings: M12:0 M34:1 C12:0 C34:1 DT:12
|
|
252
|
+
for setting in settings_part.split():
|
|
253
|
+
if ":" not in setting:
|
|
254
|
+
continue
|
|
255
|
+
|
|
256
|
+
key, value = setting.split(":", 1)
|
|
257
|
+
|
|
258
|
+
if key == "M12":
|
|
259
|
+
kwargs["mutex12"] = value == "1"
|
|
260
|
+
elif key == "M34":
|
|
261
|
+
kwargs["mutex34"] = value == "1"
|
|
262
|
+
elif key == "C12":
|
|
263
|
+
kwargs["curtain12"] = value == "1"
|
|
264
|
+
elif key == "C34":
|
|
265
|
+
kwargs["curtain34"] = value == "1"
|
|
266
|
+
elif key == "DT":
|
|
267
|
+
kwargs["mutual_deadtime"] = int(value)
|
|
274
268
|
|
|
275
269
|
return cls(**kwargs)
|