Go Down

Topic: Mon système domotique à base de Raspberry et Arduino (Read 3275 times) previous topic - next topic

Waryard

Bonsoir à tous !

Ayant reçu de l'aide de pas mal de monde ici pour ce projet (surtout @MicroQuettas ), je vous le présente aujourd'hui dans sa version finale.

Le serveur domotique est un Raspberry Pi 3 sous Jeedom, avec en USB un Arduino Uno qui gère deux DHT22, un récepteur 433MHz (télécommandes, détecteurs portes/PIR/fumée/fuite d'eau) ainsi que 4 relais.

Le serveur possède (sur GPIO) un émetteur 433MHz pour gérer des prises télécommandées



D'autres NodeMCU ESP-E12 sont répartis dans la maison afin de faire des relevés de température et servir de sonnette pour 2 d'entre eux


(Maintenant remplacés par des ESP8266)

Le tout est piloté depuis ImperiHome, installé sur tous les smartphones + une tablette murale (dont la principale utilité est d'afficher la caméra IP de la porte d'entrée)

_ _ _ _ _

=> Également, en plus de m'offrir une excellence 4G+ avec 230 Mb/s en down, Free Mobile me permet de recevoir des SMS en cas d'alerte pour l'alarme et autres

=> Une petite dizaine de Dash Buttons d'Amazon sont détournés de leur fonction originelle pour me permettre de lancer des scénarios etc...

=> J'ai aussi des statistiques sur ma consommation électrique grâce à la téléinfo EDF, le compteur étant situé au même endroit que l'arrivée de ma ligne VDSL2, j'en ai profité pour m'épargner 15m de câble à tirer dans des gaines surchargées...

_

Quelques modifications/rajouts sont prévus :
[EDIT 16/5] -> Onduleur sur la raspberry afin de maintenir le fonctionnement en cas de coupure de courant
-> Ajout d'une clé 3G Huawei avec forfait Free Mobile 2€ pour pallier à une coupure de la ligne VDSL en cas de cambriolage
[EDIT 23/05] -> Niveaux de mes cuves de fioul via des capteurs à ultrasons situés au dessus des cuves
-> Équiper tous les ESP8266 de PIR (détecteurs de mouvements infrarouge) afin de palier à une éventuelle défaillance des détecteurs 433MHz

Je répondrai volontiers aux questions / remarques sur le système,

Cordialement,
Waryard

ARTNOW

Bonjour ,bravo , superbe réalisation , j'attends de récupérer une tablette d'occasion pour me lancer dans un projet équivalent .J'aurais probablement des questions .cordialement

lesept

A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

kammo

Classe!
C'est pas compliqué de sécuriser tout ce réseau?
Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

Waryard

Classe!
C'est pas compliqué de sécuriser tout ce réseau?
Merci !

Concernant le 433 des détecteurs je pense que ça pourrait être brouillé avec un appareil spécifique (mais c'était la solution la moins couteuse), et de toute façon il y a un PIR et un détecteur magnétique tous deux câblés directement sur l'Arduino Uno principal, qui surveillent la zone la plus sensible.

Sinon niveau accès extérieur la redirection de port sur ma Freebox n'est faite qu'en HTTPS et je ne donne accès qu'à l'API d'ImpériHome (pas besoin de plus à distance), niveau sécurité c'est pas forcément le top, je réfléchis à désactiver l'accès extérieur et ne me connecter au serveur qu'en local à travers le serveur VPN de la Freebox (ce que je fais déjà pour mon NAS)

MicroQuettas


vincent84

Bonjour,

super réalisation ! Les codes sont-ils disponible ?


Waryard

Bonjour,

super réalisation ! Les codes sont-ils disponible ?


Bonsoir,

Le code pour la Uno du server et les NodeMCU se compose du très gros sketch fourni par le plugin Jeedouino (qui s'adapte selon le model d'Arduino), il faut penser à activer UserSketch sinon le code rajouté ne sera pas exécuté
Code: [Select]
#define UserSketch 1

Le code pour les sonnettes (joue "Never gonna give you up" de Rick Astley lors d'une pression sur le bouton filaire, puis se connecte au Wi-Fi et indique au server Jeedom qu'un malotru sonne à la porte, puis se rendort (je suis en train d'intégrer le deepsleep)

A copier dans UserVars :
Code: [Select]
// UserVars
// Vos declarations de variables / includes etc....
int jeedomSyncRound = 0;
const int buzzerPin = 5;
// RickAstley
const int songLength = 18;
char notes[] = "cdfda ag cdfdg gf "; // a space represents a rest
int beats[] = {1,1,1,1,1,1,4,4,2,1,1,1,1,1,1,4,4,2};
int tempo = 150;
int duration;
  int frequency(char note)
{
  // This function takes a note character (a-g), and returns the
  // corresponding frequency in Hz for the tone() function.
 
  int i;
  const int numNotes = 8;  // number of notes we're storing
 
  // The following arrays hold the note characters and their
  // corresponding frequencies. The last "C" note is uppercase
  // to separate it from the first lowercase "c". If you want to
  // add more notes, you'll need to use unique characters.

  // For the "char" (character) type, we put single characters
  // in single quotes.

  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  int frequencies[] = {262, 294, 330, 349, 392, 440, 494, 523};
 
  // Now we'll search through the letters in the array, and if
  // we find it, we'll return the frequency for that note.
 
  for (i = 0; i < numNotes; i++)  // Step through the notes
  {
    if (names[i] == note)         // Is this the one?
    {
      return(frequencies[i]);     // Yes! Return the frequency
    }
  }
  return(0);  // We looked through everything and didn't find it,
              // but we still need to return a value, so return 0.
}
// RickAstley


A copier dans UserSetup :
Code: [Select]
pinMode(buzzerPin, OUTPUT);
digitalWrite(buzzerPin,LOW);


A copier dans UserLoop :
Code: [Select]
if(analogRead(A0) < 500)
  {
  delay(42);
  if(analogRead(A0) < 500)
  {

jeedom += '&';
jeedom += 500; // Etat pin 500
jeedom += '=';
jeedom += '1'; // '0' ou '1'
jeedomSyncRound = 1;
 
for (int i = 0; i < songLength; i++) // step through the song arrays
    {
    duration = beats[i] * tempo;  // length of note/rest in ms
   
    if (notes[i] == ' ')          // is this a rest?
    {
      delay(duration);            // then pause for a moment
    }
    else                          // otherwise, play the note
    {
      tone(buzzerPin, frequency(notes[i]), duration);
      delay(duration); // wait for tone to finish
    }
    delay(tempo/10);              // brief pause between notes
  }
  digitalWrite(buzzerPin,LOW);
}
}

if (jeedomSyncRound == 1) jeedomSyncRound = 2;
if (jeedomSyncRound == 2) jeedomSyncRound = 3;
if (jeedomSyncRound == 3)
{
jeedom += '&';
jeedom += 500; // Etat pin 500
jeedom += '=';
jeedom += '0'; // '0' ou '1'
jeedomSyncRound = 0;
}


A savoir que :
-> J'ai implanté jeedomSyncRound pour que UserLoop s'exécute plusieurs fois avant de repasser la pin virtuelle 500 à 0 afin que Jeedom comprenne que la pin 500 est passé à 1 quelques instants (sans cela la pin 500 ne se met pas à jour dans Jeedom (pour affirmer cela je ne me base pas sur l'affichage dashboard mais sur un scénario programmé pour se lancer lorsque cette pin change de valeur qui ne se lance pas)
-> Pour la mélodie, je l'ai récupéré ici : http://bitcows.com/?p=19
-> La condition analogRead(A0) < 500 est doublée pour éviter les faux positifs
-> Je n'ai pas le code pour la Uno dans mon cloud, je le posterai dès que possible...

poirette

salut Waryard ,

très intéressant. J'ai moi même domotisé toute ma maison sur le même style, mais il me manque le relevé du compteur.

pourrais tu m'expliquer comment tu decodes le signal provenant du compteur?

Merci

petite image de mon installation:



ça pilote:

11volets roulants
14 luminaires
2 portes de garage
1 portail

Sam24

Salut à tous

Je suis entrain de commander des volets roulants avec un NodeMCU grâce à une application que j'ai créé moi même sur mon smatphone et je suis confronté à un problème.

Lorsque j'appuie sur le bouton monter de mon smatphone, le volet monte bien et si j'appuie par accident sur descendre pendant qu'il monte, le volet va descendre une fois que la tâche monter à été effectué.

Je voudrai donc savoir comment programmer mon NodeMCU (qui se programmer comme un Arduino) de sorte à ce qu'il ne tient prend en compte des appui accidentel.

J'espère à avoir été clair,

Merci à vous

Jambe

Il faudrait poster dans la section générale du forum, a priori ton montage n'est pas inspiré du projet présenté plus haut.

et point très important: sans le code que tu a fait + un schéma elec, personne ne sera capable de te dire ce qui ne fonctionne pas.

kreys83

Bonjour,
Comment fait-tu communiquer ton Rpi et ton Arduino ?
J'ai essayé de les faire communiquer en utilisant Python côté Rpi, mais c'est très limité...
C'est le seul point qui me freine dans mon projet ?
Pourrais-tu apporter plus de précision sur ce point ?
Merci beaucoup.

Waryard

Bonjour,
Comment fait-tu communiquer ton Rpi et ton Arduino ?
J'ai essayé de les faire communiquer en utilisant Python côté Rpi, mais c'est très limité...
C'est le seul point qui me freine dans mon projet ?
Pourrais-tu apporter plus de précision sur ce point ?
Merci beaucoup.
Salut !

En fait mon système a beaucoup évolué depuis que j'ai posté (déploiement d'un 2e serveur domotique dans mon appart, 5 Amazon Echo Alexa, des détecteurs Zwave et plein d'autres évolutions) qui nécessitent de reprendre à 0 ce topic prochainement,

Pour répondre à ta question, auparavant j'utilisais un Arduino Uno en USB sur le RPi (via le plugin Jeedouino de Jeedom) pour gérer la réception 433 MHz et d'autres entrées basiques, ainsi que des Arduino Nano que j'ai toutes supprimées au profit de NodeMCU en Wi-Fi avec le firmware ESPEasy (via le plugin ESPEasy de Jeedom) ainsi que d'un Arduino Mega en USB avec le "firmware" RFLink (en préparation)

Désolé de ne pas pouvoir apporter de réponse satisfaisante à ta question si tu n'utilise pas Jeedom...

Bonne soirée à toi!

hbachetti

Quote
J'ai essayé de les faire communiquer en utilisant Python côté Rpi, mais c'est très limité...
Pour communiquer en série par l'USB entre une RPI et un ARDUINO ?

https://github.com/pyserial/pyserial

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

kreys83

Merci pour vos réponses.
Je vais m'intéresser à Jeedom, voir un peu ce que c'est :)
Hbachetti, j'utilisais effectivement pyserial, mais je ne parvenais a recevoir que des nombres et pas de données complexes.
Je n'arrivais pas a faire en sorte de savoir de quelle variable il s'agissait lorsque je recevais un nombre. En clair, passer des objets variables en entier.

Go Up