SSL tunneling Raspbery Pi

on commence par installer le package stunnel4 :

sudo apt-get install stunnel4

Ensuite il faut l activer sinon on aura cette erreur en essayant de le lancer :

pi@raspberrypi ~ $ sudo /etc/init.d/stunnel4 start
SSL tunnels disabled, see /etc/default/stunnel4

donc pour éviter ca on édite le fichier de conf :

sudo vi /etc/default/stunnel4

et on remplace

ENABLED=0

par

ENABLED=1

ensuite on configure stunnel en créant son fichier de conf qui n existe pas par défaut :

sudo vi /etc/stunnel/stunnel.conf

dont voici le contenu

chroot = /var/lib/stunnel4/
setuid = stunnel4
setgid = stunnel4
; PID is created inside the chroot jail
pid = /stunnel4.pid

client=no
cert=/etc/stunnel/stunnel.pem
debug=3
sslVersion = all
output=/var/log/stunnel4/stunnel.log
[sslssh]
accept=443
connect=localhost:22

ensuite il faut une clé sinon on aura cette erreur au démarrage :

sudo /etc/init.d/stunnel4 start

pour créer la clé :

pi@raspberrypi ~ $ cd /etc/stunnel
pi@raspberrypi /etc/stunnel $ sudo openssl req -new -x509 -days 365 -nodes -out stunnel.pem -keyout stunnel.pem

et enfin on peut le starter

pi@raspberrypi /etc/stunnel $ sudo /etc/init.d/stunnel4 start

et vérifier qu il est bien lance avec

pi@raspberrypi /etc/stunnel $ ps -aux | grep tun
warning: bad ps syntax, perhaps a bogus '-'?
See http://gitorious.org/procps/procps/blobs/master/Documentation/FAQ
stunnel4 20179  0.0  0.3   4400   604 pts/0    S    07:54   0:00 /usr/bin/stunnel4 /etc/stunnel/stunnel.conf
stunnel4 20180  0.0  0.3   4400   604 pts/0    S    07:54   0:00 /usr/bin/stunnel4 /etc/stunnel/stunnel.conf
stunnel4 20181  0.0  0.3   4400   604 pts/0    S    07:54   0:00 /usr/bin/stunnel4 /etc/stunnel/stunnel.conf
stunnel4 20182  0.0  0.3   4400   604 pts/0    S    07:54   0:00 /usr/bin/stunnel4 /etc/stunnel/stunnel.conf
stunnel4 20183  0.0  0.3   4400   604 pts/0    S    07:54   0:00 /usr/bin/stunnel4 /etc/stunnel/stunnel.conf
stunnel4 20184  0.0  0.3   4400   748 ?        Ss   07:54   0:00 /usr/bin/stunnel4 /etc/stunnel/stunnel.conf

Ensuite il faut penser a garder sa clé “stunnel.pem” avec soit pour pouvoir la copier sur le client

Pour configurer le client il faut télécharger putty et stunnel pour Windows. Ensuite in faut installer stunnel et dans le répertoire d installation il faut remplacer la clé “stunnel.pem” par notre clé.

Une fois que la clé est installe il reste plus qu a démarrer stunnel et changer sa config en la remplaçant par :

client = yes
 delay = yes
 [sshtunnel]
 accept = 127.0.0.1:22
 connect = <adresse IP serveur qu on a configurer avant>:443

et on peux ensuite utiliser putty en se connectant a l adresse stunnel : 127.0.0.1:22 et on atterrira sur le serveur distant

Pour AWS EC2 AMI instance

[ec2-user@domU-12-31-39-09-EE-BA stunnel]$ cat stunnel.conf
root = /var/lib/stunnel4/
setuid = stunnel4
setgid = stunnel4
; PID is created inside the chroot jail
pid = /stunnel4.pid

client=no
cert=/etc/stunnel/stunnel.pem
debug=3
sslVersion = all
output=/var/log/stunnel4/stunnel.log
[sslssh]
accept=443
connect=localhost:22

