165 lines
5.7 KiB
Python
165 lines
5.7 KiB
Python
#!/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 = "📊 <b>TEST Grafico Precipitazioni 48h</b>\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())
|