colmi_r02_client.hr_settings

Heart rate log settings for controlling if the ring should record heart rate periodically, and if so how often to record.

An odd packet set up as it's either a query for the current settings or trying to set the settings.

I don't know what byte 1 in the response is.

 1"""
 2Heart rate log settings for controlling if the ring should record heart rate periodically, and if so how often to record.
 3
 4An odd packet set up as it's either a query for the current settings or trying to set the settings.
 5
 6I don't know what byte 1 in the response is.
 7"""
 8
 9from dataclasses import dataclass
10import logging
11
12from colmi_r02_client.packet import make_packet
13
14CMD_HEART_RATE_LOG_SETTINGS = 22  # 0x16
15
16READ_HEART_RATE_LOG_SETTINGS_PACKET = make_packet(CMD_HEART_RATE_LOG_SETTINGS, bytearray(b"\x01"))
17
18logger = logging.getLogger(__name__)
19
20
21@dataclass
22class HeartRateLogSettings:
23    enabled: bool
24    interval: int
25    """Interval in minutes"""
26
27
28def parse_heart_rate_log_settings(packet: bytearray) -> HeartRateLogSettings:
29    r"""
30    example: bytearray(b'\x16\x01\x01<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T')
31    """
32    assert packet[0] == CMD_HEART_RATE_LOG_SETTINGS
33
34    raw_enabled = packet[2]
35    if raw_enabled == 1:
36        enabled = True
37    elif raw_enabled == 2:
38        enabled = False
39    else:
40        logger.warning(f"Unexpected value in enabled byte {raw_enabled}, defaulting to false")
41        enabled = False
42
43    return HeartRateLogSettings(enabled=enabled, interval=packet[3])
44
45
46def hr_log_settings_packet(settings: HeartRateLogSettings) -> bytearray:
47    assert 0 < settings.interval < 256, "Interval must be between 0 and 255"
48    enabled = 1 if settings.enabled else 2
49    sub_data = bytearray([2, enabled, settings.interval])
50    return make_packet(CMD_HEART_RATE_LOG_SETTINGS, sub_data)
CMD_HEART_RATE_LOG_SETTINGS = 22
READ_HEART_RATE_LOG_SETTINGS_PACKET = bytearray(b'\x16\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17')
logger = <Logger colmi_r02_client.hr_settings (WARNING)>
@dataclass
class HeartRateLogSettings:
22@dataclass
23class HeartRateLogSettings:
24    enabled: bool
25    interval: int
26    """Interval in minutes"""
HeartRateLogSettings(enabled: bool, interval: int)
enabled: bool
interval: int

Interval in minutes

def parse_heart_rate_log_settings(packet: bytearray) -> HeartRateLogSettings:
29def parse_heart_rate_log_settings(packet: bytearray) -> HeartRateLogSettings:
30    r"""
31    example: bytearray(b'\x16\x01\x01<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T')
32    """
33    assert packet[0] == CMD_HEART_RATE_LOG_SETTINGS
34
35    raw_enabled = packet[2]
36    if raw_enabled == 1:
37        enabled = True
38    elif raw_enabled == 2:
39        enabled = False
40    else:
41        logger.warning(f"Unexpected value in enabled byte {raw_enabled}, defaulting to false")
42        enabled = False
43
44    return HeartRateLogSettings(enabled=enabled, interval=packet[3])

example: bytearray(b'\x16\x01\x01<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00T')

def hr_log_settings_packet(settings: HeartRateLogSettings) -> bytearray:
47def hr_log_settings_packet(settings: HeartRateLogSettings) -> bytearray:
48    assert 0 < settings.interval < 256, "Interval must be between 0 and 255"
49    enabled = 1 if settings.enabled else 2
50    sub_data = bytearray([2, enabled, settings.interval])
51    return make_packet(CMD_HEART_RATE_LOG_SETTINGS, sub_data)