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,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 = 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
|
|
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 = 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
|
|
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 = 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
|
-
|
|
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])
|
velbusaio/messages/clear_led.py
CHANGED
|
@@ -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 = 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
|
|
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 = 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
|
|
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,
|
|
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,
|
|
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
|
velbusaio/messages/cover_down.py
CHANGED
|
@@ -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
|
|
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")
|
velbusaio/messages/cover_off.py
CHANGED
|
@@ -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
|
|
7
|
-
import struct
|
|
5
|
+
from __future__ import annotations
|
|
8
6
|
|
|
9
|
-
from velbusaio.command_registry import
|
|
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])
|
|
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
|
|
7
|
-
import struct
|
|
5
|
+
from __future__ import annotations
|
|
8
6
|
|
|
9
|
-
from velbusaio.command_registry import
|
|
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,
|
|
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")
|