puis

[ec2-user@domU-12-31-39-09-EE-BA stunnel]$ sudo stunnel stunnel.conf

 

 

Capteur meteo terrasse

Création d’un nouveau “end device” pour la terrasse :
20130602_203639

Il est base sur une carte Arduino non officielle : Ultra mini dont j ai déjà parle lors d article précédant. C’est la seule carte arduino que je connais qui est designe pour consommer le moins de courant possible (Cf article précédant) !

La carte consomme moins de 1mA en veille (et monte a 30 environ) lorsqu’elle passe a l état actif pour récupérer la température, humidité, et luminosité. Les données sont ensuite envoyées au système. Grâce a ces nouvelles data j’ai pu supprimer la “crontab” des volets qui ete fixe a 21h00. Maintenant les volets se ferme quand la luminosité extérieur est trop faible 😉

Le plus difficile a été de réduire la consommation de la carte (96mA a l origine avec une carte Arduino Leonardo) a un niveau acceptable pour que le chargeur solaire soit suffisant (1mA en veille et 30mA en émission pendant 5s toutes les 10 minutes). Tout les optimes pour la consomation de courant sont déjà explique dans mon article sur la carte “Mini Ultra +”.

Protection site web par password ET/OU IP

Pour restreindre l’accès aux commandes de mon framework domotique j’utilisai une protection par mot de passe avec lighttpd. J’avais mis cette protection en place en utilisant le tuto disponible ICI.

Le probleme est que l’on doit taper le mot de passe a chaque fois et si je le change je dois le communiquer a mon coloc…. J’ai donc fouiller un peu la doc de lighttpd et je me suis rendu compte qu on pouvait egalement filtrer les acces par adresse IP. Encore plus fort….on peux combiner les 2 solutions !!

Voila donc la nouvelle conf d’acces lighttpd pour proteger la partie admin du framework ou je ne demande pas le mot de passe pour les adresse de mon reseau local (je fais confience au gens qui viennent chez moi 😉 ) et je demande un password pour les acces depuis internet :

$HTTP["remoteip"] !~ "192.168.0.*" {
auth.require = ( "/Sender/" =>
(
"method" => "basic",
"realm" => "Password protected area",
"require" => "user=charles"
)
)
}

ensuite il faut penser a reloader la config avec

/etc/init.d/lighttpd restart

Ajout librarie android studio

Ajout de la lib “guava” a un projet dans android studio en 3 étapes :

1/ Copier le fichier “guava-14.0.1.jar” present dans le repertoire d’installation d android studio “C:\Dev\Android\android-studio\lib” vers le repertoire “lib” du projet courant “C:\Users\charles\AndroidStudioProjects\VoiceRecognition\VoiceRecognition\libs”

2/ Ajouter en tant que library (clique droite sur la library) :

222

3/ Ajouter la lib dans le fichier de dep de graddle :

333

Ensuite ca devrait compiler (sinon il faut faire un clean project)

Installation Android Studio Ubuntu

1/JDK

La premiere etape est l’installation du JDK disponible ici. Il faut choisir la version Linux x64 : jdk-7u21-linux-x64.tar.gz.Une fois que la version est DL il faut le decompresser et le copier :

tar xzvf ~/Downloads/jdk-7u21-linux-x64.tar.gz
mv jdk1.7.0_21/ /usr/lib/jvm/

finalement il reste juste a mettre a jour l environement avec au choix des “export dans le wshenv/profile” ou alors avec “update alternative” :

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.7.0_21/bin/java 1
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.7.0_21/bin/javac 1
sudo update-alternatives --install /usr/bin/javaws javaws /usr/lib/jvm/jdk1.7.0_21/bin/javaws 1
sudo update-alternatives --config java
sudo update-alternatives --config javaws
On peux verifier que tout a ete installe correctement avec :

