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,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_command
9
+ from velbusaio.command_registry import MODULE_DIRECTORY, register
9
10
  from velbusaio.message import Message
10
11
 
11
12
  COMMAND_CODE = 0xFF
@@ -18,11 +19,77 @@ MODULES_WITHOUT_SERIAL = {
18
19
  0x08: "VMB4RY",
19
20
  0x09: "VMB2BL",
20
21
  0x0C: "VMB1TS",
22
+ 0x0D: "VMB1TH",
23
+ 0x0E: "VMB1TC",
21
24
  0x0F: "VMB1LED",
22
25
  0x14: "VMBDME",
23
26
  }
24
27
 
25
28
 
29
+ @register(
30
+ COMMAND_CODE,
31
+ [
32
+ "VMB1BL",
33
+ "VMB6IN",
34
+ "VMB1DM",
35
+ "VMB4RY",
36
+ "VMB2BL",
37
+ "VMB8IR",
38
+ "VMB4PD",
39
+ "VMB1TS",
40
+ "VMB1TH",
41
+ "VMB1TC",
42
+ "VMB1LED",
43
+ "VMB4RYLD",
44
+ "VMB4RYNO",
45
+ "VMB4DC",
46
+ "VMBLCDWB",
47
+ "VMBDME",
48
+ "VMBDMI",
49
+ "VMB8PBU",
50
+ "VMB6PBN",
51
+ "VMB2PBN",
52
+ "VMB6PBB",
53
+ "VMB4RF",
54
+ "VMB1RYNO",
55
+ "VMB1BLE",
56
+ "VMB2BLE",
57
+ "VMBGP1",
58
+ "VMBGP2",
59
+ "VMBGP4",
60
+ "VMBGPO",
61
+ "VMB7IN",
62
+ "VMBGPOD",
63
+ "VMB1RYNOS",
64
+ "VMBPIRM",
65
+ "VMBPIRC",
66
+ "VMBPIRO",
67
+ "VMBGP4PIR",
68
+ "VMB1BLS",
69
+ "VMBDMI-R",
70
+ "VMBMETEO",
71
+ "VMB4AN",
72
+ "VMBVP01",
73
+ "VMBEL1",
74
+ "VMBEL2",
75
+ "VMBEL4",
76
+ "VMBELO",
77
+ "VMBELPIR",
78
+ "VMBSIG",
79
+ "VMBGP1-2",
80
+ "VMBGP2-2",
81
+ "VMBGP4-2",
82
+ "VMBGPOD-2",
83
+ "VMBGP4PIR-2",
84
+ "VMCM3",
85
+ "VMBUSBIP",
86
+ "VMB1RYS",
87
+ "VMBKP",
88
+ "VMBIN",
89
+ "VMB4PB",
90
+ "VMBDALI",
91
+ ],
92
+ )
26
93
  class ModuleTypeMessage(Message):
27
94
  """
28
95
  send by: VMB6IN, VMB4RYLD
@@ -31,7 +98,7 @@ class ModuleTypeMessage(Message):
31
98
 
32
99
  # pylint: disable-msg=R0902
33
100
 
34
- def __init__(self, address=None):
101
+ def __init__(self, address=None) -> None:
35
102
  Message.__init__(self)
36
103
  self.module_type = 0x00
37
104
  self.led_on = []
@@ -43,19 +110,23 @@ class ModuleTypeMessage(Message):
43
110
  self.build_week = 0
44
111
  self.set_defaults(address)
45
112
 
46
- def module_name(self):
113
+ def module_type_name(self) -> str:
47
114
  """
48
115
  :return: str
49
116
  """
50
- return "Unknown"
51
117
 
52
- 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:
53
125
  """
54
126
  :return: None
