// --------------------------------------------------------------------------------------------------------------------- // Configurazione fatta al 90% con ChatGPT // --------------------------------------------------------------------------------------------------------------------- // Variabili per tenere traccia dello stato dell'antifurto e dell'ingresso digitale var antifurto = "off"; // Inizialmente impostato su off var inputState = false; // Stato corrente dell'ingresso digitale var lastInputState = false; // Ultimo stato dell'ingresso digitale var relayActive = false; // Stato del relè var relayTimer = null; // Timer per gestire l'attivazione del relè var wasInputJustOpened = false; // Flag per tracciare la transizione da false a true // Timeout per il relè in millisecondi (30 secondi) var relayTimeout = 30000; // Configurazione dei dettagli del bot Telegram let telegramBotToken = "123456789:ABCDEF_fakeTokenForExample"; let chatId = "123456789"; // Funzione per inviare un messaggio su Telegram function sendTelegramMessage(message) { print("Invio del messaggio Telegram: " + message); // Debug let url = "https://api.telegram.org/bot" + telegramBotToken + "/sendMessage"; let data = { chat_id: chatId, text: message }; Shelly.call("HTTP.POST", { url: url, body: JSON.stringify(data), headers: { "Content-Type": "application/json" } }, function(response, error_code, error_message) { if (error_code === 0) { print("Messaggio inviato con successo: " + response); // Debug } else { print("Errore nell'invio del messaggio: " + error_message); // Debug print("Codice errore: " + error_code); // Debug print("Risposta: " + response); // Debug } }); } // Funzione per attivare il relè e gestire il timer function activateRelay() { if (!relayActive) { // Attiva il relè Shelly.call("Switch.Set", { id: 0, on: true }); relayActive = true; print("Relay attivato"); // Invia un messaggio Telegram sendTelegramMessage("🚨 ATTENZIONE ALLARME IN CORSO 🚨"); // Imposta un timer per disattivare il relè dopo il timeout relayTimer = Timer.set(relayTimeout, false, function() { Shelly.call("Switch.Set", { id: 0, on: false }); relayActive = false; relayTimer = null; // Resetta il timer print("Relay disattivato dopo " + relayTimeout + "ms"); // Invia un messaggio Telegram sendTelegramMessage("🟡 Sirena disattivata dopo " + relayTimeout + "ms."); }); } } // Funzione per gestire il cambiamento di stato del relè function updateRelayState() { print("Verifica condizioni: antifurto=" + antifurto + ", inputState=" + inputState + ", lastInputState=" + lastInputState + ", relayActive=" + relayActive); if (antifurto === "on" && inputState === true && lastInputState === false && wasInputJustOpened) { // Se il relè non è già attivo e c'è stata una transizione dell'ingresso da false a true, attiva il relè activateRelay(); wasInputJustOpened = false; // Resetta il flag } else if (antifurto === "off") { // Se l'antifurto è off, disattiva il relè e cancella il timer if (relayActive) { Shelly.call("Switch.Set", { id: 0, on: false }); relayActive = false; if (relayTimer !== null) { Timer.clear(relayTimer); relayTimer = null; } print("Sirena/Relay disattivato immediatamente"); // Invia un messaggio Telegram sendTelegramMessage("Antifurto disarmato."); } } } // Funzione per gestire il cambiamento di stato dell'antifurto function handleAntifurtoChange() { print("Stato dell'antifurto cambiato: " + antifurto); updateRelayState(); // Invia un messaggio Telegram in base allo stato dell'antifurto if (antifurto === "on") { sendTelegramMessage("⛔ Antifurto armato​"); } else if (antifurto === "off") { sendTelegramMessage("🟢 Antifurto disarmato​"); } } // Funzione per gestire il cambiamento di stato dell'ingresso digitale principale function handleInputChange(event) { lastInputState = inputState; inputState = event.info.state; print("Stato dell'ingresso digitale principale cambiato: " + inputState); if (lastInputState === false && inputState === true) { wasInputJustOpened = true; // Rileva che l'ingresso è passato da false a true } updateRelayState(); } // Funzione per inviare il messaggio di avvio e poi eseguire il controllo dell'antifurto function onStartup() { let startupMessage = "👍🏻​ Sistema Antifurto avviato"; sendTelegramMessage(startupMessage); // Ritardo per assicurarsi che il messaggio di avvio sia inviato prima del controllo dello stato dell'antifurto Timer.set(1000, false, function() { handleAntifurtoChange(); }); } // Esegui la funzione all'avvio onStartup(); // Registra un listener per i cambiamenti di stato dell'ingresso digitale principale Shelly.addEventHandler(function(event, user_data) { if (event.component === "input:0") { print("Evento ricevuto: " + JSON.stringify(event)); handleInputChange(event); } }, null); // Gestore della richiesta HTTP POST function setAntifurtoHandler(request, response) { try { var requestBody = JSON.parse(request.body); var value = requestBody.value; if (value === "on" || value === "off") { antifurto = value; handleAntifurtoChange(); response.code = 200; response.body = JSON.stringify({ status: "success", antifurto: antifurto }); print("Richiesta riuscita: antifurto impostato su " + antifurto); response.send(); } else { throw new Error("Valore non valido: deve essere 'on' o 'off'"); } } catch (error) { response.code = 400; response.body = JSON.stringify({ status: "error", message: error.message }); print("Errore nella richiesta: " + error.message); response.send(); } } // Registra l'endpoint HTTP HTTPServer.registerEndpoint("set_antifurto", setAntifurtoHandler);