Vue normale

Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.
À partir d’avant-hierMagdiBlog

RaspiCamAero : Aéronautique de loisir, caméra sur piste et informations METAR (màj déc 2016)

Par : Olivier
7 décembre 2016 à 15:43

materiel2

MàJ déc 2016 : changement de nom de domaine pour le projet qui devient www.cam-aero.eu

Il fait beau et chaud, les vacances d’été ne sont plus très loin. Le temps parfait pour les activités de plein air. Ca tombe bien, aujourd’hui je vais vous présenter un projet réalisé pour le site www.cam-aero.eu, en partenariat avec MagdiBlog.fr, qui ravira les amateurs d’aéronautique de loisir 🙂

L’objectif de ce projet est de doter tous les aérodromes d’un module caméra qui prend des photos de la piste et de la météo ambiante à intervalles réguliers tout en incrustant la date, l’heure et les informations météorologiques locales (telles que METAR, TAF, SIGMET) dans l’image.

Voici un aperçu d’une image d’un aérodrome dans la région de Brest :

IroiseAF-1024x768

L’ensemble des images de tous les aérodromes équipés sont collectées et stockées sur un serveur central. Toutes les images et informations météorologiques locales sont ensuite consultables par tous les membres ; ce qui leur permet de mieux préparer leurs vols, par exemple, en connaissant l’état de l’aérodrome de destination.

Un système collaboratif simple, économique, à la porté de tous (Le module s’installe sur une fenêtre avec une ventouse et nécessite une simple connexion Internet. L’installation du logiciel et sa configuration se font en une seule ligne de commande), qui permettra à tous les aérodromes de partager une vue de leur piste et leurs informations METAR facilement 🙂

Le système complet est réalisé avec des Raspberry Pi, sans composants particuliers :

N’hésitez pas à partager l’info et à promouvoir ce projet autour de vous 🙂

Je vous laisse découvrir le projet sur le site officiel : www.cam-aero.eu

L’article RaspiCamAero : Aéronautique de loisir, caméra sur piste et informations METAR (màj déc 2016) est apparu en premier sur MagdiBlog.

MagdiBlog dans le CanardPC Hardware Hors Série n°7 spécial électronique

Par : Olivier
21 novembre 2016 à 19:14

cpchhs7

CanardPC vient de sortir un numéro spécial dédié au Raspberry Pi et Arduino et à l’électronique en général. Je vous invite à le choper tant qu’il est toujours dispo chez votre libraire 🙂

Voici l’édito : http://www.canardpc.com/cpc-hardware-hs-n7-special-electronique-disponible.html

Le dernier article de ce numéro est consacré à la téléinfo EDF avec une mention spéciale à l’article de MagdiBlog : Téléinfo EDF – Suivi conso de votre compteur électrique

Etant moi même un grand fan de CanardPC depuis de nombreuses années, c’est pour moi une véritable consécration 🙂

 

 

L’article MagdiBlog dans le CanardPC Hardware Hors Série n°7 spécial électronique est apparu en premier sur MagdiBlog.

Téléinfo EDF – Suivi conso de votre compteur électrique (màj 08/2016)

Par : Olivier
3 août 2016 à 09:06

teleinfo_edf_conso_electrique

MAJ août 2016 : Depuis la parution de cet article en septembre 2014 (bientôt 2 ans Oo), de nombreuses évolutions ont été faites sur les Raspberry Pi et Raspbian. Grâce aux retours d’expériences de plusieurs lecteurs et à leur participation, cet article est aujourd’hui mis à jour 🙂 Un gros merci à Arnaud (qui se reconnaîtra) qui m’a notamment envoyé de nombreuses informations sur les modifcations relatives à Raspbian Jessie et au RPi3 🙂

Vous pouvez notamment télécharger les versions revues et corrigées des scripts PHP par Arnaud, ici : teleinfo.zip


A l’ère de la domotique et des économies d’énergie, le suivi de la consommation d’électricité dans nos maison devient un point incontournable. Détecter les appareils électriques gourmands, optimiser sa consommation en jouant sur les tarifs heures creuses/pleines, opter pour des ampoules à économie d’énergie et couper ses équipements multimédia lorsqu’on ne s’en sert pas : autant de gestes qui prennent sens à partir du moment où l’on peut en mesurer l’effet sur sa facture EDF.

Dans cet article, nous allons explorer une méthode très simple pour collecter et analyser les informations de notre compteur EDF et les représenter sur un graphique. Comme toujours sur magdiblog.fr, nous utiliserons un Raspberry Pi pour construire ce petit système 🙂

Téléinfo EDF, qu’est ce que c’est ?

Depuis quelques années, EDF a ajouté à ses compteurs électriques domestiques la possibilité de lire à distance les informations enregistrées (consommation heures creuses/pleines, consommation instantanée, intensité max, etc…). Ceci permet, entre autre, de renvoyer les informations vers votre coffret EDF extérieur afin que les agents EDF puissent effectuer le relevé de consommation (et donc établir une facture) sans avoir à accéder à votre compteur à l’intérieur de votre maison. Les compteurs compatibles disposent de deux bornes I1 et I2, permettant de récupérer directement les informations sur un bus UART-TTL 🙂

Pour plus d’informations sur la téléinfo EDF et son mode de fonctionnement, vous pouvez consulter le document « Sorties de télé-information client des appareils de comptage électroniques utilisés par ERDF« , publié par EDF et disponible ici : ERDF-NOI-CPT_02E.pdf

GPIO et optocoupleur

La première étape consiste à créer le petit circuit électronique qui fera l’interface entre le GPIO du Raspberry Pi et le compteur EDF. Il s’agit simplement de « démoduler » le signal sortant des bornes I1 et I2 du compteur,  à l’aide d’un optocoupleur et d’une paire de résistances. Le circuit est ensuite relié a la broche UART du GPIO du Raspberry Pi ce qui nous permettra de récupérer les trames de données du compteur EDF.

Pour cette partie, je me suis largement inspiré de cet article très synthétique : http://lhuet.github.io/blog/2014/01/montage-teleinfo.html

Matériel nécessaire

  • SFH620A-pinoutoptocoupleur SFH620A
  • résistance 1.2 kΩ
  • résistance 3.3 kΩ
  • une carte d’expérimentation ou « breadbord »
  • des câbles « wire jumper »
  • une plaque epoxy

Montage et branchement

Voici un schéma électronique du circuit qui est très répandu sur la toile :

teleinfo_schemaCe qui nous donne un montage très simple à réaliser :

IMG_7732

Voici ce que ça donne avec un petit bout d’epoxy :

IMG_7734

Le branchement sur le port GPIO du Pi est également très simple. On utilise l’alimentation 3,3V du GPIO (fil rouge), la masse du GPIO (fil noir) et la broche 15 RXD (fil jaune).

IMG_7909Pour plus de détails sur le port GPIO du Pi, je vous invite à consulter cet article : http://www.magdiblog.fr/gpio/gpio-entree-en-matiere/

Il ne reste qu’à connecter les deux fils bleus (ou blanc et bleu, que vous pouvez utiliser dans n’importe quel sens) aux bornes I1 et I2 du compteur EDF (généralement en bas à droite) :

IMG_8250Et voilà 🙂 A ce stade, votre Raspberry Pi est bombardé en continu par les infos envoyées par votre compteur EDF 🙂

Récupération des données

MAJ août 2016 : Depuis la parution de Raspbian Jessie :

Dans le fichier /boot/cmdline.txt :

- supprimer la ligne :
console=serial0,115200
- ajouter la ligne : 
enable_uart=1

Inutile de modifier le fichier /etc/inittab.

Sur Raspberry Pi3, l’UART PL011 (full UART) du BCM2837 a été ré-alloué au WLAN/BT combo. Et le mini UART est mis à disposition des utilisateurs (sous le nom de /dev/ttyS0).

Il faut donc configurer /dev/ttyS0 (à la place de /dev/ttyAMA0) et remplacer /dev/ttyAMA0 par /dev/ttyS0 à la ligne 10 de teleinfo_func.php. (voir plus bas)

Pour plus d’information sur ces changements : http://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3/

Pour les anciennes versions de Raspbian :

Dans un premier temps il convient d’activer le port série du Raspberry Pi :

Dans le fichier /boot/cmdline.txt :

- supprimer les paramètres suivants :
console=ttyAMA0,115200 kgdboc=ttyAMA0,115200

Puis dans le fichier /etc/inittab :

- commentez la ligne suivante (tout en bas du fichier) en ajoutant un # devant :
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Redémarrer votre Raspberry Pi :

shutdown -r now

Enfin, pour créer un périphérique idoine et configurer le port série de manière à récupérer correctement les informations  :

stty -F /dev/ttyAMA0 1200 sane evenp parenb cs7 -crtscts

A ce stade, vous devriez avoir un périphérique /dev/ttyAMA0 qui renvoi l’ensemble des données émises par votre compteur EDF.
En faisant un cat sur ce fichier, vous devriez voir défiler vos données de consommation EDF 🙂

cat /dev/ttyAMA0

capture_teleinfoNote : Si vous n’avez que des lignes du type ADCO 012345678945 ?, il se peut que la téléinfo ne soit pas activée sur votre compteur. Il vous suffit normalement de faire une demande à EDF pour l’activer.

Données de la téléinfo EDF

Comme indiqué dans le document « Sorties de télé-information client des appareils de comptage électroniques utilisés par ERDF« , publié par EDF et disponible ici : ERDF-NOI-CPT_02E.pdf, et selon votre type d’abonnement EDF, vous pouvez récupérer les informations suivantes :

  • ADCO : Identifiant du compteur
  • OPTARIF : Option tarifaire (type d’abonnement)
  • ISOUSC : Intensité souscrite
  • BASE : Index si option = base (en Wh)
  • HCHC : Index heures creuses si option = heures creuses (en Wh)
  • HCHP : Index heures pleines si option = heures creuses (en Wh)
  • EJP HN : Index heures normales si option = EJP (en Wh)
  • EJP HPM : Index heures de pointe mobile si option = EJP (en Wh)
  • BBR HC JB : Index heures creuses jours bleus si option = tempo (en Wh)
  • BBR HP JB : Index heures pleines jours bleus si option = tempo (en Wh)
  • BBR HC JW : Index heures creuses jours blancs si option = tempo (en Wh)
  • BBR HC JW : Index heures pleines jours blancs si option = tempo (en Wh)
  • BBR HC JR : Index heures creuses jours rouges si option = tempo  (en Wh)
  • BBR HP JR : Index heures pleines jours rouges si option = tempo (en Wh)
  • PEJP : Préavis EJP si option = EJP 30mn avant période EJP
  • PTEC : Période tarifaire en cours
  • DEMAIN : Couleur du lendemain si option = tempo
  • IINST : Intensité instantanée (en ampères)
  • ADPS : Avertissement de dépassement de puissance souscrite (en ampères)
  • IMAX : Intensité maximale (en ampères)
  • PAPP : Puissance apparente (en Volt.ampères)
  • HHPHC : Groupe horaire si option = heures creuses ou tempo
  • MOTDETAT : Mot d’état (autocontrôle)

Une trame commence toujours par l’étiquette ADCO et se termine par le MOTDETAT.

Chaque message, ou ligne, d’une trame est formé de la manière suivante :

ETIQUETTE espace VALEUR espace CHECKSUM

Seules l’ETIQUETTE et la VALEUR nous seront utiles. La CHEKSUM, ou somme de contrôle sert uniquement à vérifier l’intégrité que la trame.

Données utiles

Avant d’aller plus loin, il convient de faire le point sur les données récupérées. AMHA, seules deux informations sont réellement intéressantes à observer :

  • la puissance instantanée en Watts (permet de voir sa consommation de « courant » au cours de la journée)
  • la consommation d’électricité en Wh servant d’élément de facturation à EDF (permet de voir sa consommation global par jour/mois/année en fonction des périodes tarifaires)

Petit détail technique, ces informations ne sont pas directement disponibles ; il va falloir les déduire des données remontées par la téléinfo. Et c’est là que j’en profite pour remercier mon cher cousin Vincent pour m’avoir éclairé sur la subtilité de la chose. Merci Vincent 😉

En effet, la téléinfo ne vous montre que la puissance apparente en Volt.Ampère (étiquette PAPP dans la trame). Rien à voir avec la puissance active en Watts ! Non monsieur ! Enfin presque ! Nous connaissons tous cette formule de puissance :

P = U x I (puissance en watt = tension en Volt X intensité en Ampère)

Seulement voilà, cette formule n’est valable qu’en courant continu… En courant alternatif, tel que délivré par EDF/ERDF, il faut multiplier ce résultat par un facteur de puissance appelé cos phi… Le problème, c’est que ce facteur de puissance est variable en fonction des appareils électriques qui consomment du courant dans votre maison… Rapport à un problème de phase d’après les experts… ^^ Pour les plus courageux d’entre vous, je vous conseille cet article qui explique très bien le pourquoi du comment de la chose : http://www.energieplus-lesite.be/index.php?id=11495

M’enfin bref, revenons à notre téléinfo. Nous n’avons donc pas directement la puissance active en Watt, mais, nous avons l’intensité instantanée en Ampère ! Il nous suffira donc de multiplier ce nombre par 230V (ou 220V, ou 240V, selon que vous soyez proche ou non du transformateur) pour avoir une puissance instantanée en Watt 🙂 Nous aurons ainsi une idée approximative de la puissance instantanée consommée par tous les appareils de notre maison, ce qui nous permettra par exemple de constater que le chauffe eau fonctionne de telle heure à telle heure, que télé éteinte, on consomme 250W de moins, et que « Oh mon Dieu !!! » une plaque de cuisson ça consomme à MOOOOOOOOORRRRRTTT, 6000 W !!!

En ce qui concerne la consommation quotidienne de courant en Wh, nous devrons également ruser car la téléinfo ne donne que le nombre total de Wh consommés depuis l’installation de votre compteur. Pour avoir la consommation sur une journée, il va donc falloir faire la différence entre le nombre total de Wh consommées ce jour et le nombre total de Wh consommés la veille. Rien de bien méchant donc 🙂

Voyons maintenant comment procéder pour récupérer et traiter ces données à l’aide de scripts PHP et d’une base de données SQLite. Nous utiliserons ensuite la librairie graphique Google Chart pour tracer de jolies courbes de notre consommation d’électricité 🙂

Traitement des données et création d’un graphique de suivi

Le principe général est simple : un script PHP est exécuté à intervalles réguliers (toutes les minutes pour la puissance instantanée, et une fois par jour pour la consommation quotidienne en Wh), récupère les données de la téléinfo puis les stocks dans une base de données SQLite. Dans un second temps, une page web PHP/HTML lit les infos dans la base de données SQLite et affiche les graphiques.

  • teleinfo_func.php : script PHP qui contient les fonctions nécessaires aux différents scripts.
<?php

  $sqlite = 'teleinfo.sqlite';

  //
  //  renvoie une trame teleinfo complete sous forme d'array
  //
  function getTeleinfo () {

    $handle = fopen ('/dev/ttyACM0', "r"); // ouverture du flux

    while (fread($handle, 1) != chr(2)); // on attend la fin d'une trame pour commencer a avec la trame suivante

    $char  = '';
    $trame = '';
    $datas = '';

    while ($char != chr(2)) { // on lit tous les caracteres jusqu'a la fin de la trame
      $char = fread($handle, 1);
      if ($char != chr(2)){
        $trame .= $char;
      }
    }

    fclose ($handle); // on ferme le flux

    $trame = chop(substr($trame,1,-1)); // on supprime les caracteres de debut et fin de trame

    $messages = explode(chr(10), $trame); // on separe les messages de la trame

    foreach ($messages as $key => $message) {
      $message = explode (' ', $message, 3); // on separe l'etiquette, la valeur et la somme de controle de chaque message
      if(!empty($message[0]) && !empty($message[1])) {
        $etiquette = $message[0];
        $valeur    = $message[1];
        $datas[$etiquette] = $valeur; // on stock les etiquettes et les valeurs de l'array datas
      }
    }

    return $datas;

  }

  //
  //  enregistre la puissance instantanée en V.A et en W
  //
  function handlePuissance () {
    global $sqlite;
    $db = new SQLite3($sqlite);
    $db->exec('CREATE TABLE IF NOT EXISTS puissance (timestamp INTEGER, hchp TEXT, va REAL, iinst REAL, watt REAL);'); // cree la table puissance si elle n'existe pas

    $trame = getTeleinfo (); // recupere une trame teleinfo

    $datas = array();
    $datas['timestamp'] = time();
    $datas['hchp']      = substr($trame['PTEC'],0,2); // indicateur heure pleine/creuse, on garde seulement les carateres HP (heure pleine) et HC (heure creuse)
    $datas['va']        = preg_replace('`^[0]*`','',$trame['PAPP']); // puissance en V.A, on supprime les 0 en debut de chaine
    $datas['iinst']     = preg_replace('`^[0]*`','',$trame['IINST']); // intensité instantanée en A, on supprime les 0 en debut de chaine
    $datas['watt']      = $datas['iinst']*220; // intensite en A X 220 V

    if($db->busyTimeout(5000)){ // stock les donnees
      $db->exec("INSERT INTO puissance (timestamp, hchp, va, iinst, watt) VALUES (".$datas['timestamp'].", '".$datas['hchp']."', ".$datas['va'].", ".$datas['iinst'].", ".$datas['watt'].");");
    }

    return 1;
  }

  //
  //  enregistre la consommation en Wh
  //
  function handleConso () {
    global $sqlite;
    $db = new SQLite3($sqlite);
    $db->exec('CREATE TABLE IF NOT EXISTS conso (timestamp INTEGER, total_hc INTEGER, total_hp INTEGER, daily_hc REAL, daily_hp REAL);'); // cree la table conso si elle n'existe pas

    $trame     = getTeleinfo (); // recupere une trame teleinfo

    $today     = strtotime('today 00:00:00');
    $yesterday = strtotime("-1 day 00:00:00");

    // recupere la conso totale enregistree la veille pour pouvoir calculer la difference et obtenir la conso du jour
    if($db->busyTimeout(5000)){
      $previous = $db->query("SELECT * FROM conso WHERE timestamp = '".$yesterday."';")->fetchArray(SQLITE3_ASSOC);
    }
    if(empty($previous)){
      $previous = array();
      $previous['timestamp'] = $yesterday;
      $previous['total_hc']  = 0;
      $previous['total_hp']  = 0;
      $previous['daily_hc']  = 0;
      $previous['daily_hp']  = 0;
    }

    $datas = array();
    $datas['query']     = 'hchp';
    $datas['timestamp'] = $today;
    $datas['total_hc']  = preg_replace('`^[0]*`','',$trame['HCHC']); // conso total en Wh heure creuse, on supprime les 0 en debut de chaine
    $datas['total_hp']  = preg_replace('`^[0]*`','',$trame['HCHP']); // conso total en Wh heure pleine, on supprime les 0 en debut de chaine

    if($previous['total_hc'] == 0){
      $datas['daily_hc'] = 0;
    }
    else{
      $datas['daily_hc']  = ($datas['total_hc']-$previous['total_hc'])/1000; // conso du jour heure creuse = total aujourd'hui - total hier, on divise par 1000 pour avec un resultat en kWh
    }

    if($previous['total_hp'] == 0){
      $datas['daily_hp'] = 0;
    }
    else{
      $datas['daily_hp']  = ($datas['total_hp']-$previous['total_hp'])/1000; // conso du jour heure pleine = total aujourd'hui - total hier, on divise par 1000 pour avec un resultat en kWh
    }

    if($db->busyTimeout(5000)){ // stock les donnees
      $db->exec("INSERT INTO conso (timestamp, total_hc, total_hp, daily_hc, daily_hp) VALUES (".$datas['timestamp'].", ".$datas['total_hc'].", ".$datas['total_hp'].", ".$datas['daily_hc'].", ".$datas['daily_hp'].");");
    }
  }

  //
  //  recupere les donnees de puissance des $nb_days derniers jours et les met en forme pour les affichers sur le graphique
  //
  function getDatasPuissance ($nb_days) {
    global $sqlite;
    $months    = array('01' => 'janv', '02' => 'fev', '03' => 'mars', '04' => 'avril', '05' => 'mai', '06' => 'juin', '07' => 'juil', '08' => 'aout', '09' => 'sept', '10' => 'oct', '11' => 'nov', '12' => 'dec');
    $now  = time();
    $past = strtotime("-$nb_days day", $now);

    $db = new SQLite3($sqlite);
    $results = $db->query("SELECT * FROM puissance WHERE timestamp > $past ORDER BY timestamp ASC;");

    $sums = array();
    $days = array();
    $datas = array();

    while($row = $results->fetchArray(SQLITE3_ASSOC)){
      $year   = date("Y", $row['timestamp']);
      $month  = date("n", $row['timestamp']-1);
      $day    = date("j", $row['timestamp']);
      $hour   = date("G", $row['timestamp']);
      $minute = date("i", $row['timestamp']);
      $second = date("s", $row['timestamp']);
      $datas[] = "[{v:new Date($year, $month, $day, $hour, $minute, $second), f:'".date("j", $row['timestamp'])." ".$months[date("m", $row['timestamp'])]." ".date("H\hi", $row['timestamp'])."'}, {v:".$row['va'].", f:'".$row['va']." V.A'}, {v:".$row['watt'].", f:'".$row['watt']." kW'}]";

    }

    return implode(', ', $datas);
  }

  //
  //  recupere les donnees de consommation des $nb_days derniers jours et les met en forme pour les affichers sur le graphique
  //
  function getDatasConso ($nb_days) {
    global $sqlite;
    $months    = array('01' => 'janv', '02' => 'fev', '03' => 'mars', '04' => 'avril', '05' => 'mai', '06' => 'juin', '07' => 'juil', '08' => 'aout', '09' => 'sept', '10' => 'oct', '11' => 'nov', '12' => 'dec');
    $now  = time();
    $past = strtotime("-$nb_days day", $now);

    $db = new SQLite3($sqlite);
    $results = $db->query("SELECT * FROM conso WHERE timestamp > $past ORDER BY timestamp ASC;");

    $datas = array();

    while($row = $results->fetchArray(SQLITE3_ASSOC)){
      $day    = date("j", $row['timestamp'])." ".$months[date("m", $row['timestamp'])];
      $datas[] = "['".$day."', {v:".$row['daily_hp'].", f:'".$row['daily_hp']." kWh'}, {v:".$row['daily_hc'].", f:'".$row['daily_hc']." kWh'}]";
    }

    return implode(', ', $datas);
  }

?>
    • teleinfo_puissance.php : script PHP exécuté toutes les minutes pour enregistrer la puissance instantanée en V.A et en W.
#!/usr/bin/php5
<?php

header('Content-type: text/html; charset=utf-8');

require_once('/root/teleinfo/teleinfo_func.php');

handlePuissance();

?>
  • teleinfo_conso.php : script PHP exécuté tous les jours juste avant minuit pour enregistrer la consommation en Wh.
#!/usr/bin/php5
<?php

header('Content-type: text/html; charset=utf-8');

require_once('/root/teleinfo/teleinfo_func.php');

handleConso();

?>
  • teleinfo_graph.php : page PHP/HTML qui permet d’afficher les deux graphiques
<?php require_once('teleinfo_func.php'); ?>

<script type="text/javascript" src="https://www.google.com/jsapi"></script>

<div id="puissance">
  <div id="chart_div"></div>
  <div id="filter_div"></div>
</div>
<div id="conso"></div>


