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
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})
|