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,29 @@
1
1
  """
2
2
  :author: Frank van Breugel
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 = 0x11
12
11
 
13
12
 
13
+ @register(
14
+ COMMAND_CODE,
15
+ [
16
+ "VMB1DM",
17
+ "VMBDME",
18
+ "VMBDMI-R",
19
+ "VMBDMI",
20
+ "VMB1LED",
21
+ "VMB4DC",
22
+ "VMB8DC-20",
23
+ "VMB2DC-20",
24
+ "VMB4LEDPWM-20",
25
+ ],
26
+ )
14
27
  class RestoreDimmerMessage(Message):
15
28
  """
16
29
  send by:
@@ -38,32 +51,28 @@ class RestoreDimmerMessage(Message):
38
51
  self.set_attributes(priority, address, rtr)
39
52
  self.dimmer_channels = self.byte_to_channels(data[0])
40
53
  self.dimmer_transitiontime = int.from_bytes(
41
- data[[2, 3]], byteorder="big", signed=False
54
+ data[2:3], byteorder="big", signed=False
42
55
  )
43
56
 
44
- def to_json(self):
45
- """
46
- :return: str
47
- """
48
- json_dict = self.to_json_basic()
49
- json_dict["channels"] = self.dimmer_channels
50
- json_dict["transitiontime"] = self.dimmer_transitiontime
51
- return json.dumps(json_dict)
52
-
53
57
  def data_to_binary(self):
54
58
  """
55
59
  :return: bytes
56
60
  """
57
- return (
58
- bytes(
59
- [
60
- COMMAND_CODE,
61
- self.channels_to_byte(self.dimmer_channels),
62
- 0,
63
- ]
64
- )
65
- + self.dimmer_transitiontime.to_bytes(2, byteorder="big", signed=False)
66
- )
61
+ return bytes(
62
+ [
63
+ COMMAND_CODE,
64
+ self.channels_to_byte(self.dimmer_channels),
65
+ 0,
66
+ ]
67
+ ) + self.dimmer_transitiontime.to_bytes(2, byteorder="big", signed=False)
68
+
67
69
 
70
+ @register(COMMAND_CODE, ["VMBDALI", "VMBDALI-20"])
71
+ class RestoreDimmerMessage2(RestoreDimmerMessage):
72
+ def byte_to_channels(self, byte: int) -> list[int]:
73
+ return [byte]
68
74
 
69
- register_command(COMMAND_CODE, RestoreDimmerMessage)
75
+ def channels_to_byte(self, channels: list[int]) -> int:
76
+ if len(channels) != 1:
77
+ raise ValueError("We should have exact one channel")
78
+ return channels[0]
@@ -0,0 +1,35 @@
1
+ """
2
+ :author: Danny De Gaspari
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 = 0xB3
11
+
12
+
13
+ @register(COMMAND_CODE)
14
+ class SelectProgramMessage(Message):
15
+ def __init__(self, address=None, program=0):
16
+ Message.__init__(self)
17
+ self.select_program = program
18
+ self.set_defaults(address)
19
+
20
+ def populate(self, priority, address, rtr, data):
21
+ """
22
+ :return: None
23
+ """
24
+ self.needs_low_priority(priority)
25
+ self.needs_no_rtr(rtr)
26
+ self.needs_data(data, 1)
27
+ self.set_attributes(priority, address, rtr)
28
+
29
+ self.select_program = data[0] & 0x03
30
+
31
+ def data_to_binary(self):
32
+ """
33
+ :return: bytes
34
+ """
35
+ return bytes([COMMAND_CODE, self.select_program])
@@ -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 = 0xE7
10
11
 
11
12
 
13
+ @register(COMMAND_CODE)
12
14
  class SensorSettingsRequestMessage(Message):
13
15
  """
14
16
  send by:
@@ -34,6 +36,3 @@ class SensorSettingsRequestMessage(Message):
34
36
  :return: bytes
