diff --git a/examples/core_temp_scan.py b/examples/core_temp_scan.py index f4a20c3..27e7ef5 100644 --- a/examples/core_temp_scan.py +++ b/examples/core_temp_scan.py @@ -3,7 +3,7 @@ from openant.easy.node import Node from openant.devices import ANTPLUS_NETWORK_KEY -from openant.devices.core_temp import CoreTemperature, CoteTemperatureData +from openant.devices.core_temp import CoreTemperature, CoreTemperatureData def main(device_id=0): @@ -16,7 +16,7 @@ def on_found(): print(f"Device {device} found and receiving") def on_device_data(page: int, page_name: str, data): - # if isinstance(data, CoteTemperatureData): + # if isinstance(data, CoreTemperatureData): print(f"Data: ", data) device.on_found = on_found diff --git a/openant/devices/__init__.py b/openant/devices/__init__.py index 9478069..0dc6c3e 100644 --- a/openant/devices/__init__.py +++ b/openant/devices/__init__.py @@ -11,6 +11,7 @@ from . import lev from . import bike_speed_cadence from . import environment +from . import core_temp # standard ANT+ network key ANTPLUS_NETWORK_KEY = [0xB9, 0xA5, 0x21, 0xFB, 0xBD, 0x72, 0xC3, 0x45] @@ -28,6 +29,7 @@ common.DeviceType.BikeSpeed: bike_speed_cadence.BikeSpeed, common.DeviceType.BikeCadence: bike_speed_cadence.BikeCadence, common.DeviceType.BikeSpeedCadence: bike_speed_cadence.BikeSpeedCadence, + common.DeviceType.CoreTemp: core_temp.CoreTemperature, } __all__ = [ diff --git a/openant/devices/common.py b/openant/devices/common.py index d3dde6a..e2fae80 100644 --- a/openant/devices/common.py +++ b/openant/devices/common.py @@ -48,6 +48,7 @@ class DeviceType(Enum): Radar = 40 Shifting = 34 DropperSeatpost = 115 + CoreTemp = 127 @classmethod def _missing_(cls, _): # type: ignore diff --git a/openant/devices/core_temp.py b/openant/devices/core_temp.py index baa4c96..b3b9a63 100644 --- a/openant/devices/core_temp.py +++ b/openant/devices/core_temp.py @@ -7,6 +7,16 @@ from ..easy.node import Node from .common import DeviceData, AntPlusDevice, DeviceType, BatteryStatus +# Since these are used as data values, they must be floats + +HEAT_STRAIN_INDEX_INVALID = float(0xFF) + +CORE_TEMP_INVALID = float(0x8000) + +SKIN_TEMP_INVALID = float(0x800) + +RESERVED_INVALID = float(0x800) + _logger = logging.getLogger(__name__) @@ -14,22 +24,26 @@ class CoreTempDataQuality(Enum): Poor = 0 Fair = 1 Good = 2 - Excelent = 3 + Excellent = 3 Unused = 0xFF @classmethod def _missing_(cls, _): - return PressureSensorAlarm.Unknown + return CoreTempDataQuality.Unused @dataclass -class CoteTemperatureData(DeviceData): +class CoreTemperatureData(DeviceData): """ANT+ core temp data""" - quality: CoreTempDataQuality = None - skin_temp: float = field(default=0, metadata={"unit": "°C"}) - core_temp: float = field(default=0, metadata={"unit": "°C"}) + quality: CoreTempDataQuality = CoreTempDataQuality.Unused + skin_temp: float = field(default=SKIN_TEMP_INVALID, metadata={"unit": "°C"}) + core_temp: float = field(default=CORE_TEMP_INVALID, metadata={"unit": "°C"}) + heat_strain_index: float = field( + default=HEAT_STRAIN_INDEX_INVALID, metadata={"unit": "a.u."} + ) + reserved: int = field(default=RESERVED_INVALID, metadata={"unit": ""}) class CoreTemperature(AntPlusDevice): @@ -51,7 +65,7 @@ def __init__( self._event_count = [0, 0] - self.data = {**self.data, "core_temp": CoteTemperatureData()} + self.data = {**self.data, "core_temp": CoreTemperatureData()} def on_data(self, data): page = data[0] @@ -64,12 +78,32 @@ def on_data(self, data): # core temp main page elif page == 0x01: - self._event_cout = data[1] - self.data["core_temp"].skin_temp = ( - data[3] | ((data[4] & 0xF0) << 4) - ) * 0.05 - self.data["core_temp"].core_temp = ( - int.from_bytes(data[6:8], byteorder="little") * 0.01 - ) + self._event_count[0] = self._event_count[1] + self._event_count[1] = data[2] + + heat_strain_index_value = data[1] + skin_temp_value = data[3] | ((data[4] & 0xF0) << 4) + core_temp_value = int.from_bytes(data[6:8], byteorder="little") + reserved_value = int((data[5] << 4) | (data[4] & 0x0F)) + + if skin_temp_value == SKIN_TEMP_INVALID: + self.data["core_temp"].skin_temp = SKIN_TEMP_INVALID + else: + self.data["core_temp"].skin_temp = skin_temp_value * 0.05 + + if core_temp_value == CORE_TEMP_INVALID: + self.data["core_temp"].core_temp = CORE_TEMP_INVALID + else: + self.data["core_temp"].core_temp = core_temp_value * 0.01 + + if heat_strain_index_value == HEAT_STRAIN_INDEX_INVALID: + self.data["core_temp"].heat_strain_index = HEAT_STRAIN_INDEX_INVALID + else: + self.data["core_temp"].heat_strain_index = heat_strain_index_value * 0.1 + + if reserved_value == RESERVED_INVALID: + self.data["core_temp"].reserved = RESERVED_INVALID + else: + self.data["core_temp"].reserved = reserved_value self.on_device_data(page, "core_temp", self.data["core_temp"])