charles@charles-Fixe:~/Téléchargements$ java -version
java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)
2/ Android studio
Comme pour le SDK….on commence par le DL ici. Ensuite on le decompresse
tar xvzf android-studio-bundle-130.677228-linux.tgz
et on peux le lancer
cd android-studio/bin
charles@charles-Fixe:~/DEV/android-studio/bin$ ./studio.sh
Capture du 2013-05-26 21:55:24

Creation application android pour remplacer « Tasker + Autovoice » – P1

Le but de cet article est de créer une application native android pour remplacer « tasker + autovoice » que j’utilise actuellement pour envoyer des commandes vocales a mon serveur domotique. Le duo « Tasker + Autovoice » marche plutot bien mais je souhaite qq chose d’integrer dans mon framework et surtout de pouvoir le personnaliser un peu plus. En plus je pourrai tester la nouvel IDE de Google pour le DEV android : Android Studio.

android_studio_medium

Android studio est un IDE Android créée par Google et présenté a la communauté lors des Google I/O de mai 2013. Ce nouvel IDE est en version « beta » et peut être une option intéressante en plus du classique « Eclipse + SDK + Plugin ».

Android Studio est telechargable ICI

Les instructions pour l’installation sont sur la meme page et celle ci est assez facile (comparativement a eclipse + plugins) puisque tout est integre. Une seul remarque importante….si le logiciel ne se lance pas apres l instalation lisez ca :

Known issue: On some Windows systems, the launcher script does not find where Java is installed. If you encounter this problem, you need to set an environment variable indicating the correct location.
Select Start menu > Computer > System Properties > Advanced System Properties. Then open Advanced tab > Environment Variables and add a new system variable JAVA_HOME that points to your JDK folder, for example C:\Program Files\Java\jdk1.7.0_21.

Une fois que tous est installe et que l’application fonctionne on doit avoir un display qui ressemble a ca :

1

Ensuite on va installer le driver du samsung galaxy note 2 pour pouvoir installer nos programme sur ce dernier. Cet operation est explique ICI et ICI

J’ai eut un peu de mal parce que je pense qu il manque quelques étapes/explication donc je détail un peu plus. La première chose a faire est d’installer le drivers pour la communication Galaxy-PC. Pour cela il faut aller dans la gestion du SDK « SDK android manager »depuis l’application et dans la partie « Extras » coche « Google USB Driver » et de cliquer sur « instal packages ».

2

Grace a cet operation le driver serva ensuite present dans le folder « <sdk>\extras\google\usb_driver\ «

3

Maintenant que le driver est present sur le disque on peut l’utiliser. Il faut ouvrir le « device manager » de windows. Le « Device manager » peut etre lancer depuis le « control panel → System and security → System »

7

Ensuite dans le device manager il y a le tel android dans “other” :

g1

il faut cliquer sur “update driver” pour le forcer a utiliser le driver qu on a instale juste avant. Ensuite on precise qu on a le driver en choissisant “browse my computer…”

j2

Ensuite il faut faire attention a choisir “Let me pick a list of device….” :

j5

Ensuite il faut cliquer sur le bouton “have disk” et donner le lien vers le path ou est le driver (dans le repertoire du SDK)

h1

et enfin windows propose plusieurs choix. Il faut prendre “Android ADB interface”

tt

Windows risque de vous dire que le driver est pas compatible mais il suffit de faire “oui” a la question “installer quand meme”. Si tout se passe bien le device sera enfin visible dans le device manager comme ci dessous :

tyy

Pour etre sure que l’installation on peut verifier la liste des devices attache avec un utilitaire du SDK android disponible dans le repertoire “android-studio\sdk\platform-tools” : adb.exe. Pour ca on utilise l’invite de commande windows et on lance “adb devices” :

fin

Voila 😉 le device est connecte et peut etre utilise dans “android studio”

 

 

Test carte Rocket scream Mini Ultra +