35
37
  """
36
38
  return bytes([])
37
-
38
-
39
- register_command(COMMAND_CODE, SensorSettingsRequestMessage)
@@ -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 = 0xE5
10
11
 
11
12
 
13
+ @register(COMMAND_CODE)
12
14
  class SensorTempRequest(Message):
13
15
  def populate(self, priority, address, rtr, data):
14
16
  """
@@ -23,6 +25,3 @@ class SensorTempRequest(Message):
23
25
  :return: bytes
24
26
  """
25
27
  return bytes([COMMAND_CODE])
26
-
27
-
28
- register_command(COMMAND_CODE, SensorTempRequest)
@@ -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 = 0xE6
12
11
 
13
12
 
13
+ @register(COMMAND_CODE)
14
14
  class SensorTemperatureMessage(Message):
15
15
  """
16
16
  send by: VMBTS, vmbg*pd, ...
@@ -43,19 +43,15 @@ class SensorTemperatureMessage(Message):
43
43
  self.needs_no_rtr(rtr)
44
44
  self.needs_data(data, 6)
45
45
  self.set_attributes(priority, address, rtr)
46
- self.cur = (((data[0] << 8) | data[1]) / 32) * 0.0625
47
- self.min = (((data[2] << 8) | data[3]) / 32) * 0.0625
48
- self.max = (((data[4] << 8) | data[5]) / 32) * 0.0625
49
-
50
- def to_json(self):
51
- """
52
- :return: str
53
- """
54
- json_dict = self.to_json_basic()
55
- json_dict["cur"] = self.cur
56
- json_dict["min"] = self.min
57
- json_dict["max"] = self.max
58
- return json.dumps(json_dict)
59
-
60
-
61
- register_command(COMMAND_CODE, SensorTemperatureMessage)
46
+ if ((data[0] << 8) | data[1]) >> 15:
47
+ self.cur = -127 + (((data[0] << 8) | data[1]) / 32 * 0.0625)
48
+ else:
49
+ self.cur = (((data[0] << 8) | data[1]) / 32) * 0.0625
50
+ if ((data[2] << 8) | data[3]) >> 15:
51
+ self.min = -127 + (((data[2] << 8) | data[3]) / 32 * 0.0625)
52
+ else:
53
+ self.min = (((data[2] << 8) | data[3]) / 32) * 0.0625
54
+ if ((data[4] << 8) | data[5]) >> 15:
55
+ self.max = -127 + (((data[4] << 8) | data[5]) / 32 * 0.0625)
56
+ else:
57
+ self.max = (((data[4] << 8) | data[5]) / 32) * 0.0625
@@ -1,42 +1,35 @@
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 logging
8
- import time
5
+ from __future__ import annotations
9
6
 
10
- from velbusaio.command_registry import register_command
7
+ from velbusaio.command_registry import register
11
8
  from velbusaio.message import Message
12
9
 
13
10
  COMMAND_CODE = 0xB7
14
11
 
15
12
 
13
+ @register(COMMAND_CODE)
16
14
  class SetDate(Message):
17
15
  """
18
16
  received by all modules
19
17
  """
20
18
 
21
- def __init__(self, address=0x00):
19
+ def __init__(self, address=0x00, day=None, mon=None, year=None) -> None:
22
20
  Message.__init__(self)
23
- self.logger = logging.getLogger("velbus")
24
- self._day = None
25
- self._mon = None
26
- self._year = None
21
+ self._day = day
22
+ self._mon = mon
23
+ self._year = year
27
24
  self.set_defaults(address)
28
25
 
29
- def set_defaults(self, address):
26
+ def set_defaults(self, address) -> None:
30
27
  if address is not None:
31
28
  self.set_address(address)
32
29
  self.set_low_priority()
33
30
  self.set_no_rtr()
34
- lclt = time.localtime()
35
- self._day = lclt[2]
36
- self._mon = lclt[1]
37
- self._year = lclt[0]
38
31
 
39
- def populate(self, priority, address, rtr, data):
32
+ def populate(self, priority, address, rtr, data) -> None:
40
33
  """
41
34
  :return: None
42
35
  """
@@ -48,17 +41,7 @@ class SetDate(Message):
48
41
  self._mon = data[1]
49
42
  self._year = (data[2] << 8) + data[3]
