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.

88 lines
3.1 KiB

# -*- coding:utf-8 -*-
"""
@Created on : 2023/7/24 13:11
@Author: hxl
@Des:
"""
# !/usr/bin/env python
# encoding: utf-8
"""
@author: tx
@file: task.py
@time: 2023/5/15 19:18
@desc:
"""
import httpx
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from pytz import timezone
from conf import setting
from helper.logger import logger
from models import Cabinet, EnvironmentLogs
async def fetch_environment_info(cabinet):
if not cabinet.ip:
return {}
url = f'http://{cabinet.ip}/api/cabinet/v1/sensor'
async with httpx.AsyncClient() as client:
response = await client.get(url, timeout=5)
environment_info = response.json()
return environment_info
async def create_environment_logs(environment_info, cabinet):
temperature_type = len(environment_info['temperature'])
temperature = environment_info['temperature']
if temperature_type == 1:
environment_info['right_temperature'] = temperature[0]
elif temperature_type == 2:
environment_info['left_temperature'] = temperature[0]
environment_info['right_temperature'] = temperature[1]
# 下位机协议存在修改(兼容下位机的数据上报)
if environment_info["voc"] == [] or environment_info["voc"] == None:
environment_info["voc"]=None
else:
environment_info["voc"]=",".join(map(lambda x:str(x),environment_info["voc"]))
if environment_info["humidity"] == [] or environment_info["humidity"] == None:
environment_info["humidity"]=None
else:
environment_info["humidity"]=",".join(map(lambda x:str(x),environment_info["humidity"]))
await EnvironmentLogs.create(**environment_info, temperature_type=temperature_type, cabinet=cabinet)
async def environment_log_job():
cabinets = await Cabinet.filter(terminal=setting.TERMINAL_ID)
for cabinet in cabinets:
try:
environment_info = await fetch_environment_info(cabinet)
await create_environment_logs(environment_info, cabinet)
except Exception as e:
logger.error(f"传感器数据获取失败-{e}")
# def start_scheduler():
# """启动定时任务,早上8点与晚上8点执行一次获取一次下位机环境数据"""
# scheduler = AsyncIOScheduler(timezone=timezone('Asia/Shanghai'))
# scheduler.add_job(environment_log_job, 'interval', minutes=30)
# # scheduler.add_job(environment_log_job, 'cron', hour="8,20")
# scheduler.start()
async def start_scheduler():
"""启动定时任务,早上8点与晚上8点执行一次获取一次下位机环境数据"""
scheduler = AsyncIOScheduler(timezone=timezone('Asia/Shanghai'))
try:
cabinets = await Cabinet.filter(terminal=setting.TERMINAL_ID)
minute = int(cabinets[0].params.get("minute"))
print("minute-->",minute)
except Exception as e:
minute = 30
logger.info(f"准备启动环境监控定时任务, 间隔时间: {minute}")
scheduler.add_job(environment_log_job, 'interval', minutes=int(minute))
# scheduler.add_job(environment_log_job, 'cron', hour="8,20")
scheduler.start()