velbus-aio 2023.12.0__py3-none-any.whl → 2025.11.0__py3-none-any.whl

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 (192) hide show
  1. scripts/parse_specs.py +156 -0
  2. {velbus_aio-2023.12.0.dist-info → velbus_aio-2025.11.0.dist-info}/METADATA +24 -8
  3. velbus_aio-2025.11.0.dist-info/RECORD +194 -0
  4. {velbus_aio-2023.12.0.dist-info → velbus_aio-2025.11.0.dist-info}/WHEEL +1 -1
  5. {velbus_aio-2023.12.0.dist-info → velbus_aio-2025.11.0.dist-info}/top_level.txt +1 -0
  6. velbusaio/channels.py +35 -14
  7. velbusaio/command_registry.py +32 -5
  8. velbusaio/const.py +10 -2
  9. velbusaio/controller.py +183 -145
  10. velbusaio/handler.py +286 -154
  11. velbusaio/helpers.py +2 -1
  12. velbusaio/message.py +14 -8
  13. velbusaio/messages/__init__.py +6 -2
  14. velbusaio/messages/blind_status.py +4 -2
  15. velbusaio/messages/bus_active.py +1 -0
  16. velbusaio/messages/bus_error_counter_status.py +1 -0
  17. velbusaio/messages/bus_error_counter_status_request.py +1 -0
  18. velbusaio/messages/bus_off.py +1 -0
  19. velbusaio/messages/channel_name_part1.py +18 -0
  20. velbusaio/messages/channel_name_part2.py +18 -0
  21. velbusaio/messages/channel_name_part3.py +18 -0
  22. velbusaio/messages/channel_name_request.py +2 -1
  23. velbusaio/messages/clear_led.py +1 -0
  24. velbusaio/messages/counter_status.py +1 -0
  25. velbusaio/messages/counter_status_request.py +1 -0
  26. velbusaio/messages/counter_value.py +44 -0
  27. velbusaio/messages/cover_down.py +2 -1
  28. velbusaio/messages/cover_off.py +2 -3
  29. velbusaio/messages/cover_position.py +3 -4
  30. velbusaio/messages/cover_up.py +2 -1
  31. velbusaio/messages/dali_device_settings.py +2 -1
  32. velbusaio/messages/dali_device_settings_request.py +2 -1
  33. velbusaio/messages/dali_dim_value_status.py +4 -1
  34. velbusaio/messages/dimmer_channel_status.py +5 -1
  35. velbusaio/messages/dimmer_status.py +13 -1
  36. velbusaio/messages/edge_set_color.py +1 -0
  37. velbusaio/messages/edge_set_custom_color.py +1 -0
  38. velbusaio/messages/fast_blinking_led.py +1 -0
  39. velbusaio/messages/forced_off.py +1 -0
  40. velbusaio/messages/forced_on.py +1 -0
  41. velbusaio/messages/interface_status_request.py +1 -0
  42. velbusaio/messages/ir_receiver_status.py +1 -0
  43. velbusaio/messages/kwh_status.py +1 -0
  44. velbusaio/messages/light_value_request.py +1 -0
  45. velbusaio/messages/memo_text.py +1 -0
  46. velbusaio/messages/memory_data.py +1 -0
  47. velbusaio/messages/memory_data_block.py +1 -0
  48. velbusaio/messages/memory_dump_request.py +1 -0
  49. velbusaio/messages/module_status.py +13 -0
  50. velbusaio/messages/module_status_request.py +5 -2
  51. velbusaio/messages/module_subtype.py +4 -3
  52. velbusaio/messages/module_type.py +17 -7
  53. velbusaio/messages/module_type_request.py +1 -0
  54. velbusaio/messages/psu_load.py +56 -0
  55. velbusaio/messages/psu_values.py +53 -0
  56. velbusaio/messages/push_button_status.py +1 -0
  57. velbusaio/messages/raw.py +1 -0
  58. velbusaio/messages/read_data_block_from_memory.py +1 -0
  59. velbusaio/messages/read_data_from_memory.py +1 -0
  60. velbusaio/messages/realtime_clock_status_request.py +1 -0
  61. velbusaio/messages/receive_buffer_full.py +1 -0
  62. velbusaio/messages/receive_ready.py +1 -0
  63. velbusaio/messages/relay_status.py +1 -0
  64. velbusaio/messages/restore_dimmer.py +16 -2
  65. velbusaio/messages/select_program.py +1 -0
  66. velbusaio/messages/sensor_settings_request.py +1 -0
  67. velbusaio/messages/sensor_temp_request.py +1 -0
  68. velbusaio/messages/sensor_temperature.py +1 -0
  69. velbusaio/messages/set_date.py +5 -10
  70. velbusaio/messages/set_daylight_saving.py +3 -6
  71. velbusaio/messages/set_dimmer.py +22 -13
  72. velbusaio/messages/set_led.py +1 -0
  73. velbusaio/messages/set_realtime_clock.py +5 -10
  74. velbusaio/messages/set_temperature.py +1 -0
  75. velbusaio/messages/slider_status.py +15 -1
  76. velbusaio/messages/slow_blinking_led.py +1 -0
  77. velbusaio/messages/start_relay_blinking_timer.py +1 -0
  78. velbusaio/messages/start_relay_timer.py +1 -0
  79. velbusaio/messages/switch_relay_off.py +1 -0
  80. velbusaio/messages/switch_relay_on.py +1 -0
  81. velbusaio/messages/switch_to_comfort.py +1 -0
  82. velbusaio/messages/switch_to_day.py +1 -0
  83. velbusaio/messages/switch_to_night.py +1 -0
  84. velbusaio/messages/switch_to_safe.py +1 -0
  85. velbusaio/messages/temp_sensor_settings_part1.py +1 -0
  86. velbusaio/messages/temp_sensor_settings_part2.py +1 -0
  87. velbusaio/messages/temp_sensor_settings_part3.py +1 -0
  88. velbusaio/messages/temp_sensor_settings_part4.py +1 -0
  89. velbusaio/messages/temp_sensor_settings_request.py +1 -0
  90. velbusaio/messages/temp_sensor_status.py +1 -0
  91. velbusaio/messages/temp_set_cooling.py +1 -0
  92. velbusaio/messages/temp_set_heating.py +1 -0
  93. velbusaio/messages/update_led_status.py +1 -0
  94. velbusaio/messages/very_fast_blinking_led.py +1 -0
  95. velbusaio/messages/write_data_to_memory.py +1 -0
  96. velbusaio/messages/write_memory_block.py +1 -0
  97. velbusaio/messages/write_module_address_and_serial_number.py +1 -0
  98. velbusaio/module.py +214 -102
  99. velbusaio/module_spec/01.json +62 -0
  100. velbusaio/module_spec/02.json +16 -0
  101. velbusaio/module_spec/03.json +23 -0
  102. velbusaio/module_spec/04.json +283 -0
  103. velbusaio/module_spec/05.json +54 -0
  104. velbusaio/module_spec/06.json +110 -0
  105. velbusaio/module_spec/07.json +16 -0
  106. velbusaio/module_spec/08.json +38 -0
  107. velbusaio/module_spec/09.json +30 -0
  108. velbusaio/module_spec/0A.json +58 -0
  109. velbusaio/module_spec/0B.json +58 -0
  110. velbusaio/module_spec/0C.json +18 -0
  111. velbusaio/module_spec/0E.json +25 -0
  112. velbusaio/module_spec/0F.json +16 -0
  113. velbusaio/module_spec/10.json +111 -0
  114. velbusaio/module_spec/11.json +111 -0
  115. velbusaio/module_spec/12.json +73 -0
  116. velbusaio/module_spec/13.json +4 -0
  117. velbusaio/module_spec/14.json +16 -0
  118. velbusaio/module_spec/15.json +83 -0
  119. velbusaio/module_spec/16.json +129 -0
  120. velbusaio/module_spec/17.json +129 -0
  121. velbusaio/module_spec/18.json +129 -0
  122. velbusaio/module_spec/1A.json +79 -0
  123. velbusaio/module_spec/1B.json +107 -0
  124. velbusaio/module_spec/1D.json +89 -0
  125. velbusaio/module_spec/1E.json +306 -0
  126. velbusaio/module_spec/1F.json +178 -0
  127. velbusaio/module_spec/20.json +178 -0
  128. velbusaio/module_spec/21.json +326 -0
  129. velbusaio/module_spec/22.json +426 -0
  130. velbusaio/module_spec/23.json +129 -0
  131. velbusaio/module_spec/24.json +30 -0
  132. velbusaio/module_spec/25.json +3 -0
  133. velbusaio/module_spec/28.json +454 -0
  134. velbusaio/module_spec/29.json +235 -0
  135. velbusaio/module_spec/2A.json +239 -0
  136. velbusaio/module_spec/2B.json +239 -0
  137. velbusaio/module_spec/2C.json +257 -0
  138. velbusaio/module_spec/2D.json +270 -0
  139. velbusaio/module_spec/2E.json +215 -0
  140. velbusaio/module_spec/2F.json +211 -0
  141. velbusaio/module_spec/30.json +58 -0
  142. velbusaio/module_spec/31.json +465 -0
  143. velbusaio/module_spec/32.json +385 -0
  144. velbusaio/module_spec/33.json +249 -0
  145. velbusaio/module_spec/34.json +313 -0
  146. velbusaio/module_spec/35.json +313 -0
  147. velbusaio/module_spec/36.json +313 -0
  148. velbusaio/module_spec/37.json +333 -0
  149. velbusaio/module_spec/38.json +111 -0
  150. velbusaio/module_spec/39.json +4 -0
  151. velbusaio/module_spec/3A.json +306 -0
  152. velbusaio/module_spec/3B.json +306 -0
  153. velbusaio/module_spec/3C.json +306 -0
  154. velbusaio/module_spec/3D.json +454 -0
  155. velbusaio/module_spec/3E.json +302 -0
  156. velbusaio/module_spec/3F.json +4 -0
  157. velbusaio/module_spec/40.json +4 -0
  158. velbusaio/module_spec/41.json +241 -0
  159. velbusaio/module_spec/42.json +4 -0
  160. velbusaio/module_spec/43.json +23 -0
  161. velbusaio/module_spec/44.json +38 -0
  162. velbusaio/module_spec/45.json +4 -0
  163. velbusaio/module_spec/48.json +111 -0
  164. velbusaio/module_spec/49.json +111 -0
  165. velbusaio/module_spec/4A.json +89 -0
  166. velbusaio/module_spec/4B.json +138 -0
  167. velbusaio/module_spec/4C.json +129 -0
  168. velbusaio/module_spec/4D.json +108 -0
  169. velbusaio/module_spec/4E.json +787 -0
  170. velbusaio/module_spec/4F.json +114 -0
  171. velbusaio/module_spec/50.json +114 -0
  172. velbusaio/module_spec/51.json +114 -0
  173. velbusaio/module_spec/52.json +456 -0
  174. velbusaio/module_spec/54.json +270 -0
  175. velbusaio/module_spec/55.json +270 -0
  176. velbusaio/module_spec/56.json +270 -0
  177. velbusaio/module_spec/57.json +260 -0
  178. velbusaio/module_spec/5A.json +4 -0
  179. velbusaio/module_spec/5B.json +4 -0
  180. velbusaio/module_spec/5C.json +90 -0
  181. velbusaio/module_spec/5F.json +78 -0
  182. velbusaio/module_spec/60.json +4 -0
  183. velbusaio/module_spec/61.json +89 -0
  184. velbusaio/module_spec/broadcast.json +67 -0
  185. velbusaio/module_spec/ignore.json +22 -0
  186. velbusaio/protocol.py +34 -17
  187. velbusaio/raw_message.py +6 -6
  188. velbusaio/util.py +4 -0
  189. velbusaio/vlp_reader.py +249 -0
  190. velbus_aio-2023.12.0.dist-info/RECORD +0 -103
  191. velbusaio/moduleprotocol/protocol.json +0 -26507
  192. {velbus_aio-2023.12.0.dist-info → velbus_aio-2025.11.0.dist-info/licenses}/LICENSE +0 -0
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -69,6 +70,23 @@ class ChannelNamePart1Message(Message):
69
70
  "VMBELPIR",
