Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

[Projet] Domotisation DIY de mon appart
#1

Bonjour,

En plein dans les travaux d'un appartement de 55m² fraîchement acheté, je compte un peu le domotiser Big Grin
Pour ce faire, je compte utiliser deux Raspberry (une pour la partie domotique et l'autre pour le média center) et plusieurs modules, appelés node, pilotés par radio.

[h]Raspberry Hestia - Surveillance générale, décoration[/h]
Faisant référence à la déesse du feu sacré et du foyer dans la mythologie grec, la Raspberry Hestia est le coeur du système. Via les transmissions radio, elle contrôle les nodes réparti un peu partout dans l'appartement et gère l'interface web accessible depuis le réseau local.
Chaque node est spécialisée dans une fonction (déco, arrosage, contrôle des chauffages, ...). Selon leurs localisations, ils embarquent des capteurs de température et d'hygrométrie afin d'actualiser l'IHM web.
Elle est placée dans le bureau et possède des capteurs de température et d'hygrométrie afin de les relever localement.

[h]Raspberry Appolon - Média center[/h]
Faisant référence au dieu de la lumière, du chant, de la musique et de la poésie dans la mythologie grec, la Raspberry Appolon est donc dédiée au média center. Elle est fixée derrière la TV et exécute XBMC.
Elle est pilotée via l'application xbmcRemote sur iOS.

Pour ce projet, l'accent est mis sur la discrétion et l'autonomie du système. La conception globale sera pensée en fonction de cela.

Si vous avez des idées (et je suis sûr que vous en avez !), je suis preneur Wink

[h]Contraintes[/h]
  • Discrétion
    Le système doit être le plus discret possible. Les Rapsberry, les capteurs, ... doivent être cachés autant que possible.[/*]
  • Sécurité
    L'interface web doit être sécurisée.[/*]
  • Taille réduite
    Les Nodes (et leurs alimentations distinctes respectives) doivent tenir dans une boite de dérivation encastrable de 7 x 7 cm[/*]

[h]Le projet :[/h]

Raspberry Hestia :
[h]Idées en vrac :[/h]
  • Via une détection par adresse MAC, le système peut savoir qui est présent dans l'appartement

MAJ : 23/08/2014

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#2

[h]Fond lumineux derrière le meuble TV[/h]


Description
Une bande de led, collé derrière la TV permettra de générer des fonds lumineux selon l'ambiance désirée choisie via l'IHM web ou la température ambiante. Cette dernière est également renvoyée par la liaison radio à la Rpi qui actualisera la température sur l'IHM de même que l'hygrométrie relevée par une sonde.
Le node qui le gère est basé sur un micro contrôleur Atmega 328. De manière générale, le node est prévu pour fonctionner de manière autonome.
L'éclairage se fera selon plusieurs modes :
  • Une seule couleur au choix
  • Plusieurs couleurs au choix
  • Couleur(s) choisies aléatoirement
  • En fonction de la température ambiante
  • En fonction de la musique / son
Chaque mode pourra être allumé de manière fixe ou progressive.

Elle pourra être contrôlé de deux manières : par l'IHM web du système domotique via les transmetteurs NRF24L01 et par deux boutons poussoirs pour sélectionner le mode d'allumage de la bande. Le choix de couleur ne pourra se faire que par l'IHM web (sauf pour les autres modes).

[Image: 871810IMG0179.jpg]

Connexion de la bande LED à la carte Arduino :
5V (rouge) : +5V Arduino
CK (vert - SPI clock) : pin 2
SD (jaune - SPI data) : pin 3
GND (bleu) : Masse Arduino

Connexion du transmetteur RF à la carte Arduino :


[Image: 774285IMG0180.jpg]

Etat d'avancement du node :
A faire - En cours - Terminé
Bouton de sélection du mode : Terminé
Affichage d'une couleur fixe : Terminé
Affichage d'une couleur progressive : En cours
Affichage de plusieurs couleurs fixe : A faire
Affichage de plusieurs couleurs progressive : A faire
Affichage aléatoire fixe : En cours (dev fini, à tester)
Affichage aléatoire progressive : A faire
Affichage en fonction de la température ambiante fixe : En cours
Affichage en fonction de la température ambiante progressive : A faire
Affichage en fonction du son : A faire
Acquisition de l'hygrométrie : A faire
Réception des informations en provenance de la Raspberry : En cours
Transmission des informations à la Raspberry : En cours


Développement :
Librairie utilisée : Adafruit WS2801

Ce code fait s'allumer et s'éteindre progressivement chaque led en même temps d'une couleur bleu et permet de tester la librairie WS2801 d'Adafruit.
A voir sur mon github : https://github.com/vodkaorange84/arduino...de_led.ino

Code du node (en cours)
Code :
[== C++ ==]
/* Node de contrôle de la bande led WS2801 via RF 2,4 Ghz
MAJ : 16/08/2014
Auteur : Teranmoc
Blog : http://vodkaorange84.wordpress.com

Cablâge de la bande LED :
5V (rouge) : +5V Arduino
CK (vert - SPI clock) : pin 2
SD (jaune - SPI data) : pin 3
GND (bleu) : Masse Arduino

Cablâge du transmetteur RF :
*/

#include <SPI.h>
#include <Adafruit_WS2801.h>
#include <OneWire.h>
#include <Mirf.h> // communication radio
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

#define ADDR_DS18B20 0x28 // adresse de la sonde DS18B20
#define ON HIGH // contact fermé ou led allumée
#define OFF LOW // contact ouvert ou led éteinte

// Pins
const int pinCK = 2; // Clock led WS2801
const int pinSD = 3; // Data led WS2801
const int bpUP = 4;
const int bpDOWN = 5;
const int pinTemperature = 6; // sonde température DS18B20
const int pinCe = 7;
const int pinCsn = 8;

// Variables
const int nbLed = 32; // nombre de LED présent sur la bande
const int maxi = 255;
const int valeurMini = 0;
const int valeurMaxi = 9;
int cpt; // compteur bouton
float temperature; // température ambiante

// Objets
Adafruit_WS2801 led(nbLed, pinSD, pinCK); // bande LED
OneWire ds(pinTemperature); // sonde de température DS18B20

typedef struct Couleur{
  int rouge;
  int vert;
  int bleu;
};
void setup()
{
  led.begin(); // démarrage de l'objet gérant la bande LED
  pinMode(bpUP, INPUT);
  pinMode(bpDOWN, INPUT);
  cpt = 0;
  temperature = 0;
  // config Mirf
  Mirf.cePin = pinCE;
}
void loop()
{
  // lecture du message reçu par radio (conversion en int => variable cpt)
  // lecture de la couleur (R V et B => Couleur color)
  // lecture des boutons
  if(digitalRead(bpUP) == ON) // on passe à la fonction suivante
  {
    if(cpt < valeurMaxi)
      cpt++;
    else
      cpt = valeurMaxi;
    while(digitalRead(bpUP) == ON); // tant que le bouton est appuyé, il ne se passe rien
  }
  if(digitalRead(bpDOWN) == ON) // on passe à la fonction précédente
  {
    if(cpt > valeurMini)
      cpt--;
    else
      cpt = valeurMini;
   while(digitalRead(bpDOWN) == ON); // tant que le bouton est appuyé, il ne se passe rien
  }
  // acquisition de la température pour l'IHM
  getTemperature(temperature);
  // sélection des fonctions en fonction du compteur ou du message reçu
  switch(cpt)
  {
    case 0: // une seule couleur fixe
      break;
    case 1: // une seule couleur progressive
      break;
    case 2: // plusieurs couleurs fixe
      break;
    case 3: // plusieurs couleurs progressive
      break;
    case 4: // mode random fixe
      break;
    case 5: // mode random progressif
      break;
    case 6: // fonction de la température fixe
      break;
    case 7: // fonction de la température progressif
      break;
    case 8: // en fonction de la musique
      break;
  }
}
void setCouleur(Couleur color, bool progressif)
{
  // une seule couleur
}
void setCouleur(Couleur tabColor, int taille, bool progressif)
{
  // plusieurs couleurs (arg taille)
}
void random(bool progressif)
{
  // mode random (nombre de couleur et couleurs aléatoire)
}
void temperature(float temp, bool progressif)
{
  // la couleur change en fonction de la température ambiante
}
void musique()
{
}
// Fonctions nécessaires
boolean getTemperature(float *temp)
{
  byte data[9], addr[8];
  // data : Données lues depuis le scratchpad
  // addr : adresse du module 1-Wire détecté

  if (!ds.search(addr)) { // Recherche un module 1-Wire
    ds.reset_search();    // Réinitialise la recherche de module
    return false;         // Retourne une erreur
  }
  
  if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
    return false;                        // Si le message est corrompu on retourne une erreur

  if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
    return false;         // Si ce n'est pas le cas on retourne une erreur

  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
  
  ds.write(0x44, 1);      // On lance une prise de mesure de température
  delay(800);             // Et on attend la fin de la mesure
  
  ds.reset();             // On reset le bus 1-Wire
  ds.select(addr);        // On sélectionne le DS18B20
  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad

  for (byte i = 0; i < 9; i++) // On lit le scratchpad
    data[i] = ds.read();       // Et on stock les octets reçus
  
  // Calcul de la température en degré Celsius
  *temp = ((data[1] << 8) | data[0]) * 0.0625;
  
  // Pas d'erreur
  return true;
}

Structure des messages transmis :
Raspberry => Node
Code :
[== C++ ==]
struct Message {
   int mode; // mode d'affichage sur la bande
   Couleur color; // tableau
   int nbCouleurs; // nbre de couleurs à afficher (taille du tableau)
   bool progressif;
};

Node => Raspberry
Code :
[== C++ ==]
struct Reponse {
   int mode; // mode affiché sur la bande
   float temperature; // température relevée
};

Listes des pièces nécessaires :

A commander - En cours de commande - Reçu / Ok

Micro contrôleur Atmega 328
Bande de LED WS 2801 1m : eBay
Emetteur / récepteur 433 Mhz ou 2,4Ghz ?
Connecteur JST-SM : eBay
Deux boutons poussoir : eBay
Capteur de température DS18B20
Microphone
Sonde d'hygrométrie DHT11

Evolutions prévues et possibles :


MAJ : 07/12/2014

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#3

Beau projet encore une fois. Je suis curieux de voir l'intégration dans ton appartement et surtout le WAF ! Car chez moi c'est ce qui me bloque (je suis dans de l'ancien) et je ne peux pas faire ce que je veux ;-)
Vivement la suite !

Raspberry Pi Home Server : http://www.pihomeserver.fr
Hotspot Wifi avec portail captif pour Raspberry Pi: Kupiki Hotspot
Répondre
#4

Projet intéressant en effet.
Par contre, je ne comprend pas la nécessité d'utiliser 3 raspberry pi?.
Perso, je centralise tout sur 1 raspberry pi, et le reste est géré par un exemple de node commandés par radio.

Mais sinon beau projet Smile
N'hésite pas à nous décrire toutes les étapes !

Serial Organisateur d'aPIro
Bloggeur Bidouilleur
Ydle, domotique DIY basée sur un raspberry pi
Répondre
#5

chris57100 a écrit :Beau projet encore une fois. Je suis curieux de voir l'intégration dans ton appartement et surtout le WAF ! Car chez moi c'est ce qui me bloque (je suis dans de l'ancien) et je ne peux pas faire ce que je veux ;-)
Vivement la suite !

:lol: j'ai dit à ma copine que c'était de la domotique pour se faciliter la vie. Donc ça va passer je pense Tongue

Yaug a écrit :Projet intéressant en effet.
Par contre, je ne comprend pas la nécessité d'utiliser 3 raspberry pi?.
Perso, je centralise tout sur 1 raspberry pi, et le reste est géré par un exemple de node commandés par radio.

Mais sinon beau projet Smile
N'hésite pas à nous décrire toutes les étapes !

En fait, mon idée première est de séparer le côté acquisition et application IHM. En gros, les Rpi permettent l'acquisition de données et l'action (pompe, chauffage, éclairage, ...) tandis que le serveur centralise les informations et déclenche les actions via les Rpi.
Il n'y a pas de nécessité absolu d'utiliser plein de Rpi mais comme j'adore bidouiller Wink
Question bète, c'est quoi un node ?

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#6

Un node dans mon projet Ydle c'est en fait : Un capteur, un microcontroleur, et un émetteur / récepteur 433 mhz / l'alimentation.
Je parle de capteur au sens large, ça peut être réellement un capteur (température, humidité, pression, luminosité), comme ça peut être un relai pour fermer un circuit etc.

Pour la partie application IHM, on la met sur le RPI mais elle est faite pour être délocalisée si on le souhaite (perso je l'ai mise sur l'ordi de la maison).

En tout cas projet intéressant (et je viens juste de capter que tu étais vodkaorange :p)

Serial Organisateur d'aPIro
Bloggeur Bidouilleur
Ydle, domotique DIY basée sur un raspberry pi
Répondre
#7

Je vois, c'est une sorte de petit module autonome !

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#8

Yeap.
Ce qui du coup permet de le réutiliser, de le déplacer, et qu'il coute moins cher qu'un raspberry Smile

Serial Organisateur d'aPIro
Bloggeur Bidouilleur
Ydle, domotique DIY basée sur un raspberry pi
Répondre
#9

Beau projet, mais effectivement, un Rpi suffira Smile.

Hâte d'en voir plus, et surtout, des photos !
Répondre
#10

Je me dis qu'une Raspberry sera dépassé si elle fait plusieurs choses en même temps (média center, domotique, ...)

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#11

Pour le media center, on est d'accord.

Mais pour Hestia et Nyx, un seul suffirait Wink.
Répondre
#12

C'est ce que je commence à me dire !

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#13

Bonjour Big Grin

Les travaux dans l'appartement avancent, je vais bientôt pouvoir passer mes gaines en même temps que je refais l'électricité !
Je pense modifier un peu mes plans d'origine et n'utiliser que deux Raspberry. Le serveur va donc ne plus être utilisé.
Le premier post a été mis à jour !

Sinon pour la partie domotique, je pense réutilisé le même principe que Yaug avec ses nodes ! Je me suis renseigné sur la programmation des micro contrôleurs ATmega et Attiny. Cela me parait réalisable !

L'appartement va être divisé en 6 zones :
  • Entrée
  • Salon / Salle à manger
  • Cuisine
  • Salle de bain
  • Chambre 1
  • Chambre 2 et couloir

(cette liste sera probablement optimisée)
Dans chaque zone sera mesuré la température et l'hygrométrie. Certains paramètres spécifiques seront également surveillées (à préciser)
La première Raspberry sera le cerveau du système. Il commandera via les ondes les différents modules (acquisition ou action).

La seconde Raspberry sera, quant à elle, dédiée au média center via RaspBMC.

Pour la transmission sans fil, c'est mieux du 433 ou du 2,4 Ghz ? Sachant que je voudrai utiliser qu'un seul émetteur au niveau du Rasp.

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#14

Chez moi le 433Mhz a une portée plus courte que le wifi. Le récepteur de mes sondes sans fils est au sous sol et ne capte pas l'étage. A voir donc en fonction de la surface de ton appartement, le type de mur et la position de ton raspberry

Raspberry Pi Home Server : http://www.pihomeserver.fr
Hotspot Wifi avec portail captif pour Raspberry Pi: Kupiki Hotspot
Répondre
#15

Le maximum en portée doit être de 10 mètres grand maximum et la Rapsberry sera au centre de l'appartement contre un mur porteur.

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#16

Je suppose que ca va passer mais ca sera peut être juste. A voir aussi si ton mur porteur est feraillé ou juste en agglo. Le treillis métallique pouvant bloquer/dégrader les ondes si tu dois passer à travers.

Raspberry Pi Home Server : http://www.pihomeserver.fr
Hotspot Wifi avec portail captif pour Raspberry Pi: Kupiki Hotspot
Répondre
#17

Je pars sur du 2,4 Ghz alors ?
C'est quoi sa portée ?

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#18

Le 433 mhz peut tout à fait faire l'affaire
tout dépend aussi du types de modules radios, du protocoles.. etc Smile

Serial Organisateur d'aPIro
Bloggeur Bidouilleur
Ydle, domotique DIY basée sur un raspberry pi
Répondre
#19

Un peu de news :
Pour le moment, seul les chauffages seront piloté via le fil pilote.
A partir de cet instant se pose un dilemme : soit j'implémente un module pour chaque radiateur chargé de le piloter soit j'utilise un module pour les piloter en un point central. Sachant qu'il me faudra acquérir la température et l'hygrométrie dans chaque pièce.
Je me dis que si je met un module dans chaque pièce, je peut relever la température et piloter le chauffage mais la température risque d'être faussée par le chauffage car proche du radiateur. L'avantage c'est que le µC pourra se gérer seul en fonction de la consigne provenant de la Rasp et de la température ambiante. De plus, il faudra prévoir une boite de dérivation de plus.
Si je met un module pour tout les chauffages, il me faudra tout de même acquérir la température localement mais comment ?

Qu'en pensez vous ?

Par contre, comment alimenter les modules en 5V ? Existe-t-il des transfos miniaturisés qui rentrerai dans les boites de dériv ?

Pour le moment, j'écris la classe de base commune à tout les nodes qui sera spécialisée en fonction des actions. Elle doit être adapté aux deux µC utilisés dans le projet. Cette classe gère la transmission RF. Existe-t-il des modules RF 433 Mhz en un bloc (émission et réception sur la même carte) ?

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#20

Bonsoir,

Je suis en train de travailler sur le module (enfin le Node Wink ) de contrôle des chauffages pour chaque pièce.
[Image: 438963DSC3212.jpg]

Pour rappel, il y a un module par chauffage. Ou peut être pas car je vais avoir du mal à implémenter une boite de dériv à côté du chauffage. Donc peut être que ce mode de fonctionnement ne sera pas mis en place pour les chauffages.
Le module mesure la température ambiante et l'hygrométrie de la pièce. Ces deux valeurs sont transmises à la Raspberry.
La température est comparée avec la consigne émise par la Raspberry et active, si besoin est, le chauffage via le relais (un seul est utilisé pour le moment). Il me manque le transmetteur TX/RX qui arrive.
Ce n'est pas sur la photo mais j'ai rajouté 2 LED. La première qui s'allume lorsque les données sont émises et la seconde pour signaler que l'acquisition des mesures ont été effectué (elle ne doit pas resté éteinte). Comme le module est enfermé dans une boite, elles ne sont présentes que pour du débugging. Mais ça peut être utile ?

Les infos transmisses par onde radio en 433 Mhz seront de cette forme :

PIECE_Temp_Hygrométrie_étatRelais

Naturellement, une fois terminé, le programme sera injecté dans un µC Atmega.

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#21

Teranmoc a écrit :Les infos transmisses par onde radio en 433 Mhz seront de cette forme :

PIECE_Temp_Hygrométrie_étatRelais
Pour ma part, j'utilise des données structurées pour transmettre les informations par ondes radio. Je trouve ça plus élégant, plus évolutif et plus lisible qu'une suite de nombres.

Dans ton cas, je réfléchirais à un truc du genre :

Code :
[== C++ ==]
struct MyMessageStruct {
    int room;
    float temperature;
    float humidity;
    int status;
};

La bibliothèque VirtualWire permet de le faire avec des Atmega. Je ne sais pas si elle est utilisable avec un Raspberry, je n'ai ni cherché ni essayé.
Répondre
#22

Et tu transmet juste une variable de type MyMessageStruct ?

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#23

Oui, il y a une fonction vw_send(message, length) à laquelle tu fournis un pointeur générique et une taille (taille de ton type MyMessageStruct) qui transmet la variable. De l'autre côté, tu attends un message d'une taille donnée (celle de ton type MyMessageStruct) : vw_get_message(message, length).

Je trouve que c'est assez bien fait et plutôt pratique quand tu veux transmettre des messages « complexes ».
Répondre
#24

De cette manière, pas besoin de m'enquiquiner à construire une trame en const char *.
Mais vw_send ne prend pas une chaine de caractère en paramètre ?

edit : je viens de voir un truc. Dans la configuration actuelle, je ne peux que soit reçevoir des données soit les envoyer mais pas les deux en même temps ?
Est - il possible d'utiliser un seul transmetteur / récepteur pour la Rasp' pour contrôler les autres modules ?

Anciennement vodkaorange Wink
Forum français et communauté sur les caméras embarqués et dashcam : Dashcam-France.fr
Blog notes - Github
Répondre
#25

Tu peux mettre une chaine de caractères, mais le type réel attendu est un uint8_t*. Il suffit d'un cast vers ce type de n'importe quelle référence à une variable pour que ça marche.
Dans mon cas, je l'utilise comme ça :
Code :
[== C++ ==]
vw_send((uint8_t *)&message, MESSAGE_SIZE);
avec MESSAGE_SIZE qui est une constante représentant la taille d'un MyMessageStruct, et message étant un MyMessageStruct.
Et de l'autre côté, tu fais
Code :
[== C++ ==]
vw_get_message((uint8_t*)&message, &messageLength)
avec message étant un MyMessageStruct et messageLength un uint8_t.

Je peux essayer de te retrouver le tuto que j'avais suivi pour me familiariser avec l'utilisation de la bibliothèque si tu le souhaites. Mais avec la doc, on s'en sort : il n'y a pas énormément de fonction, et elles sont bien documentées.
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)