conson-xp 1.48.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.
Files changed (321) hide show
  1. {conson_xp-1.48.0 → conson_xp-1.49.0}/PKG-INFO +1 -1
  2. {conson_xp-1.48.0 → conson_xp-1.49.0}/pyproject.toml +1 -1
  3. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/__init__.py +1 -1
  4. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/protocol/conbus_protocol.py +1 -2
  5. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_discover_service.py +2 -2
  6. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/protocol/__init__.py +2 -3
  7. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/protocol/conbus_event_protocol.py +1 -1
  8. conson_xp-1.48.0/src/xp/services/protocol/conbus_protocol.py +0 -335
  9. {conson_xp-1.48.0 → conson_xp-1.49.0}/LICENSE +0 -0
  10. {conson_xp-1.48.0 → conson_xp-1.49.0}/README.md +0 -0
  11. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/__init__.py +0 -0
  12. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/__main__.py +0 -0
  13. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/__init__.py +0 -0
  14. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/__init__.py +0 -0
  15. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus.py +0 -0
  16. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +0 -0
  17. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
  18. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
  19. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
  20. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
  21. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
  22. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
  23. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_event_commands.py +0 -0
  24. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_export_commands.py +0 -0
  25. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
  26. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
  27. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +0 -0
  28. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +0 -0
  29. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
  30. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
  31. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
  32. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
  33. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/file_commands.py +0 -0
  34. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/homekit/__init__.py +0 -0
  35. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/homekit/homekit.py +0 -0
  36. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
  37. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/module_commands.py +0 -0
  38. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
  39. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/server/__init__.py +0 -0
  40. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/server/server_commands.py +0 -0
  41. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/__init__.py +0 -0
  42. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram.py +0 -0
  43. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
  44. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
  45. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
  46. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
  47. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
  48. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
  49. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/term/__init__.py +0 -0
  50. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/term/term.py +0 -0
  51. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/commands/term/term_commands.py +0 -0
  52. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/main.py +0 -0
  53. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/utils/__init__.py +0 -0
  54. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/utils/click_tree.py +0 -0
  55. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
  56. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/utils/decorators.py +0 -0
  57. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/utils/error_handlers.py +0 -0
  58. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/utils/formatters.py +0 -0
  59. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/utils/module_type_choice.py +0 -0
  60. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/utils/serial_number_type.py +0 -0
  61. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/utils/system_function_choice.py +0 -0
  62. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/cli/utils/xp_module_type.py +0 -0
  63. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/__init__.py +0 -0
  64. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/actiontable/__init__.py +0 -0
  65. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/actiontable/actiontable.py +0 -0
  66. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/actiontable/actiontable_type.py +0 -0
  67. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
  68. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/actiontable/msactiontable_xp24.py +0 -0
  69. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
  70. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/__init__.py +0 -0
  71. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus.py +0 -0
  72. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_autoreport.py +0 -0
  73. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_blink.py +0 -0
  74. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_client_config.py +0 -0
  75. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_connection_status.py +0 -0
  76. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_custom.py +0 -0
  77. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_datapoint.py +0 -0
  78. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_discover.py +0 -0
  79. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_event_list.py +0 -0
  80. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_event_raw.py +0 -0
  81. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_export.py +0 -0
  82. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
  83. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_linknumber.py +0 -0
  84. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_logger_config.py +0 -0
  85. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_output.py +0 -0
  86. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_raw.py +0 -0
  87. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_receive.py +0 -0
  88. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
  89. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/config/__init__.py +0 -0
  90. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/config/conson_module_config.py +0 -0
  91. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/homekit/__init__.py +0 -0
  92. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/homekit/homekit_accessory.py +0 -0
  93. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/homekit/homekit_config.py +0 -0
  94. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/log_entry.py +0 -0
  95. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/protocol/__init__.py +0 -0
  96. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/response.py +0 -0
  97. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/__init__.py +0 -0
  98. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/action_type.py +0 -0
  99. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/datapoint_type.py +0 -0
  100. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/event_telegram.py +0 -0
  101. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/event_type.py +0 -0
  102. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/input_action_type.py +0 -0
  103. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/input_type.py +0 -0
  104. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/module_type.py +0 -0
  105. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/module_type_code.py +0 -0
  106. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/output_telegram.py +0 -0
  107. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/reply_telegram.py +0 -0
  108. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/system_function.py +0 -0
  109. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/system_telegram.py +0 -0
  110. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/telegram.py +0 -0
  111. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/telegram_type.py +0 -0
  112. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/telegram/timeparam_type.py +0 -0
  113. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/term/__init__.py +0 -0
  114. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/term/connection_state.py +0 -0
  115. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/term/module_state.py +0 -0
  116. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/term/protocol_keys_config.py +0 -0
  117. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/term/status_message.py +0 -0
  118. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/term/telegram_display.py +0 -0
  119. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/models/write_config_type.py +0 -0
  120. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/__init__.py +0 -0
  121. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/actiontable/__init__.py +0 -0
  122. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
  123. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/actiontable/download_state_machine.py +0 -0
  124. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
  125. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +0 -0
  126. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +0 -0
  127. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +0 -0
  128. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/actiontable/serializer_protocol.py +0 -0
  129. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/__init__.py +0 -0
  130. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/__init__.py +0 -0
  131. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/actiontable_download_service.py +0 -0
  132. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
  133. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
  134. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +0 -0
  135. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
  136. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_blink_service.py +0 -0
  137. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_custom_service.py +0 -0
  138. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
  139. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
  140. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_event_list_service.py +0 -0
  141. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_event_raw_service.py +0 -0
  142. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_export_service.py +0 -0
  143. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_output_service.py +0 -0
  144. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_raw_service.py +0 -0
  145. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_receive_service.py +0 -0
  146. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/conbus_scan_service.py +0 -0
  147. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/msactiontable/__init__.py +0 -0
  148. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/msactiontable/msactiontable_upload_service.py +0 -0
  149. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/conbus/write_config_service.py +0 -0
  150. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/__init__.py +0 -0
  151. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_cache_service.py +0 -0
  152. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
  153. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_config_validator.py +0 -0
  154. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
  155. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
  156. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
  157. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_hap_service.py +0 -0
  158. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
  159. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
  160. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_module_service.py +0 -0
  161. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_outlet.py +0 -0
  162. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
  163. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/homekit/homekit_service.py +0 -0
  164. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/log_file_service.py +0 -0
  165. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/module_type_service.py +0 -0
  166. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/protocol/protocol_factory.py +0 -0
  167. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/protocol/telegram_protocol.py +0 -0
  168. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/reverse_proxy_service.py +0 -0
  169. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/server/__init__.py +0 -0
  170. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/server/base_server_service.py +0 -0
  171. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/server/client_buffer_manager.py +0 -0
  172. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/server/cp20_server_service.py +0 -0
  173. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/server/device_service_factory.py +0 -0
  174. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/server/server_service.py +0 -0
  175. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/server/xp130_server_service.py +0 -0
  176. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/server/xp20_server_service.py +0 -0
  177. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/server/xp230_server_service.py +0 -0
  178. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/server/xp24_server_service.py +0 -0
  179. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/server/xp33_server_service.py +0 -0
  180. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/telegram/__init__.py +0 -0
  181. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_blink_service.py +0 -0
  182. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
  183. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_datapoint_service.py +0 -0
  184. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_discover_service.py +0 -0
  185. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
  186. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_output_service.py +0 -0
  187. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_service.py +0 -0
  188. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/telegram/telegram_version_service.py +0 -0
  189. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/term/__init__.py +0 -0
  190. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/term/protocol_monitor_service.py +0 -0
  191. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/services/term/state_monitor_service.py +0 -0
  192. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/term/__init__.py +0 -0
  193. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/term/protocol.py +0 -0
  194. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/term/protocol.tcss +0 -0
  195. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/term/state.py +0 -0
  196. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/term/state.tcss +0 -0
  197. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/term/widgets/__init__.py +0 -0
  198. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/term/widgets/help_menu.py +0 -0
  199. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/term/widgets/modules_list.py +0 -0
  200. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/term/widgets/protocol_log.py +0 -0
  201. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/term/widgets/status_footer.py +0 -0
  202. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/utils/__init__.py +0 -0
  203. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/utils/checksum.py +0 -0
  204. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/utils/dependencies.py +0 -0
  205. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/utils/event_helper.py +0 -0
  206. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/utils/logging.py +0 -0
  207. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/utils/serialization.py +0 -0
  208. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/utils/state_machine.py +0 -0
  209. {conson_xp-1.48.0 → conson_xp-1.49.0}/src/xp/utils/time_utils.py +0 -0
  210. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/.coverage +0 -0
  211. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/__init__.py +0 -0
  212. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/conftest.py +0 -0
  213. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/.coverage +0 -0
  214. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/__init__.py +0 -0
  215. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/telegram_test_data.py +0 -0
  216. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_actiontable_integration.py +0 -0
  217. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_api/.coverage +0 -0
  218. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_api/__init__.py +0 -0
  219. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_blink_integration.py +0 -0
  220. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_checksum_integration.py +0 -0
  221. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_conbus_blink_integration.py +0 -0
  222. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_conbus_datapoint_integration.py +0 -0
  223. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_conbus_raw_integration.py +0 -0
  224. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_conbus_receive_integration.py +0 -0
  225. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_discovery_integration.py +0 -0
  226. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_event_telegram_integration.py +0 -0
  227. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_homekit_config_integration.py +0 -0
  228. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_link_number_integration.py +0 -0
  229. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_module_integration.py +0 -0
  230. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_output_integration.py +0 -0
  231. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_reverse_proxy_integration.py +0 -0
  232. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_system_reply_telegram_integration.py +0 -0
  233. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_term_logging_integration.py +0 -0
  234. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_version_integration.py +0 -0
  235. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_xp20_action_table_integration.py +0 -0
  236. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/integration/test_xp24_action_table_integration.py +0 -0
  237. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/__init__.py +0 -0
  238. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_api/__init__.py +0 -0
  239. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_cli/__init__.py +0 -0
  240. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_click_tree.py +0 -0
  241. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_conbus_actiontable_commands.py +0 -0
  242. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
  243. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_conbus_msactiontable_upload_commands.py +0 -0
  244. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
  245. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_decorators.py +0 -0
  246. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_error_handlers.py +0 -0
  247. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_formatters.py +0 -0
  248. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_serial_number_type.py +0 -0
  249. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_system_function_choice.py +0 -0
  250. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_cli/test_term_commands.py +0 -0
  251. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_encoding/__init__.py +0 -0
  252. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
  253. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/__init__.py +0 -0
  254. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_conbus.py +0 -0
  255. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_conbus_client_send.py +0 -0
  256. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_conbus_discover.py +0 -0
  257. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
  258. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_event_telegram.py +0 -0
  259. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_log_entry.py +0 -0
  260. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_logger_config.py +0 -0
  261. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_module_type.py +0 -0
  262. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_reply_telegram.py +0 -0
  263. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_system_telegram.py +0 -0
  264. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
  265. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_version_telegram.py +0 -0
  266. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_write_config_type.py +0 -0
  267. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_xp20_action_table.py +0 -0
  268. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_xp24_action_table.py +0 -0
  269. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_xp24_action_table_short_format.py +0 -0
  270. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
  271. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/__init__.py +0 -0
  272. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_actiontable_download_service.py +0 -0
  273. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
  274. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_actiontable_service.py +0 -0
  275. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_actiontable_upload_service.py +0 -0
  276. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_base_server_service.py +0 -0
  277. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_blink_service.py +0 -0
  278. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_checksum_service.py +0 -0
  279. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_client_buffer_manager.py +0 -0
  280. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
  281. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_event_list_service.py +0 -0
  282. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_event_protocol.py +0 -0
  283. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_event_raw_service.py +0 -0
  284. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_output_service.py +0 -0
  285. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
  286. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_receive_service.py +0 -0
  287. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
  288. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_conbus_scan_service.py +0 -0
  289. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_device_service_factory.py +0 -0
  290. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_discovery_service.py +0 -0
  291. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
  292. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
  293. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
  294. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_homekit_services.py +0 -0
  295. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_log_file_service.py +0 -0
  296. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_module_type_service.py +0 -0
  297. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_msactiontable_upload_service.py +0 -0
  298. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_protocol.py +0 -0
  299. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_protocol_monitor_service.py +0 -0
  300. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_server_service.py +0 -0
  301. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_state_monitor_service.py +0 -0
  302. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_telegram_input_service.py +0 -0
  303. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_telegram_output_service.py +0 -0
  304. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_telegram_protocol.py +0 -0
  305. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_telegram_service.py +0 -0
  306. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_version_service.py +0 -0
  307. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp20_action_table_serializer.py +0 -0
  308. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp24_action_service.py +0 -0
  309. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp24_action_table_serializer.py +0 -0
  310. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
  311. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp33_action_table_serializer.py +0 -0
  312. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp33_short_format.py +0 -0
  313. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_services/test_xp_server_services.py +0 -0
  314. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_tui/__init__.py +0 -0
  315. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_tui/test_protocol_log.py +0 -0
  316. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_utils/__init__.py +0 -0
  317. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_checksum.py +0 -0
  318. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_event_helper.py +0 -0
  319. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_logging.py +0 -0
  320. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_serialization.py +0 -0
  321. {conson_xp-1.48.0 → conson_xp-1.49.0}/tests/unit/test_utils/test_time_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: conson-xp
