#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Script di test per generare e mostrare grafico neve con dati mock """ import datetime import os import sys from zoneinfo import ZoneInfo # Aggiungi il percorso dello script principale sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from arome_snow_alert import generate_snow_chart_image, TZINFO, telegram_send_photo, TELEGRAM_CHAT_IDS def create_mock_data(): """Crea dati mock realistici per test del grafico""" now = datetime.datetime.now(TZINFO) now = now.replace(minute=0, second=0, microsecond=0) # Genera 48 ore di dati orari times = [] snowfall_arome = [] rain_arome = [] snowfall_icon = [] rain_icon = [] snow_depth_icon = [] # Scenario realistico: nevicata nelle prime 24h, poi pioggia/neve mista for i in range(48): dt = now + datetime.timedelta(hours=i) times.append(dt.isoformat()) # AROME Seamless # Simula nevicata nelle prime 18 ore if i < 18: # Picco di neve intorno alle 8-12 ore if 8 <= i <= 12: snowfall_arome.append(0.5 + (i - 8) * 0.2) # 0.5-1.3 cm/h elif 12 < i <= 15: snowfall_arome.append(1.3 - (i - 12) * 0.2) # Decresce else: snowfall_arome.append(0.2 + (i % 3) * 0.1) # Variazione rain_arome.append(0.0) # Transizione a pioggia/neve mista elif 18 <= i < 24: snowfall_arome.append(0.1 + (i - 18) * 0.05) # Neve residua rain_arome.append(0.5 + (i - 18) * 0.3) # Pioggia aumenta # Pioggia elif 24 <= i < 36: snowfall_arome.append(0.0) rain_arome.append(1.5 + (i - 24) % 4 * 0.5) # Pioggia variabile # Fine precipitazioni else: snowfall_arome.append(0.0) rain_arome.append(0.0) # ICON Italia (leggermente diverso per mostrare discrepanze) if i < 20: # Neve piรน persistente in ICON if 10 <= i <= 14: snowfall_icon.append(0.6 + (i - 10) * 0.25) # 0.6-1.6 cm/h elif 14 < i <= 18: snowfall_icon.append(1.6 - (i - 14) * 0.15) else: snowfall_icon.append(0.3 + (i % 3) * 0.15) rain_icon.append(0.0) elif 20 <= i < 28: snowfall_icon.append(0.05) rain_icon.append(0.8 + (i - 20) * 0.2) elif 28 <= i < 38: snowfall_icon.append(0.0) rain_icon.append(2.0 + (i - 28) % 3 * 0.4) else: snowfall_icon.append(0.0) rain_icon.append(0.0) # Snow depth (ICON Italia) - accumulo progressivo poi scioglimento if i == 0: snow_depth_icon.append(0.0) elif i < 20: # Accumulo progressivo prev_depth = snow_depth_icon[-1] if snow_depth_icon else 0.0 new_snow = snowfall_icon[i] * 0.8 # 80% si accumula (perdite per compattazione) snow_depth_icon.append(prev_depth + new_snow) elif 20 <= i < 30: # Scioglimento lento con pioggia prev_depth = snow_depth_icon[-1] if snow_depth_icon else 0.0 melt = rain_icon[i] * 0.3 # Scioglimento proporzionale alla pioggia snow_depth_icon.append(max(0.0, prev_depth - melt)) else: # Scioglimento completo snow_depth_icon.append(0.0) # Costruisci struttura dati come da Open-Meteo data_arome = { "hourly": { "time": times, "snowfall": snowfall_arome, "rain": rain_arome } } data_icon = { "hourly": { "time": times, "snowfall": snowfall_icon, "rain": rain_icon, "snow_depth": snow_depth_icon # Giร  in cm (mock) } } return data_arome, data_icon def main(): print("Generazione dati mock...") data_arome, data_icon = create_mock_data() print(f"Dati generati:") print(f" - AROME: {len(data_arome['hourly']['time'])} ore") print(f" - ICON: {len(data_icon['hourly']['time'])} ore") print(f" - Snow depth max: {max(data_icon['hourly']['snow_depth']):.1f} cm") print(f" - Snowfall AROME max: {max(data_arome['hourly']['snowfall']):.1f} cm/h") print(f" - Snowfall ICON max: {max(data_icon['hourly']['snowfall']):.1f} cm/h") # Percorso output output_path = "/tmp/snow_chart_test.png" print(f"\nGenerazione grafico in {output_path}...") success = generate_snow_chart_image( data_arome, data_icon, output_path, location_name="๐Ÿ  Casa (Test Mock)" ) if success: print(f"โœ… Grafico generato con successo!") print(f" File: {output_path}") print(f" Dimensione: {os.path.getsize(output_path) / 1024:.1f} KB") # Invio via Telegram print(f"\nInvio via Telegram a {len(TELEGRAM_CHAT_IDS)} chat(s)...") caption = "๐Ÿ“Š TEST Grafico Precipitazioni 48h\n๐Ÿ  Casa (Test Mock)\n\nGrafico di test con dati mock per verificare la visualizzazione." photo_ok = telegram_send_photo(output_path, caption, chat_ids=[TELEGRAM_CHAT_IDS[0]]) # Solo al primo chat ID per test if photo_ok: print(f"โœ… Grafico inviato con successo su Telegram!") else: print(f"โŒ Errore nell'invio su Telegram (verifica token)") # Mantieni il file per visualizzazione locale print(f"\n๐Ÿ’ก File disponibile anche localmente: {output_path}") else: print("โŒ Errore nella generazione del grafico") return 1 return 0 if __name__ == "__main__": sys.exit(main())