<script type="text/javascript">
  google.load('visualization', '1.0', {'packages':['controls']});
  google.setOnLoadCallback(drawDashboard);
  
  function drawDashboard() {

    var data = new google.visualization.DataTable();
        data.addColumn('date', 'Date');
        data.addColumn('number', 'V.A');
        data.addColumn('number', 'kW');
        data.addRows([<?php echo getDatasPuissance (5); ?>]);

    var dashboard = new google.visualization.Dashboard(
            document.getElementById('puissance'));

    var rangeSlider = new google.visualization.ControlWrapper({
          'controlType': 'ChartRangeFilter',
          'containerId': 'filter_div',
          'options': {
             filterColumnLabel : 'Date',
             ui : {chartType: 'LineChart', chartOptions: {
                             height : 80,
                             backgroundColor: '#FFF',
                             colors : ['#375D81', '#ABC8E2'],
                             curveType : 'function',
                             focusTarget : 'category',
                             lineWidth : '1',
                             'legend': {'position': 'none'},
                             'hAxis': {'textPosition': 'in'},
                             'vAxis': {
                               'textPosition': 'none',
                               'gridlines': {'color': 'none'}
                             }
                 }}
          }
        });
        
    var lineChart = new google.visualization.ChartWrapper({
          'chartType': 'LineChart',
          'containerId': 'chart_div',
          'options': {
                             title: '',
                             height : 400,
                             backgroundColor: '#FFF',
                             colors : ['#375D81', '#ABC8E2'],
                             curveType : 'function',
                             focusTarget : 'category',
                             lineWidth : '1',
                             legend : {position: 'bottom',  alignment: 'center', textStyle: {color: '#333', fontSize: 16}},
                             vAxis : {textStyle : {color : '#555', fontSize : '16'}, gridlines : {color: '#CCC', count: 'auto'}, baselineColor : '#AAA', minValue : 0},
                             hAxis : {textStyle : {color : '#555'}, gridlines : {color: '#DDD'}}
          }
        });

    dashboard.bind(rangeSlider, lineChart);
    dashboard.draw(data);

  }
  
  google.load("visualization", "1", {packages:["corechart"]});
  google.setOnLoadCallback(drawChart);
  
  function drawChart() {
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'Date');
    data.addColumn('number', 'Heures pleines');
    data.addColumn('number', 'Heures creuses');
    data.addRows([<?php echo getDatasConso (365); ?>]);
    var options = {
                   title: '',
                   height : 200,
                   backgroundColor: '#FFF',
                   colors : ['#375D81', '#ABC8E2'],
                   curveType : 'function',
                   focusTarget : 'category',
                   lineWidth : '1',
                   isStacked: true,
                   legend : {position: 'bottom',  alignment: 'center', textStyle: {color: '#333', fontSize: 16}},
                   vAxis : {textStyle : {color : '#555', fontSize : '16'}, gridlines : {color: '#CCC', count: 'auto'}, baselineColor : '#AAA', minValue : 0},
                   hAxis : {textStyle : {color : '#555'}, gridlines : {color: '#DDD'}}
              };
    var chart = new google.visualization.ColumnChart(document.getElementById("conso"));
    chart.draw(data, options);
  }


</script>

Pour installer et configurer un serveur web Apache et PHP5. Je vous propose de suivre la procédure décrite dans cette article : PiHomeDashScreen – Installation et configuration. Vous pourrez ensuite afficher cette page PHP/HTML dans votre navigateur.

Résultat

Et voici le résultat pour la puissance instantanée en V.A et W :

teleinfo_edf_conso_electrique

Et le résultat pour la consommation quotidienne heures pleines/creuses en kWh :

teleinfo_edf_conso_kWh_heure_creuse_pleine

Comme toujours, les idées d’amélioration, les remarques et toutes les questions sont les bienvenues en commentaire de cet article 🙂

Dans mon prochain article « RaspberryPi + Razberry + Domoticz : Le combo parfait ! » je vous montrerai comment créer un système domotique complet et à moindre frais pour gérer efficacement votre maison 🙂

MàJ : Un micro module USB prêt à l’emploi est disponible ici : http://hallard.me/teleinfo/. Je ne l’ai pas encore tester, mais cela semble être une solution idéale, quoi que beaucoup plus cher qu’un petit optocoupleur 😉

L’article Téléinfo EDF – Suivi conso de votre compteur électrique (màj 08/2016) est apparu en premier sur MagdiBlog.

Diskio Pi : un nouveau concept de machine hybride

Par : Olivier
24 janvier 2016 à 13:53

logo_diskiopi

Guillaume, à l’initiative du Diskio Pi, m’a contacté il y a quelques temps pour me présenter son projet et le moins que je puisse dire, c’est que j’ai été impressionné par son ambition !

Une « plateforme » sous forme de tablette qui peut accueillir un Raspberry Pi 2 ou un Odroid XU4, et qui dispose de tout ce qu’il faut pour l’exploiter : un écran tactile HD, un ampli audio et des hauts parleurs, une batterie, un hub USB. Du plug’n’play pour nos Raspberry Pi 🙂

Il s’agit d’un projet open-source hardware qui promet une ouverture sur une infinité de possibilités, et ça, c’est cool 🙂

Voici une vidéo de présentation du concept :

A l’origine, le prototype a été réalisé avec une carte Orange Pi. Un écran 17′ a été utilisé pour permettre un rapport épaisseur/surface le plus petit possible, ainsi qu’une surface de travail agréable pour un usage « desktop ». Un indicateur de batterie est présent, avec 5 leds et un bouton pour tester.

diskiopi_proto
Le Raspberry Pi est placé dans un compartiment amovible qui permet l’accès aux différentes entrées/sorties (HDMI, audio, USB, Ethernet…).

diskiopi_plateforme

Cerise sur le gâteau, le port GPIO reste accessible, et le hub USB intégré permet de brancher facilement des périphériques externes comme un clavier, une sourie ou un disque dur.
L’idée est de viser une compatibilité avec un maximum de cartes et la possibilité d’intégrer des shields annexes tels que des accéléromètres, capteurs de températures, etc…

Pour les fan de domotique, pour qui le DiskioPi peut être un excellent contrôleur, Guillaume prévoit un support mural et une alimentation en POE+ 😀 J’ai envie de l’ambrasser 😀

Pour le moment, ce projet n’est pas encore financé, mais de nombreux indicateurs montrent que la demande est là, surtout auprès de la communauté de la domotique libre.
Le porteur du projet, Guillaume, attend avec impatience vos retours du songage qui est actuellement disponible à cette adresse : http://goo.gl/forms/nzDF3fRlBN

Dès qu’un second prototype sera prêt, un crowfunding sera mis en place courant 2016.

Pour plus de détails : www.diskiopi.com

Un grand Bravo pour Guillaume et on lui souhaite de pouvoir mener ce projet jusqu’au bout 🙂

L’article Diskio Pi : un nouveau concept de machine hybride est apparu en premier sur MagdiBlog.

Pi BOAt – description des modules

Par : Olivier
6 janvier 2016 à 15:22

pi_boat_modules

Après l’annonce de ce nouveau projet Pi BOAt – Drone marin fin novembre, entrons aujourd’hui dans le vif du sujet 🙂

Le Pi BOAt est composé d’une multitude de modules (moteurs, gouvernails, caméra, radar…). Je ferai un article dédié pour chaque module, ce qui vous permettra d’utiliser les explications faites sur un module pour un autre projet. Je ferai également en sorte que l’ensemble reste fonctionnel même si tous les modules ne sont pas présents. De cette manière, vous pourrez reproduire le Pi BOAt chez vous, en ne sélectionnant que les modules qui vous intéressent 🙂

D’autres modules pourrons être ajoutés par la suite sans bouleverser le fonctionnement global du Pi BOAt.

Ci dessous, la liste des modules que je vais implémenter dans le Pi BOAt et qui feront chacun l’objet d’un article dédié. N’hésitez pas à soumettre vos idées et remarques 😉

Moteurs

pi_boat_modules_moteur

L293D moteur_dcLa propulsion du Pi BOAt sera assurée par deux moteurs DC pilotés par un circuit intégré L293D (pont H). Ce circuit intégré permet de gérer le sens et la vitesse des deux moteurs.

Gouvernails

pi_boat_modules_gouv

servoimageLes gouvernails seront quand à eux animés par un servo moteur. Nous nous inspirerons du travail réalisé sur les servos moteurs détaillé dans cet article : MagdiBlog – GPIO et servos moteurs

Note : Nous utiliserons deux autres servos moteurs pour le pilotage de la caméra et du radar. Pour faciliter la gestion de plusieurs servos moteurs avec le Pi, nous utiliserons la carte PCA9685 de chez Adafruit.

Caméra

pi_boat_modules_camera

raspberry_pi_cameraLa caméra servira à piloter le Pi BOAt avec un retour d’image en temps réel. Nous pourrions nous limiter à l’utilisation du module Pi caméra fixe, mais nous allons y ajouters deux composants, un stabilisateur mécanique (pour stabiliser l’image) et un servo moteur pour pouvoir orienter la caméra à 360°.

Radar

pi_boat_modules_radar

srf02Sans doute le module le plus fun à réaliser 🙂 Nous utiliserons le télémètre à ultra-son SRF02, monté sur un servo moteur pour avoir un balayage à 360° et ainsi obtenir une « carte » des obstacles présents autours du bateau. Rien que d’en parler, ça m’éclate 🙂

Nous nous inspirerons du travail réalisé sur ce télémètre et détaillé dans cet article : MagdiBlog – GPIO Télémètre ultra-son SRF02

Lire l’article dédié à ce module : Pi BOAt – Radar de surface

Télémétrie

pi_boat_modules_wifi

wifi_alphaAprès moultes réflexions, j’ai décidé que le lien radio se fera par WiFi, tout simplement. Il y a de nombreux pour et contre sur ce choix et je serai ravi d’en discuter avec vous. Pour ma part, le gros avantage du WiFi, c’est qu’on peut y faire passer toutes les infos nécessaires au pilotage du bateau (images temps réels, info de guidage, position, etc…). Le second gros avantage de ce choix est que le bateau pourra être piloté par n’importe quel device équipé d’une puce WiFi (PC portable, tablette, smartphone…).

Enfin, ce module pourra être facilement remplacé par un module 3G/4G si le coeur vous en dit 🙂

GPS

pi_boat_modules_gps

gpsParce qu’il est intéressant de pouvoir suivre l’évolution du bateau sur une carte et puisqu’il sera question de développer des fonctions de retour automatique au port, nous embarquerons un module GPS à bord du Pi BOAt 🙂

Nous utiliserons probablement l’excellent module Adafruit Ultimate GPS Breakout.

Gyroscope, accéléromètre et boussole

pi_boat_modules_gyro

MinIMU-9Ce module nous permettra de voir si le bateau tangue ou chavire pour éventuellement déclencher un système de sécurité (à méditer).

La boussole nous permettra de connaître le cap du bateau ce qui facilitera l’implémentation de la fonction de retour automatique au port.

Nous utiliserons probablement le module Pololu MinIMU-9 qui intègre un gyroscope, un accéléromètre et une boussole.

Température

pi_boat_modules_temp

sonde-temperature-tmp36Non indispensable au pilotage du bateau, la sonde de température pourra servir à faire des relevés de la température de l’eau par exemple.

Nous nous inspirerons du travail réalisé sur les sondes de températures et détaillé dans l’article : MagdiBlog – GPIO sondes de température

Capteur d’eau

pi_boat_modules_eau

Malgré tout le soin apporté à la confection de la coque du bateau, les voies d’eau sont toujours possibles. Pour éviter les catastrophes et ramener rapidement le bateau au port en cas d’infiltration d’eau, nous allons mettre en place un système très simple de détection d’eau.

Alimentation

pi_boat_modules_alim

Nous allons ici gérer l’alimentation des moteurs et servos moteurs ainsi que l’alimentation du Raspberry Pi qui pilotera l’ensemble.

A l’heure actuelle, je pense faire deux circuits d’alimentation différents, un pour les moteurs et un pour le Pi. Je pense également mettre en place un système d’alimentation de secours afin d’éviter de sortir les palmes pour aller chercher le bateau au milieu d’un lac 😉

Pour les moteurs nous utiliserons probablement un petit accu plomb. Pour le Pi, nous utiliserons certainement une batterie Li-Ion 5V. A voir quelle sera la capacité d’emport du bateau en terme de poids.

Pour en savoir plus sur les batteries, rendez vous ici : MagdiBlog – Comment alimenter votre Raspberry Pi avec une batterie

Raspberry Pi

pi_boat_modules_pi

raspberry_pi_2_aLa partie la plus importante du projet, le Raspberry Pi, dont le rôle sera de faire fonctionner tous les autres modules ensembles et piloter le bateau.