70
71
  "VMBDALI",
71
72
  "VMB4AN",
73
+ "VMB6PB-20",
74
+ "VMBEL1-20",
75
+ "VMBEL2-20",
76
+ "VMBEL4-20",
77
+ "VMBELO-20",
78
+ "VMBGP1-20",
79
+ "VMBGP2-20",
80
+ "VMBGP4-20",
81
+ "VMBGPO-20",
82
+ "VMBDALI-20",
83
+ "VMBEL4PIR-20",
84
+ "VMBGP4PIR-20",
85
+ "VMB4LEDPWM-20",
86
+ "VMB8DC-20",
87
+ "VMB2DC-20",
88
+ "VMB8IN-20",
89
+ "VMBPSUMNGR-20",
72
90
  ],
73
91
  )
74
92
  class ChannelNamePart1Message2(ChannelNamePart1Message):
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -69,6 +70,23 @@ class ChannelNamePart2Message(Message):
69
70
  "VMBELPIR",
70
71
  "VMBDALI",
71
72
  "VMB4AN",
73
+ "VMB6PB-20",
74
+ "VMBEL1-20",
75
+ "VMBEL2-20",
76
+ "VMBEL4-20",
77
+ "VMBELO-20",
78
+ "VMBGP1-20",
79
+ "VMBGP2-20",
80
+ "VMBGP4-20",
81
+ "VMBGPO-20",
82
+ "VMBDALI-20",
83
+ "VMBEL4PIR-20",
84
+ "VMBGP4PIR-20",
85
+ "VMB8DC-20",
86
+ "VMB2DC-20",
87
+ "VMB8IN-20",
88
+ "VMB4LEDPWM-20",
89
+ "VMBPSUMNGR-20",
72
90
  ],