50
43
 
51
- def to_json(self):
52
- """
53
- :return: str
54
- """
55
- json_dict = self.to_json_basic()
56
- json_dict["day"] = self._day
57
- json_dict["mon"] = self._mon
58
- json_dict["year"] = self._year
59
- return json.dumps(json_dict)
60
-
61
- def data_to_binary(self):
44
+ def data_to_binary(self) -> bytes:
62
45
  """
63
46
  :return: bytes
64
47
  """
@@ -71,6 +54,3 @@ class SetDate(Message):
71
54
  (self._year & 0x00FF),
72
55
  ]
73
56
  )
74
-
75
-
76
- register_command(COMMAND_CODE, SetDate)
@@ -1,38 +1,33 @@
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 logging
8
- import time
5
+ from __future__ import annotations
9
6
 
10
- from velbusaio.command_registry import register_command
7
+ from velbusaio.command_registry import register
11
8
  from velbusaio.message import Message
12
9
 
13
10
  COMMAND_CODE = 0xAF
14
11
 
15
12
 
13
+ @register(COMMAND_CODE)
16
14
  class SetDaylightSaving(Message):
17
15
  """
18
16
  received by all modules
19
17
  """
20
18
 
21
- def __init__(self, address=0x00):
19
+ def __init__(self, address=0x00, ds=None) -> None:
22
20
  Message.__init__(self)
23
- self.logger = logging.getLogger("velbus")
24
- self._ds = None
21
+ self._ds = ds
25
22
  self.set_defaults(address)
26
23
 
27
- def set_defaults(self, address):
24
+ def set_defaults(self, address) -> None:
28
25
  if address is not None:
29
26
  self.set_address(address)
30
27
  self.set_low_priority()
31
28
  self.set_no_rtr()
32
- lclt = time.localtime()
33
- self._ds = not lclt[8]
34
29
 
35
- def populate(self, priority, address, rtr, data):
30
+ def populate(self, priority, address, rtr, data) -> None:
36
31
  """
37
32
  :return: None
38
33
  """
@@ -42,19 +37,8 @@ class SetDaylightSaving(Message):
42
37
  self.set_attributes(priority, address, rtr)
43
38
  self._ds = data[0]
44
39
 
45
- def to_json(self):
46
- """
47
- :return: str
48
- """
49
- json_dict = self.to_json_basic()
50
- json_dict["ds"] = self._ds
51
- return json.dumps(json_dict)
52
-
53
- def data_to_binary(self):
40
+ def data_to_binary(self) -> bytes:
54
41
  """
55
42
  :return: bytes
56
43
  """
57
44
  return bytes([COMMAND_CODE, self._ds])
58
-
59
-
60
- register_command(COMMAND_CODE, SetDaylightSaving)
@@ -1,19 +1,19 @@
1
- """
2
- :author: Frank van Breugel
3
- """
4
- from __future__ import annotations
1
+ """:author: Frank van Breugel"""
5
2
 
6
- import json
7
- import logging
3
+ from __future__ import annotations
8
4
 
9
- from velbusaio.command_registry import register_command
5
+ from velbusaio.command_registry import register
10
6
  from velbusaio.message import Message
11
7
 
12
8
  COMMAND_CODE = 0x07
13
9
 
14
10
 
11
+ @register(
12
+ COMMAND_CODE,
13
+ ["VMB1DM", "VMBDME", "VMB4DC", "VMB1LED"],
14
+ )
15
15
  class SetDimmerMessage(Message):
16
- """
16
+ """with this message the channel numbering is a bitnumber
17
17
  send by:
18
18
  received by: VMBDME, VMB4DC
