velbus-aio 2021.8.7__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 (200) hide show
  1. scripts/parse_specs.py +156 -0
  2. velbus_aio-2025.11.0.dist-info/METADATA +71 -0
  3. velbus_aio-2025.11.0.dist-info/RECORD +194 -0
  4. {velbus_aio-2021.8.7.dist-info → velbus_aio-2025.11.0.dist-info}/WHEEL +1 -1
  5. velbus_aio-2025.11.0.dist-info/top_level.txt +3 -0
  6. velbusaio/channels.py +443 -109
  7. velbusaio/command_registry.py +126 -13
  8. velbusaio/const.py +36 -12
  9. velbusaio/controller.py +252 -177
  10. velbusaio/discovery.py +2 -2
  11. velbusaio/exceptions.py +22 -0
  12. velbusaio/handler.py +311 -145
  13. velbusaio/helpers.py +6 -18
  14. velbusaio/message.py +46 -132
  15. velbusaio/messages/__init__.py +12 -2
  16. velbusaio/messages/blind_status.py +16 -25
  17. velbusaio/messages/bus_active.py +3 -9
  18. velbusaio/messages/bus_error_counter_status.py +3 -4
  19. velbusaio/messages/bus_error_counter_status_request.py +3 -4
  20. velbusaio/messages/bus_off.py +3 -4
  21. velbusaio/messages/channel_name_part1.py +49 -33
  22. velbusaio/messages/channel_name_part2.py +49 -33
  23. velbusaio/messages/channel_name_part3.py +49 -33
  24. velbusaio/messages/channel_name_request.py +26 -12
  25. velbusaio/messages/clear_led.py +3 -4
  26. velbusaio/messages/counter_status.py +3 -17
  27. velbusaio/messages/counter_status_request.py +6 -6
  28. velbusaio/messages/counter_value.py +44 -0
  29. velbusaio/messages/cover_down.py +4 -29
  30. velbusaio/messages/cover_off.py +5 -29
  31. velbusaio/messages/cover_position.py +4 -19
  32. velbusaio/messages/cover_up.py +4 -27
  33. velbusaio/messages/dali_device_settings.py +178 -0
  34. velbusaio/messages/dali_device_settings_request.py +53 -0
  35. velbusaio/messages/dali_dim_value_status.py +44 -0
  36. velbusaio/messages/dimmer_channel_status.py +6 -19
  37. velbusaio/messages/dimmer_status.py +14 -31
  38. velbusaio/messages/edge_set_color.py +114 -0
  39. velbusaio/messages/edge_set_custom_color.py +56 -0
  40. velbusaio/messages/fast_blinking_led.py +3 -4
  41. velbusaio/messages/forced_off.py +3 -4
  42. velbusaio/messages/forced_on.py +3 -4
  43. velbusaio/messages/interface_status_request.py +3 -4
  44. velbusaio/messages/ir_receiver_status.py +18 -0
  45. velbusaio/messages/kwh_status.py +3 -19
  46. velbusaio/messages/light_value_request.py +3 -4
  47. velbusaio/messages/memo_text.py +3 -5
  48. velbusaio/messages/memory_data.py +3 -16
  49. velbusaio/messages/memory_data_block.py +3 -4
  50. velbusaio/messages/memory_dump_request.py +3 -4
  51. velbusaio/messages/module_status.py +107 -55
  52. velbusaio/messages/module_status_request.py +7 -6
  53. velbusaio/messages/module_subtype.py +11 -19
  54. velbusaio/messages/module_type.py +132 -21
  55. velbusaio/messages/module_type_request.py +1 -0
  56. velbusaio/messages/psu_load.py +56 -0
  57. velbusaio/messages/psu_values.py +53 -0
  58. velbusaio/messages/push_button_status.py +3 -16
  59. velbusaio/messages/raw.py +74 -0
  60. velbusaio/messages/read_data_block_from_memory.py +3 -4
  61. velbusaio/messages/read_data_from_memory.py +3 -4
  62. velbusaio/messages/realtime_clock_status_request.py +3 -4
  63. velbusaio/messages/receive_buffer_full.py +3 -4
  64. velbusaio/messages/receive_ready.py +3 -4
  65. velbusaio/messages/relay_status.py +13 -42
  66. velbusaio/messages/restore_dimmer.py +33 -24
  67. velbusaio/messages/select_program.py +35 -0
  68. velbusaio/messages/sensor_settings_request.py +3 -4
  69. velbusaio/messages/sensor_temp_request.py +3 -4
  70. velbusaio/messages/sensor_temperature.py +15 -19
  71. velbusaio/messages/set_date.py +10 -30
  72. velbusaio/messages/set_daylight_saving.py +8 -24
  73. velbusaio/messages/set_dimmer.py +43 -41
  74. velbusaio/messages/set_led.py +3 -4
  75. velbusaio/messages/set_realtime_clock.py +10 -30
  76. velbusaio/messages/set_temperature.py +3 -4
  77. velbusaio/messages/slider_status.py +16 -20
  78. velbusaio/messages/slow_blinking_led.py +3 -4
  79. velbusaio/messages/start_relay_blinking_timer.py +3 -4
  80. velbusaio/messages/start_relay_timer.py +3 -4
  81. velbusaio/messages/switch_relay_off.py +3 -16
  82. velbusaio/messages/switch_relay_on.py +3 -16
  83. velbusaio/messages/switch_to_comfort.py +4 -15
  84. velbusaio/messages/switch_to_day.py +4 -15
  85. velbusaio/messages/switch_to_night.py +4 -15
  86. velbusaio/messages/switch_to_safe.py +4 -15
  87. velbusaio/messages/temp_sensor_settings_part1.py +3 -4
  88. velbusaio/messages/temp_sensor_settings_part2.py +27 -0
  89. velbusaio/messages/temp_sensor_settings_part3.py +27 -0
  90. velbusaio/messages/temp_sensor_settings_part4.py +27 -0
  91. velbusaio/messages/temp_sensor_settings_request.py +3 -4
  92. velbusaio/messages/temp_sensor_status.py +34 -35
  93. velbusaio/messages/temp_set_cooling.py +3 -13
  94. velbusaio/messages/temp_set_heating.py +3 -13
  95. velbusaio/messages/update_led_status.py +3 -4
  96. velbusaio/messages/very_fast_blinking_led.py +3 -4
  97. velbusaio/messages/write_data_to_memory.py +3 -4
  98. velbusaio/messages/write_memory_block.py +3 -4
  99. velbusaio/messages/write_module_address_and_serial_number.py +3 -4
  100. velbusaio/module.py +680 -158
  101. velbusaio/module_spec/01.json +62 -0
  102. velbusaio/module_spec/02.json +16 -0
  103. velbusaio/module_spec/03.json +23 -0
  104. velbusaio/module_spec/04.json +283 -0
  105. velbusaio/module_spec/05.json +54 -0
  106. velbusaio/module_spec/06.json +110 -0
  107. velbusaio/module_spec/07.json +16 -0
  108. velbusaio/module_spec/08.json +38 -0
  109. velbusaio/module_spec/09.json +30 -0
  110. velbusaio/module_spec/0A.json +58 -0
  111. velbusaio/module_spec/0B.json +58 -0
  112. velbusaio/module_spec/0C.json +18 -0
  113. velbusaio/module_spec/0E.json +25 -0
  114. velbusaio/module_spec/0F.json +16 -0
  115. velbusaio/module_spec/10.json +111 -0
  116. velbusaio/module_spec/11.json +111 -0
  117. velbusaio/module_spec/12.json +73 -0
  118. velbusaio/module_spec/13.json +4 -0
  119. velbusaio/module_spec/14.json +16 -0
  120. velbusaio/module_spec/15.json +83 -0
  121. velbusaio/module_spec/16.json +129 -0
  122. velbusaio/module_spec/17.json +129 -0
  123. velbusaio/module_spec/18.json +129 -0
  124. velbusaio/module_spec/1A.json +79 -0
  125. velbusaio/module_spec/1B.json +107 -0
  126. velbusaio/module_spec/1D.json +89 -0
  127. velbusaio/module_spec/1E.json +306 -0
  128. velbusaio/module_spec/1F.json +178 -0
  129. velbusaio/module_spec/20.json +178 -0
  130. velbusaio/module_spec/21.json +326 -0
  131. velbusaio/module_spec/22.json +426 -0
  132. velbusaio/module_spec/23.json +129 -0
  133. velbusaio/module_spec/24.json +30 -0
  134. velbusaio/module_spec/25.json +3 -0
  135. velbusaio/module_spec/28.json +454 -0
  136. velbusaio/module_spec/29.json +235 -0
  137. velbusaio/module_spec/2A.json +239 -0
  138. velbusaio/module_spec/2B.json +239 -0
  139. velbusaio/module_spec/2C.json +257 -0
  140. velbusaio/module_spec/2D.json +270 -0
  141. velbusaio/module_spec/2E.json +215 -0
  142. velbusaio/module_spec/2F.json +211 -0
  143. velbusaio/module_spec/30.json +58 -0
  144. velbusaio/module_spec/31.json +465 -0
  145. velbusaio/module_spec/32.json +385 -0
  146. velbusaio/module_spec/33.json +249 -0
  147. velbusaio/module_spec/34.json +313 -0
  148. velbusaio/module_spec/35.json +313 -0
  149. velbusaio/module_spec/36.json +313 -0
  150. velbusaio/module_spec/37.json +333 -0
  151. velbusaio/module_spec/38.json +111 -0
  152. velbusaio/module_spec/39.json +4 -0
  153. velbusaio/module_spec/3A.json +306 -0
  154. velbusaio/module_spec/3B.json +306 -0
  155. velbusaio/module_spec/3C.json +306 -0
  156. velbusaio/module_spec/3D.json +454 -0
  157. velbusaio/module_spec/3E.json +302 -0
  158. velbusaio/module_spec/3F.json +4 -0
  159. velbusaio/module_spec/40.json +4 -0
  160. velbusaio/module_spec/41.json +241 -0
  161. velbusaio/module_spec/42.json +4 -0
  162. velbusaio/module_spec/43.json +23 -0
  163. velbusaio/module_spec/44.json +38 -0
  164. velbusaio/module_spec/45.json +4 -0
  165. velbusaio/module_spec/48.json +111 -0
  166. velbusaio/module_spec/49.json +111 -0
  167. velbusaio/module_spec/4A.json +89 -0
  168. velbusaio/module_spec/4B.json +138 -0
  169. velbusaio/module_spec/4C.json +129 -0
  170. velbusaio/module_spec/4D.json +108 -0
  171. velbusaio/module_spec/4E.json +787 -0
  172. velbusaio/module_spec/4F.json +114 -0
  173. velbusaio/module_spec/50.json +114 -0
  174. velbusaio/module_spec/51.json +114 -0
  175. velbusaio/module_spec/52.json +456 -0
  176. velbusaio/module_spec/54.json +270 -0
  177. velbusaio/module_spec/55.json +270 -0
  178. velbusaio/module_spec/56.json +270 -0
  179. velbusaio/module_spec/57.json +260 -0
  180. velbusaio/module_spec/5A.json +4 -0
  181. velbusaio/module_spec/5B.json +4 -0
  182. velbusaio/module_spec/5C.json +90 -0
  183. velbusaio/module_spec/5F.json +78 -0
  184. velbusaio/module_spec/60.json +4 -0
  185. velbusaio/module_spec/61.json +89 -0
  186. velbusaio/module_spec/broadcast.json +67 -0
  187. velbusaio/module_spec/ignore.json +22 -0
  188. velbusaio/protocol.py +243 -0
  189. velbusaio/py.typed +0 -0
  190. velbusaio/raw_message.py +149 -0
  191. velbusaio/util.py +55 -0
  192. velbusaio/vlp_reader.py +249 -0
  193. velbus_aio-2021.8.7.dist-info/METADATA +0 -66
  194. velbus_aio-2021.8.7.dist-info/RECORD +0 -90
  195. velbus_aio-2021.8.7.dist-info/top_level.txt +0 -1
  196. velbusaio/messages/meteo_raw.py +0 -52
  197. velbusaio/module_registry.py +0 -64
  198. velbusaio/moduleprotocol/protocol.json +0 -25540
  199. velbusaio/parser.py +0 -142
  200. {velbus_aio-2021.8.7.dist-info → velbus_aio-2025.11.0.dist-info/licenses}/LICENSE +0 -0
