[Conseil] :Gestion panneaux solaires piscine Arduino Wifi Mqtt

Bonjour,
j'ai déjà réalisé la partie prog pure, le programme tourne en ce moment sur un arduino uno.
Ce qui m'intéresse réellement c'est la partie WIFI et MQTT car là je nage dans la choucroute.

Introduction :
Je vais commencer par expliquer ce que j'ai fait et ce que je veux.
Je me suis mis à installer Domoticz et à tout domotiser dans la maison à base de 8266, et aussi un peu la gateway xiaomi. J'ai testé un peu le RfLink mais je n'ai pas été satisfait des performances, certainement à cause de mes mauvaises antennes mais ça c'est un autre sujet.

Le petit montage que je me suis fait utilise 2 sondes 18db20, une plongée dans la piscine, une gainée de noir en plein soleil juste à coté de mes panneaux solaires. toutes les X secondes, si la T° Panneaux > (T° piscine +2) j'utilise Rcswitch pour piloter une prise 433mhz acheté dans le commerce.
Ce que je voudrais c'est renvoyer les 2 sondes de température dans domoticz et aussi l'activation, désactivation de la prise via un switch virtuel.

si ça intéresse quelqu'un c'est ce qui fonctionne déjà :

#include <RCSwitch.h>

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress T_piscine, T_soleil;
int Temps=0;

 
RCSwitch mySwitch = RCSwitch();
//Pour memoire Touche 3 de la télécommande de l'aquarium... 
unsigned long MoteurPiscine_OFF = 7191916;
unsigned long MoteurPiscine_ON  = 7191917;
void setup() 
{
   Serial.begin(9600);
  sensors.begin();
  sensors.getDeviceCount();
  sensors.isParasitePowerMode();
  sensors.getAddress(T_soleil, 0);
  sensors.getAddress(T_piscine, 1);
  sensors.setResolution(T_piscine, TEMPERATURE_PRECISION);
  sensors.setResolution(T_soleil, TEMPERATURE_PRECISION);



  // Emetteur connecté au pin #10 de l'Arduino  
  mySwitch.enableTransmit(10);
  Serial.println("init ");
  Active();
  delay(2000);  
  Active();
  delay(2000);  
  Active();
  delay(2000);  
  Desactive();
}

void Active()
{
  Serial.println("allume ");
  mySwitch.send(MoteurPiscine_ON, 24);
  delay(100);  
  mySwitch.send(MoteurPiscine_ON, 24);
  delay(100);  
  mySwitch.send(MoteurPiscine_ON, 24);
  delay(100);  
  mySwitch.send(MoteurPiscine_ON, 24);
  delay(100);  
  mySwitch.send(MoteurPiscine_ON, 24);
}

void Desactive()
{
  Serial.println("eteint ");
  mySwitch.send(MoteurPiscine_OFF, 24);
  delay(50);  
  mySwitch.send(MoteurPiscine_OFF, 24);
  delay(50);  
  mySwitch.send(MoteurPiscine_OFF, 24);
  delay(50);  
  mySwitch.send(MoteurPiscine_OFF, 24);
  delay(50);  
  mySwitch.send(MoteurPiscine_OFF, 24);
}

