donderdag, 12 december 2013 19:57

Autoreset Wifibox via de (Synology)NAS

Geschreven door

Zoals eerder aangeven in een blog heb ik sinds enige tijd een wifi ledlamp in huis. Met een wifi ledlamp is het mogelijk om met een app lampen aan of uit te zetten en te dimmen of van kleur aan te passen. Om te communiceren via een app via wifi heb je een wifibox nodig welke als communicatie interface dient tussen het wifinetwerk en ledlampen. In mijn thuissituatie heb ik de wifibox opgenomen in mijn eigen thuiswifinetwerk.

Dit werkt over het algemeen goed. Ook over VPN verbinding maken werkt goed. Het probleem is echter dat na enkele dagen de wifibox geen verbinding meer heeft met het thuisnetwerk. Er is dan een reset (van het stroom halen) om de wifibox weer werkend te krijgen. Dit is vervelend als je erop wilt vertrouwen dat de wifibox het gewoon altijd doet. De vraag is dan hoe we de wifibox betrouwbaarder kunnen maken.

Een optie die ik hierbij bedacht heb is om de wifibox preventief dagelijks (of meermaals per dag) te resetten. De firmware van de wifibox bevat een optie om de wifibox te resetten onder het systeemmenu. Echter de wifibox kan zichzelf niet automatisch periodiek resetten.
In mijn thuisnetwerk is een (Synology) NAS opgenomen. De vraag is dan of wellicht de NAS periodiek de wifibox kan resetten door gebruik te maken van de resetoptie in de firmware van de wifibox.

 

mijn opstelling:

wbreset06

 

 

Om het resetten te automatiseren zal eerst duidelijk moeten zijn welke opdracht de NAS naar de wifibox moet sturen. Dit is te onderzoeken door met Wireshark het netwerk verkeer te analyseren terwijl je inlogt op je wifibox en vervolgens in het menu van de wifibox. In de anlyse zal dan de volgende HTTP pakketje worden gevonden wat verzonden word naar de wifibox op het moment dat op de resetbutton wordt geklikt via de firmware van de wifibox:

wbreset08

Uit dit overzicht blijken twee zaken. Ten eerste valt op dat de url welke de reset activeert "http://192.168.178.100/firmware.html?restart=1" is (in mijn netwerk heeft de wifibox IP adres 192.168.178.100 gekregen). Daarnaast valt op dat er een gebruikersnaam en wachtwoord worden meegegeven. Dit is de standaard gebruikersnaam en wachtwoord van de wifibox (admin, 000000). Dit is logisch omdat we hebben moeten inloggen op de wifibox om bij de firmware te komen:

wbreset01 

 

De 'beveiliging' die hierbij wordt toegepast is zogenaamde basic authentication. Een browser onthoudt normaal gesproken na het inloggen de gebruikersnaam en wachtwoord en geeft deze aan iedere URL mee welke een opvraging betreft bij de wifibox. Op een NAS een reset URLte laten uitvoeren zullen we dus de gebruikersnaam en het wachtwoord moeten meegeven. Dit kunnen we doen door de URL als volgt aan te passen:

http://admin:000000@wifiboxipadres/firmware.html?restart=1 (waarbij wifiboxipadres het ip adres van uw wifibox is).

Door deze URL aan te roepen zal de wifibox zichzelf resetten. We willen dit automatisch doen en niet handmatig. Hierbij kan een NAS een belangrijke rol spelen. Ik heb zelf een Synology. Dus die zal ik hier verder behandelen.

Als je inlogt als administrator op de Synology vindt je daar onder het configuratiescherm de taakplanner (cronjob). Met de taakplanner kun je een taak aanmaken op de URL periodiek uit te voeren.

wbreset02

 

Maak een nieuw taak aan en voer bij door gebruiker gedefinieerd script het volgende script in:

wget -q 'http://admin:Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken./firmware.html?restart=1'