3
- Version: 1.48.0
3
+ Version: 1.49.0
4
4
  Summary: XP Protocol Communication Tools
5
5
  Author-Email: ldvchosal <ldvchosal@github.com>
6
6
  License: MIT License
@@ -23,7 +23,7 @@ dependencies = [
23
23
  ]
24
24
  requires-python = ">=3.11"
25
25
  readme = "README.md"
26
- version = "1.48.0"
26
+ version = "1.49.0"
27
27
 
28
28
  [project.license]
29
29
  file = "LICENSE"
@@ -4,7 +4,7 @@ XP CLI tool for remote console bus operations.
4
4
  conson-xp package.
5
5
  """
6
6
 
7
- __version__ = "1.48.0"
7
+ __version__ = "1.49.0"
8
8
  __manufacturer__ = "salchichon"
9
9
  __model__ = "xp.cli"
10
10
  __serial__ = "2025.09.23.000"
@@ -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, ConbusProtocol, ConbusEventProtocol] = Field(
268
+ protocol: Union[TelegramProtocol, ConbusEventProtocol] = Field(
270
269
  description="TelegramProtocol instance"
271
270
  )
272
271
  frame: str = Field(description="Frame <S0123450001F02D12FK>")
@@ -25,7 +25,7 @@ class ConbusDiscoverService:
25
25
  """
