Help, mijn IP-adres is veranderd!
Hoe voorkom je dat je wordt buitengesloten?
Kun je ineens Domoticz en/of je beveiligingscamera’s niet meer bereiken van buitenshuis? Grote kans dat je IP is veranderd. Sommige internetproviders hebben er een handje van om dat willekeurig en onaangekondigd te doen. Je merkt het vaak pas als je van huis bent. Bijvoorbeeld midden in je vakantie! Hoe voorkom je dat je wordt buitengesloten?
Buitengesloten worden van je eigen systemen, dat is net of iemand je huisdeursleutel afpakt: heel vervelend. Helaas is het ook een fact of life bij goedkopere internetabonnementen. En vaak blijft de schade beperkt als je binnen een paar uur weer thuis bent en op je WiFi kunt inloggen. Dan kun je je nieuwe IP opvragen via een van de vele WhatsMyIP websites. Anders wordt het als je op vakantie of zakenreis bent.
Je hebt een aantal mogelijkheden om te voorkomen dat je onbereikbaar wordt:
- overstappen naar een duurder, zakelijk abonnement of een provider die vaste IP-adressen garandeert (kost meer);
- gebruik maken van een DDNS dienst om je eigen url naar Domoticz te maken. Maar pas op: je moet zo’n dienst toegang geven tot je router. Dat kan een veiligheidsrisico zijn. De meeste ‘gratis’ DDNS diensten bedelven je bovendien onder reclame. En echt ‘vast’ is zo’n url ook al niet. Als je even niet oplet, vervalt je url na 30 dagen;
- een script maken dat jou een notificatie stuurt als je IP verandert.
Tenzij je bereid bent de knip te trekken, is die laatste oplossing natuurlijk het meest elegant. Het is een kwestie van één keer installeren, testen(!) en vergeten, tot het nodig is.
Er zijn op internet diverse oplossingen te vinden voor het versturen van een mail als je IP verandert. Ik geef de voorkeur aan een notificatie via Domoticz. Dat gaat als volgt.
Stap 1: maak een virtueel apparaat
Als je dat nog niet eerder hebt gedaan, maak dan in Domoticz een Virtuele hardware dummy onder Instellingen > Hardware, zoals op onderstaande screenshot. Dit is nodig om een ‘virtuele sensor’ te kunnen maken. Die heb je nodig voor het uitlezen van de IP-waarde.
Klik nu op Maak virtuele sensoren. Geef je apparaat een creatieve naam, bijvoorbeeld Mijn IP en kies als type Tekst. Noteer het indexnummer (bijvoorbeeld idx=345).
Stap 2: maak een shell script
We hebben nu een script nodig dat geregeld je externe IP adres ophaalt en naar Domoticz stuurt, via een HTTP Request. Maak dit in de scripts folder van Domoticz.
sudo nano /home/pi/domoticz/scripts/sendIP.sh
In dit script zet je de volgende 2 regels, aangepast met jouw lokale Domoticz adres en het in stap 1 genoteerde idx.
!/bin/sh ip="http://192.168.1.5:8080/json.htm?type=command¶m=udevice&idx=345&nvalue=0&svalue="$(curl ifconfig.me) curl "$ip"
Wat je hier ziet is dat er enkele parameters naar Domoticz (op adres http://192.168.1.5:8080) worden gestuurd. Het device waardvoor het bestemd is heeft als idx 345 en de tekststring die wordt gestuurd is het resultaat van een curl-oproep naar de website ifconfig.me. Die geeft je IP-adres door.
Er zijn meer mogelijkheden om je ip-adres in een terminalvenster op te halen, zoals na te lezen is in een fraai overzichtsartikel. Ik heb gekozen voor curl ifconfig.me omdat dit lekker compact is en op je Raspberry Pi geen installatie van verdere software vereist.
Sla het bestand op en sluit het af. Test het script:
sh /home/pi/domoticz/scripts/sendIP.sh
In Domoticz zie je nu dat de waarde van je nieuwe virtuele apparaat is aangepast met je externe IP. Dit apparaat staat trouwens onder het tabblad Overige
Let op: heb je het script gemaakt in een Windows/DOS editor zoals Kladblok en dan geüploaded via (s)ftp, dan is er grote kans dat je de volgende foutmelding krijgt:
curl: (3) Illegal characters found in URL
In Windows wordt iedere regel namelijk afgesloten met een CRLF combinatie (carriage return + linefeed, ofwel ‘keer terug naar het begin van de regel en ga naar de volgende regel’). Deze tekens zie je niet in de editor, maar ze staan er wel. Linux verwacht alleen maar een linefeed. En sh (het opdrachtregelprogramma van Unix-systemen, zoals Raspbian) is daar erg kritisch over. Even de juiste regels in nano zetten voorkomt veel hoofdbrekens over waarom het nou toch niet werkt.
Eén ding moet je nog doen om er zeker van te zijn dat je script uitvoerbaar is: het aanpassen van de bestandsrechten:
sudo chmod -x /home/pi/domoticz/scripts/sendIP.sh
Stap 3: zorg dat het script automatisch wordt uitgevoerd
Om voortdurend in de gaten te kunnen houden of het IP adres wijzigt, moet dit script periodiek wordt herhaald. Dat kan met de Linux-app ‘cron’, een soort taakmanager die instructies op bepaalde tijdstippen of om de zoveel tijd uitvoert. Geef het commando:
crontab -e
De eerste keer vraagt crontab welke editor je bij voorkeur wilt gebruiken. Default is 2 (nano).
Voeg in het geopende bestand onderaan de hele volgende regel toe:
*/15 * * * * sh /home/pi/domoticz/scripts/sendIP.sh
Hier staat is dat het genoemde script van gebruiker ‘root’ iedere 15 minuten moet worden uitgevoerd. Schrijf het bestand weg (^o) en sluit de editor (^x).
Waarom een keer in de 15 minuten? Omdat we er op deze manier voor zorgen dat het script je eigen systeem nauwelijks belast, maar ook vooral de website die we aanroepen niet overspoelt met veel te veel aanvragen, wat ertoe zou kunnen leiden dat de dienst wordt beperkt of beëindigd.
Stap 4: maak een dzVents script
Nu je IP adres in Domoticz wordt bijgehouden, moeten we nog een script maken dat het adres controleert en vergelijkt met het vorige adres. Is er een verschil, dan stuurt het script een notificatie via het Domoticz systeem. Ik ga ervan uit dat je je voorkeurs-notificatiesysteem al hebt ingesteld via Instellingen > Instellingen > Notificaties
.
Open de script editor (Instellingen > Meer opties > Gebeurtenissen
) en maak een nieuw dzVents script van het type ‘Device’.
Kopieer het onderstaande script in het editorvenster. Het wordt getriggerd zodra er een nieuwe waarde voor het zojuist gemaakte apparaat Mijn IP binnenkomt. Deze waarde wordt opgeslagen in de ‘persistente’ variabele mijn_ip, d.w.z. een variabele die voor dit script wordt opgeslagen. Als de nieuwe waarde gelijk is aan de opgeslagen waarde, gebeurt er niks. Is deze anders, dan stuurt het script een notificatie uit met het nieuwe IP en actualiseert de variabele mijn_ip met deze waarde.
return { on = { devices = { 'Mijn IP' } }, data = { mijn_ip = { initial = "0.0.0.0" } }, execute = function(domoticz, waarde) local ipoud = domoticz.data.mijn_ip local ipnieuw = waarde.text if (ipnieuw ~= ipoud) then domoticz.data.mijn_ip = ipnieuw domoticz.notify('IP ADRES GEWIJZIGD', ipnieuw, PRIORITY_HIGH, nil, nil, domoticz.NSS_PUSHOVER) domoticz.notify('IP ADRES GEWIJZIGD', ipnieuw, PRIORITY_HIGH, nil, nil, domoticz.NSS_TELEGRAM) end end }
Ik gebruik in bovenstaande script zowel Pushover als Telegram om notificaties te sturen. Dat maakt de kans kleiner dat ik een bericht mis. Je kunt hier natuurlijk zelf de systemen van jouw voorkeur kiezen.
Sla het script op en bekijk het waarde van de sensor Mijn IP in het tabblad Overige. Die is nu (alleen in het begin) 0.0.0.0 en wordt na een aantal minuten geüpdated met de werkelijke (opgehaalde) waarde.
Om het script te testen, kun je de waarde van Mijn IP handmatig veranderen door een HTTP Request naar Domoticz te sturen vanuit het adresveld van je browser, zoals hieronder.
http://192.168.1.5:8080/json.htm?type=command¶m=udevice&idx=345&nvalue=0&svalue=123.45.67.891
Vul in deze opdracht uiteraard wel weer eerst het juiste lokale adres van je Domoticz installatie en de juiste idx van je virtuele sensor in.
Zodra je bovenstaande regel verzendt, krijg je vrijwel onmiddellijk een notificatie binnen met je ‘nieuwe’ IP: 123.45.67.891. Binnen een kwartier daarna krijg je nog een notificatie met je werkelijke IP. Op deze manier blijft je IP in de toekomst nooit meer verborgen!
2 reacties
wim oosterveld · 10 juni 2022 op 14:45
Ik krijg steeds de volgende melding:
curl: (3) URL using bad/illegal format or missing URL
Wat gaat hier fout?
Wim · 15 juni 2022 op 20:53
Ik krijg het script sendIP.sh niet goed. Steeds een foutmelding, vergelijkbaar met die in de uitleg. Moet er trouwens niet een # voor het ! in regel 1?