J’ai des “soucis” avec le mqtt, mais ça je vais voir avec @AlexTrovato
Je suis au ski aussi
La belle vie , mais t’inquiète le soucis venait de moi. Tout est ok
Faut que je fasse une PR pour ajouter des constantes.
Côté ESP12E le code est prêt, je dois mettre tout ça sur batterie mais c’est fonctionnel.
Côté Gladys la PR est pas encore merge.
Salut vonox.
As tu déjà testé l’autonomie une fois sur batterie ?
J’ai pas le matos encore --’
Je vais prendre un shield pour des 18650
ça sort du 3v et 5v.
Pour l’autonomie du coup j’ai pas de rex pour le moment mais en faisant une mesure toutes les 30 minutes et le reste du temps l’ESP12 est en deep sleep ça devrait tenir un moment ( 1 mois j’espère )
Salut @VonOx
J’essaye de me remettre sur mon projet et j’avance doucement car je reste débutant en informatique mais ça me passionne.
J’essaye de faire un code avec mon ESP8266 mais ça reste un peu flou. est ce que tu pourrais m’aider ?
pour récupérer les données il faut passer par mqtt ?
Le format du message doit-il être en JSON ?
Salut, après plusieurs essais j’ai fini par utiliser un arduino pro mini 3V3 alimenté par 3 piles aaa , ça tient environ 6mois avec transmissions 433mhz vers le raspberry qui converti en mqtt et requête http pour galdys ou site web perso.
Pour économiser la batterie, il faut utiliser le deep sleep et dans le cas des ultrasons, il doit falloir l alimenter via une sortie arduino pour qu’il ne consomme que lorsqu’il mesure.
Salut @ceist
est ce que tu pourrais partager ton code eventuellement ou m’aider sur la partie mqtt ?
Pour la réception 433, j’ai un arduino nano branché sur un raspberry pi 1, il envoi les données reçues via le port série sous forme de messages binaires de 24, 26 ou 56bits suivant le type de données (protocole spécifique à mon application).
du côté du raspberry, j’ai un petit script python lancé via crontab qui s’occupe de traiter les données et de transmettre à mqtt.
le code python :
broker = "192.168.X.XX" : l'adresse du broker gladys
port = "1883" : le port du broker
auth = {"username": "usr","password": "pass"} les paramètres de connexion au broker (voir le tuto gladys à propos de mqtt)
########################### librairies
import time
from time import gmtime, strftime
import datetime
import serial
import paho.mqtt.client as mqtt
import paho.mqtt.publish as publish
###########################
ser = serial.Serial('/dev/ttyUSB0', 9600) définition du port série
def message_management(m):
try:
# print(len(m))
if len(m)==(24+2):
try:
publish.single("gladys/master/device/mqtt:binaire:mouvement_"+str(int(m[0:24],2))+"/feature/mqtt:binaire:"+str(int(m[0:24],2))+"/state", 1, hostname=broker, port=port, auth=auth)
except:
print (time.strftime("%Y-%m-%d" " " "%X.", gmtime())+"error 100: mqtt error./n")
pass
except:
pass
while (True):
try:
message=""
if (ser.inWaiting() > 0):
try:
message = ser.readline()
except:
pass
except serial.SerialException:
message=""
print(time.strftime("%Y-%m-%d" " " "%X.", gmtime())+" error O1: serial communication error./n")
pass
try:
if(message!=""):
message_management(message)
except:
print (time.strftime("%Y-%m-%d" " " "%X.", gmtime())+"error 02: encoding or message management error./n")
pass
exit
Le code complet est un peu plus complexe pour la conversion des données température ou pression mais si tu as la trame de tes messages publiés sur le port série, je pourrais t’aider.
Pour info, mon montage utilise un bme280 pour température/humidité/pression, un détecteur de choc, une varistance pour la luminosité, la tension est fournie directement par l’arduino pro mini.
Sur 3 piles AAA, je tiens entre 7 et 8 mois, ci-dessous, la courbe de décharge :
Le montage sur plaque de test que j’utilise depuis 3 ans maintenant :
Le montage sur pcb mais comme je ne sais pas souder (je chauffe trop les pistes visiblement) cela ne fonctionne pas (un lego pour l’échelle).
@+
Merci pour ton post mais j’avoue je suis toujours perdu. Je post mon code ça sera peut etre plus simple.
Je m’excuse déjà pour les éventuelles erreurs mais je suis débutant et pas informaticien ou programmeur.
J’aime et me passionne simplement pour la domotique.
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
//MQTT
#define mqtt_server "192.168.X.X" // server name or IP
#define mqtt_user "gladys" // username
#define mqtt_password "XXXXXXXXXXXX" // password
#define gladys_topic "gladys/master/device/mqtt:jardin:capteur-cuve/feature/mqtt:jardin:capteur-cuve:capacite/state" /
#define mqtt_cuve "mqtt:jardin:capteur-cuve" //Topic capteur cuve
#define JsonbufferSize 100
//WIFI
const char* ssid = "stormbox";
const char* password = "XXXXXXXXXX";
/* Constantes pour les broches */
const byte TRIGGER_PIN = 2; // Broche TRIGGER
const byte ECHO_PIN = 3; // Broche ECHO
const byte VW_SET_TX_PIN = 12;
/* Constantes pour le timeout */
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s
/* Vitesse du son dans l'air en mm/us */
const float SOUND_SPEED = 340.0 / 1000;
WiFiClient espClient;
ESP8266WiFiMulti WiFiMulti;
PubSubClient client(espClient);
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT broker ...");
if (client.connect("Cuve", mqtt_user, mqtt_password)) {
Serial.println("OK");
} else {
Serial.print("[Error] Not connected: ");
Serial.print(client.state());
Serial.println("Wait 5 seconds before retry.");
delay(5000);
}
}
}
void setup_wifi(){
//connexion au wifi
WiFiMulti.addAP(ssid, password);
while ( WiFiMulti.run() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
Serial.println("");
Serial.println("WiFi connecté");
Serial.print("MAC : ");
Serial.println(WiFi.macAddress());
Serial.print("Adresse IP : ");
Serial.println(WiFi.localIP());
}
void setup() {
// Initialise le port série //
Serial.begin (115200);
Serial.println("\n");
setup_wifi(); //Connect to Wifi network
client.setServer(mqtt_server, 1883); // Configure MQTT connection, change port if needed.
if (!client.connected()) {
reconnect();
// Initialise les broches //
pinMode(TRIGGER_PIN, OUTPUT);
digitalWrite(TRIGGER_PIN, LOW); // La broche TRIGGER doit être à LOW au repos
pinMode(ECHO_PIN, INPUT);
}
}
void loop() {
/* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER */
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
/* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);
/* 3. Calcul la distance à partir du temps mesuré */
int distance_mm = measure / 2.0 * SOUND_SPEED;
float cuve = 2000 - distance_mm;
cuve = cuve / 2000;
cuve = cuve * 100;
/* Affiche les résultats en mm */
#ifdef HRC04
Serial.print(distance_mm, cuve);
Serial.println();
/* Envoyer les données au broker mqtt */
#endif
// Publish values to MQTT topics
// Gladys attend un fichier JSON
// Pourcentage_eau
//Edition des objets JSON + publication
StaticJsonDocument<300> JSONbuffer;
JSONbuffer["capteur"] = "hrc04";
JSONbuffer["cuve"] = "cuve";
char buffer[JsonbufferSize];
serializeJson(JSONbuffer, buffer);
Serial.print("Data serialised: ");
Serial.println(buffer);
JSONbuffer["cuve"] = cuve;
serializeJson(JSONbuffer, buffer);
Serial.print("Data udpated: ");
Serial.println(buffer);
// Déconnexion du broker MQTT
client.disconnect();
// Déconnexion du réseau wifi
WiFi.disconnect();
/* Délai d'attente pour éviter d'afficher trop de résultats à la seconde */
delay(60000);
}
Salut,
je pense que cette partie doit être au début de la boucle (loop) et non dans l’initialisation (setup):
if (!client.connected()) {
reconnect();
pour le mqtt je pense que le json n’est pas bon, il faut utiliser la fonction publish (voir https://projetsdiy.fr/esp8266-dht22-mqtt-projet-objet-connecte/). Gladys v4 en tout cas, utilise directement le publish mqtt, testé chez moi.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
/* WIFI */
#define wifi_ssid "XXXXXXXX"
#define wifi_password "XXXXXXXXXXXX"
/* MQTT */
#define mqtt_server "192.168.X.X"
#define mqtt_user "gladys" // username
#define mqtt_password "XXXXXXXXXXXX" // password
#define gladys_topic "gladys/master/device/mqtt:jardin:capteur-cuve/feature/mqtt:jardin:capteur-cuve:capacite/state" /
#define mqtt_cuve "mqtt:jardin:capteur-cuve" //Topic capteur cuve
/* 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
/* Constantes pour les broches */
const byte TRIGGER_PIN = 2; // Broche TRIGGER
const byte ECHO_PIN = 3; // Broche ECHO
const byte VW_SET_TX_PIN = 12;
/* Constantes pour le timeout */
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s
/* Vitesse du son dans l'air en mm/us */
const float SOUND_SPEED = 340.0 / 1000;
//Création des objets
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
/* Initialise le port serie */
Serial.begin(9600); //Facultatif pour le debug
/* Initialise les broches */
pinMode(TRIGGER_PIN, OUTPUT);
digitalWrite(TRIGGER_PIN, LOW); // La broche TRIGGER doit être à LOW au repos
pinMode(ECHO_PIN, INPUT);
setup_wifi(); //On se connecte au réseau wifi
client.setServer(mqtt_server, 1883); //Configuration de la connexion au serveur MQTT
}
//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;
/* 1. Lance une mesure de distance en envoyant une impulsion HIGH de 10µs sur la broche TRIGGER */
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
/* 2. Mesure le temps entre l'envoi de l'impulsion ultrasonique et son écho (si il existe) */
long measure = pulseIn(ECHO_PIN, HIGH, MEASURE_TIMEOUT);
/* 3. Calcul la distance à partir du temps mesuré */
int distance_mm = measure / 2.0 * SOUND_SPEED;
float c = 2000 - distance_mm;
c = c / 2000;
c = c * 100;
//Inutile d'aller plus loin si le capteur ne renvoi rien
if ( isnan(c)) {
Serial.println("Echec de lecture ! Verifiez votre capteur HRC-04");
return;
}
if ( debug ) {
Serial.print("Cuve : ");
Serial.print(c);
}
client.publish(gladys_topic, String(c).c_str(), true); //Publie la température sur le topic temperature_topic
}
if (now - lastRecu > 100 ) {
lastRecu = now;
client.subscribe("homeassistant/switch1");
}
}
Voici le message d’erreur que j’ai :
error: expected primary-expression before ‘,’ token
client.publish(gladys_topic, String(c).c_str(), true); //Publie la température sur le topic temperature_topic
^
exit status 1
expected primary-expression before ‘,’ token
Le / à la fin de la ligne #define gladys_topic
?
Cool merci @Reno ça compile.