RFXCOM uitlezen met RFXcmd

Door ThinkPad op zondag 19 juni 2016 11:54 - Reacties (5)
Categorie: Domotica, Views: 2.603

Inhoudsopgave
Inleiding
RFXcmd (Python-script)
RFXcmd installeren
Het script automatisch laten starten en zorgen dat het blijft draaien
De data vanuit RFXcmd naar een externe applicatie sturen

Inleiding
Ik heb al tijden een pricewatch: Rfxcom RFXtrx433E USB 433.92MHz Transceiver in gebruik. Ik heb hem destijds aangeschaft om met Domoticz te gebruiken om m'n KlikAanKlikUit-ontvangers aan te sturen.
RFXCOM RFXtrx433E

De tijden zijn veranderd en ik gebruik geen Domoticz meer en ook geen KlikAanKlikUit meer. Tegenwoordig draait mijn woning op een pricewatch: Zipato Zipabox Smart Home Controller en zijn de KaKu-modules vervangen voor Z-Wave modules omdat de betrouwbaarheid van 433Mhz toch te wensen overliet.

De RFXCOM is echter al die tijd gebleven. De Zipabox heeft namelijk wel een 433Mhz module (pricewatch: Zipato Zipabox 433MHz module), maar die ondersteunt niet alle devices. Zo heb ik bijv. tweemaal de pricewatch: Cresta Thermo-hygro sensor in huis, die worden door Zipato niet ondersteund. Ook een losse Home Easy wandschakelaar ondersteunen ze niet.

De RFXCOM bleek daarbij erg handig, die ondersteunt zoveel protocollen dat het geen probleem was om de bovengenoemde items te ontvangen. Waar ik echter wel mee zat, is dat ik geen volledig domoticapakket (zoals bijv. Domoticz) 24/7 draaiend wilde hebben enkel en alleen om 3 apparaten te ontvangen 8)7

RFXcmd (Python-script)
Gelukkig blijkt er een Python-script te zijn waarmee je de RFXCOM perfect kunt uitlezen, RFXcmd. Omdat dit script volgens mij niet erg bekend is, heb ik besloten om er een blogpost over te schrijven. Ik heb het draaien in een virtuele machine op mijn thuisserver.
De website is op dit moment uit de lucht, maar met de Wayback Machine valt de site nog wel te bekijken.