Cela fait longtemps que je cherche une carte Arduino qui consomme le minimum de courant pour pouvoir la mettre dehors sur batterie…. A force de chercher j’ai trouve une carte spécialement conçue dans cette optique : Rocket scream Mini Ultra +. La carte est disponible en ligne ICI.

dev00054-front

J’ai décidé de la tester avec un petit programme qui fait clignoter une led. Pour avoir un point de référence j’ai uploader le programme sur une arduino leonardo et sur la MiniUltra+.

20130508_100502

Voila la consommation des 2 cartes :

Arduino Leonardo : 48.4 mA
Rocket scream Mini Ultra + : 6.7 mA

La carte consomme 7 fois moins que l’Arduino Leonardo ! Je vais lui ajouter un module Xbee avec un mode sleep et refaire des mesures 😉

Update du 9 Mai :

Si on ajoute un module Xbee la consommation passe de 6.7 mA a 45 mA (ce qui correspond a la datasheet Xbee +40mA). J’ajoute aussi un capteur de lumière qui permettra au système domotique de savoir quand il faut fermer les volets ;). On a donc une consommation de 45 mA…..encore un peu trop a mon gout !

L’étape suivante est de faire dormir le module Xbee en utilisant la broche “DTR” du module. Il faut la mettre a l’état haut pour faire dormir le module et donc diminuer sa consommation (il faut aussi que le module soit configurer en sleep mode PIN). Je fais donc “dormir” le module 5 min puis ensuite l’Arduino allume le module et envoie la valeur de la luminosité. Voila le code :

//Libraries definitions
//Xbee library
#include 
//Deipara library
#include 

//pin guirlande led
const int _OutDebugLed = 8;
const int _OutXbeeWakeUp = 7;
const int _InLightPin = 4;

//Xbee objects
//create Xbee object to control a Xbee
XBee _Xbee = XBee(); 
//Create reusable response objects for responses we expect to handle
ZBRxResponse _ZbRxResp = ZBRxResponse(); 
//Global variable used in the program
int _CmdReceived = 0;
int _DataToSend = 0;

void setup()
{
  // start serial
  _Xbee.begin(XBEE_SPEED); 
  Serial.begin(XBEE_SPEED);
  //defined IO
  pinMode(_OutDebugLed, OUTPUT);
  pinMode(_OutXbeeWakeUp, OUTPUT);
  pinMode(_InLightPin, INPUT);

  digitalWrite(_OutDebugLed, LOW);

  delay(2000);
}

void loop()
{
  //digitalWrite(_OutDebugLed, HIGH);
  digitalWrite(_OutXbeeWakeUp, LOW);
  delay(5000);
  unsigned int val = analogRead(_InLightPin);    // read the input pin
  sendZigBeeMsg2(_Xbee,36,val,COORD_ADDR);
  //digitalWrite(_OutDebugLed, LOW);
  digitalWrite(_OutXbeeWakeUp, HIGH);
  delay(300000);

}

En utilisant ce code la consommation passe de 45 mA a 7mA (avec un petit pic a 30mA toutes les 5 minutes) ! Une dernière optimisation est de faire dormir le micro en plus du module Xbee. Je me suis inspire d’un article dispo ICI. Il s’agit d’utiliser le WatchDog pour réveiller le micro toutes les 8s (on ne peut pas faire plus) et attendre d’avoir fait ça pendant 5 minutes pour ensuite faire le vrai processus. Voila le code :

//Xbee library
#include <XBee.h>
//Deipara library
#include <Deipara.h>
// This library contains functions to set various low-power states for the ATmega328
#include <avr/sleep.h>

// This variable is made volatile because it is changed inside an interrupt function
// Keep track of how many sleep cycles have been completed.
volatile int sleep_count = 0; 
// 75 loop needed since ze sleep for 8s and want to wait 10 minutes
const int sleep_total = 75; 

//pin
const int _OutDebugLed = 8;
const int _InLightPin = 4;
const int _OutXbeeWakeUp = 7;

