Coole grafiekjes van Fritz!box maken met InfluxDB & Grafana (dataverkeer & internetsnelheid)

Door ThinkPad op woensdag 29 juni 2016 23:12 - Reacties (4)
Categorie: Algemeen, Views: 2.402

Ik heb een pricewatch: AVM FRITZ!Box 7360 Edition International aan mijn VDSL-lijntje van Telfort hangen. Fijn ding, lekker stabiel en veel meer features dan de standaard Experiabox V8 die ik van Telfort kreeg :S

Als Tweaker ben ik gek op grafiekjes en wilde ik ook graag gegevens zoals m'n dataverbruik en actuele download- en uploadsnelheid uit de Fritz!box halen om dit te plotten.

Helaas blijkt het ding geen SNMP ofzo te doen. Misschien dat dit evt. wel zou kunnen door er 'Freetz' op te installeren (een custom firmware voor een Fritz!box, net zoals OpenWRT voor TP-Link e.a.hebt), maar dat zag ik ook niet echt zitten, het ding werkt nu prima en dat ik gegevens over dataverkeer e.d. wil uitlezen is puur een luxeprobleem, geen zin om daar de stabiliteit/betrouwbaarheid voor op het spel te zetten.

Na wat zoeken bleek dat het ding via UPnP wel allerlei info uitspuugt. Omdat de Fritz!box al heel wat jaartjes bestaat was dit natuurlijk allang uitgevogeld. Code voor het uitlezen van de gewenste data kon ik dus ook zo van internet plukken.

Toen kwam ik aan bij het gedeelte om de data op te slaan. Ik heb voor m'n domotica al InfluxDB en Grafana draaien. Ik lees er bijv. m'n OTGW mee uit en maak daar mooie grafiekjes van, dankzij een medetweaker: Nicky's TweakBlog: bijmij-grafana: OpenTherm Gateway. De keuze was dan ook vrij eenvoudig om ook hier InfluxDB en Grafana te kiezen.

Uiteindelijk met wat knutselen was dit het resultaat:
https://tweakers.net/ext/f/k0H7GcXiw5ScqGqhVEI0bhm0/full.png

De actuele snelheden worden uit de UPnP informatie gehaald
De verbruiksgegevens komen van http://fritz.box/internet/inetstat_counter.lua

Wat ik erg mooi vind is dat InfluxDB erg gemakkelijk werkt als je het eenmaal hebt draaien. Je maakt een database aan, maar de tabellen en velden hoef je niet eerst te definiëren. Toen ik het uitleesscript (met daarin de curl-regel om alles naar InfluxDB te duwen) voor de eerste keer draaide, werd alles gelijk goed gezet in InfluxDB. Veel makkelijker dan bijv. MySQL o.i.d.

Grafana is ook top, ten eerste omdat je heel snel iets in elkaar klikt. Het begint al bij de query, je kunt in de veldjes gewoon je query opbouwen door items aan te klikken, je hoeft geen query te typen (met kans op fouten), al kan dit wel als je zou willen. Nog een voordeel is dat hij de weergave automatisch aanpast. Zo pomp ik de uitlezing van verbruikte data als megabytes in de database. Nu zou Grafana 3300MB kunnen weergeven, maar dat doet hij niet, hij toont 3,3GB. Ik heb namelijk aangegeven dat hij het als een datahoeveelheid moet zien. Hij is dan blijkbaar slim genoeg om het om te rekenen en daardoor voor de gebruiker leesbaar te houden. Bij het dataverkeer gebeurt dit ook, in de grafiek zie je geen 3000 kB/s maar 3MB/s. Als ik niet meer hevig aan het downloaden ben, dan schaalt dit automatisch weer terug naar kB/s weergave. Top!

Het is overigens aan te raden om een retention policy te configureren in InfluxDB. Zoals je in mijn code ziet pomp ik de data vanuit de Fritz!box naar een retention policy 'volatile'. Deze is ingesteld dat hij de data 30 dagen bewaart. Langer vind ik niet interessant en neemt toch alleen maar onnodig veel ruimte in (ik haal elke 10s de actuele snelheid binnen, dus dat zijn nogal wat records op een dag).
Ik zou evt. nog een continuous query kunnen maken om week/maand/jaar-totalen van het dataverbruik te maken, maar dat vind ik niet echt de moeite waard, het is toch een ongelimiteerde internetverbinding.

De retention policy ziet er als volgt uit:

code:
1
CREATE RETENTION POLICY volatile ON network DURATION 30d REPLICATION 1



Het hele zwikkie heb ik hierrrrr online gezet :)

RFXCOM uitlezen met RFXcmd

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

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

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

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

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.