Community Forum
    • Blog
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    WebServer étrange

    Scheduled Pinned Locked Moved Remora
    79 Posts 7 Posters 172.6k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • AuFilElecA Offline
      AuFilElec
      last edited by

      Ok, mais vu que je suis en train de travailler sur la page Web, mon compteur est repartit à zéro.

      Je tâcherai de le laisser tourner pendant une semaine ou deux et je vous ferai un retour à ce moment là.

      1 Reply Last reply Reply Quote
      • AuFilElecA Offline
        AuFilElec
        last edited by

        Bonjour à tous,

        Je viens de pousser une première version d'interface pour la gestion des zones de chauffage. Elle est plutôt simple pour le moment, mais elle est fonctionnelle. Si vous avez des idées d'amélioration, je veux bien les prendre en compte.

        J'ai aussi résolu le problème concernant la reconnaissance des requêtes fp (dans la fonction handleNotFound).
        Le problème se trouvait lors de la transformation de l'URI String -> char *. Je pense que la variable retournée par server->uri() devait être modifiée après l'avoir récupéré et le pointeur ne devait plus pointer au bon endroit 😕
        J'ai aussi déplacé l'initialisation de l'OTA, pour prendre en compte les informations contenues dans la config.
        Ce qui pourrait être intéressant aussi, c'est de pousser l'état des zones dans la config, afin de garder ça en mémoire.

        Autre chose aussi, je suis en train de chercher le moyen de détecter la présence des personnes à l'aide du WiFi en vérifiant le nombre de connexions en mode AP.
        Quelqu'un aurait'il déjà fait cela ? Ou auriez-vous des pistes ?
        Voici la condition que j'ai trouvé pour le moment:

        WiFi.getMode() == WIFI_AP_STA && WiFi.softAPgetStationNum() > 0
        

        Pour rappel, mon dépôt se trouve à l'adresse suivante: https://github.com/AuFilElec/remora_soft

        1 Reply Last reply Reply Quote
        • F Offline
          Fab_33
          last edited by

          Il faudrait que je teste ces modifications. Pour ce qui est du stockage, le problème c'est que l'ESP ne va pas vivre longtemps ... Surtout avec des flash from china !
          Perso, je pense gérer ca avec l'uptime. Si la nouvelle valeur est inférieure à la précédente c'est qu'il y a eu reboot donc je réécris les valeurs des fils pilotes.
          Pour ce qui est de la présence, je laisse la domotique gérer cela. Je trouve que déjà la gestion du délestage devrait être optionnelle. Dans mon cas j'ai un open EVSE pour la voiture et je préfère délester la voiture que le chauffage en première intention sauf si j'ai un besoin spécifique.

          1 Reply Last reply Reply Quote
          • AuFilElecA Offline
            AuFilElec
            last edited by

            Salut @Fab_33 ,
            Je suis d'accord qu'écrire régulièrement dans l'EEPROM risque de limiter la durée de vie de l'ESP.
            Je ne comprend pas ton idée d'utiliser l'uptime. A quel moment écris-tu les ordres des fils pilotes dans la config ?

            Je travaille sur le Remora pour une personne qui n'a pas de domotique et qui n'a pas de connexion Internet (oui, oui, ça existe encore). L'avantage de l'ESP est la possibilité de se mettre en mode AP et donc de permettre à une personne de se connecter au serveur Web. D'où ma demande pour la détection de présence par le WiFi, puisque la personne à un Smartphone.

            Voici les améliorations que je souhaite apporter au Remora:

            • Ajouter la fonctionnalité vacances pour couper le chauffage et le ballon d'eau chaude (nécessite une gestion de temps)
            • Ajouter les relevés de températures pour chaque zone
            • Permettre la désactivation permanente de certaines zones (mettre en grisée dans l'interface)
            • Ajouter la détection de présence pour la mise en route du chauffage
            • Ajouter la gestion de l'heure pour mettre le chauffage en ECO à une certaine heure
            • Choisir l'ordre de délestage, bien qu'il suffit de câbler le Remora dans le bon ordre, puisque dans mes souvenirs, il coupe les zones par ordre croissant.

            Mon idée est que le Remora soit autonome et ne dépende pas d'un système domotique. C'est d'ailleurs ce que j'ai vu lorsque j'ai découvert ce super projet (merci beaucoup à @Thibault & à @Charles pour le partage).

            Voici ce que donne l'interface de gestion des zones (aussi adapté pour la version mobile):
            gestion zones fil pilote

            1 Reply Last reply Reply Quote
            • F Offline
              Fab_33
              last edited by

              Effectivement c'est pratique d'avoir un système indépendant mais il faut que cela soit optionnel. Perso c'est ma domotique qui gère le remora car ce n'est pas le seul objet connecté dans la maison. Pour ce qui est de l'uptime, je récupère la valeur de l'uptime tous les 15s lors de la récupréation de l'objet json de la téléinfo. Si la valeur est inférieure à la précédente valeur récupérée, je renvoie les commandes de fil pilote. Mais bon c'est faisable uniquement avec la domotique.

              1 Reply Last reply Reply Quote
              • AuFilElecA Offline
                AuFilElec
                last edited by

                Effectivement, tu gères l'état de tes fils pilote sur ton système domotique. C'est pour ça que je ne comprenais pas, je pensais que c'était sur le Remora.

                Je suis en train d'ajouter la gestion du relais sur l'interface Web. Et je regarde pour mettre en place l'état de pilotage du relais (arrêt, marche forcée et auto) comme sur les contacteurs jour/nuit. Par contre, il va falloir que j'ajoute la gestion de temps, pas évident.

                C'est quoi ton système domotique ?

                1 Reply Last reply Reply Quote
                • AuFilElecA Offline
                  AuFilElec
                  last edited by AuFilElec

                  Tu avais raison @Fab_33 , après 2 jours et 14H de fonctionnement, le problème de télé-info réapparaît.
                  Il va donc falloir chercher plus en profondeur.

                  Je rectifie mes âneries, @AuFilElec a dit:

                  je suis passé sur un Weemos et il n'y a pas de Serial1 sur Weemos

                  Il y a bien le port TX1 sur Wemos en pin 4 (GPIO2). Je viens de me brancher dessus et j'ai redirigé l'ensemble des logs dessus. Je verrai bien ce que j'ai comme informations lorsque je détecterai un problème dans les données de la télé-info. Par contre, le problème c'est d'attendre au minimum 2 jours pour constater le problème, sans être sur d'avoir une info viable.

                  1 Reply Last reply Reply Quote
                  • F Offline
                    Fab_33
                    last edited by

                    Pour la domotique c'est du node-red avec openHab mais je passe tout sur node-red y compris la visualisation prochainement. J'ai également un emoncms et influxdb/grafana pour la visualisation.

                    1 Reply Last reply Reply Quote
                    • M Offline
                      mjeanne @AuFilElec
                      last edited by mjeanne

                      @AuFilElec Concernant les valeurs erronées, il y a un checksum, donc je pense que la corruption se fait après avoir entré l'info dans la liste chainée. J'ai noté que les valeurs erronées (au moins pour les étiquettes) sont toujours des mélanges de 2 trames, jamais des caractères aléatoires. J'ai regardé très rapidement, et il faudrait vérifier les fins de chaine. En C/C++, il y a un \0 en fin d'une chaine. Faudrait vérifier que la librairie alloue bien une taille correcte (taille de trame +1).

                      Pour la vérification de présence, je ne connais pas de moyen de lire les adresses MAC, mais il y a une fonction softAPgetStationNum() qui retourne le nombre de machines connectées à l'AP.
                      Si le smartphone est le seul à avoir le mot de passe, le compte devrait pouvoir servir de test de présence.

                      1 Reply Last reply Reply Quote
                      • CharlesC Offline
                        Charles
                        last edited by

                        @AuFilElec
                        Géniale ton interface WEB pour les zones, c'est cool 😉

                        Pour l'interface WEB je viens de tout passer en AsyncTCP (merci à @me-no-dev) et je t'assure qu'au niveau performance, c'est juste le jour et la nuit, avant au 1er refresh le temps de charger bootstrap ça prenait genre 3/4 secondes, maintenant en moins d'une seconde c'est bouclé!
                        En plus j'ai tout migré en WebSockets et j'ai ajouté une console série WEB pour passer des commandes, la config et voir les LOG, ça commence à donner un truc qui me plait.
                        Plus qu'a finaliser et intégrer ça dans le remora car pour le moment c'est pour un autre projet.

                        0_1462683081961_Capture.JPG

                        Tu peux déjà regarder l'exemple de la console Web Serial to Websocket si tu veux c'est ici car il y a aussi un dossier intéressant (webdev) qui contient :

                        • des scripts nodejs pour le développement de l'interface web afin de tester les pages Web de dev rapidos sans avoir à les flasher dans l'ESP
                        • un script pour copier tous les fichiers de dev sans le dossier data pour flash dans la SPIFFS

                        J'utilise le même principe sur remora et WiFinfo avec qui scripts plus avancés car ils minifient les js et css non minifiés, et en plus ils les concatène tous en 1 seul fichier pour un chargement plus rapide depuis l'ESP vers le browser.

                        1 Reply Last reply Reply Quote
                        • AuFilElecA Offline
                          AuFilElec
                          last edited by

                          Super nouvelle @Charles , je vais tester ça au plus vite, ça me plaît déjà.

                          Justement, j'attendais avec impatience la gestion des logs dans l'interface Web, car j'avais lu que tu avais l'idée de le faire. Alors, je suis au anges 😉

                          Pour la partie développement, j'utilise le npm http-server pour ne pas flasher toutes les 2 minutes, il redirige les requêtes vers le Remora. Et j'utilise l'outil de Yahoo (yuicompressor) pour minifier les scripts JS et CSS. J'en ai aussi profiter pour minifier le HTML, mais je n'ai pas encore automatisé tout ça.

                          Salut @mjeanne , de tout ce que j'ai vu dans le code, dans la partie télé-info, les allocations me paraissaient suffisantes (caractère de fin de chaîne compris), mais je vais y jeter un œil à nouveau. D'ailleurs @Charles , il y a une partie de code que j'ai un peu de mal à comprendre dans la Lib LibTeleInfo.cpp aux alentours de la ligne 263, peut être pourrais-tu m'éclairé ?

                          // First String located after last struct element
                          // Second String located after the First + \0
                          newNode->checksum = checksum;
                          newNode->name = (char *)  newNode + sizeof(ValueList);
                          newNode->value = (char *) newNode->name + lgname + 1;
                          

                          Je ne comprends pas bien ce qui est fait.

                          @mjeanne , j'était déjà partit sur la vérification du nombre d'utilisateurs connectés en mode AP, voir mon post plus haut, mais merci pour l'info.

                          Merci @Fab_33 , je vais regarder ça de plus près. Pour ma part, je suis sur Jeedom, mais je n'utilise pas le plugin Remora pour le moment, car je trouve qu'il stresse trop le Remora. Par contre, j'envoie les données de la télé-info sur mon Jeedom et ça c'est cool.
                          Il va falloir que je regarde node-red de plus près, car je ne connaissais pas.

                          Je suis bien content de voir que ça bouge par ici, j'avais peur que le projet se meurt et tombe dans les oubliettes. Ça serait dommage, vu les possibilités qu'offre le Remora.

                          Bonne journée à tous

                          1 Reply Last reply Reply Quote
                          • S Offline
                            scalz
                            last edited by

                            beau boulot Charles, comme d'hab 😉

                            1 Reply Last reply Reply Quote
                            • AuFilElecA Offline
                              AuFilElec
                              last edited by

                              Salut @scalz , ça fait plaisir de te voir ici.

                              1 Reply Last reply Reply Quote
                              • S Offline
                                scalz
                                last edited by

                                @AuFilElec :

                                hihi 🙂 tout le plaisir est pour moi aussi. et de voir que tu aides ici aussi c'est bueno 🙂
                                ca fait partie de mon trio favori 🙂 avec mys et jeedom 🙂 mais je ne suis actif qu'à un endroit pour l'instant malheureusement.. Charles a bossé dur en coulisse, ça va être extra de chez extra.

                                jsuis ancien dev mais je le resterai toujours! (et ancien veut pas dire que je suis vieux ahah). Vu que j'ai pas trop le temps pour l'instant quand je vois ce qu'à fait Charles, ui, websockets, wow youpie yeah, je ne peux que kiffer, je plussoie, j'en souris jusqu'au oreilles 🙂 car c'est sur ma todo, de pouvoir manager ma gw et mes nodes même si pas de controller (j'avais comme idée esp server async websockets, et appli mobile hybride..).

                                pff trop trop hate de vous rejoindre, jvais finir par rouiller lol et quand je vois async etc, truc de geek de developper, ça me donne envie de plonger dedans, mais non non faut pas que jfasse l'abeille et que jme mette à butiner...faut que je finisse mes design de gizmos avant, que j'ai hâte de montrer d'ailleurs...

                                @+

                                1 Reply Last reply Reply Quote
                                • CharlesC Offline
                                  Charles
                                  last edited by Charles

                                  @scalz
                                  ouais c'est compliqué (voir même complètement fou) de vouloir gérer le hard et le soft, nous sommes que des humains, notre gros soucis c'est que le temps est le même pour tout le monde et il nous faudrait des journées de 48H, une soft, une hard hahahaha

                                  En plus tout le socle Arduino ESP8266 ça bouge tout le temps, l'équipe est super active et réactive, ça avance vite et une version OK peu ne plus compiler 6 mois après car tout à changé mais que en bien !

                                  Ah oui je ne vous ai pas dit aussi, j'ai tout passé le JSON avec la super librairie ArduinoJSon de Benoit (encore un Frenchy), la encore trop de la balle à tel point que la AsyncWeb socket de @me-no-dev inclue tout ce qu'il faut pour s'intégrer avec cette lib.

                                  Après je suis pas super calé en C++ (class, template, virtual) et parfois je galère pour contribuer aux codes de ces super dev. En revanche le C ça va très bien 😉

                                  @AuFilElec
                                  Pour la partie du code dont tu parles, tu as du voir mais je fais un rappel, plus on aura d'yeux sur le soucis plus vite on le trouvera (bien que je suis pas certain que ça vienne du code, je l'utilise sous linux depuis des lustres sans le moindre soucis). Donc

                                  La structure de la liste chaînée _ValueList contient pour chaque élément (je fais grace du premier (root) qui est vide)

                                  // Linked list structure containing all values received
                                  typedef struct _ValueList ValueList;
                                  struct _ValueList 
                                  {
                                    ValueList *next; // next element
                                    uint8_t checksum;// checksum
                                    uint8_t flags;   // specific flags
                                    char  * name;    // LABEL of value name
                                    char  * value;   // value 
                                  };
                                  

                                  Donc pour chaque élément, tu as:

                                  • *next un pointeur sur la même structure du prochain élément, sauf si nous sommes sur le dernier élément bien sûr auquel cas ce pointeur est NULL
                                  • checksum la checksum du couple LABEL/VALUE de l'élément
                                  • flags des drapeaux servant a savoir su l'élément vient d'être ajouté, ou juste modifié, .. (par exemple une valeur IINST modifiée)
                                  • *name un pointeur sur la chaine qui va contenir le nom du label (ex IINST)
                                  • *value un pointeur sur la chaine qui va contenir la valeur (ex 23)

                                  Ce qu'il faut bien comprendre c'est que quand tu alloues un élément de la liste chaînée (parce que viens de recevoir une nouvelle étiquette) tu n'as pas la taille pour stocker le nom de l'étiquette ainsi que sa valeur, ce ne sont que des pointeurs *name et *value il faut donc allouer l'espace mémoire nécessaire et c'est la qu'interviennent les lignes dont tu parles.

                                  Donc dans un 1er temps on crée un node vide de la taille de la structure auquel on ajoute la taille de l'étiquette+1 et de sa valeur+1 (les 2 +1 pour les fins de chaine \0) newNode

                                  
                                        // Our linked list structure sizeof(ValueList)
                                        // + Name  + '\0'
                                        // + Value + '\0'
                                        size_t size = sizeof(ValueList) + lgname + 1 + lgvalue + 1  ;
                                        // Create new node with size to store strings
                                        if ((newNode = (ValueList  *) malloc(size) ) == NULL) 
                                          return ( (ValueList *) NULL );
                                        else 
                                          // get our buffer Safe
                                          memset(newNode, 0, size);
                                        
                                        // Put the new node on the list
                                        me->next = newNode;
                                  

                                  Ensuite on positionne les valeurs de la structure, et la, c'est la ruse on stocke la chaîne du nom à la fin de la structure (car y on a réservé plus de place), donc son pointeur est l'adresse du noeud + la taille de la structure
                                  newNode->name = (char *) newNode + sizeof(ValueList);
                                  et enfin le pointeur de la valeur juste après la valeur du nom
                                  newNode->value = (char *) newNode->name + lgname + 1;

                                  D'ou le code suivant:

                                        // First String located after last struct element
                                        // Second String located after the First + \0
                                        newNode->checksum = checksum;
                                        newNode->name = (char *)  newNode + sizeof(ValueList);
                                        newNode->value = (char *) newNode->name + lgname + 1;
                                  

                                  Et après on y copie label + valeur

                                        // Copy the string data
                                        memcpy(newNode->name , name  , lgname );
                                        memcpy(newNode->value, value , lgvalue );
                                  

                                  Voilà j'espère avoir pu éclairer sur le sujet 😉

                                  Et Tadaaaaaaaaaaaa , la vache, en écrivant ça je viens de percuter sur un truc, je crois comprendre ce qu'il se passe et je pense avoir trouvé le bug !!!!!
                                  L'ESP aligne par défaut les structures et leur contenu sur 4 octets et donc en fonction des tailles label/value tout peut changer et on se retrouve avec des alignement foireux (j'ai déjà rencontré ce souci en sauvant des config sous forme de structure en flash) que j'ai réglé avec des directives pragma pour aligner sur 1 octet.

                                  Peux-tu essayer de changer le code de déclaration de la structure en y ajoutant les pragma avant et après déclaration de la structure? Si ça ne suffit pas il faudra aussi tenter d'aligner malloc pour label/value sur 4

                                  #pragma pack(push)  // push current alignment to stack
                                  #pragma pack(1)        // set alignment to 1 byte boundary
                                  
                                  // Linked list structure containing all values received
                                  typedef struct _ValueList ValueList;
                                  struct _ValueList 
                                  {
                                    ValueList *next; // next element
                                    uint8_t checksum;// checksum
                                    uint8_t flags;   // specific flags
                                    char  * name;    // LABEL of value name
                                    char  * value;   // value 
                                  };
                                  
                                  #pragma pack(pop)
                                  

                                  Bon tests 😉

                                  Charles

                                  1 Reply Last reply Reply Quote
                                  • AuFilElecA Offline
                                    AuFilElec
                                    last edited by

                                    Ok, effectivement je n'avais pas vu ça de cette manière, le stockage du nom et de la valeur. Il faut dire que mes notions de C remontent maintenant à quelques années. Donc pas simple de s'y remettre. Vu que je n'ai fait quasiment que du Web depuis 10 ans.
                                    Merci pour l'info et en prime, ça t'a donné une idée sur ce qui pourrait déconner 🙂

                                    Je suis en train d'intégrer les Websockets dans le code du Remora en ce moment, donc je ferai ces tests là un peu plus tard.
                                    D'ailleurs, j'avais vu sur le dépôt de me-no-dev qu'il gère aussi le JSON, c'est vraiment trop fort, bientôt il nous préparera le café et viendra nous le servir 😉

                                    J'ai créé une branche spécifique pour l'intégration des websockets, donc on pourra échanger si tu veux.

                                    Je suis vraiment fan de ce projet et il y en a un autre qu'y a attiré mon attention ULPNode.

                                    1 Reply Last reply Reply Quote
                                    • CharlesC Offline
                                      Charles
                                      last edited by Charles

                                      @AuFilElec
                                      Ouais j'avais intégré aussi les WebSockets dans WifInfo, mais l'ancienne version (pas async) et j'ai du tout rechangé (web server aussi) car c'est maintenant intégré au Async, mais c'est bon le boulot est fait maintenant, au moins j'aurais plus ça à faire.

                                      Pour le Bug, je pense j'ai trouvé un truc pour faire un align ici avec xPortWantedSizeAlign()

                                      le code suivant modifié dans LibTeleinfo.cpp devrait fonctionner, à tester 😉

                                            // Our linked list structure sizeof(ValueList)
                                            // + Name  + '\0'
                                            // + Value + '\0'
                                            size_t size ;
                                            #ifdef ESP8266
                                              lgname = xPortWantedSizeAlign(lgname+1);   // Align name buffer
                                              lgvalue = xPortWantedSizeAlign(lgvalue+1); // Align value buffer
                                              // Align the whole structure
                                              size = xPortWantedSizeAlign( sizeof(ValueList) + lgname + lgvalue  )     ; 
                                            #else
                                              size = sizeof(ValueList) + lgname + 1 + lgvalue + 1  ;
                                            #endif
                                      
                                            // Create new node with size to store strings
                                            if ((newNode = (ValueList  *) malloc(size) ) == NULL) 
                                              return ( (ValueList *) NULL );
                                      
                                      

                                      Quand tu veux pour échanger, au contraire, ce sera avec plaisir et sur tous les sujets, puis ton interface des zones c'est cool, j'aimerais trop l'intégrer 😉

                                      1 Reply Last reply Reply Quote
                                      • AuFilElecA Offline
                                        AuFilElec
                                        last edited by

                                        C'est avec grand plaisir que je partage mon travail, si il peut servir à d'autres, c'est le principe de l'open source.
                                        Si tu veux, je vais mettre ça au propre et je t'envoie une pull request sur ton dépôt.

                                        Je galère un peu avec l'intégration du JSON avec l'utilisation des websockets, mais ça va venir. Je m'occuperai du problème de télé-info après, car j'ai hâte d'avoir les websockets en place 🙂

                                        1 Reply Last reply Reply Quote
                                        • CharlesC Offline
                                          Charles
                                          last edited by Charles

                                          ça j'ai et fonctionnel en plus (Json, WebSocket, Console et Async)

                                          Je release pas pour le moment, mais je peux t'envoyer le code, en plus c'est le même format que WifiInfo et remora alors si tu peux t'en inspirer pour le coller dans le remora, au contraire on restera cohérent et l'intégration sera bien plus facile 😉

                                          Si tu le gardes pour toi pour le moment je t'envois les sources...

                                          1 Reply Last reply Reply Quote
                                          • AuFilElecA Offline
                                            AuFilElec
                                            last edited by

                                            Ok, c'est cool. Je le garderai bien au chaud et cela m'économisera des heures de boulot.

                                            1 Reply Last reply Reply Quote
                                            • First post
                                              Last post

                                            5

                                            Online

                                            5.7k

                                            Users

                                            534

                                            Topics

                                            5.0k

                                            Posts

                                            Top Topics

                                            • Bonjour Nicolas
                                              Nicolas BernaertsN
                                              Nicolas Bernaerts
                                              0
                                              19
                                              312

                                            • Denky 4 - Domoticz - Triphasé -
                                              Nicolas BernaertsN
                                              Nicolas Bernaerts
                                              0
                                              7
                                              69

                                            • Denky D4 et Linky Standard TInfo Rx Non Configuré
                                              CharlesC
                                              Charles
                                              0
                                              5
                                              136

                                            • CC1101 mini shield pour raspberry
                                              CharlesC
                                              Charles
                                              0
                                              5
                                              151

                                            • CC1101
                                              CharlesC
                                              Charles
                                              0
                                              2
                                              66

                                            Popular Tags

                                            teleinfo
                                            24 topics
                                            arduino
                                            19 topics
                                            remora
                                            16 topics
                                            esp8266
                                            10 topics
                                            arduipi
                                            10 topics
                                            wifinfo
                                            7 topics
                                            raspberry
                                            7 topics
                                            broadcast
                                            7 topics
                                            Copyright © 2022 Charles-Henri Hallard | Return to blog page | Powered by NodeBB