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.