From 4d5119ab5a5923f8e8bfd94285f0b7092d1b7527 Mon Sep 17 00:00:00 2001 From: Nick Date: Sun, 8 Feb 2026 20:22:50 +0100 Subject: [PATCH] add service auto discovery --- .tf5_mixer_cache/mixer_ip.json | 4 + __pycache__/config.cpython-312.pyc | Bin 458 -> 11145 bytes config.py | 249 ++++++++++++++++++++++++++++- conversations/4762864.json | 52 +++--- telegram_bot.py | 2 +- 5 files changed, 275 insertions(+), 32 deletions(-) create mode 100644 .tf5_mixer_cache/mixer_ip.json diff --git a/.tf5_mixer_cache/mixer_ip.json b/.tf5_mixer_cache/mixer_ip.json new file mode 100644 index 0000000..26fd4e5 --- /dev/null +++ b/.tf5_mixer_cache/mixer_ip.json @@ -0,0 +1,4 @@ +{ + "ip": "192.168.1.57", + "timestamp": 1770578444.177839 +} \ No newline at end of file diff --git a/__pycache__/config.cpython-312.pyc b/__pycache__/config.cpython-312.pyc index 86e287c1abc3c0612954b9c409bcb25d444f933c..aa1bf7b782f15ae5cf11ad2836df117b6728ee5a 100644 GIT binary patch literal 11145 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 str: + """Ottiene la rete locale del sistema""" + log("Rilevamento rete locale in corso...", "NETWORK") + try: + # Crea un socket per ottenere l'IP locale + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.connect(("8.8.8.8", 80)) + local_ip = s.getsockname()[0] + s.close() + + # Converte in network (es: 192.168.1.0/24) + ip_parts = local_ip.split('.') + network = f"{ip_parts[0]}.{ip_parts[1]}.{ip_parts[2]}.0/24" + + log(f"IP locale rilevato: {local_ip}", "INFO") + log(f"Rete da scansionare: {network}", "NETWORK") + return network + except Exception as e: + log(f"Errore nel rilevare la rete locale: {e}", "ERROR") + network = "192.168.1.0/24" + log(f"Uso rete di fallback: {network}", "WARNING") + return network + +def check_port(ip: str, port: int, timeout: float = 0.5) -> bool: + """Controlla se una porta è aperta su un IP""" + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(timeout) + result = sock.connect_ex((ip, port)) + sock.close() + return result == 0 + except Exception as e: + # Log solo per debug, commentabile se troppo verbose + # log(f"Errore su {ip}: {e}", "ERROR") + return False + +def scan_network_for_mixer(port: int = DEFAULT_PORT, max_workers: int = 50) -> Optional[str]: + """Scansiona la rete locale per trovare il mixer""" + log(f"Ricerca mixer sulla porta {port}...", "SEARCH") + start_time = time.time() + + network = get_local_network() + + # Genera lista di IP da scansionare + ip_network = ipaddress.ip_network(network, strict=False) + total_hosts = sum(1 for _ in ip_network.hosts()) + log(f"Indirizzi da scansionare: {total_hosts}", "INFO") + log(f"Thread paralleli: {max_workers}", "INFO") + + found_ip = None + scanned = 0 + + # Scansione parallela per velocità + with ThreadPoolExecutor(max_workers=max_workers) as executor: + future_to_ip = { + executor.submit(check_port, str(ip), port): str(ip) + for ip in ip_network.hosts() + } + + log("Scansione in corso...", "SEARCH") + + for future in as_completed(future_to_ip): + ip = future_to_ip[future] + scanned += 1 + + # Log di progresso ogni 50 IP + if scanned % 50 == 0: + log(f"Progresso: {scanned}/{total_hosts} IP scansionati", "INFO") + + try: + if future.result(): + found_ip = ip + elapsed = time.time() - start_time + log(f"MIXER TROVATO su {ip}:{port}", "SUCCESS") + log(f"Tempo di scansione: {elapsed:.2f}s", "TIME") + log(f"IP scansionati: {scanned}/{total_hosts}", "INFO") + # Cancella i task rimanenti + executor.shutdown(wait=False, cancel_futures=True) + break + except Exception as e: + log(f"Errore durante scansione di {ip}: {e}", "ERROR") + + if not found_ip: + elapsed = time.time() - start_time + log(f"Nessun mixer trovato sulla porta {port}", "ERROR") + log(f"Tempo totale di scansione: {elapsed:.2f}s", "TIME") + log(f"IP scansionati: {scanned}/{total_hosts}", "INFO") + + return found_ip + +def load_cached_ip() -> Optional[str]: + """Carica l'IP dalla cache se valido""" + log("Controllo cache IP...", "CACHE") + + if not IP_CACHE_FILE.exists(): + log("Nessuna cache trovata", "INFO") + return None + + try: + with open(IP_CACHE_FILE, 'r') as f: + data = json.load(f) + + cached_ip = data.get('ip') + cache_time = data.get('timestamp', 0) + age = time.time() - cache_time + + log(f"Cache trovata: {cached_ip} (età: {int(age)}s)", "CACHE") + + # Controlla se la cache è ancora valida + if age < IP_CACHE_DURATION: + log(f"Verifica raggiungibilità di {cached_ip}...", "CACHE") + # Verifica che l'IP sia ancora valido + if cached_ip and check_port(cached_ip, DEFAULT_PORT, timeout=1.0): + log(f"IP dalla cache valido: {cached_ip}", "SUCCESS") + return cached_ip + else: + log(f"IP dalla cache non raggiungibile", "WARNING") + else: + log(f"Cache scaduta (max {IP_CACHE_DURATION}s)", "WARNING") + except Exception as e: + log(f"Errore nel leggere cache IP: {e}", "ERROR") + + return None + +def save_ip_to_cache(ip: str): + """Salva l'IP nella cache""" + log(f"Salvataggio IP in cache: {ip}", "CACHE") + CACHE_DIR.mkdir(exist_ok=True) + + try: + with open(IP_CACHE_FILE, 'w') as f: + json.dump({ + 'ip': ip, + 'timestamp': time.time() + }, f, indent=2) + log(f"Cache salvata: {IP_CACHE_FILE}", "SUCCESS") + except Exception as e: + log(f"Errore nel salvare cache IP: {e}", "ERROR") + +def get_mixer_ip() -> str: + """ + Ottiene l'IP del mixer con auto-discovery: + 1. Controlla cache + 2. Scansiona la rete + 3. Fallback su IP predefinito + """ + log("=== INIZIO RICERCA MIXER ===", "INFO") + + # Prova con la cache + cached_ip = load_cached_ip() + if cached_ip: + log("=== RICERCA COMPLETATA (CACHE) ===", "SUCCESS") + return cached_ip + + # Scansiona la rete + log("Avvio scansione di rete...", "SEARCH") + discovered_ip = scan_network_for_mixer() + if discovered_ip: + save_ip_to_cache(discovered_ip) + log("=== RICERCA COMPLETATA (DISCOVERY) ===", "SUCCESS") + return discovered_ip + + # Fallback + fallback_ip = "192.168.1.57" + log(f"Uso IP predefinito di fallback: {fallback_ip}", "WARNING") + log("=== RICERCA COMPLETATA (FALLBACK) ===", "WARNING") + return fallback_ip + +# Variabile globale per l'host (si aggiorna automaticamente) +DEFAULT_HOST = None + +def get_host() -> str: + """Ottiene l'host del mixer (con lazy loading)""" + global DEFAULT_HOST + if DEFAULT_HOST is None: + log("Host mixer non inizializzato, avvio discovery...", "INFO") + DEFAULT_HOST = get_mixer_ip() + else: + log(f"Host mixer già inizializzato: {DEFAULT_HOST}", "INFO") + return DEFAULT_HOST + +def refresh_mixer_ip(): + """Forza un refresh dell'IP del mixer""" + global DEFAULT_HOST + log("=== REFRESH FORZATO IP MIXER ===", "INFO") + log("Cancellazione cache esistente...", "CACHE") + + # Rimuovi cache + if IP_CACHE_FILE.exists(): + try: + IP_CACHE_FILE.unlink() + log("Cache rimossa", "SUCCESS") + except Exception as e: + log(f"Errore rimozione cache: {e}", "ERROR") + + # Nuova scansione + DEFAULT_HOST = scan_network_for_mixer() + if DEFAULT_HOST: + save_ip_to_cache(DEFAULT_HOST) + log(f"Nuovo IP impostato: {DEFAULT_HOST}", "SUCCESS") + else: + log("Refresh fallito, mantengo IP precedente", "ERROR") + + log("=== REFRESH COMPLETATO ===", "INFO") + return DEFAULT_HOST + +# Test rapido +if __name__ == "__main__": + log("=== TEST AUTO-DISCOVERY MIXER ===", "INFO") + host = get_host() + log(f"Host finale: {host}", "SUCCESS") + + # Test refresh + # log("\n=== TEST REFRESH ===", "INFO") + # refresh_mixer_ip() \ No newline at end of file diff --git a/conversations/4762864.json b/conversations/4762864.json index 1decbf6..921c0b0 100644 --- a/conversations/4762864.json +++ b/conversations/4762864.json @@ -1,34 +1,10 @@ { "user_id": 4762864, "username": "unnikked", - "last_updated": 1770577997.6975403, - "last_updated_str": "2026-02-08 19:13:17", + "last_updated": 1770578542.7348943, + "last_updated_str": "2026-02-08 19:22:22", "message_count": 21, "history": [ - { - "role": "user", - "content": "Controlla canali mixer", - "timestamp": 1769455886.9095418, - "timestamp_str": "2026-01-26 19:31:26" - }, - { - "role": "assistant", - "content": "Ok Nicola, ho controllato i canali del mixer! Ecco cosa vedo:\n\n**Canali Attivi e Nominati:**\n* **Gelato (Canale 2):** Acceso, volume a -11.7 dB\n* **Vox1 (Canale 5):** Acceso, volume a 0 dB\n* **Vox2 (Canale 6):** Acceso, volume a 6.3 dB\n* **Basso (Canale 7):** Acceso, volume a -2.15 dB\n* **Kick (Canale 9):** Acceso, volume a -0.35 dB\n* **Snare (Canale 10):** Acceso, volume a -1.6 dB\n* **Tom 1 (Canale 11):** Acceso, volume a -2.8 dB\n* **Tom 2 (Canale 12):** Acceso, volume a -0.8 dB\n* **Tom3 (Canale 13):** Acceso, volume a -3.05 dB\n* **Pan SX (Canale 14):** Acceso, volume a -3.85 dB\n* **Pan dx (Canale 15):** Acceso, volume a -4.3 dB\n* **Archetto (Canale 18):** Acceso, volume a 4.6 dB\n* **Vox 5 (Canale 19):** Acceso, volume a -4.65 dB\n* **Tast (Canale 20):** Acceso, volume a -1.6 dB\n* **Vox3 (Canale 23):** Acceso, volume a 3.05 dB\n* **Chit cnt (Canale 24):** Acceso, volume a -2.35 dB\n* **Chit dx (Canale 25):** Acceso, volume a -0.85 dB\n* **Vox 4 (Canale 27):** Acceso, volume a -120 dB (ma è acceso, strano, forse un errore o un volume bassissimo)\n* **PC (Canale 33 e 34):** Accesi, volume a -43.2 dB\n\n**Canali Spenti o Sconosciuti:**\n* **Canale 1:** Sconosciuto, spento, volume a 0.65 dB\n* **Talkback (Canale 3):** Spento, volume a -120 dB\n* **Canale 4:** Sconosciuto, spento, volume a -120 dB\n* **Canale 8:** Sconosciuto, spento, volume a -120 dB\n* **Canale 16:** Sconosciuto, spento, volume a -120 dB\n* **Canale 17:** Sconosciuto, spento, volume a -120 dB\n* **Canale 21:** Sconosciuto, spento, volume a -120 dB\n* **Canale 22:** Sconosciuto, spento, volume a -120 dB\n* **Canale 26:** Sconosciuto, spento, volume a -120 dB\n* **Canale 28:** Sconosciuto, spento, volume a -120 dB\n* **Pad (Canale 29):** Spento, volume a -120 dB\n* **Canali dal 30 al 32:** Sconosciuti, spenti, volume a -120 dB\n* **Canali dal 35 al 40:** Nominati \"chXX\", accesi ma con volume a -120 dB (praticamente muti)\n\nSembra che ci siano un bel po' di canali attivi con nomi, il che è un buon segno! Però, alcuni canali sono \"accesi\" ma con il volume a -120 dB, il che significa che non si sentiranno.\n\nFammi sapere se vuoi che faccia qualcosa in particolare! 🎛️🎤", - "timestamp": 1769455894.465047, - "timestamp_str": "2026-01-26 19:31:34" - }, - { - "role": "user", - "content": "Refresh cache", - "timestamp": 1769455900.8138618, - "timestamp_str": "2026-01-26 19:31:40" - }, - { - "role": "assistant", - "content": "✅ Fatto, Nicola! Ho ricaricato tutte le informazioni del mixer. Ora siamo pronti a ripartire con i dati freschi! 🎛️✨", - "timestamp": 1769455904.113328, - "timestamp_str": "2026-01-26 19:31:44" - }, { "role": "user", "content": "Controlla ora", @@ -130,6 +106,30 @@ "content": "Ciao Nicola! Tutto bene? Dimmi pure se hai bisogno di qualcosa con il mixer! 🎛️🎤", "timestamp": 1770577997.697525, "timestamp_str": "2026-02-08 19:13:17" + }, + { + "role": "user", + "content": "Ciao pupo", + "timestamp": 1770578526.691519, + "timestamp_str": "2026-02-08 19:22:06" + }, + { + "role": "assistant", + "content": "Ciao Nicola! Tutto bene? Dimmi pure se hai bisogno di qualcosa con il mixer! 🎛️🎤", + "timestamp": 1770578528.1236699, + "timestamp_str": "2026-02-08 19:22:08" + }, + { + "role": "user", + "content": "Check canali", + "timestamp": 1770578537.6022112, + "timestamp_str": "2026-02-08 19:22:17" + }, + { + "role": "assistant", + "content": "Allora, Nicola, ho controllato tutti i canali! Ecco la situazione attuale:\n\n**Canali Attivi (o con volume udibile):**\n* **PC (Canale 33 e 34):** Accesi, volume a -17.5 dB\n\n**Canali che sono accesi ma con volume bassissimo (-120 dB), quindi praticamente muti:**\n* **Gelato (Canale 2)**\n* **Vox1 (Canale 5)**\n* **Vox2 (Canale 6)**\n* **Basso (Canale 7)**\n* **Kick (Canale 9)**\n* **Snare (Canale 10)**\n* **Tom 1 (Canale 11)**\n* **Tom 2 (Canale 12)**\n* **Tom3 (Canale 13)**\n* **Pan SX (Canale 14)**\n* **Pan dx (Canale 15)**\n* **Vox 5 (Canale 19)**\n* **Tast (Canale 20)**\n* **Vox3 (Canale 23)**\n* **Chit cnt (Canale 24)**\n* **Chit dx (Canale 25)**\n* **Vox 4 (Canale 27)**\n* **ch35 (Canale 35)**\n* **ch36 (Canale 36)**\n* **ch37 (Canale 37)**\n* **ch38 (Canale 38)**\n* **ch39 (Canale 39)**\n* **ch40 (Canale 40)**\n\n**Canali spenti o sconosciuti:**\n* **Canale 1:** Sconosciuto, spento, volume a 0.65 dB\n* **Talkback (Canale 3):** Spento, volume a -60 dB\n* **Canale 4:** Sconosciuto, spento, volume a -120 dB\n* **Canale 8:** Sconosciuto, spento, volume a -120 dB\n* **Canale 16:** Sconosciuto, spento, volume a -120 dB\n* **Canale 17:** Sconosciuto, spento, volume a -120 dB\n* **Archetto (Canale 18):** Spento, volume a -76 dB\n* **Canale 21:** Sconosciuto, spento, volume a -120 dB\n* **Canale 22:** Sconosciuto, spento, volume a -120 dB\n* **Canale 26:** Sconosciuto, spento, volume a -120 dB\n* **Canale 28:** Sconosciuto, spento, volume a -120 dB\n* **Pad (Canale 29):** Spento, volume a -120 dB\n* **Canali dal 30 al 32:** Sconosciuti, spenti, volume a -120 dB\n\nLa cache è stata aggiornata circa 10 minuti fa. Sembra che molti canali siano spenti o con volumi molto bassi. Fammi sapere se vuoi che accenda o alzi qualcosa! 🎛️🎤", + "timestamp": 1770578542.7348733, + "timestamp_str": "2026-02-08 19:22:22" } ] } \ No newline at end of file diff --git a/telegram_bot.py b/telegram_bot.py index cbf28df..c19ca97 100644 --- a/telegram_bot.py +++ b/telegram_bot.py @@ -1083,7 +1083,7 @@ def main(): try: bot = TF5TelegramBot( telegram_token=telegram_token, - mixer_host=args.mixer_host, + mixer_host=get_host(), mixer_port=args.mixer_port, conversations_dir=args.conversations_dir, profiles_dir=args.profiles_dir