@@ -1,16 +1,16 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
- from __future__ import annotations
5
4
 
6
- import json
5
+ from __future__ import annotations
7
6
 
8
- from velbusaio.command_registry import register_command
7
+ from velbusaio.command_registry import register
9
8
  from velbusaio.message import Message
10
9
 
11
10
  COMMAND_CODE = 0xF1
12
11
 
13
12
 
13
+ @register(COMMAND_CODE)
14
14
  class ChannelNamePart2Message(Message):
15
15
  """
16
16
  send by: VMB6IN, VMB4RYLD
@@ -44,18 +44,54 @@ class ChannelNamePart2Message(Message):
44
44
  self.name, "ascii", "ignore"
45
45
  )
46
46
 
47
- def to_json(self):
48
- """
49
- :return: str
50
- """
51
- json_dict = self.to_json_basic()
52
- json_dict["channel"] = self.channel
53
- return json.dumps(json_dict)
54
-
55
47
 
48
+ @register(
49
+ COMMAND_CODE,
50
+ [
51
+ "VMBGP1",
52
+ "VMBEL1",
53
+ "VMBGP1-2",
54
+ "VMBGP2",
55
+ "VMBEL2",
56
+ "VMBGP2-2",
57
+ "VMBGP4",
58
+ "VMBEL4",
59
+ "VMBGP4-2",
60
+ "VMBGPO",
61
+ "VMBGPOD",
62
+ "VMBGPOD-2",
63
+ "VMBELO",
64
+ "VMBGP4PIR",
65
+ "VMBGP4PIR-2",
66
+ "VMBDMI",
67
+ "VMBDMI-R",
68
+ "VMBIN",
69
+ "VMBKP",
70
+ "VMBELPIR",
71
+ "VMBDALI",
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",
90
+ ],
91
+ )
56
92
  class ChannelNamePart2Message2(ChannelNamePart2Message):
57
93
  """