55
127
  """
56
128
  self.needs_low_priority(priority)
57
129
  self.needs_no_rtr(rtr)
58
- self.needs_data(data, 4)
59
130
  self.set_attributes(priority, address, rtr)
60
131
  self.module_type = data[0]
61
132
  if data[0] not in MODULES_WITHOUT_SERIAL:
@@ -64,21 +135,61 @@ class ModuleTypeMessage(Message):
64
135
  self.build_year = data[-2]
65
136
  self.build_week = data[-1]
66
137
 
67
- def data_to_binary(self):
138
+
139
+ @register(
140
+ COMMAND_CODE,
141
+ [
142
+ "VMB4RYLD-10",
143
+ "VMB4RYNO-10",
144
+ "VMB2BLE-10",
145
+ "VMB6PB-20",
146
+ "VMBEL1-20",
147
+ "VMBEL2-20",
148
+ "VMBEL4-20",
149
+ "VMBELO-20",
150
+ "VMBGP1-20",
151
+ "VMBGP2-20",
152
+ "VMBGP4-20",
153
+ "VMBGPO-20",
154
+ "VMBEL4PIR-20",
155
+ "VMBGP4PIR-20",
156
+ "VMB4LEDPWM-20",
157
+ "VMB8IN-20",
158
+ "VMB8DC-20",
159
+ "VMB2DC-20",
160
+ ],
161
+ )
162
+ class ModuleType2Message(Message):
163
+ def __init__(self, address=None) -> None:
164
+ Message.__init__(self)
165
+ self.module_type = 0x00
166
+ self.led_on = []
167
+ self.led_slow_blinking = []
168
+ self.led_fast_blinking = []
169
+ self.serial = 0
170
+ self.memory_map_version = 0
171
+ self.build_year = 0
172
+ self.build_week = 0
173
+ self.term = 0
174
+ self.set_defaults(address)
175
+
176
+ def module_name(self) -> str:
68
177
  """
69
- :return: bytes
178
+ :return: str
70
179
  """
71
- return bytes(
72
- [
73
- COMMAND_CODE,
74
- self.module_type,
75
- self.channels_to_byte(self.led_on),
76
- self.channels_to_byte(self.led_slow_blinking),
77
- self.channels_to_byte(self.led_fast_blinking),
78
- self.build_year,
79
- self.build_week,
80
- ]
81
- )
82
-
180
+ return "Unknown"
83
181
 
84
- register_command(COMMAND_CODE, ModuleTypeMessage)
182
+ def populate(self, priority, address, rtr, data):
183
+ """
184
+ :return: None
185
+ """
186
+ self.needs_low_priority(priority)
187
+ self.needs_no_rtr(rtr)
188
+ self.set_attributes(priority, address, rtr)
189
+ self.module_type = data[0]
190
+ if data[0] not in MODULES_WITHOUT_SERIAL:
191
+ (self.serial,) = struct.unpack(">L", bytes([0, 0, data[1], data[2]]))
192
+ self.memory_map_version = data[3]
193
+ self.build_year = data[-3]
194
+ self.build_week = data[-2]
195
+ self.term = data[-1]
@@ -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
@@ -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
+ )
@@ -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 = 0x00
12
11
 
13
12
 
13
+ @register(COMMAND_CODE)
14
14
  class PushButtonStatusMessage(Message):
15
15
  """
16
16
  send by: VMB6IN, VMB4RYLD
@@ -42,16 +42,6 @@ class PushButtonStatusMessage(Message):
42
42
  self.set_high_priority()
43
43
  self.set_no_rtr()
44
44
 
45
- def to_json(self):
46
- """
47
- :return: str
48
- """
49
- json_dict = self.to_json_basic()
50
- json_dict["closed_channels"] = self.closed
51
- json_dict["opened_channels"] = self.opened
52
- json_dict["closed_long_channels"] = self.closed_long
53
- return json.dumps(json_dict)
54
-
55
45
  def get_channels(self):
