EvaluationEfficiencyOptimiz.../davisAPI/davisAPI.py

190 lines
6.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# import gc
# import logging
# import time
# from datetime import datetime, timedelta
# from pprint import pprint
# import mariadb
# import serial.tools.list_ports
#
# #from PyWeather.weather.stations.davis import VantagePro
# from prediction import run_prediction_module
#
# logging.basicConfig(filename="Stations.log",
# format='%(asctime)s %(message)s',
# filemode='a')
# logger = logging.getLogger('davis_api')
# logger.setLevel(logging.DEBUG)
#
# console_handler = logging.StreamHandler()
# console_handler.setLevel(logging.DEBUG)
# console_handler.setFormatter(logging.Formatter('%(asctime)s %(message)s'))
# logger.addHandler(console_handler)
#
#
# def write_data(device, station, send=True):
# try:
# # device.parse()
# data = device.fields
# logger.info(data)
# if len(data) < 1:
# return
# else:
# logger.info(data)
# fields = ['BarTrend', 'CRC', 'DateStamp', 'DewPoint', 'HeatIndex', 'ETDay', 'HeatIndex',
# 'HumIn', 'HumOut', 'Pressure', 'RainDay', 'RainMonth', 'RainRate', 'RainStorm',
# 'RainYear', 'SunRise', 'SunSet', 'TempIn', 'TempOut', 'WindDir', 'WindSpeed',
# 'WindSpeed10Min']
#
# if send:
# placeholders = ', '.join(['%s'] * len(fields))
# field_names = ', '.join(fields)
# sql = f"INSERT INTO weather_data ({field_names}) VALUES ({placeholders})"
# values = [data[field] for field in fields]
# cursor.execute(sql, values)
# conn.commit()
# else:
# logger.info(data)
#
# del data
# del fields
# gc.collect()
# except Exception as e:
# logger.error(str(e))
# raise e
#
#
# def get_previous_values(cursor):
# cursor.execute("SELECT SunRise, SunSet, WindDir, DateStamp FROM weather_data ORDER BY DateStamp DESC LIMIT 1")
# result = cursor.fetchone()
#
# if result is None:
# return None, None, None, None
#
# sun_rise, sun_set, wind_dir, datestamp = result
# return sun_rise, sun_set, wind_dir, datestamp
#
#
# def save_prediction_to_db(predictions):
# try:
#
# sun_rise, sun_set, wind_dir, datestamp = get_previous_values(cursor)
#
# fields = ['DateStamp', 'SunRise', 'SunSet', 'WindDir'] + list(predictions.keys())
# placeholders = ', '.join(['%s'] * len(fields))
# field_names = ', '.join(fields)
#
# values = [datestamp + timedelta(minutes = 1), sun_rise, sun_set, wind_dir] + list(predictions.values())
# pprint(dict(zip(fields, values)))
# sql = f"INSERT INTO weather_data ({field_names}) VALUES ({placeholders})"
# # cursor.execute(sql, values)
# # conn.commit()
# logger.info("Save prediction to db success!")
# except Exception as e:
# logger.error(str(e))
# raise e
#
#
# try:
# conn = mariadb.connect(
# user="wind",
# password="wind",
# host="193.124.203.110",
# port=3306,
# database="wind_towers"
# )
# cursor = conn.cursor()
# except mariadb.Error as e:
# logger.error('DB_ERR: ' + str(e))
# raise e
# while True:
# try:
# ports = serial.tools.list_ports.comports()
# available_ports = {}
#
# for port in ports:
# if port.serial_number == '0001':
# available_ports[port.name] = port.vid
#
# devices = [VantagePro(port) for port in available_ports.keys()]
# while True:
# for i in range(1):
# if len(devices) != 0:
# logger.info(devices)
# # write_data(devices[i], 'st' + str(available_ports[list(available_ports.keys())[i]]), True)
# else:
# raise Exception('Can`t connect to device')
# time.sleep(60)
# except Exception as e:
# logger.error('Device_error' + str(e))
# predictions = run_prediction_module()
# #logger.info(predictions)
# if predictions is not None:
# save_prediction_to_db(predictions)
# time.sleep(60)
#todo переписать под influx, для линухи приколы сделать
import metpy.calc
from datetime import datetime
import torch
from aurora import AuroraSmall, Batch, Metadata
from metpy.units import units
def get_wind_speed_and_direction(lat:float,lon:float):
model = AuroraSmall()
model.load_checkpoint("microsoft/aurora", "aurora-0.25-small-pretrained.ckpt")
batch = Batch(
surf_vars={k: torch.randn(1, 2, 17, 32) for k in ("2t", "10u", "10v", "msl")},
static_vars={k: torch.randn(17, 32) for k in ("lsm", "z", "slt")},
atmos_vars={k: torch.randn(1, 2, 4, 17, 32) for k in ("z", "u", "v", "t", "q")},
metadata=Metadata(
lat=torch.linspace(90, -90, 17),
lon=torch.linspace(0, 360, 32 + 1)[:-1],
time=(datetime(2024, 11, 26, 23, 7),),
atmos_levels=(100,),
),
)
prediction = model.forward(batch)
target_lat = lat
target_lon = lon
lat_idx = torch.abs(batch.metadata.lat - target_lat).argmin()
lon_idx = torch.abs(batch.metadata.lon - target_lon).argmin()
u_values = prediction.atmos_vars["u"][:, :, :, lat_idx, lon_idx]
v_values = prediction.atmos_vars["v"][:, :, :, lat_idx, lon_idx]
print("u values at target location:", u_values)
print("v values at target location:", v_values)
u_scalar = u_values.item()
v_scalar = v_values.item()
print("u value:", u_scalar)
print("v value:", v_scalar)
u_with_units = u_scalar * units("m/s")
v_with_units = v_scalar * units("m/s")
# Рассчитайте направление и скорость ветра
wind_dir = metpy.calc.wind_direction(u_with_units, v_with_units)
wind_speed = metpy.calc.wind_speed(u_with_units, v_with_units)
wind_dir_text = wind_direction_to_text(wind_dir.magnitude)
print(type(wind_dir))
# Вывод результата
print(f"Направление ветра: {wind_dir_text} ({wind_dir:.2f}°)")
print(f"Скорость ветра: {wind_speed:.2f} м/с")
return wind_dir.magnitude.item(),wind_speed.magnitude.item()
def wind_direction_to_text(wind_dir_deg):
directions = [
"север", "северо-восток", "восток", "юго-восток",
"юг", "юго-запад", "запад", "северо-запад"
]
idx = int((wind_dir_deg + 22.5) // 45) % 8
return directions[idx]
print(get_wind_speed_and_direction(50,20))