Modem automatisch powercyclen bij internetproblemen

Door ThinkPad op maandag 3 augustus 2015 12:12 - Reacties (24)
Categorie: Domotica, Views: 5.882

De laatste tijd heb ik een aantal keer gehad dat Ziggo werkzaamheden uitvoerde. Hierna werkte het internet niet meer. Gelukkig gebeurde dit 's nachts, maar ik moest wel telkens 's ochtends het modem even van de stroom af halen en de stroom er weer op. Ook had ik dan vanaf het uitvallen tot het powercyclen van het modem geen internet.
Niet heel erg, maar ik bedacht mij: "waarom kan ik dit niet automatiseren? Ik heb een domoticasysteem draaien wat m'n verlichting automatisch bedient, dan moet zoiets toch ook kunnen?"

Even wat rondgezocht op internet en kwam wat voorbeelden tegen om bijv. een Raspberry Pi te rebooten als de internetverbinding wegviel (door eens in de zoveel tijd een IP-adres te pingen).

Ik heb even zitten denken en kwam tot deze opzet:
http://tweakers.net/ext/f/DplVMp7206PMt7sN1GqDoSXI/full.png
(Plaatje gemaakt met https://www.draw.io/ overigens)

Vertaald naar een Bash-script kom ik dan hier op:

Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
FirstIP="8.8.8.8" #Google DNS
SecondIP="208.67.222.222" #OpenDNS Public DNS
IDX="165" #IDX of the outlet that controls power to your modem
DomoIP="127.0.0.1"
DomoPort="8084"

COUNTER=0
while [ $COUNTER -lt 3 ] ## Try 3 times before resetting the modem. Modify as needed.
do
if ping -c 1 -w 5 $FirstIP &> /dev/null ## Determine if first IP-address responds to ping.
   then
   echo "First IP-address is responding, do nothing"
   exit 1
elif ping -c 1 -w 5 $SecondIP &> /dev/null ## Determine if second IP-address responds to ping.
   then
   echo "Second IP-address is responding, do nothing"
   exit 1
else
   let COUNTER=COUNTER+1
fi
done
#Turn modem off
wget -O /dev/null - -q -t 1 'http://'$DomoIP':'$DomoPort'/json.htm?type=command&param=switchlight&idx='$IDX'&switchcmd=Off&level=0'     
echo "Turn modem off (sending command twice to Domoticz, just to be sure)"
sleep 2
wget -O /dev/null - -q -t 1 'http://'$DomoIP':'$DomoPort'/json.htm?type=command&param=switchlight&idx='$IDX'&switchcmd=Off&level=0' 
echo "Now waiting 10 seconds"
sleep 10 ## Delay of 10, increase as needed.

#Turn modem back on again
wget -O /dev/null - -q -t 1 'http://'$DomoIP':'$DomoPort'/json.htm?type=command&param=switchlight&idx='$IDX'&switchcmd=On&level=0'
echo "Turn modem back on again (sending command twice to Domoticz, just to be sure)"
sleep 2
wget -O /dev/null - -q -t 1 'http://'$DomoIP':'$DomoPort'/json.htm?type=command&param=switchlight&idx='$IDX'&switchcmd=On&level=0'


Vul bovenaan de variabelen voor jouw situatie in, zet het in je crontab (ik laat het elke 10 minuten draaien) en off you go!
Zoals je ziet worden zowel het 'uit'-commando als het 'aan'-commando twee keer verstuurd, dit doe ik omdat ik absoluut zeker wil weten dat de stekker het commando ontvangt. 433 Mhz plugs geven geen terugkoppeling dus het commando maar één keer sturen is wel heel erg #yolo

Ik gebruik voor deze opzet Domoticz + RFXCOM + 433Mhz stekkerontvanger. Maar je zou ook een IP-based plug kunnen kopen (Ubiquiti mPower of goedkoper uit China: een Kankun / Orvibo plug) en de URL daar van aanroepen om op die manier de stroomtoevoer naar het modem te onderbreken.

Ik heb ook gekeken om het zonder tussenkomst van een stekkerontvanger te doen, maar het Ziggo modem (ik heb een Ubee EVW321b) is volledig afgesloten (geen SSH / Telnet / HTTP-URL om te rebooten). Als jouw modem dit wel heeft (portscan draaien?) dan kun je deze oplossing realiseren zonder te hoeven investeren in hardware :D
Mocht je een Cisco EPC3212 modem van Ziggo hebben dan is de URL waarschijnlijk: http://192.168.100.1/reboot.asp
M'n ouders hebben een EPC3212 modem, dus ik ga het daar binnenkort eens proberen, kan ik dit script mooi op de NAS de internetverbinding laten bewaken.

Voor m'n router zou ik wel zonder extra hardware dit truukje kunnen, die draait OpenWRT en ik kan via SSH eenvoudig een reboot commando geven. M'n router draait echter rockstable dus die heb ik buiten beschouwing gelaten.

Zet de interval overigens niet te klein (elke 30 seconden / minuut checken bijv.) dat vind ik zelf nogal 'asociaal' richting de eigenaren van de IP-adressen die je pingt (Google en OpenDNS in dit geval). Je genereert onnodig dataverkeer naar mijn idee.

Opmerkingen zijn welkom, volgens mij zitten er nog wel wat verbeterpuntjes in het Bash-script.

Volgende: Pushnotificatie indien je externe IP-adres wijzigt 08-'15 Pushnotificatie indien je externe IP-adres wijzigt
Volgende: IP-camera zonder snapshot mogelijkheid, m.b.v. script toch een snapshot verkrijgen uit RTSP-stream! 08-'15 IP-camera zonder snapshot mogelijkheid, m.b.v. script toch een snapshot verkrijgen uit RTSP-stream!

Reacties


Door Tweakers user Lemming, maandag 3 augustus 2015 13:30

gebruik voor deze opzetDomoticz + RFXCOM + 433Mhz stekkerontvanger. Maar je zou ook een IP-based plug kunnen kopen (Ubiquiti mPower of goedkoper uit China: een Kankun / Orvibo) en de URL daar van aanroepen.

Ik heb ook gekeken om het zonder tussenkomst van een stekkerontvanger te doen, maar het Ziggo modem (ik heb een Ubee EVW321b) is volledig afgesloten (geen SSH / Telnet / HTTP-URL om te rebooten). Als jouw modem dit wel heeft (portscan draaien?) dan kun je deze oplossing realiseren zonder te hoeven investeren in hardware
Is het dan niet beter om de reset knop/pin van je modem aan een GPIO van de rpi te knopen?

Door Tweakers user ThinkPad, maandag 3 augustus 2015 13:35

Lemming schreef op maandag 03 augustus 2015 @ 13:30:
[...]

Is het dan niet beter om de reset knop/pin van je modem aan een GPIO van de rpi te knopen?
Ik heb nog wat van die 433Mhz stekkerontvangers liggen dus ik kon het nu op een 'non-intrusive' manier oplossen. Officieel is jouw voorstel niet eens toegestaan overigens, het modem is z.v.i.w. eigendom van Ziggo. En ik draai dit script op m'n NAS, dus geen GPIO beschikbaar. Al heb ik wel een Raspberry Pi aanwezig in de meterkast hoor, zie andere blogpost over deurbel ;)

Maar anders was het nog wel een idee geweest, torretje aan de GPIO en dan de reset-pin (weet niet eens of die erop zit eigenlijk :+ ) omlaag trekken.

[Reactie gewijzigd op maandag 3 augustus 2015 13:41]


Door Tweakers user fl1p, maandag 3 augustus 2015 13:38

Schitterend! Ik ben fan van jouw blog. Blijf vooral Domotica/z toepassingen posten :9~

Door Tweakers user Snake, maandag 3 augustus 2015 14:29

Zeer leuk idee!

Door Tweakers user roeleboel, maandag 3 augustus 2015 14:47

Ik weet niet hoe snel jouw modem internet open krijgt na een reboot, maar bij mij (vdsl) kan dat makkelijk 3 minuten duren. Als je dan jouw scriptje om de (halve) minuut gaat draaien, gaat je modem +- een kerstboom nadoen qua knipperlichtjes en ga je nooit meer (automatisch) online raken :)
Bijhorende tip van de dag:
klok eens hoe lang het duurt om na een powercycle terug online te komen, en laat het script na uitvoeren minstens zo lang pauzeren...

