velbus-aio 2025.3.1__tar.gz → 2025.4.2__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 (199) hide show
  1. {velbus_aio-2025.3.1/velbus_aio.egg-info → velbus_aio-2025.4.2}/PKG-INFO +3 -2
  2. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/pyproject.toml +2 -2
  3. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2/velbus_aio.egg-info}/PKG-INFO +3 -2
  4. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbus_aio.egg-info/SOURCES.txt +5 -0
  5. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/channels.py +7 -1
  6. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/command_registry.py +4 -0
  7. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/__init__.py +3 -0
  8. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/channel_name_part1.py +1 -0
  9. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/channel_name_part2.py +1 -0
  10. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/channel_name_part3.py +1 -0
  11. velbus_aio-2025.4.2/velbusaio/messages/counter_value.py +44 -0
  12. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/dimmer_channel_status.py +1 -1
  13. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/module_status.py +1 -0
  14. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/module_type.py +3 -0
  15. velbus_aio-2025.4.2/velbusaio/messages/psu_load.py +56 -0
  16. velbus_aio-2025.4.2/velbusaio/messages/psu_values.py +53 -0
  17. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/restore_dimmer.py +10 -1
  18. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/set_dimmer.py +4 -1
  19. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/slider_status.py +10 -1
  20. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module.py +7 -0
  21. velbus_aio-2025.4.2/velbusaio/module_spec/04.json +282 -0
  22. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/06.json +1 -0
  23. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/4B.json +1 -0
  24. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/4E.json +150 -50
  25. velbus_aio-2025.4.2/velbusaio/vlp_reader.py +33 -0
  26. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/LICENSE +0 -0
  27. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/MANIFEST.in +0 -0
  28. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/README.md +0 -0
  29. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/requirements.txt +0 -0
  30. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/setup.cfg +0 -0
  31. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/setup.py +0 -0
  32. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbus_aio.egg-info/dependency_links.txt +0 -0
  33. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbus_aio.egg-info/not-zip-safe +0 -0
  34. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbus_aio.egg-info/requires.txt +0 -0
  35. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbus_aio.egg-info/top_level.txt +0 -0
  36. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/__init__.py +0 -0
  37. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/const.py +0 -0
  38. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/controller.py +0 -0
  39. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/discovery.py +0 -0
  40. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/exceptions.py +0 -0
  41. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/handler.py +0 -0
  42. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/helpers.py +0 -0
  43. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/message.py +0 -0
  44. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/blind_status.py +0 -0
  45. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/bus_active.py +0 -0
  46. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/bus_error_counter_status.py +0 -0
  47. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/bus_error_counter_status_request.py +0 -0
  48. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/bus_off.py +0 -0
  49. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/channel_name_request.py +0 -0
  50. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/clear_led.py +0 -0
  51. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/counter_status.py +0 -0
  52. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/counter_status_request.py +0 -0
  53. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/cover_down.py +0 -0
  54. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/cover_off.py +0 -0
  55. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/cover_position.py +0 -0
  56. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/cover_up.py +0 -0
  57. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/dali_device_settings.py +0 -0
  58. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/dali_device_settings_request.py +0 -0
  59. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/dali_dim_value_status.py +0 -0
  60. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/dimmer_status.py +0 -0
  61. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/edge_set_color.py +0 -0
  62. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/edge_set_custom_color.py +0 -0
  63. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/fast_blinking_led.py +0 -0
  64. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/forced_off.py +0 -0
  65. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/forced_on.py +0 -0
  66. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/interface_status_request.py +0 -0
  67. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/ir_receiver_status.py +0 -0
  68. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/kwh_status.py +0 -0
  69. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/light_value_request.py +0 -0
  70. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/memo_text.py +0 -0
  71. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/memory_data.py +0 -0
  72. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/memory_data_block.py +0 -0
  73. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/memory_dump_request.py +0 -0
  74. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/module_status_request.py +0 -0
  75. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/module_subtype.py +0 -0
  76. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/module_type_request.py +0 -0
  77. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/push_button_status.py +0 -0
  78. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/raw.py +0 -0
  79. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/read_data_block_from_memory.py +0 -0
  80. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/read_data_from_memory.py +0 -0
  81. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/realtime_clock_status_request.py +0 -0
  82. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/receive_buffer_full.py +0 -0
  83. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/receive_ready.py +0 -0
  84. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/relay_status.py +0 -0
  85. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/select_program.py +0 -0
  86. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/sensor_settings_request.py +0 -0
  87. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/sensor_temp_request.py +0 -0
  88. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/sensor_temperature.py +0 -0
  89. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/set_date.py +0 -0
  90. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/set_daylight_saving.py +0 -0
  91. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/set_led.py +0 -0
  92. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/set_realtime_clock.py +0 -0
  93. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/set_temperature.py +0 -0
  94. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/slow_blinking_led.py +0 -0
  95. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/start_relay_blinking_timer.py +0 -0
  96. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/start_relay_timer.py +0 -0
  97. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/switch_relay_off.py +0 -0
  98. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/switch_relay_on.py +0 -0
  99. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/switch_to_comfort.py +0 -0
  100. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/switch_to_day.py +0 -0
  101. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/switch_to_night.py +0 -0
  102. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/switch_to_safe.py +0 -0
  103. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/temp_sensor_settings_part1.py +0 -0
  104. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/temp_sensor_settings_part2.py +0 -0
  105. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/temp_sensor_settings_part3.py +0 -0
  106. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/temp_sensor_settings_part4.py +0 -0
  107. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/temp_sensor_settings_request.py +0 -0
  108. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/temp_sensor_status.py +0 -0
  109. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/temp_set_cooling.py +0 -0
  110. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/temp_set_heating.py +0 -0
  111. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/update_led_status.py +0 -0
  112. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/very_fast_blinking_led.py +0 -0
  113. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/write_data_to_memory.py +0 -0
  114. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/write_memory_block.py +0 -0
  115. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/messages/write_module_address_and_serial_number.py +0 -0
  116. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/01.json +0 -0
  117. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/02.json +0 -0
  118. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/03.json +0 -0
  119. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/05.json +0 -0
  120. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/07.json +0 -0
  121. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/08.json +0 -0
  122. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/09.json +0 -0
  123. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/0A.json +0 -0
  124. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/0B.json +0 -0
  125. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/0C.json +0 -0
  126. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/0E.json +0 -0
  127. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/0F.json +0 -0
  128. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/10.json +0 -0
  129. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/11.json +0 -0
  130. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/12.json +0 -0
  131. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/13.json +0 -0
  132. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/14.json +0 -0
  133. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/15.json +0 -0
  134. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/16.json +0 -0
  135. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/17.json +0 -0
  136. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/18.json +0 -0
  137. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/1A.json +0 -0
  138. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/1B.json +0 -0
  139. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/1D.json +0 -0
  140. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/1E.json +0 -0
  141. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/1F.json +0 -0
  142. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/20.json +0 -0
  143. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/21.json +0 -0
  144. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/22.json +0 -0
  145. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/23.json +0 -0
  146. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/25.json +0 -0
  147. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/28.json +0 -0
  148. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/29.json +0 -0
  149. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/2A.json +0 -0
  150. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/2B.json +0 -0
  151. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/2C.json +0 -0
  152. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/2D.json +0 -0
  153. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/2E.json +0 -0
  154. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/2F.json +0 -0
  155. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/30.json +0 -0
  156. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/31.json +0 -0
  157. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/32.json +0 -0
  158. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/33.json +0 -0
  159. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/34.json +0 -0
  160. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/35.json +0 -0
  161. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/36.json +0 -0
  162. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/37.json +0 -0
  163. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/38.json +0 -0
  164. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/39.json +0 -0
  165. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/3A.json +0 -0
  166. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/3B.json +0 -0
  167. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/3C.json +0 -0
  168. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/3D.json +0 -0
  169. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/3E.json +0 -0
  170. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/3F.json +0 -0
  171. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/40.json +0 -0
  172. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/41.json +0 -0
  173. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/42.json +0 -0
  174. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/43.json +0 -0
  175. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/44.json +0 -0
  176. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/45.json +0 -0
  177. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/48.json +0 -0
  178. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/49.json +0 -0
  179. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/4A.json +0 -0
  180. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/4C.json +0 -0
  181. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/4D.json +0 -0
  182. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/4F.json +0 -0
  183. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/50.json +0 -0
  184. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/51.json +0 -0
  185. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/52.json +0 -0
  186. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/54.json +0 -0
  187. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/55.json +0 -0
  188. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/56.json +0 -0
  189. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/57.json +0 -0
  190. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/5A.json +0 -0
  191. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/5B.json +0 -0
  192. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/5C.json +0 -0
  193. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/5F.json +0 -0
  194. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/60.json +0 -0
  195. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/module_spec/broadcast.json +0 -0
  196. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/protocol.py +0 -0
  197. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/py.typed +0 -0
  198. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/raw_message.py +0 -0
  199. {velbus_aio-2025.3.1 → velbus_aio-2025.4.2}/velbusaio/util.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: velbus-aio