73
91
  )
74
92
  class ChannelNamePart2Message2(ChannelNamePart2Message):
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -69,6 +70,23 @@ class ChannelNamePart3Message(Message):
69
70
  "VMBELPIR",
70
71
  "VMBDALI",
71
72
  "VMB4AN",
73
+ "VMB6PB-20",
74
+ "VMBEL1-20",
75
+ "VMBEL2-20",
76
+ "VMBEL4-20",
77
+ "VMBELO-20",
78
+ "VMBGP1-20",
79
+ "VMBGP2-20",
80
+ "VMBGP4-20",
81
+ "VMBGPO-20",
82
+ "VMBDALI-20",
83
+ "VMBEL4PIR-20",
84
+ "VMBGP4PIR-20",
85
+ "VMB8DC-20",
86
+ "VMB2DC-20",
87
+ "VMB8IN-20",
88
+ "VMB4LEDPWM-20",
89
+ "VMBPSUMNGR-20",
72
90
  ],
73
91
  )
74
92
  class ChannelNamePart3Message2(ChannelNamePart3Message):
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org> and Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -70,7 +71,7 @@ class ChannelNameRequestMessage2(ChannelNameRequestMessage):
70
71
  return bytes([COMMAND_CODE, tmp])
71
72
 
72
73
 