19
19
  """
@@ -21,7 +21,6 @@ class SetDimmerMessage(Message):
21
21
  def __init__(self, address=None):
22
22
  Message.__init__(self)
23
23
  self.dimmer_channels = []
24
- self.logger = logging.getLogger("velbus")
25
24
  self.dimmer_state = 0
26
25
  self.dimmer_transitiontime = 0
27
26
  self.set_defaults(address)
@@ -33,9 +32,7 @@ class SetDimmerMessage(Message):
33
32
  self.set_no_rtr()
34
33
 
35
34
  def populate(self, priority, address, rtr, data):
36
- """
37
- :return: None
38
- """
35
+ """:return: None"""
39
36
  self.needs_high_priority(priority)
40
37
  self.needs_no_rtr(rtr)
41
38
  self.needs_data(data, 4)
@@ -43,37 +40,42 @@ class SetDimmerMessage(Message):
43
40
  self.dimmer_channels = self.byte_to_channels(data[0])
44
41
  self.dimmer_state = data[1]
45
42
  self.dimmer_transitiontime = int.from_bytes(
46
- data[[2, 3]], byteorder="big", signed=False
43
+ data[2:3], byteorder="big", signed=False
47
44
  )
48
45
 
49
- def to_json(self):
50
- """
51
- :return: str
52
- """
53
- json_dict = self.to_json_basic()
54
- json_dict["channels"] = self.dimmer_channels
55
- json_dict["state"] = self.dimmer_state
56
- json_dict["transitiontime"] = self.dimmer_transitiontime
57
- return json.dumps(json_dict)
58
-
59
46
  def data_to_binary(self):
60
- """
61
- :return: bytes
62
- """
63
- return (
64
- bytes(
65
- [
66
- COMMAND_CODE,
67
- self.channels_to_byte(self.dimmer_channels),
68
- self.dimmer_state,
69
- ]
70
- )
71
- + self.dimmer_transitiontime.to_bytes(2, byteorder="big", signed=False)
72
- )
47
+ """:return: bytes"""
48
+ return bytes(
49
+ [
50
+ COMMAND_CODE,
51
+ self.channels_to_byte(self.dimmer_channels),
52
+ self.dimmer_state,
53
+ ]
54
+ ) + self.dimmer_transitiontime.to_bytes(2, byteorder="big", signed=False)
55
+
56
+
57
+ @register(
58
+ COMMAND_CODE,
59
+ [
60
+ "VMBDALI",
61
+ "VMBDALI-20",
62
+ "VMBDMI",
63
+ "VMBDMI-R",
64
+ "VMB8DC-20",
65
+ "VMB4LEDPWM-20",
66
+ "VMB2DC-20",
67
+ ],
68
+ )
69
+ class SetDimmerMessage2(SetDimmerMessage):
70
+ """This with this message the channel numbering is an integer
71
+ send by:
72
+ received by: VMBDALI
73
+ """
73
74
 
75
+ def byte_to_channels(self, byte: int) -> list[int]:
76
+ return [byte]
74
77
 
75
- register_command(COMMAND_CODE, SetDimmerMessage, "VMBDME")
76
- register_command(COMMAND_CODE, SetDimmerMessage, "VMB4DC")
77
- register_command(COMMAND_CODE, SetDimmerMessage, "VMBDMI")
78
- register_command(COMMAND_CODE, SetDimmerMessage, "VMBDMI-R")
79
- register_command(COMMAND_CODE, SetDimmerMessage, "VMB1LED")
78
+ def channels_to_byte(self, channels) -> int:
79
+ if len(channels) != 1:
80
+ raise ValueError("We should have exact one channel")
81
+ return channels[0]
@@ -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 = 0xF6
10
11
 
11
12
 
13
+ @register(COMMAND_CODE)
12
14
  class SetLedMessage(Message):
13
15
  """
14
16
  send by: VMB4RYLD
@@ -35,6 +37,3 @@ class SetLedMessage(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, SetLedMessage)
@@ -1,42 +1,35 @@
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 logging
8
- import time
5
+ from __future__ import annotations
9
6
 
10
- from velbusaio.command_registry import register_command
7
+ from velbusaio.command_registry import register
11
8
  from velbusaio.message import Message
12
9
 
13
10
  COMMAND_CODE = 0xD8
14
11
 
15
12
 
13
+ @register(COMMAND_CODE)
16
14
  class SetRealtimeClock(Message):
17
15
  """
18
16
  received by all modules
19
17
  """
20
18
 