Je ne suis pas encore fixer sur certains aspects, j’hésite encore à utiliser un Pi 2 B (le plus performant) pour gérer tous les modules, ou utiliser plusieurs Pi Zero (un pour les moteurs et le gouvernail, un pour les systèmes radar, gps, gyro, température, détecteur d’eau et un Pi A+ pour la caméra et la télémétrie.

Je ferai un test avec un Pi 2 B pour voir si il peut gérer l’ensemble des modules sans saturer.

Coque et structure

pi_boat_modules_structure

Une fois que tous les modules seront opérationnels, j’attaquerai la construction de la coque et de la structure du bateau. Je suis totalement novice dans ce domaine et même si je me documente sur le sujet depuis plusieurs mois maintenant, je lance un appel à l’aide à tous ceux qui peuvent m’aider ou me donner des conseils 🙂

Je suis notamment à la recherche de plans de coque, pour un bateau d’environ 1m à 1m20 de long 🙂

Pour l’instant, la taille et l’allure générale du Pi BOAt ne sont pas encore définies. Cependant, j’aimerai approcher quelque chose qui ressemble au design des frégates FREMM : https://fr.wikipedia.org/wiki/Classe_Aquitaine

fremm

La suite

Dans le prochain article, je détaillerai l’architecture logicielle mise au point pour donner vie au Pi BOAt puis j’attaquerai un par un l’ensemble des modules pré-cités.

N’hésitez pas à soumettre vos idées de modules et à donner votre avis sur les modules existants, leur fonction et leur conception.

Merci à tous et à très bientôt pour la suite 😉

L’article Pi BOAt – description des modules est apparu en premier sur MagdiBlog.

Pi BOAt – Drone marin

Par : Olivier
4 novembre 2015 à 11:01

PiBOA_Boat

Deux ans après la présentation du projet Pi BOA Drone – Un avion drone autonome longue distance (qui reste d’actualité), force est de constater que les problématiques logistiques et législatives autour d’un tel projet ont largement freiné son avancement.

En effet, outre le fait qu’il est quasiment impossible d’obtenir une autorisation pour faire voler un engin de près de trois mètres d’envergure en toute autonomie, le matériel et les locaux nécessaires à sa construction ne sont, pour le moment, pas à ma portée.

Rassurez vous, le projet n’est pas abandonné, il me faut simplement trouver les bons partenaires et sponsors pour le mener à bien ainsi que de quoi le financer 😉

Un projet intermédiaire

Tout ceci m’amène à vous présenter un nouveau projet, ô combien plus accessible, le Pi BOAt, un drone marin !

Alors oui, hors de question ici de faire un Lille-Metz (quoi que ?!), mais comme vous allez le voir, les problématiques de navigation et de contrôle entre un avion et un bateau sont relativement similaires. Si si !

Sur un bateau comme sur un avion, il faut gérer des moteurs et des ailerons (ou gouvernails), une position, une direction, une vitesse, la télémétrie, etc… La seule différence finalement, outre les questions de flottaison/aéronautique, c’est qu’un bateau navigue dans un plan, en deux dimensions donc, alors qu’un avion évolue dans un espace en trois dimensions. Voyez, c’est tout pareil 😉

De plus, un bateau coûte beaucoup moins cher en crash-test ! Au pire, un bateau, il faudra aller le chercher à la nage, alors qu’un avion ça a tendance à se vautrer lamentablement en éparpillant des morceaux sur cinquante mètres…

Pour finir, personne n’ira m’embêter avec un bateau, la chasse aux sorcières étant focalisée sur les drones volants 😉

Présentation : Pi BOAt, un drone marin

L’objectif principal de ce projet est le même que pour le Pi BOA Drone et l’ensemble des projets présentés sur MagdiBlog : se confronter à différentes problématiques techniques afin d’étendre nos connaissances 🙂

L’objectif secondaire de ce projet est de réaliser une plateforme de drone marin qui pourra servir de base pour une multitude de projets.

Je vais découper le projet en lots techniques que je détaillerai dans des articles dédiés au fur et à mesure de mes avancées. De cette manière, nous pourrons étudier les différents sujets un par un et chaque morceau pourra servir indépendamment à d’autres projets.

Voici les lots techniques que j’ai identifié pour le moment :

  • gestion des moteurs (PWM)
  • contrôle des gouvernails (servos moteurs)
  • télémétrie (WiFi ou 433Mhz)
  • gestion de la caméra embarquée (module pi caméra avec stabilisateur)
  • position GPS
  • position dans l’espace (gyroscope, accéléromètre et boussole)
  • sonde radar (télémètre à ultra-son)
  • sonde température
  • architecture logicielle (Python)
  • IHM de pilotage (web PHP)
  • construction du navire (en bois)

Un beau programme donc, qui fait intervenir une multitude de technologies 🙂

La construction du navire (la coque et la structure) sera la dernière étape de ce projet.

Deux valent mieux qu’un !

En m’imaginant piloter mon bateau sur un grand lac, il me vint une idée, ou plutôt une angoisse : comment récupérer mon bateau s’il ne répond plus ou qu’une panne survient au beau milieu du lac ?

raspberry_pi_boat_navyLa réponse : faire un deuxième bateau, plus simple, plus petit, qui pourra accompagner le premier.

Nous fabriquerons donc deux bateaux, sur le même modèle, l’un pouvant venir au secours de l’autre en cas de problème. J’imagine déjà un petit système d’aimants à l’avant et l’arrière… que dis-je !? A la proue et à la poupe des deux bateaux 🙂

A suivre 😉

L’article Pi BOAt – Drone marin est apparu en premier sur MagdiBlog.

Kerberos.io : la vidéosurveillance pour Raspberry Pi

Par : Olivier
19 octobre 2015 à 06:00

kerberos_videosurveillance_raspberrypi

La vidéosurveillance est un sujet qui intéresse beaucoup de monde. Alors que les solutions « clé-en-main » vendues sur le marché nécessitent un budget élevé, de nombreux projets plus abordables ont vu le jour avec l’avènement du Raspberry Pi.

Dans l’article Système de vidéo-surveillance abordable avec des Raspberry Pi je vous expliquais comment réaliser un système de vidéosurveillance sur mesure avec plusieurs Raspberry Pi. Dans l’article Raspberry Pi Camera – 5 façons de faire du streaming je comparais plusieurs manières de diffuser un flux vidéo avec le module caméra du Pi.

Pour ceux qui souhaitait une solution un peu plus « packagée » et avec la détection de mouvement (élément essentiel de la vidéosurveillance), il restait Motion, un logiciel de vidéosurveillance sous Linux dont le support sur Raspberry Pi n’était pas évident (très gourmand en ressources, support du module caméra du Pi non immédiat…).

Aujourd’hui, je vous présente Kerberos.io qui est un logiciel de vidéosurveillance spécifiquement développé pour le Raspberry Pi 🙂 Près à l’emploi, il suffit de télécharger l’image disponible sur le site et de la calquer sur une carte SD (exactement comme pour Raspbian) et ainsi transformer un Pi en caméra de surveillance (A noté qu’il n’existe pas, pour l’instant de paquet .deb près à l’emploi).

Optimisé pour le Pi et parfaitement compatible avec le module caméra du Pi, Kerberos.io est LA vidéosurveillance clé-en-main pour Raspberry Pi !

kerberos_videosurveillance_raspberrypi_demo

Kerberos.io est doté d’une interface web totalement responsive (compatible avec les smartphones et tablettes), épurée et moderne.

Une démo en ligne est disponible à cette adresse : https://demo.kerberos.io/

Cette interface web vous permettra bien entendu d’avoir les images en temps réel, mais vous présentera également un ensemble de statistiques concernant les événements détectés. Vous pourrez ainsi avoir une trace d’une activité détectées par la caméra.

Il est également possible de déclencher un certain nombre d’opérations lorsqu’un mouvement est détecté comme sauvegarder les images, agir sur le port GPIO, envoyer des requêtes, etc… Enfin, vous pouvez visualiser plusieurs caméras sur une interface web grâce à la fonctionnalité « cloud ».

Pour plus d’info sur kerberos.io, je vous invite à consulter le site officiel : https://kerberos.io/

Voici le lien directe vers la documentation (en anglais) : https://doc.kerberos.io/

N’hésitez pas à partagez vos impressions sur ce soft dans les commentaires 😉

L’article Kerberos.io : la vidéosurveillance pour Raspberry Pi est apparu en premier sur MagdiBlog.

PiHomeDashscreen et domotique : températures et humidité

Par : Olivier
27 août 2015 à 09:26

PiHomeDashScreen_domotique_meteo

Quand j’ai débuté le projet PiHomeDashscreen il y a un peu plus de deux ans (déjà ?!?), j’avais déjà en tête de le relier, un jour, à un système domotique. En effet, ce type d’écran d’information domestique ne présente de réel intérêt que si les données affichées sont utiles au quotidien. Quoi de plus pertinent que des informations concernant la maison, les températures intérieures et extérieures, la consommation électrique, l’état de l’alarme anti intrusion, la vidéo-surveillance etc… ?

Aujourd’hui, nous allons voir comment exploiter les données de température et d’humidité d’une installation domotique à base de Raspberry Pi et Domoticz et les afficher sur notre PiHomeDashScreen. Cette méthode, qui se base sur l’API de Domoticz, est générique et peut s’appliquer à n’importe quel type de données ou module domotique (interrupteurs, sondes météo, capteur de luminosité, chauffage…).

Prérequis

IMG_8255Avant de pouvoir afficher la température et l’humidité de l’intérieur et l’extérieur de votre maison, vous devez au préalable :

Le matériel

Vous pouvez installer le PiHomeDashScreen et votre box Domoticz sur le même Raspberry Pi. Dans ce cas, voici le matériel minimum dont vous aurez besoin :

everspring_st814Vous pouvez utiliser n’importe quel sonde météo compatible z-wave comme les bien connues Everspring ST814.

Pour ma part j’utilise des sondes de température et d’humidité Oregon Scientific, réputées pour leur fiabilité. Pour pouvoir les faire fonctionner avec votre Pi et Domoticz vous devrez vous équiper en plus du module USB RFXtrx433.

Le PiHomeDashScreen

Une fois en possession de tout le matériel nécessaire, vous devrez donc avoir installé et configué le PiHomeDashScreen comme détaillé ici : http://www.magdiblog.fr/boa-pi-homedashscreen/1-raspberry-pi-home-dash-screen/

Domoticz

DomoticzVous devrez également avoir installé et configuré le module z-wave Razberry ou le module USB RFXtrx433 ainsi que Domoticz comme expliqué ici : http://www.magdiblog.fr/domotique/raspberrypi-razberry-rfxtrx433usb-domoticz-le-combo-parfait/

Récupération des données

A ce stade, tout devrait être fonctionnel et vous devriez avoir vos sondes de température opérationnelles dans Domoticz. Pour ma part, j’ai bien mes deux sondes Oregon avec la température et l’humidité comme on peut le voir dans la capture d’écran ci-dessous :

domoticz_sondes_temperature

Si vous n’avez pas vos sondes correctement détectées dans Domoticz c’est que vous avez loupé une étape. Il est inutile de poursuivre tant que tout n’est pas opérationnel, je vous invite donc à bien relire cet article : http://www.magdiblog.fr/domotique/raspberrypi-razberry-rfxtrx433usb-domoticz-le-combo-parfait/

Si tout est ok, alors la suite va se révéler très simple 🙂 En effet, Domoticz propose une API JSON qui permet, entre autres, d’accéder à toutes les données de vos équipements domotique et en particulier vos sondes de température.

Note : Vous trouverez la documentation complète de l’API JSON de Domoticz ici : https://www.domoticz.com/wiki/Domoticz_API/JSON_URL’s

La récupération des données se fait simplement avec une requête HTTP GET sous la forme d’une URL de type :

http://adresse_ip_du_pi:8080/json.htm?type=devices&rid=id_du_module

L’id des modules en question est visible directement dans Domoticz dans l’onglet « setup/devices » :

domoticz_sondes_temperature_ids

Dans cet exemple, j’ai donc ma sonde extérieure (Oregon Outside) avec l’id 116 et ma sonde intérieure (Oregon Inside) avec l’id 117.

Pour récupérer les données de la sonde extérieure par exemple, je vais donc utiliser l’URL suivante :

http://adresse_ip_du_pi:8080/json.htm?type=devices&rid=116

L’API Domoticz va renvoyer une série de données au format JSON :

{
 "ActTime" : 1440510947,
 "ServerTime" : "Aug 25 2015 15:55:47",
 "Sunrise" : "06:52:00",
 "Sunset" : "20:47:00",
 "result" : [
 {
 "AddjMulti" : 1.0,
 "AddjMulti2" : 1.0,
 "AddjValue" : 0.0,
 "AddjValue2" : 0.0,
 "BatteryLevel" : 100,
 "CustomImage" : 0,
 "Data" : "20.2 C, 56 %",
 "DewPoint" : "11.14",
 "Favorite" : 1,
 "HardwareID" : 2,
 "HardwareName" : "RFXCOM",
 "HaveTimeout" : false,
 "Humidity" : 56,
 "HumidityStatus" : "Comfortable",
 "ID" : "FB02",
 "LastUpdate" : "2015-08-25 15:55:13",
 "Name" : "Oregon Outside",
 "Notifications" : "false",
 "PlanID" : "0",
 "Protected" : false,
 "ShowNotifications" : true,
 "SignalLevel" : 5,
 "SubType" : "THGN122/123, THGN132, THGR122/228/238/268",
 "Temp" : 20.20,
 "Timers" : "false",
 "Type" : "Temp + Humidity",
 "TypeImg" : "temperature",
 "Unit" : 2,
 "Used" : 1,
 "XOffset" : "0",
 "YOffset" : "0",
 "idx" : "116"
 }
 ],
 "status" : "OK",
 "title" : "Devices"
}

Note : Les données renvoyées par l’API de Domoticz peuvent varier d’une sonde à une autre mais de manière générale vous devriez identifier rapidement les informations dont vous avez besoin.

Dans cet exemple, on repère facilement le champ « Data » qui contient à la fois la température en degrés Celsius et le taux d’humidité en pourcentage :

"Data" : "20.2 C, 56 %"

On repère également les champs « Humidity » et « Temp » qui présentent ces mêmes données de manière brut, c’est à dire sans unité (plus facile à traiter par la suite) :

"Humidity" : 56
[...]
"Temp" : 20.20

Maintenant que nous savons comment récupérer et identifier précisément les données qui nous intéressent, il ne nous reste plus qu’à créer un module pour notre PiHomeDashScreen 🙂

Code source à implémenter dans le PiHomeDashScreen

Comme pour la plupart des autres modules, il va nous falloir ajouter un conteneur dans la page d’index, puis déclarer les fonctions PHP et JavaScript qui se chargeront de récupérer et d’afficher les informations 🙂

Note : Pour plus d’information sur le fonctionnement des modules du PiHomeDashScreen, je vous invite à lire cet article : http://www.magdiblog.fr/boa-pi-homedashscreen/3-principe-de-base/

index.php

C’est parti ! On commence par le fichier index.php dans lequel il faut placer deux conteneurs principaux (intérieur et exterieur) puis deux sous-conteneurs température et humidité :

<div id="inside">
 In
 <div id="temp_in"></div>
 <div id="hum_in"></div>
</div>

<div id="outside">
 Out
 <div id="temp_out"></div>
 <div id="hum_out"></div>
</div>

style.css

On positionne les deux conteneurs principaux sur l’écran et on ajuste le style d’affichage de la température et de l’humidité :

div#inside
{
 width : 200px;
 height : 270px;
 right : 0px;
 bottom : 0px;
 position : absolute;
 padding : 5px;
 border : solid 0px #D33;
 z-index : 999;
 text-align : center;
 color : #555;
 font-size : 20px;
 font-weight : bold;
}

div#temp_in
{
 width : 200px;
 background-color : rgba(0, 0, 0, 1);
 text-align : center;
 font-size : 60px;
 padding : 0px;
 border : solid 0px #33D;
 margin : 0px auto;
}

div#hum_in
{
 width : 200px;
 background-color : rgba(0, 0, 0, 1);
 text-align : center;
 font-size : 50px;
 padding : 0px;
 border : solid 0px #33D;
 margin : 0px auto;
}

div#outside
{
 width : 200px;
 height : 170px;
 right : 220px;
 bottom : 100px;
 position : absolute;
 padding : 5px;
 border : solid 0px #D33;
 z-index : 999;
 text-align : center;
 color : #555;
 font-size : 20px;
 font-weight : bold;
}

div#temp_out
{
 width : 200px;
 background-color : rgba(0, 0, 0, 1);
 text-align : center;
 font-size : 60px;
 padding : 0px;
 border : solid 0px #33D;
 margin : 0px auto;
}

div#hum_out
{
 width : 200px;
 background-color : rgba(0, 0, 0, 1);
 text-align : center;
 font-size : 50px;
 padding : 0px;
 border : solid 0px #33D;
 margin : 0px auto;
}

span.hum_unit
{
 font-size : 25px;
}

javascript.js

Une seule fonction JavaScript pour récupérer la température et l’humidité des deux sondes :

/* temp */

var temp_timeout;

function temp () {
  $.ajax({
    async : false,
    type: "GET",
    dataType: "json",
    url: "./ajax.php",
    data: "block=temp",
    success: function(html){
      $("#temp_in").html(html.temp_in.temp);
      $("#temp_out").html(html.temp_out.temp);
      $("#hum_in").html(html.temp_in.hum);
      $("#hum_out").html(html.temp_out.hum);
    }
  });

  temp_timeout = setTimeout("temp()", 120000);
}

Note : Une actualisation de l’affichage toutes les deux minutes (120000 ms) est largement suffisante. On peut même pousser à dix minutes, les températures ne variants jamais très brutalement.

ajax.php

Comme pour les autres modules, il suffit d’ajouter l’appel à la bonne fonction PHP :

/////////////////////////////////////////////////
//  TEMP
/////////////////////////////////////////////////

if($block == 'temp'){
  echo tempAll ();
}

inc.php

Petite subtilité ici, nous séparons le travail en deux fonctions. La fonction tempAll() appellera la fonction temp() pour chaque sonde et renverra un array contenant l’ensemble des données. En procédant de la sorte, on factorise un peu le code et on rend plus facile l’ajout d’une troisième sonde.

C’est donc la fonction temp() qui se chargera de contacter l’API Domoticz comme expliqué en début d’article. On utilise pour cela cURL qui est un outil permettant de lancer des requêtes HTTP 🙂 On prendra soin d’adapter les ids des devices/sondes que l’on souhaite atteindre.

  /////////////////////////////////////////////////
  //  TEMP
  /////////////////////////////////////////////////

  function tempAll () {

    $datas = array();

    $temp_in = temp ('in');
    $temp_out = temp ('out');

    $datas['temp_in'] = $temp_in;
    $datas['temp_out'] = $temp_out;
    
    $datas = json_encode($datas);

    return $datas;
  }

  function temp ($location) {

    if($location == 'out') {
      $device_id = 116;
    }
    else if($location == 'in') {
      $device_id = 117;
    }
    else{
      $device_id = "X";
    }

    $url = "http://adresse_ip_domoticz:8080/json.htm?type=devices&rid=".$device_id;
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
    $return = curl_exec($curl);
    curl_close($curl);
    $data = array('temp' => '', 'hum' => '');
    if(json_decode($return)->result[0]->Temp) {
      $data['temp'] = json_decode($return)->result[0]->Temp.'°';
    }
    else{
      $data['temp'] = json_decode($return)->result[0]->Temp.'°';
    }
    if(json_decode($return)->result[0]->Humidity){
      $data['hum']  = json_decode($return)->result[0]->Humidity.'<span class="hum_unit">%</span>';
    }
    return $data;
  }

Note : Les données renvoyées par l’API de Domoticz sont au format JSON. Il faut donc veiller à décoder ces données en utilisant la fonction json_decode(). Notez également que nous ré-encodons en JSON les données renvoyées par la fonction tempAll() grâce à la fonction json_encode(), afin qu’elles puissent être facilement lues par la fonction JavaScript.

Et voilà le résultat 🙂

PiHomeDashScreen_temperature_humidite

Le mot de la fin

Comme évoqué plus haut dans l’article, ce principe d’utilisation de l’API Domoticz avec le PiHomeDashScreen peut être décliné pour n’importe quel type de sonde (météo, luminosité, ouverture de porte, état des lumières, système d’alarme…).

Dans cet exemple j’ai utilisé deux sondes de température, mais il est tout à fait possible d’exploiter les données d’autant de sondes et capteurs que vous le souhaitez 🙂 On pourrait même envisager d’afficher un plan de la maison avec la température de chaque pièce par exemple.

A très bientôt pour la suite 🙂

image

L’article PiHomeDashscreen et domotique : températures et humidité est apparu en premier sur MagdiBlog.

2 – Installation et configuration (màj le 07.07.2015)

Par : Olivier
7 juillet 2015 à 12:00

La manière la plus souple pour afficher des données sur un écran est d’utiliser le langage HTML (comme pour les pages web). Pour rendre le tout un peu plus dynamique, nous utiliserons PHP et un peu de JavaScript. Ces technologies et langages sont très répendues (web) et très simples à utiliser.

En résumé, le Pi HomeDashScreen est un navigateur web, qui affiche une page web 🙂 Le gros avantage de cette solution, c’est que vous pouvez avoir plusieurs écrans dans votre maison qui affichent la même URL. Si cette URL est accessible depuis l’extérieur de votre réseau, vous pouvez afficher  votre écran d’information depuis n’importe où 🙂

Dans mon cas, le serveur web est installé directement sur le Pi qui est relié à l’écran. Mais vous pouvez très bien vous contenter d’afficher l’URL publiée par un serveur distant 🙂

IMG_5389

Note : Pour être franc, c’est la partie la plus chi… la moins intéressante ! Si vous savez installer un serveur web et lancer une application au démarrage du système, passez directement à la suite. Notez toutefois que j’explique ici comment lancer une application (Firefox/Chromium), sans gestionnaire de connexion (ou display manager), sans gestionnaire de bureau et avec un gestionnaire de fenêtre minimaliste. Pour avoir passé plusieurs jours à trouver comment faire, je pense que ça peut être utile 🙂 Rien que l’auto-login en mode console, ça peut servir !

Note : Ce tuto a été mis à jour le 16.03.2015 pour fonctionner facilement avec une installation classique des dernières versions de Raspbian. Un grand merci à chipsetseo et au magazine The MagPi pour les infos 🙂

Note 2 : Je précise que le but est ici de ne pas passer par un environnement de bureau (tel que LXDE disponible par défaut sous Raspbian) inutile et lourd pour afficher une page web, mais simplement un gestionnaire de fenêtre (et notamment openbox) qui est nécessaire et suffisant pour l’affichage d’une fenêtre d’un navigateur comme Chromium. Il convient donc de ne pas activer l’interface graphique via l’outil raspi-config ; voire même de la désinstaller totalement en suivant ce tuto : Supprimer les paquets inutiles pour alléger Raspbian

Installation des paquets

raspbian_logo_tinyJe ne reviens pas sur l’installation de Raspbian sur la carte SD, ce sujet ayant été traité de nombreuses fois, et notamment dans les projets Pi TimeLapse et Pi CarJukeBox. Partons du principe que vous avez un Pi fonctionnel sous Raspbian, configuration réseau effectuée (ethernet ou wifi) et un accès à Internet.

Vous allez avoir besoin de quatres composants clés :

  • Apache : serveur web, pour assurer la publication du contenu à afficher
  • PHP : pour pouvoir traiter dynamiquement les données à afficher
  • Chromium : pour afficher le contenu HTML à l’écran
  • Openbox : gestionnaire de fenêtre très léger pour gérer l’affichage de Firefox
  • xinit : permet d’installer tout ce qu’il faut pour le serveur X (qui se charge véritablement d’afficher toutes ces choses à l’écran)

Pour installer ces composants, utilisez la commande suivante :

apt-get install apache2 php5 php5-cli chromium openbox xinit

Toutes les dépendances seront installées automatiquement.

Nous aurons ensuite besoin d’un certain nombre d’outils :

  • imagemagick : pour manipuler des images
  • xplanet : pour générer les images de la terre et de la lune
  • unclutter : pour masquer le curseur de la souris
  • x11-xserver-utils : pour gérer la mise en veille de l’écran

Comme précédemment nous utilisons la commande apt-get install :

apt-get install imagemagick php5-imagick php5-gd xplanet unclutter mingetty x11-xserver-utils

Configuration

Le but est qu’à chaque démarrage du Pi, le système lance Firefox en plein écran sur l’URL du contenu que nous souhaitons afficher, tout en masquant le curseur de la souris. Dans mon cas, je mets en veille l’écran à 1h du matin, et je le réveille à 7h30.

Apache

Rien de plus simple car nous pouvons directement utiliser la configuration par défaut ou presque. Le fichier qui nous intéresse est  /etc/apache2/sites-enabled/Default. Vous pouvez le vider et remplacer son contenu par :

<VirtualHost *:80>
        DocumentRoot /var/www
</VirtualHost>

Cette configuration minimaliste suffira pour ce que nous souhaitons faire. /var/www correspond au répertoire qui contiendra les fichiers à afficher sur l’écran.

Vous pouvez créer un fichier « /var/www/index.html » et y écrire « coucou« . Ouvrez Firefox et allez à l’adresse http://localhost (localhost, désigne la boucle locale, autrement dit, c’est votre machine, home sweet localhost !). Vous devriez voir votre message « coucou » 🙂

Lancer Chromium au démarrage sur la bonne URL

Ceci ce fait en trois étapes. Dans un premier temps, il faut s’auto-loguer en tant qu’utilisateur au démarrage du système (dans mon cas, mon nom d’utilisateur est Jarvis. On ne se moque pas 😉 ). Une fois logué, l’utilisateur lance une session du gestionnaire de fenêtre Openbox. Lorsqu’Openbox démarre, il lance à son tour Chromium.

Auto-login au démarrage en mode console

Editez le fichier /etc/inittab et remplacez la ligne :

1:2345:respawn:/sbin/getty 115200 tty1

par :

1:2345:respawn:/bin/login -f jarvis tty1/dev/tty1 2>&1

(Remplacez « jarvis » par votre nom d’utilisateur)

Lancer une session Openbox automatiquement

Cela concerne l’utilisateur qui se connecte au démarrage, nous devons donc éditer le fichier /home/jarvis/.bash_profile. Il se peut que ce fichier n’existe pas, vous devrez alors le créer et y inscrire :

startx

Lancer Firefox au démarrage d’Openbox

Très simple, il suffit d’éditer le fichier  /home/jarvis/.config/openbox/autostart et d’ajouter en fin de fichier la commande pour lancer Chromium :

chromium -kiosk –incognito

(-kiosk pour lancer en mode plein écran ; –incognito pour que chromium se lance toujours en ignorant la session précédente)

Configuration de Chromium

Nous approchons du but. Il ne reste plus qu’à configurer Firefox pour sa page d’accueil par défaut soit http://localhost. Pour cela, il suffit d’aller dans les préférences de Chromium et de saisir http://localhost dans le champ « page d’accueil ».

Mise en veille à heure fixe

Pour gérer la mise en veille de votre moniteur à heure fixe, vous pouvez utiliser CRON, qui est un planificateur de tâche. En root, tapez crontab -e puis ajouter les deux lignes suivantes :

0 1 * * *       su - jarvis -c "xset -display :0 dpms force off" # met le moniteur en veille à 1h du matin
30 7 * * *      su - jarvis -c "xset -display :0 dpms force on" #réveille le moniteur à 7h30 du matin

Ceci permet uniquement de mettre en veille le moniteur. Si vous souhaitez éteindre totalement votre Pi, vous devez remplacer les deux lignes ci-dessus par la ligne :

0 1 * * *       /sbin/shutdown -h now # éteint le PI à 1h du matin

Ceci aura pour effet d’éteindre proprement votre Pi. Il ne vous reste plus qu’à utiliser un programmateur horraire, pour couper l’alimentation et la rallumer le lendemain matin.

Installation terminée

Si vous avez bien suivi l’ensemble de ce qui est expliqué dans cet article, vous devriez voir votre page d’accueil, qui n’affiche pour le moment que « coucou », à chaque démarrage de votre Pi. A partir de maintenant, nous allons nous concentrer sur les différents modules à afficher 🙂 C’est la partie la plus sympa 🙂

L’article 2 – Installation et configuration (màj le 07.07.2015) est apparu en premier sur MagdiBlog.

Créer une passerelle sécurisée avec un Raspberry Pi

Par : Olivier
20 février 2015 à 21:43

raspberry_pi_authentification_chiffrement_600

Qu’il s’agisse de domotique, de vidéo-surveillance ou de simple partage de fichiers, les besoins de se connecter à un équipement se trouvant à l’intérieur de notre maison à travers Internet se multiplient. Bien que ces systèmes soient de plus en plus généralisés et faciles à mettre en place, la question de la sécurité est souvent reléguée au second plan.

Comment s’assurer que personne ne nous espionne avec nos caméras IP installées dans notre salon ? Comment empêcher une personnes curieuse, voire malveillante, de jouer avec notre centrale domotique ?

Dans l’ensemble de mes articles, j’ai toujours insisté sur l’importance de sécuriser ces accès. Aujourd’hui, je vous propose de voir comment créer un point d’accès sécurisé grâce à un Raspberry Pi.

Contexte

camera_ipPrenons l’exemple d’une caméra IP. Ce type de caméra dispose généralement d’une interface web qui vous permet de la configurer et de visionner les images. Vous vous connectez à cette interface web grâce à un navigateur en vous connectant sur une URL du type http://192.168.0.17:8080. (192.168.0.17 étant l’adresse IP de votre caméra sur le réseau interne à votre maison).

Cela signifie que le service (c’est à dire le logiciel) qui vous permet d’interagir avec votre caméra, est disponible sur le port 8080/TCP. Si vous voulez pouvoir accéder à votre caméra depuis l’extérieur de votre maison, c’est à dire en passant par Internet, vous allez devoir configurer votre box, modem ou routeur, pour autoriser les flux sur ce même port 8080/TCP à destination de l’adresse IP interne de votre caméra. Votre box agit alors comme un « aiguilleur », qui lorsqu’il recevra une connexion depuis l’extérieur de votre réseau sur le port 8080/TCP redirigera le flux vers votre caméra IP.

Le hic, c’est que cela fonctionnera avec vous, mais aussi avec tout le reste de la planète ! N’importe qui connecté à internet peut se connecter à votre caméra !

Vous me direz : « Oui, mais il y a un mot de passe !« . En effet, il reste à trouver le mot de passe (si vous en avez un, et qu’il est suffisamment compliqué) pour pouvoir vous espionnez. Gardez cependant à l’esprit que de l’extérieur (comprenez depuis Internet), si vous pouvez vous connecter à votre caméra/box domotique/serveur de fichiers, alors tout le monde peut s’y connecter également.

Notions et principes de base en sécurité informatique

Pour sécuriser l’accès à un service (logiciel) à travers un réseau tel qu’Internet, il y a trois choses à mettre en place :

  • protéger l’accès grâce à un mot de passe : réserver l’accès à ceux qui connaissent le mot de passe
  • vérifier l’identité de la personne qui se connecte : s’assurer que la personne qui tente de se connecter est bien une personne autorisée
  • chiffrer les informations et les données lorsqu’elles transitent sur le réseau : empêcher que quelqu’un intercepte votre mot de passe et vos données personnelles

En effet, un mot de passe seul ne suffit pas car il peut être découvert ou volé. Et si vous pensez que personne ne peut vous voler votre mot de passe, détrompez vous ! La chose à garder en tête, c’est que lorsque vous êtes à l’extérieur de votre maison, vous utilisez un réseau que vous ne maîtrisez pas (WiFi publique, réseau 3G/4G de votre opérateur mobile, réseau de votre entreprise, etc…). Sur ces réseaux, vous n’avez absolument aucune garantie que personne n’observe ce que vous faites. On peut même dire que vous avez la certitude que vos données peuvent être lues par quelqu’un. Pour résumer : Si vous saisissez votre mot de passe quelque part, il sera visible par les équipements du réseau que vous utilisez.

Si vous n’êtes toujours pas convaincu par cette fragilité, je vous conseille vivement de lire le dossier dédié à ce sujet dans le dernier Canard PC Hardware (n° 23) http://www.canardpc.com/news-53226-cpc_hardware_n__23_est_disponible__.html. Vous verrez avec quelle facilité il est possible de récupérer vos mots de passe.

Comment faire pour se protéger ?

La solution pour éviter que votre mot de passe soit intercepté, est de chiffrer (comprenez crypter) les flux entre vous (votre navigateur, votre smartphone), et l’appareil auquel vous vous connectez (caméra ip, box domotique,…). Nous verrons plus loin comment mettre cela en place.

Enfin, pour nous assurer que notre accès est sécurisé, il convient de mettre en place un « contrôle d’identité« . Dans la vraie vie, pour contrôler que vous êtes bien la personne que vous prétendez être, on vous demande votre Carte Nationale d’Identité. Cette carte d’identité garantie que vous êtes bien vous en s’appuyant sur deux choses : la première c’est que vous la possédez (vous prouvez votre identité en étant détenteur de votre carte) ; la seconde est qu’elle a été faite par une autorité suprême, à savoir l’Etat, qui a préalablement réalisé les contrôles nécessaires avant de vous délivrer votre carte d’identité qui indique que vous êtes vous (Une carte réalisée par le boulanger du coin n’aurait pas la même authenticité). Pour résumer : Vous possédez une carte d’identité, et c’est l’Etat (entité de confiance) qui atteste que c’est bien vous. Vous pouvez donc récupérer votre colis à La Poste, puisque c’est l’Etat qui garantie que vous êtes bien vous. Retenez bien ce principe, car il est très important pour comprendre la suite.

Dans le monde de la sécurité, on parle d’authentification forte lorsqu’il est nécessaire de présenter au moins deux choses pour vous connecter : quelque chose que vous connaissez (un mot de passe), et quelque chose que vous possédez (une carte, un badge, un certificat) ou que vous êtes (une empreinte digitale, une empreinte vocale…).

Certificats

httpsEn informatique, pour désigner l’équivalent d’une carte d’identité, on parle de certificat. Lorsque vous allez sur un site internet utilisant un certificat, vous voyez généralement un petit cadenas dans la barre d’adresse et l’URL commence par https. En cliquant sur le cadenas, on peut afficher le certificat utilisé par le site :

certificat

Nous voyons que ce certificat a été émis par VeriSign qui est une autorité de certification reconnue dans le monde de l’Internet (à l’instar de l’Etat pour nos CNI). Ce certificat à été émis pour le site www.paypal.com de la société PayPal. Le site de Paypal présente donc un certificat qui atteste de son identité, et que cette identité à été vérifiée par VeriSign. Nous avons donc l’assurance qu’il s’agit bien du site de PayPal 🙂

Il s’agit là d’un certificat serveur, pour que les clients puissent vérifier qu’il s’agit bien d’un serveur légitime. Pour notre passerelle sécurisée, nous ajouterons un certificat client, pour que le serveur puisse valider que le client est bien légitime également.

A retenir

Pour garantir la sécurité d’un accès au travers d’un réseau il est nécessaire vérifier que vous êtes vous, que vous connaissez le mot de passe, et que ces données transitent chiffrées (cryptées) sur le réseau.

Pardonnez la longueur de ces explications, mais il nécessaire de bien comprendre les tenants et les aboutissants de ces éléments pour mettre en place un système fiable et sécurisé. Ceci étant dit, passons au choses sérieuses en réalisant un système qui mette tout ceci en œuvre. Procédons 🙂

Le matériel nécessaire

Rien de bien compliqué, un pack de base (Raspberry Pi, alimentation, carte SD et boitier) suffit. Je conseille toutefois le choix d’un modèle équipé d’un port Ethernet.

Raspberry_Pi_2Le Raspberry Pi 2 étant vendu au même prix que le B+, ne nous en privons pas !

Construction de la passerelle sécurisée : schéma global

raspberry_pi_passerelle_securisee

Le principe global est de mettre la passerelle sécurisée dans une DMZ (zone démilitarisée) et de bloquer les accès directs grâce au firewall (pare-feu) de la box Internet (ou du modem/routeur). De cette manière, tous les flux provenant de l’extérieur (Internet) sont redirigés vers la passerelle qui se charge de chiffrer les flux et de vérifier l’identité du visiteur. Ces deux étapes s’appuient sur des certificats. Si tout est ok, la passerelle redirige à son tour les flux vers l’équipement ciblé (On peut imaginer plusieurs équipement, caméras, une box domotique, un serveur de fichier,… ). L’authentification par mot de passe est assuré par l’équipement lui même en dernier ressort.

Note : Si votre box Internet ne permet pas de créer une DMZ, vous pouvez vous contenter de placer la passerelle directement dans votre réseau local. Il s’agira alors de configurer le firewall de la box pour rediriger tous les flux externes vers la passerelle.

Installation et configuration

Dans un premier tant il convient d’installer une Raspbian en bonne et due forme. Une fois démarré et la configuration de la carte réseau effectuée, nous aurons besoin d’installer Apache.

apt-get install apache2

Création des certificats

Nous allons donc créer un certificat serveur, et un certificat client (notez que vous pouvez créer autant de certificats client que vous le souhaitez, pour plusieurs personnes par exemple). Pour que ces certificats soient valides, nous devons les faire signer par une autorité de certification qui en attestera l’authenticité. Vous pouvez trouver ces services chez de nombreux fournisseurs reconnus, mais cela à un prix. Nous allons donc créer notre propre autorité de certification. Notez que cela n’est pertinent uniquement parce que travaillons sur nos environnements personnels, car l’autorité de certification que nous allons créer ne sera reconnue que par nous même.

L’outil qui permet de faire cela est openssl. Il est installé de base sur Raspbian.

Création de l’autorité de certification ou CA

Créez un fichier openssl.cnf et placez y cette configuration :

[ req ]
default_md = sha1
distinguished_name = req_distinguished_name

[ req_distinguished_name ]
countryName = Country
countryName_default = FR
countryName_min = 2
countryName_max = 2
localityName = Locality
localityName_default = France
organizationName = Organization
organizationName_default = Raspberry
commonName = Common Name
commonName_max = 64

[ certauth ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
basicConstraints = CA:true
crlDistributionPoints = @crl

[ server ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
nsCertType = server
crlDistributionPoints = @crl

[ client ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment, dataEncipherment
extendedKeyUsage = clientAuth
nsCertType = client
crlDistributionPoints = @crl

[ crl ]
URI=ca.crl

Créer le certificat auto-signé de l’autorité de certification en exécutant la commande suivante :

openssl req -config ./openssl.cnf -newkey rsa:2048 -nodes -keyform PEM -keyout ca.key -x509 -days 3650 -extensions certauth -outform PEM -out ca.cer

Ceci va générer deux fichiers ca.cer le certificat de l’autorité de certification et ca.key la clé qui sert au chiffrement du certificat.

Création du certificat serveur

Créez dans un premier temps une nouvelle clé :

openssl genrsa -out server.key 2048

Puis créez une CSR (Certificat Signing Request) ou une demande de signature de certificat (c’est l’équivalent du formulaire que vous remplissez en mairie pour faire votre carte d’identité) :

openssl req -config ./openssl.cnf -new -key server.key -out server.req

Vous devrez saisir certains paramètres dont le Common Name qui doit correspondre au nom de votre serveur (ou le nom de domaine que vous utiliserez pour vous y connecter).

Enfin, signez la CSR avec le certificat de l’autorité de certification pour obtenir votre certificat serveur :

openssl x509 -req -in server.req -CA ca.cer -CAkey ca.key -set_serial 100 -extfile openssl.cnf -extensions server -days 3650 -outform PEM -out server.cer

Trois fichiers seront générés, server.req qui est la CSR et que vous pouvez supprimer, ainsi que server.cer et server.key, respectivement le certificat et la clé du certificat.

Création du certificat client

Comme pour le certificat serveur, il faut commencer par générer une nouvelle clé :

openssl genrsa -out client.key 2048

Puis émettre une CSR :

openssl req -config ./openssl.cnf -new -key client.key -out client.req

Et signer la CSR avec la CA pour obtenir le certificat client :

openssl x509 -req -in client.req -CA ca.cer -CAkey ca.key -set_serial 101 -extfile openssl.cnf -extensions client -days 3650 -outform PEM -out client.cer

Note : si vous créez plusieurs certificats, incrémentez le numéro de série qui est ici de 101 et qui était de 100 pour le certificat serveur.

Pour que vous puissiez installer votre certificat client dans votre navigateur internet ou votre smartphone, il convient de le convertir au format pkcs12. Le fichier pkcs12 contient à la fois la clé et le certificat :

openssl pkcs12 -export -inkey client.key -in client.cer -out client.p12

Nous obtenons ainsi le fichier client.p12 qui contient le certificat client. Vous devez installer ce fichier dans votre smartphone en vous l’envoyant par mail, ou dans votre navigateur sur votre PC en passant par les paramètres avancés.

Pour aller plus loin, nous pourrions créer une CRL ou liste de « révocation » ; il s’agit d’une liste dans laquelle est inscrit tous les certificats que nous souhaitons interdire. Si par exemple vous vous faites voler votre smartphone, vous pouvez ajouter le certificat qui était installé sur votre smartphone à cette liste de révocation pour en interdire l’accès. Vous obtiendrez plus d’information sur les certificats et les listes de révocation en suivant ce lien.

Apache et reverse-proxy

Il s’agit ici de mettre en place un proxy, ou plus précisément, un reverse proxy. Sa fonction première est de gérer l’aiguillage des flux vers la caméra ou la box domotique par exemple. En parallèle il assurera le chiffrement du flux ainsi que la vérification du certificat client (la carte d’identité de l’utilisateur).

Editez le fichier /etc/apache2/site-enabled/000-default et remplacez son contenu par la configuration suivante en remplaçant le chemin vers les certificats du serveur et de la CA :

<VirtualHost *:443>
  
  SSLEngine On # activation https
  SSLCertificateFile /chemin/server.cer # certificat serveur
  SSLCertificateKeyFile /chemin/server.key # clé du serveur
  SSLVerifyClient require # force le serveur à vérifier le certificat client
  SSLVerifyDepth 1 # le certificat client doit être signé par la même autorité de certification
  SSLCACertificateFile /chemin/ca.cer # certificat de l'autorité de certification
  ProxyRequests Off # désactive les requêtes proxy
  
  # redirige camera1 sur l'adresse IP et le port de la caméra 1
  ProxyPass /camera1/ http://192.168.0.17:8080/
  ProxyPassReverse /camera1/ http://192.168.100.17:8080/

  # redirige camera2 sur l'adresse IP de le port de la camera 2
  ProxyPass /camera2/ http://192.168.0.18:8080/
  ProxyPassReverse /camera2/ http://192.168.0.18:8080/
  <Proxy *>
    Order allow,deny
    Deny from all
    allow from all
  </Proxy>
  LogLevel warn
  ErrorLog ${APACHE_LOG_DIR}/rproxy_error.log
  CustomLog ${APACHE_LOG_DIR}/rproxy_access.log combined
</VirtualHost>

Firewall

Puisque nous sommes vigilants, nous allons configurer des règles firewall sur notre passerelle sécurisée pour nous assurer que seul le port 433/TCP soit accessible de l’extérieur. Nous utiliserons pour cela iptables qui est installé de base sur Raspbian.

Créez le fichier /etc/init.d/firewall.sh :

#! /bin/bash

### BEGIN INIT INFO
# Provides: firewall
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Gateway firewall script
# Description: Enable service provided by daemon.
### END INIT INFO

tables_start()
{
iptables -N INPUT_LOG_ACCEPT
iptables -A INPUT_LOG_ACCEPT -j LOG --log-prefix "INPUT_ACCEPT -> "
iptables -A INPUT_LOG_ACCEPT -j ACCEPT

iptables -N INPUT_LOG_DROP
iptables -A INPUT_LOG_DROP -j LOG --log-prefix "INPUT_DROP -> "
iptables -A INPUT_LOG_DROP -j DROP

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT # accepte toutes les connexions en provenance du réseau local
iptables -A INPUT -p tcp --dport 433 -j INPUT_LOG_ACCEPT # on n'accepte que les connexions sur les port 433/TCP depuis l'extérieur
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state NEW,INVALID -j INPUT_LOG_DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -j ACCEPT
}

tables_clear()
{
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
}

tables_stop()
{
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -j REJECT
iptables -A OUTPUT -j REJECT
iptables -A FORWARD -j REJECT
}

tables_usage()
{
echo "usage: $0 [ start | stop | clear ]"
}

case "$1" in
stop)
echo " Stoping firewall ..."
tables_clear
tables_stop
exit 0
;;
clear)
tables_clear
exit 0
;;
start)
echo " Starting firewall ..."
tables_clear
tables_start
exit 0
;;

-h|--help)
tables_usage
exit 0
;;
*)
tables_clear
tables_start
exit 0
;;
esac