3
- Version: 2025.3.1
3
+ Version: 2025.4.2
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
@@ -29,6 +29,7 @@ Requires-Dist: pyserial>=3.5.0
29
29
  Requires-Dist: pyserial-asyncio_fast>=0.11
30
30
  Requires-Dist: backoff>=1.10.0
31
31
  Requires-Dist: aiofile
32
+ Dynamic: license-file
32
33
 
33
34
  ![CI](https://github.com/Cereal2nd/velbus-aio/actions/workflows/main.yml/badge.svg)
34
35
  [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/Cereal2nd/velbus-aio/master.svg)](https://results.pre-commit.ci/latest/github/Cereal2nd/velbus-aio/master)
@@ -4,7 +4,7 @@ requires = ["setuptools", "wheel"]
4
4
  [project]
5
5
  name = "velbus-aio"
6
6
  license = {text = "MIT"}
7
- version = "2025.3.1"
7
+ version = "2025.4.2"
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.3.1"
55
+ current_version = "2025.4.2"
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
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: velbus-aio
3
- Version: 2025.3.1
3
+ Version: 2025.4.2
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
@@ -29,6 +29,7 @@ Requires-Dist: pyserial>=3.5.0
29
29
  Requires-Dist: pyserial-asyncio_fast>=0.11
30
30
  Requires-Dist: backoff>=1.10.0
31
31
  Requires-Dist: aiofile
32
+ Dynamic: license-file
32
33
 
33
34
  ![CI](https://github.com/Cereal2nd/velbus-aio/actions/workflows/main.yml/badge.svg)
34
35
  [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/Cereal2nd/velbus-aio/master.svg)](https://results.pre-commit.ci/latest/github/Cereal2nd/velbus-aio/master)
@@ -25,6 +25,7 @@ velbusaio/protocol.py
25
25
  velbusaio/py.typed
26
26
  velbusaio/raw_message.py
27
27
  velbusaio/util.py
28
+ velbusaio/vlp_reader.py
28
29
  velbusaio/messages/__init__.py
29
30
  velbusaio/messages/blind_status.py
30
31
  velbusaio/messages/bus_active.py
@@ -38,6 +39,7 @@ velbusaio/messages/channel_name_request.py
38
39
  velbusaio/messages/clear_led.py
39
40
  velbusaio/messages/counter_status.py
40
41
  velbusaio/messages/counter_status_request.py
42
+ velbusaio/messages/counter_value.py
41
43
  velbusaio/messages/cover_down.py
42
44
  velbusaio/messages/cover_off.py
43
45
  velbusaio/messages/cover_position.py
@@ -65,6 +67,8 @@ velbusaio/messages/module_status_request.py
65
67
  velbusaio/messages/module_subtype.py
66
68
  velbusaio/messages/module_type.py
67
69
  velbusaio/messages/module_type_request.py
70
+ velbusaio/messages/psu_load.py
71
+ velbusaio/messages/psu_values.py
68
72
  velbusaio/messages/push_button_status.py
69
73
  velbusaio/messages/raw.py
70
74
  velbusaio/messages/read_data_block_from_memory.py
@@ -110,6 +114,7 @@ velbusaio/messages/write_module_address_and_serial_number.py
110
114
  velbusaio/module_spec/01.json
111
115
  velbusaio/module_spec/02.json
112
116
  velbusaio/module_spec/03.json
117
+ velbusaio/module_spec/04.json
113
118
  velbusaio/module_spec/05.json
114
119
  velbusaio/module_spec/06.json
115
120
  velbusaio/module_spec/07.json
@@ -379,6 +379,8 @@ class ButtonCounter(Button):
379
379
  _pulses = None
380
380
  _counter = None
381
381
  _delay = None
382
+ _power = None
383
+ _energy = None
382
384
 
383
385
  def get_categories(self) -> list[str]:
384
386
  if self._counter:
@@ -391,11 +393,13 @@ class ButtonCounter(Button):
391
393
  return False
392
394
 
393
395
  def get_state(self) -> int:
394
- val = 0
396
+ if self._energy:
397
+ return self._energy
395
398
  # if we don't know the delay
396
399
  # or we don't know the unit
397
400
  # or the delay is the max value
398
401
  # we always return 0
402
+ val = 0
399
403
  if not self._delay or not self._Unit or self._delay == 0xFFFF:
400
404
  return round(0, 2)
401
405
  if self._Unit == VOLUME_LITERS_HOUR:
@@ -418,6 +422,8 @@ class ButtonCounter(Button):
418
422
  return None
419
423
 
420
424
  def get_counter_state(self) -> int:
425
+ if self._power:
426
+ return self._power
421
427
  return round((self._counter / self._pulses), 2)
422
428
 
423
429
  def get_counter_unit(self) -> str:
@@ -9,6 +9,7 @@ MODULE_DIRECTORY = {
9
9
  0x01: "VMB8PB",
10
10
  0x02: "VMB1RY",
11
11
  0x03: "VMB1BL",
12
+ 0x04: "VMBPSUMNGR-20",
12
13
  0x05: "VMB6IN",
13
14
  0x06: "VMB4LEDPWM-20",
14
15
  0x07: "VMB1DM",
@@ -39,6 +40,8 @@ MODULE_DIRECTORY = {
39
40
  0x20: "VMBGP4",
40
41
  0x21: "VMBGPO",
41
42
  0x22: "VMB7IN",
43
+ 0x23: "VMBPIRO-10",
44
+ 0x24: "VMBGPTC",
42
45
  0x28: "VMBGPOD",
43
46
  0x29: "VMB1RYNOS",
44
47
  0x2A: "VMBPIRM",
@@ -47,6 +50,7 @@ MODULE_DIRECTORY = {
47
50
  0x2D: "VMBGP4PIR",
48
51
  0x2E: "VMB1BLS",
49
52
  0x2F: "VMBDMI-R",
53
+ 0x30: "VMBRFR8S",
50
54
  0x31: "VMBMETEO",
51
55
  0x32: "VMB4AN",
52
56
  0x33: "VMBVP01",
@@ -33,6 +33,7 @@ from velbusaio.messages.channel_name_request import (
33
33
  from velbusaio.messages.clear_led import ClearLedMessage
34
34
  from velbusaio.messages.counter_status import CounterStatusMessage
35
35
  from velbusaio.messages.counter_status_request import CounterStatusRequestMessage
36
+ from velbusaio.messages.counter_value import CounterValueMessage
36
37
  from velbusaio.messages.cover_down import CoverDownMessage, CoverDownMessage2
37
38
  from velbusaio.messages.cover_off import CoverOffMessage, CoverOffMessage2
38
39
  from velbusaio.messages.cover_position import CoverPosMessage
@@ -56,6 +57,8 @@ from velbusaio.messages.module_status_request import ModuleStatusRequestMessage
56
57
  from velbusaio.messages.module_subtype import ModuleSubTypeMessage
57
58
  from velbusaio.messages.module_type import ModuleType2Message, ModuleTypeMessage
58
59
  from velbusaio.messages.module_type_request import ModuleTypeRequestMessage
60
+ from velbusaio.messages.psu_load import PsuLoadMessage
61
+ from velbusaio.messages.psu_values import PsuValuesMessage
59
62
  from velbusaio.messages.push_button_status import PushButtonStatusMessage
60
63
  from velbusaio.messages.raw import MeteoRawMessage, SensorRawMessage
61
64
  from velbusaio.messages.read_data_block_from_memory import (
@@ -85,6 +85,7 @@ class ChannelNamePart1Message(Message):
85
85
  "VMB4LEDPWM-20",
86
86
  "VMB8DC-20",
87
87
  "VMB8IN-20",
88
+ "VMBPSUMNGR-20",
88
89
  ],
89
90
  )
90
91
  class ChannelNamePart1Message2(ChannelNamePart1Message):
@@ -85,6 +85,7 @@ class ChannelNamePart2Message(Message):
85
85
  "VMB8DC-20",
86
86
  "VMB8IN-20",
87
87
  "VMB4LEDPWM-20",
88
+ "VMBPSUMNGR-20",
88
89
  ],
89
90
  )
90
91
  class ChannelNamePart2Message2(ChannelNamePart2Message):
@@ -85,6 +85,7 @@ class ChannelNamePart3Message(Message):
85
85
  "VMB8DC-20",
86
86
  "VMB8IN-20",
87
87
  "VMB4LEDPWM-20",
88
+ "VMBPSUMNGR-20",
88
89
  ],
89
90
  )
90
91
  class ChannelNamePart3Message2(ChannelNamePart3Message):
@@ -0,0 +1,44 @@
1
+ """
2
+ :author: Maikel Punie <maikel.punie@gmail.com>
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ from velbusaio.command_registry import register
8
+ from velbusaio.message import Message
9
+
10
+ COMMAND_CODE = 0xA4
11
+
12
+
13
+ @register(COMMAND_CODE, ["VMB8IN-20"])
14
+ class CounterValueMessage(Message):
15
+
16
+ def __init__(self, address=None):
17
+ Message.__init__(self)
18
+ self.channel = 0
19
+ self.power = 0
20
+ self.energy = 0
21
+
22
+ def populate(self, priority, address, rtr, data):
23
+ """
24
+ -DB0 bit 0-4 = channel
25
+ -DB0 bit 5-7 = Highest nibble (bits 19…16) of Power
26
+ -DB1 = bits 15…8 of Power
27
+ -DB2 = bits 7…0 of Power
28
+ -DB3 bit 0-7 = energy counter
29
+ -DB4 bit 0-7 = energy counter
30
+ -DB5 bit 0-7 = energy counter
31
+ :return: None
32
+ """
33
+ self.needs_no_rtr(rtr)
34
+ self.needs_data(data, 7)
35
+ self.set_attributes(priority, address, rtr)
36
+ self.channel = (data[0] & 0x0F0) + 1
37
+ self.power = (data[0] << 16) + (data[1] << 8) + data[2]
38
+ self.energy = (data[3] << 16) + (data[4] << 8) + data[5]
39
+
40
+ def get_channels(self):
41
+ """
42
+ :return: list
43
+ """
44
+ return self.channel
@@ -22,7 +22,7 @@ LED_FAST_BLINKING = 1 << 5
22
22
  LED_VERY_FAST_BLINKING = 1 << 4
23
23
 
24
24
 
25
- @register(COMMAND_CODE, ["VMB4DC", "VMBDMI", "VMBDMI-R", "VMB8DC-20"])
25
+ @register(COMMAND_CODE, ["VMB4DC", "VMBDMI", "VMBDMI-R", "VMB8DC-20", "VMB4LEDPWM-20"])
26
26
  class DimmerChannelStatusMessage(Message):
27
27
  """
28
28
  sent by: VMB4DC
@@ -87,6 +87,7 @@ class ModuleStatusMessage(Message):
87
87
  "VMBGPO-20",
88
88
  "VMBEL4PIR-20",
89
89
  "VMBGP4PIR-20",
90
+ "VMBPSUMNGR-20",
90
91
  ],
