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