58
- send by: VMBGP*
94
+ send by: VMBGP*, VMBDALI
59
95
  received by:
60
96
  """
61
97
 
@@ -71,6 +107,7 @@ class ChannelNamePart2Message2(ChannelNamePart2Message):
71
107
  self.name = "".join([chr(x) for x in data[1:]])
72
108
 
73
109
 
110
+ @register(COMMAND_CODE, ["VMB1BL", "VMB2BL"])
74
111
  class ChannelNamePart2Message3(ChannelNamePart2Message):
75
112
  """
76
113
  send by: VMBGP*
@@ -87,24 +124,3 @@ class ChannelNamePart2Message3(ChannelNamePart2Message):
87
124
  self.set_attributes(priority, address, rtr)
88
125
  self.channel = (data[0] >> 1) & 0x03
89
126
  self.name = "".join([chr(x) for x in data[1:]])
90
-
91
-
92
- register_command(COMMAND_CODE, ChannelNamePart2Message)
93
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBGP1")
94
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBEL1")
95
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBGP1-2")
96
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBGP2")
97
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBEL2")
98
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBGP2-2")
99
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBGP4")
100
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBEL4")
101
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBGP4-2")
102
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBGPO")
103
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBGPOD")
104
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBGPOD-2")
105
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBELO")
106
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBGP4PIR")
107
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBDMI")
108
- register_command(COMMAND_CODE, ChannelNamePart2Message2, "VMBDMI-R")
109
- register_command(COMMAND_CODE, ChannelNamePart2Message3, "VMB1BL")
110
- register_command(COMMAND_CODE, ChannelNamePart2Message3, "VMB2BL")
@@ -1,16 +1,16 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
- from __future__ import annotations
5
4
 
