velbus-aio 2025.4.2__tar.gz → 2025.5.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.

Potentially problematic release.


This version of velbus-aio might be problematic. Click here for more details.

Files changed (200) hide show
  1. {velbus_aio-2025.4.2/velbus_aio.egg-info → velbus_aio-2025.5.0}/PKG-INFO +1 -1
  2. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/pyproject.toml +2 -2
  3. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0/velbus_aio.egg-info}/PKG-INFO +1 -1
  4. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/handler.py +1 -1
  5. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/dali_dim_value_status.py +1 -1
  6. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/dimmer_status.py +12 -1
  7. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/module_type.py +7 -3
  8. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module.py +7 -0
  9. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/17.json +11 -1
  10. velbus_aio-2025.5.0/velbusaio/vlp_reader.py +113 -0
  11. velbus_aio-2025.4.2/velbusaio/vlp_reader.py +0 -33
  12. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/LICENSE +0 -0
  13. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/MANIFEST.in +0 -0
  14. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/README.md +0 -0
  15. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/requirements.txt +0 -0
  16. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/setup.cfg +0 -0
  17. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/setup.py +0 -0
  18. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbus_aio.egg-info/SOURCES.txt +0 -0
  19. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbus_aio.egg-info/dependency_links.txt +0 -0
  20. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbus_aio.egg-info/not-zip-safe +0 -0
  21. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbus_aio.egg-info/requires.txt +0 -0
  22. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbus_aio.egg-info/top_level.txt +0 -0
  23. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/__init__.py +0 -0
  24. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/channels.py +0 -0
  25. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/command_registry.py +0 -0
  26. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/const.py +0 -0
  27. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/controller.py +0 -0
  28. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/discovery.py +0 -0
  29. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/exceptions.py +0 -0
  30. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/helpers.py +0 -0
  31. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/message.py +0 -0
  32. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/__init__.py +0 -0
  33. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/blind_status.py +0 -0
  34. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/bus_active.py +0 -0
  35. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/bus_error_counter_status.py +0 -0
  36. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/bus_error_counter_status_request.py +0 -0
  37. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/bus_off.py +0 -0
  38. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/channel_name_part1.py +0 -0
  39. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/channel_name_part2.py +0 -0
  40. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/channel_name_part3.py +0 -0
  41. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/channel_name_request.py +0 -0
  42. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/clear_led.py +0 -0
  43. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/counter_status.py +0 -0
  44. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/counter_status_request.py +0 -0
  45. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/counter_value.py +0 -0
  46. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/cover_down.py +0 -0
  47. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/cover_off.py +0 -0
  48. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/cover_position.py +0 -0
  49. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/cover_up.py +0 -0
  50. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/dali_device_settings.py +0 -0
  51. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/dali_device_settings_request.py +0 -0
  52. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/dimmer_channel_status.py +0 -0
  53. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/edge_set_color.py +0 -0
  54. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/edge_set_custom_color.py +0 -0
  55. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/fast_blinking_led.py +0 -0
  56. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/forced_off.py +0 -0
  57. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/forced_on.py +0 -0
  58. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/interface_status_request.py +0 -0
  59. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/ir_receiver_status.py +0 -0
  60. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/kwh_status.py +0 -0
  61. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/light_value_request.py +0 -0
  62. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/memo_text.py +0 -0
  63. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/memory_data.py +0 -0
  64. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/memory_data_block.py +0 -0
  65. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/memory_dump_request.py +0 -0
  66. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/module_status.py +0 -0
  67. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/module_status_request.py +0 -0
  68. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/module_subtype.py +0 -0
  69. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/module_type_request.py +0 -0
  70. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/psu_load.py +0 -0
  71. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/psu_values.py +0 -0
  72. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/push_button_status.py +0 -0
  73. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/raw.py +0 -0
  74. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/read_data_block_from_memory.py +0 -0
  75. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/read_data_from_memory.py +0 -0
  76. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/realtime_clock_status_request.py +0 -0
  77. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/receive_buffer_full.py +0 -0
  78. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/receive_ready.py +0 -0
  79. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/relay_status.py +0 -0
  80. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/restore_dimmer.py +0 -0
  81. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/select_program.py +0 -0
  82. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/sensor_settings_request.py +0 -0
  83. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/sensor_temp_request.py +0 -0
  84. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/sensor_temperature.py +0 -0
  85. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/set_date.py +0 -0
  86. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/set_daylight_saving.py +0 -0
  87. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/set_dimmer.py +0 -0
  88. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/set_led.py +0 -0
  89. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/set_realtime_clock.py +0 -0
  90. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/set_temperature.py +0 -0
  91. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/slider_status.py +0 -0
  92. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/slow_blinking_led.py +0 -0
  93. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/start_relay_blinking_timer.py +0 -0
  94. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/start_relay_timer.py +0 -0
  95. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/switch_relay_off.py +0 -0
  96. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/switch_relay_on.py +0 -0
  97. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/switch_to_comfort.py +0 -0
  98. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/switch_to_day.py +0 -0
  99. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/switch_to_night.py +0 -0
  100. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/switch_to_safe.py +0 -0
  101. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/temp_sensor_settings_part1.py +0 -0
  102. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/temp_sensor_settings_part2.py +0 -0
  103. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/temp_sensor_settings_part3.py +0 -0
  104. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/temp_sensor_settings_part4.py +0 -0
  105. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/temp_sensor_settings_request.py +0 -0
  106. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/temp_sensor_status.py +0 -0
  107. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/temp_set_cooling.py +0 -0
  108. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/temp_set_heating.py +0 -0
  109. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/update_led_status.py +0 -0
  110. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/very_fast_blinking_led.py +0 -0
  111. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/write_data_to_memory.py +0 -0
  112. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/write_memory_block.py +0 -0
  113. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/messages/write_module_address_and_serial_number.py +0 -0
  114. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/01.json +0 -0
  115. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/02.json +0 -0
  116. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/03.json +0 -0
  117. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/04.json +0 -0
  118. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/05.json +0 -0
  119. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/06.json +0 -0
  120. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/07.json +0 -0
  121. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/08.json +0 -0
  122. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/09.json +0 -0
  123. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/0A.json +0 -0
  124. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/0B.json +0 -0
  125. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/0C.json +0 -0
  126. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/0E.json +0 -0
  127. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/0F.json +0 -0
  128. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/10.json +0 -0
  129. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/11.json +0 -0
  130. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/12.json +0 -0
  131. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/13.json +0 -0
  132. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/14.json +0 -0
  133. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/15.json +0 -0
  134. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/16.json +0 -0
  135. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/18.json +0 -0
  136. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/1A.json +0 -0
  137. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/1B.json +0 -0
  138. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/1D.json +0 -0
  139. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/1E.json +0 -0
  140. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/1F.json +0 -0
  141. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/20.json +0 -0
  142. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/21.json +0 -0
  143. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/22.json +0 -0
  144. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/23.json +0 -0
  145. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/25.json +0 -0
  146. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/28.json +0 -0
  147. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/29.json +0 -0
  148. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/2A.json +0 -0
  149. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/2B.json +0 -0
  150. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/2C.json +0 -0
  151. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/2D.json +0 -0
  152. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/2E.json +0 -0
  153. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/2F.json +0 -0
  154. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/30.json +0 -0
  155. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/31.json +0 -0
  156. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/32.json +0 -0
  157. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/33.json +0 -0
  158. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/34.json +0 -0
  159. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/35.json +0 -0
  160. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/36.json +0 -0
  161. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/37.json +0 -0
  162. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/38.json +0 -0
  163. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/39.json +0 -0
  164. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/3A.json +0 -0
  165. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/3B.json +0 -0
  166. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/3C.json +0 -0
  167. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/3D.json +0 -0
  168. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/3E.json +0 -0
  169. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/3F.json +0 -0
  170. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/40.json +0 -0
  171. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/41.json +0 -0
  172. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/42.json +0 -0
  173. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/43.json +0 -0
  174. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/44.json +0 -0
  175. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/45.json +0 -0
  176. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/48.json +0 -0
  177. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/49.json +0 -0
  178. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/4A.json +0 -0
  179. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/4B.json +0 -0
  180. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/4C.json +0 -0
  181. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/4D.json +0 -0
  182. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/4E.json +0 -0
  183. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/4F.json +0 -0
  184. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/50.json +0 -0
  185. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/51.json +0 -0
  186. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/52.json +0 -0
  187. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/54.json +0 -0
  188. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/55.json +0 -0
  189. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/56.json +0 -0
  190. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/57.json +0 -0
  191. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/5A.json +0 -0
  192. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/5B.json +0 -0
  193. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/5C.json +0 -0
  194. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/5F.json +0 -0
  195. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/60.json +0 -0
  196. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/module_spec/broadcast.json +0 -0
  197. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/protocol.py +0 -0
  198. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/py.typed +0 -0
  199. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/raw_message.py +0 -0
  200. {velbus_aio-2025.4.2 → velbus_aio-2025.5.0}/velbusaio/util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velbus-aio