91
92
  )
92
93
  class ModuleStatusMessage2(Message):
@@ -148,6 +148,9 @@ class ModuleTypeMessage(Message):
148
148
  "VMBGPO-20",
149
149
  "VMBEL4PIR-20",
150
150
  "VMBGP4PIR-20",
151
+ "VMB4LEDPWM-20",
152
+ "VMB8IN-20",
153
+ "VMB8DC-20",
151
154
  ],
152
155
  )
153
156
  class ModuleType2Message(Message):
@@ -0,0 +1,56 @@
1
+ """
2
+ :author: Maikel Punie
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ import struct
8
+
9
+ from velbusaio.command_registry import register
10
+ from velbusaio.message import Message
11
+
12
+ COMMAND_CODE = 0xA2
13
+ BALANCED = 0x01
14
+ BOOST = 0x02
15
+ BACKUP = 0x03
16
+
17
+
18
+ @register(COMMAND_CODE, ["VMBPSUMNGR-20"])
19
+ class PsuLoadMessage(Message):
20
+
21
+ def __init__(self, address=None):
22
+ Message.__init__(self)
23
+ self.mode = 0
24
+ self.load_1 = 0
25
+ self.load_2 = 0
26
+ self.out = 0
27
+
28
+ def populate(self, priority, address, rtr, data):
29
+ """
30
+ :return: None
31
+ """
32
+ self.needs_low_priority(priority)
33
+ self.needs_no_rtr(rtr)
34
+ self.needs_data(data, 3)
35
+ self.set_attributes(priority, address, rtr)
36
+ self.mode = data[0]
37
+ self.load_1 = data[1]
38
+ self.load_2 = data[2]
39
+ self.out = data[3]
40
+
41
+ def data_to_binary(self):
42
+ """
43
+ :return: bytes
44
+ """
45
+ return (
46
+ bytes(
47
+ [
48
+ COMMAND_CODE,
49
+ self.mode,
50
+ self.load_1,
51
+ self.load_2,
52
+ self.out,
53
+ ]
54
+ )
55
+ + struct.pack(">L", self.delay_time)[-3:]
56
+ )
@@ -0,0 +1,53 @@
1
+ """
2
+ :author: Maikel Punie
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ import struct
8
+
9
+ from velbusaio.command_registry import register
10
+ from velbusaio.message import Message
11
+
12
+ COMMAND_CODE = 0xA3
13
+
14
+
15
+ @register(COMMAND_CODE, ["VMBPSUMNGR-20"])
16
+ class PsuValuesMessage(Message):
17
+
18
+ def __init__(self, address=None):
19
+ Message.__init__(self)
20
+ self.channel = 0
21
+ self.watt = 0
22
+ self.volt = 0
23
+ self.amp = 0
24
+
25
+ def populate(self, priority, address, rtr, data):
26
+ """
27
+ :return: None
28
+ """
29
+ self.needs_low_priority(priority)
30
+ self.needs_no_rtr(rtr)
31
+ self.needs_data(data, 3)
32
+ self.set_attributes(priority, address, rtr)
33
+ self.channel = (data[0] & 0xF0) >> 4
34
+ self.watt = ((data[0] & 0x0F) << 16 | data[1] << 8 | data[2]) / 1000
35
+ self.volt = (data[3] << 8 | data[4]) / 1000
36
+ self.amp = (data[5] << 8 | data[6]) / 1000
37
+
38
+ def data_to_binary(self):
39
+ """
40
+ :return: bytes
41
+ """
42
+ return (
43
+ bytes(
44
+ [
45
+ COMMAND_CODE,
46
+ self.mode,
47
+ self.load_1,
48
+ self.load_2,
49
+ self.out,
50
+ ]
51
+ )
52
+ + struct.pack(">L", self.delay_time)[-3:]
53
+ )
@@ -12,7 +12,16 @@ COMMAND_CODE = 0x11
12
12
 