6
- import json
5
+ from __future__ import annotations
7
6
 
8
- from velbusaio.command_registry import register_command
7
+ from velbusaio.command_registry import register
9
8
  from velbusaio.message import Message
10
9
 
11
10
  COMMAND_CODE = 0xF2
12
11
 
13
12
 
13
+ @register(COMMAND_CODE)
14
14
  class ChannelNamePart3Message(Message):
15
15
  """
16
16
  send by: VMB6IN, VMB4RYLD
@@ -44,18 +44,54 @@ class ChannelNamePart3Message(Message):
44
44
  self.name, "ascii", "ignore"
45
45
  )
46
46
 
47
- def to_json(self):
48
- """
49
- :return: str
50
- """
51
- json_dict = self.to_json_basic()
52
- json_dict["channel"] = self.channel
53
- return json.dumps(json_dict)
54
-
55
47
 
48
+ @register(
49
+ COMMAND_CODE,
50
+ [
51
+ "VMBGP1",
52
+ "VMBEL1",
53
+ "VMBGP1-2",
54
+ "VMBGP2",
55
+ "VMBEL2",
56
+ "VMBGP2-2",
57
+ "VMBGP4",
58
+ "VMBEL4",
59
+ "VMBGP4-2",
60
+ "VMBGPO",
61
+ "VMBGPOD",
62
+ "VMBGPOD-2",
63
+ "VMBELO",
64
+ "VMBGP4PIR",
65
+ "VMBGP4PIR-2",
66
+ "VMBDMI",
67
+ "VMBDMI-R",
68
+ "VMBIN",
69
+ "VMBKP",
70
+ "VMBELPIR",
71
+ "VMBDALI",
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",
90
+ ],
91
+ )
56
92
  class ChannelNamePart3Message2(ChannelNamePart3Message):
57
93
  """
