File: meter.py

package info (click to toggle)
pyswitchbot 0.72.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 876 kB
  • sloc: python: 12,717; makefile: 2
file content (56 lines) | stat: -rw-r--r-- 1,645 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
"""Meter parser."""

from __future__ import annotations

import struct
from typing import Any

from ..helpers import celsius_to_fahrenheit

CO2_UNPACK = struct.Struct(">H").unpack_from


def process_wosensorth(data: bytes | None, mfr_data: bytes | None) -> dict[str, Any]:
    """Process woSensorTH/Temp sensor services data."""
    temp_data: bytes | None = None
    battery: bytes | None = None

    if mfr_data:
        temp_data = mfr_data[8:11]

    if data:
        if not temp_data:
            temp_data = data[3:6]
        battery = data[2] & 0b01111111

    if not temp_data:
        return {}

    _temp_sign = 1 if temp_data[1] & 0b10000000 else -1
    _temp_c = _temp_sign * (
        (temp_data[1] & 0b01111111) + ((temp_data[0] & 0b00001111) / 10)
    )
    _temp_f = celsius_to_fahrenheit(_temp_c)
    _temp_f = (_temp_f * 10) / 10
    humidity = temp_data[2] & 0b01111111

    if _temp_c == 0 and humidity == 0 and battery == 0:
        return {}

    return {
        # Data should be flat, but we keep the original structure for now
        "temp": {"c": _temp_c, "f": _temp_f},
        "temperature": _temp_c,
        "fahrenheit": bool(temp_data[2] & 0b10000000),
        "humidity": humidity,
        "battery": battery,
    }


def process_wosensorth_c(data: bytes | None, mfr_data: bytes | None) -> dict[str, Any]:
    """Process woSensorTH/Temp sensor services data with CO2."""
    _wosensorth_data = process_wosensorth(data, mfr_data)
    if _wosensorth_data and mfr_data and len(mfr_data) >= 15:
        co2_data = mfr_data[13:15]
        _wosensorth_data["co2"] = CO2_UNPACK(co2_data)[0]
    return _wosensorth_data