conson-xp 1.11.0__tar.gz → 1.15.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 (264) hide show
  1. {conson_xp-1.11.0 → conson_xp-1.15.0}/PKG-INFO +6 -1
  2. {conson_xp-1.11.0 → conson_xp-1.15.0}/README.md +5 -0
  3. {conson_xp-1.11.0 → conson_xp-1.15.0}/pyproject.toml +1 -1
  4. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/__init__.py +1 -1
  5. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/__init__.py +8 -0
  6. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus.py +13 -0
  7. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_linknumber_commands.py +1 -1
  8. conson_xp-1.15.0/src/xp/cli/commands/conbus/conbus_modulenumber_commands.py +104 -0
  9. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/homekit/homekit_config.py +4 -0
  10. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/protocol/conbus_protocol.py +4 -0
  11. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/write_config_service.py +1 -0
  12. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/homekit_conbus_service.py +5 -9
  13. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/homekit_lightbulb_service.py +2 -0
  14. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/homekit_outlet_service.py +2 -0
  15. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/telegram/telegram_datapoint_service.py +12 -0
  16. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/utils/dependencies.py +2 -0
  17. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_homekit_config_integration.py +12 -0
  18. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_homekit_config_validator.py +36 -0
  19. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_homekit_services.py +16 -4
  20. {conson_xp-1.11.0 → conson_xp-1.15.0}/LICENSE +0 -0
  21. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/__init__.py +0 -0
  22. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/__main__.py +0 -0
  23. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/__init__.py +0 -0
  24. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_actiontable_commands.py +0 -0
  25. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_autoreport_commands.py +0 -0
  26. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_blink_commands.py +0 -0
  27. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_config_commands.py +0 -0
  28. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_custom_commands.py +0 -0
  29. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_datapoint_commands.py +0 -0
  30. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_discover_commands.py +0 -0
  31. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_lightlevel_commands.py +0 -0
  32. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_msactiontable_commands.py +0 -0
  33. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_output_commands.py +0 -0
  34. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_raw_commands.py +0 -0
  35. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_receive_commands.py +0 -0
  36. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/conbus/conbus_scan_commands.py +0 -0
  37. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/file_commands.py +0 -0
  38. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/homekit/__init__.py +0 -0
  39. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/homekit/homekit.py +0 -0
  40. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/homekit/homekit_start_commands.py +0 -0
  41. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/module_commands.py +0 -0
  42. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/reverse_proxy_commands.py +0 -0
  43. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/server/__init__.py +0 -0
  44. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/server/server_commands.py +0 -0
  45. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/telegram/__init__.py +0 -0
  46. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/telegram/telegram.py +0 -0
  47. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/telegram/telegram_blink_commands.py +0 -0
  48. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/telegram/telegram_checksum_commands.py +0 -0
  49. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/telegram/telegram_discover_commands.py +0 -0
  50. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/telegram/telegram_linknumber_commands.py +0 -0
  51. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/telegram/telegram_parse_commands.py +0 -0
  52. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/commands/telegram/telegram_version_commands.py +0 -0
  53. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/main.py +0 -0
  54. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/utils/__init__.py +0 -0
  55. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/utils/click_tree.py +0 -0
  56. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/utils/datapoint_type_choice.py +0 -0
  57. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/utils/decorators.py +0 -0
  58. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/utils/error_handlers.py +0 -0
  59. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/utils/formatters.py +0 -0
  60. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/utils/serial_number_type.py +0 -0
  61. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/utils/system_function_choice.py +0 -0
  62. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/cli/utils/xp_module_type.py +0 -0
  63. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/connection/__init__.py +0 -0
  64. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/connection/exceptions.py +0 -0
  65. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/__init__.py +0 -0
  66. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/actiontable/__init__.py +0 -0
  67. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/actiontable/actiontable.py +0 -0
  68. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/actiontable/msactiontable_xp20.py +0 -0
  69. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/actiontable/msactiontable_xp24.py +0 -0
  70. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/actiontable/msactiontable_xp33.py +0 -0
  71. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/__init__.py +0 -0
  72. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus.py +0 -0
  73. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus_autoreport.py +0 -0
  74. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus_blink.py +0 -0
  75. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus_client_config.py +0 -0
  76. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus_connection_status.py +0 -0
  77. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus_custom.py +0 -0
  78. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus_datapoint.py +0 -0
  79. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus_discover.py +0 -0
  80. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus_lightlevel.py +0 -0
  81. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus_linknumber.py +0 -0
  82. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus_output.py +0 -0
  83. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus_raw.py +0 -0
  84. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus_receive.py +0 -0
  85. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/conbus/conbus_writeconfig.py +0 -0
  86. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/homekit/__init__.py +0 -0
  87. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/homekit/homekit_accessory.py +0 -0
  88. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/homekit/homekit_conson_config.py +0 -0
  89. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/log_entry.py +0 -0
  90. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/protocol/__init__.py +0 -0
  91. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/response.py +0 -0
  92. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/__init__.py +0 -0
  93. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/action_type.py +0 -0
  94. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/datapoint_type.py +0 -0
  95. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/event_telegram.py +0 -0
  96. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/event_type.py +0 -0
  97. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/input_action_type.py +0 -0
  98. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/input_type.py +0 -0
  99. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/module_type.py +0 -0
  100. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/module_type_code.py +0 -0
  101. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/output_telegram.py +0 -0
  102. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/reply_telegram.py +0 -0
  103. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/system_function.py +0 -0
  104. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/system_telegram.py +0 -0
  105. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/telegram.py +0 -0
  106. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/telegram_type.py +0 -0
  107. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/telegram/timeparam_type.py +0 -0
  108. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/models/write_config_type.py +0 -0
  109. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/__init__.py +0 -0
  110. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/actiontable/__init__.py +0 -0
  111. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/actiontable/actiontable_serializer.py +0 -0
  112. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/actiontable/msactiontable_serializer.py +0 -0
  113. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/actiontable/msactiontable_xp20_serializer.py +0 -0
  114. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/actiontable/msactiontable_xp24_serializer.py +0 -0
  115. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/actiontable/msactiontable_xp33_serializer.py +0 -0
  116. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/__init__.py +0 -0
  117. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/actiontable/__init__.py +0 -0
  118. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/actiontable/actiontable_download_service.py +0 -0
  119. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/actiontable/actiontable_list_service.py +0 -0
  120. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/actiontable/actiontable_show_service.py +0 -0
  121. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/actiontable/actiontable_upload_service.py +0 -0
  122. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/actiontable/msactiontable_service.py +0 -0
  123. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/conbus_blink_all_service.py +0 -0
  124. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/conbus_blink_service.py +0 -0
  125. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/conbus_custom_service.py +0 -0
  126. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/conbus_datapoint_queryall_service.py +0 -0
  127. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/conbus_datapoint_service.py +0 -0
  128. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/conbus_discover_service.py +0 -0
  129. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/conbus_output_service.py +0 -0
  130. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/conbus_raw_service.py +0 -0
  131. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/conbus_receive_service.py +0 -0
  132. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/conbus/conbus_scan_service.py +0 -0
  133. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/__init__.py +0 -0
  134. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/homekit_cache_service.py +0 -0
  135. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/homekit_config_validator.py +0 -0
  136. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/homekit_conson_validator.py +0 -0
  137. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/homekit_dimminglight.py +0 -0
  138. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/homekit_dimminglight_service.py +0 -0
  139. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/homekit_hap_service.py +0 -0
  140. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/homekit_lightbulb.py +0 -0
  141. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/homekit_module_service.py +0 -0
  142. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/homekit_outlet.py +0 -0
  143. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/homekit/homekit_service.py +0 -0
  144. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/log_file_service.py +0 -0
  145. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/module_type_service.py +0 -0
  146. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/protocol/__init__.py +0 -0
  147. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/protocol/conbus_protocol.py +0 -0
  148. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/protocol/protocol_factory.py +0 -0
  149. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/protocol/telegram_protocol.py +0 -0
  150. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/reverse_proxy_service.py +0 -0
  151. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/server/__init__.py +0 -0
  152. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/server/base_server_service.py +0 -0
  153. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/server/cp20_server_service.py +0 -0
  154. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/server/device_service_factory.py +0 -0
  155. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/server/server_service.py +0 -0
  156. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/server/xp130_server_service.py +0 -0
  157. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/server/xp20_server_service.py +0 -0
  158. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/server/xp230_server_service.py +0 -0
  159. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/server/xp24_server_service.py +0 -0
  160. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/server/xp33_server_service.py +0 -0
  161. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/telegram/__init__.py +0 -0
  162. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/telegram/telegram_blink_service.py +0 -0
  163. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/telegram/telegram_checksum_service.py +0 -0
  164. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/telegram/telegram_discover_service.py +0 -0
  165. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/telegram/telegram_link_number_service.py +0 -0
  166. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/telegram/telegram_output_service.py +0 -0
  167. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/telegram/telegram_service.py +0 -0
  168. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/services/telegram/telegram_version_service.py +0 -0
  169. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/utils/__init__.py +0 -0
  170. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/utils/checksum.py +0 -0
  171. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/utils/event_helper.py +0 -0
  172. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/utils/serialization.py +0 -0
  173. {conson_xp-1.11.0 → conson_xp-1.15.0}/src/xp/utils/time_utils.py +0 -0
  174. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/.coverage +0 -0
  175. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/__init__.py +0 -0
  176. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/conftest.py +0 -0
  177. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/.coverage +0 -0
  178. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/__init__.py +0 -0
  179. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/telegram_test_data.py +0 -0
  180. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_actiontable_integration.py +0 -0
  181. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_api/.coverage +0 -0
  182. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_api/__init__.py +0 -0
  183. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_blink_integration.py +0 -0
  184. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_checksum_integration.py +0 -0
  185. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_conbus_blink_integration.py +0 -0
  186. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_conbus_datapoint_integration.py +0 -0
  187. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_conbus_raw_integration.py +0 -0
  188. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_conbus_receive_integration.py +0 -0
  189. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_discovery_integration.py +0 -0
  190. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_event_telegram_integration.py +0 -0
  191. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_link_number_integration.py +0 -0
  192. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_module_integration.py +0 -0
  193. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_output_integration.py +0 -0
  194. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_reverse_proxy_integration.py +0 -0
  195. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_system_reply_telegram_integration.py +0 -0
  196. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_version_integration.py +0 -0
  197. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_xp20_action_table_integration.py +0 -0
  198. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/integration/test_xp24_action_table_integration.py +0 -0
  199. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/__init__.py +0 -0
  200. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_api/__init__.py +0 -0
  201. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_cli/__init__.py +0 -0
  202. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_cli/test_click_tree.py +0 -0
  203. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_cli/test_conbus_actiontable_commands.py +0 -0
  204. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_cli/test_conbus_blink_commands.py +0 -0
  205. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_cli/test_datapoint_type_choice.py +0 -0
  206. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_cli/test_decorators.py +0 -0
  207. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_cli/test_error_handlers.py +0 -0
  208. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_cli/test_formatters.py +0 -0
  209. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_cli/test_serial_number_type.py +0 -0
  210. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_cli/test_system_function_choice.py +0 -0
  211. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_connection/__init__.py +0 -0
  212. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_connection/test_connection_init.py +0 -0
  213. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_connection/test_exceptions.py +0 -0
  214. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_encoding/__init__.py +0 -0
  215. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_encoding/test_latin1_edge_cases.py +0 -0
  216. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/__init__.py +0 -0
  217. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_conbus.py +0 -0
  218. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_conbus_client_send.py +0 -0
  219. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_conbus_discover.py +0 -0
  220. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_conbus_linknumber.py +0 -0
  221. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_event_telegram.py +0 -0
  222. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_log_entry.py +0 -0
  223. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_module_type.py +0 -0
  224. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_reply_telegram.py +0 -0
  225. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_system_telegram.py +0 -0
  226. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_system_telegram_enhancements.py +0 -0
  227. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_version_telegram.py +0 -0
  228. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_write_config_type.py +0 -0
  229. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_xp20_action_table.py +0 -0
  230. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_xp24_action_table.py +0 -0
  231. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_models/test_xp24_action_telegram.py +0 -0
  232. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/__init__.py +0 -0
  233. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_actiontable_serializer.py +0 -0
  234. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_actiontable_service.py +0 -0
  235. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_actiontable_upload_service.py +0 -0
  236. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_base_server_service.py +0 -0
  237. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_blink_service.py +0 -0
  238. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_checksum_service.py +0 -0
  239. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_conbus_blink_service.py +0 -0
  240. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_conbus_raw_service.py +0 -0
  241. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_conbus_reverse_proxy_service.py +0 -0
  242. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_device_service_factory.py +0 -0
  243. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_discovery_service.py +0 -0
  244. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_homekit_cache_service.py +0 -0
  245. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_homekit_conson_service.py +0 -0
  246. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_log_file_service.py +0 -0
  247. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_module_type_service.py +0 -0
  248. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_protocol.py +0 -0
  249. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_server_service.py +0 -0
  250. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_telegram_input_service.py +0 -0
  251. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_telegram_protocol.py +0 -0
  252. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_telegram_service.py +0 -0
  253. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_version_service.py +0 -0
  254. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_xp20_action_table_serializer.py +0 -0
  255. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_xp24_action_service.py +0 -0
  256. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_xp24_action_table_serializer.py +0 -0
  257. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_xp24_action_table_service.py +0 -0
  258. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_xp33_action_table_serializer.py +0 -0
  259. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_services/test_xp_server_services.py +0 -0
  260. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_utils/__init__.py +0 -0
  261. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_utils/test_checksum.py +0 -0
  262. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_utils/test_event_helper.py +0 -0
  263. {conson_xp-1.11.0 → conson_xp-1.15.0}/tests/unit/test_utils/test_serialization.py +0 -0
  264. {conson_xp-1.11.0 → conson_xp-1.15.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.11.0
3
+ Version: 1.15.0
4
4
  Summary: XP Protocol Communication Tools
5
5
  Author-Email: ldvchosal <ldvchosal@github.com>
6
6
  License: MIT License
@@ -316,6 +316,11 @@ xp conbus linknumber get
316
316
  xp conbus linknumber set
317
317
 
318
318
 
319
+ xp conbus modulenumber
320
+ xp conbus modulenumber get
321
+ xp conbus modulenumber set
322
+
323
+
319
324
  xp conbus msactiontable
320
325
  xp conbus msactiontable download
321
326
 
@@ -265,6 +265,11 @@ xp conbus linknumber get
265
265
  xp conbus linknumber set
266
266
 
267
267
 
268
+ xp conbus modulenumber
269
+ xp conbus modulenumber get
270
+ xp conbus modulenumber set
271
+
272
+
268
273
  xp conbus msactiontable
269
274
  xp conbus msactiontable download
270
275
 
@@ -20,7 +20,7 @@ dependencies = [
20
20
  ]
21
21
  requires-python = ">=3.11"
22
22
  readme = "README.md"
23
- version = "1.11.0"
23
+ version = "1.15.0"
24
24
 
25
25
  [project.license]
26
26
  file = "LICENSE"
@@ -3,7 +3,7 @@
3
3
  conson-xp package.
4
4
  """
5
5
 
6
- __version__ = "1.11.0"
6
+ __version__ = "1.15.0"
7
7
  __manufacturer__ = "salchichon"
8
8
  __model__ = "xp.cli"
9
9
  __serial__ = "2025.09.23.000"
@@ -10,6 +10,7 @@ from xp.cli.commands.conbus.conbus import (
10
10
  conbus_datapoint,
11
11
  conbus_lightlevel,
12
12
  conbus_linknumber,
13
+ conbus_modulenumber,
13
14
  conbus_msactiontable,
14
15
  conbus_output,
15
16
  )
@@ -46,6 +47,10 @@ from xp.cli.commands.conbus.conbus_linknumber_commands import (
46
47
  get_linknumber_command,
47
48
  set_linknumber_command,
48
49
  )
50
+ from xp.cli.commands.conbus.conbus_modulenumber_commands import (
51
+ get_modulenumber_command,
52
+ set_modulenumber_command,
53
+ )
49
54
  from xp.cli.commands.conbus.conbus_msactiontable_commands import (
50
55
  conbus_download_msactiontable,
51
56
  )
@@ -87,6 +92,7 @@ __all__ = [
87
92
  "conbus_output",
88
93
  "conbus_datapoint",
89
94
  "conbus_linknumber",
95
+ "conbus_modulenumber",
90
96
  "conbus_autoreport",
91
97
  "conbus_lightlevel",
92
98
  "conbus_msactiontable",
@@ -123,6 +129,8 @@ __all__ = [
123
129
  "receive_telegrams",
124
130
  "set_linknumber_command",
125
131
  "get_linknumber_command",
132
+ "set_modulenumber_command",
133
+ "get_modulenumber_command",
126
134
  "get_autoreport_command",
127
135
  "set_autoreport_command",
128
136
  "xp_lightlevel_set",
@@ -57,6 +57,18 @@ def conbus_linknumber() -> None:
57
57
  pass
58
58
 
59
59
 
60
+ @click.group(
61
+ "modulenumber",
62
+ cls=HelpColorsGroup,
63
+ help_headers_color="yellow",
64
+ help_options_color="green",
65
+ short_help="Module number operations",
66
+ )
67
+ def conbus_modulenumber() -> None:
68
+ """Set or get the module number for specific modules."""
69
+ pass
70
+
71
+
60
72
  @click.group(
61
73
  "autoreport",
62
74
  cls=HelpColorsGroup,
@@ -109,6 +121,7 @@ conbus.add_command(conbus_blink)
109
121
  conbus.add_command(conbus_output)
110
122
  conbus.add_command(conbus_datapoint)
111
123
  conbus.add_command(conbus_linknumber)
124
+ conbus.add_command(conbus_modulenumber)
112
125
  conbus.add_command(conbus_autoreport)
113
126
  conbus.add_command(conbus_lightlevel)
114
127
  conbus.add_command(conbus_msactiontable)
@@ -49,7 +49,7 @@ def set_linknumber_command(
49
49
  ctx.obj.get("container").get_container().resolve(WriteConfigService)
50
50
  )
51
51
 
52
- data_value = f"{link_number: 02d}"
52
+ data_value = f"{link_number:02d}"
53
53
  with service:
54
54
  service.write_config(
55
55
  serial_number=serial_number,
@@ -0,0 +1,104 @@
1
+ """Conbus module number CLI commands."""
2
+
3
+ import json
4
+
5
+ import click
6
+
7
+ from xp.cli.commands.conbus.conbus import conbus_modulenumber
8
+ from xp.cli.utils.decorators import (
9
+ connection_command,
10
+ )
11
+ from xp.cli.utils.serial_number_type import SERIAL
12
+ from xp.models import ConbusDatapointResponse
13
+ from xp.models.conbus.conbus_writeconfig import ConbusWriteConfigResponse
14
+ from xp.models.telegram.datapoint_type import DataPointType
15
+ from xp.services.conbus.conbus_datapoint_service import ConbusDatapointService
16
+ from xp.services.conbus.write_config_service import WriteConfigService
17
+ from xp.services.telegram.telegram_datapoint_service import TelegramDatapointService
18
+
19
+
20
+ @conbus_modulenumber.command("set", short_help="Set module number for a module")
21
+ @click.argument("serial_number", type=SERIAL)
22
+ @click.argument("module_number", type=click.IntRange(0, 99))
23
+ @click.pass_context
24
+ @connection_command()
25
+ def set_modulenumber_command(
26
+ ctx: click.Context, serial_number: str, module_number: int
27
+ ) -> None:
28
+ r"""Set the module number for a specific module.
29
+
30
+ Args:
31
+ ctx: Click context object.
32
+ serial_number: 10-digit module serial number.
33
+ module_number: Module number to set (0-99).
34
+
35
+ Examples:
36
+ \b
37
+ xp conbus modulenumber set 0123450001 25
38
+ """
39
+
40
+ def on_finish(response: "ConbusWriteConfigResponse") -> None:
41
+ """Handle successful completion of light level on command.
42
+
43
+ Args:
44
+ response: Light level response object.
45
+ """
46
+ click.echo(json.dumps(response.to_dict(), indent=2))
47
+
48
+ service: WriteConfigService = (
49
+ ctx.obj.get("container").get_container().resolve(WriteConfigService)
50
+ )
51
+
52
+ data_value = f"{module_number:02d}"
53
+ with service:
54
+ service.write_config(
55
+ serial_number=serial_number,
56
+ datapoint_type=DataPointType.MODULE_NUMBER,
57
+ data_value=data_value,
58
+ finish_callback=on_finish,
59
+ timeout_seconds=0.5,
60
+ )
61
+
62
+
63
+ @conbus_modulenumber.command("get", short_help="Get module number for a module")
64
+ @click.argument("serial_number", type=SERIAL)
65
+ @click.pass_context
66
+ @connection_command()
67
+ def get_modulenumber_command(ctx: click.Context, serial_number: str) -> None:
68
+ r"""Get the current module number for a specific module.
69
+
70
+ Args:
71
+ ctx: Click context object.
72
+ serial_number: 10-digit module serial number.
73
+
74
+ Examples:
75
+ \b
76
+ xp conbus modulenumber get 0123450001
77
+ """
78
+ service: ConbusDatapointService = (
79
+ ctx.obj.get("container").get_container().resolve(ConbusDatapointService)
80
+ )
81
+ telegram_service: TelegramDatapointService = (
82
+ ctx.obj.get("container").get_container().resolve(TelegramDatapointService)
83
+ )
84
+
85
+ def on_finish(service_response: ConbusDatapointResponse) -> None:
86
+ """Handle successful completion of module number get command.
87
+
88
+ Args:
89
+ service_response: Module number response object.
90
+ """
91
+ modulenumber_value = telegram_service.get_modulenumber(
92
+ service_response.data_value
93
+ )
94
+ result = service_response.to_dict()
95
+ result["modulenumber_value"] = modulenumber_value
96
+ click.echo(json.dumps(result, indent=2))
97
+
98
+ with service:
99
+ service.query_datapoint(
100
+ serial_number=serial_number,
101
+ datapoint_type=DataPointType.MODULE_NUMBER,
102
+ finish_callback=on_finish,
103
+ timeout_seconds=0.5,
104
+ )
@@ -55,6 +55,8 @@ class HomekitAccessoryConfig(BaseModel):
55
55
  output_number: Output number for the accessory.
56
56
  description: Description of the accessory.
57
57
  service: Service type for the accessory.
58
+ on_action: on code for the accessory.
59
+ off_action: off code for the accessory.
58
60
  hap_accessory: Optional HAP accessory identifier.
59
61
  """
60
62
 
@@ -64,6 +66,8 @@ class HomekitAccessoryConfig(BaseModel):
64
66
  output_number: int
65
67
  description: str
66
68
  service: str
69
+ on_action: str
70
+ off_action: str
67
71
  hap_accessory: Optional[int] = None
68
72
 
69
73
 
@@ -61,11 +61,15 @@ class SendActionEvent(BaseEvent):
61
61
  serial_number: Serial number of the light bulb set.
62
62
  output_number: Output number of the light bulb set.
63
63
  value: Set light bulb On or Off (True/False).
64
+ on_action: On action E00L00I00.
65
+ off_action: On action E00L00I04.
64
66
  """
65
67
 
66
68
  serial_number: str = Field(description="Serial number of the light bulb set")
67
69
  output_number: int = Field(description="Output number of the light bulb set")
68
70
  value: bool = Field(description="Set light bulb On or Off (True/False)")
71
+ on_action: str = Field(description="on action")
72
+ off_action: str = Field(description="off action")
69
73
 
70
74
 
71
75
  class DatapointEvent(BaseEvent):
@@ -165,6 +165,7 @@ class WriteConfigService(ConbusProtocol):
165
165
  self.write_config_response.data_value = self.data_value
166
166
  if self.write_config_finished_callback:
167
167
  self.write_config_finished_callback(self.write_config_response)
168
+ self._stop_reactor()
168
169
 
169
170
  def write_config(
170
171
  self,
@@ -12,7 +12,6 @@ from xp.models.protocol.conbus_protocol import (
12
12
  SendActionEvent,
13
13
  SendWriteConfigEvent,
14
14
  )
15
- from xp.models.telegram.action_type import ActionType
16
15
  from xp.models.telegram.datapoint_type import DataPointType
17
16
  from xp.models.telegram.system_function import SystemFunction
18
17
  from xp.services.protocol.telegram_protocol import TelegramProtocol
@@ -87,11 +86,8 @@ class HomeKitConbusService:
87
86
  """
88
87
  self.logger.debug(f"send_action_event {event}")
89
88
 
90
- action_value = (
91
- ActionType.ON_RELEASE.value if event.value else ActionType.OFF_PRESS.value
92
- )
93
- input_action = f"{event.output_number:02d}{action_value}"
94
- telegram = (
95
- f"S{event.serial_number}F{SystemFunction.ACTION.value}D{input_action}"
96
- )
97
- self.telegram_protocol.sendFrame(telegram.encode())
89
+ telegram = event.on_action if event.value else event.off_action
90
+ telegram_make = f"{telegram}M"
91
+ telegram_break = f"{telegram}B"
92
+ self.telegram_protocol.sendFrame(telegram_make.encode())
93
+ self.telegram_protocol.sendFrame(telegram_break.encode())
@@ -77,6 +77,8 @@ class HomeKitLightbulbService:
77
77
  serial_number=event.serial_number,
78
78
  output_number=event.output_number,
79
79
  value=event.value,
80
+ on_action=event.accessory.on_action,
81
+ off_action=event.accessory.off_action,
80
82
  )