73
- @register(COMMAND_CODE, ["VMBDALI"])
74
+ @register(COMMAND_CODE, ["VMBDALI", "VMBDALI-20"])
74
75
  class ChannelNameRequestMessage3(ChannelNameRequestMessage):
75
76
  """
76
77
  send by:
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -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
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Tom Dupré <gitd8400@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  import struct
@@ -11,7 +12,7 @@ from velbusaio.message import Message
11
12
  COMMAND_CODE = 0x06
12
13
 
13
14
 
14
- @register(COMMAND_CODE, ["VMB1BLE", "VMB2BLE", "VMB1BLS"])
15
+ @register(COMMAND_CODE, ["VMB1BLE", "VMB2BLE", "VMB1BLS", "VMB2BLE-10"])
15
16
  class CoverDownMessage(Message):
16
17
  """
17
18
  sent by:
@@ -1,9 +1,8 @@
1
1
  """
2
2
  :author: Tom Dupré <gitd8400@gmail.com>
3
3
  """
4
- from __future__ import annotations
5
4
 
6
- import struct
5
+ from __future__ import annotations
7
6
 
8
7
  from velbusaio.command_registry import register
9
8
  from velbusaio.message import Message
@@ -11,7 +10,7 @@ from velbusaio.message import Message
11
10
  COMMAND_CODE = 0x04
12
11
 
13
12
 
14
- @register(COMMAND_CODE, ["VMB1BLE", "VMB2BLE", "VMB1BLS"])
13
+ @register(COMMAND_CODE, ["VMB1BLE", "VMB2BLE", "VMB1BLS", "VMB2BLE-10"])
15
14
  class CoverOffMessage(Message):
16
15
  """
17
16
  sent by:
@@ -1,9 +1,8 @@
1
1
  """
2
2
  :author: Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
- from __future__ import annotations
5
4
 
6
- import struct
5
+ from __future__ import annotations
7
6
 
8
7
  from velbusaio.command_registry import register
9
8
  from velbusaio.message import Message
@@ -11,7 +10,7 @@ from velbusaio.message import Message
11
10
  COMMAND_CODE = 0x1C
12
11
 
13
12
 
14
- @register(COMMAND_CODE, ["VMB1BLE", "VMB2BLE", "VMB1BLS"])
13
+ @register(COMMAND_CODE, ["VMB1BLE", "VMB2BLE", "VMB1BLS", "VMB2BLE-10"])
15
14
  class CoverPosMessage(Message):