exit 1

Modifiez les droits d’exécution de ce script, puis lancez le automatiquement au démarrage du système :

chmod 755  /etc/init.d/firewall.sh
cd /etc/init.d
update-rc.d firewall.sh defaults

Redémarrez votre Pi, tout est prêt 🙂

Le mot de la fin

Il est difficile de proposer une solution « clé en main » pour ce type de système car il faut l’adapter à son réseau et à ses besoins. Dans tout les cas, le plus important à retenir est le principe de centraliser tous les accès sur une passerelle sécurisée avec une authentification forte et un chiffrement des flux.

La sécurité informatique est un sujet très vaste et complexe qui fait intervenir de nombreuses technologies et une multitude de concepts. J’espère vous avoir permis de mettre un pied dedans en vous aidant à protéger l’accès à vos équipements.

Dans cet article j’ai pris l’exemple d’une caméra IP, car c’est un exemple « choquant » en terme de sécurité (on peut être espionné à l’intérieur de chez soit), mais cette passerelle sécurisée peut être utilisé pour tout type d’équipement et projet comme par exemple :

N’hésitez pas à intervenir en commentaire pour proposer des améliorations à cette passerelle sécurisée 😉

L’article Créer une passerelle sécurisée avec un Raspberry Pi est apparu en premier sur MagdiBlog.

Raspberry Pi Camera – 5 façons de faire du streaming

Par : Olivier
25 janvier 2015 à 17:00

IMG_8806Le module Raspberry Pi Camera (et la version sans filtre IR, le module NoIR) sont de petits circuits (2,5cm x 2,5cm) dotés d’un capteur photo de 2592 x 1944 pixels capable d’enregistrer en 1080p à 30 images par secondes (ou 60 fps en 720p). Ce module se branche directement sur le port CSI du Pi prévu à cet effet.

La version NoIR permet de voir les infra-rouge, ce qui autorisera une vision nocturne si on le couple à un projecteur infra-rouge comme expliqué à fin de cet article : Système de vidéo-surveillance abordable avec des Raspberry Pi

Que ce soit pour un système de vidéo surveillance ou pour le pilotage d’un robot à distance, il faut pouvoir récupérer le flux vidéo et le diffuser à travers le réseau (streaming). Nous allons voir dans cet article 5 méthodes pour diffuser le flux vidéo d’un module Raspberry Pi Camera, plus ou moins efficacement.

Introduction et matériel utilisé

Le module Raspberry Pi Camera étant branché directement sur un Raspberry Pi, si vous voulez pouvoir voir les images capturées depuis un autre endroit qu’un écran branché sur ce même Pi, vous allez devoir envoyer ces images à travers le réseau. De nombreuses utilisations sont possibles :

  • la caméra de surveillance que l’on souhaite observer depuis son smartphone quand on part en vacance
  • le robot que l’on souhaite piloter à distance depuis un ordinateur de contrôle
  • filmer et diffuser des images en direct à travers internet
  • etc…

Petit bémol sur la notion de « streaming » vidéo : En principe, lorsqu’on parle de streaming vidéo, il s’agit bien d’un flux vidéo diffusé en direct. Comme nous allons le voir plus loin dans cet article, cette méthode consomme énormément de ressources (notamment en terme de bande passante), et dans de nombreux cas, il sera plus judicieux de diffuser une « suite d’images » à intervalles réguliers.

IMG_8810Le matériel

Pour l’ensemble des méthodes exposées dans cet article, nous utiliserons le matériel et le montage suivant :

Le Raspberry Pi A+ est vraiment idéal pour ce genre projet. Découvrez pourquoi en lisant cet article : Raspberry Pi A+ : Le meilleur de tous

On installe une Raspbian, tout ce qu’il y a de plus standard, on se connecte à son réseau WiFi et on active le module caméra grâce à l’outil raspi-config.

Voyons maintenant comment diffuser les images sur le réseau.

Méthode 1 : Netcat et Mplayer

C’est la méthode la plus simple et la plus directe. Il s’agit simplement de rediriger le flux capturé par la commande raspivid dans netcat, puis de récupérer ce flux et l’injecter en entrée dans le lecteur vidéo Mplayer. L’inconvénient de cette méthode est que le flux vidéo n’est visible que depuis un seul PC distant.

Depuis un PC sous Linux exécutez dans un premier temps la commande suivante (après avoir installé mplayer si besoin) :

nc -l -p 5001 | /usr/bin/mplayer -fps 10 -cache 1024 -

Cette commande ordonne à nc (netcat) d’écouter sur le port 5001 et redirige ce qui arrive dans le lecteur vidéo Mplayer en prévoyant un cache de 1024 Ko pour 10 images par secondes.

Puis, sur le Pi, il suffit d’exécuter raspivid et de rediriger la sortie vers l’adresse IP de notre PC client en utilisant netcat :

raspivid -t 0 -w 1280 -h 720 -o - | nc adresse_ip_du_pc_client 5001

On indique ainsi à raspivid de capturer des images en 1280×720 pixels et de les envoyer à netcat.

Simple et efficace, une fenêtre Mplayer s’ouvre automatiquement sur le PC client avec les images en direct. On notera toutefois une forte latence qui peut varier de 3 à 15 secondes en fonction de la qualité et du nombre d’images transmisses et de la qualité du lien WiFi.

Note : Un test réalisé sur un Raspberry Pi B, branché en Ethernet, permet de réduire la latence à environ une seconde.

Si vous souhaitez enregistrer le flux vidéo dans un fichier sur le PC client, il suffit de modifier la première commande de cette manière :

nc -l -p 5001 | /usr/bin/mplayer -fps 10 -cache 1024 -demuxer h264es -dumpstream -dumpfile ./Bureau/ma_video.h264 -

Méthode 2 : streaming VLC

Cette méthode, relativement simple à mettre en place, souffre d’une très forte latence. Toutefois, et contrairement à la première méthode, le flux vidéo est visible depuis plusieurs postes clients.

Sur le Pi, il suffit d’installer VLC :

apt-get install vlc

Puis de rediriger la sortie de la commande raspivid (comme dans la méthode 1) vers VLC en exécutant la commande suivante :

raspivid -t 0 -n --width 1280 --height 720 -o - | cvlc stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264

Coté PC client, il suffit de lire le flux vidéo avec VLC grâce à la commande :

cvlc http://adresse_ip_du_pi:8090

Pour enregistrer le flux vidéo dans un fichier, utilisez la commande suivante :

cvlc http://adresse_ip_du_pi:8090 --sout file/ts:./Bureau/ma_video.h264

Cette méthode est à privilégier si vous souhaitez diffuser votre flux vidéo à plusieurs personnes sur internet par exemple, et que la latence n’est pas un problème.

Méthode 3 : streaming de Pi à Pi avec OMXplayer

Les méthodes 1 et 2 permettent de diffuser le flux vidéo à destination d’un ordinateur distant. Si vous souhaitez capturer un flux vidéo depuis un Pi pour l’observer depuis un autre Pi branché à un écran, il convient d’utiliser le lecteur OMXplayer.

Cette méthode est un peu plus complexe à mettre en oeuvre mais permet plus de souplesse quant à l’usage que l’on souhaite en faire. Depuis le Pi équipé du module caméra, nous allons procéder exactement comme pour la méthode 1, en redirigeant la sortie de la commande raspivid dans netcat. Puis, sur le Pi branché à l’écran de visionnage, nous allons dans un premier temps récupérer le flux netcat pour l’enregistrer dans un fichier et le lire, dans un deuxième temps, avec OMXplayer.

Sur le Pi de visionnage, créez d’abord un fichier de type fifo :

mkfifo /dev/shm/video.fifo

Deux points très important à comprendre dans cette commande :

  • /dev/shm : ce point montage fonctionne comme un disque dur mais aucune donnée ne sera stockée sur le disque dur en lui même ; tout sera géré en mémoire vive. C’est parfait pour y placer un fichier vidéo tampon.
  • fichier de type .fifo : les fichiers de type fifo fonctionnent comme les fichiers standards, mais se comportent comme des « pipes », ce qui permet au système d’y stocker des données sans passer par le système de fichier. Encore une fois, parfait pour y placer un fichier vidéo tampon 🙂

Le fichier tampon étant prêt, il faut maintenant le remplir. Côté Pi de visionnage, mettez netcat en écoute en redirigeant la sortie vers le fichier tampon :

nc -l -p 5001 > /dev/shm/video.fifo

Puis côté Pi caméra, envoyez le flux vidéo à travers netcat comme dans la méthode 1 :

raspivid -t 0 -w 960 -h 540 -o - | nc adresse_ip_du_pi_visionnage 5001

De retour sur le Pi de visionnage, il suffit de dire à OMXplayer de lire le fichier tampon :

omxplayer /dev/shm/video.fifo

Cette méthode n’offre pas une latence exemplaire, mais permet de transmettre un flux vidéo de Pi à Pi. Idéal par exemple pour créer un portier vidéo, avec un Pi qui film et un Pi qui affiche la vidéo, les deux Pi étant reliés par WiFi 🙂

Méthode 4 : mjpg-streamer

A partir de là, on sort du streaming vidéo pur et dur puisqu’il s’agit, avec le mjpeg, de transmettre et d’afficher une suite de photos les unes après les autres. Le résultat est beaucoup moins fluide puisqu’on ne pourra espérer afficher que 5 à 10 images par seconde maximum (contre 10 à 30 images par secondes pour les méthodes précédentes), mais nous pourrons exploiter les images beaucoup plus simplement en les affichant dans une page web, ou sur un écran comme le PiHomeDashScreen par exemple. Si vous disposez d’un NAS Synology, ou d’un système sachant gérer des caméras IPs, vous pourrez également exploiter la caméra du Pi grâce à cette méthode.

Voici le lien vers la page SourceForge de mjpg-streamer : http://sourceforge.net/projects/mjpg-streamer/

Dans un premier temps, installez les dépendances de mjpg-streamer ainsi que subversion :

apt-get install subversion libv4l-dev libjpeg8-dev imagemagick

mjpg-streamer aura besoin d’un fichier videodev.sh pour fonctionner correctement :

ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h

Téléchargez ensuite la dernière version de mjpg-streamer grâce à subversion, puis installez le en utilisant les commandes suivantes :

svn co https://svn.code.sf.net/p/mjpg-streamer/code/
cd code/mjpg-streamer
make USE_LIBV4L2=true clean all
make DESTDIR=/usr install

Une fois installé, créez un répertoire temporaire et lancez raspistill en mode timelapse pour capturer 2 images par secondes :

mkdir /tmp/stream
raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 500 -t 9999999

Enfin, lancez mjpg-streamer grâce à cette commande :

LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o "output_http.so -w ./www"

Par défaut, mjpg-streamer lancera un serveur web sur le port 8080/TCP auquel vous pouvez accéder avec un navigateur en utilisant l’adresse : http://adresse_du_pi:8080

Vous devriez voir l’interface de démonstration de mjpg-streamer :

capture_mjpg-streamer

Les deux options les plus intéressantes sont JavaScript et Stream. Ces deux méthodes vous permettrons de récupérer les images pour les afficher dans une page web, ou sur le PiHomeDashScreen comme vous pouvez le voir dans la photo si dessous :

capture_homedashscreen_pi_camera

Pour réaliser cela, j’ai simplement placé le code suivant dans le fichier index.php du PiHomeDashScreen (consulter les articles de ce projet pour en savoir plus).

<div id="webcam"><img src="http://adresse_ip_du_pi:8080/?action=snapshot" /></div>

<script type="text/javascript">
  var imageNr = 0;
  var finished = new Array();
  var paused = false;
  function createImageLayer() {
    var img = new Image();
    img.style.position = "absolute";
    img.style.zIndex = -1;
    img.onload = imageOnload;
    img.onclick = imageOnclick;
    img.src = "http://adresse_ip_du_pi:8080/?action=snapshot&n=" + (++imageNr);
    var webcam = document.getElementById("webcam");
    webcam.insertBefore(img, webcam.firstChild);
  }
 
  function imageOnload() {
    this.style.zIndex = imageNr; // Image finished, bring to front!
    while (1 < finished.length) {
    var del = finished.shift(); // Delete old image(s) from document
    del.parentNode.removeChild(del);
  }
  finished.push(this);
    if (!paused) createImageLayer();
  }
</script>

C’est de loin la méthode que je recommande car elle permet de diffuser les images à plusieurs clients en même temps tout en conservant une latence acceptable pour peu que l’on se contente d’une image de qualité moyenne.

Méthode 5 : Serveur Web

Cette méthode consiste à capturer des images à intervalles régulier avec la commande raspistill, puis à les diffuser grâce à un serveur web Apache. C’est la méthode que j’ai utilisé pour réaliser ce Système de vidéo-surveillance abordable avec des Raspberry Pi.