wget is de Linux commando(prompt) opdracht om een webpagina te openen. De "-q" houdt in dat wget hiervan niets op het scherm toont. Zorg er wel voor dat de gebruiker op 'root' wordt gezet. Root is namelijk de enige gebruiker welke vanaf de command prompt van de Synology netwerk toegang heeft. Onder het tabblad planning kan aangeven worden hoe vaak de script moet worden uitgevoerd.

wbreset04

 

Dit lost het probleem niet geheel op, maar maakt de wifibox wel een stukje stabieler. En wellicht is bovenstaande ook handig om andere zaken te automatiseren.

 

In het kader van de thuis automatisering heb ik sinds een weekje een Wifi ledlamp in huis. Middels de bijbehorende afstandsbediening en middels de app kun je de ledlampen bedienen. In het starterspakket zitten een ledlamp, afstandsbediening en Wifibox. De Wifibox is nodig om onder andere de 'Wifi Controller 2 App' te gebruiken welke beschikbaar is voor Android en IOS.

ledlamp01

 

Windows Wifi ledcontroller

Omdat de Wifi Controller app helaas nog niet IOS7 proof is en ik geen Android apparaten in mijn bezit heb kon ik tot op heden de app nog niet gebruiken. Onder dat mom gekeken of het mogelijk is om een eigen controller te maken. Eerst voor Windows en wellicht later voor de Synology. Met Visual Basic 2010 Express heb ik een basale Wifi Controller gemaakt voor Witte lampen! Maar met simpele aanpassingen kan het programma ook makkelijk aangepast worden voor gekleurde ledlampen. Bovenin kan het IP adres en port (standaard 50000) van de Wifibox worden opgegeven.

ledlamp02

 

De wifibox kan worden aangestuurd middels commando's van 3 bytes lang welke via het UDP protocol naar de wifibox gestuurd kunnen worden. Een API voor de wifi ledlamp is gemaakt door www.applamp.nl. Mijn programma is daar dan ook gebaseerd. Dus alle credits voor applamp.nl op dat gebied. De hexadecimaal getallen heb ik omgezet naar ASCII codes (ofwel de byte code). Alleen de eerste byte is echt van belang. Die geeft de feitelijke opdracht door aan de wifibox. De laatste twee bytes zijn altijd ASCII (0) en ASCII (85).

Het programma kent twee belangrijke basis SUB's:

  • SendUDP
  • Wcommand

 

SendUDP

ledlamp03

 

De eerste Sub, SendUPD is verantwoordelijk voor het verzenden van het UDP pakketje over het netwerk. Voor deze SUB moeten wel de volgende referenties worden opgenomen in het programma:

  • Imports System.Net.Sockets
  • Imports System.Text

 

Wcommand

 

ledlamp04

 

De twee sub bevat een lijst alle commando's die mogelijk zijn voor een witte lamp. Het IP adres en de port worden uitgelezen van de textboxen op het form. Voor de volledige programma code inclusief een gecompileerde versie (voor de niet programmeurs) van het programma bijgaande download (click op de hardisk).

download-icon

 

Vervolg...

Het programma kan natuurlijk uitgebouwd worden. Interessanter zou het zijn om een programma te schrijven voor een NAS zoals bijvoorbeeld voor de Synology NAS. Dan zou het bijvoorbeeld mogelijk zijn om een digitale tijdschakelaar te maken welke automatisch de lampen aan en uit zet op bepaalde tijdstippen. Wellicht is het ook mogelijk om statussen terug te krijgen van de lampen om zo te zien of een lamp aan of uit is. Dit zal nog uitgezocht moeten worden.

zondag, 15 september 2013 11:48

E-mail notificatie K2 Joomla blog op reactie

Geschreven door

