Wil je via LoRa draadloos een relais schakelen tussen twee Shelly’s? Dat kan! In dit artikel leggen we uit hoe je met een Shelly Plus 1 Gen3 in combinatie met de Shelly LoRa-module een eenvoudige draadloze schakeloplossing maakt. Ideaal voor situaties zonder WiFi of kabels, zoals een tuinhuis, kas of bedrijfsterrein.
Wat heb je nodig?
2x Shelly Plus 1 Gen3 (of een ander model, op deze pagina vind je alle compatibele Shelly's)
2x Shelly LoRa-module (voor zender en ontvanger)
Scripts voor zender en ontvanger (zie onderaan dit artikel)
Een versleutelingssleutel (AES key) voor veilige communicatie
Wi-Fi voor de installatie
🔐 Genereer je AES-sleutel hier: https://generate-random.org/encryption-key-generator
Gebruik de gegenereerde aes-256cbc (32-bits) key in beide Shelly’s om berichten versleuteld te verzenden en te controleren op integriteit.
Werking: directe communicatie zonder gateway
In onze test bleek dat het LoRa-signaal een bereik had van ongeveer 200 meter in een relatief dichtbebouwde woonwijk. In open veld of met een hogere antenne is het bereik waarschijnlijk aanzienlijk groter. Zelf spreekt Shelly zelfs van 5 kilometer! Dit maakt LoRa ideaal voor situaties waar WiFi of netwerkkabels niet haalbaar zijn.
Shelly LoRa werkt peer-to-peer. Dat betekent dat er geen LoRaWAN-netwerk of gateway nodig is. De communicatie verloopt rechtstreeks van de ene Shelly naar de andere via het LoRa-signaal.
In ons voorbeeld schakelt de zender automatisch om de 5 seconden tussen ON en OFF. De ontvanger ontvangt het bericht via LoRa, controleert de versleuteling en schakelt het relais op basis van de ontvangen status.
Wil je liever zelf bepalen wanneer het relais schakelt, bijvoorbeeld met een fysieke schakelaar? Ook dat kan. Vraag ChatGPT om een script te schrijven dat het signaal bijvoorbeeld alleen verstuurt bij een druk op de knop.
Scripts
In ons voorbeeld hebben we een script gemaakt waarbij de zender om de 5 seconden een aan/uit signaal verstuurd naar de ontvanger. Hiermee kan je makkelijk testen of de Shelly's werken zoals het hoort.
Wil je een andere situatie, zoals een drukknop gebruiken? Kopieer dan het script en geef het aan ChatGPT met daarbij een prompt voor jouw aanpassing. Bijvoorbeeld: “Pas dit script aan zodat het alleen iets verzendt bij een druk op de knop.” Zo krijg je precies wat je nodig hebt, zonder dat de werking onbedoeld verandert.
📲 Scripts aanmaken in de Shelly app
Open de webinterface van je Shelly (via IP-adres of Shelly app)
Ga naar het menu Scripts
Klik op Create script
Plak het gewenste script in het editorvak (vergeet hierbij niet om jouw gegenereerde key in te vullen)
Zet het script op Enabled en klik op Save
Zet ook Run on start-up aan, zodat het script automatisch start na een stroomonderbreking of als je de Shelly plaatst op de plek waar deze uiteindelijk moet gaan werken
🔧 Vergeet niet om bij beide Shelly’s via Settings > Add-ons de LoRa add-on te activeren. Pas daarna kun je LoRa gebruiken in scripts.
Script zender
const k = '<VUL HIER JOUW KEY IN>';
let s = false;
function cks(m) {
let x = 0;
for (let i = 0; i < m.length; i++) x ^= m.charCodeAt(i);
return ('000' + x.toString(16)).slice(-4);
}
function enc(m, h) {
const b = new Uint8Array(h.length / 2);
for (let i = 0; i < h.length; i += 2) b[i / 2] = parseInt(h.substr(i, 2), 16);
while (m.length % 16 !== 0) m += ' ';
return btoa(AES.encrypt(m, b, { mode: 'ECB' }));
}
function send(m) {
const payload = cks(m) + m;
Shelly.call('Lora.SendBytes', { id: 100, data: enc(payload, k) });
}
Timer.set(5000, true, function () {
s = !s;
send(s ? '1' : '0');
});
Script ontvanger
const k = '<VUL HIER JOUW KEY IN>';
function cks(m) {
let x = 0;
for (let i = 0; i < m.length; i++) x ^= m.charCodeAt(i);
return ('000' + x.toString(16)).slice(-4);
}
function dec(b64, h) {
const buf = atob(b64);
const key = new Uint8Array(h.length / 2);
for (let i = 0; i < h.length; i += 2) key[i / 2] = parseInt(h.substr(i, 2), 16);
const decrypted = AES.decrypt(buf, key, { mode: 'ECB' });
if (!decrypted || decrypted.length === 0) return;
let txt = '';
for (let i = 0; i < decrypted.length; i++) txt += String.fromCharCode(decrypted[i]);
txt = txt.trim();
const c = txt.slice(0, 4), m = txt.slice(4);
return c === cks(m) ? m : undefined;
}
Shelly.addEventHandler(function (e) {
if (!e || !e.name || e.name !== 'lora') return;
if (!e.info || !e.info.data) return;
const msg = dec(e.info.data, k);
if (msg === '1') {
Shelly.call('Switch.Set', { id: 0, on: true });
} else if (msg === '0') {
Shelly.call('Switch.Set', { id: 0, on: false });
}
});
Extra tips
💡 Meer voorbeeldscripts nodig?
Shelly publiceert een uitgebreide verzameling voorbeeldscripts op GitHub:
👉 https://github.com/ALLTERCO/shelly-script-examples📶 Beter bereik?
Plaats je LoRa-antennes zo hoog en vrij mogelijk. Buiten of bij een raam werkt beter dan binnen een metalen kast of achter beton.⚡ Eerst dichtbij testen
Probeer je scripts eerst op korte afstand om te controleren of de communicatie werkt. Pas daarna inzetten op grotere afstanden voorkomt frustratie.