conson-xp 0.11.16__tar.gz → 0.11.21__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 (287) hide show
  1. {conson_xp-0.11.16 → conson_xp-0.11.21}/PKG-INFO +1 -1
  2. {conson_xp-0.11.16 → conson_xp-0.11.21}/pyproject.toml +1 -1
  3. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/__init__.py +1 -1
  4. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/__init__.py +0 -1
  5. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus_blink_commands.py +38 -20
  6. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +35 -16
  7. conson_xp-0.11.21/src/xp/cli/commands/conbus/conbus_raw_commands.py +51 -0
  8. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/conbus_blink.py +24 -4
  9. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/conbus_autoreport_get_service.py +17 -10
  10. conson_xp-0.11.21/src/xp/services/conbus/conbus_blink_all_service.py +162 -0
  11. conson_xp-0.11.21/src/xp/services/conbus/conbus_blink_service.py +134 -0
  12. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/conbus_discover_service.py +2 -2
  13. conson_xp-0.11.21/src/xp/services/conbus/conbus_lightlevel_get_service.py +149 -0
  14. conson_xp-0.11.21/src/xp/services/conbus/conbus_lightlevel_set_service.py +205 -0
  15. conson_xp-0.11.21/src/xp/services/conbus/conbus_raw_service.py +102 -0
  16. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/utils/dependencies.py +20 -12
  17. conson_xp-0.11.21/tests/integration/test_conbus_blink_integration.py +178 -0
  18. conson_xp-0.11.21/tests/integration/test_conbus_lightlevel_integration.py +224 -0
  19. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_conbus_raw_integration.py +54 -17
  20. conson_xp-0.11.21/tests/unit/test_services/test_conbus_blink_service.py +231 -0
  21. conson_xp-0.11.21/tests/unit/test_services/test_conbus_lightlevel_service.py +187 -0
  22. conson_xp-0.11.21/tests/unit/test_services/test_conbus_raw_service.py +144 -0
  23. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_utils/test_dependencies.py +4 -4
  24. conson_xp-0.11.16/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -56
  25. conson_xp-0.11.16/src/xp/services/conbus/conbus_blink_service.py +0 -196
  26. conson_xp-0.11.16/src/xp/services/conbus/conbus_lightlevel_service.py +0 -205
  27. conson_xp-0.11.16/src/xp/services/conbus/conbus_raw_service.py +0 -79
  28. conson_xp-0.11.16/tests/integration/test_conbus_blink_integration.py +0 -278
  29. conson_xp-0.11.16/tests/integration/test_conbus_lightlevel_integration.py +0 -499
  30. {conson_xp-0.11.16 → conson_xp-0.11.21}/LICENSE +0 -0
  31. {conson_xp-0.11.16 → conson_xp-0.11.21}/README.md +0 -0
  32. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/api/__init__.py +0 -0
  33. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/api/main.py +0 -0
  34. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/api/models/__init__.py +0 -0
  35. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/api/models/api.py +0 -0
  36. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/api/models/discover.py +0 -0
  37. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/api/routers/__init__.py +0 -0
  38. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/api/routers/conbus.py +0 -0
  39. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/api/routers/conbus_blink.py +0 -0
  40. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/api/routers/conbus_custom.py +0 -0
  41. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/api/routers/conbus_datapoint.py +0 -0
  42. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/api/routers/conbus_output.py +0 -0
  43. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/api/routers/errors.py +0 -0
  44. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/__init__.py +0 -0
  45. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/__main__.py +0 -0
  46. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/api.py +0 -0
  47. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/api_start_commands.py +0 -0
  48. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/__init__.py +0 -0
  49. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus.py +0 -0
  50. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +0 -0
  51. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
  52. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
  53. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
  54. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
  55. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
  56. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +0 -0
  57. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +0 -0
  58. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
  59. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
  60. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
  61. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/file_commands.py +0 -0
  62. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/homekit/__init__.py +0 -0
  63. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/homekit/homekit.py +0 -0
  64. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
  65. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/module_commands.py +0 -0
  66. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
  67. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/server/__init__.py +0 -0
  68. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/server/server_commands.py +0 -0
  69. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/telegram/__init__.py +0 -0
  70. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/telegram/telegram.py +0 -0
  71. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
  72. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
  73. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
  74. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
  75. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
  76. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
  77. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/main.py +0 -0
  78. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/utils/__init__.py +0 -0
  79. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/utils/click_tree.py +0 -0
  80. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
  81. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/utils/decorators.py +0 -0
  82. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/utils/error_handlers.py +0 -0
  83. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/utils/formatters.py +0 -0
  84. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/utils/serial_number_type.py +0 -0
  85. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/utils/system_function_choice.py +0 -0
  86. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/cli/utils/xp_module_type.py +0 -0
  87. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/connection/__init__.py +0 -0
  88. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/connection/exceptions.py +0 -0
  89. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/__init__.py +0 -0
  90. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/actiontable/__init__.py +0 -0
  91. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/actiontable/actiontable.py +0 -0
  92. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
  93. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/actiontable/msactiontable_xp24.py +0 -0
  94. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
  95. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/__init__.py +0 -0
  96. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/conbus.py +0 -0
  97. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/conbus_autoreport.py +0 -0
  98. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/conbus_client_config.py +0 -0
  99. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/conbus_connection_status.py +0 -0
  100. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/conbus_custom.py +0 -0
  101. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/conbus_datapoint.py +0 -0
  102. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/conbus_discover.py +0 -0
  103. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
  104. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/conbus_linknumber.py +0 -0
  105. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/conbus_output.py +0 -0
  106. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/conbus_raw.py +0 -0
  107. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/conbus/conbus_receive.py +0 -0
  108. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/homekit/__init__.py +0 -0
  109. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/homekit/homekit_accessory.py +0 -0
  110. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/homekit/homekit_config.py +0 -0
  111. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/homekit/homekit_conson_config.py +0 -0
  112. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/log_entry.py +0 -0
  113. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/protocol/__init__.py +0 -0
  114. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/protocol/conbus_protocol.py +0 -0
  115. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/response.py +0 -0
  116. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/__init__.py +0 -0
  117. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/action_type.py +0 -0
  118. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/datapoint_type.py +0 -0
  119. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/event_telegram.py +0 -0
  120. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/event_type.py +0 -0
  121. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/input_action_type.py +0 -0
  122. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/input_type.py +0 -0
  123. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/module_type.py +0 -0
  124. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/module_type_code.py +0 -0
  125. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/output_telegram.py +0 -0
  126. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/reply_telegram.py +0 -0
  127. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/system_function.py +0 -0
  128. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/system_telegram.py +0 -0
  129. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/telegram.py +0 -0
  130. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/telegram_type.py +0 -0
  131. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/telegram/timeparam_type.py +0 -0
  132. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/models/write_config_type.py +0 -0
  133. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/__init__.py +0 -0
  134. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/__init__.py +0 -0
  135. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/actiontable/__init__.py +0 -0
  136. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/actiontable/actiontable_serializer.py +0 -0
  137. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/actiontable/actiontable_service.py +0 -0
  138. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/actiontable/msactiontable_service.py +0 -0
  139. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/actiontable/msactiontable_xp20_serializer.py +0 -0
  140. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/actiontable/msactiontable_xp24_serializer.py +0 -0
  141. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/actiontable/msactiontable_xp33_serializer.py +0 -0
  142. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/conbus_autoreport_set_service.py +0 -0
  143. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/conbus_connection_pool.py +0 -0
  144. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/conbus_custom_service.py +0 -0
  145. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
  146. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
  147. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/conbus_linknumber_service.py +0 -0
  148. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/conbus_output_service.py +0 -0
  149. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/conbus_receive_service.py +0 -0
  150. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/conbus_scan_service.py +0 -0
  151. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/conbus/conbus_service.py +0 -0
  152. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/__init__.py +0 -0
  153. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/homekit_cache_service.py +0 -0
  154. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/homekit_conbus_service.py +0 -0
  155. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/homekit_config_validator.py +0 -0
  156. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
  157. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
  158. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
  159. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/homekit_hap_service.py +0 -0
  160. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
  161. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/homekit_lightbulb_service.py +0 -0
  162. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/homekit_module_service.py +0 -0
  163. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/homekit_outlet.py +0 -0
  164. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/homekit_outlet_service.py +0 -0
  165. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/homekit/homekit_service.py +0 -0
  166. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/log_file_service.py +0 -0
  167. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/module_type_service.py +0 -0
  168. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/protocol/__init__.py +0 -0
  169. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/protocol/conbus_protocol.py +0 -0
  170. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/protocol/protocol_factory.py +0 -0
  171. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/protocol/telegram_protocol.py +0 -0
  172. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/reverse_proxy_service.py +0 -0
  173. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/server/__init__.py +0 -0
  174. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/server/base_server_service.py +0 -0
  175. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/server/cp20_server_service.py +0 -0
  176. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/server/server_service.py +0 -0
  177. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/server/xp130_server_service.py +0 -0
  178. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/server/xp20_server_service.py +0 -0
  179. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/server/xp230_server_service.py +0 -0
  180. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/server/xp24_server_service.py +0 -0
  181. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/server/xp33_server_service.py +0 -0
  182. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/telegram/__init__.py +0 -0
  183. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/telegram/telegram_blink_service.py +0 -0
  184. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
  185. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/telegram/telegram_discover_service.py +0 -0
  186. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
  187. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/telegram/telegram_output_service.py +0 -0
  188. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/telegram/telegram_service.py +0 -0
  189. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/services/telegram/telegram_version_service.py +0 -0
  190. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/utils/__init__.py +0 -0
  191. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/utils/checksum.py +0 -0
  192. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/utils/event_helper.py +0 -0
  193. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/utils/serialization.py +0 -0
  194. {conson_xp-0.11.16 → conson_xp-0.11.21}/src/xp/utils/time_utils.py +0 -0
  195. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/.coverage +0 -0
  196. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/__init__.py +0 -0
  197. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/conftest.py +0 -0
  198. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/.coverage +0 -0
  199. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/__init__.py +0 -0
  200. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/telegram_test_data.py +0 -0
  201. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_actiontable_integration.py +0 -0
  202. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_api/.coverage +0 -0
  203. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_api/__init__.py +0 -0
  204. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_blink_integration.py +0 -0
  205. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_checksum_integration.py +0 -0
  206. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_conbus_autoreport_integration.py +0 -0
  207. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_conbus_datapoint_integration.py +0 -0
  208. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_conbus_linknumber_integration.py +0 -0
  209. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_conbus_receive_integration.py +0 -0
  210. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_discovery_integration.py +0 -0
  211. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_event_telegram_integration.py +0 -0
  212. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_homekit_config_integration.py +0 -0
  213. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_link_number_integration.py +0 -0
  214. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_module_integration.py +0 -0
  215. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_output_integration.py +0 -0
  216. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_reverse_proxy_integration.py +0 -0
  217. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_system_reply_telegram_integration.py +0 -0
  218. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_version_integration.py +0 -0
  219. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_xp20_action_table_integration.py +0 -0
  220. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/integration/test_xp24_action_table_integration.py +0 -0
  221. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/__init__.py +0 -0
  222. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_api/__init__.py +0 -0
  223. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_cli/__init__.py +0 -0
  224. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_cli/test_click_tree.py +0 -0
  225. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_cli/test_conbus_actiontable_commands.py +0 -0
  226. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
  227. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
  228. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_cli/test_decorators.py +0 -0
  229. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_cli/test_error_handlers.py +0 -0
  230. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_cli/test_formatters.py +0 -0
  231. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_cli/test_serial_number_type.py +0 -0
  232. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_cli/test_system_function_choice.py +0 -0
  233. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_connection/__init__.py +0 -0
  234. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_connection/test_connection_init.py +0 -0
  235. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_connection/test_exceptions.py +0 -0
  236. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_encoding/__init__.py +0 -0
  237. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
  238. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/__init__.py +0 -0
  239. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_conbus.py +0 -0
  240. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_conbus_client_send.py +0 -0
  241. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_conbus_discover.py +0 -0
  242. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
  243. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_event_telegram.py +0 -0
  244. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_log_entry.py +0 -0
  245. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_module_type.py +0 -0
  246. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_reply_telegram.py +0 -0
  247. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_system_telegram.py +0 -0
  248. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
  249. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_version_telegram.py +0 -0
  250. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_write_config_type.py +0 -0
  251. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_xp20_action_table.py +0 -0
  252. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_xp24_action_table.py +0 -0
  253. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
  254. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/__init__.py +0 -0
  255. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_actiontable_service.py +0 -0
  256. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_base_server_service.py +0 -0
  257. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_blink_service.py +0 -0
  258. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_checksum_service.py +0 -0
  259. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_conbus_datapoint_service.py +0 -0
  260. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_conbus_linknumber_service.py +0 -0
  261. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
  262. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_conbus_service.py +0 -0
  263. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_discovery_service.py +0 -0
  264. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
  265. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_homekit_config_validator.py +0 -0
  266. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
  267. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_homekit_services.py +0 -0
  268. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_link_number_service.py +0 -0
  269. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_log_file_service.py +0 -0
  270. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_module_type_service.py +0 -0
  271. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_protocol.py +0 -0
  272. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_server_service.py +0 -0
  273. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_telegram_input_service.py +0 -0
  274. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_telegram_protocol.py +0 -0
  275. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_telegram_service.py +0 -0
  276. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_version_service.py +0 -0
  277. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_xp20_action_table_serializer.py +0 -0
  278. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_xp24_action_service.py +0 -0
  279. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_xp24_action_table_serializer.py +0 -0
  280. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
  281. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_xp33_action_table_serializer.py +0 -0
  282. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_services/test_xp_server_services.py +0 -0
  283. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_utils/__init__.py +0 -0
  284. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_utils/test_checksum.py +0 -0
  285. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_utils/test_event_helper.py +0 -0
  286. {conson_xp-0.11.16 → conson_xp-0.11.21}/tests/unit/test_utils/test_serialization.py +0 -0
  287. {conson_xp-0.11.16 → conson_xp-0.11.21}/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: 0.11.16
