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.
- scripts/parse_specs.py +156 -0
- velbus_aio-2025.11.0.dist-info/METADATA +71 -0
- velbus_aio-2025.11.0.dist-info/RECORD +194 -0
- {velbus_aio-2021.8.7.dist-info → velbus_aio-2025.11.0.dist-info}/WHEEL +1 -1
- velbus_aio-2025.11.0.dist-info/top_level.txt +3 -0
- velbusaio/channels.py +443 -109
- velbusaio/command_registry.py +126 -13
- velbusaio/const.py +36 -12
- velbusaio/controller.py +252 -177
- velbusaio/discovery.py +2 -2
- velbusaio/exceptions.py +22 -0
- velbusaio/handler.py +311 -145
- velbusaio/helpers.py +6 -18
- velbusaio/message.py +46 -132
- velbusaio/messages/__init__.py +12 -2
- velbusaio/messages/blind_status.py +16 -25
- velbusaio/messages/bus_active.py +3 -9
- velbusaio/messages/bus_error_counter_status.py +3 -4
- velbusaio/messages/bus_error_counter_status_request.py +3 -4
- velbusaio/messages/bus_off.py +3 -4
- velbusaio/messages/channel_name_part1.py +49 -33
- velbusaio/messages/channel_name_part2.py +49 -33
- velbusaio/messages/channel_name_part3.py +49 -33
- velbusaio/messages/channel_name_request.py +26 -12
- velbusaio/messages/clear_led.py +3 -4
- velbusaio/messages/counter_status.py +3 -17
- velbusaio/messages/counter_status_request.py +6 -6
- velbusaio/messages/counter_value.py +44 -0
- velbusaio/messages/cover_down.py +4 -29
- velbusaio/messages/cover_off.py +5 -29
- velbusaio/messages/cover_position.py +4 -19
- velbusaio/messages/cover_up.py +4 -27
- velbusaio/messages/dali_device_settings.py +178 -0
- velbusaio/messages/dali_device_settings_request.py +53 -0
- velbusaio/messages/dali_dim_value_status.py +44 -0
- velbusaio/messages/dimmer_channel_status.py +6 -19
- velbusaio/messages/dimmer_status.py +14 -31
- velbusaio/messages/edge_set_color.py +114 -0
- velbusaio/messages/edge_set_custom_color.py +56 -0
- velbusaio/messages/fast_blinking_led.py +3 -4
- velbusaio/messages/forced_off.py +3 -4
- velbusaio/messages/forced_on.py +3 -4
- velbusaio/messages/interface_status_request.py +3 -4
- velbusaio/messages/ir_receiver_status.py +18 -0
- velbusaio/messages/kwh_status.py +3 -19
- velbusaio/messages/light_value_request.py +3 -4
- velbusaio/messages/memo_text.py +3 -5
- velbusaio/messages/memory_data.py +3 -16
- velbusaio/messages/memory_data_block.py +3 -4
- velbusaio/messages/memory_dump_request.py +3 -4
- velbusaio/messages/module_status.py +107 -55
- velbusaio/messages/module_status_request.py +7 -6
- velbusaio/messages/module_subtype.py +11 -19
- velbusaio/messages/module_type.py +132 -21
- velbusaio/messages/module_type_request.py +1 -0
- velbusaio/messages/psu_load.py +56 -0
- velbusaio/messages/psu_values.py +53 -0
- velbusaio/messages/push_button_status.py +3 -16
- velbusaio/messages/raw.py +74 -0
- velbusaio/messages/read_data_block_from_memory.py +3 -4
- velbusaio/messages/read_data_from_memory.py +3 -4
- velbusaio/messages/realtime_clock_status_request.py +3 -4
- velbusaio/messages/receive_buffer_full.py +3 -4
- velbusaio/messages/receive_ready.py +3 -4
- velbusaio/messages/relay_status.py +13 -42
- velbusaio/messages/restore_dimmer.py +33 -24
- velbusaio/messages/select_program.py +35 -0
- velbusaio/messages/sensor_settings_request.py +3 -4
- velbusaio/messages/sensor_temp_request.py +3 -4
- velbusaio/messages/sensor_temperature.py +15 -19
- velbusaio/messages/set_date.py +10 -30
- velbusaio/messages/set_daylight_saving.py +8 -24
- velbusaio/messages/set_dimmer.py +43 -41
- velbusaio/messages/set_led.py +3 -4
- velbusaio/messages/set_realtime_clock.py +10 -30
- velbusaio/messages/set_temperature.py +3 -4
- velbusaio/messages/slider_status.py +16 -20
- velbusaio/messages/slow_blinking_led.py +3 -4
- velbusaio/messages/start_relay_blinking_timer.py +3 -4
- velbusaio/messages/start_relay_timer.py +3 -4
- velbusaio/messages/switch_relay_off.py +3 -16
- velbusaio/messages/switch_relay_on.py +3 -16
- velbusaio/messages/switch_to_comfort.py +4 -15
- velbusaio/messages/switch_to_day.py +4 -15
- velbusaio/messages/switch_to_night.py +4 -15
- velbusaio/messages/switch_to_safe.py +4 -15
- velbusaio/messages/temp_sensor_settings_part1.py +3 -4
- velbusaio/messages/temp_sensor_settings_part2.py +27 -0
- velbusaio/messages/temp_sensor_settings_part3.py +27 -0
- velbusaio/messages/temp_sensor_settings_part4.py +27 -0
- velbusaio/messages/temp_sensor_settings_request.py +3 -4
- velbusaio/messages/temp_sensor_status.py +34 -35
- velbusaio/messages/temp_set_cooling.py +3 -13
- velbusaio/messages/temp_set_heating.py +3 -13
- velbusaio/messages/update_led_status.py +3 -4
- velbusaio/messages/very_fast_blinking_led.py +3 -4
- velbusaio/messages/write_data_to_memory.py +3 -4
- velbusaio/messages/write_memory_block.py +3 -4
- velbusaio/messages/write_module_address_and_serial_number.py +3 -4
- velbusaio/module.py +680 -158
- velbusaio/module_spec/01.json +62 -0
- velbusaio/module_spec/02.json +16 -0
- velbusaio/module_spec/03.json +23 -0
- velbusaio/module_spec/04.json +283 -0
- velbusaio/module_spec/05.json +54 -0
- velbusaio/module_spec/06.json +110 -0
- velbusaio/module_spec/07.json +16 -0
- velbusaio/module_spec/08.json +38 -0
- velbusaio/module_spec/09.json +30 -0
- velbusaio/module_spec/0A.json +58 -0
- velbusaio/module_spec/0B.json +58 -0
- velbusaio/module_spec/0C.json +18 -0
- velbusaio/module_spec/0E.json +25 -0
- velbusaio/module_spec/0F.json +16 -0
- velbusaio/module_spec/10.json +111 -0
- velbusaio/module_spec/11.json +111 -0
- velbusaio/module_spec/12.json +73 -0
- velbusaio/module_spec/13.json +4 -0
- velbusaio/module_spec/14.json +16 -0
- velbusaio/module_spec/15.json +83 -0
- velbusaio/module_spec/16.json +129 -0
- velbusaio/module_spec/17.json +129 -0
- velbusaio/module_spec/18.json +129 -0
- velbusaio/module_spec/1A.json +79 -0
- velbusaio/module_spec/1B.json +107 -0
- velbusaio/module_spec/1D.json +89 -0
- velbusaio/module_spec/1E.json +306 -0
- velbusaio/module_spec/1F.json +178 -0
- velbusaio/module_spec/20.json +178 -0
- velbusaio/module_spec/21.json +326 -0
- velbusaio/module_spec/22.json +426 -0
- velbusaio/module_spec/23.json +129 -0
- velbusaio/module_spec/24.json +30 -0
- velbusaio/module_spec/25.json +3 -0
- velbusaio/module_spec/28.json +454 -0
- velbusaio/module_spec/29.json +235 -0
- velbusaio/module_spec/2A.json +239 -0
- velbusaio/module_spec/2B.json +239 -0
- velbusaio/module_spec/2C.json +257 -0
- velbusaio/module_spec/2D.json +270 -0
- velbusaio/module_spec/2E.json +215 -0
- velbusaio/module_spec/2F.json +211 -0
- velbusaio/module_spec/30.json +58 -0
- velbusaio/module_spec/31.json +465 -0
- velbusaio/module_spec/32.json +385 -0
- velbusaio/module_spec/33.json +249 -0
- velbusaio/module_spec/34.json +313 -0
- velbusaio/module_spec/35.json +313 -0
- velbusaio/module_spec/36.json +313 -0
- velbusaio/module_spec/37.json +333 -0
- velbusaio/module_spec/38.json +111 -0
- velbusaio/module_spec/39.json +4 -0
- velbusaio/module_spec/3A.json +306 -0
- velbusaio/module_spec/3B.json +306 -0
- velbusaio/module_spec/3C.json +306 -0
- velbusaio/module_spec/3D.json +454 -0
- velbusaio/module_spec/3E.json +302 -0
- velbusaio/module_spec/3F.json +4 -0
- velbusaio/module_spec/40.json +4 -0
- velbusaio/module_spec/41.json +241 -0
- velbusaio/module_spec/42.json +4 -0
- velbusaio/module_spec/43.json +23 -0
- velbusaio/module_spec/44.json +38 -0
- velbusaio/module_spec/45.json +4 -0
- velbusaio/module_spec/48.json +111 -0
- velbusaio/module_spec/49.json +111 -0
- velbusaio/module_spec/4A.json +89 -0
- velbusaio/module_spec/4B.json +138 -0
- velbusaio/module_spec/4C.json +129 -0
- velbusaio/module_spec/4D.json +108 -0
- velbusaio/module_spec/4E.json +787 -0
- velbusaio/module_spec/4F.json +114 -0
- velbusaio/module_spec/50.json +114 -0
- velbusaio/module_spec/51.json +114 -0
- velbusaio/module_spec/52.json +456 -0
- velbusaio/module_spec/54.json +270 -0
- velbusaio/module_spec/55.json +270 -0
- velbusaio/module_spec/56.json +270 -0
- velbusaio/module_spec/57.json +260 -0
- velbusaio/module_spec/5A.json +4 -0
- velbusaio/module_spec/5B.json +4 -0
- velbusaio/module_spec/5C.json +90 -0
- velbusaio/module_spec/5F.json +78 -0
- velbusaio/module_spec/60.json +4 -0
- velbusaio/module_spec/61.json +89 -0
- velbusaio/module_spec/broadcast.json +67 -0
- velbusaio/module_spec/ignore.json +22 -0
- velbusaio/protocol.py +243 -0
- velbusaio/py.typed +0 -0
- velbusaio/raw_message.py +149 -0
- velbusaio/util.py +55 -0
- velbusaio/vlp_reader.py +249 -0
- velbus_aio-2021.8.7.dist-info/METADATA +0 -66
- velbus_aio-2021.8.7.dist-info/RECORD +0 -90
- velbus_aio-2021.8.7.dist-info/top_level.txt +0 -1
- velbusaio/messages/meteo_raw.py +0 -52
- velbusaio/module_registry.py +0 -64
- velbusaio/moduleprotocol/protocol.json +0 -25540
- velbusaio/parser.py +0 -142
- {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
|
|
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
|
|
113
|
+
def module_type_name(self) -> str:
|
|
47
114
|
"""
|
|
48
115
|
:return: str
|
|
49
116
|
"""
|
|
50
|
-
return "Unknown"
|
|
51
117
|
|
|
52
|
-
|
|
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
|
-
|
|
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:
|
|
178
|
+
:return: str
|
|
70
179
|
"""
|
|
71
|
-
return
|
|
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
|
-
|
|
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]
|
|
@@ -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
|
|
5
|
+
from __future__ import annotations
|
|
7
6
|
|
|
8
|
-
from velbusaio.command_registry import
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|