video_surveillance_monitorin_safe

Cette méthode est très proche, fonctionnellement, de mjpg-streamer. Je songe d’ailleurs à refondre mon système de vidéo surveillance en utilisant mjpg-streamer.

Je vous invite à lire cet article pour en savoir plus sur cette méthode « artisanale » 😉Système de vidéo-surveillance abordable avec des Raspberry Pi

Conclusion

raspberry_pi_cameraLes méthodes de streaming vidéo pur (méthode 1 à 3) permettent un affichage fluide en sacrifiant la réactivité, ce qui rend cette option inutilisable pour le pilotage d’un robot par exemple.

Les méthodes utilisant une suite d’images sur le principe du mjpeg (méthode 4 et 5) permettent une plus grande souplesse dans l’exploitation des images et offrent globalement une meilleure latence (car moins d’images à traiter et à faire transiter par le réseau). Personnellement, j’utilise la méthode 4 avec mjpg-streamer pour la quasi totalité de mes projets actuels. C’est une méthode très polyvalente, simple à mettre en place et peu gourmande en ressource pour le Pi.

Quelque soit la méthode utilisée, le vrai problème reste la bande passante. Que ce soit en 3G, en Wifi ou même en Ethernet, la vitesse du réseau sera limitante pour la transmission d’images.

raspberry_pi_camera_noirVous trouverez sur le net beaucoup d’articles qui expliquent comment mettre en oeuvre le logiciel Motion sur un Raspberry Pi. Je conseille cette approche uniquement si vous souhaitez faire de la détection de mouvement car Motion est fait pour cela à la base. Même si Motion utilise le même principe du mjpeg que dans les méthodes 4 et 5, il est très gourmand en ressources pour un Pi et offrira moins de souplesse que mjpg-streamer.

Reste une méthode que je n’ai pas encore essayé à ce jour mais qui semble être intéressante car « prête à l’emploi » pour un Pi : http://elinux.org/RPi-Cam-Web-Interface.

Je vous invite à partager vos expériences sur ce sujet, notamment pour savoir si vous connaissez des méthodes qui offrent une latence très faible.

Article intéressant sur le sujet :

L’article Raspberry Pi Camera – 5 façons de faire du streaming est apparu en premier sur MagdiBlog.

Raspberry Pi A+ : Le meilleur de tous

Par : Olivier
24 janvier 2015 à 17:37

IMG_8778Depuis la sortie du premier modèle il y 3 ans (début 2012), la fondation Raspberry Pi n’a cessé d’améliorer le PCB de ce mini ordinateur. Toutes les versions actuelles sont basées sur la même puce Broadcom BCM2835 qui intègre un CPU (processeur), un GPU (processeur graphique), la mémoire SDRAM et un DSP. La différence entre les 4 modèles existants aujourd’hui (hormis la version compute module que je laisse de côté pour le moment), se joue essentiellement au niveau du format de la carte et des ports disponibles.

Aujourd’hui, je vais vous parler du dernier né, le modèle A+, dont j’ai fait l’acquisition récemment, et qui représente pour moi le meilleur Raspberry Pi conçu à ce jour.

Les 4 modèles de Raspberry Pi

Il existe 4 modèles bien différents actuellement : A, B, B+ et A+ (par ordre de sortie). Je mets volontairement de côté les variantes du modèle B (256Mo ou 512Mo de SDRAM, avec ou sans polyfuse, la version 256Mo n’étant plus distribuée), ainsi que le compute module (qui n’est pas une carte prête à l’emploi, et qui ne représente pour moi que peu d’intérêt).

La page Wikipédia sur le Raspberry Pi expose de manière très détaillée les caractéristiques techniques de ces différents modèles : http://fr.wikipedia.org/wiki/Raspberry_Pi

Si vous découvrez l’univers des Raspberry Pi, sans rentrer dans les détails vous pouvez retenir que les modèles B sont dotés de plus de SDRAM (512Mo contre 256Mo pour les modèles A), et qu’ils disposent d’un port Ethernet (et accessoirement de ports USB supplémentaires). Une différence notable concernant les modèles A+ et B+ par rapport à leur homologues A et B, est qu’ils disposent d’un port GPIO plus fournis.

Cela étant dit, le modèle A+ se distingue de la fratrie sur trois critères essentiels, qui en font pour ma part, le meilleur Raspberry Pi actuel.

Raspberry Pi A+ : un PCB mieux pensé et des choix techniques très pertinents

Un design plus compact et moins encombrant

IMG_8797La première chose que l’on observe c’est que le modèle A+ est beaucoup plus compacte que tous les autres. En effet, il mesure 2 cm de moins en longueur. 2 cm ce n’est pas grand chose dit comme ça, mais c’est tout de même 1/4 plus petit que les autres modèles. En passant de 8,5 cm à 6,5 cm, le modèle A+ tient réellement dans le creux de la main. La différence se fait également sentir sur la balance puisque le modèle A+ ne pèse que 23g, soit presque deux fois moins que le modèle A (45g).

Mais ce qui fait réellement la différence au niveau de l’encombrement, ce sont les trois points suivants :

  • Le remplacement de port SD par un port micro-SD fait que la carte mémoire ne dépasse quasiment pas du PCB (on gagne encore 1,5 cm sur la longueur totale).
  • La suppression du port composite réduit la largeur, la suppression du port Ethernet le rend beaucoup plus plat que les modèles B et B+, et le port USB ressort moins de la carte ce qui permet de gagner encore 0,5 cm sur la longueur totale.
  • Enfin, et c’est le point le plus important, tous les ports (jack, HDMI, alimentation) sont du même côté de la carte et orienté dans le même sens 🙂

Raspberry_pi_AA gauche, le modèle A (qui a les mêmes mensurations et le même agencement que le modèle B), à droite, le modèle A+. De l’extrémité du port USB à la carte SD, on note une différence de 4 cm au total.

Le fait d’avoir les ports du même côté réduit considérablement l’encombrement de l’ensemble.

 IMG_8800  IMG_8804

A gauche, avec le modèle A, ça part dans tous les sens, c’est très pénible à organiser, il faut déblayer la moitié du bureau pour travailler correctement ! Avec le modèle A+ en revanche, à droite, c’est propre, compact, facile à organiser et on peut facilement loger l’ensemble dans un boitier 🙂 Un immense merci à l’équipe de la Raspberry Pi Foundation 🙂

La consommation

Le deuxième gros point fort du modèle A+ par rapport aux autres modèles est sa consommation réduite.

Alors que le modèle B tirera près de 700mA de courant, le modèle A+ ne nécessitera qu’un courant de 200mA, soit plus de trois fois moins. Ce qui veut dire que pour un projet qui nécessite de faire fonctionner le Raspberry Pi sur batterie (voir Comment alimenter votre Raspberry Pi avec une batterie), on pourra tenir 3 fois plus longtemps.

Avec une consommation de 1W seulement, l’alimentation du Raspberry Pi avec un panneau solaire devient tout à fait envisageable 🙂 Par exemple, ce chargeur de 6W Expower, dont on peut supposer un rendement effectif de 20%, pourrait faire tourner un Pi A+ 24h/24 🙂 (à tester).

Le GPIO 40 broches

Alors que les ports GPIO des modèles A et B ne disposaient que de 26 broches, celui du modèle A+ (et B+) en comporte 40.

 GPIOs raspberry_pi_gpio_a-plus

A gauche, le GPIO à 26 broches des modèles A et B. A droite, le nouveau port GPIO à 40 broches.

On retrouve les mêmes types de bus, mais en plus grand nombre 🙂

Conclusion

Avec son format compact et son design mieux étudié, son poids plume, sa consommation très faible et son port GPIO aux possibilités démultipliées, le Raspberry Pi A+ est le modèle qui conviendra le mieux aux projets dits « embarqués » (robots, sondes, caméras, datalogger, ). Les modèles B et B+ seront, quant à eux, à privilégier pour créer de petits serveurs (web, NAS, domotique) ou pour des applications multimédia (XBMC, MPD), qui nécessitent plus de mémoire et un port Ethernet.

Un petit regret toutefois, le modèle A+ n’est doté que de 256Mo de RAM ce qui peut être limitant pour certains projets.

L’article Raspberry Pi A+ : Le meilleur de tous est apparu en premier sur MagdiBlog.

RaspberryPi + Razberry + RFXtrx433 USB + Domoticz : Le combo parfait !

Par : Olivier
3 janvier 2015 à 18:12

 

IMG_8254Il y a quelques mois je vous présentais le module Razberry, un contrôleur Z-Wave pour Raspberry Pi, et j’illustrais mon propos avec un article sur comment contrôler ses lumières.

Aujourd’hui, j’élargis le sujet en introduisant le contrôleur RFXCOM RFXtrx433E et le logiciel Domoticz. L’ensemble piloté par un Raspberry Pi forme un contrôleur domotique ultime.

Le Raspberry Pi a réellement sa place dans une installation domotique car il offre, pour une bouchée de pain, de nombreuses possibilités grâce à son port GPIO et ses ports USB. De nombreux périphériques et capteurs peuvent ainsi être directement branchés sur une Raspberry Pi. Ajoutez à cela, un contrôleur Z-Wave et un transmetteur RFXCOM RFXtrx433E et vous voilà armé pour domotiser toute votre maison en utilisant de nombreux modules de constructeurs et de marque variés. L’ensemble étant disponible à un prix très abordable et offrant un niveau de personnalisation sans limite, il s’agit vraiment pour moi d’un combo ultime 🙂

Une box domotique ultime pour moins de 230 €

Pour créer ce contrôleur domotique il vous faut :

Branchez le module Razberry sur le port GPIO du Raspberry Pi et le module RFXCOM sur un port USB. Installez une Raspbian, et vous voilà prêt 🙂

Installer Z-Way pour contrôler le module Razberry

L’installation est très simple et se fait en une seule commande :

wget -q -O - razberry.z-wave.me/install | sudo bash

Pour plus de détail concernant l’utilisation de Z-Way, je vous invite à lire cet article : Z-way et module Razberry

Domoticz un logiciel pour les gouverner tous

DomoticzPour faire fonctionner tout ce beau monde ensemble, nous allons utiliser le logiciel open source Domoticz.

Domoticz est une sorte d’agrégateur qui permet de gérer de nombreux contrôleurs tels que :

  • le module Razberry
  • le module RFXCOM
  • la Teleinfo EDF comme vu dans cet article
  • le port GPIO du Raspberry Pi
  • la carte d’extension PiFace

L’installation de Domoticz sur le Pi se fait relativement facilement en suivant le WiKi prévu à cet effet : http://www.domoticz.com/wiki/Installing_and_running_Domoticz_on_a_Raspberry_PI

ATTENTION : Pour que Z-Way et Domoticz puissent fonctionner ensemble sur le même Raspberry Pi, il est impératif d’utiliser une Raspbian vierge puis d’installer Z-Way et Domoticz. Il ne faut pas utiliser les images pré-paquagées de Z-Way ou de Domoticz.

Une fois Domoticz Installé, il suffit de configurer les contrôleurs que vous souhaitez gérer en allant dans l’onglet « Setup ». Dans cet exemple, nous nous limitons au module Razberry et au transmetteur RFXCOM :

Capture_Domoticz_Hardware

A partir de là, vous êtes prêt à utiliser tous les modules domotique fonctionnant en Z-Wave ainsi que la plupart des modules fonctionnant en radio sur la banque de fréquence 433,92 Mhz. Autant dire que les possibilités sont grandes. Vous pouvez acheter n’importe quel module Z-Wave, mais vous pouvez également vous rendre dans n’importe quel magasin de bricolage et acheter de nombreux modules domotiques compatibles avec le transmetteur RFXCOM, dont vous pouvez consulter la liste ici : http://www.rfxcom.com/store/Transceivers/14103 (dans la section « Will Support »)

Quelques exemples avec mon installation actuelle

Outre les modules « prise de courant » pour piloter mes lumières comme expliqué dans l’article Contrôle de l’éclairage avec le module Z-Wave Razberry, je me suis équipé de capteurs de température et d’humidité, de modules pour piloter mes volets roulants, de détecteurs d’ouverture de porte, de capteurs de luminosité, de module intégrés pour mes plafonniers, etc…

 Voici en vrac, la liste de quelques modules que j’utilise :

  • EVERSPRING Mini-détecteur d’ouverture Z-Wave HSM02
  • OREGON SCIENTIFIC Sonde Thermo Hygro 3 canaux THGR122NX
  • FIBARO Micromodule pour volet roulant Z-Wave FGRM-221
  • EVERSPRING Module Prise ON/OFF Z-Wave AN157-6
  • CHACON DI-O Module On/Off sans fil (54755)
  • Aeon Labs – Multisensor – Détecteur multifonction Z-Wave

Voici ce que cela donne dans Domoticz :

Capture_Domoticz

Domoticz offre de nombreuses fonctionnalités, comme la programmation de scénarios, la gestion de caméra de surveillance, etc… Je vous laisse découvrir tout cela par vous mêmes 😉

Dans mon prochain article, suite à la demande de plusieurs lecteurs, j’expliquerai comment utiliser l’API de Domoticz pour afficher la température et d’autres données météo sur le Pi HomeDashScreen 😉

Capture_Home_Dash_Screen_Domotique

L’article RaspberryPi + Razberry + RFXtrx433 USB + Domoticz : Le combo parfait ! est apparu en premier sur MagdiBlog.

BateauRaspberry : bateau piloté avec un Pi (par Tim)

Par : Olivier
14 mai 2014 à 13:43

Bonjour à tous,

Il y a quelques semaines je vous présentais le projet BateauRaspberry de Tim : http://www.magdiblog.fr/divers/bateauraspberry-un-bateau-entierement-fait-main-pilote-par-un-pi/

timelapse_2014-04-21_17-42-00_08Après quelque souci pour héberger l’article très complet qu’il à réalisé sur son projet, j’ai proposé à Tim d’héberger et de rellayer son travail 🙂 Voici donc la retranscription complète de son article 🙂

RASPBERRY BATEAU

Sommaire

  • Le Raspberry Bateau
  • Inventaire des éléments utilisés
  • Connexion 3g / Hotspot Wifi
  • Commande des Servomoteurs
  • Commande photo par Webcam et serveur distant
  • Interface graphique Web sur mobile
  • Streaming du flux vidéo de la webcam
  • Commander un projecteur à LEDs
  • Mais alors ça donne quoi tout ça ??!

Introduction

En 1999, j’ai fabriqué une maquette de bateau en bois d’environ 1 mètre de long. Ce bateau embarque deux servomoteurs. L’un est rattaché à un variateur qui permet de faire tourner plus ou moins vite un moteur sur lequel est rattaché une hélice. L’autre permet de changer l’angle du gouvernail. Ces deux servomoteurs peuvent être contrôlés par onde radio à l’aide d’une télécommande que l’on trouve dans les magasins de modélisme ou d’électronique.

Le défi que je me suis donné était de remplacer la télécommande par un téléphone ou une tablette. Je voulais aussi ajouter une caméra pour voir ce que le bateau voit et pouvoir prendre des photos.

Je me suis dit que d’autres auraient des défis similaires donc j’ai décidé de partager tous les détails techniques sur mon expérience. Bien-sûr, ne soyez pas trop critiques, il existe probablement des choix bien meilleurs que les miens.

Je voudrais remercier tout particulièrement Olivier, l’auteur du blog MagdiBlog qui a été une véritable source d’inspiration pour moi. Son blog est exceptionnellement bien écrit et agréable à lire. Ces projets sont intéressants, détaillés et précis. Plusieurs parties de mon projet n’auraient pas pu être réalisées sans ses explications. J’ai réutilisé des codes appartenant à plusieurs de ses projets pour arriver à mes fins. Je recommande vivement son site à tous ceux qui s’intéressent au Raspberry Pi.

Vous le trouverez ICI.

Le Raspberry Bateau

Passons au vif du sujet. Voici la bête ! 🙂

tim_bateau_telecommande_raspberry_piLa cabine se retire pour accéder aux moteurs, servomoteurs, Raspberry Pi, batteries etc.

Sur le dessus de la cabine, on retrouve la webcam qui permet de filmer et prendre des photos. Le pont arrière laisse ressortir un adaptateur USB WIFI :

20140423_200747

Inventaire des éléments utilisés

2014-04-29_08h45_55Voici le dongle WIFI D-Link DWA-131 Nano que j’ai utilisé :

http://www.amazon.fr/D-Link-DWA-131-Nano-WiFi-N300/dp/B002PD61Y4

 

 

Lorsque l’on ouvre les entrailles du bateau, voici les différents éléments que l’on retrouve :

20140423_200523-21. Une batterie 6V 12A pour alimenter le moteur.

2. Un moteur auquel est rattaché un arbre moteur qui entraîne l’hélice du bateau.

3. Un servomoteur qui pilote par son angle de rotation et à l’aide de la tige métallique un variateur.

4. Le variateur qui va définir la vitesse et le sens de rotation du moteur.

5. Un Raspberry Pi modèle B 512MB protégé par une coque dont j’ai découpé une partie pour laisser l’accès aux broches GPIO. C’est lui le chef d’orchestre qui va :

  • 2014-04-29_08h21_10recevoir les commandes de mon téléphone
  • piloter le servomoteur qui contrôle le moteur
  • piloter le servomoteur qui contrôle l’angle du gouvernail
  • prendre des photos à l’aide la webcam, les stocker en local sur sa carte SD et envoyer une miniature à mon téléphone par mail.
  • filmer à l’aide de la webcam et « streamer » le flux vidéo à mon téléphone :

    http://www.amazon.fr/gp/product/B0050FBISI/ref=oh_details_o01_s00_i00?ie=UTF8&psc=1

Le modèle de mon Raspberry Pi : http://www.amazon.fr/Raspberry-Pi-RBCA000-Carte-1176JZF-S/dp/B008PT4GGC/ref=sr_1_1?ie=UTF8&qid=1398751245&sr=8-1&keywords=raspberry+pi+512

2014-04-29_08h26_56

Un exemple de coque de protection qui laisse une ouverture au port GPIO : http://www.amazon.fr/gp/product/B00A543LNE/ref=ox_sc_sfl_title_4?ie=UTF8&psc=1&smid=A2717MKXZVZ1ZW

2014-04-29_08h29_50

2014-04-29_08h20_57Le système peut être installé sur une petite carte SD cependant, afin de pouvoir stocker les photos prises, j’ai opté pour une carte SD avec plus de capacité : http://www.amazon.fr/gp/product/B0087ECDH4/ref=oh_details_o00_s00_i00?ie=UTF8&psc=1

 

6. Assembled Pi Cobbler Breakout Kit :

Il sert à raccorder facilement le port GPIO de Raspberry Pi sur un breadboard sur lequel je branche les servomoteurs : http://www.amazon.fr/Assembled-Cobbler-Breakout-Kit-Raspberry/dp/B0093K6QQ0/ref=pd_sim_ce_1?ie=UTF8&refRID=1NRAZVQWQXB29CYX3Z2C

2014-04-29_08h21_53 2014-04-29_08h21_44

 

 

 

 

 

 

 

 

 

 

7. Batterie portable :

2014-04-29_08h20_30On ne la voit pas très bien mais il s’agit d’une batterie externe portable qui sert de chargeur de secours pour des téléphones ou tablettes Apple. Celle-ci convient parfaitement comme source d’alimentation du Raspberry Pi. Elle tient d’ailleurs pas mal de temps j’étais agréablement surpris : http://www.amazon.fr/gp/product/B0089MLH7Q/ref=oh_details_o02_s00_i00?ie=UTF8&psc=1

8. Une pile 4.5 V qui me permet d’alimenter un petit projecteur à LED contrôlé par une broche du port GPIO.

Pour plus de simplicité et afin faire une livraison groupée, j’ai essayé de trouver tous les éléments électroniques sur Amazon. En ce qui concerne les éléments batteries, coupleurs de piles, moteur et servomoteurs, je les ai obtenus dans un magasin d’électronique et de modélisme ici : http://www.electronique-diffusion.fr/

Une fois les courses faites et tous les éléments assemblés, il est temps de mettre un peu les mains dans le code !

Je ne m’étendrai pas sur tout ce qui concerne l’installation du système du Raspberry Pi car tout est très bien expliqué sur leur site ou sur de nombreux blogs. Pour ce projet, j’ai installé le système Raspbian : http://www.raspberrypi.org/downloads/

Connexion 3g / Hotspot Wifi

Commençons par la connexion entre le téléphone et le bateau.
Il existe plusieurs possibilités mais le principe est bien de créer un réseau sans fils entre le téléphone (ou la tablette) et le Raspberry Pi. Ce réseau doit être fiable car ce serait bête de perdre la connexion alors que le bateau se trouve au milieu du lac !

2014-04-29_08h21_25

http://www.amazon.fr/gp/product/B004UIVIBS/ref=oh_details_o03_s00_i00?ie=UTF8&psc=1

J’ai tout d’abord essayé de configurer (connecté au Raspberry Pi) un modem usb 3g dans lequel j’ai mis une carte SIM de l’opérateur Free. En suivant les instructions du site d’Olivier ici j’ai pu configurer le modem et obtenir du réseau internet sur le Raspberry. Ce système est très dépendant de la qualité du réseau 3g de Free et malheureusement les performances n’étaient pas au rendez-vous… J’ai eu plusieurs déconnexions. Cependant, sachez que ce système fonctionne avec le Raspberry Pi si vous cherchez à avoir de l’internet n’importe où. Si vous voulez plus d’infos sur cette partie, j’ai pris des notes que je peux partager mais je ne les ai pas mises sur ce blog car j’ai opté pour la solution du hotspot Wifi.

J’ai donc opté pour la création d’un réseau privé WIFI. Mon téléphone Android et mon opérateur me permettent de transformer mon téléphone en modem WIFI. Vous trouverez sur internet plein de tutoriels pour réaliser cette opération. Votre téléphone créé alors un point d’accès WIFI auquel il est possible de se connecter comme le fait votre box. L’idée est de créer se réseau et de configurer le Raspberry Pi pour qu’il s’y connecte automatiquement au démarrage.

Une fois le téléphone configuré, vous devez trouver sur quelle plage ip il se connecte.

Tout d’abord, il faut connecter le dongle WIFI usb au Raspberry Pi :

20140423_200609

NOTE : J’ai choisi d’utiliser un câble USB d’extension pour faire sortir le dongle du bateau.

Connectez aussi votre Raspberry à votre réseau ethernet et connectez vous en SSH au Raspberry. Je ne m’étendrai pas sur comment réaliser cela car tout est expliqué en détail sur internet.

NOTE : Je passe toutes mes commandes en root comme ça je ne suis pas embêté à entrer sudo, le mot de passe etc… Je sais c’est pas bien mais… on s’en fiche ! 🙂

Modifiez le fichier « /etc/network/interfaces » comme suivant à l’aide de la commande vi :

auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp

wpa-ssid NOM_DE_VOTRE_WIFI
wpa-psk MOT_DE_PASSE_DU_WIFI

Relancez le réseau wifi à l'aide des commandes suivantes :

sudo ifdown wlan0
sudo ifup wlan0

Pour connaître l’ip que votre téléphone vous a attribué, entrez la commande « ifconfig » et notez l’adresse ip de la carte wlan0. Voici ce que me donne ma configuration :

2014-04-29_10h50_52

Le téléphone peut aussi vous indiquer qu’un nouveau périphérique s’est connecté au réseau.

Quand le bateau n’est pas connecté :

device-2014-03-18-193736Quand le dongle Wifi obtient une adresse ip :

device-2014-03-18-193417