58
- send by: VMBGP*
94
+ send by: VMBGP*, VMBDALI
59
95
  received by:
60
96
  """
61
97
 
@@ -71,6 +107,7 @@ class ChannelNamePart3Message2(ChannelNamePart3Message):
71
107
  self.name = "".join([chr(x) for x in data[1:]])
72
108
 
73
109
 
110
+ @register(COMMAND_CODE, ["VMB1BL", "VMB2BL"])
74
111
  class ChannelNamePart3Message3(ChannelNamePart3Message):
75
112
  """
76
113
  send by: VMBGP*
@@ -87,24 +124,3 @@ class ChannelNamePart3Message3(ChannelNamePart3Message):
87
124
  self.set_attributes(priority, address, rtr)
88
125
  self.channel = (data[0] >> 1) & 0x03
89
126
  self.name = "".join([chr(x) for x in data[1:]])
90
-
91
-
92
- register_command(COMMAND_CODE, ChannelNamePart3Message)
93
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBGP1")
94
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBEL1")
95
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBGP1-2")
96
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBGP2")
97
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBEL2")
98
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBGP2-2")
99
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBGP4")
100
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBEL4")
101
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBGP4-2")
102
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBGPO")
103
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBGPOD")
104
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBGPOD-2")
105
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBELO")
106
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBGP4PIR")
107
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBDMI")
108
- register_command(COMMAND_CODE, ChannelNamePart3Message2, "VMBDMI-R")
109
- register_command(COMMAND_CODE, ChannelNamePart3Message3, "VMB1BL")
110
- register_command(COMMAND_CODE, ChannelNamePart3Message3, "VMB2BL")
@@ -1,16 +1,16 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org> and Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
- from __future__ import annotations
5
4
 
6
- import json
5
+ from __future__ import annotations
7
6
 
8
- from velbusaio.command_registry import register_command
7
+ from velbusaio.command_registry import register
9
8
  from velbusaio.message import Message
10
9
 
11
10
  COMMAND_CODE = 0xEF
12
11
 
13
12
 
13
+ @register(COMMAND_CODE)
14
14
  class ChannelNameRequestMessage(Message):
15
15
  """
16
16
  send by:
@@ -40,15 +40,8 @@ class ChannelNameRequestMessage(Message):
40
40
  return bytes([0xEF, self.channels_to_byte(self.channels)])
41
41
  return bytes([0xEF, 0xFF])
42
42
 
43
- def to_json(self):
44
- """
45
- :return: str
46
- """
47
- json_dict = self.to_json_basic()
48
- json_dict["channels"] = self.channels
49
- return json.dumps(json_dict)
50
-
51
43
 
44
+ @register(COMMAND_CODE, ["VMB2BL"])
52
45
  class ChannelNameRequestMessage2(ChannelNameRequestMessage):
53
46
  """
54
47
  send by:
@@ -78,4 +71,25 @@ class ChannelNameRequestMessage2(ChannelNameRequestMessage):
78
71
  return bytes([COMMAND_CODE, tmp])