Verder:
  • 'exit 1' is eigenlijk aangeven dat er een error is opgetreden, een pure 'exit' (of zo je wil 'exit 0') zou iets mooier zijn
  • ik zou hier een service van maken die start on boot, wel met bovenstaand geadviseerde delay tussen 2 runs in
  • als je je modem niet open kan/mag maken: een relay plaatsen aan de voeding (evt via een doorgeknipte verlengkabel) is ook een vrij makkelijke optie

[Reactie gewijzigd op maandag 3 augustus 2015 14:51]


Door Tweakers user remyblok, maandag 3 augustus 2015 15:29

Zet de interval overigens niet te klein (elke 30 seconden / minuut checken bijv.) dat vind ik zelf nogal 'asociaal' richting de eigenaren van de IP-adressen die je pingt (Google en OpenDNS in dit geval). Je genereert onnodig dataverkeer naar mijn idee.
Je zou dan ook gewoon Ziggo interne services kunnen pingen. Ziggo DNS en Ziggo site ofzo. Dat scheelt nog meer verkeer.

[Reactie gewijzigd op maandag 3 augustus 2015 15:30]


Door Tweakers user ThinkPad, maandag 3 augustus 2015 15:31

roeleboel schreef op maandag 03 augustus 2015 @ 14:47:
Ik weet niet hoe snel jouw modem internet open krijgt na een reboot, maar bij mij (vdsl) kan dat makkelijk 3 minuten duren. Als je dan jouw scriptje om de (halve) minuut gaat draaien, gaat je modem +- een kerstboom nadoen qua knipperlichtjes en ga je nooit meer (automatisch) online raken :)
Bijhorende tip van de dag:
klok eens hoe lang het duurt om na een powercycle terug online te komen, en laat het script na uitvoeren minstens zo lang pauzeren...

