Arduino Forum

International => Français => Réalisations et Projets Finis => Topic started by: lesept on May 29, 2019, 05:37 pm

Title: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: lesept on May 29, 2019, 05:37 pm
Voici un système de simulation de présence à base d'un ESP32 qui orchestre des prises connectées Sonoff S26. L'idée est de brancher des lampes sur ces prises, les mettre en divers endroits du domicile et simuler une présence par allumage et extinction des lampes selon des horaires prévus à l'avance.


On trouve ces prises chez Ali pour près de 8€ la pièce. Bien choisir la référence EU-E (voir photo) pour une prise de terre à la française.

Matériel :


2 codes sont écrits :


Quelques images :


IHM de l'ESP32 sur smartphone



ESP32 et affichage OLED (cercle vide: prise éteinte,cercle plein: prise allumée, T: Timeout, X: prise non connectée)



Les prises


Les codes sont attachés.
Pour ceux qui ont suivi une discussion  (https://forum.arduino.cc/index.php?topic=618012.0)ce weekend, je n'ai pas réussi à diviser le gros code de l'ESP32 sur plusieurs fichiers : les interactions entre serveur, clients, écran et prises sont trop complexes. Si un courageux veut s'y lancer je suis preneur...


EDIT : Après plusieurs mises à jour, vous pouvez trouver les dernières versions des codes dans le dernier message (numéro 32 à ce jour)
Title: Re: Simulateur de présence
Post by: lesept on May 29, 2019, 05:38 pm
Réservé : explications code ESP32

Le code sur l'ESP32 nécessite bien sûr une connexion Wifi pour la discussion avec les prises mais aussi pour connaitre l'heure (via un serveur NTP). Les horaires d'allumage des prises sont définis par une structure qui indique, pour chaque plage horaire :

Quelques exemples :
Code: [Select]
  {Salon, 0b1111111,  7, 10,  8,  0,  0}, /* every days, from 7:10 to 8:00, no random */
  {Salon, 0b1000001, 21, 45, 23, 15, 20}, /* saturday & sunday, from 21:45 to 23:15, 20' random */
  {Salon, 0b1000001, 23, 45,  0, 15, 10}, /* saturday & sunday, from 23:45 to 00:15, 10' random */
  {Salon, 0b0111110, 22, 30, 23, 55, 15}, /* week days, from 22:30 to 23:55, 15' random */
  {Salon, 0b0111000,  0, 15,  1, 25, 10}, /* -MTW---, from 00:15 to 01:05, 10' random */

Ensuite, chaque minute pleine, l'ESP32 vérifie si l'on entre ou sort d'une de ces plages et met à jour la ou les prises concernées.

Un affichage sur un petit écran OLED permet de connaitre l'état des prises à chaque instant.

L'ESP32 est à l'adresse IP fixe : 192.168.0.51, ça peut être changé dans le code. Lorsqu'on va sur http://192.168.0.51 on obtient l'IHM montrée plus haut, qui indique l'état de chaque prise : ON (bouton vert), OFF (bouton rouge) ou non connectée (bouton bleu). Le bouton est cliquable : ON <--> OFF.

Si on clique sur le nom de la prise, on accède à une nouvelle page qui liste les plages horaires associées.



La connexion à l'ESP32 est protégée par mot de passe, il est écrit en dur dans le code :
Code: [Select]
// Credentials to connect to the ESP32
const char* www_username = "***";
const char* www_password = "****";


Pour l'instant le code est configuré pour un nombre maximum de 8 prises, c'est réglable avec le paramètre
Code: [Select]
#define deviceNumber 8
Les identifiants vont donc de 0 à 7, ils sont redéfinis avec un enum :
Code: [Select]
enum device_t : byte {Salon, Cuisine, Couloir, SalleDeBain, ChLea, ChIrena, WC, Entree};
Les noms des prises sont définis ici
Code: [Select]
char deviceName[deviceNumber][31] = {"Salon", "Cuisine", "Couloir", "SdB",
                                     "Ch.L",  "Ch.I",    "WC",      "Entree"
                                    };

On peut les changer dans le code mais aussi de manière interactive directement grâce à l'IHM des prises.

Pour le serveur web, j'utilise la bibliothèque WebServer.h (https://github.com/espressif/arduino-esp32/tree/master/libraries/WebServer) pour ESP32, qui permet de gérer des commandes très simplement. Je me suis inspiré de ce tuto (https://randomnerdtutorials.com/esp32-web-server-arduino-ide/). Le traitement des commandes se fait grâce à la méthode 'on', déclarée dans le setup :
Code: [Select]
  server.on("/", handle_OnConnect);
  server.on("/on", handle_on);
  server.on("/off", handle_off);
  server.on("/list", handle_list);

Elle lie les requêtes à des fonctions appelées selon leur contenu. Ainsi si la requête contient 'on',l'ESP exécute la fonction handle_on qui envoie une commande d'allumage au relais concerné (en argument) et met à jour le serveur.
Code: [Select]
void handle_on() {
  if (server.arg("id") == "") {
    server.send(400, "text/plain", "Bad request");
  } else {
    byte device = server.arg(0).toInt();
    deviceState[device] = ON;
    sendCommand (device, 4);
    char * ptr = webStatus ();
    server.send(200, "text/html", ptr);
    free(ptr);
  }
}
A noter que j'ai réécrit les affichages sur le serveur sans utiliser de String pour éviter les problèmes de mémoire (avec allocation dynamique et libération de la chaîne de caractères de grande taille utilisée à chaque affichage).

L'envoi des commandes aux prises se fait par la fonction
Code: [Select]
state sendCommand (byte device, byte command) {
  /*
     List of available commands:
     0 get id
     1 get name
     2 get status
     3 switch off (relay and led)
     4 switch on (relay and led)
     5 blink
  */
6 commandes sont possibles pour l'instant. Elles sont envoyées lors du clic sur les boutons de l'IHM, ce qui permet de construire le texte de la requête contenant la commande et ses arguments.


Title: Re: Simulateur de présence
Post by: lesept on May 29, 2019, 05:39 pm
Les prises sont commandées soit par l'ESP32, soit par l'interface web. Dans ce dernier cas, d'autres commandes sont disponibles :

Au besoin voir la syntaxe des commandes plus bas.
Exemple : http://192.168.0.52/cmd/led/on

Le code se lance au moment où la prise est branchée.
Il est alors possible de configurer la prise avec le bouton : l'utilisateur dispose de 15 secondes pour appuyer sur le bouton. Le nombre d'appuis devient l'identifiant de la prise (+1). Exemple : 3 appuis --> l'identifiant sera 2 (1 appui pour 0) et l'IP de la prise sera 192.168.0.54

Pendant les 15 secondes, la led rouge clignote, de plus en plus vite au fur et à mesure que les secondes s'écoulent. S'il n'y a plus d'appui pendant 2 secondes, le délai de 15 secondes s'arrête.

Si on n'a pas appuyé sur le bouton pendant le délai, l'IP sera 192.168.0.99

Ensuite, la prise se connecte au Wifi. Il est alors possible d'accéder à l'IHM par le web, avec l'IP de la prise. L'adresse IP (ex: http://192.168.0.54) affiche l'état de la prise (voir photo ci-dessous). Cliquer sur le bouton permet d'allumer ou éteindre la prise.

Les commandes sont accessibles via la barre d'adresse du browser. Exemple :
http://192.168.0.54/cmd/blink?N=5&d=200 fera clignoter la led 5 fois avec une durée de 200 ms à chaque fois.

Les commandes ont une syntaxe de base identique http://adresse_ip/cmd/commande?paramètres
La syntaxe est indiquée dans le code. La commande set_id est particulière : elle permet de changer d'identifiant (si on n'a pas pu le faire avec le bouton au boot), de changer d'adresse IP et éventuellement de changer de nom pour la prise. Syntaxe:
http://ip_address/cmd/set_id?ID=new_id&Name=new_device_name
Exemple : http://ip_address/cmd/set_id?ID=4&Name=Ch.J --> l'identifiant de la prise devient le numéro 4, l'IP devient automatiquement 192.168.0.55 (=51+4) et le nom de la prise devient "Ch.J", qui devrait s'afficher sur l'IHM (je ne sais pas s'il change sur l'IHM de l'ESP32...). La prise va alors rebooter (sans la phase initiale de 15 secondes) et son adresse IP sera changée (elle sera indiquée dans l'IHM) : il faudra alors utiliser la nouvelle pour connaitre son état.

Quelques photos :


IHM de commande d'une prise


J'aurais voulu stocker les paramètres tels que l'identifiant et le nom de chaque prise dans un fichier dans la SPIFFS pour le relire à la prochaine utilisation, mais je me suis aperçu que mes ESP8266 n'ont pas de SPIFFS. Donc tant pis. Le code est là mais reste inexploité.


Des fils soudés sur les ports RX et TX de la prise (fils bleus) et sur VCC (fils rouge) et GND (fil gris)


La difficulté principale
est de se connecter à la prise pour flasher le code. Il faut 4 fils, deux pour RX et TX, un pour VCC et un pour GND, et un adaptateur. Les contacts VCC et GND sont assez faciles à souder car ils sont en un endroit assez robuste. Par contre les contacts RX et TX se font sur des pastilles très fines et fragiles. D'une part il n'est pas facile d'y souder des fils, d'autre part les pastilles se détachent si elles sont soumises à des contraintes trop fortes. Et là, les ennuis commencent...

Pour RX, on dispose d'un autre point de soudure à côté des VCC et GND, et je conseille de l'utiliser plutôt que la pastille. Mais pour TX il n'y a pas le choix et si la pastille se détache, la seule solution qui reste est de se brancher sur la patte TX de l'esp8266 (galère).




On voit bien les pastilles

J'ai utilisé des fils monobrins assez rigides et je pense que c'était une erreur car lors des manipulations, ils forcent sur les pastilles.

En résumé : la carte principale de la sonoff comporte des points d'accès étiquetés :

Je conseille de se brancher à cet endroit pour VCC, GND et RX, et sur la pastille pour TX (pas trop le choix). Utiliser des fils souples ou les coller sur le PCB après la soudure afin que les opérations de branchement et flashage ne transmettent pas de contrainte sur les pastilles. Au pire, il suffit de le faire pour la TX, les autres peuvent être resoudées plusieurs fois.


Sur cette photo, le fil blanc / rose est pour RX


L'adaptateur : Al1fch m'a prêté celui-ci (https://fr.aliexpress.com/item/Pour-WEMOS-CH340G-CH340-Breakout-5-V-3-3-V-Micro-USB-carte-de-Module-s/32892845068.html?spm=a2g0s.9042311.0.0.27426c37yZ1eEK) qui est parfait et permet d'alimenter l'ESP8266 pendant le flashage et son utilisation.


Title: Re: Simulateur de présence
Post by: al1fch on May 29, 2019, 07:11 pm
Ecxellent !!
Merci pour le partage.
je vois que finalement tu as mis tout le monde sur le réseau local de ta box
Title: Re: Simulateur de présence
Post by: lesept on May 29, 2019, 08:05 pm
A venir :

Quote
painlessMesh is a library that takes care of the particulars of creating a simple mesh network using esp8266 and esp32 hardware.  The goal is to allow the programmer to work with a mesh network without having to worry about how the network is structured or managed.
Je voulais ajouter la possibilité d'allumer ou éteindre une prise en appuyant sur le bouton, mais il fallait que l'IHM de l'ESP32 se mette à jour automatiquement, donc que la prise envoie une requête à l'ESP32. Un réseau mesh devrait rendre ça plus facile à coder.
Title: Re: Simulateur de présence
Post by: icare on May 30, 2019, 10:05 am
Bonjour,
Bravo très belle réalisation.
J'ai fait quelque chose de similaire mais sur un réseau wifi indépendant, et par choix, entièrement déconnecté du web.
Mais j'ai la possibilité de passé par une passerelle (Raspberry pi) connectée au réseau domotique et au wifi classique. La sécurité passe par iptable (ne peu galère d'ailleurs).
Title: Re: Simulateur de présence
Post by: lesept on May 30, 2019, 10:50 am
Merci !
J'aurai besoin de conseil pour l'accès depuis internet : j'imagine que dans l'absolu c'est assez simple. On renvoie les requêtes arrivant de l'extérieur via une redirection du port 80.

Mais que se passe-t-il si j'ai plusieurs appareils avec chacun un serveur ? Comment se routent les requêtes ?
Title: Re: Simulateur de présence
Post by: al1fch on May 30, 2019, 11:20 am
Une redirection du port 80 vers l'ESP32 devrait normalement  suffire pour prendre la main indirectement sur les Sonoff  ? Ton système n'est pas conçu pour ca ?
Title: Re: Simulateur de présence
Post by: lesept on May 30, 2019, 11:44 am
Si, mais j'ai aussi un serveur sur un Raspberry Pi qui peut tourner en même temps et recevoir des requêtes.

Ne risque-t-il pas d'y avoir des conflits ?
Title: Re: Simulateur de présence
Post by: icare on May 30, 2019, 11:49 am
Re,
Si, mais j'ai aussi un serveur sur un Raspberry Pi qui peut tourner en même temps et recevoir des requêtes.

Ne risque-t-il pas d'y avoir des conflits ?
Dans mon cas, le seul accès c'est le RPI qui lui gère le reste.
Title: Re: Simulateur de présence
Post by: Artouste on May 30, 2019, 12:54 pm

Des fils soudés sur les ports RX et TX de la prise (fils bleus) et sur VCC (fils rouge) et GND (fil gris)


La difficulté principale
est de se connecter à la prise pour flasher le code. Il faut 4 fils, deux pour RX et TX, un pour VCC et un pour GND, et un adaptateur.
Bonjour lesept
retour interessant

Quelquefois il peut être intéressant de se fabriquer ses propres connecteurs de "flashage/repiquage"
Ce n'est vraiment intéressant que si le nombre de dispo à flasher est assez important

perso lorsque je decide de le faire j'utilise le + souvent des pogo pin avec d'autres aides comme patafix, colle uv,araldite etc ...

juste pour illustration

Title: Re: Simulateur de présence
Post by: al1fch on May 30, 2019, 01:52 pm
Quote
Si, mais j'ai aussi un serveur sur un Raspberry Pi qui peut tourner en même temps et recevoir des requêtes.

Ne risque-t-il pas d'y avoir des conflits ?
non si ton ESP32 ,par exemple, a son serveur HTTP sur le port , disons, 81
tu fais deux redirections  au niveau de la Box pour les ports 80 et 81 vers les bonnes cartes

Avec ton navigateur, depuis l'exérieur , tu ajoutes :81 à l'url de la box pour tomber sur le serveur HTTP de l'ESP32
Title: Re: Simulateur de présence
Post by: lesept on May 30, 2019, 05:10 pm
J'espérais quelque chose comme ça, je vais tester. Merci !
Title: Re: Simulateur de présence
Post by: lesept on May 31, 2019, 01:03 am
Quelquefois il peut être intéressant de se fabriquer ses propres connecteurs de "flashage/repiquage"
Pour la seconde prise, j'ai soudé sur mes paires de fils des connecteurs qui rendent le tout un peu plus solide. Je posterai une photo demain

La patafix me semble une bonne idée. Je testerai plus tard. Merci

Edit : voici la photo
La patafix ne marche pas, trop dur de conserver les contacts tout en bougeant la prise

Title: Re: Simulateur de présence
Post by: lesept on May 31, 2019, 12:38 pm
Avec ton navigateur, depuis l'exérieur , tu ajoutes :81 à l'url de la box pour tomber sur le serveur HTTP de l'ESP32
Ça fonctionne, je peux même utiliser le nom de domaine de ma freebox ! C'est cool...
Title: Re: Simulateur de présence
Post by: MicroQuettas on Jun 02, 2019, 02:50 pm
Bravo pour cette belle réalisation et merci de l'avoir publiée.

Pour la soudure de fils sur des pastilles très fines comme c'est le cas pour "hacker" les prises Sonoff, j'utilise du fil émaillé de 2/10. Il est très souple et cela diminue le risque d'arracher les pastilles.

Pour le découpage d'un programme en "modules" constitués chacun d'un fichier .h et .cpp, j'y suis arrivé pour mes projets, mais ce n'est pas vraiment simple et demande une grande rigueur. J'avais fait une ébauche de recette de cuisine, mais elle n'est plus à jour... Je vais la mettre à jour et la publier... mais sans promesse ferme...

Bonne bidouille

MicroQuettas
Title: Re: Simulateur de présence
Post by: lesept on Aug 17, 2019, 04:55 pm
Je reprends le fil avec une version basée sur la bibliothèque Painless Mesh (https://gitlab.com/painlessMesh/painlessMesh). Le but de cette bibli est de fournir des outils pour créer un réseau "mesh" (https://fr.wikipedia.org/wiki/Topologie_mesh), c'est à dire un réseau maillé, au sein duquel les messages transitent d'un nœud à l'autre en étant parfois renvoyés par d'autres nœuds.



Du coup, il est possible d'étendre le réseau sur une plus grande distance ou dans un endroit où le wifi passe mal, du fait de cette retransmission. Ainsi, si le nœud A envoie un message au nœud D, il peut passer par le B et le C avant de lui arriver.

Bref, la bibli permet de créer facilement ce genre de réseau. Elle est toujours en évolution, mais la version actuelle 1.4.2 est assez stable.

Mon application est de faire une simulation de présence dans un endroit qui n'est pas habité. J'utilise des prises commandées Sonoff S26 et un ESP32 comme chef d'orchestre. La prise coûte près de 8€ chez Ali,bien choisir la prise adaptée à la France (modèle EU E, pas F).



Le code est donc en 2 parties : une pour les prises, et une pour l'ESP32. L'ESP32 joue le rôle de coordinateur du réseau, mais aussi de passerelle vers Internet, via la box, pour pouvoir contrôler l'état des prises en temps réel et les commander le cas échéant. Un écran OLED est attaché à l'ESP32 pour donner une vue synthétique de l'état des prises.

Il y a donc 3 couples identifiant / password dans cette appli :


Je commente ici le code de l'ESP32 (attaché).
C'est lui qui définit les intervalles d'allumage de chaque prise (que j'appelle slots). Ils sont définis par une struct qui contient :
Code: [Select]
typedef struct {
  byte device;
  byte days : 7;   // binary 0bSMTWTFS (Sunday, Monday, Tuesday ... Saturday) - use 7 bits
  byte hourBegin;  // 0 ... 23
  byte minBegin;   // 0 ... 59
  byte hourEnd;
  byte minEnd;
  byte randomMin;  // randomly add or decrease begin and end times of up to xx minutes
} TimeSlot;


Le numéro de la prise peut être remplacé par les éléments d'un enum, comme par exemple
Code: [Select]
enum device_t : byte {Salon, Cuisine, Bureau, SalleDeBain, ChLea, ChIrena, WC, Entree};
La prise 0 serait équivalente à Salon, 1 Cuisine, etc.

Un exemple de slot :
Code: [Select]
{Salon, 0b1010101, 20, 10, 20, 50, 10}
La prise du Salon s'allumera les Dimanche, Mardi, Jeudi et Samedi, de 20h10 +- random(10) minutes à 20h50 +- random(10) minutes, random(10) étant un nombre aléatoire entre 0 et 10. Les horaires peuvent être par exemple 20h03 à 20h56.

Evitez de définir un trop grand nombre de slots, car on peut avoir des problèmes de mémoire. J'ai eu des soucis autour de 60... Je travaillerai plus tard sur une solution pour régler ça.

Pour l'affichage web ou OLED, il est possible de définir des noms spécifiques aux prises, par exemple "Salon", 'Cuis.", etc.

Le montage électronique est très simple : ESP32 - OLED sur I2C (SCL 22, SDA 21). L'écran affiche de manière synthétique l'état de chaque prise et son nom :



L'ESP32 abrite un server web, avec une adresse IP fixe : il est accessible sur un browser via :
Code: [Select]
http://192.168.0.51:81
J'ai choisi le port 81 car j'ai parfois un RPi sur le port 80, mais ça peut être changé dans le code. La connexion est authentifiée et demande l'identifiant et le password défini plus haut.

L'écran principal affiche l'état des prises :

Si la prise est allumée, rectangle vert, on peut l'éteindre en cliquant sur le mot 'OFF' à l'intérieur du rectangle. De même si la prise est éteinte. Si elle n'est pas connectée, le rectangle n'est pas cliquable. Je sais, ça peut être trompeur de voir ON à l'intérieur du rectangle rouge (prise éteinte), mais juste au dessus est écrit "Status OFF"... C'est un choix...



En cliquant sur le nom de la prise, on accède à la liste des slots qui lui sont associés. Ça permet de connaitre à distance les jours et horaires (et leur partie aléatoire) d'allumage.


Enfin, en cliquant sur le titre de la page principale, on accède à la liste des prises, avec leur numéro 'mesh', leur nom, et si elles sont forcées ou non.

Prise forcée : si on clique sur un rectangle vert ou rouge, on force l'allumage ou l'extinction d'une prise. Elle va rester dans cet état jusqu'à ce qu'on change d'état en cliquant une nouvelle fois, ou qu'un slot du même état se termine.
Title: Re: Simulateur de présence
Post by: lesept on Aug 17, 2019, 04:56 pm
Le code des prises est en pièce jointe.

Il organisé en fonctions :

L'avantage de Painless Mesh est que la loop n'a pratiquement rien à faire : tout est fait par les fonctions Callback, en l'occurrence ici traiter un message entrant et y répondre.

Les messages entrants sont très simples :

La fonction de choix du numéro de la prise est plus complexe : elle permet après branchement de la prise de choisir son numéro (puis de l'envoyer à l'ESP32 qui saura ainsi de quelle prise il s'agit, et donc où elle se trouve). L'utilisateur a 15 secondes pour appuyer N fois sur le bouton (N étant le numéro d'ordre choisi).
Si aucun appui n'est fait au bout de 2 secondes, le décompte s'arrête.

Un appui sur le bouton de la prise permet de forcer son état ON ou OFF.
Dans cette version, plus de serveur pour accéder à la prise et la commander : c'est l'ESP32 qui commande toutes les prises via Painless Mesh.
Title: Re: Simulateur de présence
Post by: lesept on Aug 17, 2019, 04:56 pm
J'ai envisagé de faire une version du code sans utiliser la classe String, qui pourrait poser des problèmes de fragmentation de la mémoire à long terme. Mais, après une série de tests sans aucun problème sur plus de 2 semaines, je pense que ce n'est pas nécessaire.

Donc, sauf demande expresse ou temps libre, je ne pense pas la développer...
Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: lesept on Sep 05, 2019, 10:19 pm
Je me suis aperçu que l'ESP32 perd assez souvent la connexion internet, ce qui rend impossible la consultation de l'état des prises à distance. Par contre, Painless Mesh a l'air protégé contre les déconnexions, et le contrôle des prises continue donc quand même.

Pour pallier à ce problème, j'ajoute une vérification de l'état de connexion au Wifi toutes les 20 secondes :

Ajout d'une déclaration de variable dans l'en-tête :
Code: [Select]
bool checkWiFi = true;

Et de la vérification dans la loop :
Code: [Select]
void loop() {
  //  userScheduler.execute();
  mesh.update();

  if (myIP != mesh.getStationIP()) {
    myIP = mesh.getStationIP();
    Serial.println("\nServer -> connect to " + myIP.toString() + ":81");
    Serial.print("------------------------------------\n");
  }

  getLocalTime(&timeinfo);
  // verify WiFi connection @ seconds 5, 25 & 45
  if (timeinfo.tm_sec % 20 == 5) {
    if (checkWiFi) {
      if (WiFi.status() != WL_CONNECTED) wifiConnect();
      checkWiFi = false;
    }
  } else checkWiFi = true;

  //  do nothing until next plain minute (seconds == 0)
  if (timeinfo.tm_sec == 0) {
    if (!isVerified) {
      int timeNow = timeinfo.tm_hour * 60 + timeinfo.tm_min;
      if (timeNow == 0) setTimesBE (); // update slots at midnight
      Serial.printf ("\nTime : %d (%02d:%02d:%02d)", timeNow, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
      verifyDevices (timeNow);
    }
  } else isVerified = false;
}
Depuis cette modification, plus aucun problème, si ce n'est des demandes de login / pass parfois lorsque je veux vérifier l'état des prises.
Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: lesept on Sep 12, 2019, 07:16 pm
Voici la version finale du code pour le contrôleur sur ESP32. Le code des prises ne change pas.
Bonne utilisation à ceux qui voudraient tester, et n'hésitez pas à me contacter si vous avez des questions ou à réutiliser tout ou partie des codes.
Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: al1fch on Sep 12, 2019, 09:28 pm
Bonsoir

Peux-tu dire en quelques mots l'apport de  'Painless Mesh'  à ton application  par rapport à la structure antérieure ?
Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: lesept on Sep 12, 2019, 11:14 pm
D'accord la structure du réseau. Avant j'avais des devices individuels tous connectés à ma box en WiFi. J'aurais pu aussi faire un réseau en étoile autour de l'esp32 en point d'accès, mais je voulais pouvoir commander chaque prise via un serveur Web hébergé par chacune.

Avec Painless mesh, j'ai un réseau maillé, dans lequel je peux ou non définir un nœud principal. L'intérêt est que les messages sont routés de nœud en nœud donc la communication est plus sûre et l'étendue du réseau est supérieure.
L'un des nœuds héberge l'unique serveur et communique avec les autres devices. Les communications sont plus simples et la bibliothèque prend en charge le protocole, la gestion des messages, la découverte des nouveaux devices, etc. C'est le nœud central qui est connecté à la box pour fournir l'IHM de contrôle ou de gestion des prises. C'est plus simple.
Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: al1fch on Sep 13, 2019, 07:21 am
Merrci pour ce complément d'explications  et pour cette réalisation inovante qui met au grand jour  une fonctionnalité méconnue des ESP8266 et ESP32, qui ne font pas que du  WiFi 'pur et dur' !

Dernière question : as tu une idée du comportement,  d'un appareil (autre qu'une prise Sonoff) , alimenté par une batterie, qui serait la plupart du temps en sommeil profond et se réveillerait de temps à autre pour rejoindre le réseau maillé ?
Que se passe-t-il quand tu débranches une prise Sonoff et que tu la rebranches ? En cas de coupure secteur ?

Il  serait utile de pouvoir retrouver  , sans action manuelle, sa place dans le réseau maillé ?
ça pafait faisable en modifiant ta fonction idButton de la manière suivante :

si une Id valide est présent en EEPROM on l'utilise sinon on se donne 15s pour en définir une avec le bouton et on la mémorise en EEPROM


Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: lesept on Sep 13, 2019, 07:45 am
Oui, Painless Mesh gère la disparition et l'apparition de noeud du réseau. Si un nouveau noeud se connecte au réseau, parce tu branches une nouvelle prise par exemple, il rejoint le réseau et les autres nœuds sont avertis. Un callback est généré et tu peux définir une fonction qui sera exécutée à ce moment là.

J'ai constaté cependant que ce n'est pas forcément immédiat, il peut se passer plusieurs secondes voire dizaines de secondes avant que le nœud soit détecté et la fonction exécutée.

 Un appareil qui se mettrait en sommeil et se réveillerait ne quitterait pas le réseau, j'imagine qu'il continuerait à fonctionner comme avant au sein du réseau, mais qu'il aurait simplement loupé les messages échangés pendant son sommeil.
Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: al1fch on Sep 13, 2019, 07:48 am
je pensais à la reconnection répétitive d'une prise et non à la connection d'une nouvelle
Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: lesept on Sep 13, 2019, 07:50 am
J'ai édité ma réponse pendant ton message...

J'ai remarqué qu'un noeud qui quitte le réseau et s'y reconnecte ne change pas d'identifiant.
Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: al1fch on Sep 13, 2019, 08:00 am
inrtéressant !! (l'adresse MAC est peut être utilisée en arrière plan)
Et après une coupure secteur tu n'a pas à jouer du bouton poussoir sur chaque prise , tout se remet tout seul en place 'comme avant'  , même si tous les partenaires ont été privés de courant ?
Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: lesept on Sep 13, 2019, 12:13 pm
Dans mon cas : si. Il faut reconfigurer les prises avec le BP, pour leur donner un numéro à chacune. Sinon, elles auront toutes le numéro 0 et l'ESP32 sera perdu... Je pourrais sauver le numéro dans l'EEPROM, je n'y avais pas pensé...
Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: lesept on Sep 20, 2019, 06:48 pm
Voici les versions encore plus finales que finales des codes :

Prise : sauvegarde du numéro dans l'EEPROM pour relance automatique en cas de coupure de courant. En cas de coupure, le code se relance, charge le numéro sauvegardé en EEPROM s'il y en a un, attend 15 secondes si l'utilisateur veut lui donner un numéro et entre ensuite dans la boucle d'attente normale des commandes en provenance du réseau.
Si aucun appui sur le bouton, la prise garde le numéro mémorisé en EEPROM. Donc pour donner le numéro 0, il faut appuyer 8 fois sur le bouton (si vous avez conservé 8 comme valeur de numberOfDevices dans le code). Le numéro sélectionné est égal au nombre d'appuis modulo cette valeur (ce qui permet de corriger si on se rate)...

Contrôleur ESP32 : j'ai changé l'algorithme de mise à jour de l'état des prises, afin de mieux gérer les plages horaires (slots) d'allumage situés autour de minuit. L'algorithme actuel cherche pour chaque prise le slot actuel (celui qui contient l'heure courante) ou s'il n'y en a pas le slot suivant. Ca simplifie beaucoup par rapport à l'ancien algorithme qui cherchait constamment le slot courant : la recherche se fait au lancement et au changement de jour, et il n'y a qu'une mise à jour à faire lorsque le slot actuel est terminé.

Bref, voici les codes finaux de chez finaux...
Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: mic78000 on Oct 29, 2019, 10:16 am
Beau travail !

Merci pour le partage. Intéressant !

En complément, pas encore testé l'OTA ?
J'ai testé, sur une prise et le sonoff mini : bien !!
Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: lesept on Oct 29, 2019, 07:08 pm
Je testerai éventuellement, mais mon logiciel me donne satisfaction, donc je n'ai pas de raison de le mettre à jour pour le moment
Title: Re: Simulateur de présence (modifié avec utilisation de Painless Mesh)
Post by: lesept on Dec 25, 2019, 08:40 pm
Bonjour, voici pourtant une mise à jour, suite à la reconversion temporaire du soft en contrôleur d'illuminations de Noël...

Cette version utilise des fichiers stockés dans le SPIFFS de l'ESP32 pour afficher les pages web, fichiers créés à la volée, en fonction de l'état de chaque prise. On évite ainsi d'utiliser des très longues chaines de caractères.