16
15
  """
17
16
  sent by:
@@ -30,7 +29,7 @@ class CoverPosMessage(Message):
30
29
  """
31
30
  self.needs_high_priority(priority)
32
31
  self.needs_no_rtr(rtr)
33
- self.needs_data(data, 4)
32
+ self.needs_data(data, 2)
34
33
  self.set_attributes(priority, address, rtr)
35
34
  self.channel = self.byte_to_channel(data[0])
36
35
  self.position = data[1]
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Tom Dupré <gitd8400@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  import struct
@@ -11,7 +12,7 @@ from velbusaio.message import Message
11
12
  COMMAND_CODE = 0x05
12
13
 
13
14
 
14
- @register(COMMAND_CODE, ["VMB1BLE", "VMB2BLE", "VMB1BLS"])
15
+ @register(COMMAND_CODE, ["VMB1BLE", "VMB2BLE", "VMB1BLS", "VMB2BLE-10"])
15
16
  class CoverUpMessage(Message):
16
17
  """
17
18
  sent by:
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Niels Laukens
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  import dataclasses
@@ -12,7 +13,7 @@ from velbusaio.message import Message
12
13
  COMMAND_CODE = 0xE8
13
14
 
14
15
 
15
- @register(COMMAND_CODE, ["VMBDALI"])
16
+ @register(COMMAND_CODE, ["VMBDALI", "VMBDALI-20"])
16
17
  class DaliDeviceSettingMsg(Message):
17
18
  """
18
19
  send by: VMBDALI
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Niels Laukens
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  import enum
@@ -17,7 +18,7 @@ class DataSource(enum.Enum):
17
18
  FromDaliDevice = 1
18
19
 
19
20
 
20
- @register(COMMAND_CODE, ["VMBDALI"])
21
+ @register(COMMAND_CODE, ["VMBDALI", "VMBDALI-20"])
21
22
  class DaliDeviceSettingsRequest(Message):
22
23
  """
23
24
  send by:
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Niels Laukens
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -9,7 +10,9 @@ from velbusaio.message import Message
9
10
  COMMAND_CODE = 0xA5
10
11
 
11
12
 
12
- @register(COMMAND_CODE, ["VMBDALI"])
13
+ @register(
14
+ COMMAND_CODE, ["VMBDALI", "VMBDALI-20", "VMB8DC-20", "VMB4LEDPWM-20", "VMB2DC-20"]
15
+ )
13
16
  class DimValueStatus(Message):
14
17
  """
15
18
  send by: VMBDALI
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Frank van Breugel
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  import struct
@@ -21,7 +22,10 @@ LED_FAST_BLINKING = 1 << 5
21
22
  LED_VERY_FAST_BLINKING = 1 << 4
22
23
 
23
24
 
24
- @register(COMMAND_CODE, ["VMB4DC", "VMBDMI", "VMBDMI-R"])
25
+ @register(
26
+ COMMAND_CODE,
27
+ ["VMB4DC", "VMBDMI", "VMBDMI-R", "VMB8DC-20", "VMB4LEDPWM-20", "VMB2DC-20"],
28
+ )
25
29
  class DimmerChannelStatusMessage(Message):
26
30
  """
27
31
  sent by: VMB4DC
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Frank van Breugel
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  import struct
@@ -24,7 +25,18 @@ LED_FAST_BLINKING = 1 << 5
24
25
  LED_VERY_FAST_BLINKING = 1 << 4
25
26
 
26
27
 
27
- @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
+ )
28
40
  class DimmerStatusMessage(Message):
29
41
  """
30
42
  sent by: VMBDME
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from enum import IntEnum
4
+
4
5
  from velbusaio.command_registry import register
5
6
  from velbusaio.message import Message
6
7
 
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: David Danssaert <david.danssaert@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -75,6 +76,18 @@ class ModuleStatusMessage(Message):
75
76
  "VMBGPOD-2",
76
77
  "VMBELO",
77
78
  "VMB7IN",
79
+ "VMB6PB-20",
80
+ "VMBEL1-20",
81
+ "VMBEL2-20",
82
+ "VMBEL4-20",
83
+ "VMBELO-20",
84
+ "VMBGP1-20",
85
+ "VMBGP2-20",
86
+ "VMBGP4-20",
87
+ "VMBGPO-20",
88
+ "VMBEL4PIR-20",
89
+ "VMBGP4PIR-20",
90
+ "VMBPSUMNGR-20",
78
91
  ],