Verder:
  • 'exit 1' is eigenlijk aangeven dat er een error is opgetreden, een pure 'exit' (of zo je wil 'exit 0') zou iets mooier zijn
  • ik zou hier een service van maken die start on boot, wel met bovenstaand geadviseerde delay tussen 2 runs in
  • als je je modem niet open kan/mag maken: een relay plaatsen aan de voeding (evt via een doorgeknipte verlengkabel) is ook een vrij makkelijke optie
Bedankt voor de tip. Ik draai het elke 10 minuten / kwartier (heb cron niet bij de hand, weet het zo 123 niet uit m'n hoofd). Dus na elke schakeling zal er sowieso 10-15 minuten gewacht worden om die infinite loop te voorkomen.

Die exit code zal ik ook eens naar kijken :) En waarom een service? Zo als cron werkt het ook prima :?

Weet jij ook of de curl acties wel op de goede plek staan? Omdat er daarvoor al 'fi' en 'done' staat. En volgens mij moet op regel 9 de '-lt 3' gewijzigd in '-lt 4' toch? Less than 4 zodat hij 3x de pingcyclus doet, voor m'n gevoel doet hij hem nu maar 2x (less than 3)

[Reactie gewijzigd op maandag 3 augustus 2015 15:33]


Door Tweakers user ThinkPad, maandag 3 augustus 2015 15:45

remyblok schreef op maandag 03 augustus 2015 @ 15:29:
[...]

Je zou dan ook gewoon Ziggo interne services kunnen pingen. Ziggo DNS en Ziggo site ofzo. Dat scheelt nog meer verkeer.
Klopt, ik zat er nog aan te denken om de eerste hop (traceroute) buiten m'n eigen netwerk te pingen.

