meter.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. """Meter parser."""
  2. from __future__ import annotations
  3. import struct
  4. from typing import Any
  5. from ._sensor_th import decode_temp_humidity
  6. CO2_UNPACK = struct.Struct(">H").unpack_from
  7. # Meter Pro CO2 sensor spec range is 400-9999 ppm. Higher values are
  8. # transient parsing artifacts and surface as huge spikes downstream.
  9. CO2_MAX_PPM = 9999
  10. def process_wosensorth(data: bytes | None, mfr_data: bytes | None) -> dict[str, Any]:
  11. """Process woSensorTH/Temp sensor services data."""
  12. temp_data: bytes | None = None
  13. battery: int | None = None
  14. if mfr_data:
  15. temp_data = mfr_data[8:11]
  16. if data:
  17. if not temp_data:
  18. temp_data = data[3:6]
  19. battery = data[2] & 0b01111111
  20. if not temp_data:
  21. return {}
  22. return decode_temp_humidity(temp_data, battery)
  23. def process_wosensorth_c(data: bytes | None, mfr_data: bytes | None) -> dict[str, Any]:
  24. """Process woSensorTH/Temp sensor services data with CO2."""
  25. _wosensorth_data = process_wosensorth(data, mfr_data)
  26. if _wosensorth_data and mfr_data and len(mfr_data) >= 15:
  27. co2_data = mfr_data[13:15]
  28. co2 = CO2_UNPACK(co2_data)[0]
  29. if co2 <= CO2_MAX_PPM:
  30. _wosensorth_data["co2"] = co2
  31. return _wosensorth_data