Dans ce tutoriel nous allons apprendre comment réaliser un petit objet connecté à l’aide d’un ESP8266. On collectera à intervalle régulier la température et l’humidité d’un capteur DHT22. Les données seront envoyées (publiées) vers un broker (serveur) MQTT en WiFi puis intégrées au serveur domotique Home Assistant.
Ce petit projet permet d’aborder de nombreuses notions utiles Pour réaliser cet objet connecté nous aurons besoin d’un module WiFi ESP8266, d’un capteur de température et d’humidité DHT22 et d’une Led (pour simuler la commande d’une lampe).
Configuration nécessaire avant de débuter
Vous aurez besoin d’un ordinateur avec les logiciels suivants installés :
- Un Broker (serveur) MQTT. Mosquitto est un choix simple et gratuit super facile à installer en quelques minutes
- Un serveur domotique. Pour de projet nous utiliserons Home Assistant mais vous pouvez également essayer avec Jeedom (logiciel français) ou Domoticz (en français également et très simple d’utilisation). Si vous ne connaissez pas Home-Assistant, je vous invite à lire cet article qui explique étape par étape comment l’installer et le configurer.
- Eventuellement une connexion SSH qui facilite la vie pour exécuter les commandes Linux?
Matériel nécessaire
Pour réaliser ce projet, vous aurez besoin du matériel suivant
LoLin WeMos D1 Mini (compact et économique) ou n’importe quel autre ESP8266 ESP-12 | |
Alimentation 5/3A micro-usb | |
Led (optionnelle) | |
Résistance 220Ω (optionnel) | |
DHT22 | |
Jumper Dupont (optionnel) | |
Breadboard (optionnel) |
Tous les shields compatibles avec la LoLin d1 Mini
Circuit
L’ESP8266 LoLin Wemos d1 mini se câble comme un Arduino classique. Pour faire fonctionner la Wemos sur batterie LiPo ou piles il suffira de brancher sur les Pin 5V et G.
Dans le programme, le DHT22 est branché sur le Pin D4, la Led (optionnelle) sur la broche D2.
Schéma de branchement du DHT22 et de la Led au module ESP8266 Wemos D1 Mini
Code
L’ESP8266 (ESP-12) permet d’exécuter du code C++ développé à l’aide de l’IDE Arduino comme n’importe quelle autre carte Arduino. Pour ce projet, nous allons utiliser trois librairies suivantes :
- ESP8266WiFi.h : cette librairie et la boîte à outil idéal pour connecter (et reconnecter) un ESP8266 au réseau local en Wi-Fi internet, à un serveur…
- PubSubClient.h : cette librairie permet d’envoyer et de recevoir des messages MQTT et de gérer le QoS.
- DHT.h : cette librairie permet de récupérer facilement les mesures du capteur DHT11 ou DHT22
Créez un nouveau projet et collez le code suivant en modifiant les variables suivantes :
- wifi_ssid remplacer VOTRE_SSID par l’identifiant du réseau Wi-Fi sur lequel l’ESP8266 doit se connecter
- wifi_password remplacer MOT_DE_PASSE_WIFI par le mot de passe du réseau Wi-Fi
- mqtt_server remplacer par l’adresse IP du broker MQTT
/*
Projet d'apprentissage d'un objet connecté (IoT) pour réaliser une sonde de température
ESP8266 + DHT22 + LED + MQTT + Home-Assistant
Projets DIY (http://www.projetsdiy.fr) - Mai 2016
Licence : MIT
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h" // Librairie des capteurs DHT
#define wifi_ssid "VOTRE_SSID"
#define wifi_password "MOT_DE_PASSE_WIFI"
#define mqtt_server "IP_MOSQUITTO"
#define mqtt_user "guest" //s'il a été configuré sur Mosquitto
#define mqtt_password "guest" //idem
#define temperature_topic "sensor/temperature" //Topic température
#define humidity_topic "sensor/humidity" //Topic humidité
//Buffer qui permet de décoder les messages MQTT reçus
char message_buff[100];
long lastMsg = 0; //Horodatage du dernier message publié sur MQTT
long lastRecu = 0;
bool debug = false; //Affiche sur la console si True
#define DHTPIN D4 // Pin sur lequel est branché le DHT
// Dé-commentez la ligne qui correspond à votre capteur
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//Création des objets
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(9600); //Facultatif pour le debug
pinMode(D2,OUTPUT); //Pin 2
setup_wifi(); //On se connecte au réseau wifi
client.setServer(mqtt_server, 1883); //Configuration de la connexion au serveur MQTT
client.setCallback(callback); //La fonction de callback qui est executée à chaque réception de message
dht.begin();
}
//Connexion au réseau WiFi
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connexion a ");
Serial.println(wifi_ssid);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Connexion WiFi etablie ");
Serial.print("=> Addresse IP : ");
Serial.print(WiFi.localIP());
}
//Reconnexion
void reconnect() {
//Boucle jusqu'à obtenur une reconnexion
while (!client.connected()) {
Serial.print("Connexion au serveur MQTT...");
if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
Serial.println("OK");
} else {
Serial.print("KO, erreur : ");
Serial.print(client.state());
Serial.println(" On attend 5 secondes avant de recommencer");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
//Envoi d'un message par minute
if (now - lastMsg > 1000 * 60) {
lastMsg = now;
//Lecture de l'humidité ambiante
float h = dht.readHumidity();
// Lecture de la température en Celcius
float t = dht.readTemperature();
//Inutile d'aller plus loin si le capteur ne renvoi rien
if ( isnan(t) || isnan(h)) {
Serial.println("Echec de lecture ! Verifiez votre capteur DHT");
return;
}
if ( debug ) {
Serial.print("Temperature : ");
Serial.print(t);
Serial.print(" | Humidite : ");
Serial.println(h);
}
client.publish(temperature_topic, String(t).c_str(), true); //Publie la température sur le topic temperature_topic
client.publish(humidity_topic, String(h).c_str(), true); //Et l'humidité
}
if (now - lastRecu > 100 ) {
lastRecu = now;
client.subscribe("homeassistant/switch1");
}
}
// Déclenche les actions à la réception d'un message
// D'après http://m2mio.tumblr.com/post/30048662088/a-simple-example-arduino-mqtt-m2mio
void callback(char* topic, byte* payload, unsigned int length) {
int i = 0;
if ( debug ) {
Serial.println("Message recu => topic: " + String(topic));
Serial.print(" | longueur: " + String(length,DEC));
}
// create character buffer with ending null terminator (string)
for(i=0; i<length; i++) {
message_buff[i] = payload[i];
}
message_buff[i] = '\0';
String msgString = String(message_buff);
if ( debug ) {
Serial.println("Payload: " + msgString);
}
if ( msgString == "ON" ) {
digitalWrite(D2,HIGH);
} else {
digitalWrite(D2,LOW);
}
}
Si vous découvre les modules ESP8266, lisez d’abord cet article pour apprendre comment le programmer et téléverser un programme à l’aide de l’IDE Arduino.
Intégrer l’objet connecté ESP8266 au serveur domotique Home Assistant
Ce qui est génial avec Home-Assistant c’est qu’il n’y a qu’un script à modifier pour pouvoir afficher la température et l’humidité publiée par l’ESP8266 sur Mosquitto. Allez dans le répertoire d’installation d’Home-Assistant.io
cd ~/.homeassistant
puis ouvrez le fichier de configuration
sudo nano configuration.yaml
On ajoute une section mqtt
mqtt:
broker: localhost #si le Broker est installé sur le même poste qu'Home-Assistant
port: 1883 #par défaut
client_id: home-assistant-1
keepalive: 60
username: USERNAME #optionnel
password: PASSWORD #optionnel
protocol: 3.1 #par défaut
Maintenant on ajoute un nouveau capteur (sensor) et on récupère la température sur le topic sensor/temperature. La valeur se trouve dans le payload
sensor:
platform: mqtt
state_topic: "sensor/temperature"
name: "Température"
qos: 0
unit_of_measurement: "°C"
#value_template: '{{ payload }}'
On fait de même pour l’humidité en ajoutant un sensor 2
sensor 2:
platform: mqtt
state_topic: "sensor/humidity"
name: "Humidité"
qos: 0
unit_of_measurement: "°C"
#value_template: '{{ payload }}'
Enregistrez la configuration (Ctrl + X puis O) et lancez le serveur avec la commande hass. Actualisez la page dans votre navigateur pour voir apparaître la mesure de température et d’humidité.
Bonus : piloter (allumer, éteindre) une Led ou un relais depuis Home-Assistant
Ajoutons maintenant un interrupteur qui va nous permettre d’allumer ou d’éteindre un Led. C’est un exemple général. On active simplement une sortie de l’Arduino. On pourrait très simplement remplacer la Led par un relai.
Arrêtez Home-Assistant et ouvrez de nouveau le fichier de configuration.yaml dans lequel on va ajouter un bloc switch
switch:
platform: mqtt
name: "Cuisine"
command_topic: "homeassistant/switch1" #Topic sur lequel on publie l'état de l'interrupteur
payload_on: "ON" # A vous de choisir le message envoyé lorsque l'interrupteur est allumé
payload_off: "OFF" # et éteint
optimistic: true # Mettez à true pour maintenir l'état
qos: 0
retain: true value_template: '{{ value.x }}'
Relancez Home-Assistant. Vous avez maintenant un nouveau widget nommé “Switch” dans lequel se trouve l’interrupteur de la cuisine. Appuyez sur l’éclair pour allumer la LED.
Si vous avez configuré votre box pour rendre accessible le serveur Home-Assistant depuis internet, vous pouvez même allumer et éteindre la led depuis votre smartphone.
J’espère que vous avez apprécié ce petit projet de découverte des modules ESP8266 intégrés à un serveur domotique.
Projets et tutoriels sur les objets connectés
Prêt à vous lancer dans d’autres projets, voici d’autres tutoriels qui devrait vous intéresser
- Stocker des données sur une carte micro SD. Code Arduino compatible ESP32, ESP8266
- Débuter Arduino. Recevoir des commandes depuis le port série (compatible ESP32 ESP8266)
- Fonctions C++ print•println•printf•sprintf pour Arduino ESP32 ESP8266. Combiner•formater → port série
- String C++. concat•c_srt•indexOf•replace•subString… pour Arduino ESP32 ESP8266
- ESP01. Débuter avec l’IDE Arduino ou PlatformIO. Quel module choisir ? Repérage des broches
- Comment attribuer une IP fixe à un projet ESP32 ESP8266 ou ESP01
Super, merci, je regarde l’état d’un télérupteur pour voir si la lampe est allumée
Avec plaisir jp
merci
Bonjour
Merci pour ce tuto, étant donné qu’ils il y plusieurs autres pin de disponibles.
Est-il possible de connecter d’autres capteurs ?
Si “Oui” pouvez-vous s’il vous plait indiquer les lignes des codes à ajouter
par exemple j’ai 3 Aquariums qui sont côte à côte, il y en a un j’ai un DHT Sensor DS18B20 (water proof) et je voudrais utiliser le même Wemos D1 mini pour connecter deux autres DS18B20
cdmt
Merci pour votre réponse très rapide
Du coup pour ajouter un autre objets j’ai juste à a jouter un objet et changer le pin D2 par D4 ou D4 par exemple ?
//Création des objets
DHT dht(DHTPIN, DHTTYPE);
DHT dht2(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
//Création des objets
void setup() {
Serial.begin(9600); //Facultatif pour le debug
pinMode(D2,OUTPUT); //Pin 2
setup_wifi(); //On se connecte au réseau wifi
client.setServer(mqtt_server, 1883); //Configuration de la connexion au serveur MQTT
client.setCallback(callback); //La fonction de callback qui est executée à chaque réception de message
dht.begin();
}
void setup() {
Serial.begin(9600); //Facultatif pour le debug
pinMode(D3,OUTPUT); //Pin 3
setup_wifi(); //On se connecte au réseau wifi
client.setServer(mqtt_server, 1883); //Configuration de la connexion au serveur MQTT
client.setCallback(callback); //La fonction de callback qui est executée à chaque réception de message
dht.begin();
}
Bonjour et merci beaucoup. Oui absolument. Tout va dépendre du type de bus de données utilisé par le capteur/actionneur. Les capteurs numériques I2C utilisent 2 broches (D1 et D2) mais ils sont connectés en réseau. On peut donc avoir jusqu’à 127 capteurs (de mémoire). Si c’est un signal analogique, on ne pourra connecter qu’un seul capteur car l’ESP8266 ne dispose que d’un seul convertisseur (à moins d’utiliser une carte additionnelle qui va ajouter des entrées supplémentaires). A très bientôt
Merci pour votre réponse très rapide
Du coup pour ajouter un autre objets j’ai juste à a jouter un objet et changer le pin D2 par D4 ou D4 par exemple ?
//Création des objets
DHT dht(DHTPIN, DHTTYPE);
DHT dht2(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
//Création des objets
void setup() {
Serial.begin(9600); //Facultatif pour le debug
pinMode(D2,OUTPUT); //Pin 2
setup_wifi(); //On se connecte au réseau wifi
client.setServer(mqtt_server, 1883); //Configuration de la connexion au serveur MQTT
client.setCallback(callback); //La fonction de callback qui est executée à chaque réception de message
dht.begin();
}
void setup() {
Serial.begin(9600); //Facultatif pour le debug
pinMode(D3,OUTPUT); //Pin 3
setup_wifi(); //On se connecte au réseau wifi
client.setServer(mqtt_server, 1883); //Configuration de la connexion au serveur MQTT
client.setCallback(callback); //La fonction de callback qui est executée à chaque réception de message
dht.begin();
}
Oui, c’est ça. Par contre il ne peut y avoir qu’une seule fonction setup. C’est la boucle d’initialisation. Pour créer un 2nd objet (au sens objet C/C++) on fera par exemple
int PINDHT1 D4;
int PINDHT2 D2;
DHT dht(PINDHT1,DHTTYPE);
DHT dht2(PINDHT2,DHTTYPE);
D’accord
Merci beaucoup
Avec plaisir
149 lines (126 sloc)
4.19 KB
/*
Projet d’apprentissage d’un objet connecté (IoT) pour réaliser une sonde de température
ESP8266 + DHT22 + LED + MQTT + Home-Assistant
Projets DIY (http://www.projetsdiy.fr) – Mai 2016
Article du projet : http://www.projetsdiy.fr/esp8266-dht22-mqtt-projet-objet-connecte/
Licence : MIT
*/
#include
#include
#include “DHT.h” // Librairie des capteurs DHT
#define wifi_ssid “SSID”
#define wifi_password “MOT-DE-PASSE”
#define mqtt_server “ADRESSE-IP-MOSQUITTO”
#define mqtt_user “guest” //s’il a été configuré sur Mosquitto
#define mqtt_password “guest” //idem
#define temperature_topic “sensor/temperature” //Topic température
#define humidity_topic “sensor/humidity” //Topic humidité
//Buffer qui permet de décoder les messages MQTT reçus
char message_buff[100];
long lastMsg = 0; //Horodatage du dernier message publié sur MQTT
long lastRecu = 0;
bool debug = false; //Affiche sur la console si True
#define DHTPIN D4 // Pin sur lequel est branché le DHT
// Dé-commentez la ligne qui correspond à votre capteur
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//Création des objets
int PINDHT1 D4;
int PINDHT2 D3;
DHT dht(PINDHT1,DHTTYPE);
DHT dht2(PINDHT2,DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(9600); //Facultatif pour le debug
pinMode(D2,OUTPUT); //Pin 2
setup_wifi(); //On se connecte au réseau wifi
client.setServer(mqtt_server, 1883); //Configuration de la connexion au serveur MQTT
client.setCallback(callback); //La fonction de callback qui est executée à chaque réception de message
dht.begin();
}
//Connexion au réseau WiFi
void setup_wifi() {
delay(10);
Serial.println();
Serial.print(“Connexion a “);
Serial.println(wifi_ssid);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“.”);
}
Serial.println(“”);
Serial.println(“Connexion WiFi etablie “);
Serial.print(“=> Addresse IP : “);
Serial.print(WiFi.localIP());
}
//Reconnexion
void reconnect() {
//Boucle jusqu’à obtenur une reconnexion
while (!client.connected()) {
Serial.print(“Connexion au serveur MQTT…”);
if (client.connect(“ESP8266Client”, mqtt_user, mqtt_password)) {
Serial.println(“OK”);
} else {
Serial.print(“KO, erreur : “);
Serial.print(client.state());
Serial.println(” On attend 5 secondes avant de recommencer”);
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
//Envoi d’un message par minute
if (now – lastMsg > 1000 * 10) {
lastMsg = now;
//Lecture de l’humidité ambiante
float h = dht.readHumidity();
// Lecture de la température en Celcius
float t = dht.readTemperature();
//Inutile d’aller plus loin si le capteur ne renvoi rien
/*
if ( isnan(t) || isnan(h)) {
Serial.println(“Echec de lecture ! Verifiez votre capteur DHT”);
return;
}
*/
if ( debug ) {
Serial.print(“Temperature : “);
Serial.print(t);
Serial.print(” | Humidite : “);
Serial.println(h);
}
client.publish(temperature_topic, String(t).c_str(), true); //Publie la température sur le topic temperature_topic
client.publish(humidity_topic, String(h).c_str(), true); //Et l’humidité
}
if (now – lastRecu > 100 ) {
lastRecu = now;
client.subscribe(“homeassistant/switch1”);
}
}
// Déclenche les actions à la réception d’un message
// D’après http://m2mio.tumblr.com/post/30048662088/a-simple-example-arduino-mqtt-m2mio
void callback(char* topic, byte* payload, unsigned int length) {
int i = 0;
if ( debug ) {
Serial.println(“Message recu => topic: ” + String(topic));
Serial.print(” | longueur: ” + String(length,DEC));
}
// create character buffer with ending null terminator (string)
for(i=0; i<length; i++) {
message_buff[i] = payload[i];
}
message_buff[i] = '';
String msgString = String(message_buff);
if ( debug ) {
Serial.println("Payload: " + msgString);
}
if ( msgString == "ON" ) {
digitalWrite(D2,HIGH);
} else {
digitalWrite(D2,LOW);
}
}
Re bonjour je reviens vous embêter à nouveau depuis la derniere fois j’ai tenté d’additionner d’autres Capteurs sur des pin libres mais au moment de charger le code sur la carte j’ai erreur rouge je voudrais rajouter un DHT11 SR pin3 et DS18B20 sur pin 5 mais null comme je suis je n’y arrive pas pouvez-vous ou quelqu’un d’autre m’aider s’il vous plait? il y a beaucoup d’autres pin de disponible je trouve domage de ne pas pouvoir les utiliser.
Merci d’avance
Bonsoir Babyface. Serait-il possible de m’envoyer le message d’erreur pour que je puisse chercher une piste ?
Bonsoir
Désolé unpeu du retatrd j’ai essayé de trouver la solution par moi même mais je n’ai pas reussi.
J’obtien cette erreur :
exit status 1
expected initializer before ‘D4’
Bonsoir Babyface. Si ça peut vous aider, je viens de publier ce tutoriel pour gérer plusieurs capteurs DS18B20 avec du code Arduino et publier les mesures sur un serveur Domoticz https://projetsdiy.fr/mesure-temperature-dallas-ds18b20-code-arduino-compatible-esp8266-esp32-domoticz-http/
Merci beaucoup c’rst Très gentil
Il manque probablement le point virgule à la ligne précédente
exit status 1
‘DS18B20’ was not declared in this scope
Bonsoir Babyface. D’après cette erreur, l’objet DS18B20 n’a pas été initialisé (instancié) avant d’être utilisé. Un bon exemple à suivre http://forum.arduino.cc/index.php?topic=176697.0
#include
#include
// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
=> donc cela va donner avec l’objet DS18B20 : DallasTemperature DS18B20(&oneWire);
Voilà, amusez vous bien !
Merci
Beaucoup, mais j’ai laissé tombé, je suis novice dans le domaine.
D’accord, je vais ajouter le thème pour un prochain projet si ça peut vous aider. Bon week-end
Ouiii!!
Ca m’aiderai beaucoup,
J’ai des aquariums super posé, j’ai voulue utiliser ce projet pour mettre plusieur DS18B20 sur seul carte ESP8622 wemos mais mes competances sont limitées 🙂
D’accord alors, je vais m’y coller !
Merci beaucoup
Bonjour,
n’est-il pas necessaire de mettre une résistance de pull-up sur la sonde ?
a+
Bonjour Alasta. C’est vrai qu’elle est toujours présente sur les anciens tutos et en principe il en faut une mais ça fonctionne très bien sans.
Bonjour, ai-je nécessairement besoin d’un Raspeberry pour réaliser ce projet ou pas ?
Bonjour Ferhat. Non ce n’est pas nécessaire. Vous pouvez installer un broker MQTT sur windows (si vous êtes sur Windows). MQTT est un protocole très répandu , c’est même un standard depuis l’année dernière, vous pourrez récupérer les données sur beaucoup de logiciels. A très bientôt
Bonjour!
J’ai quelques petites questions concernant le code de l’ESP8266
1- A quoi sert le petit bout de code:
if (now – lastRecu > 100 ) {
lastRecu = now;
client.subscribe(“homeassistant/switch1”);
Si j’ai bien compris, on re-souscrit au topic homeassistant/switch1 toutes les 100ms ?
Pourquoi pas le faire à l’initi et dans reconnect (juste une fois) ? (je decouvre, peut etre que j’ai mal compris comment ca fonctionne)
2- Le code:
//Envoi d’un message par minute
if (now – lastMsg > 1000 * 10) {
Pour moi ca fait toutes les 10secondes et non une fois par minutes, me trompe-je ?
3- si j’ai bien compris la fonction millis() repart à zero au bout d’un moment ( https://www.arduino.cc/en/reference/millis ), au bout de 50jours environs…
Pour faire un exercice par de soucis, mais si on veut faire un capteur type station météo, il faudrait gerer le moment du retour à 0 non ?
Pourquoi utiliser millis() plutot qu’un simple delay(x)
Super tutoriel par contre! je découvre l’ESP8266 et mqtt, c’est génial d’avoir fait un petit exemple avec la chaîne complète.
Bonjour Frédéric,
1. Oui, c’est ça effectivement. On vérifie toutes les 100ms si un nouveau message a été envoyé par home assistant. Je vais faire un article sur le sujet, ce sera plus claire
2. Oui, c’est exact, j’ai mis un temps plus court pour mes tests et ensuite j’ai oublié de modifier mon code . Merci !
3. millis() donne le temps écoulé depuis le démarrage de l’Arduino / ESP8266. C’est n’est pas bloquant. On va simplement stocker le dernier passage dans la boucle lastRecu = now pour le tester au tour suivant. Par contre lorsqu’on appel un delay, le reste du programme est bloqué
Merci beaucoup et à très bientôt. J’ai mis en place une newsletter par email. L’envoi se fera tous les vendredis.
Bonjour, je n’ai pas encore acheté le Raspberry Pi 3 mais j’ai tout de même essayé d’installer homeassistant, ce que je remarque par rapport aux vidéos tuto c’est que je n’ai pas forcément les mêmes options et notamment “straming update” est-ce normal? sinon comment installer homeassistant concrètement, étape par étape
Bonjour Ferhat. Home Assistant est un projet qui bouge beaucoup et rapidement. Pas facile pour moi de connaitre tous les paramètres de tous les logiciels domotiques. Pour installer sur Raspberry, il y a ce tutoriel http://www.projetsdiy.fr/home-assistant-serveur-domotique-raspberry-pi/, sinon on peut aussi tester sur Windows, Linux, macOS, NAS avec Docker (http://www.projetsdiy.fr/tester-logiciels-domotique-docker-jeedom-openhab-domoticz-ha/). A très bientôt.
Je veux savoir si le Raspberry Pi3 est primordial pour réaliser ce projet, configurer et gérer HomeAssistant
Le 20 janv. 2017 4:52 AM, “Disqus” a écrit :
Vous pouvez m’en dire un peu plus sur votre projet ?
Je cherche à refaire le projet ESP8266+DHT22+MQTT, mais lorsque je telecharge et essaie d’utiliser homeassistant, je remarque que je n’ai pas le même que dans les tutoriels, je n’ai pas notamment l’option “streaming update”, je ne peux pas rajouter aussi la partie Sensor au fichier configuration.ymal, serait-ce parce que je n’ai pas utiliser de raspberry ?
Sent from my Galaxy Tab® A——– Message d’origine ——–De : Disqus Date : 20/01/2017 23:24 (GMT-05:00) À : mameche.ferhat@gmail.com Objet : Re: Comment on ESP8266 + DHT22 + MQTT : réaliser votre 1er objet connecté
“Vous pouvez m’en dire un peu plus sur votre projet ?”
Settings
A new comment was posted on projetsdiy
Projets DIY
Vous pouvez m’en dire un peu plus sur votre projet ?
11:24 p.m., Friday Jan. 20
|
Other comments by Projets DIY
Reply
to Projets DIY
Projets DIY’s comment is in reply to
Ferhat MAMECHE:
Je veux savoir si le Raspberry Pi3 est primordial pour réaliser ce projet, configurer et gérer HomeAssistantLe 20 janv. 2017 4:52 AM, “Disqus … Read more
You’re receiving this message because you’re signed up to receive notifications about replies to ferhatmameche.
You can unsubscribe
from emails about replies to ferhatmameche
by replying to this email with “unsubscribe”
or reduce the rate with which these emails are sent by
adjusting your notification settings.
Bonjour Ferhat, si vous débutez en domotique, je vous conseille plutot de démarrer avec Domoticz sur Raspberry Pi http://www.projetsdiy.fr/domoticz-installation-configuration-raspberry-pi-3/ ou jeedom http://www.projetsdiy.fr/jeedom-raspberry-pi-3-installation-wifi/ (en français)
je voulais savoir, dans le cas de l’utilisastion d’un Raspeberry, aurai-je besoin d’un module WiFi ESP8266 ou pas? parce que je suis novice dans le domaine et je ne sais pas à quoi sert exactement le Raspeberry
2017-01-23 13:43 GMT-05:00 Disqus :
Bonjour Ferhat. Pas facile de tout expliquer dans un commentaire mais voici pour commencer quelques infos :
– Raspberry = (mini) ordinateur qui fonctionne sous Linux (une version spéciale pour les microprocesseurs ARM, différent d’Intel). On installe un logiciel domotique dessus (Domoticz, Jeedom…)
– ESP8266 : arduino avec du Wifi. Si vous voulez fabriquer vos propres modules domotiques
Pour faire de la domotique, vous pouvez achetez des modules (détecteurs d’ouverture de porte, de fumée, météo, interrupteur…) qui vont communiquer avec le logiciel domotique. Il y a beaucoup de façon de communiquer. ZWave (ondes radio made in samsung), Ethernet (pas très utilisé), RFLink (ondes radio), WiFi…. la liste est longue comme le bras.
Bref, vous êtes au bon endroit pour débuter (sur mon blog) il y a déjà pas mal de choses, prenez le temps de (tout) lire et faire des essais. Bon courage.
Mais est-ce que ce projet est réalisable avec ce que vous me suggérer, et dois je toujours utiliser MTQQ
Le 23 janv. 2017 1:47 PM, “Disqus” a écrit :
Oui sans aucun problème, il y a tous les tutos necessaires sur mon blog ?
Vous pouvez m’envoyer le lien du blog et ainsi pouvoir entamer cela ? Merci d’avance
Le 23 janv. 2017 3:34 PM, “Disqus” a écrit :
Bonjour 🙂
Super tuto !! comme dis par email les tutos sont géniaux !
Bon, je me heurte à un petit problème :s. J’ai repris la même base de votre projet et adapté un capteur DS18B20. Je récupère la température, je la convertis pour en faire une chaine et ensuite je publie sur test.mosquitto.fr. SAUF que très souvent les messages ne sont pas publiés. On regarde d’un peu plus près la doc de l’API (http://pubsubclient.knolleary.net/api.html#publish1) et la le message est soit trop long soit la connection est perdu. Pourtant il y a bien une vérif qui est faite en amont pour la connection wifi ET mqtt.
Voici mon code:
#include
#include
#include
#define wifi_ssid “NUMERICABLE-A9BE”
#define wifi_password “**********”
#define mqtt_server “test.mosquitto.org”
long lastMsg = 0;
float DS18B20_temperature;
WiFiClient espClient;
PubSubClient client(espClient);
OneWire ds(2);
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
}
/* ————— loop ———————————– */
void loop() {
long now = millis();
if (now – lastMsg > 1000 * 10) {
lastMsg = now;
if (WiFi.status() != WL_CONNECTED) {setup_wifi();}
if (!client.connected()) {reconnect();}
client.loop();
char message_temperature[10] = “”;
DS18B20_temperature = getTemperatureDS18b20();
dtostrf(DS18B20_temperature, 3, 2, message_temperature);
if (client.publish(“victor”, message_temperature, true)){
Serial.println(“message publie”);
} else {
Serial.println(“Message non publie”);
}
Serial.println(message_temperature);
}
}
/* ————— Connexion au réseau WIFI ———————————– */
void setup_wifi() {
delay(10);
Serial.println();
Serial.print(“Connection a “);
Serial.print(wifi_ssid);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(” .”);
}
Serial.println(“”);
Serial.println(“WiFi connecte, “);
Serial.print(“adresse IP : “);
Serial.println(WiFi.localIP());
}
/* ————— Connexion au serveur MQTT ———————————– */
void reconnect() {
while (!client.connected()) {
Serial.print(“Connexion au serveur MQTT…”);
if (client.connect(“ESP8266Client”)) {
Serial.println(“OK”);
} else {
Serial.println(“KO, erreur : “);
Serial.print(client.state());
if (client.state() == -2) {
if (WiFi.status() != WL_CONNECTED) {setup_wifi();}
}
Serial.println(“On attend 5 secondes avant de recommencer”);
delay(5000);
}
}
}
/* ————— Acquisition de la température ———————————– */
float getTemperatureDS18b20() {
byte i;
byte data[12];
byte addr[8];
float temp = 0.0;
ds.search(addr);
// Cette fonction sert à surveiller si la transmission s’est bien passée
if (OneWire::crc8( addr, 7) != addr[7]) {
Serial.println(“CRC is not valid!”);
return false;
}
// Demander au capteur de mesure et mémoriser la température
ds.reset();
ds.select(addr);
ds.write(0x44);
delay(800);
// Demander au capteur de nous envoyer la température mémorisé
ds.reset();
ds.select(addr);
ds.write(0xBE);
// Le MOT reçu du capteur fait 9 octets, on les charge donc un par un dans le tableau data[]
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
// Puis on converti la température (*0.0625 car la température est stockée sur 12 bits)
temp = ( (data[1] << 8) + data[0] ) * 0.0625;
// Réinitialisation de la recherche (évite erreur CRC !!)
ds.reset_search();
return temp;
}
et voici le moniteur série (extrait):
Connexion au serveur MQTT…OK
Message non publie
27.19
Connexion au serveur MQTT…OK
Connexion au serveur MQTT…OK
Message non publie
27.19
Connexion au serveur MQTT…OK
Message publie <=== HAA il s'envoie enfin :p
27.19
Connexion au serveur MQTT…OK
Message non publie
27.13
Connexion au serveur MQTT…OK
Message non publie
27.19
Connexion au serveur MQTT…OK
Message non publie
27.19
bref, j'espère ne pas avoir été trop bourrin en mettant tout cela ici, et si vous avez une petit idée je suis preneur 🙂
Merci d'avance =))
A très vite
Edit 23/08/2016, 18h09:
Il faut laisser client.loop() en dehors du if qui s'effectue toutes les dix secondes 😉
Bonjour visvic. Tout d’abord merci beaucoup pour votre message. Avez-vous essayé d’installer un serveur (+ client) mosquitto sur un ordi local. J’imagine que le serveur qui fait tourner test.mosquitto.org doit être très sollicité et qu’il n’y a aucune garantie sur son bon fonctionnement (du moins en permanence). Ca vaudrait le coup d’essayer en local avant de remettre en cause le programme. Tenez moi au courant. A très bientôt.