From c94aad38a70e20e37b733e5c61df5650d1d8d48a Mon Sep 17 00:00:00 2001 From: daniele Date: Fri, 26 Dec 2025 15:02:24 +0100 Subject: [PATCH] Sync Loogle Bot 2025-12-26 15:02 --- services/telegram-bot/daily_report.py | 132 +++++---- services/telegram-bot/dpc_log.txt | 84 ++++++ services/telegram-bot/freeze_log.txt | 111 ++++++++ services/telegram-bot/net_quality.py | 119 +++++++++ services/telegram-bot/quality_log.txt | 144 ++++++++++ services/telegram-bot/snow_log.txt | 370 ++++++++++++++++++++++++++ services/telegram-bot/student_log.txt | 182 +++++++++++++ 7 files changed, 1096 insertions(+), 46 deletions(-) create mode 100644 services/telegram-bot/dpc_log.txt create mode 100644 services/telegram-bot/freeze_log.txt create mode 100644 services/telegram-bot/net_quality.py create mode 100644 services/telegram-bot/quality_log.txt create mode 100644 services/telegram-bot/snow_log.txt create mode 100644 services/telegram-bot/student_log.txt diff --git a/services/telegram-bot/daily_report.py b/services/telegram-bot/daily_report.py index 56ba320..61a4dcc 100644 --- a/services/telegram-bot/daily_report.py +++ b/services/telegram-bot/daily_report.py @@ -11,7 +11,7 @@ import subprocess import tempfile import time from logging.handlers import RotatingFileHandler -from typing import Optional +from typing import Optional, List, Tuple DEBUG = os.environ.get("DEBUG", "0").strip() == "1" @@ -38,8 +38,14 @@ CONTAINER_DB_PATH = (os.environ.get("SPEEDTEST_CONTAINER_DB_PATH") or "/config/d WARN_DOWN = 400 WARN_UP = 100 +# Unità download/upload nel DB: +# - default: byte/s => Mbps = (val*8)/1e6 +# - se già bit/s: SPEEDTEST_VALUES_ARE_BITS=1 VALUES_ARE_BITS = os.environ.get("SPEEDTEST_VALUES_ARE_BITS", "0").strip() == "1" +# Quante righe recenti leggere dal DB (poi filtriamo in Python sulle ultime 24h) +MAX_ROWS = int(os.environ.get("SPEEDTEST_MAX_ROWS", "2000").strip()) + def setup_logger() -> logging.Logger: logger = logging.getLogger("daily_report") @@ -127,22 +133,39 @@ def _to_mbps(val) -> float: return (v * 8.0) / 1_000_000.0 -def _parse_created_at_utc(created_at) -> datetime.datetime: - if isinstance(created_at, datetime.datetime): - dt = created_at - else: - s = str(created_at).replace("Z", "+00:00") - try: - dt = datetime.datetime.fromisoformat(s) - except Exception: - s2 = s.split(".")[0].replace("T", " ") - dt = datetime.datetime.strptime(s2, "%Y-%m-%d %H:%M:%S") +def _parse_created_at_utc(created_at) -> Optional[datetime.datetime]: + """ + Robust parsing: + - ISO con Z / offset + - "YYYY-MM-DD HH:MM:SS[.ms]" (assumiamo UTC se naive, perché spesso il DB è UTC) + """ + try: + if isinstance(created_at, datetime.datetime): + dt = created_at + else: + s = str(created_at).strip() + if not s: + return None - if dt.tzinfo is None: - dt = dt.replace(tzinfo=datetime.timezone.utc) - else: - dt = dt.astimezone(datetime.timezone.utc) - return dt + # normalizza Z + s = s.replace("Z", "+00:00") + + # prova ISO (anche con T) + try: + dt = datetime.datetime.fromisoformat(s) + except Exception: + # fallback: "YYYY-MM-DD HH:MM:SS(.ms)" + s2 = s.split(".")[0].replace("T", " ") + dt = datetime.datetime.strptime(s2, "%Y-%m-%d %H:%M:%S") + + if dt.tzinfo is None: + # assumi UTC se naive + dt = dt.replace(tzinfo=datetime.timezone.utc) + else: + dt = dt.astimezone(datetime.timezone.utc) + return dt + except Exception: + return None def find_local_db_path() -> str: @@ -186,20 +209,22 @@ def docker_copy_db_to_temp() -> str: def generate_report(db_path: str) -> Optional[str]: now_utc = datetime.datetime.now(datetime.timezone.utc) window_start_utc = now_utc - datetime.timedelta(hours=24) - window_start_str = window_start_utc.isoformat(timespec="seconds") try: conn = sqlite3.connect(db_path) cursor = conn.cursor() + + # NOTA: non filtriamo su created_at (string compare fragile). + # Prendiamo le ultime MAX_ROWS righe completate e filtriamo in Python. query = """ SELECT download, upload, ping, created_at FROM results - WHERE created_at >= ? - AND status = 'completed' - ORDER BY created_at ASC + WHERE status = 'completed' + ORDER BY created_at DESC + LIMIT ? """ - cursor.execute(query, (window_start_str,)) - rows = cursor.fetchall() + cursor.execute(query, (MAX_ROWS,)) + raw_rows = cursor.fetchall() except Exception as e: LOGGER.exception("Errore DB (%s): %s", db_path, e) return None @@ -209,8 +234,37 @@ def generate_report(db_path: str) -> Optional[str]: except Exception: pass + if not raw_rows: + LOGGER.info("Nessun test trovato.") + return None + + # Filtra realmente per datetime (ultime 24h) e ordina crescente + rows: List[Tuple[datetime.datetime, float, float, float]] = [] + for d_raw, u_raw, ping_raw, created_at in raw_rows: + dt_utc = _parse_created_at_utc(created_at) + if not dt_utc: + continue + if dt_utc < window_start_utc or dt_utc > now_utc: + continue + + d_mbps = _to_mbps(d_raw) + u_mbps = _to_mbps(u_raw) + try: + ping_ms = float(ping_raw) + except Exception: + ping_ms = 0.0 + + rows.append((dt_utc, d_mbps, u_mbps, ping_ms)) + + rows.sort(key=lambda x: x[0]) + + LOGGER.debug("DB rows read=%s filtered_24h=%s (start=%s now=%s)", + len(raw_rows), len(rows), + window_start_utc.isoformat(timespec="seconds"), + now_utc.isoformat(timespec="seconds")) + if not rows: - LOGGER.info("Nessun test trovato nelle ultime 24h.") + LOGGER.info("Nessun test nelle ultime 24h dopo filtro datetime.") return None header = "ORA | Dn | Up | Pg |!" @@ -228,14 +282,7 @@ def generate_report(db_path: str) -> Optional[str]: msg += header + "\n" msg += sep + "\n" - for d_raw, u_raw, ping_raw, created_at in rows: - d_mbps = _to_mbps(d_raw) - u_mbps = _to_mbps(u_raw) - try: - ping_ms = float(ping_raw) - except Exception: - ping_ms = 0.0 - + for dt_utc, d_mbps, u_mbps, ping_ms in rows: total_down += d_mbps total_up += u_mbps count += 1 @@ -245,29 +292,22 @@ def generate_report(db_path: str) -> Optional[str]: issues += 1 flag = "!" - try: - dt_utc = _parse_created_at_utc(created_at) - dt_local = dt_utc.astimezone() - time_str = dt_local.strftime("%H:%M") - except Exception: - time_str = "--:--" + time_str = dt_utc.astimezone().strftime("%H:%M") msg += f"{time_str:<5}|{int(round(d_mbps)):>5}|{int(round(u_mbps)):>5}|{int(round(ping_ms)):>4}|{flag}\n" msg += "```\n" - if count > 0: - avg_d = total_down / count - avg_u = total_up / count + avg_d = total_down / count + avg_u = total_up / count - icon_d = "✅" if avg_d >= WARN_DOWN else "⚠️" - icon_u = "✅" if avg_u >= WARN_UP else "⚠️" + icon_d = "✅" if avg_d >= WARN_DOWN else "⚠️" + icon_u = "✅" if avg_u >= WARN_UP else "⚠️" - # Ø al posto di "MEDIA:" per accorciare ed evitare wrap - msg += f"Ø ⬇️{icon_d}`{avg_d:.0f} Mbps` ⬆️{icon_u}`{avg_u:.0f} Mbps`" + msg += f"Ø ⬇️{icon_d}`{avg_d:.0f} Mbps` ⬆️{icon_u}`{avg_u:.0f} Mbps`" - if issues > 0: - msg += f"\n\n⚠️ **{issues}** test sotto soglia (!)" + if issues > 0: + msg += f"\n\n⚠️ **{issues}** test sotto soglia (!)" return msg diff --git a/services/telegram-bot/dpc_log.txt b/services/telegram-bot/dpc_log.txt new file mode 100644 index 0000000..335c3f2 --- /dev/null +++ b/services/telegram-bot/dpc_log.txt @@ -0,0 +1,84 @@ +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json +--- Controllo Protezione Civile --- +Errore DPC: 404 Client Error: Not Found for url: https://raw.githubusercontent.com/pcm-dpc/DPC-Bollettini-Criticita-Idrogeologica-Idraulica/master/files/geojson/today.json diff --git a/services/telegram-bot/freeze_log.txt b/services/telegram-bot/freeze_log.txt new file mode 100644 index 0000000..01fe4e3 --- /dev/null +++ b/services/telegram-bot/freeze_log.txt @@ -0,0 +1,111 @@ +--- Controllo Gelo --- +Nessun gelo. Minima: 4.8°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.7°C +--- Controllo Gelo --- +Nessun gelo. Minima: 5.1°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.8°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.9°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.2°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.5°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.9°C +--- Controllo Gelo --- +Nessun gelo. Minima: 3.7°C +--- Controllo Gelo --- +Nessun gelo. Minima: 2.8°C +--- Controllo Gelo --- +Nessun gelo. Minima: 3.0°C +--- Controllo Gelo --- +Nessun gelo. Minima: 3.9°C +--- Controllo Gelo --- +Nessun gelo. Minima: 3.7°C +--- Controllo Gelo --- +Nessun gelo. Minima: 3.8°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.2°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.4°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.3°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.1°C +--- Controllo Gelo --- +Nessun gelo. Minima: 5.0°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.7°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.8°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.1°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.2°C +--- Controllo Gelo --- +Nessun gelo. Minima: 5.0°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.1°C +--- Controllo Gelo --- +Nessun gelo. Minima: 5.2°C +--- Controllo Gelo --- +Nessun gelo. Minima: 5.2°C +--- Controllo Gelo --- +Nessun gelo. Minima: 5.3°C +--- Controllo Gelo --- +Nessun gelo. Minima: 5.1°C +--- Controllo Gelo --- +Nessun gelo. Minima: 5.7°C +--- Controllo Gelo --- +Nessun gelo. Minima: 5.9°C +--- Controllo Gelo --- +Nessun gelo. Minima: 5.3°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.3°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.8°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.3°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.3°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.5°C +--- Controllo Gelo --- +--- Controllo Gelo --- +Nessun gelo. Minima: 5.9°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.8°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.6°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.5°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.3°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.5°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.2°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.7°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.2°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.5°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.4°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.5°C +--- Controllo Gelo --- +Nessun gelo. Minima: 5.5°C +--- Controllo Gelo --- +Nessun gelo. Minima: 5.2°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.4°C +--- Controllo Gelo --- +Nessun gelo. Minima: 7.0°C +--- Controllo Gelo --- +Nessun gelo. Minima: 6.0°C +--- Controllo Gelo --- +Nessun gelo. Minima: 4.8°C diff --git a/services/telegram-bot/net_quality.py b/services/telegram-bot/net_quality.py new file mode 100644 index 0000000..94b0223 --- /dev/null +++ b/services/telegram-bot/net_quality.py @@ -0,0 +1,119 @@ +import subprocess +import re +import os +import json +import time +import urllib.request +import urllib.parse + +# --- CONFIGURAZIONE --- +BOT_TOKEN="8155587974:AAF9OekvBpixtk8ZH6KoIc0L8edbhdXt7A4" +CHAT_ID="64463169" + +# BERSAGLIO (Cloudflare è solitamente il più stabile per i ping) +TARGET_HOST = "1.1.1.1" + +# SOGLIE DI ALLARME +LIMIT_LOSS = 5.0 # % di pacchetti persi (sopra il 5% è grave) +LIMIT_JITTER = 30.0 # ms di deviazione (sopra 30ms lagga la voce/gioco) + +# File di stato +STATE_FILE = "/home/daniely/docker/telegram-bot/quality_state.json" + +def send_telegram(msg): + if "INSERISCI" in TELEGRAM_BOT_TOKEN: return + url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage" + for chat_id in TELEGRAM_CHAT_IDS: + try: + payload = {"chat_id": chat_id, "text": msg, "parse_mode": "Markdown"} + data = urllib.parse.urlencode(payload).encode('utf-8') + req = urllib.request.Request(url, data=data) + with urllib.request.urlopen(req) as r: pass + time.sleep(0.2) + except: pass + +def load_state(): + if os.path.exists(STATE_FILE): + try: + with open(STATE_FILE, 'r') as f: return json.load(f) + except: pass + return {"alert_active": False} + +def save_state(active): + try: + with open(STATE_FILE, 'w') as f: json.dump({"alert_active": active}, f) + except: pass + +def measure_quality(): + print("--- Avvio Test Qualità Linea ---") + + # Esegue 50 ping rapidi (0.2s intervallo) + # -q: quiet (solo riepilogo finale) + # -c 50: conta 50 pacchetti + # -i 0.2: intervallo rapido + # -w 15: timeout massimo 15 secondi + cmd = f"ping -c 50 -i 0.2 -q -w 15 {TARGET_HOST}" + + try: + output = subprocess.check_output(cmd, shell=True).decode('utf-8') + except subprocess.CalledProcessError as e: + # Se ping fallisce completamente (es. internet down), catturiamo l'output comunque se c'è + output = e.output.decode('utf-8') if e.output else "" + if not output: + print("Errore critico: Nessuna connessione.") + return + + # Parsing Packet Loss + # Cerca pattern: "X% packet loss" + loss_match = re.search(r'(\d+)% packet loss', output) + loss = int(loss_match.group(1)) if loss_match else 100 + + # Parsing Jitter (mdev) + # Output tipico: rtt min/avg/max/mdev = 10.1/12.5/40.2/5.1 ms + # mdev è la 4a cifra + jitter = 0.0 + rtt_match = re.search(r'rtt min/avg/max/mdev = ([\d\.]+)/([\d\.]+)/([\d\.]+)/([\d\.]+)', output) + + if rtt_match: + avg_ping = float(rtt_match.group(2)) + jitter = float(rtt_match.group(4)) + else: + avg_ping = 0.0 + + print(f"Risultati: Loss={loss}% | Jitter={jitter}ms | AvgPing={avg_ping}ms") + + # --- LOGICA ALLARME --- + state = load_state() + was_active = state.get("alert_active", False) + + is_bad = (loss >= LIMIT_LOSS) or (jitter >= LIMIT_JITTER) + + if is_bad: + if not was_active: + # NUOVO ALLARME + msg = f"📉 **DEGRADO QUALITÀ LINEA**\n\n" + if loss >= LIMIT_LOSS: + msg += f"🔴 **Packet Loss:** `{loss}%` (Soglia {LIMIT_LOSS}%)\n" + if jitter >= LIMIT_JITTER: + msg += f"⚠️ **Jitter (Instabilità):** `{jitter}ms` (Soglia {LIMIT_JITTER}ms)\n" + + msg += f"\n_Ping Medio: {avg_ping}ms_" + send_telegram(msg) + save_state(True) + print("Allarme inviato.") + else: + print("Qualità ancora scarsa (già notificato).") + + elif was_active and not is_bad: + # RECOVERY + msg = f"✅ **QUALITÀ LINEA RIPRISTINATA**\n\n" + msg += f"I parametri sono rientrati nella norma.\n" + msg += f"Ping: `{avg_ping}ms` | Jitter: `{jitter}ms` | Loss: `{loss}%`" + send_telegram(msg) + save_state(False) + print("Recovery inviata.") + else: + print("Linea OK.") + +if __name__ == "__main__": + measure_quality() diff --git a/services/telegram-bot/quality_log.txt b/services/telegram-bot/quality_log.txt new file mode 100644 index 0000000..8aaa492 --- /dev/null +++ b/services/telegram-bot/quality_log.txt @@ -0,0 +1,144 @@ +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=12.687ms | AvgPing=19.192ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.493ms | AvgPing=9.06ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.519ms | AvgPing=9.025ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.162ms | AvgPing=9.233ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=12.028ms | AvgPing=19.646ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.211ms | AvgPing=9.209ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.356ms | AvgPing=9.197ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.354ms | AvgPing=9.186ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=8.078ms | AvgPing=12.949ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.23ms | AvgPing=9.206ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.207ms | AvgPing=9.209ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.227ms | AvgPing=9.205ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=11.425ms | AvgPing=17.953ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.358ms | AvgPing=9.125ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.175ms | AvgPing=9.22ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.367ms | AvgPing=9.138ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=10.52ms | AvgPing=15.462ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.292ms | AvgPing=9.195ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.286ms | AvgPing=9.224ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.253ms | AvgPing=9.19ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=10.33ms | AvgPing=15.269ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.391ms | AvgPing=9.183ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.201ms | AvgPing=9.239ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.224ms | AvgPing=9.186ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=11.447ms | AvgPing=17.307ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.303ms | AvgPing=9.212ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.302ms | AvgPing=9.225ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.295ms | AvgPing=9.147ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=11.598ms | AvgPing=17.61ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.221ms | AvgPing=9.234ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.212ms | AvgPing=9.219ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.277ms | AvgPing=9.186ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=11.891ms | AvgPing=18.959ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.195ms | AvgPing=9.22ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.541ms | AvgPing=9.011ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.449ms | AvgPing=9.132ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=10.053ms | AvgPing=15.767ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.513ms | AvgPing=9.008ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.295ms | AvgPing=9.196ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.351ms | AvgPing=9.208ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=12.356ms | AvgPing=19.349ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.238ms | AvgPing=9.219ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.486ms | AvgPing=9.251ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=0.293ms | AvgPing=9.174ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=2.634ms | AvgPing=10.486ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=3.088ms | AvgPing=10.236ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=1.246ms | AvgPing=9.522ms +Linea OK. +--- Avvio Test Qualità Linea --- +Risultati: Loss=0% | Jitter=2.186ms | AvgPing=9.577ms +Linea OK. diff --git a/services/telegram-bot/snow_log.txt b/services/telegram-bot/snow_log.txt new file mode 100644 index 0000000..cc18f58 --- /dev/null +++ b/services/telegram-bot/snow_log.txt @@ -0,0 +1,370 @@ +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area Max: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area Max: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area Max: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area Max: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area Max: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area Max: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area Max: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area Max: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area Max: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area Max: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0.0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0.0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0.0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 21:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 00:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 03:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 06:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 09:00 --- +Nessuna neve. Casa: 0.0cm, Area: 0.0cm +--- Check Meteo 12:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 15:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm +--- Check Meteo 18:00 --- +Nessuna neve. Casa: 0cm, Area: 0.0cm diff --git a/services/telegram-bot/student_log.txt b/services/telegram-bot/student_log.txt new file mode 100644 index 0000000..7ef5301 --- /dev/null +++ b/services/telegram-bot/student_log.txt @@ -0,0 +1,182 @@ +--- Analisi Studente Bologna --- +Bologna tranquilla. Nessun report. +--- Analisi Studente Bologna --- +Bologna tranquilla. Nessun report. +--- Analisi Studente Bologna --- +Bologna tranquilla. Nessun report. +--- Analisi Studente Bologna --- +Bologna tranquilla. Nessun report. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta. +--- Analisi Studente Bologna --- +Nessuna allerta.