Sinds kort maak ik gebruik van de K2 extentie voor Joomla. K2 is vooral handig voor het maken van een blog op je website. Een blog maakt het mogelijk om (korte) artikelen te publiceren en ruimte te bieden aan lezers om reacties achter te laten. Daar ik niet fulltime mijn site bekijk is het handig als ik een e-mail ontvang als er een nieuwe reactie geplaatst wordt. Helaas voorziet K2 hier niet standaard in. Wat googlen leert dat er wel enkele betaalde extenties zijn voor K2 die dit kunnen ondervangen. Echter als echte Nederlander ga ik niet teveel betalen voor een simpele functionaliteit die je ook makkelijk zelf kan implementeren.

Een zoektocht op internet bracht me eerst op deze site. Het doorvoeren van deze wijzigingen leverde in mijn geval echter geen e-mails op. De reden hiervoor is dat 'joomla hack' uitgaat van het feit dat reacties voorafgaande aan publicatie dienen te worden goedgekeurd. Ik ga bij mijn site uit van controle achteraf. Dus mensen mogen reacties plaatsen. Als er spam of opmerkingen bij zitten die het daglicht niet kunnen verdragen dan haal ik die achteraf van mijn site. 

Dus hoe moeten we er dan wel voor zorgen dat er een e-mail notificatie komt als iemand op je K2 Blog een reactie heeft achtergelaten? Hiervoor moeten we een stukje PHP code gaan toevoegen aan het item.php bestand wat onderdeel is van de K2 installatie.

Het item.php bestand vindt je onder het mapje 'components' in je Joomla installatie. Vervolgens ga je daar naar het mapje 'com_k2' en vervolgens naar het mapje 'models'. Ofwel in het kort: /components/com_k2/models/item.php.

In het item.php bestand (bewerken met teksteditor of php editor) zoek je naar ' function comment()'. Vervolgens scroll je langzaam naar beneden totdat je een regel tegenkomt met de tekst 'K2_COMMENT_ADDED_REFRESHING_PAGE'. Voor deze regel plaats je de volgende regels code:

 

$mainframe = &JFactory::getApplication();
$mail = &JFactory::getMailer();
$senderEmail = $mainframe->getCfg('mailfrom');
$senderName = $mainframe->getCfg('fromname');

$mail->setSender(array($senderEmail, $senderName));
$mail->setSubject('K2 Blog commentaar ontvangen');
$mail->IsHTML(true);
$body = " <strong>".JText::_('K2_NAME')."</strong>: ".nl2br($row->userName)." <br/> <strong> E-mail: </strong>: ".nl2br($row->commentEmail)." <br/> <strong>".JText::_('K2_COMMENT')."</strong>: ".nl2br($row->commentText)." <br/> "; $mail->setBody($body);
$mail->ClearAddresses();
$mail->AddAddress($params->get('commentsReportRecipient',
$mainframe->getCfg('mailfrom')));
$mail->Send();


      

Na het doorvoeren van deze aanvulling en het opslaan van item.php (en het eventueel opnieuw uploaden van dit bestand) zouden er na iedere geplaatste reactie een e-mail verzonden moeten worden naar het mail adres van de administrator.

Ik merk wel op dat bij iedere update van het K2 component bovenstaande handeling opnieuw uitgevoerd moet worden omdat dan waarschijnlijk er weer een nieuwe versie van item.php is.

 

Nog een korte uitleg van de bovenstaande code:

- Met '&JFactory::getmailer()' wordt de Joomla standaard email component aangeroepen.

- $senderEmail, $senderName halen e-mailadres en naam(site) op uit het Joomla configuratiebestand.

- Met $mail, $body wordt gecommuniceerd met Joomla mailer. In dit geval wordt de mail door de administrator verzonden naar hem-/haar-zelf.

- $body bevat de daadwerkelijke inhoud van de het de e-mail. $row wordt door K2 gebruikt om te communiceren met de database. Hieruit vissen we de door de reageerder ingevulde mailadres en naam.

- JText is een Joomla vertaalfunctie.

 

 

Pagina 2 van 2