You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

202 lines
7.8 KiB

# -*- coding:utf-8 -*-
"""
@Created on : 2023/7/7 14:16
@Author: hxl
@Des:
"""
from datetime import datetime, timedelta
from typing import List
from fastapi import APIRouter
from pydantic import BaseModel
from helper import respond_to
from models import EnvironmentLogs, Cabinet
import socket
import binascii
# from .tempvoc import get_global_temp_value, get_global_voc_value
# 获取全局变量的值
# temp_value = get_global_temp_value()
# voc_value = get_global_voc_value()
router = APIRouter(prefix='/home')
# @router.get("/temp",summary='温湿度')
# async def get_temp_data():
# return get_global_temp_value()
# @router.get("/hum",summary='温湿度')
# async def get_voc_data():
# return get_global_voc_value()
# def convert_to_decimal(hex_str):
# return int(hex_str, 16)
# @router.get("/voc",summary="voc")
# async def get_voc():
# TCP_IP = '192.168.0.7'
# TCP_PORT = 26
# MESSAGE = bytes.fromhex('01 03 00 00 00 02 C4 0B')
#
# with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
# s.connect((TCP_IP, TCP_PORT))
# s.send(MESSAGE)
# data = s.recv(1024)
#
# hex_data = binascii.hexlify(data).decode('utf-8')
# print("Received Hex Data:", hex_data)
#
# # 获取校验位和所需的数据部分
# # checksum = hex_data[-4:] # 校验位是最后两个字节
# required_data = hex_data[10:-4] # 数据部分是从索引12开始到校验位之前
#
# # decimal_checksum = convert_to_decimal(checksum)
# decimal_required_data = (int)(convert_to_decimal(required_data) / 1000)
#
# # print("Decimal Checksum:", decimal_checksum)
# return decimal_required_data
class TimeRange(BaseModel):
start_time: str | None
end_time: str | None
cabinet_id: str
page_no: int = 1
page_size: int = 10
class EnvironmentInfo(BaseModel):
date: str
cabinet_id: str
page_no: int = 1
page_size: int = 10
@router.get("/chart/{cabinet_id}", summary='环境图标数据')
async def get_chart_data(cabinet_id: str):
today = datetime.today().strftime("%Y-%m-%d")
logs = await EnvironmentLogs.filter(cabinet_id=cabinet_id,
created_at__gte=f"{today} 00:00:00",
created_at__lte=f"{today} 23:59:59"
).order_by("created_at").limit(48)
# 处理数据,将其转换为图表所需的格式
chart_data = {
"labels": [],
"left_temperature": [],
"right_temperature": [],
"voc": [],
"humidity": []
}
for log in logs:
chart_data["labels"].append(log.created_at.strftime("%H:%M"))
chart_data["left_temperature"].append(log.left_temperature) if log.left_temperature else None
chart_data["right_temperature"].append(log.right_temperature) if log.right_temperature else None
chart_data["voc"].append(log.voc) if log.voc else None
chart_data["humidity"].append(log.humidity) if log.humidity else None
return respond_to(data=chart_data)
async def get_average_temperatures(start_time: datetime, end_time: datetime, cabinet_id, page_no, page_size) -> List[
dict]:
avg_temperatures = []
current_date = start_time.date()
total_left_temp = 0
total_right_temp = 0
count = 0
environment_logs = await EnvironmentLogs.filter(created_at__gte=start_time, created_at__lte=end_time,
cabinet_id=cabinet_id).order_by('created_at').all()
for log in environment_logs:
timestamp = log.created_at
if timestamp.date() == current_date:
left_temperature = log.left_temperature if log.left_temperature else 0
total_left_temp += left_temperature
right_temperature = log.right_temperature if log.right_temperature else 0
total_right_temp += right_temperature
count += 1
else:
average_left_temp = total_left_temp / count if count > 0 else 0
average_right_temp = total_right_temp / count if count > 0 else 0
avg_temperatures.append({
"date": current_date.isoformat(),
"average_left_temperature": round(average_left_temp, 2),
"average_right_temperature": round(average_right_temp, 2)
})
current_date = timestamp.date()
total_left_temp = log.left_temperature if log.left_temperature else 0
total_right_temp = log.right_temperature if log.right_temperature else 0
count = 1
# 添加最后一个时间段的平均温度
if count > 0:
average_left_temp = total_left_temp / count
average_right_temp = total_right_temp / count
avg_temperatures.append({
"date": current_date.isoformat(),
"average_left_temperature": round(average_left_temp, 2),
"average_right_temperature": round(average_right_temp, 2)
})
return avg_temperatures
@router.post("/average_temperatures", summary='获取温度记录(天)')
async def calculate_average_temperatures(time_range: TimeRange):
"""
获取获取温度记录(天)
:param time_range: TimeRange
:return:
"""
# 计算当前周的星期一和星期日
if time_range.start_time is None:
# 获取当前日期
current_date = datetime.now()
start_of_week = current_date - timedelta(days=current_date.weekday())
end_of_week = start_of_week + timedelta(days=6)
start_time = start_of_week.strftime("%Y-%m-%d")
end_time = (end_of_week + timedelta(days=1)).strftime("%Y-%m-%d")
start_time = datetime.strptime(start_time, "%Y-%m-%d")
end_time = datetime.strptime(end_time, "%Y-%m-%d") + timedelta(days=1)
else:
start_time = datetime.strptime(time_range.start_time, "%Y-%m-%d")
end_time = datetime.strptime(time_range.end_time, "%Y-%m-%d") + timedelta(days=1)
cabinet_id = time_range.cabinet_id
page_size = time_range.page_size
page_no = time_range.page_no
offset = (page_no - 1) * page_size
average_temps = await get_average_temperatures(start_time, end_time, cabinet_id, page_no, page_size)
cabinet = await Cabinet.get(id=cabinet_id)
temp_type = cabinet.params.get("temperature", '')
data = average_temps[offset:offset + page_size]
data = sorted(data, key=lambda x: x['date'], reverse=True)
return respond_to(data={'temp_type': len(temp_type), 'average_temps': data, 'count': len(average_temps)})
@router.post("/environment_logs", summary='温度记录(详情)')
async def get_environment_logs_by_date(time_range: EnvironmentInfo):
"""
获取获取温度记录(详情)
:param time_range: EnvironmentInfo
:return:
"""
start_time = datetime.strptime(time_range.date, "%Y-%m-%d").replace(hour=0, minute=0, second=0)
end_time = start_time + timedelta(days=1)
offset = (time_range.page_no - 1) * time_range.page_size
count = await EnvironmentLogs.filter(created_at__gte=start_time, created_at__lt=end_time,
cabinet_id=time_range.cabinet_id).count()
environment_logs = await EnvironmentLogs.filter(created_at__gte=start_time, created_at__lt=end_time,
cabinet_id=time_range.cabinet_id).offset(offset).limit(
time_range.page_size).order_by(
'created_at').all()
formatted_logs = []
for log in environment_logs:
formatted_log = {
"left_temperature": log.left_temperature,
"created_at": log.created_at.strftime("%H:%M:%S"),
"right_temperature": log.right_temperature
}
formatted_logs.append(formatted_log)
cabinet = await Cabinet.get(id=time_range.cabinet_id)
temp_type = cabinet.params.get("temperature", '')
return respond_to(data={'temp_type': len(temp_type), "environment_logs": formatted_logs, "count": count})