3
- Version: 2025.4.2
3
+ Version: 2025.5.0
4
4
  Summary: Open-source home automation platform running on Python 3.
5
5
  Author-email: Maikel Punie <maikel.punie@gmail.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ requires = ["setuptools", "wheel"]
4
4
  [project]
5
5
  name = "velbus-aio"
6
6
  license = {text = "MIT"}
7
- version = "2025.4.2"
7
+ version = "2025.5.0"
8
8
  description = "Open-source home automation platform running on Python 3."
9
9
  readme = "README.md"
10
10
  authors = [
@@ -52,7 +52,7 @@ exclude_dirs = ["tests"]
52
52
  skips = ["B301", "B403", "B323", "B104", "B110"]
53
53
 
54
54
  [tool.bumpver]
55
- current_version = "2025.4.2"
55
+ current_version = "2025.5.0"
56
56
  version_pattern = "YYYY.MM.INC0"
57
57
  commit_message = "bump version {old_version} -> {new_version}"
58
58
  commit = true
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velbus-aio
3
- Version: 2025.4.2
3
+ Version: 2025.5.0
4
4
  Summary: Open-source home automation platform running on Python 3.
5
5
  Author-email: Maikel Punie <maikel.punie@gmail.com>
6
6
  License: MIT
@@ -139,7 +139,7 @@ class PacketHandler:
139
139
  if module is not None:
140
140
  try:
141
141
  self._log.debug(
142
- f"Module {module._address} detected: start loading"
142
+ f"Module {module.get_address()} detected: start loading"
143
143
  )
144
144
  await asyncio.wait_for(
145
145
  module.load(from_cache=True),
@@ -10,7 +10,7 @@ from velbusaio.message import Message
10
10
  COMMAND_CODE = 0xA5
11
11
 
12
12
 
13
- @register(COMMAND_CODE, ["VMBDALI", "VMBDALI-20"])
13
+ @register(COMMAND_CODE, ["VMBDALI", "VMBDALI-20", "VMB8DC-20", "VMB4LEDPWM-20"])
14
14
  class DimValueStatus(Message):
15
15
  """
16
16
  send by: VMBDALI
@@ -25,7 +25,18 @@ LED_FAST_BLINKING = 1 << 5
25
25
  LED_VERY_FAST_BLINKING = 1 << 4
26
26
 
27
27
 
28
- @register(COMMAND_CODE, ["VMB1DM", "VMBDME", "VMB1LED"])
28
+ @register(
29
+ COMMAND_CODE,
30
+ [
31
+ "VMB1DM",
32
+ "VMBDME",
33
+ "VMB1LED",
34
+ "VMBDALI",
35
+ "VMBDALI-20",
36
+ "VMB8DC-20",
37
+ "VMB4LEDPWM-20",
38
+ ],
39
+ )
29
40
  class DimmerStatusMessage(Message):
30
41
  """
31
42
  sent by: VMBDME
@@ -6,7 +6,7 @@ from __future__ import annotations
6
6
 
7
7
  import struct
8
8
 
9
- from velbusaio.command_registry import register
9
+ from velbusaio.command_registry import MODULE_DIRECTORY, register
10
10
  from velbusaio.message import Message
11
11
 
12
12
  COMMAND_CODE = 0xFF
@@ -110,11 +110,15 @@ class ModuleTypeMessage(Message):
110
110
  self.build_week = 0
111
111
  self.set_defaults(address)
112
112
 
113
- def module_name(self) -> str:
113
+ def module_type_name(self) -> str:
114
114
  """
115
115
  :return: str
116
116
  """
117
- return "Unknown"
117
+ return (
118
+ MODULE_DIRECTORY[self.module_type]
119
+ if self.module_type in MODULE_DIRECTORY
120
+ else "Unknown"
121
+ )
118
122
 
119
123
  def populate(self, priority, address, rtr, data) -> None:
120
124
  """
@@ -243,6 +243,9 @@ class Module:
243
243
  d["channels"][num] = chan.to_cache()
244
244
  return d
245
245
 
246
+ def get_address(self) -> int:
247
+ return self._address
248
+
246
249
  def get_addresses(self) -> list:
247
250
  """
248
251
  Get all addresses for this module
@@ -550,6 +553,10 @@ class Module:
550
553
  await self._update_channel(
551
554
  message.channel, {"power": message.power, "energy": message.energy}
552
555
  )
556
+ elif isinstance(message, DimValueStatus):
557
+ for offset, dim_value in enumerate(message.dim_values):
558
+ channel = message.channel + offset
559
+ await self._update_channel(channel, {"state": dim_value})
553
560
 
554
561
  async def _update_channel(self, channel: int, updates: dict):
555
562
  try:
@@ -113,7 +113,17 @@
113
113
  "03FE": { "ModuleName": "62" },
114
114
  "03FF": { "ModuleName": "64:Save" }
115
115
  },
116
- "ModuleName": "03C0-03FF"
116
+ "ModuleName": "03C0-03FF",
117
+ "Channels": {
118
+ "01": "0000-000F",
119
+ "02": "0010-001F",
120
+ "03": "0020-002F",
121
+ "04": "0030-003F",
122
+ "05": "0040-004F",
123
+ "06": "0050-005F",
124
+ "07": "0060-006F",
125
+ "08": "0070-007F"
126
+ }
117
127
  },