L’adresse ip du bateau sera donc 192.168.43.115. Comme c’est une configuration DHCP, l’adresse pourrait changer au reboot mais le téléphone enregistre la MAC adresse de la carte et pour ma part l’ip attribuée a toujours été la même. Si on souhaite vraiment qu’elle ne change pas, il suffit de modifier le fichier précédent et d’enregistrer l’ip comme static.

Note importante : Activez toujours le point d’accès wifi depuis votre téléphone avant de démarrer le Raspberry. Ainsi, il prendra tout de suite l’ip. Dans le cas contraire, si vous n’avez pas la possibilité de vous connecter en ethernet (par exemple vous êtes déjà au bord du lac), il vous faudra éteindre votre Raspberry « non-proprement » en lui retirant l’alimentation ce qui risque de corrompre le système de fichier et bloquer le système au prochain démarrage.

Bien ! Nous savons maintenant faire en sorte que le Raspberry Pi et le téléphone se retrouve dans le même réseau WIFI privé au démarrage. Après plusieurs tests je n’ai vraiment pas été déçu par la portée de ce petit réseau. J’arrive à piloter le bateau jusqu’à une bonne dizaine de mètres.

Commande des Servomoteurs

Pour piloter les servomoteurs, j’ai utilisé le logiciel pour Raspberry ServoBlaster. Celui-ci créé une interface pour piloter plusieurs servomoteurs depuis les broches du port GPIO. Voici les commandes pour l’installer et le configurer :

sudo apt-get install git
git clone git://github.com/richardghirst/PiBits.git

Positionnez-vous dans le dossier « /PiBits/ServoBlaster/user« . Vous devriez y trouver les fichiers suivants :

root@raspberrypi:~/PiBits/ServoBlaster/user# ls
init-script  Makefile  servod.c

Ensuite :

root@raspberrypi:~/PiBits/ServoBlaster/user# make servod
gcc -Wall -g -O2 -o servod servod.c -lm
root@raspberrypi:~/PiBits/ServoBlaster/user# ./servod

Board revision:                  2
Using hardware:                PWM
Using DMA channel:              14
Idle timeout:             Disabled
Number of servos:                8
Servo cycle time:            20000us
Pulse increment step size:      10us
Minimum width value:            50 (500us)
Maximum width value:           250 (2500us)
Output levels:              Normal

Using P1 pins:               7,11,12,13,15,16,18,22
Using P5 pins:

Servo mapping:
0 on P1-7           GPIO-4
1 on P1-11          GPIO-17
2 on P1-12          GPIO-18
3 on P1-13          GPIO-27
4 on P1-15          GPIO-22
5 on P1-16          GPIO-23
6 on P1-18          GPIO-24
7 on P1-22          GPIO-25

Après installation, ci-dessus, la configuration par défaut est affichée. Pour en savoir plus sur le fonctionnement de ServoBlaster, vous pouvez aussi entrer la commande help :

Image

C’est à vous ensuite d’en apprendre plus sur le modèle de votre servomoteur pour savoir quelles valeurs configurer. Par exemple pour les miens en faisant une petite recherche Google :

ImagezED

Je me sers ensuite de ces informations pour configurer au mieux ServoBlaster. J’ai trouvé que le plus simple était de faire des tests en envoyant des commandes de pourcentage courtes pour voir comment le servo réagi et où se trouvent les extrémités. Au final, j’ai utilisé les broches 7 et 11 pour piloter mes deux servomoteurs (c’est à dire les GPIO 4 et 17 d’après le tableau de mapping plus haut). Voici un exemple de fichier de test pour mes deux servomoteurs :

echo "Configuring..."

/root/PiBits/ServoBlaster/user/servod --cycle-time 30000 --max=300 --p1pins=7,11

echo "-------->"
echo 0=56% > /dev/servoblaster
echo 1=47% > /dev/servoblaster
sleep 0.5

echo "<--------"
echo 0=20% > /dev/servoblaster
echo 1=29% > /dev/servoblaster
sleep 0.5

echo "-------->"
echo 0=56% > /dev/servoblaster
echo 1=47% > /dev/servoblaster
sleep 0.5

echo "<--------"
echo 0=20% > /dev/servoblaster
echo 1=29% > /dev/servoblaster
sleep 0.5

echo "TOUT DROIT"
echo 0=38% > /dev/servoblaster
echo 1=39% > /dev/servoblaster
sleep 0.5

echo "-------->"
echo 0=56% > /dev/servoblaster
echo 1=47% > /dev/servoblaster
sleep 0.5

echo "<--------"
echo 0=20% > /dev/servoblaster
echo 1=29% > /dev/servoblaster
sleep 0.5

echo "-------->"
echo 0=56% > /dev/servoblaster
echo 1=47% > /dev/servoblaster
sleep 0.5

echo "<--------"
echo 0=20% > /dev/servoblaster
echo 1=29% > /dev/servoblaster
sleep 0.5

echo "TOUT DROIT"
echo 0=38% > /dev/servoblaster
echo 1=39% > /dev/servoblaster
sleep 0.5

echo "Lentement droite"
echo 0=40% > /dev/servoblaster
echo 1=41% > /dev/servoblaster
sleep 0.2

echo 0=42% > /dev/servoblaster
echo 1=43% > /dev/servoblaster
sleep 0.2

echo 0=44% > /dev/servoblaster
echo 1=45% > /dev/servoblaster
sleep 0.2

echo 0=46% > /dev/servoblaster
echo 1=47% > /dev/servoblaster
sleep 0.2

echo 0=48% > /dev/servoblaster
sleep 0.2

echo 0=50% > /dev/servoblaster
sleep 0.2

echo 0=52% > /dev/servoblaster
sleep 0.2

echo 0=54% > /dev/servoblaster
sleep 0.2

echo "TOUT DROIT"
echo 0=38% > /dev/servoblaster
echo 1=39% > /dev/servoblaster
sleep 0.2

echo "<--------"
echo 0=20% > /dev/servoblaster
echo 1=29% > /dev/servoblaster
sleep 0.2

echo "Lentement gauche"
echo 0=22% > /dev/servoblaster
echo 1=31% > /dev/servoblaster
sleep 0.2

echo 0=24% > /dev/servoblaster
echo 1=33% > /dev/servoblaster
sleep 0.2

echo 0=26% > /dev/servoblaster
echo 1=35% > /dev/servoblaster
sleep 0.2

echo 0=28% > /dev/servoblaster
echo 1=37% > /dev/servoblaster
sleep 0.2

echo 0=30% > /dev/servoblaster
echo 1=39% > /dev/servoblaster
sleep 0.2

echo 0=32% > /dev/servoblaster
echo 1=41% > /dev/servoblaster
sleep 0.2

echo 0=34% > /dev/servoblaster
echo 1=43% > /dev/servoblaster
sleep 0.2

echo "TOUT DROIT"
echo 0=38% > /dev/servoblaster
echo 1=39% > /dev/servoblaster
sleep 0.2

echo "Poweroff moteur"
echo 0=0 > /dev/servoblaster
echo 1=0 > /dev/servoblaster

echo "END"

En regardant de plus prés les explications sur ServoBlaster et les exemples, vous n’aurez aucun mal à comprendre mon fichier de test. Attention à bien donner les droits d’exécution au fichier.

Voici le résultat à l’exécution du fichier :

2014-04-29_11h55_41

Un petit schéma de connexion des servomoteurs s’impose :

Sans+titre

L’alimentation est constituée d’un coupleur de 4 piles AAA de 1,5V bloquées derrière le gouvernail :

20140423_200600

Conclusion, à travers une commande SSH je peux piloter au degré près l’angle de rotation du moteur et ainsi l’angle du gouvernail et l’angle sur le variateur de vitesse du moteur.

Commande photo par Webcam et serveur distant

20140423_200617

Ok ok ma webcam a une sale tête… En fait, mon premier projet était de la mettre sous le bateau dans un boitier transparent pour pouvoir filmer sous l’eau. J’ai voulu rendre étanche tout ça avec de la mousse isolante mais j’ai eu quelques petits soucis (imaginez l’état de mes doigts…). J’ai donc opté pour la simplicité en la mettant sur la cabine :

20140423_200747

De cette façon je pourrai voir en direct ce que voit le bateau et prendre des photos sympas.

En ce qui concerne la partie « prendre des photos », ce que je souhaite est que la webcam prenne une photo quand je le commande à l’aide mon téléphone, qu’il stocke la photo sur la carte SD (d’où la carte de 32 GB), que le Raspberry compresse et miniaturise cette photo et qu’il me l’envoie par mail avec la date et l’heure.

Voici le résultat. On peut voir mon frère en face qui pilote son bateau avec une télécommande radio :

timelapse_2014-04-21_17-42-00_08

Alors ! Comment ça marche !?

Tout d’abord, comme c’est très bien expliqué sur le site d’Olivier, il me faut un serveur qui recevra les miniatures du Raspberry et me les transférera par mail sur mon téléphone. Comme le bateau est piloté en Wifi, ma 3g est toujours activée et connectée au net donc je peux recevoir les photos sans problèmes.

J’ai loué un petit serveur dédié chez OVH pour cette tâche. J’ai créé un domaine et une base de donnée dans laquelle on stockera les dates et les chemins vers les images. Cette partie là est propre à l’administration de votre serveur donc je ne m’étendrai pas sur le sujet.

Je créé une table dans ma base à l’aide de mon compte phpmyadmin comme ceci :

2014-04-29_12h28_18

Pour le reste, j’ai suivi les instructions et codes qu’Olivier fourni sur son site donc je ne vais pas tout ré-expliquer. Vous trouverez tout sur le script pour la prise de photo ICI et sur le code côté serveur et la base de donnée ICI. Olivier l’explique beaucoup mieux que moi. Attention, il y a quand même des petites choses à connaitre (et des choses à modifier dans les scripts, votre nom de domaine, les identifiants de connexion à la base de donnée etc.) en php et mysql donc si vous n’y connaissez rien, ne vous attendez pas à ce que ce soit du copier-coller des scripts.

En tout cas, après avoir pris quelques photos, voici le résultat dans la base de donnée sur le serveur OVH :

2014-04-29_16h49_29

A la différence du projet d’Olivier, la photo est prise quand le Raspberry Pi reçoit la commande SSH qui lui dit d’exécuter le script timelapse.sh. Si vous n’avez pas bien tout lu, sachez que c’est le logiciel streamer qui permet de prendre ces photos depuis le Raspberry et la commande convert compresse et redimensionne la photo et la commande curl pour l’envoyer au serveur OVH. Tout ça se trouve dans le script php.

Interface graphique Web sur mobile

Au début, je voulais commander le bateau à l’aide de mon téléphone en développant une application Android native. J’ai donc développé une application qui permet d’envoyer des commandes SSH. Vous me direz « Olalala, faut utiliser les sockets c’est plus rapide et plus efficace ! » sauf que je ne suis pas un bon développeur Android et que je n’ai pas eu le temps de fouiller le code pour savoir comment le faire. Comme je savais par contre comment envoyer des commandes SSH je me suis dit parfait. Sauf que le résultat n’était vraiment pas terrible et lent même si ça marchait. Et puis je me suis dit que ce serait sympa de faire une interface web plutôt qu’une application native. Comme ça je pourrai d’une part me perfectionner sur PHP et d’une autre part piloter mon bateau depuis n’importe quel mobile que ce soit de l’Android ou du Mac. L’idée me plaisait donc c’est parti.

Voilà d’abord le résultat :

device-2014-04-29-170117

L’image que l’on voit en bas c’est ce que film la caméra. J’en parlerai plus loin.

Je ne me suis pas cassé la tête et il y a sûrement des codes beaucoup plus propres que le mien mais au moins ça a le mérite de fonctionner. Le principe est simple, chaque bouton envoie une commande SSH en passant par php à un serveur web installé sur le Raspberry. Ensuite, le Raspberry traite la commande comme si je venais de la taper en direct dans une console. J’étais agréablement surpris car même en Wifi ça réagit très vite.

Quelques explications sur les boutons :

eteindre_le_rpiEnvoie la commande au Raspberry Pi de s’éteindre proprement. Comme ça une fois qu’on a fini de faire « mumuse » avec son bateau on est pas obligé d’éteindre brutalement le Raspberry en lui retirant l’alimentation. ça évite la corruption du système de fichier linux.

 

take_photoPrend une photo, en fait une miniature et l’envoie au serveur OVH.
Petite remarque ! Pour le moment, je ne peux pas prendre des photos et en même temps que je retransmet le flux vidéo (j’en parle plus bas). Pour prendre une photo, il faut d’abord appuyer sur l’arrêt de la Webcam et ensuite sur le bouton l’appareil photo.

 

stop_video start_videoÉteint ou allume la webcam.

 

 

 

stopMet le servomoteur qui contrôle la vitesse en position ou le variateur arrête le moteur.

 

 

 

avance_tout_droitLes flèches indiquent la direction où je souhaite que le bateau aille. A l’appui sur un bouton de direction, si la flèche va vers l’avant, le gouvernail change d’angle suivant la direction et le moteur tourne dans le sens qui fait avancer le bateau. Donc à chaque appui sur une flèche, une commande php exécute une commande de ServoBlaster ce qui modifie l’angle des servomoteurs.

huitCe bouton commande tout simplement l’exécution du script qui fait bouger les servomoteurs un peu dans tous les sens (comme la vidéo plus haut) ce qui permet de tester que tout fonctionne avant de le mettre à l’eau. On pourrait imaginer aussi un script qui fait tourner le bateau en huit comme une sorte de pilotage automatique.

 

avance_doucementL’appui sur l’un de ces boutons change l’angle du servomoteur qui contrôle la vitesse. On peut imaginer ce que l’on veut mais dans mon cas j’ai choisi le faire ralentir le bateau.

 

 

Alors c’est parti pour l’installation du serveur web sur le Raspberry Pi !

Entrez la commande pour installer les librairies qui vont bien (php, apache etc.) :

apt-get install apache2 php5 libapache2-mod-php5

Pour voir si ça fonctionne il suffit de se connecter à l’adresse de votre raspberry dans un navigateur qui se trouve sur le même réseau :

ImagesdSinon par exemple pour montrer l’état d’une broche de votre port GPIO dans la page web, vous pouvez créer le fichier suivant dans /var/www :

<?php
exec ( "gpio read 0", $status );
print_r ( $status );
?>

On raffraichi la page web et on obtient l’état de la broche 0 :

ImageqefqfAttention, le service Apache a un utilisateur www-data qui n’a pas les droits d’exécuter des scripts qui se trouvent dans /root avec la commande php exec. Pour régler ce problème il faut éditer le fichier des sudoers comme ceci :

# visudo

Ajouter cette ligne :

# User privilege specification
root    ALL=(ALL:ALL) ALL
www-data ALL=(ALL:ALL) NOPASSWD:ALL

Ok ok encore une fois c’est pas le top de la sécurité mais on s’en fiche c’est un réseau privé.

Sinon pour un peu plus de sécurité vous pouvez préciser les commandes que vous souhaitez passer en sudo :

www-data ALL = (root) NOPASSWD: /bin/cp /root/test1 /root/test2

Ensuite dans la page php :

<?php
exec ( "sudo /root/timelapse.sh", $status );
print_r ( $status );
?>

Bon une fois que tout ça est fait il ne nous reste plus qu’à coder les actions de l’appui sur les boutons de la page html.

Voici le fichier index.php qui se trouve dans /var/www/Web. Dans mon cas je l’ai mis dans un répertoire Web mais vous le mettez où vous voulez du moment que c’est dans /var/www :

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" media="screen" type="text/css" title="style" href="test.css" />
<title>Raspberry Boat</title>
</head>

<body style="background-color: black;"><center>
<!-- On/Off button's picture -->

<div class="float"> <!-- colonne 1 -->

<!-- eteindre_le_rpi.php -->

<form action="eteindre_le_rpi.php" method="post" class="form">
<p>
<input type="image" src="data/img/eteindre_le_rpi.png" alt="Submit Form" />
</p>
</form>

<!-- tourne_un_peu_a_gauche.php -->

<form action="tourne_un_peu_a_gauche.php" method="post" class="form">
<p>
<input type="image" src="data/img/tourne_un_peu_a_gauche.png" alt="Submit Form" />
</p>
</form>

<!-- tourne_a_gauche -->

<form action="tourne_a_gauche.php" method="post">
<p>
<input type="image" src="data/img/tourne_a_gauche.png" alt="Submit Form" />
</p>
</form>

<!-- recule_a_gauche -->

<form action="recule_a_gauche.php" method="post">
<p>
<input type="image" src="data/img/recule_a_gauche.png" alt="Submit Form" />
</p>
</form>

</div>

<div class="float"> <!-- colonne 2 -->

<!-- take_photo -->

<form action="take_photo.php" method="post">
<p>
<input type="image" src="data/img/take_photo.png" alt="Submit Form" />
</p>
</form>

<!-- avance_tout_droit -->

<form action="avance_tout_droit.php" method="post">
<p>
<input type="image" src="data/img/avance_tout_droit.png" alt="Submit Form" />
</p>
</form>

<!-- Stop -->

<form action="stop.php" method="post">
<p>
<input type="image" src="data/img/stop.png" alt="Submit Form" />
</p>
</form>

<!-- recule_tout_droit -->

<form action="recule_tout_droit.php" method="post">
<p>
<input type="image" src="data/img/recule_tout_droit.png" alt="Submit Form" />
</p>
</form>

</div>

<div class="float"> <!-- colonne 3 -->

<!-- start_video -->

<form action="start_video.php" method="post">
<p>
<input type="image" src="data/img/start_video.png" alt="Submit Form" />
</p>
</form>

<!-- tourne_un_peu_a_droite -->

<form action="tourne_un_peu_a_droite.php" method="post">
<p>
<input type="image" src="data/img/tourne_un_peu_a_droite.png" alt="Submit Form" />
</p>
</form>

<!-- tourne_a_droite -->

<form action="tourne_a_droite.php" method="post">
<p>
<input type="image" src="data/img/tourne_a_droite.png" alt="Submit Form" />
</p>
</form>

<!-- recule_a_droite -->

<form action="recule_a_droite.php" method="post">
<p>
<input type="image" src="data/img/recule_a_droite.png" alt="Submit Form" />
</p>
</form>

</div>

<div class="float"> <!-- colonne 4 -->

<!-- stop_video -->

<form action="stop_video.php" method="post">
<p>
<input type="image" src="data/img/stop_video.png" alt="Submit Form" />
</p>
</form>

<!-- avance_doucement -->

<form action="avance_doucement.php" method="post">
<p>
<input type="image" src="data/img/avance_doucement.png" alt="Submit Form" />
</p>
</form>

<!-- avance_normal -->

<form action="avance_normal.php" method="post">
<p>
<input type="image" src="data/img/avance_normal.png" alt="Submit Form" />
</p>
</form>

<!-- huit -->

<form action="huit.php" method="post">
<p>
<input type="image" src="data/img/huit.png" alt="Submit Form" />
</p>
</form>

</div>

<!-- afficher l'écran vidéo stream -->
<img src="http://192.168.0.34:8083/?action=stream">
<img src="http://192.168.43.115:8083/?action=stream">

</center></body>

</html>

Bon c’est plutôt basique est il y a sûrement encore plus simple mais je le rappelle je ne suis pas développeur php ! Après comme je le dis souvent, ça a le mérite de marcher et de satisfaire mes besoins ! 🙂

Chaque bouton a une méthode post qui appelle un autre script php qui demande l’exécution d’un script stocké sous root. Woooooo ! 🙂 Dans ce script il y a la commande qui déclenche l’action.

Exemple ! 🙂

  • Je veux aller tout droit. J’appuie sur le bouton flèche « tout droit ».
  • Cette partie du script html est exécutée :
<!-- avance_tout_droit -->

<form action="avance_tout_droit.php" method="post">
<p>
<input type="image" src="data/img/avance_tout_droit.png" alt="Submit Form" />
</p>
</form>

Le script avance_tout_droit.php est appelé (il est stocké au même endroit que le fichier index.php).

Voilà à quoi ressemble ce fichier php :

<?php

exec('bash -c "exec nohup setsid sudo /root/avance_tout_droit.sh > /dev/null 2>&1 &"');
header('Location: index.php');

?>

Lors de son exécution, grâce aux commandes exec et sudo il execute en bash le script stocké dans /root.
Le header permet de faire comme si on avait rafraîchi la page web.

Le script /root/avance_tout_droit.sh est alors exécuté :

/root/PiBits/ServoBlaster/user/servod --cycle-time 30000 --max=300 --p1pins=7,11

#gouvernail tout droit
echo 0=38% > /dev/servoblaster
#avancer vite
echo 1=29% > /dev/servoblaster
sleep 0.2

et là on retrouve les commandes qui permettent le contrôle des servomoteurs.

NOTE : N’oubliez pas de rendre vos scripts exécutables ! (chmod …..)

Pour le fichier css c’est tout simple ! Je dirai même il n’y a pas plus simple ! J’ai découpé mon interface en 3 colonnes pour que les icônes des boutons soient bien alignés :

.float {
float: left;
width: 25%;
margin: 1em 0;
}

Une fois que vous avez compris le principe des fichier php qui appellent des script dans /root et bien il suffit de créer un fichier par action que vous souhaitez réaliser.

Encore une fois je sais qu’il est possible de ne pas créer autant de fichier et de faire quelque chose de plus propre mais je n’avais pas le temps de m’y plonger.

Streaming du flux vidéo de la webcam

Comme promis plus haut voici quelques explications sur la vidéo :

Note : Bon j’aurais pu en parler plus haut mais pour vérifier que votre webcam est reconnue par le Raspberry Pi, vérifiez que l’entrée video0 existe dans /dev.

Le logiciel que j’utilise pour transmettre le flux vidéo est MJPG-streamer. C’est comme un petit server HTTP installé sur le Raspberry Pi qui transmet le flux vidéo capturé par la webcam en utilisant le protocol http dans le format motion jpeg. Pour voir le flux une fois que le serveur est actif, il suffit d’ouvrir un navigateur compatible et d’entrer l’ip du Raspberry avec le port associé à MJPG-streamer.

Il faut installer certains package (n’oubliez pas d’abord de mettre à jour votre système avec update et upgrade d’apt-get) :

apt-get install libv41-0

Récupérez le package mjpg-streamer (créé par Tom Stoeveken) ou alors il existe aussi un package un peu customisé pour le Raspberry que l’on peut récupérer :

wget http://iqjar.com/download/jar/soft/mjpg-streamer.tar.gz
tar -zxvf mjpg-streamer-rpi.tar.gz
cd mjpg-streamer
./mjpg-streamer.sh start

Pour tester si tout fonctionne et que l’on voit le flux vidéo dans une page web, ouvrez un navigateur :

http://example.com:8083/?action=stream

Le port par défaut est 8083.

Si on veut l’intégrer dans une page web comme je l’ai fait, il faut utiliser une balise image :

<img src=”http://example.com:8083/?action=stream” width=”640″ height=”480″/>

Pour moi ça n’a pas marché donc j’ai retiré les paramètres de taille et là miracle ! 🙂 J’ai testé avec Chrome, Firefox, le navigateur natif d’android et celui d’apple, ça fonctionne très bien ! 🙂

<img src="http://192.168.0.34:8083/?action=stream">

Donc pour déclencher la caméra et récupérer un flux vidéo :

root@raspberrypi:~/mjpg-streamer# ./mjpg-streamer.sh start
8083 800x600 15
started

Pour l’arrêter :

