Backup automatico script del 2026-01-11 07:00
This commit is contained in:
164
services/telegram-bot/test_snow_chart_show.py
Normal file
164
services/telegram-bot/test_snow_chart_show.py
Normal file
@@ -0,0 +1,164 @@
|
||||
#!/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())
|
||||
Reference in New Issue
Block a user