118
128
  "Type": "VMB6PBN"
119
129
  }
@@ -0,0 +1,113 @@
1
+ import importlib.resources
2
+ import json
3
+ import logging
4
+ import sys
5
+
6
+ from aiofile import async_open
7
+ from bs4 import BeautifulSoup
8
+
9
+ from velbusaio.command_registry import MODULE_DIRECTORY
10
+ from velbusaio.helpers import h2
11
+
12
+
13
+ class vlpFile:
14
+
15
+ def __init__(self, file_path) -> None:
16
+ self._file_path = file_path
17
+ self._modules = {}
18
+ self._log = logging.getLogger("velbus-vlpFile")
19
+
20
+ def get(self) -> dict:
21
+ return self._modules
22
+
23
+ async def read(self) -> None:
24
+ with open(self._file_path) as file:
25
+ xml_content = file.read()
26
+ _soup = BeautifulSoup(xml_content, "xml")
27
+ for module in _soup.find_all("Module"):
28
+ self._modules[module["address"]] = vlpModule(
29
+ module.find("Caption").get_text(),
30
+ module["address"],
31
+ module["build"],
32
+ module["serial"],
33
+ module["type"],
34
+ module.find("Memory").get_text(),
35
+ )
36
+ await self._modules[module["address"]].load_module_spec()
37
+ print(self._modules[module["address"]].get_channel_name(1))
38
+ print(self._modules[module["address"]].get_channel_name(2))
39
+ print(self._modules[module["address"]].get_channel_name(3))
40
+ print(self._modules[module["address"]].get_channel_name(4))
41
+ print(self._modules[module["address"]].get_channel_name(5))
42
+ print(self._modules[module["address"]].get_channel_name(10))
43
+
44
+
45
+ class vlpModule:
46
+
47
+ def __init__(self, name, addresses, build, serial, type, memory) -> None:
48
+ self._name = name
49
+ self._addresses = addresses
50
+ self._build = build
51
+ self._serial = serial
52
+ self._type = type
53
+ self._memory = memory
54
+ self._spec = {}
55
+ self._type_id = next(
56
+ (key for key, value in MODULE_DIRECTORY.items() if value == self._type),
57
+ None,
58
+ )
59
+ self._log = logging.getLogger("velbus-vlpFile")
60
+
61
+ def get(self) -> dict:
62
+ return {
63
+ "name": self._name,
64
+ "addresses": self._addresses,
65
+ "build": self._build,
66
+ "serial": self._serial,
67
+ "type": self._type,
68
+ "memory": self._memory,
69
+ }
70
+
71
+ def get_name(self) -> str:
72
+ return self._name
73
+
74
+ def get_channel_name(self, chan: int) -> str | None:
75
+ self._log.debug(f"get_channel_name: {chan}")
76
+ if "Memory" not in self._spec:
77
+ self._log.debug(" => no Memory locations found")
78
+ return None
79
+ if "Channels" not in self._spec["Memory"]:
80
+ self._log.debug(" => no Channels Memory locations found")
81
+ return None
82
+ if h2(chan) not in self._spec["Memory"]["Channels"]:
83
+ self._log.debug(f" => no chan {chan} Memory locations found")
84
+ return None
85
+ byte_data = bytes.fromhex(
86
+ self._read_from_memory(self._spec["Memory"]["Channels"][h2(chan)]).replace(
87
+ "FF", ""
88
+ )
89
+ )
90
+ return byte_data.decode("ascii")
91
+
92
+ async def load_module_spec(self) -> None:
93
+ if sys.version_info >= (3, 13):
94
+ with importlib.resources.path(
95
+ __name__, f"module_spec/{h2(self._type_id)}.json"
96
+ ) as fspath:
97
+ async with async_open(fspath) as protocol_file:
98
+ self._spec = json.loads(await protocol_file.read())
99
+ else:
100
+ async with async_open(
101
+ str(
102
+ importlib.resources.files(__name__.split(".")[0]).joinpath(
103
+ f"module_spec/{h2(self._type)}.json"
104
+ )
105
+ )
106
+ ) as protocol_file:
107
+ self._spec = json.loads(await protocol_file.read())
108
+
109
+ def _read_from_memory(self, address_range) -> str | None:
110
+ start_str, end_str = address_range.split("-")
111
+ start = int(start_str, 16) * 2
112
+ end = (int(end_str, 16) + 1) * 2
113
+ return self._memory[start:end]
@@ -1,33 +0,0 @@
1
- from bs4 import BeautifulSoup
2
-
3
-
4
- class vlpFile:
5
-
6
- def __init__(self, file_path) -> None:
7
- self._file_path = file_path
8
- self._soup = None
9
- self._modules = {}
10
- self._read()
11
- self._parse()
12
- print(self._modules)
13
-
14
- def _read(self) -> None:
15
- with open(self._file_path) as file:
16
- xml_content = file.read()
17
- self._soup = BeautifulSoup(xml_content, "xml")
18
-
19
- def _parse(self) -> None:
20
- for module in self._soup.find_all("Module"):
21
- self._parse_module(module)
22
-
23
- def _parse_module(self, module) -> None:
24
- mod_info = {}
25
- mod_info["name"] = module.find("Caption").get_text()
26
- mod_info["addresses"] = module["address"]
27
- mod_info["build"] = module["build"]
28
- mod_info["serial"] = module["serial"]
29
- mod_info["build"] = module["build"]
30
- mod_info["type"] = module["type"]
31
- memory = module.find("Memory")
32
- mod_info["memory"] = memory.get_text()
33
- self._modules[mod_info["addresses"]] = mod_info
File without changes
File without changes
File without changes
File without changes
File without changes