Backup automatico script del 2026-07-12 07:00

This commit is contained in:
2026-07-12 07:00:03 +02:00
parent b5a2a814e2
commit 927f0d4184
18 changed files with 2365 additions and 422 deletions
+88
View File
@@ -21,6 +21,7 @@ from __future__ import annotations
import argparse
import glob
import json
import logging
import os
import sys
@@ -692,6 +693,85 @@ def telegram_send_message(text: str, chat_id: str) -> bool:
return False
def build_fotovoltaico_json(
lat: float = HOME_LAT,
lon: float = HOME_LON,
maps_dir: Optional[str] = None,
) -> Dict[str, Any]:
"""Analisi completa per WebApp (senza Telegram)."""
now = datetime.now(TZINFO)
payload: Dict[str, Any] = {
"updated_at": now.strftime("%d/%m/%Y %H:%M"),
"plant": {
"kwp": round(P_PEAK_TOTAL_W / 1000, 2),
"inverter_kw": INVERTER_KW,
"panels": NUM_PANELS,
},
"maps": {"past": None, "future": None},
"past_days": [],
"future_days": [],
"models": [],
"has_real": False,
}
solaredge_api_key, solaredge_site_id = load_solaredge_config()
real_48h: Optional[Tuple[List[datetime], List[float]]] = None
if solaredge_api_key and solaredge_site_id:
real_48h = fetch_solaredge_energy_48h(solaredge_api_key, solaredge_site_id)
payload["has_real"] = bool(real_48h)
hist = fetch_historical_48h(lat, lon)
if hist:
times_past, _, power_past = hist
past_days = kwh_per_day_from_series(times_past, power_past)
real_by_date: Dict[str, float] = {}
if real_48h:
real_days = kwh_per_day_from_series(
[t.isoformat() for t in real_48h[0]],
real_48h[1],
)
real_by_date = {d: k for d, k in real_days}
for label, kwh in past_days:
row: Dict[str, Any] = {"date": label, "forecast_kwh": kwh}
if label in real_by_date:
row["real_kwh"] = real_by_date[label]
payload["past_days"].append(row)
if maps_dir:
os.makedirs(maps_dir, exist_ok=True)
rt, rp = (real_48h[0], real_48h[1]) if real_48h else (None, None)
img_past = plot_past_48h(times_past, power_past, real_times=rt, real_power_kw=rp)
with open(os.path.join(maps_dir, "fotovoltaico_past.png"), "wb") as f:
f.write(img_past)
payload["maps"]["past"] = "past"
fore_multi = fetch_forecast_72h_multi(lat, lon)
if fore_multi:
times_fut, power_series = fore_multi
payload["models"] = [s[0] for s in power_series]
fut_days_per_model = [
(name, kwh_per_day_from_series(times_fut, power_list))
for name, power_list in power_series
]
dates = sorted({d for _, days_list in fut_days_per_model for d, _ in days_list})
for d in dates:
row = {"date": d, "models": []}
for name, days_list in fut_days_per_model:
val = next((k for lbl, k in days_list if lbl == d), None)
if val is not None:
row["models"].append({"name": name, "kwh": val})
payload["future_days"].append(row)
if maps_dir:
os.makedirs(maps_dir, exist_ok=True)
img_fut = plot_future_72h(times_fut, power_series)
with open(os.path.join(maps_dir, "fotovoltaico_future.png"), "wb") as f:
f.write(img_fut)
payload["maps"]["future"] = "future"
if not payload["past_days"] and not payload["future_days"]:
payload["error"] = "Nessun dato disponibile"
return payload
def main() -> int:
parser = argparse.ArgumentParser(description="Previsione e analisi produzione fotovoltaico (ICON Italia)")
parser.add_argument("--lat", type=float, default=HOME_LAT, help="Latitudine")
@@ -700,7 +780,15 @@ def main() -> int:
parser.add_argument("--chat_id", type=str, default="", help="Chat ID per invio Telegram")
parser.add_argument("--no-past", action="store_true", help="Salta grafico 48h passate")
parser.add_argument("--no-future", action="store_true", help="Salta grafico 72h future")
parser.add_argument("--json", action="store_true", help="Output JSON per WebApp (no Telegram)")
parser.add_argument("--maps-dir", type=str, default="", help="Directory per salvare grafici PNG (con --json)")
args = parser.parse_args()
if args.json:
maps_dir = args.maps_dir.strip() or None
print(json.dumps(build_fotovoltaico_json(args.lat, args.lon, maps_dir=maps_dir), ensure_ascii=False))
return 0
lat, lon = args.lat, args.lon
send_telegram = args.telegram and args.chat_id.strip()