81
83
 
82
84
  self.logger.debug(f"Dispatching SendActionEvent for {event.serial_number}")
@@ -85,6 +85,8 @@ class HomeKitOutletService:
85
85
  serial_number=event.serial_number,
86
86
  output_number=event.output_number,
87
87
  value=event.value,
88
+ on_action=event.accessory.on_action,
89
+ off_action=event.accessory.off_action,
88
90
  )
89
91
 
90
92
  self.logger.debug(f"Dispatching SendActionEvent for {event.serial_number}")
@@ -68,3 +68,15 @@ class TelegramDatapointService:
68
68
  """
69
69
  link_number_value = int(data_value)
70
70
  return link_number_value
71
+
72
+ def get_modulenumber(self, data_value: str) -> int:
73
+ """Parse and return the module number value.
74
+
75
+ Args:
76
+ data_value: The raw module number data value as a string.
77
+
78
+ Returns:
79
+ The module number as an integer.
80
+ """
81
+ module_number_value = int(data_value)
82
+ return module_number_value
@@ -64,6 +64,7 @@ from xp.services.reverse_proxy_service import ReverseProxyService
64
64
  from xp.services.server.device_service_factory import DeviceServiceFactory
65
65
  from xp.services.server.server_service import ServerService
66
66
  from xp.services.telegram.telegram_blink_service import TelegramBlinkService
67
+ from xp.services.telegram.telegram_datapoint_service import TelegramDatapointService
67
68
  from xp.services.telegram.telegram_discover_service import TelegramDiscoverService
68
69
  from xp.services.telegram.telegram_link_number_service import LinkNumberService
69
70
  from xp.services.telegram.telegram_output_service import TelegramOutputService
@@ -128,6 +129,7 @@ class ServiceContainer:
128
129
  )
129
130
  self.container.register(TelegramDiscoverService, scope=punq.Scope.singleton)
130
131
  self.container.register(TelegramBlinkService, scope=punq.Scope.singleton)
132
+ self.container.register(TelegramDatapointService, scope=punq.Scope.singleton)
131
133
  self.container.register(LinkNumberService, scope=punq.Scope.singleton)
132
134
 
133
135
  # Conbus services layer
@@ -102,6 +102,8 @@ class TestHomekitConfigIntegration:
102
102
  "output_number": 1,
103
103
  "description": "Main Living Room Light",
104
104
  "service": "lightbulb",
105
+ "on_action": "E00L01I01",
106
+ "off_action": "E00L01I05",
105
107
  },
106
108
  {
107
109
  "name": "side_lamp",
@@ -110,6 +112,8 @@ class TestHomekitConfigIntegration:
110
112
  "output_number": 2,
111
113
  "description": "Side Lamp",
112
114
  "service": "lightbulb",
115
+ "on_action": "E00L01I02",
116
+ "off_action": "E00L01I06",
113
117
  },
114
118
  {
115
119
  "name": "kitchen_light",
@@ -118,6 +122,8 @@ class TestHomekitConfigIntegration:
118
122
  "output_number": 1,
119
123
  "description": "Kitchen Light",
120
124
  "service": "lightbulb",
125
+ "on_action": "E00L02I01",
126
+ "off_action": "E00L02I05",
121
127
  },
122
128
  ],
123
129
  }
@@ -194,6 +200,8 @@ class TestHomekitConfigIntegration:
194
200
  "output_number": 0, # Invalid output
195
201
  "description": "Main Light",
196
202
  "service": "invalid_service", # Invalid service
203
+ "on_action": "E00L01I01",
204
+ "off_action": "E00L01I05",
197
205
  },
198
206
  {
199
207
  "name": "main_light", # Duplicate accessory name
@@ -202,6 +210,8 @@ class TestHomekitConfigIntegration:
202
210
  "output_number": 50, # Output exceeds module capability
203
211
  "description": "Duplicate Light",
204
212
  "service": "lightbulb",
213
+ "on_action": "E00L01I02",
214
+ "off_action": "E00L01I06",
205
215
  },
206
216
  {
207
217
  "name": "orphaned_light", # Not assigned to any room
@@ -210,6 +220,8 @@ class TestHomekitConfigIntegration:
210
220
  "output_number": 3,
211
221
  "description": "Orphaned Light",
212
222
  "service": "lightbulb",
223
+ "on_action": "E00L01I03",
224
+ "off_action": "E00L01I07",
213
225
  },
214
226
  ],
215
227
  }
@@ -41,6 +41,8 @@ class TestHomekitConfigValidator:
41
41
  output_number=1,
42
42
  description="Light 1",
43
43
  service="lightbulb",
44
+ on_action="E00L01I01",
45
+ off_action="E00L01I05",
44
46
  ),
45
47
  HomekitAccessoryConfig(
46
48
  name="light2",
@@ -49,6 +51,8 @@ class TestHomekitConfigValidator:
49
51
  output_number=2,
50
52
  description="Light 2",
51
53
  service="lightbulb",
54
+ on_action="E00L01I02",
55
+ off_action="E00L01I06",
52
56
  ),
53
57
  ]
54
58
 
@@ -82,6 +86,8 @@ class TestHomekitConfigValidator:
82
86
  output_number=1,
83
87
  description="Light 1",
84
88
  service="lightbulb",
89
+ on_action="E00L01I01",
90
+ off_action="E00L01I05",
85
91
  ),
86
92
  HomekitAccessoryConfig(
87
93
  name="light1",
@@ -90,6 +96,8 @@ class TestHomekitConfigValidator:
90
96
  output_number=2,
91
97
  description="Light 2",
92
98
  service="lightbulb",
99
+ on_action="E00L01I02",
100
+ off_action="E00L01I06",
93
101
  ),
94
102
  ]
95
103
  config = self.create_test_homekit_config(accessories=accessories)
@@ -113,6 +121,8 @@ class TestHomekitConfigValidator:
113
121
  output_number=1,
114
122
  description="Light 1",
115
123
  service="invalid_service",
124
+ on_action="E00L01I01",
125
+ off_action="E00L01I05",
116
126
  )
117
127
  ]
118
128
  config = self.create_test_homekit_config(accessories=accessories)
@@ -136,6 +146,8 @@ class TestHomekitConfigValidator:
136
146
  output_number=0,
137
147
  description="Light 1",
138
148
  service="lightbulb",
149
+ on_action="E00L01I01",
150
+ off_action="E00L01I05",
139
151
  ),
140
152
  HomekitAccessoryConfig(
141
153
  name="light2",
@@ -144,6 +156,8 @@ class TestHomekitConfigValidator:
144
156
  output_number=-1,
145
157
  description="Light 2",
146
158
  service="lightbulb",
159
+ on_action="E00L01I02",
160
+ off_action="E00L01I06",
147
161
  ),
148
162
  ]
149
163
  config = self.create_test_homekit_config(accessories=accessories)
@@ -207,6 +221,8 @@ class TestHomekitConfigValidator:
207
221
  output_number=1,
208
222
  description="Light 1",
209
223
  service="lightbulb",
224
+ on_action="E00L01I01",
225
+ off_action="E00L01I05",
210
226
  ),
211
227
  HomekitAccessoryConfig(
212
228
  name="orphaned_light",
@@ -215,6 +231,8 @@ class TestHomekitConfigValidator:
215
231
  output_number=2,
216
232
  description="Orphaned",
217
233
  service="lightbulb",
234
+ on_action="E00L01I02",
235
+ off_action="E00L01I06",
218
236
  ),
219
237
  ]
220
238
  rooms = [RoomConfig(name="Living Room", accessories=["light1"])]
@@ -233,6 +251,8 @@ class TestHomekitConfigValidator:
233
251
  output_number=1,
234
252
  description="Light 1",
235
253
  service="lightbulb",
254
+ on_action="E00L01I01",
255
+ off_action="E00L01I05",
236
256
  ),
237
257
  HomekitAccessoryConfig(
238
258
  name="light2",
@@ -241,6 +261,8 @@ class TestHomekitConfigValidator:
241
261
  output_number=2,
242
262
  description="Light 2",
243
263
  service="lightbulb",
264
+ on_action="E00L01I02",
265
+ off_action="E00L01I06",
244
266
  ),
245
267
  ]
246
268
  rooms = [
@@ -263,6 +285,8 @@ class TestHomekitConfigValidator:
263
285
  output_number=1,
264
286
  description="Light 1",
265
287
  service="lightbulb",
288
+ on_action="E00L01I01",
289
+ off_action="E00L01I05",
266
290
  )
267
291
  ]
268
292
  rooms = [
@@ -316,6 +340,8 @@ class TestCrossReferenceValidator:
316
340
  output_number=1,
317
341
  description="Light 1",
318
342
  service="lightbulb",
343
+ on_action="E00L01I01",
344
+ off_action="E00L01I05",
319
345
  ),
320
346
  HomekitAccessoryConfig(
321
347
  name="light2",
@@ -324,6 +350,8 @@ class TestCrossReferenceValidator:
324
350
  output_number=1,
325
351
  description="Light 2",
326
352
  service="lightbulb",
353
+ on_action="E00L02I01",
354
+ off_action="E00L02I05",
327
355
  ),
328
356
  ]
329
357
  rooms = [RoomConfig(name="Living Room", accessories=["light1", "light2"])]
@@ -361,6 +389,8 @@ class TestCrossReferenceValidator:
361
389
  output_number=1,
362
390
  description="Invalid",
363
391
  service="lightbulb",
392
+ on_action="E00L03I01",
393
+ off_action="E00L03I05",
364
394
  )
365
395
  homekit_validator.config.accessories.append(invalid_accessory)
366
396
 
@@ -394,6 +424,8 @@ class TestCrossReferenceValidator:
394
424
  output_number=20,
395
425
  description="High Output",
396
426
  service="lightbulb",
427
+ on_action="E00L02I09",
428
+ off_action="E00L02I13",
397
429
  )
398
430
  homekit_validator.config.accessories.append(high_output_accessory)
399
431
 
@@ -425,6 +457,8 @@ class TestCrossReferenceValidator:
425
457
  output_number=1,
426
458
  description="Invalid Serial",
427
459
  service="lightbulb",
460
+ on_action="E00L03I01",
461
+ off_action="E00L03I05",
428
462
  ),
429
463
  HomekitAccessoryConfig(
430
464
  name="invalid_output",
@@ -433,6 +467,8 @@ class TestCrossReferenceValidator:
433
467
  output_number=20,
434
468
  description="Invalid Output",
435
469
  service="lightbulb",
470
+ on_action="E00L02I09",
471
+ off_action="E00L02I13",
436
472
  ),
437
473
  ]
438
474
  homekit_validator.config.accessories.extend(invalid_accessories)
@@ -68,6 +68,8 @@ def mock_accessory():
68
68
  output_number=2,
69
69
  description="Test Description",
70
70
  service="lightbulb",
71
+ on_action="E00L01I01",
72
+ off_action="E00L01I05",
71
73
  )
72
74
 
73
75
 
@@ -357,23 +359,33 @@ class TestHomeKitConbusService:
357
359
 
358
360
  def test_handle_send_action_event_on(self, mock_module, mock_accessory):
359
361
  """Test handle_send_action_event for turning on."""
360
- event = SendActionEvent(serial_number="1234567890", output_number=2, value=True)
362
+ event = SendActionEvent(
363
+ serial_number="1234567890",
364
+ output_number=2,
365
+ value=True,
366
+ on_action="E00L04I02",
367
+ off_action="E00L04I06",
368
+ )
361
369
 
362
370
  self.service.handle_send_action_event(event)
363
371
 
364
372
  sent_data = self.telegram_protocol.sendFrame.call_args[0][0]
365
- assert sent_data == b"S1234567890F27D02AB" # ON_RELEASE action
373
+ assert sent_data == b"E00L04I02B" # ON action code
366
374
 
367
375
  def test_handle_send_action_event_off(self, mock_module, mock_accessory):
368
376
  """Test handle_send_action_event for turning off."""
369
377
  event = SendActionEvent(
370
- serial_number="1234567890", output_number=5, value=False
378
+ serial_number="1234567890",
379
+ output_number=5,
380
+ value=False,
381
+ on_action="E00L05I05",
382
+ off_action="E00L05I09",
371
383
  )
372
384
 
373
385
  self.service.handle_send_action_event(event)
374
386
 
375
387
  sent_data = self.telegram_protocol.sendFrame.call_args[0][0]
376
- assert sent_data == b"S1234567890F27D05AA" # OFF_PRESS action
388
+ assert sent_data == b"E00L05I09B" # OFF action code
377
389
 
378
390
 
379
391
  class TestHomeKitService:
File without changes