79
72
 
80
73
 
81
- register_command(COMMAND_CODE, ChannelNameRequestMessage)
74
+ @register(COMMAND_CODE, ["VMBDALI", "VMBDALI-20"])
75
+ class ChannelNameRequestMessage3(ChannelNameRequestMessage):
76
+ """
77
+ send by:
78
+ received by: VMBDALI
79
+ """
80
+
81
+ def populate(self, priority, address, rtr, data):
82
+ """
83
+ :return: None
84
+ """
85
+ self.needs_low_priority(priority)
86
+ self.needs_no_rtr(rtr)
87
+ self.needs_data(data, 1)
88
+ self.set_attributes(priority, address, rtr)
89
+ self.channels = data[0]
90
+
91
+ def data_to_binary(self):
92
+ """
93
+ :return: bytes
94
+ """
95
+ return bytes([COMMAND_CODE, self.channels])
@@ -1,14 +1,16 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
- from velbusaio.command_registry import register_command
7
+ from velbusaio.command_registry import register
7
8
  from velbusaio.message import Message
8
9
 
9
10
  COMMAND_CODE = 0xF5
10
11
 
11
12
 
13
+ @register(COMMAND_CODE)
12
14
  class ClearLedMessage(Message):
13
15
  """
14
16
  send by: VMB4RYLD
@@ -35,6 +37,3 @@ class ClearLedMessage(Message):
35
37
  :return: bytes
36
38
  """
37
39
  return bytes([COMMAND_CODE, self.channels_to_byte(self.leds)])
38
-
39
-
40
- register_command(COMMAND_CODE, ClearLedMessage)
@@ -1,16 +1,16 @@
1
1
  """
2
2
  :author: Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
- from __future__ import annotations
5
4
 
6
- import json
5
+ from __future__ import annotations
7
6
 
8
- from velbusaio.command_registry import register_command
7
+ from velbusaio.command_registry import register
9
8
  from velbusaio.message import Message
10
9
 
11
10
  COMMAND_CODE = 0xBE
12
11
 
13
12
 
13
+ @register(COMMAND_CODE, ["VMB7IN"])
14
14
  class CounterStatusMessage(Message):
15
15
  """
16
16
  send by: VMB7IN
@@ -42,22 +42,8 @@ class CounterStatusMessage(Message):
42
42
  self.counter = (data[1] << 24) + (data[2] << 16) + (data[3] << 8) + data[4]
43
43
  self.delay = (data[5] << 8) + data[6]
44
44
 
45
- def to_json(self):
46
- """
47
- :return: str
48
- """
49
- json_dict = self.to_json_basic()
50
- json_dict["pulses"] = self.pulses
51
- json_dict["counter"] = self.counter
52
- json_dict["delay"] = self.delay
53
- json_dict["channel"] = self.channel
54
- return json.dumps(json_dict)
55
-
56
45
  def get_channels(self):
57
46
  """
58
47
  :return: list
59
48
  """
60
49
  return self.channel
61
-
62
-
63
- register_command(COMMAND_CODE, CounterStatusMessage, "VMB7IN")
@@ -1,14 +1,16 @@
1
1
  """
2
2
  :author: Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
- from velbusaio.command_registry import register_command
7
+ from velbusaio.command_registry import register
7
8
  from velbusaio.message import Message
8
9
 
9
10
  COMMAND_CODE = 0xBD
10
11
 
11
12
 
13
+ @register(COMMAND_CODE, ["VMB7IN"])
12
14
  class CounterStatusRequestMessage(Message):
13
15
  """
14
16
  send by:
@@ -17,6 +19,7 @@ class CounterStatusRequestMessage(Message):
17
19
 
18
20
  def __init__(self, address=None):
19
21
  Message.__init__(self)
22
+ self.channels = []
20
23
  self.wait_after_send = 500
21
24
  self.set_defaults(address)
22
25
 
@@ -26,14 +29,11 @@ class CounterStatusRequestMessage(Message):
26
29
  """
27
30
  self.needs_low_priority(priority)
28
31
  self.needs_no_rtr(rtr)
29
- self.needs_data(data, 1)
32
+ self.needs_data(data, 2)
30
33
  self.set_attributes(priority, address, rtr)
31
34
 
32
35
  def data_to_binary(self):
33
36
  """