Pingen van de Ziggo DNS of de Ziggo site vind ik te onbetrouwbaar, die kunnen beiden platliggen terwijl ik nog wel gewoon internet heb (Ziggo DNS gebruik ik sowieso niet, ik gebruik OpenNIC).

Door Tweakers user roeleboel, maandag 3 augustus 2015 16:17

ThinkPad schreef op maandag 03 augustus 2015 @ 15:31:
[...]
Bedankt voor de tip. Ik draai het elke 10 minuten / kwartier (heb cron niet bij de hand, weet het zo 123 niet uit m'n hoofd). Dus na elke schakeling zal er sowieso 10-15 minuten gewacht worden om die infinite loop te voorkomen.

Die exit code zal ik ook eens naar kijken :) En waarom een service? Zo als cron werkt het ook prima :?

Weet jij ook of de curl acties wel op de goede plek staan? Omdat er daarvoor al 'fi' en 'done' staat. En volgens mij moet op regel 9 de '-lt 3' gewijzigd in '-lt 4' toch? Less than 4 zodat hij 3x de pingcyclus doet, voor m'n gevoel doet hij hem nu maar 2x (less than 3)
Cron werkt uiteraard, het service idee is meer om te vermijden dat je het script te snel na elkaar zou gaan draaien (zo kan je namelijk forceren dat er tussen 2 runs x aantal minuten gewacht wordt)

De exit-code is niet zo erg, enkel gaat cron iedere keer denken dat er iets mis is als de ping ok is (want exit-code 1). Dat kan afhankelijk van je cron-lijn en -settings resulteren in een error-mail.

Je wget's staan alleszins correct: de fi is voor de if af te sluiten, de done voor de while: pas als alle pings mislukken raak je daar.

lt -3 of lt-4 -> de -3 is inderdaad kleiner dan 3, maar aangezien je teller bij 0 begint geeft dat 3 keer :) (0,1 en 2 uiteraard)

Qua ping-verkeer moet je je trouwens geen zorgen maken, dat is voor de servers van google/opendns zoals een waterdruppel in de sahara :)

[Reactie gewijzigd op maandag 3 augustus 2015 16:22]


Door Tweakers user Demo, maandag 3 augustus 2015 16:26

Nog eleganter: 10 seconden wachten, het interne IP van je router pingen en als die nog reageert, opnieuw een poweroff naar Domoticz sturen. Voor het aanzetten zou dat ook kunnen, al duurt het waarschijnlijk wat langer voordat je antwoord krijgt. (als je één keer een misser kan hebben in de 443 MHz-communicatie kan het immers ook twee keer gebeuren ;))

Door Tweakers user ThinkPad, maandag 3 augustus 2015 16:37

Demoniac schreef op maandag 03 augustus 2015 @ 16:26:
Nog eleganter: 10 seconden wachten, het interne IP van je router pingen en als die nog reageert, opnieuw een poweroff naar Domoticz sturen. Voor het aanzetten zou dat ook kunnen, al duurt het waarschijnlijk wat langer voordat je antwoord krijgt. (als je één keer een misser kan hebben in de 443 MHz-communicatie kan het immers ook twee keer gebeuren ;))
Ook een nette oplossing inderdaad, het modem ( ;) ) pingen om te kijken wat die aan het doen is na het uitvoeren van de eerste actie.

Toch leuk dat er er altijd weer mensen zijn met goede ideeën :)

[Reactie gewijzigd op maandag 3 augustus 2015 16:38]


Door Tweakers user roeleboel, maandag 3 augustus 2015 17:06