//Xbee objects
//create Xbee object to control a Xbee
XBee _Xbee = XBee(); 
//Create reusable response objects for responses we expect to handle
ZBRxResponse _ZbRxResp = ZBRxResponse(); 
//Global variable used in the program
int _CmdReceived = 0;
int _DataToSend = 0;

void goToSleep()   
{
  // The ATmega328 has five different sleep states.
  // See the ATmega 328 datasheet for more information.
  // SLEEP_MODE_IDLE -the least power savings 
  // SLEEP_MODE_ADC
  // SLEEP_MODE_PWR_SAVE
  // SLEEP_MODE_STANDBY
  // SLEEP_MODE_PWR_DOWN -the most power savings
  // I am using the deepest sleep mode from which a
  // watchdog timer interrupt can wake the ATMega328
  //digitalWrite(_OutDebugLed, HIGH);

  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode.
  sleep_enable(); // Enable sleep mode.
  sleep_mode(); // Enter sleep mode.
  // After waking from watchdog interrupt the code continues
  // to execute from this point.

  sleep_disable(); // Disable sleep mode after waking.
  //digitalWrite(_OutDebugLed, LOW);                   
}

void watchdogOn() 
{ 
  // Clear the reset flag, the WDRF bit (bit 3) of MCUSR.
  MCUSR = MCUSR & B11110111;

  // Set the WDCE bit (bit 4) and the WDE bit (bit 3) 
  // of WDTCSR. The WDCE bit must be set in order to 
  // change WDE or the watchdog prescalers. Setting the 
  // WDCE bit will allow updtaes to the prescalers and 
  // WDE for 4 clock cycles then it will be reset by 
  // hardware.
  WDTCSR = WDTCSR | B00011000; 

  // Set the watchdog timeout prescaler value to 1024 K 
  // which will yeild a time-out interval of about 8.0 s.
  WDTCSR = B00100001;

  // Enable the watchdog timer interupt.
  WDTCSR = WDTCSR | B01000000;
  MCUSR = MCUSR & B11110111;
}

ISR(WDT_vect)
{
  sleep_count ++; // keep track of how many sleep cycles have been completed.
}

void setup(void) 
{
  // start serial
  _Xbee.begin(XBEE_SPEED); 
  Serial.begin(XBEE_SPEED);
  watchdogOn(); // Turn on the watch dog timer.
  pinMode(_OutDebugLed, OUTPUT);
  pinMode(_OutXbeeWakeUp, OUTPUT);
  pinMode(_InLightPin, INPUT);
}

void loop(void) 
{
  goToSleep(); // ATmega328 goes to sleep for about 8 seconds and continues to execute code when it wakes up

  if (sleep_count == sleep_total) 
    {
    sleep_count = 0;
    // CODE TO BE EXECUTED PERIODICALLY
    //digitalWrite(_OutDebugLed, HIGH);
    digitalWrite(_OutXbeeWakeUp, LOW);
    delay(5000);
    unsigned int val = analogRead(_InLightPin);    // read the input pin
    sendZigBeeMsg2(_Xbee,36,val,COORD_ADDR);
    //digitalWrite(_OutDebugLed, LOW);
    digitalWrite(_OutXbeeWakeUp, HIGH);
  }
}

Avec cet toute derniere version le module (Micro + Xbee) se reveille toutes les 10 minutes pour recuperer la luminosite et l’envoyer au systeme domotique. La consomation finale du module complet est de 4.9mA pendant la veille !! On passe donc d’un montage V1 de 96mA (Arduino Uno + Xbee) a un nouveau module consomant 4.9mA (UltraMini+ et Xbee et sleep mode pour tous).

On a donc diviser la consommation du module par 20!!!!

Update du 17 Mai :

J’ai remarque que la batterie se decharge beaucoup plus vite que prevue….et apres quelques investigations le probleme vient du module Xbee qui ne repasse pas en mode sleep lorsque il est en dehors du reseau ZigBee. En googlant un peu j ai trouve un post similaire sur les forum DIGI (constructeur du Xbee) :

