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,29 @@
|
|
|
1
1
|
"""
|
|
2
2
|
:author: Frank van Breugel
|
|
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 = 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[
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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 = 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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
:
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
velbusaio/messages/set_date.py
CHANGED
|
@@ -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
|
|
7
|
-
import logging
|
|
8
|
-
import time
|
|
5
|
+
from __future__ import annotations
|
|
9
6
|
|
|
10
|
-
from velbusaio.command_registry import
|
|
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.
|
|
24
|
-
self.
|
|
25
|
-
self.
|
|
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
|
|
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
|
|
7
|
-
import logging
|
|
8
|
-
import time
|
|
5
|
+
from __future__ import annotations
|
|
9
6
|
|
|
10
|
-
from velbusaio.command_registry import
|
|
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.
|
|
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
|
|
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)
|
velbusaio/messages/set_dimmer.py
CHANGED
|
@@ -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
|
|
7
|
-
import logging
|
|
3
|
+
from __future__ import annotations
|
|
8
4
|
|
|
9
|
-
from velbusaio.command_registry import
|
|
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[
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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]
|
velbusaio/messages/set_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 = 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
|
|
7
|
-
import logging
|
|
8
|
-
import time
|
|
5
|
+
from __future__ import annotations
|
|
9
6
|
|
|
10
|
-
from velbusaio.command_registry import
|
|
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.
|
|
24
|
-
self.
|
|
25
|
-
self.
|
|
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
|
|
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
|
|
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
|
|
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 = 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")
|