root@raspberrypi:~/mjpg-streamer# ./mjpg-streamer.sh stop
stopped

Donc pour utiliser les bouton et les codes php pour déclencher le streaming vidéo, on opère de la même façon :

<?php

exec('bash -c "exec nohup setsid sudo /root/mjpg-streamer/mjpg-streamer.sh start > /dev/null 2>&1 &"');
header('Location: index.php');
?>

Commander un projecteur à LEDs

Comme je voulais filmer sous l’eau, je souhaitais aussi pouvoir allumer un projecteur à leds pour donner un peu de lumière à la camera dans les eaux un peu troubles. ça fonctionne très bien aussi.

J’ai récupéré une petite lampe à leds qui sert à éclairer en se branchant sur le port usb d’un ordinateur.

2014-04-29_18h53_55

J’ai découpé le pied et retiré le tuyau flexible et ça m’a donné un excellent projecteur à leds alimenté en 5V.

C’est un broche du port GPIO qui va contrôler l’allumage et l’extinction des LEDs. Encore un petit schéma rapide :

Sans+qsdtitreImqsfdage

Pour contrôler l’état des broches du GPIO, le plus simple est d’utiliser WiringPi :

git clone git://git.drogon.net/wiringPi
cd ./wiringPi
./build

On met la broche 7 en sortie :

gpio mode 7 out

On lit l’état du tableau :

gpio readall

Ce qui devrait afficher :

+----------+-Rev2-+------+--------+------+-------+
| wiringPi | GPIO | Phys | Name   | Mode | Value |
+----------+------+------+--------+------+-------+
|      0   |  17  |  11  | GPIO 0 | IN   | Low   |
|      1   |  18  |  12  | GPIO 1 | IN   | Low   |
|      2   |  27  |  13  | GPIO 2 | IN   | Low   |
|      3   |  22  |  15  | GPIO 3 | IN   | Low   |
|      4   |  23  |  16  | GPIO 4 | IN   | Low   |
|      5   |  24  |  18  | GPIO 5 | IN   | Low   |
|      6   |  25  |  22  | GPIO 6 | IN   | Low   |
|      7   |   4  |   7  | GPIO 7 | OUT  | Low   |
|      8   |   2  |   3  | SDA    | IN   | High  |
|      9   |   3  |   5  | SCL    | IN   | High  |
|     10   |   8  |  24  | CE0    | IN   | Low   |
|     11   |   7  |  26  | CE1    | OUT  | High  |
|     12   |  10  |  19  | MOSI   | IN   | Low   |
|     13   |   9  |  21  | MISO   | IN   | Low   |
|     14   |  11  |  23  | SCLK   | IN   | Low   |
|     15   |  14  |   8  | TxD    | ALT0 | High  |
|     16   |  15  |  10  | RxD    | ALT0 | High  |
|     17   |  28  |   3  | GPIO 8 | ALT2 | Low   |
|     18   |  29  |   4  | GPIO 9 | ALT2 | Low   |
|     19   |  30  |   5  | GPIO10 | ALT2 | Low   |
|     20   |  31  |   6  | GPIO11 | ALT2 | Low   |
+----------+------+------+--------+------+-------+

On voit bien que la broche 7 est en sortie mais sa valeur est LOW donc le transistor ne laissera pas passer le courant qui allumera les LEDs. Il faut donc passer la sortie de cette broche au niveau haut (High) :

root@raspberrypi:~/wiringPi# gpio write 7 1

Les leds s’allument !

root@raspberrypi:~/wiringPi# gpio readall

+----------+-Rev2-+------+--------+------+-------+
| wiringPi | GPIO | Phys | Name   | Mode | Value |
+----------+------+------+--------+------+-------+
|      0   |  17  |  11  | GPIO 0 | IN   | Low   |
|      1   |  18  |  12  | GPIO 1 | IN   | Low   |
|      2   |  27  |  13  | GPIO 2 | IN   | Low   |
|      3   |  22  |  15  | GPIO 3 | IN   | Low   |
|      4   |  23  |  16  | GPIO 4 | IN   | Low   |
|      5   |  24  |  18  | GPIO 5 | IN   | Low   |
|      6   |  25  |  22  | GPIO 6 | IN   | Low   |
|      7   |   4  |   7  | GPIO 7 | OUT  | High  |
|      8   |   2  |   3  | SDA    | IN   | High  |
|      9   |   3  |   5  | SCL    | IN   | High  |
|     10   |   8  |  24  | CE0    | IN   | Low   |
|     11   |   7  |  26  | CE1    | OUT  | High  |
|     12   |  10  |  19  | MOSI   | IN   | Low   |
|     13   |   9  |  21  | MISO   | IN   | Low   |
|     14   |  11  |  23  | SCLK   | IN   | Low   |
|     15   |  14  |   8  | TxD    | ALT0 | High  |
|     16   |  15  |  10  | RxD    | ALT0 | High  |
|     17   |  28  |   3  | GPIO 8 | ALT2 | Low   |
|     18   |  29  |   4  | GPIO 9 | ALT2 | Low   |
|     19   |  30  |   5  | GPIO10 | ALT2 | Low   |
|     20   |  31  |   6  | GPIO11 | ALT2 | Low   |
+----------+------+------+--------+------+-------+

Pour allumer la led depuis une page web et faire en sorte que l’affichage soit dynamique (c’est à dire que lorsque j’appuie sur le bouton allumer les LEDs l’image du bouton change pour montrer que c’est allumé) il faut utiliser du php mais aussi du javascript.

green red

Voici le code à mettre dans /var/www/Web. Il y a 3 fichiers et un répertoire contenant les images. Je me suis inspiré d’un tutoriel sur un site mais je n’arrive pas à le retrouver pour le citer… 🙁

INDEX.PHP

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Raspberry Pi Gpio</title>
</head>

<body style="background-color: black;">
<!-- On/Off button's picture -->
<?php
//this php script generate the first page in function of the gpio's status
$status = array (0);
$i = 3; // Numéro de la PIN utilisée

//set the pin's mode to output and read them
system("gpio mode ".$pin." out");
exec ("gpio read ".$i, $status[$i], $return );
//if off
if ($status[$i][0] == 0 )
{
echo ("<img id='button_".$i."' src='data/img/red/red_".$i.".jpg' alt='off'/>");
}
//if on
if ($status[$i][0] == 1 )
{
echo ("<img id='button_".$i."' src='data/img/green/green_".$i.".jpg' alt='on'/>");
}

?>

<!-- javascript script.js est inclu dans le fichier -->
<script src="script.js"></script>
</body>
</html>

GPIO.PHP

<!-- This page is requested by the JavaScript, it updates the pin's status and then print it -->
<?php
//Getting and using values
if (isset ($_GET["pin"]) && isset($_GET["status"]) )
{
$pin = strip_tags($_GET["pin"]);
$status = strip_tags($_GET["status"]);
//set the gpio's mode to output
system("gpio mode ".$pin." out");
//set the gpio to high/low
if ($status == "0" ) { $status = "1"; }
else if ($status == "1" ) { $status = "0"; }
system("gpio write ".$pin." ".$status );
//reading pin's status
exec ("gpio read ".$pin, $status, $return );
//printing it
echo ( $status[0]);
} //print fail if cannot use values
else { echo ("Erreur dans l'URL"); }
?>

SCRIPT.JS

//JavaScript, use pictures as buttons, sends and receives values to/from the Rpi

var button_3 = document.getElementById("button_3");

//this function sends and receives the pin's status
function change_pin (pin, status) {
//this is the http request
var request = new XMLHttpRequest();
request.open( "GET" , "gpio.php?pin=" + pin + "&status=" + status );
request.send(null);
//receiving information
request.onreadystatechange = function () {
if (request.readyState == 4 && request.status == 200) {
return (parseInt(request.responseText));
}
//test if fail
else if (request.readyState == 4 && request.status == 500) {
alert ("server error");
return ("fail");
}
//else
else { return ("fail"); }
}
}

//these are all the button's events, it just calls the change_pin function and updates the page in function of the return of it.
button_3.addEventListener("click", function () {
//if red
if ( button_3.alt === "off" ) {
//use the function
var new_status = change_pin ( 3, 0);
if (new_status !== "fail") {
button_3.alt = "on"
button_3.src = "data/img/green/green_3.jpg";
return 0;
}
}
//if green
if ( button_3.alt === "on" ) {
//use the function
var new_status = change_pin ( 3, 1);
if (new_status !== "fail") {
button_3.alt = "off"
button_3.src = "data/img/red/red_3.jpg";
return 0;
}
}
} );

Mais alors ça donne quoi tout ça ??!

Rien ne vaut une petite vidéo ! 🙂

Désolé pour la qualité de la vidéo c’est pas terrible mais j’ai pas pu faire mieux… En tout cas j’espère que ce tutoriel vous a plu. N’hésitez pas à laisser un petit commentaire ICI. Vous pouvez aussi poser vos questions ou demander des précisions. Je m’efforcerai d’y répondre au mieux.

Timothé Poznanski

L’article BateauRaspberry : bateau piloté avec un Pi (par Tim) est apparu en premier sur MagdiBlog.

BateauRaspberry : un bateau entièrement fait main, piloté par un Pi (màj)

Par : Olivier
30 avril 2014 à 09:32

Il y a quelques temps j’ai été contacté par Tim, un lecteur de MagdiBlog, pour son projet de bateau piloté par un Raspberry Pi 🙂

Après plusieurs échanges de mails, et quelques semaines (mois ?) de travail, Tim est arrivé au bout de son projet :

tim_bateau_telecommande_raspberry_piSon projet, très complet, aborde plusieurs problématiques entre la gestion des moteurs et servos moteurs, le pilotage à distance via WiFi, la capture d’image, etc…

C’est pour moi le parfait exemple de tout ce qu’il est possible de faire avec un Raspberry Pi, en croisant plusieurs idées et principes, dont certains ont été détaillés ici 🙂

tim_bateau_servoTim a trouvé le courage d’expliquer très en détail toute la réalisation de son BateauRaspberry, et je l’en remercie car c’est un gros boulot et que cela nous permettra à tous d’apprendre des choses 🙂 Voici l’adresse de son blog : http://bateauraspberry.blogspot.fr/

Note : Suite à problème d’hébergement, j’ai proposé à Tim de relayer le contenu complet de son article. Vous pouvez le consulter ici : http://www.magdiblog.fr/divers/bateauraspberry-bateau-pilote-avec-un-pi-par-tim/

Au menu de ce projet :

  • tim_bateau_interface_pilotageL’inventaire détaillé du matériel nécessaire
  • La connexion réseau WiFi avec retour d’expérience sur connexion 3G
  • Création du point d’accès WiFi sur smartphone
  • Commande des servos moteurs et utilisation de ServoBlaster
  • Pilotage de la webcam pour récupérer des images en temps réel
  • Envoie des images sur serveur distant
  • Conception d’une interface de pilotage sur smartphone
  • Pilotage d’un projecteur LED pour la vision sous-marine <= j’adore 🙂

 

Le tout est illustré de schémas d’explication, de photos et de vidéos. Tim partage également l’intégralité de son code source 🙂

Un grand bravo à Tim pour son travail et pour l’encourager à poursuivre 😉

Merci à toi Tim 🙂

L’article BateauRaspberry : un bateau entièrement fait main, piloté par un Pi (màj) est apparu en premier sur MagdiBlog.

Système de vidéo-surveillance abordable avec des Raspberry Pi

Par : Olivier
11 février 2014 à 18:21

Aujourd’hui nous allons voir comment créer un système de télé-surveillance grâce à un Raspberry Pi et divers types de caméras.

IMG_6646

Ce système a pour vocation d’être utilisé dans le cardre d’une télé-surveillance domestique. Il doit permettre de garder un oeil en temps réel sur sa maison, et sauvegarder un historique des images en cas de besoin.

La capture d’écran ci-dessous vous donne un aperçu du résultat final du système qui est actuellement installé chez moi. J’ai volontairement flouté les images pour conserver l’intimité de mon « chez moi ». Je dispose de quatre caméras (une webcam, une caméra IP et deux module Raspberry Pi Caméra dont un NoIR pour la vision nocturne) :

video_surveillance_monitorin_safe

Nous verrons comment utiliser trois différents types de caméras pour vous permettre de construire votre système avec le matériel dont vous disposez déjà :

Si vous souhaitez vous équiper, je vous conseille fortement d’opter pour le module Raspberry Pi Caméra, très petit, qui offre un rapport qualité/prix imbatable. En outre le modèle NoIR vous permettra de voir la nuit grâce un projecteur infra rouge 🙂

Note : Je ne reviens pas ici sur l’installation et l’utilisation de ces caméras. Il existe de nombreux tutos sur le net, que ce soit pour les webcam, les caméras IP ou le module Raspberry Pi Camera. Cet article se concentre sur la création du système de télé-surveillance.

Le principe global du système

Le système se compose d’un ou plusieurs Raspberry Pi équipés chacun d’une caméra (quelque soit son type) et d’un Raspberry Pi de « contrôle » qui centralise les images. Les Raspberry Pi se contentent de prendre une photo à intervalles réguliers et de les envoyer en WiFi ou Ethernet au Raspberry Pi de « contrôle ». Chaque image est taguée avec le nom de la caméra dont elle provient, et la date à laquelle elle a été prise afin de pouvoir la situer dans le temps.

Le Raspberry Pi de « contrôle » archive toutes les images qu’il recoit et peut effectuer des traitements dessus pour détecter des mouvements par exemple. Il est également équipé d’une interface Web permettant de consulter les images à distance depuis n’importe quel device ou navigateur web.

rasperry_pi_camera_surveillance_systeme

Photo ou vidéo ?

Quand on parle de « vidéo surveillance », on s’imagine un flux « vidéo ». Or, dans la pratique, ce n’est pas forcément le cas. D’une part parce que ce n’est pas forcément utile, et d’autre part parce que c’est problématique d’un point de vu « bande passante » pour un usage domestique.

Problème réseau

Le problème se pose si l’on souhaite regarder les images prises par une caméra à distance. Il faut faire transiter ces images entre la caméra, et le poste de visionnage. Or, un flux vidéo nécessite une bande passante conséquente pour afficher les images en continue et de manière fluide. Surtout lorsqu’on utilise des résolutions importantes de plusieurs méga-pixels.

Pour résoudre ce problème, on peut soit baisser la qualité de l’image, soit baisser le nombre d’images prises par seconde (rappelons qu’une vidéo n’est autre qu’un enchainement de photos).

Dans la pratique il faudra faire les deux, surtout si vous souhaitez pouvoir visonner les images en passant par un mobile en 3G.

L’utilité de la vidéo par rapport aux photos

Un système de vidéo surveillance, ou de télé-surveillance, domestique doit selon moi, permettre deux choses :

  • voir en directe ce qui se passe à la maison à distance (Est ce que tout se passe bien à la maison ? Ai-je oublié d’éteindre mes lumières ?). Une photo prise régulièrement suffit.
  • avoir une trace d’un évènement qui s’est déroulé (Avoir des preuves d’un cambriolage ou d’un incendie, et pouvoir les utiliser pour l’enquête). Cela nécessite de stocker les images pendant un certain temps.

L’important, c’est d’avoir les images en temps réel, de pouvoir les stocker et les visonner facilement, sur place ou a distance. Dans ces conditions, nous pouvons nous satisfaire d’une photo par seconde, voire moins 🙂 C’est exactement le principe du MJPEG qui est largement utilisé dans de nombreuses caméras IP. Le célèbre logiciel de détection de mouvement Motion, fonctionne également sur ce principe 🙂

Le gros avantage de la photo par rapport à la vidéo pour la télésurveillance

Demander à une caméra de prendre une photo à intervalles réguliers plutôt qu’une vidéo a également de nombreux avantages et permet grande souplesse d’utilisation :

  • entre chaque photo, votre caméra ou votre Raspberry Pi est disponible pour faire autre chose
  • une photo peu être prise et stockée en haute résolution puis facilement réduite pour être affichée à distance. On peut ainsi garder un historique des photos ou évènements en haute définition 1080p, et consulter avec son mobile en 3G une miniature de ces photos.
  • une photo prise, peut être immédiatement envoyée sur un serveur distant pour y être sauvegardée et archivée. Un voleur pourra saboter votre caméra, mais toutes les photos prises auront déjà été sauvegardée 🙂
  • il est très facile de détecter un mouvement en comparant deux photos 🙂
  • il est très facile de créer une vidéo à partir d’images qui se suivent 🙂

Nous allons maintenant voir comment créer notre système de télé-surveillance en commençant par son noeud central, le Raspberry Pi de « Contrôle » 🙂

Le Contrôleur

Pour réaliser ce « contrôleur« , vous pouvez utiliser n’importe quel Raspberry Pi (ou n’importe quel ordinateur d’ailleurs 😉 ) relié à votre réseau, en WiFi ou Ethernet. Vous choisirez une carte mémoire en fonction du nombre de caméras dont vous disposez, de la qualité des images, et du nombre d’images que vous souhaitez conserver.

La première étape consiste à installer et configurer un serveur web Apache et PHP5. Je vous propose de suivre la procédure décrite dans cette article : PiHomeDashScreen – Installation et configuration. Ce serveur web servira à récupérer les images envoyées en HTTP POST et à diffuser l’interface web de visionnage.

Script de réception des images

Le principe est simple, les images seront envoyées en HTTP POST par les Raspberry Pi équipé d’une caméra, il nous suffit donc de créer un petit script en PHP pour les réceptionner.

collect.php :

<?php

$token    = 'azerty'; // token qui sert de mot de passe
$dst_dir  = 'camera'; // nom du dossier dans lequel seront stockées les images

if(isset($_REQUEST['token']) && $_REQUEST['token'] == $token){

  if(isset($_REQUEST['camera_name'])){

    $camera_name = $_REQUEST['camera_name'];  // nom de la caméra envoyé en même temps que l'image
    $img_name    = 'cam_'.$camera_name.'_'.time().'.jpg';   // nom du fichier image à stocker : prefixe, nom de la camera et timestamp

    if(!is_dir($dst_dir)){mkdir($dst_dir, 0777, true);}  // créé le répertoire de stockage s'il n'existe pas
    if(!is_dir($dst_dir.'/'.$camera_name)){mkdir($dst_dir.'/'.$camera_name, 0777, true);}  // créé un sous répertoire pour chaque caméra s'il n'existe pas

    if (is_uploaded_file($_FILES["camera_image"]["tmp_name"])) {
      move_uploaded_file($_FILES["camera_image"]["tmp_name"], $dst_dir.'/'.$camera_name.'/'.$img_name); // enregistre l'image réceptionnée dans le bon répertoire
    }
  }
}

?>

Pour visionner les images nous allons créer une page index.php qui affiche la dernière image de chaque caméra. Une fonction JavaScript se charge de raffraichir les images à intervalles réguliers 🙂

<?php

  header('Content-type: text/html; charset=utf-8');

  // nom du dossier dans lequel sont stockées les images
  $dst_dir  = 'camera';

  // liste des caméras à afficher
  $cameras = array('visioncam', 'egeon', 'carpo', 'triton');

  // taille d'affichage des images
  $width  = '640';
  $height = '480';

  // fonction qui renvoie la dernière image d'une caméra
  function showLastImage ($cam_name) {
    global $dst_dir;
    header('Content-type: image/jpeg');
    $dir  = $dst_dir."/".$cam_name."/cam_".$cam_name."_*";
    $imgs = glob($dir);
    echo new Imagick(end($imgs));
  }

  if(isset($_REQUEST['get_cam_img'])){
    echo showLastImage($_REQUEST['get_cam_img']);
  }
  else{

?>

  <!DOCTYPE html>
  <html>
    <head>
      <title>Cameras</title>
      <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
      <style>
        body { text-align : center; background-color : #000;}
        div.camera { display : inline-block; text-align : center; margin : 5px }
        img.camera { width : <?php echo $width; ?>px; height : <?php echo $height; ?>px; }
      </style>
    </head>
    <body>

      <?php foreach($cameras as $camera){ ?>
        <div class="camera" id="<?php echo $camera; ?>">
          <img class="camera" id="img_<?php echo $camera; ?>" src="">
        </div>
      <?php } ?>

      <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
      <script>
        var refresh = 3000;

        $( document ).ready(function() {
          setInterval(function() {
            var now = new Date().getTime();
            $("div.camera").each(function( index ) {
              var camera_name = $( this ).attr("id");
              console.log( "refresh "+camera_name+"..." );
              var url = 'index.php?get_cam_img='+camera_name;
              var img_tmp  = $("<img />").attr("src", url+"&"+now);
              $("#img_"+camera_name).attr("src", url+"&"+now);
            });
          }, refresh);
        });
      </script>

    </body>
  </html>

<?php } ?>

ATTENTION : De même que dans l’article « Contrôle de l’éclairage avec le module Z-Wave Razberry », le code source ci-dessus est créer dans le cadre d’un exemple simple, il peut et doit être optimisé et sécurisé :)

Si vous souhaitez avoir accès à cette application web depuis l’extérieur de votre réseau local, je vous conseille fortement de mettre en place un contrôle d’accès afin d’éviter que n’importe qui ne puisse visionner vos caméras et espionner votre maison :)

Dans un prochain article, je décortiquerai une installation complète et sécurisé à double authentification : certificat client et mot de passe.

En attendant, vous pouvez sécuriser l’accès à votre système en demandant un login/mot de passe grâce à un fichier .htacces comme expliqué dans ce tuto : http://www.commentcamarche.net/contents/7-apache-les-fichiers-htaccess

Voyons maintenant comment prendre des photos à intervalles réguliers et les envoyer au « contrôleur » 🙂

Prendre des photos et les envoyer au contrôleur

Sur chaque Raspberry Pi équipé d’une caméra, vous devrez exécuter le script camera_shot.sh suivant :

#!/bin/bash

camera_name="egeon"
dst_url="http://ip_controleur/collect.php"
refresh=5 # delais entre chaque photo

while true ; do
  img_tag=$camera_name" - "`date "+%Y-%m-%d %A %B %H:%M:%S"`
  img_name="cam_img.jpg"

  ##################################################################
  # POUR LES MODULES RASPBERRY PI CAMERA
  ##################################################################
  raspistill -t 1 -w 640 -h 480 -q 50 -o $img_name

  ##################################################################
  # POUR LES WEBCAMS USB
  ##################################################################
  streamer -c /dev/video0 -f jpeg -s 640x480 -j 50 -o $img_name".jpeg" && mv $img_name".jpeg" $img_name

  ##################################################################
  # POUR LES CAMERAS IP 
  # (le nom du script snapshot.cgi peut dependre du modele de camera)
  ##################################################################
  curl -o $img_name".jpeg" http://adresse_ip_camera/snapshot.cgi && mv $img_name".jpeg" $img_name

  ##################################################################

  if [ -f $img_name ] ; then
    convert -pointsize 15 -undercolor black -fill white -draw 'text 0,12 "'"$img_tag"'"' $img_name $img_name
    curl --form camera_image=@$img_name --form camera_name=$camera_name --form token=azerty $dst_url
    rm $img_name
  fi
  sleep $refresh
done

Vider l’historique des images sur le contrôleur

Si vous utilisez le système dans l’état les images vont s’entasser sur le contrôleur indéfiniment. A titre d’exemple, si vous prenez des photos en 640×480 px toutes les 5 secondes avec une moyenne de 30Ko par photo, cela représente environ 500Mo de données par jour et par caméra ! Avec mes quatre caméras, je génère donc près de 2Go de photo toutes les 24 heures 🙂