34
37
  :return: bytes
35
38
  """
36
- return bytes([COMMAND_CODE, 0x0F, 0x00])
37
-
38
-
39
- register_command(COMMAND_CODE, CounterStatusRequestMessage, "VMB7IN")
39
+ return bytes([COMMAND_CODE, self.channels_to_byte(self.channels), 0x00])
@@ -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,18 +1,18 @@
1
1
  """
2
2
  :author: Tom Dupré <gitd8400@gmail.com>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
- import json
7
- import logging
8
7
  import struct
9
8
 
10
- from velbusaio.command_registry import register_command
9
+ from velbusaio.command_registry import register
11
10
  from velbusaio.message import Message
12
11
 
13
12
  COMMAND_CODE = 0x06
14
13
 
15
14
 
15
+ @register(COMMAND_CODE, ["VMB1BLE", "VMB2BLE", "VMB1BLS", "VMB2BLE-10"])
16
16
  class CoverDownMessage(Message):
17
17
  """
18
18
  sent by:
@@ -36,15 +36,6 @@ class CoverDownMessage(Message):
36
36
  self.channel = self.byte_to_channel(data[0])
37
37
  (self.delay_time,) = struct.unpack(">L", bytes([0]) + data[1:])
38
38
 
39
- def to_json(self):
40
- """
41
- :return: str
42
- """
43
- json_dict = self.to_json_basic()
44
- json_dict["channel"] = self.channel
45
- json_dict["delay_time"] = self.delay_time
46
- return json.dumps(json_dict)
47
-
48
39
  def set_defaults(self, address):
49
40
  if address is not None:
50
41
  self.set_address(address)
@@ -61,6 +52,7 @@ class CoverDownMessage(Message):
61
52
  )
62
53
 
63
54
 
55
+ @register(COMMAND_CODE, ["VMB1BL", "VMB2BL"])
64
56
  class CoverDownMessage2(Message):
65
57
  """
66
58
  sent by:
@@ -71,7 +63,6 @@ class CoverDownMessage2(Message):
71
63
  Message.__init__(self)
72
64
  self.channel = 0
73
65
  self.delay_time = 0
74
- self.logger = logging.getLogger("velbus")
75
66
  self.set_defaults(address)
76
67
 
77
68
  def populate(self, priority, address, rtr, data):
@@ -89,15 +80,6 @@ class CoverDownMessage2(Message):
89
80
  self.channel = self.byte_to_channel(tmp)
90
81
  (self.delay_time,) = struct.unpack(">L", bytes([0]) + data[1:])
91
82
 
92
- def to_json(self):
93
- """
94
- :return: str
95
- """
96
- json_dict = self.to_json_basic()
97
- json_dict["channel"] = self.channel
98
- json_dict["delay_time"] = self.delay_time
99
- return json.dumps(json_dict)
100
-
101
83
  def set_defaults(self, address):
102
84
  if address is not None:
103
85
  self.set_address(address)
@@ -114,10 +96,3 @@ class CoverDownMessage2(Message):
114
96
  tmp = 0x0C
115
97
 
116
98
  return bytes([COMMAND_CODE, tmp]) + struct.pack(">L", self.delay_time)[-3:]
117
-
118
-
119
- register_command(COMMAND_CODE, CoverDownMessage, "VMB1BLE")
120
- register_command(COMMAND_CODE, CoverDownMessage, "VMB2BLE")
121
- register_command(COMMAND_CODE, CoverDownMessage, "VMB1BLS")
122
- register_command(COMMAND_CODE, CoverDownMessage2, "VMB1BL")
123
- register_command(COMMAND_CODE, CoverDownMessage2, "VMB2BL")
@@ -1,17 +1,16 @@
1
1
  """
2
2
  :author: Tom Dupré <gitd8400@gmail.com>
3
3
  """
4
- from __future__ import annotations
5
4
 
6
- import json
7
- import struct
5
+ from __future__ import annotations
8
6
 
9
- from velbusaio.command_registry import register_command
7
+ from velbusaio.command_registry import register
10
8
  from velbusaio.message import Message
11
9
 