21
- def __init__(self, address=0x00):
19
+ def __init__(self, address=0x00, wday=None, hour=None, min=None) -> None:
22
20
  Message.__init__(self)
23
- self.logger = logging.getLogger("velbus")
24
- self._wday = None
25
- self._hour = None
26
- self._min = None
21
+ self._wday = wday
22
+ self._hour = hour
23
+ self._min = min
27
24
  self.set_defaults(address)
28
25
 
29
- def set_defaults(self, address):
26
+ def set_defaults(self, address) -> None:
30
27
  if address is not None:
31
28
  self.set_address(address)
32
29
  self.set_low_priority()
33
30
  self.set_no_rtr()
34
- lclt = time.localtime()
35
- self._wday = lclt[6]
36
- self._hour = lclt[3]
37
- self._min = lclt[4]
38
31
 
39
- def populate(self, priority, address, rtr, data):
32
+ def populate(self, priority, address, rtr, data) -> None:
40
33
  """
41
34
  :return: None
42
35
  """
@@ -48,21 +41,8 @@ class SetRealtimeClock(Message):
48
41
  self._hour = data[1]
49
42
  self._min = data[2]
50
43
 
51
- def to_json(self):
52
- """
53
- :return: str
54
- """
55
- json_dict = self.to_json_basic()
56
- json_dict["wday"] = self._wday
57
- json_dict["hour"] = self._hour
58
- json_dict["min"] = self._min
59
- return json.dumps(json_dict)
60
-
61
- def data_to_binary(self):
44
+ def data_to_binary(self) -> bytes:
62
45
  """
63
46
  :return: bytes
64
47
  """
65
48
  return bytes([COMMAND_CODE, self._wday, self._hour, self._min])
66
-
67
-
68
- register_command(COMMAND_CODE, SetRealtimeClock)
@@ -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 = 0xE4
10
11
 
11
12
 
13
+ @register(COMMAND_CODE)
12
14
  class SetTemperatureMessage(Message):
13
15
  """
14
16
  send by: VMB4RYLD
@@ -38,6 +40,3 @@ class SetTemperatureMessage(Message):
38
40
  :return: bytes
39
41
  """
40
42
  return bytes([COMMAND_CODE, int(self.temp_type), int(self.temp)])
41
-
42
-
43
- register_command(COMMAND_CODE, SetTemperatureMessage)
@@ -1,16 +1,29 @@
1
1
  """
2
2
  :author: Frank van Breugel
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 = 0x0F
12
11
 
13
12
 
13
+ @register(
14
+ COMMAND_CODE,
15
+ [
16
+ "VMB1DM",
17
+ "VMBDME",
18
+ "VMB4DC",
19
+ "VMBDMI",
20
+ "VMBDMI-R",
21
+ "VMB1LED",
22
+ "VMB8DC-20",
23
+ "VMB2DC-20",
24
+ "VMB4LEDPWM-20",
25
+ ],
26
+ )
14
27
  class SliderStatusMessage(Message):
15
28
  """
16
29
  sent by: VMBDME
@@ -36,16 +49,6 @@ class SliderStatusMessage(Message):
36
49
  self.slider_state = int.from_bytes([data[1]], byteorder="big")
37
50
  self.slider_long_pressed = data[2]
38
51
 
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["slider_state"] = self.slider_state
46
- json_dict["slider_long_pressed"] = self.slider_long_pressed
47
- return json.dumps(json_dict)
48
-
49
52
  def cur_slider_state(self):
50
53
  """
51
54
  :return: int
@@ -64,10 +67,3 @@ class SliderStatusMessage(Message):
64
67
  self.slider_long_pressed,
65
68
  ]
66
69
  )
67
-
68
-
69
- register_command(COMMAND_CODE, SliderStatusMessage, "VMBDME")
70
- register_command(COMMAND_CODE, SliderStatusMessage, "VMB4DC")
71
- register_command(COMMAND_CODE, SliderStatusMessage, "VMBDMI")
72
- register_command(COMMAND_CODE, SliderStatusMessage, "VMBDMI-R")
73
- register_command(COMMAND_CODE, SliderStatusMessage, "VMB1LED")