import os import requests import openmeteo_requests from django.db.models import Avg from django.utils import timezone from datetime import timedelta from rest_framework.pagination import PageNumberPagination from rest_framework.request import Request from rest_framework import permissions from .models import WeatherStats from project.settings_context import TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID, WEATHER_LATITUDE, WEATHER_LONGITUDE class IsMikrokontroller(permissions.BasePermission): def has_permission(self, request: Request, view): mikro_key = os.environ['MIKRO_SECRET_KEY'] request_key = request.headers.get('X-Mikro-Key') return request_key == mikro_key class SmallPageNumberPagination(PageNumberPagination): page_size = 200 page_size_query_param = 'page_size' max_page_size = 500 def format_value(val, unit="%"): return f"{val:.1f}{unit}" if val is not None else "—" def send_telegram_stats(): now = timezone.now() thirty_minutes_ago = now - timedelta(minutes=30) now_formatted = now.strftime("%d.%m.%Y %H:%M") # Collect data averages = WeatherStats.objects.filter( created_at__gte=thirty_minutes_ago ).aggregate( avg_humidity_air = Avg('humidity_air'), avg_humidity_ground = Avg('humidity_ground'), avg_temperature = Avg('temperature'), avg_light = Avg('light') ) message = f""" Weather average stats for 30 mins ({now_formatted}) Humidity Air: {format_value(averages['avg_humidity_air'])} Humidity Ground: {format_value(averages['avg_humidity_ground'])} Humidity Temperature: {format_value(averages['avg_temperature', '°C'])} Light: {format_value(averages['avg_light'])} """ url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage" params = { "chat_id": TELEGRAM_CHAT_ID, "text": message, "parse_mode": "HTML" } requests.get(url, params) def get_weather_api_data(): now = timezone.now() openmeteo = openmeteo_requests.Client() start_date = now + timedelta(days=1) end_date = start_date + timedelta(days=7) start_date_formatted = start_date.strftime("%Y-%m-%d") end_date_formatted = end_date.strftime("%Y-%m-%d") url = "https://api.open-meteo.com/v1/forecast" params = { "latitude": WEATHER_LATITUDE, "longitude": WEATHER_LONGITUDE, "hourly": ["temperature_2m", "relative_humidity_2m", "precipitation_probability", "precipitation", "wind_speed_10m"], "start_date": start_date_formatted, "end_date": end_date_formatted, } responses = openmeteo.weather_api(url, params=params) response = responses[0] return response