XBee S2 end device goes crazy when coordinator loses power

“The Xbee product manual states that when an end device loses contact with it’s parent, the end device will poll for the parent, and if no reply is received in three polls the unit will go into a search for network mode.

I find that with Xbee S2 modems (that came in several L/H/T sensors I purchased), when the coordinator inadvertently loses power the end device modem instead starts a rapid fire output of data requests (assumed to be polls) at approximately 5ms intervals for indeterminate amounts of time, a minimum of 30+ seconds. In some instances the polling appears to never stop. In some instances the polling finally stops and a beacon request is sent as a start to a network search.”

Dans mon cas il est possible que le module soit hors réseau pendant un moment (je coupe les modules quand je ne suis pas a la maison)…. Il s’agit d un bug qui est normalement corriger dans les derniers firmware (j ai pourtant mis a jour les modules mais le pb continue).

J’ai donc decider de ne plus utiliser le “sleep mode” des modules et de simplement les alimenter a la demande avec 2 broches de la platine Arduino. J’ai applique la meme methode a tous les autres capteurs de la platine (Temperature, Humidite, et luminosite). Il ne sont alimenter que toutes les X minutes pour effectuer les mesures et les envoyer a la centrale. Voila la derniere version du code :

//Xbee library
#include <XBee.h>
//Deipara library
#include <Deipara.h>
// This library contains functions to set various low-power states for the ATmega328
#include <avr/sleep.h>
//RHT03 library
#include <DHT22.h>

// This variable is made volatile because it is changed inside an interrupt function
// Keep track of how many sleep cycles have been completed.
volatile int sleep_count = 0; 
// 75 loop needed since ze sleep for 8s and want to wait 10 minutes
//const int sleep_total = 75; 
const int sleep_total = 60; 

//pin
const int _InPinDht22 = 6;
const int _OutPowerLightSensor = 7;
const int _OutXbeePower1 = 8;
const int _OutXbeePower2 = 9;
const int _OutPowerDHT22 = 10;
const int _InLightPin = 4;

//Xbee objects
//create Xbee object to control a Xbee
XBee _Xbee = XBee(); 
//Create reusable response objects for responses we expect to handle
ZBRxResponse _ZbRxResp = ZBRxResponse();
//Setup a DHT22 instance
DHT22 _Dht22(_InPinDht22); //Setup a DHT22 instance 
//Global variable used in the program
int _CmdReceived = 0;
int _DataToSend = 0;

void goToSleep()   
{
  // The ATmega328 has five different sleep states.
  // See the ATmega 328 datasheet for more information.
  // SLEEP_MODE_IDLE -the least power savings 
  // SLEEP_MODE_ADC
  // SLEEP_MODE_PWR_SAVE
  // SLEEP_MODE_STANDBY
  // SLEEP_MODE_PWR_DOWN -the most power savings
  // I am using the deepest sleep mode from which a
  // watchdog timer interrupt can wake the ATMega328
  //digitalWrite(_OutDebugLed, HIGH);

  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode.
  sleep_enable(); // Enable sleep mode.
  sleep_mode(); // Enter sleep mode.
  // After waking from watchdog interrupt the code continues
  // to execute from this point.

  sleep_disable(); // Disable sleep mode after waking.
  //digitalWrite(_OutDebugLed, LOW);                   
}

void watchdogOn() 
{ 
  // Clear the reset flag, the WDRF bit (bit 3) of MCUSR.
  MCUSR = MCUSR & B11110111;

  // Set the WDCE bit (bit 4) and the WDE bit (bit 3) 
  // of WDTCSR. The WDCE bit must be set in order to 
  // change WDE or the watchdog prescalers. Setting the 
  // WDCE bit will allow updtaes to the prescalers and 
  // WDE for 4 clock cycles then it will be reset by 
  // hardware.
  WDTCSR = WDTCSR | B00011000; 

  // Set the watchdog timeout prescaler value to 1024 K 
  // which will yeild a time-out interval of about 8.0 s.
  WDTCSR = B00100001;

  // Enable the watchdog timer interupt.
  WDTCSR = WDTCSR | B01000000;
  MCUSR = MCUSR & B11110111;
}

