work: добавил автоматический режим
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
from app.qingping.models import QingpingState
|
||||
|
||||
|
||||
def parse_cgdn1(data: bytes, rssi: int | None = None) -> QingpingState | None:
|
||||
|
||||
# Восемь первых байт — заголовок CGDN1.
|
||||
if len(data) < 8:
|
||||
return None
|
||||
|
||||
temperature = None
|
||||
humidity = None
|
||||
pm25 = None
|
||||
pm10 = None
|
||||
co2 = None
|
||||
|
||||
pos = 8
|
||||
|
||||
while pos + 2 <= len(data):
|
||||
field_type = data[pos]
|
||||
length = data[pos + 1]
|
||||
|
||||
pos += 2
|
||||
|
||||
if pos + length > len(data):
|
||||
return None
|
||||
|
||||
value = data[pos:pos + length]
|
||||
pos += length
|
||||
|
||||
# Temperature + Humidity
|
||||
if field_type == 0x01 and length == 4:
|
||||
temperature = (
|
||||
int.from_bytes(
|
||||
value[0:2],
|
||||
byteorder="little",
|
||||
signed=True,
|
||||
)
|
||||
/ 10
|
||||
)
|
||||
|
||||
humidity = (
|
||||
int.from_bytes(
|
||||
value[2:4],
|
||||
byteorder="little",
|
||||
signed=False,
|
||||
)
|
||||
/ 10
|
||||
)
|
||||
|
||||
# PM2.5 + PM10
|
||||
elif field_type == 0x12 and length == 4:
|
||||
pm25 = int.from_bytes(
|
||||
value[0:2],
|
||||
byteorder="little",
|
||||
)
|
||||
|
||||
pm10 = int.from_bytes(
|
||||
value[2:4],
|
||||
byteorder="little",
|
||||
)
|
||||
|
||||
# CO2
|
||||
elif field_type == 0x13 and length == 2:
|
||||
co2 = int.from_bytes(
|
||||
value,
|
||||
byteorder="little",
|
||||
)
|
||||
|
||||
if any(
|
||||
value is None
|
||||
for value in (
|
||||
temperature,
|
||||
humidity,
|
||||
pm25,
|
||||
pm10,
|
||||
co2,
|
||||
)
|
||||
):
|
||||
return None
|
||||
|
||||
return QingpingState(
|
||||
temperature=temperature,
|
||||
humidity=humidity,
|
||||
co2=co2,
|
||||
pm25=pm25,
|
||||
pm10=pm10,
|
||||
rssi=rssi,
|
||||
)
|
||||
Reference in New Issue
Block a user