void loop()
{
  delay(30000);
  sensors.requestTemperatures();
  float piscine = sensors.getTempC(T_piscine);
  float soleil = sensors.getTempC(T_soleil);
  Serial.print("T_piscine : ");
  Serial.print(piscine);
  Serial.print("   T_soleil : ");
  Serial.print(soleil);
  if ( piscine < 32 )
  {
    if (soleil > (piscine + 2)) 
      {
        Active();
        Temps++;
        Serial.print("   Temps : ");
  Serial.print(Temps);

      }
    else
      {
        Desactive();
      }
  }
  else
    {
      Desactive();
    }

Niveau matos à ma disposition :
Mon montage existant avec un arduino uno, deux sondes 18db20, un éméteur 433mhz.
Pour ce qui m'intéresse, j'ai des esp01 et des modules adaptateur pour esp01, sur ces modules j'ai quatre pin : Rx,Tx,Vcc,Gnd donc je pense qu'ils sont utilisables qu'en série, ce qui est sensé m'être utile.
J'ai aussi un ftdi pour les flasher.

Ce que j'ai besoin :
J'avais déjà essayé de flasher espeasy sur mes esp01 donc il me faudrait le prog de base à injecter dans l'esp01.
Puis j'aimerai déjà savoir sur quelle bibliothèque me lancer car j'en ai essayé plusieurs sans réel succès. Ce qui m'aiderai aussi c'est la partie câblage et comment tester si ça fonctionne. Bref si quelqu'un a un super tuto qui n'est pas obsolète.

PS: pour info j'ai déjà fait pas mal de recherches et testes hier.

Merci d'avance pour vos futures réponses et à bientôt.

Bonjour, espeasy est bien pour envoyer a domoticz en mqtt, le flasher est fourni avec chaque release, mais l esp01 est obsolète ca marche mais je te conseille de les remplacer par du genre wemos d1 mini ou autre bcp plus facile a cabler et flasher

Ce que je voudrais c'est renvoyer les 2 sondes de température dans domoticz et aussi l'activation, désactivation de la prise via un switch virtuel.

Ce que je comprends :
Domoticz reçoit périodiquement les températures et l'état de la prise 433MHz (On / Off).

Il me semblerait plus naturel de s'orienter sur la librairie MySensors pour réaliser ce dispositif.
Cela implique d'utiliser deux NRF24L01 plutôt que des ESP01 :

  • une passerelle MySensors (ARDUINO NANO + NRF24L01)
  • l'ARDUINO UNO actuelle + NRF24L01

Le NRF24L01 fonctionne en SPI. Vérifier la disponibilité des pins 11 12 13 sur la UNO pour connecter le module. Deux autres pins au choix sont nécessaires : 9 et 10 par défaut, mais j'utilise couramment 7 et 8.

Ensuite la librairie MySensors permettra de créer trois nœuds :

  • température piscine
  • température panneaux
  • commande prise

L'utilisation de deux NRF24L01 aurait de multiples avantages :
Un seul programme est nécessaire dans la UNO. Pas d'ESP01 à programmer.

La librairie MySensors gère nativement toutes sortes de capteurs et actionneurs. Le protocole de gestion de capteurs de température n'est pas à réinventer, comme ce serait le cas s'il fallait remonter les températures avec des ESP01. Tout existe déjà : Temperature Sensor | MySensors - Create your own Connected Home Experience

La commande d'une prise existe également : Relay | MySensors - Create your own Connected Home Experience

Une autre solution consisterait à laisser Domoticz prendre l'initiative de commander la prise 433MHz.
Il suffit pour cela de développer un petit script Python / JSON sur le serveur.
Cela offre l'avantage de laisser la prise de décision là où se trouve l'intelligence.
La UNO devient dans ce cas un capteur / actionneur non intelligent.

J'ai testé un peu le RfLink mais je n'ai pas été satisfait des performances, certainement à cause de mes mauvaises antennes mais ça c'est un autre sujet.

Je suppose que tu veux parler des antennes des prises 433MHz ?
S'agit-il d'un vrai RFLink utilisant le transceiver 433MHz Aurel ou d'une solution à base de modules chinois ?
Comme des essais avec RFLink ont déjà été faits sans succès, il est possible de laisser l'émetteur 433MHz
sur la UNO.
Reste à voir si la combinaison des librairies RCSwitch + MySensors tiendra en mémoire, mais j'aurais tendance à dire que OUI.

Re,
Merci pour ces réponses.

CelticLord:
espeasy est bien pour envoyer a domoticz en mqtt...les remplacer par du genre wemos d1 mini ...

Je me suis rendu compte en faisant la surveillance de mon aquarium avec espeasy que c'était pas top niveau tempo. J'utilise une sonde de température 18db20 + pilotage d'un relais pour envoyer de l'engrais via une pompe péristaltique. Donc je veux rester sur une base d'arduino.

hbachetti:
...Il me semblerait plus naturel de s'orienter sur la librairie MySensors pour réaliser ce dispositif...
...Je suppose que tu veux parler des antennes des prises 433MHz...

Pour le Rflink j'étais parti sur un récepteur superhétérodyne, un émetteur chinois et une antenne déportée avec un câble coaxial, donc je pense que ce devait être du moyen de gamme. Mais ma maison étant aussi appelé cage de faraday par certains de mes amis a eu raison du rflink. En effet, dès que je passe le portail, je n'ai plus de data sur mon tel et il est neuf. Donc je me suis acheté quelques répéteurs Xiaomi WIFI et j'ai réussi à avoir du WIFI jusqu'au bout de mon jardin.

Voilà pourquoi j'aimerai rester sur du WIFI mais en passant par une carte arduino.

A bientôt...

Donc je me suis acheté quelques répéteurs Xiaomi WIFI et j'ai réussi à avoir du WIFI jusqu'au bout de mon jardin.

Effectivement, le NRF24L01 ne fera pas mieux. Il faudra aussi des répéteurs.

Personnellement je préfère les solutions avec ESP8266 seul, ou ESP32, mais si tu veux absolument rester dans une configuration ARDUINO + ESP01, il te faut un firmware "commande AT".

Tu peux visiter éventuellement ce tuto de J-M-L : Les Bases d'un Serveur Web sur ESP-01 en commande AT - Tutoriels et cours - Arduino Forum

Oups ... je vois que tu veux absolument envoyer par MQTT. Je ne pense pas qu'un firmware AT convienne, à moins que je me trompe :confused:

Comme le suggère CelticLord : ESPEASY

Mais dans ce cas, que devient la solution à base d'ARDUINO + ESP01 ?

Dans le premier cas, le firmware AT permettra à l'ARDUINO de piloter l'ESP01, mais sauf erreur de ma part on oublie MQTT.

Dans le deuxième cas, le firmware ESPEASY permettra à l'ESP01 d'envoyer en MQTT, et apparemment cela ne marche que dans un sens avec DOMOTICZ, mais dans ce cas on oublie l'ARDUINO.

Un spécialiste MQTT peut-il confirmer ou non ?

Bonsoir oublie l idee arduino + esp01 c est obsolete et usine a gaz, un esp genre wemos nodemcu ou autre est bien plus fiable.
Je ne conseille pas trop mysensors les nrf24l01 sont pas top niveau portée et fonctionne en 2.4ghz déjà bien encombrée.
Pour moi le 433mhz est idéal mais bon si t en veux pas...
Autant rester en wifi.
Au sujet de mqtt t es pas obligé d utiliser espeasy si il ne te convient pas, tu peux coder tes propres sondes mqtt je l ai fait ca marche bien, et mqtt est bidirectionnel pas de problèmes pour raspberry et domoticz.

Bonjour,

hbachetti:
Tu peux visiter éventuellement ce tuto de J-M-L : Les Bases d'un Serveur Web sur ESP-01 en commande AT - Tutoriels et cours - Arduino Forum

Oups ... je vois que tu veux absolument envoyer par MQTT. Je ne pense pas qu'un firmware AT convienne, à moins que je me trompe :confused:

J'ai un serveur MQTT mais je suis pas borné sur l'utilisation du MQTT, piloter un interrupteur virtuel sur domoticz en http me convient aussi, c'est simplement pour pouvoir voir combien de temps tourne ma pompe par jour.
Merci pour les liens, j'étudierai ces piste là dès que j'aurais 2 ou 3 heures à tuer. :wink:

A bientôt... :slight_smile: :slight_smile: :slight_smile:

Salut,

Moi aussi, je partirai uniquement sur un ESP, et non sur un ESP + Arduino.
Attention, car a moins de jouer du fer à soudé, l'ESP-01 n'est pas capable de se reveiller d'un DeepSleep de lui-même (donc pas top s'il lui arrive de planté ou s'il fonctionne sur batterie).

Concernant le MQTT, il est possible d'envoyer des commandes a l'ESP : il suffit qu'il souscrive au topic de commande.
Et ca marche meme en DeepSleep pour peut que les messages soient envoyé avec un QoS >=1 (en 0, les messages seront perdus si l'ESP est endormi).

A+

Bonjour,

Ma situation a un peu évolué, en cherchant divers tutos j'ai trouvé un super tuto expliquant comment réaliser un RFLINK WIFI, ça faisait bien 6 mois que je cherchais comment faire ce fameu RFLINK-WIFI, cette solution peut aussi me convenir car j'ai du WIFI partout chez moi.

J'ai modifié un petit truc à ce tuto, j'ai simplement ajouté un adaptateur pour ESP-01 Série 5V :

Je pense opter pour la solution du RFLINK planqué dans ma cuisine avec l'antenne 433mhz déporté qui dépasserai un peu du meuble de cuisine.

Donc il suffirait d'utiliser le code de la sonde oregon pour faire évoluer mon script mais avant de me lancer là dedans, je vais simplement laisser le rflink connecté pour voir si il ne plante pas à cause de l'ESP-01.

A bientôt.

Bonjour,
Finalement j'ai réussi à faire ce que je voulais faire mais pas avec du rflink ou autre, simplement avec une connexion série entre un arduino et un esp-01.
j'ai utilisé le protocol Mysensors Serial : Site officiel. Voici d'où me vient cette idée : Merci à vous.

Voici comment faire :

  • Créer un serveur série wifi sur un ESP-01 comme dans le tuto du Rflink WIFI,ne pas le brancher tout de suite :https://projetasgarddiy.fr/2018/08/18/comment-faire-un-rflink-wifi/
  • Envoyer ce code dans l'arduino.
  • Brancher l'arduino associé à l'esp-01.
  • Créer un nouveau matériel MySensors Gateway dans domoticz, renseignez l'ip et le port
  • Débrancher l'arduino,puis le rebrancher, normalement il devrait avoir au moins un ou de nouveaux dispositifs inutilisés selon le nombres de capteurs que vous avez créé.

Le script :

#include <RCSwitch.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5
#define TEMPERATURE_PRECISION 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress T_piscine, T_soleil;
float piscine = 0;
float soleil = 0;
const int emetteur = 7; //pin de l'alim de l'émetteur 433mhz

 
RCSwitch mySwitch = RCSwitch();
//Pour memoire Touche 3 de la télécommande... 
unsigned long MoteurPiscine_OFF = 7191916; //code pour éteindre ma prise radio commandé en 433mhz.
unsigned long MoteurPiscine_ON  = 7191917; //code pour allumer.
void setup() 
{
  pinMode(emetteur, OUTPUT);
  digitalWrite(emetteur, LOW);
  Serial.begin(57600); //même vitesse que l'ESP-01
  delay(2000);  
  Serial.println("1;1;0;0;6;T_Pisc\n"); //initialiser les 3 capteurs 
  Serial.println("1;2;0;0;6;T_P_Sol\n"); 
  Serial.println("1;3;0;0;3;P_Pisc\n"); 

  sensors.begin(); //initialisation des sondes 18DB20.
  sensors.getDeviceCount();
  sensors.isParasitePowerMode();
  sensors.getAddress(T_soleil, 0);
  sensors.getAddress(T_piscine, 1);
  sensors.setResolution(T_piscine, TEMPERATURE_PRECISION);
  sensors.setResolution(T_soleil, TEMPERATURE_PRECISION);

  mySwitch.enableTransmit(10);   // Data de l'émetteur connecté à la pin #10 de l'Arduino  
  
  Active(); //envoie du signal d'activation de la prise 433mhz pour pouvoir reconfigurer la prise en cas de pb.
  delay(2000);  
  Active();
  delay(2000);  
  Active();
  delay(2000);  
  Desactive();
}

void Active()
{
  digitalWrite(emetteur, HIGH);
  delay(1000);  
  mySwitch.send(MoteurPiscine_ON, 24);
  delay(100);  
  mySwitch.send(MoteurPiscine_ON, 24);
  delay(100);  
  mySwitch.send(MoteurPiscine_ON, 24);
  delay(100);  
  mySwitch.send(MoteurPiscine_ON, 24);
  delay(100);  
  mySwitch.send(MoteurPiscine_ON, 24);
  delay(1000);  
  digitalWrite(emetteur, LOW);
  Serial.print("1;1;1;0;0;");
  Serial.print (piscine);
  Serial.println("\n");
  Serial.print("1;2;1;0;0;");
  Serial.print(soleil);
  Serial.println("\n"); 
  Serial.println("1;3;1;0;2;1\n"); 
}

void Desactive()
{
  digitalWrite(emetteur, HIGH);
  delay(1000);  
  mySwitch.send(MoteurPiscine_OFF, 24);
  delay(100);  
  mySwitch.send(MoteurPiscine_OFF, 24);
  delay(100);  
  mySwitch.send(MoteurPiscine_OFF, 24);
  delay(100);  
  mySwitch.send(MoteurPiscine_OFF, 24);
  delay(100);  
  mySwitch.send(MoteurPiscine_OFF, 24);
  delay(1000);  
  digitalWrite(emetteur, LOW);
  Serial.print("1;1;1;0;0;");
  Serial.print (piscine);
  Serial.println("\n");
  Serial.print("1;2;1;0;0;");
  Serial.print(soleil);
  Serial.println("\n"); 
  Serial.println("1;3;1;0;2;0\n"); 
}

void loop()
{
  delay(120000);
  sensors.requestTemperatures();
  piscine = sensors.getTempC(T_piscine);
  soleil = sensors.getTempC(T_soleil);
  if ( piscine < 30 )
  {
    if (soleil > (piscine + 2)) //Pour chauffer la piscine la journée
      {
        Active();
      }
    else
      {
        Desactive();
      }
  }
  else
  {
    if (soleil < (piscine - 1))  //Pour refroidir la piscine la nuit si elle est trop chaude
    {
        Active();
    }
    else
    {
        Desactive();
    }
  }
}

Et en image :


Merci de m'avoir aidé et à bientôt...