RFXcmd installeren
Van de Github pagina download je de nieuwste versie. Dit .zip bestand pak je uit. Vervolgens kun je het script uitvoeren op de volgende manier:
python /home/domotica/rfxcmd_gc/rfxcmd.py -l -v -d /dev/ttyUSB0 (ttyUSB moet je even uitzoeken waar jouw RFXCOM op zit, kan middels dmesg | grep FTDI

Als je het script uitvoert dan komt er eerst een hele lijst voorbij met overzicht van protocollen die enabled/disabled zijn op je RFXCOM. Vervolgens zul je zien, dat als je het script een tijdje laat draaien, er waarschijnlijk wel wat sensoren zullen worden ontvangen, weerstations van je buren bijv :+

Het script automatisch laten starten en zorgen dat het blijft draaien
Goed, dat is leuk, maar nu? Je moet het script nu handmatig starten en als je het SSH-venster wegklikt stopt het script ook met draaien. Dat is niet handig en willen we anders hebben. Gelukkig is er supervisor. Dit is een 'process control system'. Deze start de processen die jij wilt draaien en belangrijker: zorgt dat ze ook blijven draaien. Mocht het script crashen dan zal het door supervisor automatisch weer opnieuw worden gestart. Ideaal!

Installeer supervisor (apt-get install supervisor), zie ook de uitleg hier.

Vervolgens moeten we een config aanmaken voor rfxcmd, zodat supervisor weet wat hij moet doen en op wat voor manier. In /etc/supervisor/conf.d maak je een nieuw bestand, ik heb hem rfxcmd_gc.conf genoemd. In dit bestand zet je het volgende:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
[program:rfxcmd_gc]
command = python /home/domotica/rfxcmd_gc/rfxcmd.py -l -v -d /dev/ttyUSB21
directory = /home/domotica/rfxcmd_gc/
user = domotica
autostart = true
autorestart = true

stdout_logfile = /var/log/rfxcmd/rfxcmd.log
stdout_logfile_maxbytes = 1MB
stdout_logfile_backups = 3
stderr_logfile = /var/log/rfxcmd/rfxcmd.err.log
stderr_logfile_maxbytes = 1MB
stderr_logfile_backups = 3


Je ziet het commando staan (uitleg van de parameters die ik gebruik vind je door het script op je commandline te runnen met de parameter -help), je ziet de directory van het script staan en de user waaronder het script moet runnen. Verder zie je dat hij het script automatisch moet starten en ook automatisch moet herstarten. De regels daaronder zijn voor logging, die schrijft hij weg naar /var/log/rfxcmd/. Alle ontvangen waarden e.d. komen in rfxcmd.log, de fuotmeldingen in rfxcmd.err.log. Voor beide logfiles heb ik ingesteld dat ze niet groter dan 1MB mogen worden en hij max. 3 versies mag bewaren.

Je ziet dat ik 'ttyUSB21' gebruik, deze naam heb ik handmatig ingesteld, door deze tutorial te volgen kun je zorgen dat de RFXCOM altijd dezelfde tty krijgt toegewezen. Het is aan te raden om dit te doen, mocht je de RFXCOM ooit loskoppelen en weer aansluiten, dan kan het gebeuren dat hij een andere tty krijgt toegewezen en het script niet meer werkt.

Als je de config hebt aangemaakt moet je hem inlezen in [mono]supervisor[mono]. Dit doe je met de volgende commando's:
sudo supervisorctl. Je komt nu op de opdrachtprompt van supervisor.
Je voert dan supervisorctl reread uit, hij zal nu het configbestand wat je net hebt aangemaakt vinden. Vervolgens nog een supervisorctl update om de config toe te voegen.

Als het goed is zou hij RFXcmd nu gestart moeten hebben, dit kun je zien door supervisorctl status te typen. Er zou dan 'RUNNING' achter 'rfxcmd_gc' moeten staan.

De data vanuit RFXcmd naar een externe applicatie sturen
Goed, het script draait, maar hoe krijg ik nou de data die de RFXCOM ontvangt in mijn eigen applicatie? Dit werkt via het trigger.xml bestand. Hiermee kun je triggers aanmaken, een actie die RFXcmd moet uitvoeren bij het ontvangen van een signaal wat voldoet aan het kenmerk wat jij hebt opgegeven.

Eerst openen we supervisor weer en stoppen we het script: stop rfxcmd_gc.
Daarna openen we config.xml en zoeken we naar de regel 'trigger_active' en zetten deze op 'yes': <trigger_active>yes</trigger_active>
Ik heb overigens in de config.xml ook nog ingesteld dat hij de logging naar /dev/null moet schrijven, naast de supervisor-logging houdt RFXcmd er blijkbaar ook nog een eigen logging op na :? Door dit uit te zetten voorkomen we dat onze schijf volloopt.
Dit doe je door <logfile>rfxcmd.log</logfile> aan te passen naar <logfile>/dev/null</logfile> (Als je data naar /dev/null schrijft onder Linux dan verdwijnt dit, zie het als een soort zwart gat :p ).

Vervolgens openen we trigger.xml (sudo nano trigger.xml). Dit is het bestand waarin we onze acties gaan instellen. Bewerk dit bestand alleen via een editor op de Linux-machine waarop je het script gaat draaien. RFXcmd is erg gevoelig en ik heb gemerkt dat als je de trigger.xml met bijv. WinSCP aanpast, je de volgende melding krijgt bij het starten van RFXcmd: "Error in trigger.xml file". Heeft waarschijnlijk met de indeling van het bestand te maken. Als je het gewoon met nano of vi o.i.d. bewerkt dan gaat het wel goed. Krijg je toch de foutmelding dan moet je het trigger.xml bestand even verwijderen en weer opnieuw aanmaken.

Je kunt het bestand helemaal leegmaken, de standaardwaarden hebben we niet nodig.
Een voorbeeld van mijn trigger.xml:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<xml>
<trigger>
        <message>0A4629..330F..........</message><!-- Cresta TX320 woonkamer -->
        <action>curl -i -s -XPOST "http://192.168.4.10:8086/write?db=rfxcmd&rp=volatile" --data-binary "cresta,sensor=woonkamer temp=$temperature$,hum=$humidity$,bat=$battery$" > /dev/null</action>
</trigger>
<trigger>
        <message>0B1100..0003AF8403010F70</message><!-- HE842 Wallswitch ON -->
        <action>curl -s -o /dev/null "http://192.168.4.35/milight/bridge.php?cmd=on&group=4"</action>
</trigger>
<trigger>
        <message>0B1100..0003AF8403000070</message><!-- HE842 Wallswitch OFF -->
        <action>curl -s -o /dev/null "http://192.168.4.35/milight/bridge.php?cmd=off&group=4"</action>
</trigger>
</xml>


De <message> is de unieke waarde waar hij naar zoekt, dit is het serienummer van je sensor. De puntjes zijn wildcards, op die plekken staat namelijk de inhoud van het datapakketje, de temperatuur en luchtvochtigheid en een sequence nummer bijv.

Om achter het serienummer van je sensor te komen kun je in /var/log/rfxcmd/rfxcmd.log kijken, of handmatig RFXcmd starten op de commandline en een tijdje laten draaien. Op een gegeven moment zal je zien dat bepaalde waarden in elk bericht terugkomen en er ook posities telkens anders zijn, die posities zet je de puntjes neer.

De <action> is de actie die RFXcmd moet uitvoeren als hij een <message> ontvangt die aan de ingestelde kenmerken voldoet. In mijn geval voert hij een HTTP-query uit (via curl) om de waarden in een InfluxDB-database weg te schrijven zodat ik er met Grafana grafieken van kan maken. Maar je kunt natuurlijk ook zelf een PHP-script maken die het in een MySQL-database o.i.d. stopt. De aan/uit afkomstig van de schakelaar stuur ik naar een zelfgeschreven PHP-script die mijn Milight lampen aanstuurt.

Als je een temperatuur/vochtigheidssensor gebruikt (zoals de Cresta TX320) dan bevat een uitgezonden bericht allerlei informatie. Deze vang ik af door de variabelen in m'n URL te gebruiken, deze variabelen zal RFXcmd invullen met de waarden uit het bericht wat hij heeft ontvangen. Ik gebruik:
$temperature$
$humidity$
$battery$ (bij de Cresta TX320 geeft deze '9' terug bij een goede batterij en '0' (nul) bij een batterij die leeg begint te raken (vanaf 2,6V heb ik gezien, door regelbare voeding terug te schroeven vanaf 3V).

Als je de trigger hebt aangepast sla je hem op en kun je rfxcmd weer starten. Het beste is om het script eerst even met de hand te starten op de commandline, zo kun je zien of alles naar behoren werkt. Als dat zo is kun je het stoppen (CTRL -C) en het door supervisor laten starten: start rfxcmd_gc.
Als het goed is zou je nu na enige tijd de data moeten ontvangen in jouw applicatie!
InfluxDB

Zipato Zipabox teardown

Door ThinkPad op dinsdag 23 februari 2016 21:04 - Reacties (3)
Categorieën: Domotica, Electronica, Views: 2.943

Het kloppend hart van de domotica in mijn woning is de pricewatch: Zipato Zipabox Smart Home Controller

Als echte Tweaker ben ik altijd wel benieuwd wat er nou qua hardware wordt gebruikt in bepaalde producten. Ik bekeek de Zipabox eens en zag dat er geen 'warranty void' stickertjes ofzo werden gebruikt, alleen twee schroefjes. Die losgedraaid en ik kon het apparaatje zo openmaken, de twee helften konden zo uitelkaar worden gepakt.

Wat mij als eerste opviel is dat er een klein luidsprekertje in het apparaat zit. Ik heb er nog nooit geluid uit horen komen. Ben benieuwd waar deze voor gebruikt kan worden? Misschien voor de alarmfunctie van de Zipabox (betaalde feature).

Voorkant van de printplaat:
http://tweakers.net/ext/f/z5cb1MR9x8oGJwOZGHGCQfQ6/full.jpg

Achterkant van de printplaat:
http://tweakers.net/ext/f/3oTWoKK1R2KUfZUffCBAFQJj/full.jpg

De belangrijkste chips op de PCB:
  • LPC3250FET296 - Een ARM-processor van NXP, met een max. kloksnelheid van 266Mhz
  • K9F1G08U0C - 16M NAND Flash-memory van Samsung
  • 2x de K4S561632D-UC75 - 256Mbit SDRAM RAM-geheugen chip van Samsung
  • SD3502A-CNE3 - Z-Wave transceiver van Sigma Designs
  • 25PE20VP - Serial Flash geheugen van STMicroelectronics
  • TUSB2046B - USB-hub van Texas Instruments
  • OTG4E - USB-OTG Full-speed Transceiver van STMicroelectronics
  • MAX5556 - Low-Cost Stereo Audio DAC van Maxim Integrated
  • LM25576 - Step-Down (Buck) Converter van Texas Instruments
  • NXP 8631 0406 - Hier kan ik zo niks over vinden, ik vermoed dat het een audio-versterkertje is
Het geheel wordt gevoed via een externe 12V 1.5A adapter. Besturing loopt via de cloudservers van Zipato.

De USB-componenten zoals de hub (TUSB2046B) vind ik wel apart, zou dit betekenen dat de uitbreidingsmodules zoals de 433Mhz module, P1-module etc eigenlijk gewoon USB-apparaten zijn? Het aansluiten van deze modules verloopt via een soort PCIe-x1 connector. De Zipabox heeft zowel links als rechts een male variant (stuk PCB wat uitsteekt) hiervan, een uitbreidingsmodule heeft een female variant gelijk aan een PCI-Express x1 slot op een moederbord.

Ik heb voor de Zipabox ook nog de Zipabox 433Mhz uitbreidingsmodule gekocht, hiermee kun je 433Mhz apparaten zoals KlikAanKlikUit stekkers aansturen. Deze module heb ik ook even opengemaakt. Het RF-gedeelte wordt afgehandeld door de CC1101 chip van Texas Instruments. Verder zitten er op de 433Mhz module nog een PIC18F25K22 (High Performance RISC CPU) en een 25080D (8-Kb SPI Serial CMOS EEPROM).

http://tweakers.net/ext/f/FJrW3jri8Rmblo0WOxdznUwr/full.jpg

Een Nmap van de Zipabox laat het volgende zien:
root@vm:~# nmap 192.168.1.125

Starting Nmap 6.40 ( http://nmap.org ) at 2016-02-23 20:05 CET
Nmap scan report for 192.168.1.125
Host is up (0.0032s latency).
Not shown: 998 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
8080/tcp open  http-proxy
MAC Address: 00:00:00:00:00:00 (Microchip Technology)

Nmap done: 1 IP address (1 host up) scanned in 1.76 seconds
root@vm:~#

Het MAC-adres heb ik even weggehaald ;)

Op poort 22 draait inderdaad een SSH-server:
login as:

Echter ik weet de credentials niet, dus kom er niet in ;)
Op poort 8080 draait een webservice, als ik die open in m'n browser zie ik alleen:
404 Not Found

No context found for request



Als extra bonus nog wat warmtebeeldfoto's, gemaakt met een FLIR One (Android)

Voorkant van de PCB:
http://tweakers.net/ext/f/RpOuoUsak4JvjCEfvUO3TwbB/full.jpg

Achterkant van de PCB:
http://tweakers.net/ext/f/cTXHEtCvWK0lqR4DryVhIZkl/full.jpg

Wat opvalt is dat na het aansluiten van de 433Mhz-module er een component erg warm (76,1 °C) wordt:
http://tweakers.net/ext/f/qous1MVufNrgP8LZpdE6vR7e/full.jpg

Detailfoto (85 °C !):
http://tweakers.net/ext/f/nRBmToU6uNEuGLsAKVLNp067/full.jpg

Het lijkt erop dat dit de MAX5556 is, maar het is lastig te pinpointen.

Hoe dit kan weet ik niet, de Zipabox en de 433Mhz module lijken echter prima te functioneren.

[Gmail] Filterregel instellen om nieuwsbrieven naar map te verplaatsen

Door ThinkPad op dinsdag 22 december 2015 09:39 - Reacties (8)
Categorie: Tips & Tricks, Views: 3.812

Ik gebruik al een aardig aantal jaren Gmail voor mijn e-mail.
Eén van de grote voordelen vind ik de mogelijkheid om vrij uitgebreide filters te kunnen maken. Ik gebruik dit onder andere om nieuwsbrieven van een label te voorzien en naar een aparte map te verplaatsen. In de Gmail-app op m'n smartphone heb ik vervolgens ingesteld dat dat label / die map niet gesynchroniseerd hoeft te worden. Dit scheelt een hoop onnodige (tril)signalen van m'n telefoon. En je kunt je mailbox veel eenvoudiger opruimen omdat alle rommel op één plaats wordt verzameld.

Het filter wat ik nu gebruik ziet er als volgt uit:

code:
1
2
3
4
5
6
7
8
-from:{*@home *@ziggo *@upc *@hotmail *@gmail *@live *@msn *@kpn *@xs4all *@planet *@telfort *@tweakers} 
(nieuwsbrief AND afmelden) 
OR (newsletter AND unsubscribe) 
OR (bekijk online AND uitschrijven) 
OR (nieuwsbrief AND uitschrijven) 
OR (webversie AND afmelden) 
OR (newsletter AND uitschrijven) 
OR unsubscribe (-ebay, -aliexpress, -domoticz)



Deze zoekt naar bepaalde woorden (moeten samen voorkomen in het bericht), tenzij het van bepaalde e-mailadressen komt (misschien is het doorgestuurd door familie en wel interessant) of van sites (eBay, AliExpress, Domoticz) waar ik de mail van in een andere map wil dumpen.

Instellen doe je als volgt:
  1. Eerst maak je een nieuw label aan, 'Nieuwsbrieven' wat kan via Instellingen --> Labels
  2. Daarna ga je naar Instellingen --> Filters en klik je onderaan op 'Nieuw filter maken'
  3. Kopieer bovenstaande code, plak het in Kladblok (o.i.d.) en zorg dat het één lange regel wordt i.p.v. meerdere regels onder elkaar
  4. In het veld 'Met de woorden:' plak je dan de filterregel (één lange regel dus)
  5. Daarna klik je op 'Filter maken met deze zoekopdracht'
  6. Je zult nu al zien dat hij op de achtergrond al een overzicht laat zien met de gevonden berichten
  7. Zet het vinkje aan bij 'Inbox overslaan (Archiveren)' en ook bij 'Het label toepassen:'. Kies uit de dropdown het label wat je net hebt aangemaakt ('Nieuwsbrieven').
  8. Onderaan zal je iets zien als 'Filter ook op 37 overeenkomende berichten toepassen.' als je dat aanvinkt zal hij de nieuwsbrief(-achtige) berichten die je reeds hebt ontvangen ook verplaatsen.
De regel zal voor iedereen wel wat aangepast moeten worden naar eigen wens, maar het leek mij wel aardig om de basisregel even te delen. Je kunt ook besluiten om het naar de prullenbak te verplaatsen i.p.v. een apart label, maar er zullen altijd wel legitieme mailtjes zijn die toch door dit filter opgepikt worden. Omdat de prullenbak van Gmail na 30 dagen automatisch geleegd wordt, zou je in theorie belangrijke mail kunnen verliezen. Vandaar mijn keuze voor een apart label/map.

Het beste is natuurlijk om je uit te schrijven (indien mogelijk) van nieuwsbrieven zodat je ze niet meer krijgt in het vervolg, maar webshops e.d. hebben vaak de vervelende neiging om je deze rotzooi te sturen als je eenmaal iets besteld hebt. Met deze filterregel maak je de ergernis iets kleiner & je inbox een stuk leger :)