3
+ Version: 0.11.21
4
4
  Summary: XP Protocol Communication Tools
5
5
  Author-Email: ldvchosal <ldvchosal@github.com>
6
6
  License: MIT License
@@ -20,7 +20,7 @@ dependencies = [
20
20
  ]
21
21
  requires-python = ">=3.11"
22
22
  readme = "README.md"
23
- version = "0.11.16"
23
+ version = "0.11.21"
24
24
 
25
25
  [project.license]
26
26
  file = "LICENSE"
@@ -2,7 +2,7 @@
2
2
 
3
3
  """conson-xp"""
4
4
 
5
- __version__ = "0.11.16"
5
+ __version__ = "0.11.21"
6
6
  __manufacturer__ = "salchichon"
7
7
  __model__ = "xp.cli"
8
8
  __serial__ = "2025.09.23.000"
@@ -38,7 +38,6 @@ from xp.cli.commands.conbus.conbus_datapoint_commands import (
38
38
  )
39
39
  from xp.cli.commands.conbus.conbus_discover_commands import send_discover_telegram
40
40
  from xp.cli.commands.conbus.conbus_lightlevel_commands import (
41
- xp_lightlevel_get,
42
41
  xp_lightlevel_off,
43
42
  xp_lightlevel_on,
44
43
  xp_lightlevel_set,
@@ -11,6 +11,8 @@ from xp.cli.utils.decorators import (
11
11
  handle_service_errors,
12
12
  )
13
13
  from xp.cli.utils.serial_number_type import SERIAL
14
+ from xp.models.conbus.conbus_blink import ConbusBlinkResponse
15
+ from xp.services.conbus.conbus_blink_all_service import ConbusBlinkAllService
14
16
  from xp.services.conbus.conbus_blink_service import ConbusBlinkService
15
17
  from xp.services.telegram.telegram_blink_service import BlinkError
16
18
 
@@ -29,12 +31,15 @@ def send_blink_on_telegram(ctx: Context, serial_number: str) -> None:
29
31
  \b
30
32
  xp conbus blink on 0012345008
31
33
  """
32
- service = ctx.obj.get("container").get_container().resolve(ConbusBlinkService)
33
34
 
34
- with service:
35
+ def finish(service_response: ConbusBlinkResponse) -> None:
36
+ click.echo(json.dumps(service_response.to_dict(), indent=2))
35
37
 
36
- response = service.send_blink_telegram(serial_number, "on")
37
- click.echo(json.dumps(response.to_dict(), indent=2))
38
+ service: ConbusBlinkService = (
39
+ ctx.obj.get("container").get_container().resolve(ConbusBlinkService)
40
+ )
41
+ with service:
42
+ service.send_blink_telegram(serial_number, "on", finish, 0.5)
38
43
 
39
44
 
40
45
  @conbus_blink.command("off")
@@ -51,12 +56,15 @@ def send_blink_off_telegram(ctx: Context, serial_number: str) -> None:
51
56
  \b
52
57
  xp conbus blink off 0012345008
53
58
  """
54
- service = ctx.obj.get("container").get_container().resolve(ConbusBlinkService)
55
59
 
56
- with service:
60
+ def finish(service_response: ConbusBlinkResponse) -> None:
61
+ click.echo(json.dumps(service_response.to_dict(), indent=2))
57
62
 
58
- response = service.send_blink_telegram(serial_number, "off")
59
- click.echo(json.dumps(response.to_dict(), indent=2))
63
+ service: ConbusBlinkService = (
64
+ ctx.obj.get("container").get_container().resolve(ConbusBlinkService)
65
+ )
66
+ with service:
67
+ service.send_blink_telegram(serial_number, "off", finish, 0.5)
60
68
 
61
69
 
62
70
  @conbus_blink.group("all", short_help="Control blink state for all devices")
@@ -80,14 +88,19 @@ def blink_all_off(ctx: Context) -> None:
80
88
  \b
81
89
  xp conbus blink all off
82
90
  """
83
- service = ctx.obj.get("container").get_container().resolve(ConbusBlinkService)
84
91
 
92
+ def finish(discovered_devices: ConbusBlinkResponse) -> None:
93
+ click.echo(json.dumps(discovered_devices.to_dict(), indent=2))
94
+
95
+ def progress(message: str) -> None:
96
+ click.echo(message)
97
+ pass
98
+
99
+ service: ConbusBlinkAllService = (
100
+ ctx.obj.get("container").get_container().resolve(ConbusBlinkAllService)
101
+ )
85
102
  with service:
86
- response = service.blink_all("off")
87
- if response.success:
88
- click.echo("All devices blink turned off")
89
- else:
90
- click.echo(f"Error: {response.error}")
103
+ service.send_blink_all_telegram("off", progress, finish, 0.5)
91
104
 
92
105
 
93
106
  @conbus_blink_all.command("on", short_help="Turn on blinking for all devices")
@@ -103,11 +116,16 @@ def blink_all_on(ctx: Context) -> None:
103
116
  \b
104
117
  xp conbus blink all on
105
118
  """
106
- service = ctx.obj.get("container").get_container().resolve(ConbusBlinkService)
107
119
 
120
+ def finish(discovered_devices: ConbusBlinkResponse) -> None:
121
+ click.echo(json.dumps(discovered_devices.to_dict(), indent=2))
122
+
123
+ def progress(message: str) -> None:
124
+ click.echo(message)
125
+ pass
126
+
127
+ service: ConbusBlinkAllService = (
128
+ ctx.obj.get("container").get_container().resolve(ConbusBlinkAllService)
129
+ )
108
130
  with service:
109
- response = service.blink_all("on")
110
- if response.success:
111
- click.echo("All devices blink turned on")
112
- else:
113
- click.echo(f"Error: {response.error}")
131
+ service.send_blink_all_telegram("on", progress, finish, 0.5)
@@ -10,9 +10,10 @@ from xp.cli.utils.decorators import (
10
10
  handle_service_errors,
11
11
  )
12
12
  from xp.cli.utils.serial_number_type import SERIAL
13
- from xp.services.conbus.conbus_lightlevel_service import (
13
+ from xp.models.conbus.conbus_lightlevel import ConbusLightlevelResponse
14
+ from xp.services.conbus.conbus_lightlevel_set_service import (
14
15
  ConbusLightlevelError,
15
- ConbusLightlevelService,
16
+ ConbusLightlevelSetService,
16
17
  )
17
18
 
18
19
 
@@ -34,12 +35,17 @@ def xp_lightlevel_set(
34
35
  xp conbus lightlevel set 0123450001 2 50 # Set output 2 to 50%
35
36
  xp conbus lightlevel set 0011223344 0 100 # Set output 0 to 100%
36
37
  """
37
- service = ctx.obj.get("container").get_container().resolve(ConbusLightlevelService)
38
38
 
39
- with service:
40
- response = service.set_lightlevel(serial_number, output_number, level)
39
+ def finish(response: "ConbusLightlevelResponse") -> None:
41
40
  click.echo(json.dumps(response.to_dict(), indent=2))
42
41
 
42
+ service = (
43
+ ctx.obj.get("container").get_container().resolve(ConbusLightlevelSetService)
44
+ )
45
+
46
+ with service:
47
+ service.set_lightlevel(serial_number, output_number, level, finish, 0.5)
48
+
43
49
 
44
50
  @conbus_lightlevel.command("off")
45
51
  @click.argument("serial_number", type=SERIAL)
@@ -58,12 +64,17 @@ def xp_lightlevel_off(
58
64
  xp conbus lightlevel off 0123450001 2 # Turn off output 2
59
65
  xp conbus lightlevel off 0011223344 0 # Turn off output 0
60
66
  """
61
- service = ctx.obj.get("container").get_container().resolve(ConbusLightlevelService)
62
67
 
63
- with service:
64
- response = service.turn_off(serial_number, output_number)
68
+ def finish(response: "ConbusLightlevelResponse") -> None:
65
69
  click.echo(json.dumps(response.to_dict(), indent=2))
66
70
 
71
+ service = (
72
+ ctx.obj.get("container").get_container().resolve(ConbusLightlevelSetService)
73
+ )
74
+
75
+ with service:
76
+ service.turn_off(serial_number, output_number, finish, 0.5)
77
+
67
78
 
68
79
  @conbus_lightlevel.command("on")
69
80
  @click.argument("serial_number", type=SERIAL)
@@ -82,12 +93,17 @@ def xp_lightlevel_on(
82
93
  xp conbus lightlevel on 0123450001 2 # Turn on output 2 (80%)
83
94
  xp conbus lightlevel on 0011223344 0 # Turn on output 0 (80%)
84
95
  """
85
- service = ctx.obj.get("container").get_container().resolve(ConbusLightlevelService)
86
96
 
87
- with service:
88
- response = service.turn_on(serial_number, output_number)
97
+ def finish(response: "ConbusLightlevelResponse") -> None:
89
98
  click.echo(json.dumps(response.to_dict(), indent=2))
90
99
 
100
+ service = (
101
+ ctx.obj.get("container").get_container().resolve(ConbusLightlevelSetService)
102
+ )
103
+
104
+ with service:
105
+ service.turn_on(serial_number, output_number, finish, 0.5)
106
+
91
107
 
92
108
  @conbus_lightlevel.command("get")
93
109
  @click.argument("serial_number", type=SERIAL)
@@ -99,15 +115,18 @@ def xp_lightlevel_get(
99
115
  ctx: click.Context, serial_number: str, output_number: int
100
116
  ) -> None:
101
117
  """Get current light level for output_number on XP module serial_number
102
-
103
118
  Examples:
104
-
105
119
  \b
106
120
  xp conbus lightlevel get 0123450001 2 # Get light level for output 2
107
121
  xp conbus lightlevel get 0011223344 0 # Get light level for output 0
108
122
  """
109
- service = ctx.obj.get("container").get_container().resolve(ConbusLightlevelService)
110
123
 
111
- with service:
112
- response = service.get_lightlevel(serial_number, output_number)
124
+ def finish(response: "ConbusLightlevelResponse") -> None:
113
125
  click.echo(json.dumps(response.to_dict(), indent=2))
126
+
127
+ service = (
128
+ ctx.obj.get("container").get_container().resolve(ConbusLightlevelSetService)
129
+ )
130
+
131
+ with service:
132
+ service.get_lightlevel(serial_number, output_number, finish, 0.5)
@@ -0,0 +1,51 @@
1
+ """Conbus raw telegram CLI commands."""
2
+
3
+ import json
4
+
5
+ import click
6
+ from click import Context
7
+
8
+ from xp.cli.commands.conbus.conbus import conbus
9
+ from xp.cli.utils.decorators import (
10
+ connection_command,
11
+ )
12
+ from xp.models.conbus.conbus_raw import ConbusRawResponse
13
+ from xp.services.conbus.conbus_raw_service import ConbusRawService
14
+
15
+
16
+ @conbus.command("raw")
17
+ @click.argument("raw_telegrams")
18
+ @click.pass_context
19
+ @connection_command()
20
+ def send_raw_telegrams(ctx: Context, raw_telegrams: str) -> None:
21
+ """
22
+ Send raw telegram sequence to Conbus server.
23
+
24
+ Accepts a string containing one or more telegrams in format <...>.
25
+ Multiple telegrams should be concatenated without separators.
26
+
27
+ Examples:
28
+
29
+ \b
30
+ xp conbus raw '<S2113010000F02D12>'
31
+ xp conbus raw '<S2113010000F02D12><S2113010001F02D12><S2113010002F02D12>'
32
+ xp conbus raw '<S0012345003F02D12FM><S0012345004F02D12FD><S0012345005F02D12FI><S0012345006F02D12FL><S0012345007F02D12FK><S0012345008F02D12FJ><S0012345009F02D12FF>'
33
+ """
34
+ service: ConbusRawService = (
35
+ ctx.obj.get("container").get_container().resolve(ConbusRawService)
36
+ )
37
+
38
+ def on_progress(message: str) -> None:
39
+ click.echo(message)
40
+ pass
41
+
42
+ def on_finish(service_response: ConbusRawResponse) -> None:
43
+ click.echo(json.dumps(service_response.to_dict(), indent=2))
44
+
45
+ with service:
46
+ service.send_raw_telegram(
47
+ raw_input=raw_telegrams,
48
+ progress_callback=on_progress,
49
+ finish_callback=on_finish,
50
+ timeout_seconds=5.0,
51
+ )
@@ -31,10 +31,30 @@ class ConbusBlinkResponse:
31
31
 
32
32
  def to_dict(self) -> Dict[str, Any]:
33
33
  """Convert to dictionary for JSON serialization"""
34
- return {
34
+ result = {
35
35
  "success": self.success,
36
- "sent_telegram": self.sent_telegram,
37
- "received_telegrams": self.received_telegrams,
38
- "error": self.error,
36
+ "serial_number": self.serial_number,
37
+ "operation": self.operation,
38
+ "system_function": (
39
+ self.system_function.name if self.system_function else None
40
+ ),
41
+ "sent_telegram": (
42
+ self.sent_telegram.to_dict()
43
+ if self.sent_telegram and hasattr(self.sent_telegram, "to_dict")
44
+ else str(self.sent_telegram) if self.sent_telegram else None
45
+ ),
46
+ "reply_telegram": (
47
+ self.reply_telegram.to_dict()
48
+ if self.reply_telegram and hasattr(self.reply_telegram, "to_dict")
49
+ else str(self.reply_telegram) if self.reply_telegram else None
50
+ ),
39
51
  "timestamp": self.timestamp.isoformat() if self.timestamp else None,
40
52
  }
53
+
54
+ # Only include these if they have values
55
+ if self.received_telegrams:
56
+ result["received_telegrams"] = self.received_telegrams
57
+ if self.error:
58
+ result["error"] = self.error
59
+
60
+ return result
@@ -79,22 +79,29 @@ class ConbusAutoreportGetService(ConbusProtocol):
79
79
  telegram_received.frame
80
80
  )
81
81
  if (
82
- reply_telegram is not None
83
- and reply_telegram.system_function == SystemFunction.READ_DATAPOINT
84
- and reply_telegram.datapoint_type == DataPointType.AUTO_REPORT_STATUS
82
+ not reply_telegram
83
+ or reply_telegram.system_function != SystemFunction.READ_DATAPOINT
84
+ or reply_telegram.datapoint_type != DataPointType.AUTO_REPORT_STATUS
85
85
  ):
86
- self.logger.debug("Received autoreport status telegram")
87
- self.service_response.success = True
88
- self.service_response.timestamp = datetime.now()
89
- self.service_response.serial_number = self.serial_number
90
- self.service_response.auto_report_status = reply_telegram.data_value
86
+ self.logger.debug("Not an autoreport reply")
87
+ return
88
+
89
+ autoreport_status = reply_telegram.data_value
90
+ self.succeed(autoreport_status)
91
91
 
92
- if self.finish_callback:
93
- self.finish_callback(self.service_response)
92
+ def succeed(self, autoreport_status: str) -> None:
93
+ self.logger.debug("Received autoreport status: {autoreport_status}")
94
+ self.service_response.success = True
95
+ self.service_response.serial_number = self.serial_number
96
+ self.service_response.timestamp = datetime.now()
97
+ self.service_response.auto_report_status = autoreport_status
98
+ if self.finish_callback:
99
+ self.finish_callback(self.service_response)
94
100
 
95
101
  def failed(self, message: str) -> None:
96
102
  self.logger.debug(f"Failed with message: {message}")
97
103
  self.service_response.success = False
104
+ self.service_response.serial_number = self.serial_number
98
105
  self.service_response.timestamp = datetime.now()
99
106
  self.service_response.error = message
100
107
  if self.finish_callback:
@@ -0,0 +1,162 @@
1
+ """Conbus Client Send Service for TCP communication with Conbus servers.
2
+
3
+ This service implements a TCP client that connects to Conbus servers and sends
4
+ various types of telegrams including discover, version, and sensor data requests.
5
+ """
6
+
7
+ import logging
8
+ from datetime import datetime
9
+ from typing import Callable, Optional
10
+
11
+ from twisted.internet.posixbase import PosixReactorBase
12
+
13
+ from xp.models import ConbusClientConfig
14
+ from xp.models.conbus.conbus_blink import ConbusBlinkResponse
15
+ from xp.models.protocol.conbus_protocol import TelegramReceivedEvent
16
+ from xp.models.telegram.system_function import SystemFunction
17
+ from xp.models.telegram.telegram_type import TelegramType
18
+ from xp.services.protocol import ConbusProtocol
19
+ from xp.services.telegram.telegram_service import TelegramService
20
+
21
+
22
+ class ConbusBlinkAllService(ConbusProtocol):
23
+ """
24
+ Service for receiving telegrams from Conbus servers.
25
+
26
+ Uses composition with ConbusService to provide receive-only functionality
27
+ for collecting waiting event telegrams from the server.
28
+ """
29
+
30
+ def __init__(
31
+ self,
32
+ telegram_service: TelegramService,
33
+ cli_config: ConbusClientConfig,
34
+ reactor: PosixReactorBase,
35
+ ) -> None:
36
+ """Initialize the Conbus client send service"""
37
+ super().__init__(cli_config, reactor)
38
+ self.telegram_service = telegram_service
39
+ self.serial_number: str = ""
40
+ self.on_or_off = "none"
41
+ self.progress_callback: Optional[Callable[[str], None]] = None
42
+ self.finish_callback: Optional[Callable[[ConbusBlinkResponse], None]] = None
43
+ self.service_response: ConbusBlinkResponse = ConbusBlinkResponse(
44
+ success=False,
45
+ serial_number=self.serial_number,
46
+ system_function=SystemFunction.NONE,
47
+ operation=self.on_or_off,
48
+ )
49
+
50
+ # Set up logging
51
+ self.logger = logging.getLogger(__name__)
52
+
53
+ def connection_established(self) -> None:
54
+ self.logger.debug("Connection established, send discover telegram...")
55
+ self.send_telegram(
56
+ telegram_type=TelegramType.SYSTEM,
57
+ serial_number="0000000000",
58
+ system_function=SystemFunction.DISCOVERY,
59
+ data_value="00",
60
+ )
61
+ if self.progress_callback:
62
+ self.progress_callback(".")
63
+
64
+ def send_blink(self, serial_number: str) -> None:
65
+ self.logger.debug("Device discovered, send blink...")
66
+
67
+ # Blink is 05, Unblink is 06
68
+ system_function = SystemFunction.UNBLINK
69
+ if self.on_or_off.lower() == "on":
70
+ system_function = SystemFunction.BLINK
71
+
72
+ self.send_telegram(
73
+ telegram_type=TelegramType.SYSTEM,
74
+ serial_number=serial_number,
75
+ system_function=system_function,
76
+ data_value="00",
77
+ )
78
+ self.service_response.system_function = system_function
79
+ self.service_response.operation = self.on_or_off
80
+
81
+ if self.progress_callback:
82
+ self.progress_callback(".")
83
+
84
+ def telegram_sent(self, telegram_sent: str) -> None:
85
+ system_telegram = self.telegram_service.parse_system_telegram(telegram_sent)
86
+ self.service_response.sent_telegram = system_telegram
87
+
88
+ def telegram_received(self, telegram_received: TelegramReceivedEvent) -> None:
89
+
90
+ self.logger.debug(f"Telegram received: {telegram_received}")
91
+ if not self.service_response.received_telegrams:
92
+ self.service_response.received_telegrams = []
93
+ self.service_response.received_telegrams.append(telegram_received.frame)
94
+
95
+ if (
96
+ not telegram_received.checksum_valid
97
+ or telegram_received.telegram_type != TelegramType.REPLY
98
+ ):
99
+ self.logger.debug("Not a reply")
100
+ return
101
+
102
+ reply_telegram = self.telegram_service.parse_reply_telegram(
103
+ telegram_received.frame
104
+ )
105
+ if (
106
+ reply_telegram
107
+ and reply_telegram.system_function == SystemFunction.DISCOVERY
108
+ ):
109
+ self.logger.debug("Received discovery response")
110
+ self.send_blink(reply_telegram.serial_number)
111
+ if self.progress_callback:
112
+ self.progress_callback(".")
113
+ return
114
+
115
+ if reply_telegram and reply_telegram.system_function in (
116
+ SystemFunction.BLINK,
117
+ SystemFunction.UNBLINK,
118
+ ):
119
+ self.logger.debug("Received blink response")
120
+ if self.progress_callback:
121
+ self.progress_callback(".")
122
+ return
123
+
124
+ self.logger.debug("Received unexpected response")
125
+
126
+ def failed(self, message: str) -> None:
127
+ self.logger.debug(f"Failed with message: {message}")
128
+ self.service_response.success = False
129
+ self.service_response.timestamp = datetime.now()
130
+ self.service_response.error = message
131
+ if self.finish_callback:
132
+ self.finish_callback(self.service_response)
133
+
134
+ def send_blink_all_telegram(
135
+ self,
136
+ on_or_off: str,
137
+ progress_callback: Callable[[str], None],
138
+ finish_callback: Callable[[ConbusBlinkResponse], None],
139
+ timeout_seconds: Optional[float] = None,
140
+ ) -> None:
141
+ """
142
+ Get the current auto report status for a specific module.
143
+
144
+ Args:
145
+ on_or_off: blink or unblink device
146
+ finish_callback: callback function to call when the autoreport status is
147
+ timeout_seconds: timeout in seconds
148
+
149
+ Returns:
150
+ ConbusAutoreportResponse with operation result and auto report status
151
+
152
+ Raises:
153
+ ConbusAutoreportError: If the operation fails
154
+ """
155
+
156
+ self.logger.info("Starting get_autoreport_status")
157
+ if timeout_seconds:
158
+ self.timeout_seconds = timeout_seconds
159
+ self.progress_callback = progress_callback
160
+ self.finish_callback = finish_callback
161
+ self.on_or_off = on_or_off
162
+ self.start_reactor()
@@ -0,0 +1,134 @@
1
+ """Conbus Client Send Service for TCP communication with Conbus servers.
2
+
3
+ This service implements a TCP client that connects to Conbus servers and sends
4
+ various types of telegrams including discover, version, and sensor data requests.
5
+ """
6
+
7
+ import logging
8
+ from datetime import datetime
9
+ from typing import Callable, Optional
10
+
11
+ from twisted.internet.posixbase import PosixReactorBase
12
+
13
+ from xp.models import ConbusClientConfig
14
+ from xp.models.conbus.conbus_blink import ConbusBlinkResponse
15
+ from xp.models.protocol.conbus_protocol import TelegramReceivedEvent
16
+ from xp.models.telegram.system_function import SystemFunction
17
+ from xp.models.telegram.telegram_type import TelegramType
18
+ from xp.services.protocol import ConbusProtocol
19
+ from xp.services.telegram.telegram_service import TelegramService
20
+
21
+
22
+ class ConbusBlinkService(ConbusProtocol):
23
+ """
24
+ Service for receiving telegrams from Conbus servers.
25
+
26
+ Uses composition with ConbusService to provide receive-only functionality
27
+ for collecting waiting event telegrams from the server.
28
+ """
29
+
30
+ def __init__(
31
+ self,
32
+ telegram_service: TelegramService,
33
+ cli_config: ConbusClientConfig,
34
+ reactor: PosixReactorBase,
35
+ ) -> None:
36
+ """Initialize the Conbus client send service"""
37
+ super().__init__(cli_config, reactor)
38
+ self.telegram_service = telegram_service
39
+ self.serial_number: str = ""
40
+ self.on_or_off = "none"
41
+ self.finish_callback: Optional[Callable[[ConbusBlinkResponse], None]] = None
42
+ self.service_response: ConbusBlinkResponse = ConbusBlinkResponse(
43
+ success=False,
44
+ serial_number=self.serial_number,
45
+ system_function=SystemFunction.NONE,
46
+ operation=self.on_or_off,
47
+ )
48
+
49
+ # Set up logging
50
+ self.logger = logging.getLogger(__name__)
51
+
52
+ def connection_established(self) -> None:
53
+ self.logger.debug("Connection established, retrieving autoreport status...")
54
+ # Blink is 05, Unblink is 06
55
+ system_function = SystemFunction.UNBLINK
56
+ if self.on_or_off.lower() == "on":
57
+ system_function = SystemFunction.BLINK
58
+
59
+ self.send_telegram(
60
+ telegram_type=TelegramType.SYSTEM,
61
+ serial_number=self.serial_number,
62
+ system_function=system_function,
63
+ data_value="00",
64
+ )
65
+ self.service_response.system_function = system_function
66
+ self.service_response.operation = self.on_or_off
67
+
68
+ def telegram_sent(self, telegram_sent: str) -> None:
69
+ system_telegram = self.telegram_service.parse_system_telegram(telegram_sent)
70
+ self.service_response.sent_telegram = system_telegram
71
+
72
+ def telegram_received(self, telegram_received: TelegramReceivedEvent) -> None:
73
+
74
+ self.logger.debug(f"Telegram received: {telegram_received}")
75
+ if not self.service_response.received_telegrams:
76
+ self.service_response.received_telegrams = []
77
+ self.service_response.received_telegrams.append(telegram_received.frame)
78
+
79
+ if (
80
+ not telegram_received.checksum_valid
81
+ or telegram_received.telegram_type != TelegramType.REPLY
82
+ or telegram_received.serial_number != self.serial_number
83
+ ):
84
+ self.logger.debug("Not a reply")
85
+ return
86
+
87
+ reply_telegram = self.telegram_service.parse_reply_telegram(
88
+ telegram_received.frame
89
+ )
90
+ if reply_telegram is not None and reply_telegram.system_function in (
91
+ SystemFunction.ACK,
92
+ SystemFunction.NAK,
93
+ ):
94
+ self.logger.debug("Received blink response")
95
+ self.service_response.success = True
96
+ self.service_response.timestamp = datetime.now()
97
+ self.service_response.serial_number = self.serial_number
98
+ self.service_response.reply_telegram = reply_telegram
99
+
100
+ if self.finish_callback:
101
+ self.finish_callback(self.service_response)
102
+
103
+ def failed(self, message: str) -> None:
104
+ self.logger.debug(f"Failed with message: {message}")
105
+ self.service_response.success = False
106
+ self.service_response.timestamp = datetime.now()
107
+ self.service_response.error = message
108
+ if self.finish_callback:
109
+ self.finish_callback(self.service_response)
110
+
111
+ def send_blink_telegram(
112
+ self,
113
+ serial_number: str,
114
+ on_or_off: str,
115
+ finish_callback: Callable[[ConbusBlinkResponse], None],
116
+ timeout_seconds: Optional[float] = None,
117
+ ) -> None:
118
+ """
119
+ Send blink command to start blinking module LED.
120
+
121
+ Examples:
122
+
123
+ \b
124
+ xp conbus blink 0012345008 on
125
+ xp conbus blink 0012345008 off
126
+ """
127
+
128
+ self.logger.info("Starting get_autoreport_status")
129
+ if timeout_seconds:
130
+ self.timeout_seconds = timeout_seconds
131
+ self.finish_callback = finish_callback
132
+ self.serial_number = serial_number
133
+ self.on_or_off = on_or_off
134
+ self.start_reactor()
@@ -59,8 +59,8 @@ class ConbusDiscoverService(ConbusProtocol):
59
59
  self.discovered_device_result.received_telegrams.append(telegram_received.frame)
60
60
 
61
61
  if (
62
- telegram_received.telegram_type == TelegramType.REPLY.value
63
- and telegram_received.checksum_valid
62
+ telegram_received.checksum_valid
63
+ and telegram_received.telegram_type == TelegramType.REPLY.value
64
64
  and telegram_received.payload[11:16] == "F01D"
65
65
  and len(telegram_received.payload) == 15
66
66
  ):