ISR(WDT_vect)
{
  sleep_count ++; // keep track of how many sleep cycles have been completed.
}

void setup(void) 
{
  pinMode(_OutPowerLightSensor, OUTPUT);
  pinMode(_OutPowerDHT22, OUTPUT);
  pinMode(_OutXbeePower1, OUTPUT);
  pinMode(_OutXbeePower2, OUTPUT);
  pinMode(_InLightPin, INPUT);

  digitalWrite(_OutPowerLightSensor, LOW);
  digitalWrite(_OutPowerDHT22, LOW);
  digitalWrite(_OutXbeePower1, LOW);
  digitalWrite(_OutXbeePower2, LOW);

  // start serial
  _Xbee.begin(XBEE_SPEED); 
  Serial.begin(XBEE_SPEED);

  delay(500);

  watchdogOn(); // Turn on the watch dog timer.
}

void loop(void) 
{
  goToSleep(); // ATmega328 goes to sleep for about 8 seconds and continues to execute code when it wakes up

  if (sleep_count > sleep_total) 
    {
    sleep_count = 0;
    //First we power the Xbee so it has time to reach the network and the other captor
    digitalWrite(_OutXbeePower1, HIGH);
    digitalWrite(_OutXbeePower2, HIGH);
    digitalWrite(_OutPowerDHT22, HIGH);
    digitalWrite(_OutPowerLightSensor, HIGH);
    //Then wait 0.5s to be ready 
    delay(1000);
    //we read the light sensor value
    unsigned int aLightValue = analogRead(_InLightPin);
    //we turn it off
    digitalWrite(_OutPowerLightSensor, LOW);
    delay(2000);
    //Then read T
    DHT22_ERROR_t errorCode;
    errorCode = _Dht22.readData();
    int aTempValue=_Dht22.getTemperatureCAsInt();
    int aHumidityValue=_Dht22.getHumidityAsInt();

    digitalWrite(_OutPowerDHT22, LOW);

    //we wait few second to be sure Xbee reach the network
    delay(3000);
    //we send the info
    sendZigBeeMsg2(_Xbee,36,aLightValue,COORD_ADDR);
    delay(50);
    sendZigBeeMsg2(_Xbee,37,aTempValue,COORD_ADDR);
    delay(50);
    sendZigBeeMsg2(_Xbee,38,aHumidityValue,COORD_ADDR);
    //we turn off the xbee module
    digitalWrite(_OutXbeePower1, LOW);
    digitalWrite(_OutXbeePower2, LOW);
  }
}

Grâce a ce nouveau code/design le module ne consomme que 1.6mA en veille et aux alentours de 40mA lorsqu’il se réveille pour effectuer les mesures toutes les X minutes (toutes les 9 minutes pour l instant). Voila une photo du montage final :

20130517_113148

Premier vol en autogire

Smart tableau – nouveau End Device pour mon system domotique

J’ai décidé d’ajouter un nouveau « end device » dans le système pour pouvoir mesure/contrôler certains éléments de la cuisine.

Cadre_avant

Les fonctions de ce nouveau « end device » sont :

  • Détection de personne (capteur PIR)
  • Détecteur de fumée (démontage d’un détecteur de fumée du commerce)
  • Mesure Température et humidité

L’ensemble des capteurs est monte à l’arrière d’un cadre qui est pose dans la cuisine au-dessus des rangements. Le capteur de fumée est donc très prêt du plafond pour être sur qu’il détectera bien un incendie.

