Naar de hoofdinhoud

Shelly LoRa toepassing: relais schakelen zonder WiFi

Meer dan 5 maanden geleden bijgewerkt

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

  1. Open de webinterface van je Shelly (via IP-adres of Shelly app)

  2. Ga naar het menu Scripts

  3. Klik op Create script

  4. Plak het gewenste script in het editorvak (vergeet hierbij niet om jouw gegenereerde key in te vullen)

  5. Zet het script op Enabled en klik op Save

  6. 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.

Was dit een antwoord op uw vraag?