56
46
  """
57
47
  :return: list
@@ -70,6 +60,3 @@ class PushButtonStatusMessage(Message):
70
60
  self.channels_to_byte(self.closed_long),
71
61
  ]
72
62
  )
73
-
74
-
75
- register_command(COMMAND_CODE, PushButtonStatusMessage)
@@ -0,0 +1,74 @@
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 = 0xA9
11
+
12
+
13
+ @register(COMMAND_CODE, ["VMBMETEO"])
14
+ class MeteoRawMessage(Message):
15
+ """
16
+ send by: VMBMETEO
17
+ received by:
18
+ """
19
+
20
+ def __init__(self, address=None):
21
+ Message.__init__(self)
22
+ self.rain = 0
23
+ self.light = 0
24
+ self.wind = 0
25
+
26
+ def populate(self, priority, address, rtr, data):
27
+ """
28
+ data bytes (high + low)
29
+ 1 + 2 = current temp
30
+ 3 + 4 = min temp
31
+ 5 + 6 = max temp
32
+ :return: None
33
+ """
34
+ self.needs_no_rtr(rtr)
35
+ self.needs_data(data, 6)
36
+ self.set_attributes(priority, address, rtr)
37
+ self.rain = (((data[0] << 8) | data[1]) / 32) * 0.1
38
+ self.light = ((data[2] << 8) | data[3]) / 32
39
+ self.wind = (((data[4] << 8) | data[5]) / 32) * 0.1
40
+
41
+
42
+ @register(COMMAND_CODE, ["VMB4AN"])
43
+ class SensorRawMessage(Message):
44
+ """
45
+ send by: VMB4AN
46
+ received by:
47
+ """
48
+
49
+ def __init__(self, address=None):
50
+ Message.__init__(self)
51
+ self.sensor = 0
52
+ self.mode = 0
53
+ self.value = 0
54
+ self.unit = None
55
+
56
+ def populate(self, priority, address, rtr, data):
57
+ self.needs_no_rtr(rtr)
58
+ self.needs_data(data, 5)
59
+ self.set_attributes(priority, address, rtr)
60
+ self.sensor = data[0]
61
+ self.mode = data[1]
62
+ self.value = (data[2] << 16) | (data[3] << 8) | data[4]
63
+ if self.mode == 0:
64
+ self.value = self.value * 0.25
65
+ self.unit = "mV"
66
+ elif self.mode == 1:
67
+ self.value = self.value * 5
68
+ self.unit = "µA"
69
+ elif self.mode == 2:
70
+ self.value = self.value * 0.25
71
+ self.unit = "ohm"
72
+ elif self.mode == 3:
73
+ self.value = self.value * 0.5
74
+ self.unit = "µS"
@@ -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 = 0xC9
10
11
 
11
12
 
13
+ @register(COMMAND_CODE)
12
14
  class ReadDataBlockFromMemoryMessage(Message):
13
15
  """
14
16
  send by:
@@ -37,6 +39,3 @@ class ReadDataBlockFromMemoryMessage(Message):
37
39
  :return: bytes
38
40
  """
39
41
  return bytes([COMMAND_CODE, self.high_address, self.low_address])
40
-
41
-
42
- register_command(COMMAND_CODE, ReadDataBlockFromMemoryMessage)
@@ -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 = 0xFD
10
11
 
11
12
 
13
+ @register(COMMAND_CODE)
12
14
  class ReadDataFromMemoryMessage(Message):
13
15
  """
14
16
  send by:
@@ -37,6 +39,3 @@ class ReadDataFromMemoryMessage(Message):
37
39
  :return: bytes
38
40
  """
39
41
  return bytes([COMMAND_CODE, self.high_address, self.low_address])
40
-
41
-
42
- register_command(COMMAND_CODE, ReadDataFromMemoryMessage)
@@ -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 = 0xD7
10
11
 
11
12
 
13
+ @register(COMMAND_CODE)
12
14
  class RealtimeClockStatusRequest(Message):
13
15
  def populate(self, priority, address, rtr, data):
14
16
  """
@@ -23,6 +25,3 @@ class RealtimeClockStatusRequest(Message):
23
25
  :return: bytes
24
26
  """
25
27
  return bytes([COMMAND_CODE])
26
-
27
-
28
- register_command(COMMAND_CODE, RealtimeClockStatusRequest)
@@ -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 = 0x0B
10
11
 
11
12
 
13
+ @register(COMMAND_CODE)
12
14
  class ReceiveBufferFullMessage(Message):
13
15
  """
14
16
  send by:
