Backup automatico script del 2026-07-12 07:00
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user