4G IoT
Projectbeschrijving
- Thuisnetwerk gebaseerd op een Raspberry Pi met een draadloze internetverbinding. Geen vaste lijn, geen losse router.
- Bediening op afstand via SSH (want de S in IoT staat voor security!)
- Verwarming instellen per vertrek
- Remote de verwarming aanzetten, want een klokthermostaat werkt niet als je niet vooraf weet wanneer je naar huis gaat
- Extreme energiebesparing: slaapkamer kunnen verwarmen zonder verplicht ook de woonkamer te moeten verwarmen
- Raspberry Pi met 4G-module gekregen, dus ik heb niet hoeven zoeken naar geschikte onderdelen :)
- Geen IPv6 want te veel onderdelen die dat niet ondersteunen
Deze pagina heb ik gemaakt omdat er mensen waren die geïnteresseerd waren in hoe je zoiets doet. Aangezien ik alles al werkend heb, kan het zijn dat ik dingen vergeten ben hier te documenteren. Deze pagina is dus niet bedoeld als complete howto of tutorial, maar meer een verzameling losse stukjes configuratie ter inspiratie.
Raspberry Pi met 4G
4G/LTE
Een USB-4G-module (SIM7100E) met een simkaart (simpel.nl, 2 GB/maand voor 7,50 €/maand) voor de internetverbinding. Ik heb eerst de pincode van de simkaart af gehaald om eindeloos drama te voorkomen.
Het makkelijkst is om de module gewoon altijd zelf de verbinding te laten maken:
qmicli -d /dev/cdc-wdm0 --wds-set-autoconnect-settings=enabled
Verder gewoon een interface configureren en een NAT-router van het doosje maken:
# ergens in /etc/network/interfaces auto wwan0 iface wwan0 inet dhcp pre-up /usr/local/bin/wacht-op-data post-up iptables -t nat -A POSTROUTING -o $IFACE -j MASQUERADE post-up echo 1 > /proc/sys/net/ipv4/ip_forward
Bij het booten is de dataverbinding nog niet klaar. Vandaar dit scriptje dat daar op wacht:
#!/bin/sh # /usr/local/bin/wacht-op-data while ! (qmicli -d /dev/cdc-wdm0 --wds-get-packet-service-status | grep connected); do echo "Wacht op gprs/umts/lte..." sleep 1 done
SSH-toegang
Omdat inkomende verbindingen niet kunnen, gebruik ik autossh voor een uitgaande verbinding met een port forward van buiten naar binnen.
adduser autossh su - autossh ssh-keygen cat .ssh/*pub | ssh tau@mijnvpsje.ergens.example.com 'cat >> .ssh/authorized_keys'
Om dataverkeer te besparen, protocol-niveau keepalives gebruiken omdat je daarvan wel de interval kunt configureren:
# /home/autossh/.ssh/config ServerAliveInterval 180 TCPKeepAlive no
Systemd unit voor automatisch starten:
# /etc/systemd/system/autossh.service [Unit] Description=AutoSSH tunnel service After=network.target [Service] Type=simple User=autossh ExecStart=/usr/bin/autossh tau@mijnvpsje.ergens.example.com -tt -N -R2220:127.0.0.1:22 Restart=always RestartSec=60 # voorkomt dat ie stopt als de eerste verbinding mislukt Environment="AUTOSSH_GATETIME=0" [Install] WantedBy=multi-user.target
Systemd schudden tot ie doet wat je wilt:
systemctl daemon-reload systemctl enable autossh systemctl start autossh
Handige config om vanaf m'n laptop met 1 commando (ssh tau) via de vps op de raspberry pi in te loggen:
# ergens in /home/juerd/.ssh/config op mijn laptop Host tau User root Hostname 127.0.0.1 Port 2220 ProxyJump mijnvpsje.ergens.example.com
Ja, ik werk als root. Lijkt me niet onzinnig op een device met maar 1 functie :)
DHCP-server
Om rechtstreeks LAN-dingen eraan te hangen zonder nog een router nodig te hebben (immers, deze raspberry pi is nu zelf al een router), is een DHCP-server handig. DNSMasq is meteen ook een DNS-server en enorm makkelijk in gebruik.
Enfin, eerst de netwerkinterface instellen zodat er iets te binden valt:
# ergens in /etc/network/interfaces auto eth0 iface eth0 inet static address 192.168.0.1 netmask 255.255.255.0
En dan nog even 2 regels uncommenten:
# ergens in /etc/dnsmasq.conf bind-interfaces dhcp-range=192.168.0.50,192.168.0.150,12h