@@ -35,6 +37,3 @@ class ReceiveBufferFullMessage(Message):
35
37
  :return: bytes
36
38
  """
37
39
  return bytes([COMMAND_CODE])
38
-
39
-
40
- register_command(COMMAND_CODE, ReceiveBufferFullMessage)
@@ -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 = 0x0C
10
11
 
11
12
 
13
+ @register(COMMAND_CODE)
12
14
  class ReceiveReadyMessage(Message):
13
15
  """
14
16
  send by:
@@ -29,6 +31,3 @@ class ReceiveReadyMessage(Message):
29
31
  :return: bytes
30
32
  """
31
33
  return bytes([COMMAND_CODE])
32
-
33
-
34
- register_command(COMMAND_CODE, ReceiveReadyMessage)
@@ -1,41 +1,30 @@
1
1
  """
2
2
  :author: Thomas Delaet <thomas@delaet.org>
3
3
  """
4
+
4
5
  from __future__ import annotations
5
6
 
6
- import json
7
7
  import struct
8
8
 
9
- from velbusaio.command_registry import register_command
9
+ from velbusaio.command_registry import register
10
10
  from velbusaio.message import Message
11
11
 
12
12
  COMMAND_CODE = 0xFB
13
-
14
13
  CHANNEL_NORMAL = 0x00
15
-
16
14
  CHANNEL_INHIBITED = 0x01
17
-
18
15
  CHANNEL_FORCED_ON = 0x02
19
-
20
16
  CHANNEL_DISABLED = 0x03
21
-
22
17
  RELAY_ON = 0x01
23
-
24
18
  RELAY_OFF = 0x00
25
-
26
19
  INTERVAL_TIMER_ON = 0x03
27
-
28
20
  LED_OFF = 0
29
-
30
21
  LED_ON = 1 << 7
31
-
32
22
  LED_SLOW_BLINKING = 1 << 6
33
-
34
23
  LED_FAST_BLINKING = 1 << 5
35
-
36
24
  LED_VERY_FAST_BLINKING = 1 << 4
37
25
 
38
26
 
27
+ @register(COMMAND_CODE)
39
28
  class RelayStatusMessage(Message):
40
29
  """
41
30
  send by: VMB4RYLD
@@ -65,18 +54,6 @@ class RelayStatusMessage(Message):
65
54
  self.led_status = data[3]
66
55
  (self.delay_time,) = struct.unpack(">L", bytes([0]) + data[4:])
67
56
 
68
- def to_json(self):
69
- """
70
- :return: str
71
- """
72
- json_dict = self.to_json_basic()
73
- json_dict["channel"] = self.channel
74
- json_dict["disable_inhibit_forced"] = self.disable_inhibit_forced
75
- json_dict["status"] = self.status
76
- json_dict["led_status"] = self.led_status
77
- json_dict["delay_time"] = self.delay_time
78
- return json.dumps(json_dict)
79
-
80
57
  def is_normal(self):
81
58
  """
82
59
  :return: bool
@@ -107,21 +84,6 @@ class RelayStatusMessage(Message):
107
84
  """
108
85
  return self.status == RELAY_ON
109
86
 
110
- def is_off(self):
111
- """
112
- :return: bool
113
- """
114
- return self.status == RELAY_OFF
115
-
116
- def channel_is_on(self):
117
- """
118
- :return: bool
119
- """
120
- if (self.status >> (self.channel - 1)) & 1 != 0:
121
- return True
122
- else:
123
- return False
124
-
125
87
  def has_interval_timer_on(self):
126
88
  """
127
89
  :return: bool
@@ -146,4 +108,13 @@ class RelayStatusMessage(Message):
146
108
  )
147
109
 
148
110
 
149
- register_command(COMMAND_CODE, RelayStatusMessage)
111
+ @register(COMMAND_CODE, ["VMB4RY"])
112
+ class RelayStatusMessage2(RelayStatusMessage):
113
+ def is_on(self):
114
+ """
115
+ :return: bool
116
+ """
117
+ if (self.status >> (self.channel - 1)) & 1 != 0:
118
+ return True
119
+ else:
120
+ return False