Il convient donc de supprimer les photos au bout d’un certain temps. Pour ma part je conserve un historique de 2 jours seulement.

Pour supprimer automatiquement les photos de plus de 2 jours, vous pouvez appeler ce script clean_cam.sh dans une CRON task :

#!/bin/bash

for i in `find /var/www/camera/* -type d` ; do
  find $i -type f -mtime +2 -exec rm -f {} \;
done

Vision de nuit

Si comme moi vous souhaitez profiter de la vision nocture que permet le module Raspberry Pi Camera NoIR, vous pouvez facilement construire un petit projecteur infrarouge grâce à quelques LED de ce type : LED IR 5mm 53Sf4Bt Kingbright

J’ai réalisé un petit montage qui se branche directement sur la broche 5V du GPIO du Pi :

IMG_6537Cela fonctionne bien mais sur une très courte distance (< 3 mètres). Il faudrait des LEDs beaucoup plus puissantes pour éclairer une grande pièce. Dans tous les cas, vous devrez choisir des LEDs infra rouge ayant une longueur d’onde autour des 880nm.

Pour les grandes pièces, ou la carrément éclairer votre jardin, vous pouvez utilisez un projecteur infra rouge spécialement prévu pour cet usage. J’ai pu en voir plusieur, et mon choix s’est arrêté sur celui ci :

IMG_6542Vous pourrez le trouvez ici : http://www.amazon.fr/s/?_encoding=UTF8&camp=1642&creative=19458&field-keywords=projecteur%20infrarouge&linkCode=ur2&rh=i%3Aaps%2Ck%3Aprojecteur%20infrarouge&tag=magdiblog-21&url=search-alias%3Daps&linkId=GMVLO4AJWYVSV4CL

D’une grande qualité de fabrication, et équipé d’un détecteur de luminosité, ce projecteur étanche et alimenté en 12V éclairera sans problème votre jardin ou votre séjour 🙂

Avec le module Raspberry Pi Camera NoIR dans l’obscurité la plus totale, on y voit comme en plein jour 🙂

Exemple de composants pour un module caméra

A mon sens, le Raspberry Pi A+ est parfait pour les modules caméra de ce système car il est très compacte et peu gourmand en énergie, ce qui peut permettre l’utilisation sur batterie : Comment alimenter votre Raspberry Pi avec une batterie

Voici une sélection de composants parfaits pour la réalisation d’un module caméra :

L’article Système de vidéo-surveillance abordable avec des Raspberry Pi est apparu en premier sur MagdiBlog.

Contrôle de l’éclairage avec le module Z-Wave Razberry

Par : Olivier
12 janvier 2014 à 20:15

IMG_6233

Dans mon précédent article « transformez votre Raspberry Pi en serveur domotique Z-Wave », je vous présentais le module Razberry de Z-Wave.me. Aujourd’hui, nous allons voir en détail comment utiliser cette carte d’extension pour contrôler l’allumage et l’extinction de lampes.

Module prise de courant On/Off : Everspring AN157-6

Parmi les nombreux modules Z-Wave existants, nous allons ici utiliser un module très basique qui se branche sur une prise de courant 220V standard. Doté d’une simple fonction On/Off, ce module Everspring AN157-6 est disponible presque partout : http://www.amazon.fr/gp/product/B00DMXQRJA/ref=as_li_tl?ie=UTF8&camp=1642&creative=6746&creativeASIN=B00DMXQRJA&linkCode=as2&tag=magdiblog-21&linkId=NY6FEVP5E6JTQIKV

IMG_6235 IMG_6234

IMG_6241D’une excellente qualité de fabrication et capable de supporter jusqu’à 3500W sur 16A, vous pourrez utiliser ce module pour piloter tous les appareils (ou presque) de votre maison (lampe, petit électroménager, appareil multimédia,…). Sur la face avant, il y a un bouton qui sert d’interrupteur manuel doté d’un témoin lumineux rouge qui s’allume lorsque la prise est en position « On« .

Bien que le boitier semble volumineux, il reste relativement discret comme vous pouvez le constater sur les photos ci-contre et ci-dessous.

IMG_6242A l’heure où j’écris cet article, je dispose de cinq de ces modules : lampe de la cuisine, lampe du bureau, lampe du séjour, lampes autour de la télé, et un pour le sapin de Noël 🙂

Razberry et Z-Way

IMG_6239Revenons en au module Razberry. Une fois enfiché sur le port GPIO du Pi, il ne vous reste plus qu’à booter et installer Z-Way, le soft proposé par Z-Wave.me.

Note : Z-Way est encore en béta, son aspect n’est donc pas aussi travaillé que ce dont on a l’habitude de nos jours, et les fonctionnalités restent limitées. Toujours est-il que les manques fonctionnels actuels peuvent être contournés facilement grâce à une API JSON 🙂

Vous pouvez acheter le module Razberry directement sur Amazon :

L’installation de Z-Way sur Raspbian se fait très simplement grâce au script mis à disposition sur le site du fabricant :

wget -q -O - razberry.z-wave.me/install | sudo bash

A la fin de l’installation, il suffit de rebooter le Pi. L’interface web de Z-Way est alors disponible directement sur le port TCP/8083 🙂 En vous connectant avec votre navigateur web, vous aurez le choix entre quatre interfaces.

z-way_razberry_1Pour continuer, nous choisirons l’interface « Expert » qui est la plus complète (les autres interfaces étant plus des démonstrations, pour montrer le potentiel de Z-Way).

Association des modules

La première chose à faire, est d’associer (ou d’inclure pour coller ay langage Z-Wave 😉 ) nos modules « prise de courant » à notre contrôleur Z-Wave Razberry afin de créer un réseau Z-Wave. Pour cela, il suffit de se rendre dans le menu « Network->Network management » et de cliquer sur le bouton « include device« .

z-way_razberry_2A ce moment là, Z-Way est à l’écoute d’un module désirant entrer dans le réseau. Sur les modules Everspring AN157-6, rien de bien compliqué, il suffit de maintenir le bouton appuyé quelques secondes jusqu’à ce que le témoin lumineux clignote (ce qui indique que le module est en mode « inclusion« ). Au besoin, voici le mode d’emploi du module : everspring_an157_doc.pdf

Note : Pour vous familiariser la technologie Z-Wave et son jargon, je vous propose de lire cet article http://domotique-info.fr/technologies-domotique/zwave/

Une fois les modules correctement ajoutés dans le réseau Z-Wave, on peut voir l’état de chacun d’eux, et les tester grâce aux boutons « On/Off » 🙂 (notez bien les numéros ID des modules, nous en aurons besoin un peu plus tard)z-way_razberry_3Jour ! Nuit ! Jour ! Nuit ! Jour ! Nuit ! Je vous vois rigoler, mais je vous garantis que vous ferez la même chose 😉

Vous en conviendrez, cette interface web, bien que tout à fait fonctionnelle, n’est pas très sexy…

Nous allons maintenant créer notre propre interface web adaptée à un affichage sur smartphone 🙂

Prendre le contrôle grâce à l’API web de Z-Way

Je vous conseille de lire cette article très complet sur le sujet : http://www.openremote.org/display/docs/OpenRemote+2.0+How+To+-+Z-Wave+with+Razberry

Maintenant que vous savez tout à propos de cette fameuse API, nous allons créer une petite application web en HTML/PHP5/JavaScript.

Et voilà le résultat final sur mon smartphone 🙂

IMG_6243

Note : Vous pouvez construire cette l’application web, soit directement sur le Pi qui détient le module Razberry, soit sur n’importe quelle autre machine 🙂 Pour ma part, l’application web est exécutée sur un serveur tier 🙂

La première étape consiste à installer et configurer un serveur web Apache et PHP5. Je vous propose de suivre la procédure décrite dans cette article : PiHomeDashScreen – Installation et configuration

Une fois votre serveur web opérationnel, vous pouvez créer un répertoire « z-way » dans le répertoire par défaut d’Apache « /var/www », et y placer les fichiers décrits ci-après. L’idée est simple, il s’agit d’une simple page web qui représente chaque module par une image en forme d’ampoule (allumée ou éteinte). Lorsqu’on clique sur une ampoule, on envoie une requête AJAX qui enverra à son tour la requête HTTP GET à l’API Z-Way pour répercuter l’ordre donné 🙂

index.php

<?php
  header('Content-type: text/html; charset=utf-8');
  require_once('conf.php');
?>

<!DOCTYPE html>
<html>
  <head>
    <title>Z-Way - BOAs</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <meta http-equiv="Content-Language" content="Fr">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" type="text/css" media="screen" href="style.css">
  </head>
  <body>

    <?php foreach ($devices as $device_name => $device_id) { ?>
      <div onClick="zWave_AN157_set('<?php echo $device_id; ?>');">
        <img id="light_<?php echo $device_id; ?>" src="light_off.png">
        <p><?php echo $device_name; ?></p>
        <input style="width : 50px;" type="hidden" value="" id="status_<?php echo $device_id; ?>">
      </div>
    <?php } ?>

    <div onClick="zWave_AN157_set_all('on');">
      <img id="light_all_on" src="light_on.png">
      <p>All ON</p>
    </div>

    <div onClick="zWave_AN157_set_all('off');">
      <img id="light_all_off" src="light_off.png">
      <p>All OFF</p>
    </div>

    <script type="text/javascript" src="jquery-1.10.2.min.js"></script>
    <script type="text/javascript" src="main.js"></script>
    <script>
      $( document ).ready(function() {
        console.log( "ready!" );
        updateStatus ();
      });
    </script>

  </body>
</html>

 conf.php

<?php

// nom des modules ainsi que leur ID que vous trouverez dans l'interface web z-way

$devices = array(
                      'Cuisine' => 3,
                      'Salon'   => 6,
                      'Télé'    => 5,
                      'Bureau'  => 2,
                      'Sapin'   => 4
                  );

// adresse IP du Pi sur lequel Z-Way est installé

$pi_zway = "1.2.3.4";

?>

ajax.php

<?php

  header('Content-type: text/html; charset=utf-8');
  require_once('conf.php');

  function httpGet ($url) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $return = curl_exec($curl);
    curl_close($curl);
    return $return;
  }

  $cmd        = $_REQUEST['cmd'];
  $val        = $_REQUEST['val'];
  $device_id  = $_REQUEST['device_id'];
  if($val == 'on'){$val = 255;}else {$val = 0;}

  // permet de changer l'état d'un module
  if($cmd == 'set'){
    $url = "http://".$pi_zway.":8083/ZWaveAPI/Run/devices[".$device_id."].instances[0].commandClasses[0x25].Set(".$val.")";
    echo httpGet ($url);
  }

  // permet de récupérer l'état d'un module
  else if($cmd == 'get'){
    $url = "http://".$pi_zway.":8083/ZWaveAPI/Run/devices[".$device_id."].instances[0].commandClasses[37].Get()";
    echo httpGet ($url);
  }

  // permet de modifier l'état de  tous les modules
  else if($cmd == 'set_all'){
    foreach($devices as $device_name => $device_id) {
      $url = "http://".$pi_zway.":8083/ZWaveAPI/Run/devices[".$device_id."].instances[0].commandClasses[0x25].Set(".$val.")";
      echo httpGet ($url);
    }
  }

  // recupère le dernier statut
  else if($cmd == 'status'){
    $url = "http://".$pi_zway.":8083/ZWaveAPI/Data/".time();
    echo httpGet ($url);
  }

  // default
  else{
    return "";
  }

?>

main.js

Note : N’oubliez pas de télécharger la dernière version de jQuery

var status_timeout;

/* Z-Way */

function zWave_AN157_set_all (val) {
  $.ajax({
    async : false,
    type: "POST",
    url: "ajax.php",
    data: "cmd=set_all&val="+val,
    success: function(html){
      zWay_status_all ();
    }
  });
}

function zWave_AN157_set (device_id) {
  var status = $("#status_"+device_id).val();
  if(status == '255'){
    var val = 'off';
  }
  else{
    var val = 'on';
  }
  $.ajax({
    async : false,
    type: "POST",
    url: "ajax.php",
    data: "cmd=set&device_id="+device_id+"&val="+val,
    success: function(html){
      zWave_AN157_get (device_id);
    }
  });
}

function zWave_AN157_get (device_id) {
  $.ajax({
    async : false,
    type: "POST",
    url: "ajax.php",
    data: "cmd=get&device_id="+device_id,
    success: function(html){
      zWay_status (device_id);
    }
  });
}

function zWay_status (device_id) {
  $.ajax({
    async : false,
    dataType: "json",
    type: "POST",
    url: "ajax.php",
    data: "cmd=status",
    success: function(html){
      var updatetime = html['updateTime'];

      if(typeof html['devices.'+device_id+'.instances.0.commandClasses.37.data.level'] != 'undefined'){
        var level      = html['devices.'+device_id+'.instances.0.commandClasses.37.data.level']['value'];
        if(level == '255'){
          $("#light_"+device_id).attr('src', 'light_on.png');
        }
        else{
          $("#light_"+device_id).attr('src', 'light_off.png');
        }
        $("#status_"+device_id).val(level);
      }

      $("#status").html(updatetime);
    }
  });
}

function zWay_status_all () {
  $(".device_status").each(function (index) {
    var ds_id = $(this).attr('id').split("_");
    var d_id  = ds_id[1];
    zWave_AN157_get (d_id);
  });
}

function updateStatus () {
  zWay_status_all ();
  status_timeout = setTimeout("updateStatus()", 10000);
}

style.css

body {
  padding : 20px 5px;
  font-family : Arial, Helvetica;
  font-size : 14px;
  text-align : center;
  background-color : #000;
  color : #EEE;
}

div.dev {
  border : solid 1px #000;
  display : inline-block;
  text-align : center;
  padding : 5px;
  margin : 5px;
}

div.dev:active {
  border : solid 1px rgba(255,255,255,0.3);
}

div.dev:hover {
  cursor : pointer;
}

img.light {
  width : 100px;
  height : 100px;
  border : 0;
}

p.device_name {
  font-weight : bold;
  text-align : center;
}

 Enfin, voici les deux images d’ampoules utilisées :

light_off light_on

Avertissement

Le code source ci-dessus est créer dans le cadre d’un exemple simple, il peut et doit être optimisé et sécurisé 🙂

Si vous souhaitez avoir accès à cette application web depuis l’extérieur de votre réseau local, je vous conseille fortement de mettre en place un contrôle d’accès afin d’éviter que n’importe qui ne prenne le contrôle de votre maison 🙂

Dans un prochain article, je décortiquerai une installation complète et sécurisé à double authentification : certificat client et mot de passe.

Programmer l’allumage et l’extinction des lumières à heure fixe

Il peut être intéressant de programmer l’allumage et l’extinction des lumières (ou tout autre appareil) à heure fixe. Pour cela, rien de plus simple, il suffit de lancer les requêtes HTTP GET à Z-Way en utilisant CRON 🙂

Voici ma crontab qui allume les lumières de mon séjour du lundi au vendredi de 7h à 8h, puis de 19h à 1h tous les jours de la semaine 🙂

# m h  dom mon dow   command

#########################
#  LIGHTS
#########################

 0  7 * * 1-5    /root/z-way_lights.sh on
 0  0 * * 1-5    /root/z-way_lights.sh off
 0 19 * * *      /root/z-way_lights.sh on
 0  1 * * *      /root/z-way_lights.sh off

Et voici le contenu du script /root/z-way_lights.sh :

#!/bin/bash

devices="2 3 5 6"

if [[ $# -eq 0 ]] ; then
  exit 1;
fi

if [ $1 == "off" ] ; then
  val=0
elif [ $1 == "on" ] ; then
  val=255
else
  exit 1;
fi

for n in $devices ; do
  wget -o ./z-way.api -O ./z-way.api http://127.0.0.1:8083/ZWaveAPI/Run/devices%5B$n%5D.instances%5B0%5D.commandClasses%5B0x25%5D.Set%28$val%29 
done

exit 0;

Tout cela fonctionne très bien depuis maintenant quelques semaines 🙂 Il me tarde de faire l’acquisition d’autres modules Z-Wave 🙂 Je pense notamment à des prises avec variateur telles que les Everspring AD142-6, pour allumer la lumière progressivement le matin dans la chambre lorsque le réveil sonne 😀

Dans mon prochain article, je parlerai de vidéo surveillance 🙂 A suivre…

L’article Contrôle de l’éclairage avec le module Z-Wave Razberry est apparu en premier sur MagdiBlog.

Razberry : transformez votre Raspberry Pi en serveur domotique Z-Wave

Par : Olivier
8 janvier 2014 à 10:06

raspberry_pi_z-wave

Il n’y a plus aucun doute, avec 2014 nous entrons dans l’ère de la domotique et des technologies du « tout connecté » ! Je m’en réjouis car j’attendais cela avec impatience 🙂

Dans cet article, nous allons voir comment le Raspberry Pi peut vous permettre de domotiser votre maison à moindre frais en s’appuyant sur le protocole z-wave 🙂

Domotique

Derrière le mot « domotique » se cache de nombreuses technologies et des usages très variés. Il est question par exemple de commander l’allumage de ses lumières, contrôler son chauffage, programmer l’ouverture de ses volets,… On parle également de la mesure de la consommation des équipements électriques, de la température des pièces, de détecter les incendies, de collecter toutes les données qui permettent à une maison ou un bâtiment de fonctionner… Mais la domotique c’est également la sécurité des personnes, la télésurveillance, les caméras connectées, les alarmes, les capteurs de présence, la détection d’intrusion, etc…

Bref, la domotique c’est tout ce qui touche de près ou de loin à l’informatique, aux automatismes, aux télécommunications, à l’électronique et qui s’applique à l’habitat 🙂

Toutes ces technologies existent déjà depuis longtemps, mais à mon sens, la notion de domotique prend son sens quand toutes ces choses peuvent être pilotées de manière centralisée, et surtout, à distance à travers Internet 🙂 En effet, je dispose déjà depuis quelques années de prises murales télécommandées, achetées dans une grande surface de bricolage, pour allumer et éteindre les lumières dans mon séjour ; c’est très pratique. En revanche, connecter ce système à un réseau informatique, et donc pouvoir le contrôler à distance et réaliser une infinité de programmes et de scénarios, augmente considérablement le potentiel de la chose 🙂

C’est pourquoi, à mon avis, en se rapprochant de nos ordinateurs, tablettes et autres périphériques mobiles, la domotique devient réellement pertinente 🙂

Z-Wave

z-wave_logoParmi les nombreux systèmes, marques et protocoles domotique existants, il y en a un qui se démarque et gagne en popularité. Il s’agit du protocole Z-Wave.

Ce protocole ouvert, communiquant par onde radio, fonctionne sur le principe du « maillage » (topologie mesh), c’est à dire que chaque « module » (prise de courant, capteur de température, détecteur de présence,…) retransmet les signaux afin de garantir une grande couverture. Le gros avantage de ce protocle est qu’il est « ouvert ». Par conséquent, il existe de nombreuses entreprises et marques qui proposent des produits compatibles entre eux 🙂

Le site de la Z-Wave Alliance rassemble tous les constructeurs et acteurs (plus de 250 à l’heure actuelle) qui travaillent autour du Z-Wave et référence aujourd’hui plus de 1000 produits Z-Wave 🙂 Il y a de quoi faire !

Je préfère de loin ce type de protocole ouvert par rapport aux systèmes de grandes marques qui proposent leur écosystème chèr et fermé ! Surtout lorsqu’il s’agit de ma maison ! Selon, moi, un système domotique complet doit être ouvert et permettre à l’utilisateur de le maitriser comme il l’entend.

Razberry

razberry_z-waveDepuis quelques mois la société Z-Wave.me propose une carte d’extension pour nos chers petits Raspberry Pi : Razberry

Il s’agit d’un petit circuit qui se branche directement sur le port GPIO permettant ainsi au Pi de parler le Z-Wave 🙂

Ce module est livré avec le logiciel Z-Way (encore en développement) facilement installable sur Raspbian en suivant la procédure décrite sur le site z-wave.me – Documentation. Plusieurs interfaces web sont disponibles (desktop, mobile,…) pour créer votre réseau et gérer vos modules Z-Wave.

La carte d’extension Razberry se négocie autour de 59€, vous pouvez l’obtenir sur Amazon notamment.

Très petite, elle se loge sans problème dans un boitier Raspberry Pi.

photo 4photo 2

Je vous propose de lire l’article très complet du site maison-et-domotique.com sur la carte Razberry : http://maison-et-domotique.com/product/raspberry-et-razberry-la-box-domotique-ideale

Une API pour les gouverner tous

Le point fort de la partie logicielle livrée avec la Razberry est son API web 🙂 Cette interface de programmation vous permet de créer vos propres programmes, dans le language que vous voulez 🙂 De manière très synthétique, vous pouvez gérer et piloter vos modules Z-Wave en lançant des requêtes HTTP GET sur votre Raspberry Pi ! C’est vraiment très simple et très souple.

Je vous propose de lire ce tuto très complet : http://www.openremote.org/display/docs/OpenRemote+2.0+How+To+-+Z-Wave+with+Razberry

Dans mon prochain article (qui est déjà en préparation) je vous présenterai mon installation Z-Wave composé de cinq modules « prise de courant » pilotés depuis mon smartphone 🙂 Vous verrez, c’est très simple à mettre en place en quelques lignes de PHP, HTML et JavaScript 🙂

Domotique, Internet et sécurité

Si vous vous lancez dans la domotique, il est très important de comprendre les enjeux de sécurité. En effet, si vous voulez « connecter » votre maison à Internet, il faut bien comprendre que votre maison devient, dans une certaine mesure, « pilotable » depuis n’importe où ! Il est donc primordial de vous assurer que votre système est sécurisé pour éviter que des personnes mals intensionnées prennent le contrôle de votre maison !

ThermostatJe vous propose de lire cette série de trois articles du blog de la société Advens (spécialisée dans la sécurité) qui aborde cette problématique de manière très professionnelle et concrète, autour d’un projet de pilotage d’une chaudière 🙂

L’article Razberry : transformez votre Raspberry Pi en serveur domotique Z-Wave est apparu en premier sur MagdiBlog.

Bonne année 2014 !

Par : Olivier
2 janvier 2014 à 09:56

Raspberry_Pi_2014

Je vous souhaite à toutes et à tous une excellente nouvelle année 🙂

Bonheur, amour, joie, partage et pleine réussite dans tous vos projets 🙂

Je profite également de ces voeux pour vous remercier tous pour vos encouragements qui maintiennent ma motivation au top 🙂

En 2014, je vais attaquer un nouveau sujet très vaste, toujours avec des Raspberry Pi : la domotique 🙂

A très bientôt,

Olivier

Retrospective 2013

dashscreen_final

 

 

 

 

 

  • Pi TimeLapse : Un dispositif timelapse autonome pendant 10 jours avec connexion 3G

IMG_4746

 

 

 

 

 

 

  • Pi Car JukeBox : Un jukebox dans votre voiture, piloté par votre smartphone

IMG_5376

 

 

 

 

 

 

  • Pi BOA Drone : Un projet de drone avion longue distance avec auto pilote, GPS et connexion 3G

Pi-BOA-Drone_small_45

 

 

 

 

 

 

  • GPIO : Electronique, capteur de température, télémètre ultrason, accéléromètre/gyroscope, servo moteur…

image

 

 

 

 

 

 

  • Batterie : Tout ce qu’il faut savoir pour faire fonctionner votre Raspberry Pi sur batterie

image

L’article Bonne année 2014 ! est apparu en premier sur MagdiBlog.

❌
❌