MULTIMEDIA CREATIVE STUDIO ASTI
🚨​ Antifurto Cesarino

🚨​ Antifurto Cesarino 🚨 Io, Shelly e gli Script con ChatGPT

Guida completa all’esperimento

Il mio amico Cesare ha bisogno di un semplice ma efficace antifurto !
Vi mostro come l’ho realizzato utilizzando Shelly 1 Plus con l’aiuto dell’AI 🤖

L’esigenza era semplice, ovvero attivare una sirena per alcuni minuti se il sensore porta si apriva e armare/disarmare dallo smartphone, unica infrastruttura disponibile, la propria rete wifi.

L’ingresso dello shelly viene utilizzato per collegare gli ingressi dei sensori e l’uscita relè per attivare la sirena ovvio !….ma mancava il modo per armare l’antifurto !
Le soluzioni che ad un primo momento sembravano facilmente risolvibili attraverso l’utilizzo delle “Scene” si sono arenate quando ho capito che richiedevano necessariamente il collegamento al cloud proprietario…porcazozza ! e se viene meno il cloud o peggio internet ? (sapete che io vivo con questi incubi 😨​)

Conoscendo poco o nulla degli script Java di Shelly ho deciso di avventurarmici, facendomi aiutare passo dopo passo dall’intelligenza artificiale di ChatGPT.
Tutto parte dall’utilizzo di una variabile locale (antifurto=ON/OFF) che viene modificata da una chiamata http CURL all’indirizzo dello Shelly attraverso lo smartphone con una App (http shortcuts).
ChatGPT, ha generato il codice per ogni cosa che gli chiedevo e passo dopo passo l’antifurto ha preso corpo.

L’appetito viene mangiando e con GPT abbiamo anche inserito le notifiche Telegram che ovviamente non funzionano se non c’è internet ma l’antifurto lavora sempre e comunque anche off-line.

👾​ Spero che questo lavoro vi stimoli a sperimentare utilizzando l’Intelligenza Artificiale in modo Creativo ! io ho imparato molto, e voi ? avete fatto esperimenti fuori dal comune ? postateli che mi piacerebbe leggere le vostre esperienze.

Capitoli:
01:37 L’idea del progetto
02:43 Come ho usato ChatGPT
04:42 Quello che voglio
06:12 Lo schema di collegamento dello Shelly 1 Plus
07:35 Il comando CURL
08:22 Il collegamento elettrico dello Shelly
11:13 Configurazione Shelly da browser
17:42 Gli script Shelly
19:43 Descrizione generale dello script
26:23 Inserimento script nello Shelly
26:47 Installazione e configurazione di “http shortcuts” per android
33:37 Test di funzionamento dell’antifurto
37:00 Attivare la console di debug degli script
39:53 Telegram o non telegram
40:38 Quale sarà l’installazione definitiva
42:20 Possibile evoluzione e aggiunta dell’addon shelly

Quello che segue è il codice che ho inserito come script nello Shelly 1 Plus, copialo cosi come è e personalizzalo eventualmente con il tuo Token di Telegram e la tua Chat ID, oppure lo puoi scaricare qui

// ---------------------------------------------------------------------------------------------------------------------
// Configuration (you can change / adapt here)
// ---------------------------------------------------------------------------------------------------------------------

// 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 (3 secondi)
var relayTimeout = 30000;

// Configurazione dei dettagli del bot Telegram
let telegramBotToken = "INSERISCI_IL_TUO_TOKEN_DEL_BOT";
let chatId = "INSERISCI_IL_TUO_CHAT_ID";

// 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);



Questo invece è il file da importare e personalizzare in “http shortcuts”, applicazione per android che consente di inviare i comandi http CURL al vostro Shelly.

Ricordatevi di modificare l’indirizzo IP mettendo quello dello Shelly e il numero dello script (1 se è l’unico che avete memorizzato)

🛒 🔹 Tutti i componenti che ho utilizzato 🔹 🛒
➡️ Alimentatore Switching Mean Well con uscita caricabatteria 35 W – https://amzn.to/3qLqCeL
➡️ Alimentatore Switching Mean Well con uscita caricabatteria 75 W – https://amzn.to/3Pi81A8
➡️ Batteria 12V 2A – https://amzn.to/45RmIQ6
➡️ Cassetta Gewiss GW44208 – https://amzn.to/3R0Lr0h
➡️ Relè Shelly Plus 1 – https://amzn.to/3qKj3F7
➡️ Piccola Sirena 120dB – https://amzn.to/3ynyp2B o questa https://amzn.to/45GzOjg o questa potente gialla https://amzn.to/3Z0gZVZ
➡️ Sirena con Lampeggiante – https://amzn.to/3YULGf8
➡️ Cavo 18 AWG – https://amzn.to/3YUFZhw
➡️ Terminali Morsettiere rapide – https://amzn.to/4d82B4a
➡️ Contatto magnetico – https://amzn.to/47NakTf
(Come Affiliato Amazon ricevo un guadagno dagli acquisti idonei fatti da qui 🙏🏻​)

👉 Il mio Setup di Home Assistant: https://www.bonetto.cloud/2024/05/13/setup-domotico-di-home-assistant/

🔹 LINK UTILI 🔹
🔗 Ovviamente ChatGPT (https://chatgpt.com/) non è l’unica AI che potete provare ma a mio modesto parere al momento è quella più precisa e prestante per la programmazione.
🔗 Doco ufficiale Shelly Functions – https://shelly-api-docs.shelly.cloud/gen2/0.14/ComponentsAndServices/Shelly/
🔗 Esempi di script Shelly – https://github.com/shelly-tools/shelly-script-examples/blob/main/delayed_on_off.js

👉 Potete trovare l’articolo completo con gli esempi di codice che ho usato nel mio sito qui: https://www.bonetto.cloud

❤️​ Spero vi possano tornare utili, anche solo in parte, le indicazioni che vi ho mostrato anche se non è sempre facile essere completi e precisi.
Se volete potete ricambiare semplicemente condividendo il video nei vostri social, grazie ! ❤️

📧​ ​CONTATTI 📧
Vi ringrazio per tutti i preziosi commenti e suggerimenti che mi scrivete, sono sempre molto graditi e cerco, nel limite del possibile, di rispondervi su YouTube.
Se invece avete delle precise esigenze, rispondo alle mail come agli altri canali social e telefonici ESCLUSIVAMENTE per richieste di consulenza PROFESSIONALI quindi a carattere economico in quanto parte del mio lavoro.