79
92
  )
80
93
  class ModuleStatusMessage2(Message):
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.command_registry import register
@@ -18,7 +19,7 @@ class ModuleStatusRequestMessage(Message):
18
19
 
19
20
  def __init__(self, address=None):
20
21
  Message.__init__(self)
21
- self.channels = []
22
+ self.channels: list | str = []
22
23
  self.wait_after_send = 500
23
24
  self.set_defaults(address)
24
25
 
@@ -36,4 +37,6 @@ class ModuleStatusRequestMessage(Message):
36
37
  """
37
38
  :return: bytes
38
39
  """
39
- return bytes([COMMAND_CODE, self.channels_to_byte(self.channels)])
40
+ if isinstance(self.channels, list):
41
+ return bytes([COMMAND_CODE, self.channels_to_byte(self.channels)])
42
+ return bytes([COMMAND_CODE, int(self.channels, 16)])
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  import struct
@@ -24,7 +25,7 @@ class ModuleSubTypeMessage(Message):
24
25
 
25
26
  # pylint: disable-msg=R0902
26
27
 
27
- def __init__(self, address=None, sub_address_offset: int = 0):
28
+ def __init__(self, address=None, sub_address_offset: int = 0) -> None:
28
29
  Message.__init__(self)
29
30
  self.module_type = 0x00
30
31
  self.sub_address_1 = 0xFF
@@ -35,13 +36,13 @@ class ModuleSubTypeMessage(Message):
35
36
  self.serial = 0
36
37
  self.sub_address_offset = sub_address_offset
37
38
 
38
- def module_name(self):
39
+ def module_name(self) -> str:
39
40
  """
40
41
  :return: str
41
42
  """
42
43
  return "Unknown"
43
44
 
44
- def populate(self, priority, address, rtr, data):
45
+ def populate(self, priority, address, rtr, data) -> None:
45
46
  """
46
47
  :return: None
47
48
  """
@@ -1,11 +1,12 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  import struct
7
8
 
8
- from velbusaio.command_registry import register
9
+ from velbusaio.command_registry import MODULE_DIRECTORY, register
9
10
  from velbusaio.message import Message
10
11
 
11
12
  COMMAND_CODE = 0xFF
@@ -97,7 +98,7 @@ class ModuleTypeMessage(Message):
97
98
 
98
99
  # pylint: disable-msg=R0902
99
100
 
100
- def __init__(self, address=None):
101
+ def __init__(self, address=None) -> None:
101
102
  Message.__init__(self)
102
103
  self.module_type = 0x00
103
104
  self.led_on = []
@@ -109,13 +110,18 @@ class ModuleTypeMessage(Message):
109
110
  self.build_week = 0
110
111
  self.set_defaults(address)
111
112
 
112
- def module_name(self):
113
+ def module_type_name(self) -> str:
113
114
  """
114
115
  :return: str
115
116
  """
116
- return "Unknown"
117
117
 
118
- def populate(self, priority, address, rtr, data):
118
+ return (
119
+ MODULE_DIRECTORY[self.module_type]
120
+ if self.module_type in MODULE_DIRECTORY
121
+ else "Unknown"
122
+ )
123
+
124
+ def populate(self, priority, address, rtr, data) -> None:
119
125
  """
120
126
  :return: None
121
127
  """
@@ -147,10 +153,14 @@ class ModuleTypeMessage(Message):
147
153
  "VMBGPO-20",
148
154
  "VMBEL4PIR-20",
149
155
  "VMBGP4PIR-20",
156
+ "VMB4LEDPWM-20",
157
+ "VMB8IN-20",
158
+ "VMB8DC-20",
159
+ "VMB2DC-20",
150
160
  ],
151
161
  )
152
162
  class ModuleType2Message(Message):
153
- def __init__(self, address=None):
163
+ def __init__(self, address=None) -> None:
154
164
  Message.__init__(self)
155
165
  self.module_type = 0x00
156
166
  self.led_on = []
@@ -163,7 +173,7 @@ class ModuleType2Message(Message):
163
173
  self.term = 0
164
174
  self.set_defaults(address)
165
175
 
166
- def module_name(self):
176
+ def module_name(self) -> str:
167
177
  """
168
178
  :return: str
169
179
  """
@@ -1,6 +1,7 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
7
  from velbusaio.message import Message