Créer une jauge sur dashboard pour cuve eaux de pluies?

J’ai des “soucis” avec le mqtt, mais ça je vais voir avec @AlexTrovato :grin:

Je suis au ski aussi :slight_smile:

La belle vie :smile: , mais t’inquiète le soucis venait de moi. Tout est ok

Capture d'écran du 2020-02-05 18.52.34

Faut que je fasse une PR pour ajouter des constantes.

3 Likes

Salut @VonOx

Alors tu en es où ? c’est opérationnel ou pas ?

Je suis preneur d’infos sinon.

A+

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.