ThinkPad schreef op maandag 03 augustus 2015 @ 16:37:
[...]
Toch leuk dat er er altijd weer mensen zijn met goede ideeën :)
Of met minder goede ervaringen, 2 keer raden waar ik mijn tip vandaan heb om genoeg tijd tussen runs te laten voor de modem om opnieuw internet te kunnen hebben |:(

[Reactie gewijzigd op maandag 3 augustus 2015 17:07]


Door Tweakers user Flippylosaurus, maandag 3 augustus 2015 18:11

Kan zo iets ook niet met een Raspberry Pi icm een 230 volt relais?

Door Tweakers user ThinkPad, maandag 3 augustus 2015 18:33

picob schreef op maandag 03 augustus 2015 @ 18:11:
Kan zo iets ook niet met een Raspberry Pi icm een 230 volt relais?
Jawel, maar ik zou toch liever wat anders gebruiken. Met een relais heb je de laagspanning (GPIO) en hoogspanning (230V) wel erg dicht bij elkaar.

Door Tweakers user hcQd, maandag 3 augustus 2015 20:45

Als je toch bash gebruikt:

for ((counter = 0; counter < 3; counter++)); do ...; done

vind ik aanzienlijk duidelijker dan zo'n while-lus. (Komt trouwens uit ksh, voor de bashism-haters.)

Door Tweakers user Pietervs, dinsdag 4 augustus 2015 06:14

ThinkPad schreef op maandag 03 augustus 2015 @ 15:45:
[...]

Klopt, ik zat er nog aan te denken om de eerste hop (traceroute) buiten m'n eigen netwerk te pingen.

Pingen van de Ziggo DNS of de Ziggo site vind ik te onbetrouwbaar, die kunnen beiden platliggen terwijl ik nog wel gewoon internet heb (Ziggo DNS gebruik ik sowieso niet, ik gebruik OpenNIC).
Eerste hop pingen is ook niet helemaal betrouwbaar: dat is (meestal) de default gateway van je huidige netwerk. En het kan voorkomen dat er ergens besloten wordt om het netwerk te verbouwen (bijvoorbeeld opsplitsen in kleinere netwerken), waardoor de default gateway wijzigt...
Gelukkig gebeurt dat niet heel vaak ;)

Door Tweakers user ThinkPad, dinsdag 4 augustus 2015 09:38

Ik heb nog even zitten zoeken naar een URL om het modem te rebooten. Voor het Cisco EPC3212 modem van Ziggo die bij m'n ouders staat is het waarschijnlijk http://192.168.100.1/reboot.asp
Heb ik nog niet geprobeerd echter. Voordeel is wel dat ik zonder inloggen op 192.168.100.1 kan komen. Kan ik dit script mooi op de Synology NAS bij hun laten draaien.

Voor de Ubee EVW321b van Ziggo die ik thuis heb staan ben ik nog zoekende. Ook is dat iets lastiger omdat je moet inloggen op het modem (ziggo/draadloos).

[Reactie gewijzigd op dinsdag 4 augustus 2015 09:39]


Door Tweakers user Evilbee, dinsdag 4 augustus 2015 10:39

In mijn pogingen om mijn UBEE modem automatisch uit te lezen ben ik er achter gekomen dat als je een onvolledig CURL request naar het modem doet, deze ook automatisch herstart ;)

Onvolledig is dus zonder user-agent, referrer, etc.

Door Tweakers user ThinkPad, dinsdag 4 augustus 2015 10:44

Evilbee schreef op dinsdag 04 augustus 2015 @ 10:39:
In mijn pogingen om mijn UBEE modem automatisch uit te lezen ben ik er achter gekomen dat als je een onvolledig CURL request naar het modem doet, deze ook automatisch herstart ;)

Onvolledig is dus zonder user-agent, referrer, etc.
Interessant, wel een lelijke manier, maarja als het werkt.... :+

Heb net ook dit gevonden: https://debianforum.de/fo...php?f=34&t=147389#p972478
Werkt echter niet voor mijn EVW321b. Ook niet als ik zelf via browser inlog en dan de URL uitvoer.

Heb nog zitten zoeken op internet, maar denk dat de Ubee EVW321b geen mogelijkheid heeft om via webinterface te rebooten helaas.

[Reactie gewijzigd op woensdag 5 augustus 2015 14:08]


Door Tweakers user MikeOO, zaterdag 26 september 2015 13:21