L’ensemble du montage communique par ZigBee avec le coordinateur. Ensuite le coordinateur transmet les infos au « brain » au travers d’une liaison série USB (exactement comme les autres devices).

Le « brain » python doit donc maintenant être capable de comprendre ce nouveau device pour, par exemple, prévenir de la détection d’un incendie.

Ceci est très simple grâce au design du system domotique puisque le « détecteur incendie » correspond parfaitement à un device de type « interrupteur stable » et donc il suffit de rajouter dans le « brain » une nouvelle action pour cet interrupteur stable en particulier. On ajoute donc :

if ((aOneDevice.id == 2) and (aOneDevice.currentStatus=="unstable")):
 sendEmailFireDetected()

dans la boucle des détections évènements trigger par les interrupteurs stable :

#Step 1 : Verifier tous les detecteurs (interupteurs stables) pour voir si ils ont ete actives et prendre les actions correspondantes avant de les reset
        #Par exemple si le detecteur de fumee a ete active alors on va envoyer un mail 
        logging.info("Checking all possible event")
        for aOneDevice in iListOfDevice.registeredDevices:
            logging.debug("checking event : " + str(aOneDevice.id))
            if ((aOneDevice.id == 2) and (aOneDevice.currentStatus=="unstable")):
                sendEmailFireDetected()
            elif ((aOneDevice.id == 10) and (aOneDevice.currentStatus=="unstable")):
                self.PeopleDetectedEntree(iListOfDevice)
            elif ((aOneDevice.id == 9) and (aOneDevice.currentStatus=="unstable")):
                self.PeopleDetectedCharlesRoom(iListOfDevice)
            aOneDevice.reset()

Ensuite il ne reste plus qu’à créer la fonction « send fire detection » pour prévenir l’utilisateur qu’un incendie a été détecté. Pour le moment on se contente d’envoyer un email mais dans l’avenir on peut simplement faire évoluer cette action avec par exemple un appel automatique au pompier

L’envoie de l’email est assure par la fonction suivante :

def sendEmailFireDetected():
 '''Envoie email lors de la detection incendie'''
 logging.error("Envoi email detection incendie")
 # Define email addresses to use
 addr_to = Config["addr_to"]
 addr_from = Config["addr_from"]
 # Define SMTP email server details
 smtp_server = Config["smtp_server"]
 smtp_user = Config["smtp_user"]
 smtp_pass = Config["smtp_pass"]

 # Construct email
 expires = datetime.datetime.now()
 msg = MIMEText('Fire detected at ' + str(expires))
 msg['To'] = addr_to
 msg['From'] = addr_from
 msg['Subject'] = 'Fire alarm'

 # Send the message via an SMTP server
 s = smtplib.SMTP(smtp_server, 587)
 s.login(smtp_user,smtp_pass)
 s.sendmail(addr_from, addr_to, msg.as_string())
 s.quit()

Shutdown a distance depuis un PC linux (raspbery Pi)

Il y a qq temps j’ai mis en place une solution de WOL pour démarrer mon PC Windows 7 depuis le Raspberry Pi (le but étant que mon système domotique le démarre automatiquement quand je rentre du travail le soir).

Cela fonctionne bien et j’ai récemment découvert que le shutdown à distance été aussi possible et que sa mise en place n’est pas si difficile que ça….. Tout cela grâce au blog de Michael http://michael.venez.fr/ qui contient toutes les étapes nécessaires.

Pour résumer il faut bien penser à installer les packages nécessaire sur le Raspberry Pi (samba + samba common ). Ensuite il faut activer le RPC sur windows 7 (désactive par défaut pour des raisons de sécurité) grâce a la procédure décrite ici http://www.howtogeek.com/howto/windows-vista/enable-mapping-to-hostnamec-share-on-windows-vista/

Une fois que tout ceci est mis en place on peut arrêter le PC windows 7 à distance avec :

net rpc shutdown -f -I 192.168.0.7 -U user%user_password

Merci encore Michael pour le tuto sur son site.