13
13
  @register(
14
14
  COMMAND_CODE,
15
- ["VMB1DM", "VMBDME", "VMBDMI-R", "VMBDMI", "VMB1LED", "VMB4DC", "VMB8DC-20"],
15
+ [
16
+ "VMB1DM",
17
+ "VMBDME",
18
+ "VMBDMI-R",
19
+ "VMBDMI",
20
+ "VMB1LED",
21
+ "VMB4DC",
22
+ "VMB8DC-20",
23
+ "VMB4LEDPWM-20",
24
+ ],
16
25
  )
17
26
  class RestoreDimmerMessage(Message):
18
27
  """
@@ -54,7 +54,10 @@ class SetDimmerMessage(Message):
54
54
  ) + self.dimmer_transitiontime.to_bytes(2, byteorder="big", signed=False)
55
55
 
56
56
 
57
- @register(COMMAND_CODE, ["VMBDALI", "VMBDALI-20", "VMBDMI", "VMBDMI-R", "VMB8DC-20"])
57
+ @register(
58
+ COMMAND_CODE,
59
+ ["VMBDALI", "VMBDALI-20", "VMBDMI", "VMBDMI-R", "VMB8DC-20", "VMB4LEDPWM-20"],
60
+ )
58
61
  class SetDimmerMessage2(SetDimmerMessage):
59
62
  """This with this message the channel numbering is an integer