Weer een mooi en handig script.

Kleine toevoeving: Het script moet uitvoerbaar gemaakt worden.


code:
1
sudo chmod +x /home/pi/domoticz/scripts/bash/<naam script.sh>


Door Tweakers user Siewert308SW, maandag 21 december 2015 19:14

Ben dus een totale noob maar denk dat het met de huidige Cisco EPC3928AD EuroDocsis modems miss ook wel mogelijk is.
Na wat zoek, plak en knip werk heb ik een bash scriptje die google pinged en als die niet bereikbaar is dan probeert hij in te loggen op Cisco EPC3928AD EuroDocsis modem.
Om deze vervolgens te rebooten.

Alleen het volgende.
Het inloggen wil niet lukken want de .asp pagina die word opgeroepen kan niet worden opgeroepen.
Laat ik het zo zeggen als ik mijn script via ssh op mijn PI test dan krijg ik de melding dat de browser geen java heeft en dus niet word ondersteunt.
Is daar een oplossing voor.


code:
1
2
3
4
5
6
7
8
#!/bin/sh
ping -q -c1 google.com   /dev/null

if [ $? -ne 0 ] ; then
    rm /var/log/cookie
    curl -L -c /var/log/cookie -d "username_login=admin" -d "password_login=password" -d "login=Log+In" http://192.168.178.1/goform/Docsis_system /dev/null
    curl --cookie /tmp/cookie --referer http://192.168.178.1/Devicerestart.asp -d "mtenRestore=Device+Restart" -d "devicerestart=1" http://192.168.178.1/goform/Devicerestart /dev/null
fi


Door Tweakers user ThinkPad, maandag 21 december 2015 19:33

Siewert308SW schreef op maandag 21 december 2015 @ 19:14:
[...]
Het inloggen wil niet lukken want de .asp pagina die word opgeroepen kan niet worden opgeroepen.
Laat ik het zo zeggen als ik mijn script via ssh op mijn PI test dan krijg ik de melding dat de browser geen java heeft en dus niet word ondersteunt.
Is daar een oplossing voor.
[....]
Misschien kun je de browser-agent faken met curl, anders wget proberen als curl het niet kan.
http://osxdaily.com/2011/07/16/change-user-agent-with-curl/

Moet je even uitzoeken welke user-agent je browser op de PC gebruikt en die dan overnemen. Misschien dat het dan wel lukt.

Door Tweakers user Siewert308SW, maandag 21 december 2015 20:11

ThinkPad schreef op maandag 21 december 2015 @ 19:33:
[...]

Misschien kun je de browser-agent faken met curl, anders wget proberen als curl het niet kan.
http://osxdaily.com/2011/07/16/change-user-agent-with-curl/

Moet je even uitzoeken welke user-agent je browser op de PC gebruikt en die dan overnemen. Misschien dat het dan wel lukt.
Thx... Geprobeerd en erkt niet, miss dat ik wat verkeerd doe.
Maar blijf als het script will inloggen de bron geprint zien en de melding dat mijn browser niet ondersteunt word.
Heb alle mogelijk combinaties geprobeerd en oom mijn eigen combi van mijn pc.

Door Tweakers user pc1t, vrijdag 26 februari 2016 19:19

Bedankt voor deze oplossing. Ik heb het script aangepast en getest. Modem schakelt keurig uit en daarna weer aan als ik geen internet heb.

Mijn test:
pi@raspberrypi ~ $ ~/domoticz/scripts/bash/ping-script.sh
First IP-address is responding, do nothing

Ik heb de crontab aangepast zodat het elke 15 minuten uitgevoerd wordt.
*/15 * * * * ~/domoticz/scripts/bash/ping-script.sh

Maar met de crontab gebeurd er niets. Wat zou er mis kunnen zijn?

Om te kunnen reageren moet je ingelogd zijn. Via deze link kun je inloggen als je al geregistreerd bent. Indien je nog geen account hebt kun je er hier één aanmaken.