26
26
  Service for discovering modules on Conbus servers.
27
27
 
28
- Uses ConbusProtocol to provide discovery functionality for finding
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: ConbusProtocol.
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)
@@ -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", "ConbusProtocol", "ConbusEventProtocol"]
13
+ __all__ = ["TelegramProtocol", "ConbusEventProtocol"]
15
14
 
16
- # Rebuild models after TelegramProtocol and ConbusProtocol are imported to resolve forward references
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 ConbusProtocol.
101
+ Initialize ConbusEventProtocol.
102
102
 
103
103
  Args:
104
104
  cli_config: Configuration for Conbus client connection.
@@ -1,335 +0,0 @@
1
- """
2
- Conbus Protocol for XP telegram communication.
3
-
4
- This module implements the Twisted protocol for Conbus communication.
5
- """
6
-
7
- import logging
8
- from typing import Any, Optional
9
-
10
- from twisted.internet import protocol
11
- from twisted.internet.base import DelayedCall
12
- from twisted.internet.interfaces import IAddress, IConnector
13
- from twisted.internet.posixbase import PosixReactorBase
14
- from twisted.python.failure import Failure
15
-
16
- from xp.models import ConbusClientConfig
17
- from xp.models.protocol.conbus_protocol import (
18
- TelegramReceivedEvent,
19
- )
20
- from xp.models.telegram.system_function import SystemFunction
21
- from xp.models.telegram.telegram_type import TelegramType
22
- from xp.utils import calculate_checksum
23
-
24
-
25
- class ConbusProtocol(protocol.Protocol, protocol.ClientFactory):
26
- """
27
- Twisted protocol for XP telegram communication.
28
-
29
- Attributes:
30
- buffer: Buffer for incoming telegram data.
31
- logger: Logger instance for this protocol.
32
- cli_config: Conbus configuration settings.
33
- reactor: Twisted reactor instance.
34
- timeout_seconds: Timeout duration in seconds.
35
- timeout_call: Delayed call handle for timeout management.
36
- """
37
-
38
- buffer: bytes
39
-
40
- def __init__(
41
- self,
42
- cli_config: ConbusClientConfig,
43
- reactor: PosixReactorBase,
44
- ) -> None:
45
- """
46
- Initialize ConbusProtocol.
47
-
48
- Args:
49
- cli_config: Configuration for Conbus client connection.
50
- reactor: Twisted reactor for event handling.
51
- """
52
- self.buffer = b""
53
- self.logger = logging.getLogger(__name__)
54
- self.cli_config = cli_config.conbus
55
- self.reactor = reactor
56
- self.timeout_seconds = self.cli_config.timeout
57
- self.timeout_call: Optional[DelayedCall] = None
58
-
59
- def connectionMade(self) -> None:
60
- """
61
- Handle connection established event.
62
-
63
- Called when TCP connection is successfully established. Starts inactivity
64
- timeout monitoring.
65
- """
66
- self.logger.debug("connectionMade")
67
- self.connection_established()
68
- # Start inactivity timeout
69
- self._reset_timeout()
70
-
71
- def dataReceived(self, data: bytes) -> None:
72
- """
73
- Handle received data from TCP connection.
74
-
75
- Parses incoming telegram frames and dispatches events.
76
-
77
- Args:
78
- data: Raw bytes received from connection.
79
- """
80
- self.logger.debug("dataReceived")
81
- self.buffer += data
82
-
83
- while True:
84
- start = self.buffer.find(b"<")
85
- if start == -1:
86
- break
87
-
88
- end = self.buffer.find(b">", start)
89
- if end == -1:
90
- break
91
-
92
- # <S0123450001F02D12FK>
93
- # <R0123450001F02D12FK>
94
- # <E12L01I08MAK>
95
- frame = self.buffer[start : end + 1] # <S0123450001F02D12FK>
96
- self.buffer = self.buffer[end + 1 :]
97
- telegram = frame[1:-1] # S0123450001F02D12FK
98
- telegram_type = telegram[0:1].decode() # S
99
- payload = telegram[:-2] # S0123450001F02D12
100
- checksum = telegram[-2:].decode() # FK
101
- serial_number = (
102
- telegram[1:11] if telegram_type in ("S", "R") else b""
103
- ) # 0123450001
104
- calculated_checksum = calculate_checksum(payload.decode(encoding="latin-1"))
105
-
106
- checksum_valid = checksum == calculated_checksum
107
- if not checksum_valid:
108
- self.logger.debug(
109
- f"Invalid checksum: {checksum}, calculated: {calculated_checksum}"
110
- )
111
-
112
- self.logger.debug(
113
- f"frameReceived payload: {payload.decode('latin-1')}, checksum: {checksum}"
114
- )
115
-
116
- # Reset timeout on activity
117
- self._reset_timeout()
118
-
119
- telegram_received = TelegramReceivedEvent(
120
- protocol=self,
121
- frame=frame.decode("latin-1"),
122
- telegram=telegram.decode("latin-1"),
123
- payload=payload.decode("latin-1"),
124
- telegram_type=telegram_type,
125
- serial_number=serial_number,
126
- checksum=checksum,
127
- checksum_valid=checksum_valid,
128
- )
129
- self.telegram_received(telegram_received)
130
-
131
- def sendFrame(self, data: bytes) -> None:
132
- """
133
- Send telegram frame.
134
-
135
- Args:
136
- data: Raw telegram payload (without checksum/framing).
137
-
138
- Raises:
139
- IOError: If transport is not open.
140
- """
141
- # Calculate full frame (add checksum and brackets)
142
- checksum = calculate_checksum(data.decode())
143
- frame_data = data.decode() + checksum
144
- frame = b"<" + frame_data.encode() + b">"
145
-
146
- if not self.transport:
147
- self.logger.info("Invalid transport")
148
- raise IOError("Transport is not open")
149
-
150
- self.logger.debug(f"Sending frame: {frame.decode()}")
151
- self.transport.write(frame) # type: ignore
152
- self.telegram_sent(frame.decode())
153
- self._reset_timeout()
154
-
155
- def send_telegram(
156
- self,
157
- telegram_type: TelegramType,
158
- serial_number: str,
159
- system_function: SystemFunction,
160
- data_value: str,
161
- ) -> None:
162
- """
163
- Send telegram with specified parameters.
164
-
165
- Args:
166
- telegram_type: Type of telegram to send.
167
- serial_number: Device serial number.
168
- system_function: System function code.
169
- data_value: Data value to send.
170
- """
171
- payload = (
172
- f"{telegram_type.value}"
173
- f"{serial_number}"
174
- f"F{system_function.value}"
175
- f"D{data_value}"
176
- )
177
- self.sendFrame(payload.encode())
178
-
179
- def buildProtocol(self, addr: IAddress) -> protocol.Protocol:
180
- """
181
- Build protocol instance for connection.
182
-
183
- Args:
184
- addr: Address of the connection.
185
-
186
- Returns:
187
- Protocol instance for this connection.
188
- """
189
- self.logger.debug(f"buildProtocol: {addr}")
190
- return self
191
-
192
- def clientConnectionFailed(self, connector: IConnector, reason: Failure) -> None:
193
- """
194
- Handle client connection failure.
195
-
196
- Args:
197
- connector: Connection connector instance.
198
- reason: Failure reason details.
199
- """
200
- self.logger.debug(f"clientConnectionFailed: {reason}")
201
- self.connection_failed(reason)
202
- self._cancel_timeout()
203
- self._stop_reactor()
204
-
205
- def clientConnectionLost(self, connector: IConnector, reason: Failure) -> None:
206
- """
207
- Handle client connection lost event.
208
-
209
- Args:
210
- connector: Connection connector instance.
211
- reason: Reason for connection loss.
212
- """
213
- self.logger.debug(f"clientConnectionLost: {reason}")
214
- self.connection_lost(reason)
215
- self._cancel_timeout()
216
- self._stop_reactor()
217
-
218
- def timeout(self) -> bool:
219
- """
220
- Handle timeout event.
221
-
222
- Returns:
223
- True to continue waiting for next timeout, False to stop.
224
- """
225
- self.logger.info("Timeout after: %ss", self.timeout_seconds)
226
- self.failed(f"Timeout after: {self.timeout_seconds}s")
227
- return False
228
-
229
- def connection_failed(self, reason: Failure) -> None:
230
- """
231
- Handle connection failure.
232
-
233
- Args:
234
- reason: Failure reason details.
235
- """
236
- self.logger.debug(f"Client connection failed: {reason}")
237
- self.failed(reason.getErrorMessage())
238
-
239
- def _reset_timeout(self) -> None:
240
- """Reset the inactivity timeout."""
241
- self._cancel_timeout()
242
- self.timeout_call = self.reactor.callLater(
243
- self.timeout_seconds, self._on_timeout
244
- )
245
-
246
- def _cancel_timeout(self) -> None:
247
- """Cancel the inactivity timeout."""
248
- if self.timeout_call and self.timeout_call.active():
249
- self.timeout_call.cancel()
250
-
251
- def _on_timeout(self) -> None:
252
- """Handle inactivity timeout expiration."""
253
- self.logger.debug(f"Conbus timeout after {self.timeout_seconds} seconds")
254
- continue_work = self.timeout()
255
- if not continue_work:
256
- self._stop_reactor()
257
-
258
- def _stop_reactor(self) -> None:
259
- """Stop the reactor if it's running."""
260
- if self.reactor.running:
261
- self.logger.info("Stopping reactor")
262
- self.reactor.stop()
263
-
264
- def start_reactor(self) -> None:
265
- """Start the reactor if it's running."""
266
- # Connect to TCP server
267
- self.logger.info(
268
- f"Connecting to TCP server {self.cli_config.ip}:{self.cli_config.port}"
269
- )
270
- self.reactor.connectTCP(self.cli_config.ip, self.cli_config.port, self)
271
-
272
- # Run the reactor (which now uses asyncio underneath)
273
- self.logger.info("Starting reactor event loop.")
274
- self.reactor.run()
275
-
276
- def __enter__(self) -> "ConbusProtocol":
277
- """
278
- Enter context manager.
279
-
280
- Returns:
281
- Self for context management.
282
- """
283
- return self
284
-
285
- def __exit__(
286
- self,
287
- _exc_type: Optional[type],
288
- _exc_val: Optional[BaseException],
289
- _exc_tb: Optional[Any],
290
- ) -> None:
291
- """Context manager exit - ensure connection is closed."""
292
- self.logger.debug("Exiting the event loop.")
293
- self._stop_reactor()
294
-
295
- """Override methods."""
296
-
297
- def telegram_sent(self, telegram_sent: str) -> None:
298
- """
299
- Override callback when telegram has been sent.
300
-
301
- Args:
302
- telegram_sent: The telegram that was sent.
303
- """
304
- pass
305
-
306
- def telegram_received(self, telegram_received: TelegramReceivedEvent) -> None:
307
- """
308
- Override callback when telegram is received.
309
-
310
- Args:
311
- telegram_received: Event containing received telegram details.
312
- """
313
- pass
314
-
315
- def connection_established(self) -> None:
316
- """Override callback when connection established."""
317
- pass
318
-
319
- def connection_lost(self, reason: Failure) -> None:
320
- """
321
- Override callback when connection is lost.
322
-
323
- Args:
324
- reason: Reason for connection loss.
325
- """
326
- pass
327
-
328
- def failed(self, message: str) -> None:
329
- """
330
- Override callback when connection failed.
331
-
332
- Args:
333
- message: Error message describing the failure.
334
- """
335
- pass
File without changes
File without changes