12
10
  COMMAND_CODE = 0x04
13
11
 
14
12
 
13
+ @register(COMMAND_CODE, ["VMB1BLE", "VMB2BLE", "VMB1BLS", "VMB2BLE-10"])
15
14
  class CoverOffMessage(Message):
16
15
  """
17
16
  sent by:
@@ -33,14 +32,6 @@ class CoverOffMessage(Message):
33
32
  self.set_attributes(priority, address, rtr)
34
33
  self.channel = self.byte_to_channel(data[0])
35
34
 
36
- def to_json(self):
37
- """
38
- :return: str
39
- """
40
- json_dict = self.to_json_basic()
41
- json_dict["channel"] = self.channel
42
- return json.dumps(json_dict)
43
-
44
35
  def set_defaults(self, address):
45
36
  if address is not None:
46
37
  self.set_address(address)
@@ -54,6 +45,7 @@ class CoverOffMessage(Message):
54
45
  return bytes([COMMAND_CODE, self.channels_to_byte([self.channel])])
55
46
 
56
47
 
48
+ @register(COMMAND_CODE, ["VMB1BL", "VMB2BL"])
57
49
  class CoverOffMessage2(Message):
58
50
  """
59
51
  sent by:
@@ -80,15 +72,6 @@ class CoverOffMessage2(Message):
80
72
  tmp = (data[0] >> 1) & 0x03
81
73
  self.channel = self.byte_to_channel(tmp)
82
74
 
83
- def to_json(self):
84
- """
85
- :return: str
86
- """
87
- json_dict = self.to_json_basic()
88
- json_dict["channel"] = self.channel
89
- json_dict["delay_time"] = self.delay_time
90
- return json.dumps(json_dict)
91
-
92
75
  def set_defaults(self, address):
93
76
  if address is not None:
94
77
  self.set_address(address)
@@ -104,11 +87,4 @@ class CoverOffMessage2(Message):
104
87
  else:
105
88
  tmp = 0x0C
106
89
 
107
- return bytes([COMMAND_CODE, tmp]) + struct.pack(">L", self.delay_time)[-3:]
108
-
109
-
110
- register_command(COMMAND_CODE, CoverOffMessage2, "VMB1BL")
111
- register_command(COMMAND_CODE, CoverOffMessage2, "VMB2BL")
112
- register_command(COMMAND_CODE, CoverOffMessage, "VMB1BLE")
113
- register_command(COMMAND_CODE, CoverOffMessage, "VMB2BLE")
114
- register_command(COMMAND_CODE, CoverOffMessage, "VMB1BLS")
90
+ return bytes([COMMAND_CODE, tmp])
@@ -1,17 +1,16 @@
1
1
  """
2
2
  :author: Maikel Punie <maikel.punie@gmail.com>
3
3
  """
4
- from __future__ import annotations
5
4
 
6
- import json
7
- import struct
5
+ from __future__ import annotations
8
6
 
9
- from velbusaio.command_registry import register_command
7
+ from velbusaio.command_registry import register
10
8
  from velbusaio.message import Message
11
9
 
12
10
  COMMAND_CODE = 0x1C
13
11
 
14
12
 
13
+ @register(COMMAND_CODE, ["VMB1BLE", "VMB2BLE", "VMB1BLS", "VMB2BLE-10"])
15
14
  class CoverPosMessage(Message):
16
15
  """
17
16
  sent by:
@@ -30,20 +29,11 @@ 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]
37
36
 
38
- def to_json(self):
39
- """
40
- :return: str
41
- """
42
- json_dict = self.to_json_basic()
43
- json_dict["channel"] = self.channel
44
- json_dict["position"] = self.position
45
- return json.dumps(json_dict)
46
-
47
37
  def set_defaults(self, address):
48
38
  if address is not None:
49
39
  self.set_address(address)
@@ -61,8 +51,3 @@ class CoverPosMessage(Message):
61
51
  self.position,
62
52
  ]
63
53
  )
64
-
65
-
66
- register_command(COMMAND_CODE, CoverPosMessage, "VMB1BLE")
67
- register_command(COMMAND_CODE, CoverPosMessage, "VMB2BLE")
68
- register_command(COMMAND_CODE, CoverPosMessage, "VMB1BLS")