60
63
  send by:
@@ -12,7 +12,16 @@ COMMAND_CODE = 0x0F
12
12
 
13
13
  @register(
14
14
  COMMAND_CODE,
15
- ["VMB1DM", "VMBDME", "VMB4DC", "VMBDMI", "VMBDMI-R", "VMB1LED", "VMB8DC-20"],
15
+ [
16
+ "VMB1DM",
17
+ "VMBDME",
18
+ "VMB4DC",
19
+ "VMBDMI",
20
+ "VMBDMI-R",
21
+ "VMB1LED",
22
+ "VMB8DC-20",
23
+ "VMB4LEDPWM-20",
24
+ ],
16
25
  )
17
26
  class SliderStatusMessage(Message):
18
27
  """
@@ -69,6 +69,7 @@ from velbusaio.messages.channel_name_request import (
69
69
  from velbusaio.messages.clear_led import ClearLedMessage
70
70
  from velbusaio.messages.counter_status import CounterStatusMessage
71
71
  from velbusaio.messages.counter_status_request import CounterStatusRequestMessage
72
+ from velbusaio.messages.counter_value import CounterValueMessage
72
73
  from velbusaio.messages.dali_device_settings import DaliDeviceSettingMsg
73
74
  from velbusaio.messages.dali_device_settings import DeviceType as DaliDeviceType
74
75
  from velbusaio.messages.dali_device_settings import DeviceTypeMsg as DaliDeviceTypeMsg
@@ -545,6 +546,10 @@ class Module:
545
546
  await self._update_channel(
546
547
  message.sensor, {"cur": message.value, "unit": message.unit}
547
548
  )
549
+ elif isinstance(message, CounterValueMessage):
550
+ await self._update_channel(
551
+ message.channel, {"power": message.power, "energy": message.energy}
552
+ )
548
553
 
549
554
  async def _update_channel(self, channel: int, updates: dict):
550
555
  try:
@@ -785,6 +790,8 @@ class Module:
785
790
  "ThermostatAddr" in self._data and self._data["ThermostatAddr"] != 0
786
791
  ):
787
792
  await self._update_channel(int(chan), {"thermostat": True})
793
+ if chan_data["Type"] == "Dimmer" and "sliderScale" in self._data:
794
+ self._channels[int(chan)].slider_scale = self._data["sliderScale"]
788
795
 
789
796
 
790
797
  class VmbDali(Module):