Als je eenmaal onder de knie hebt hoe de filterregels in Gmail werken dan kan het feest beginnen. Marktplaats stuurt ook vaak van die irritante mailtjes ("<jouwnaam>, Wij geven u graag een tip voor", "Nog niet verkocht?" etc.), die markeer ik als gelezen en gooi ik daarna weg. Door dit soort rotzooi eruit te filteren kun je een beter overzicht houden van de mail die WEL belangrijk is ;)

Vooral minder ICT-bedreven personen (m'n ouders bijv. :+ ) worden vaak overspoeld met nieuwsbrief rotzooi omdat ze vergeten het vinkje 'Abonneer op nieuwsbrief' weg te halen als ze ergens iets bestellen. Een dergelijke filterregel werd dan ook goed ontvangen door mijn ouders.

Pushnotificatie indien je externe IP-adres wijzigt

Door ThinkPad op woensdag 05 augustus 2015 21:04 - Reacties (12)
Categorie: Domotica, Views: 4.655

Zoals de meeste internetgebruikers met bijv. een Ziggo-abonnement wel bekend is, wil het nog wel eens voorkomen dat je externe IP-adres wijzigt.

Dit is soms nogal vervelend, ik heb bijvoorbeeld een backuptaak lopen tussen mijn Synology NAS en de Synology NAS die bij mijn ouders staat (offsite backup). Om dit allemaal een beetje veilig te houden staat poort 22 (SSH, nodig voor de 'NetBackup' van Synology) alleen open voor het IP-adres van m'n ouders en andersom alleen voor mijn IP-adres.

Dit adres wil dus nog wel eens wijzigen en dan krijg ik automatische mailtjes dat de backup niet voltooid kon worden. Normaal zou je zoiets met een DynDNS domeinnaam oplossen, maar dat werkt in dit geval niet (ik moet een IP-adres ingeven, domeinnaam kan niet).

Voor wat domotica gerelateerde zaken gebruikte ik al een tijdje Pushover om pushnotificaties naar m'n telefoon te sturen. Ze hebben een simpele API waarmee je gemakkelijk berichten kan sturen.
Nu leek het mij wel handig om een pushnotificatie te krijgen als mijn WAN IP-adres of dat van m'n ouders gewijzigd is. Dus even aan de slag geweest.

Grootste bron was dit script: http://nas.deadcode.net/2...en-external-ip-changed/2/
Voor het Pushover-notificatie stukje heb ik dit script gebruikt: https://github.com/fschae...h/blob/master/pushover.sh

Het uiteindelijke script ziet er zo uit:


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
36
37
38
39
40
41
42
43
44
#!/bin/bash
#
# simple script to send alert for ip changes
# version 0.1
# By Ray Chan
# http://nas.deadcode.net/2009/07/26/synology-email-alert-when-external-ip-changed/2/
# If you want a simple log file, assign 1 to log_enabled, otherwise set it to 0
log_enabled=0; #0=disable, 1=enable

# date format used by log file
datestamp=`date '+%Y-%m-%d %H:%M:%S'`

# the actual command getting the public IP
myipnow=`wget -4 -qO - icanhazip.com` 

previp="0.0.0.0";

# path of the log file, ignore if log_enabled=0
logfile="/volume1/@appstore/domoticz/var/scripts/bash/ipcheck/log.txt"

# path of the temporary file storing previous ip address
iplog="/volume1/@appstore/domoticz/var/scripts/bash/ipcheck/ip.log"

if [ -f $iplog ]; then
   previp=`cat $iplog`
fi

if [ $myipnow != $previp ]; then
   #ip changed, sending alert
   /bin/bash /volume1/@appstore/domoticz/var/scripts/bash/pushover.sh -u JOUW_USER_KEY -a JOUW_APPLICATIE_KEY -q "IP-adres thuis is gewijzigd" -m "Was $previp is nu $myipnow"


   #write the new ip to log file
   echo $myipnow > $iplog
   if [ $log_enabled = 1 ]; then
      echo "$datestamp IP changed, sending notification email. $previp | 
      $myipnow" >> $logfile
   fi
else
   if [ $log_enabled = 1 ]; then
      echo "$datestamp IP is same, skipping notification. $previp | 
      $myipnow" >> $logfile
   fi
fi


Het bestand 'ip.log' moet je zelf nog even aanmaken volgens mij (kun je leeglaten).

Als je bent ingelogd bij Pushover maak je een key aan voor je applicatie: https://pushover.net/apps
Om het geheel er wat flitsender uit te laten zien op je telefoon kun je van https://www.iconfinder.com/ nog even een mooi icoontje halen die je bij je Pushover app upload.

Om te testen kun je het script nu een keer draaien:
sh ipcheck.sh

Als het goed is zou in het 'ip.log' bestand dan je huidige IP-adres moeten komen te staan.
Wanneer je dit vervolgens aanpast (laatste cijfers even veranderen in iets anders) en het script nog een keer draait zou je een melding op je telefoon moeten krijgen.

Je zet het script in je crontab (ik laat hem elk uur draaien):
#minute hour    mday    month   wday    who     command
0       *       *       *       *       root    sh      /volume1/@appstore/domoticz/var/scripts/bash/ipcheck/ipcheck.sh


En vervolgens zal je automatisch een melding zoals hieronder krijgen mocht je externe IP-adres onverwachts wijzigen!
http://tweakers.net/ext/f/fNlptsGDp835d0n5ZT6UdePv/full.png

Het versturen van een Pushover bericht is zoals je ziet erg simpel, dus je kunt het ook eenvoudig voor andere scripts gebruiken.

Mocht je nou een 'dom' apparaat hebben wat alleen meldingen per e-mail kan versturen en je wilt dit apparaat toch pushmeldingen laten sturen dan kan dat sinds kort ook. Tweaker 'grote_oever' tipte mij hierop in het Domoticz topic. Pushover heeft een e-mail gateway opgezet waardoor dit mogelijk is. Let er wel op dat je niet over de gebruikslimiet van 7,500 pushberichten per applicatie per maand heengaat.

Modem automatisch powercyclen bij internetproblemen

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

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.