Ré-écriture de Wifinfo pour traiter le mode standard du Linky
-
@Marco40
Bonjour
J'ai mis une version de Wifinfo/Libteleinfo réorganisée sur github:
https://github.com/marco402/LibTeleinfo/tree/rewrite-Wifinfo.-Je n'ai pas re testé:
-Les sorties leds(leds.cpp et leds.h),j'ai conservé les fonctions d'origine mais j'ai une autre version avec des leds APA106.
-Les sortie emoncms,jeedom et httpRequest, fonctions qui sont d'origine à la mise en place des classes près. -
Bonjour Marc,
J'ai commencé à regarder votre code concernant la gestion du mode Standard. Il détecte bien des trames, mais je n'ai pas réussi à les afficher et à vérifier qu'elles sont bien correctes. Je vais continuer à regarder ce soir et demain.
Par contre, le mode Standard ne gère plus les mêmes noms de valeurs, l'envoi de données vers Emoncms ou Domoticz ne fonctionne pas car les champs attendus ne sont pas renvoyés. Je verrai ce qu'il est possible de faire pour ajouter les champs dans la requêtes.
Pierre
-
Bonjour Pierre,
Je pense que c'est normal, j'ai bien précisé que le mode standard est à terminer (je n'ai pas encore le linky pour essayer).
Marc -
Bonjour Marc,
J'ai pu avancer sur le sujet, en fait tout est bon dans le code si ce n'est le calcul du checksum.
En fait, il faut que le début du calcul soit le suivant:uint16_t sum = ' '; //5.3.6. Couche liaison document enedis Enedis-NOI-CPT_54E.pdf if (!this->modeLinkyHistorique){ sum = 0x09 * 2;// Somme des codes ASCII du message + deux tabulations }
En fait, il n'y a pas d'espace et 2 tabulations. En faisant ça, les checksums sont corrects et cela fonctionne bien mieux.
Pour l'url, j'ai rajouté les éléments suivants:
if (valName == "SINSTS"){ url.replace("%SINSTS%",me->value); } if (valName == "EAST"){ url.replace("%EAST%", me->value); } if (valName == "EASF01"){ url.replace("%EASF01%", me->value); } if (valName == "EASF02"){ url.replace("%EASF02%", me->value); }
J'espere que ça pourra aider d'autres personnes.
Pour le moment, je me bats avec le Wemos qui passe son temps à rebooter sans que j'ai compris pourquoi. Si vous avez une idée, je suis prenneur.
Pierre
-
Bonjour, je suis en train de regarder pour adapter l'envoi du code actuel vers jeedom car le plugin teleinfo à changé et il faut envoyer des variables en POST. (webclient.cpp)
Hors c'était http.GET qui était utilisé et le http.POST ne fonctionne pas. Je ne suis pas connaisseur du cpp, qqun aurait une idée ? je reçois bien l'url (GET) mais rien en POST.
Merciboolean httpPost(char * host, uint16_t port, char * url,char * varPost ) {
HTTPClient http;
bool ret = false;unsigned long start = millis();
// configure traged server and url
http.begin(host, port, url);Debugf("http%s://%s:%d%s => ", port==443?"s":"", host, port, url);
http.addHeader("Content-Type", "text/plain");
// start connection and send HTTP header
int httpCode = http.POST(varPost);
if(httpCode) {
// HTTP header has been send and Server response header has been handled
Debug(httpCode);
Debug(" ");
// file found at server
if(httpCode == 200) {
String payload = http.getString();
Debug(payload);
ret = true;
}
} else {
DebugF("failed!");
}
Debugf(" in %d ms\r\n",millis()-start);
http.end();
return ret;
} -
@mangoose
Bonjour PierreJ'ai corrigé sur Github et j'ai ajouté une classe myTinfo pour sortir les fonctions de Wifinfo.ino.
Pour ton problème, est-ce lié à ma version ?
Est ce que le reboot se fait sur l'initialisation ?
As tu des messages console au moment du reboot (watchdog...)?Marc
-
Bonjour
J'ai continué à avancer, en fait il faut que les valeurs soient remontées de la manière suivante:
url = *CONFIGURATION.config.httpReq.path ? CONFIGURATION.config.httpReq.path : "/"; //url += "?"; // Loop thru the node while (me->next) { // go to next node me = me->next; skip_item = false; // Si Item virtuel, on le met pas if (*me->name =='_') skip_item = true; // On doit ajouter l'item ? if (!skip_item) { String valName = String(me->name); /* FOR STANDARD TYPE */ if (valName == "SINSTS"){ url.replace("%SINSTS%",String(atol(me->value))); } if (valName == "EAST"){ url.replace("%EAST%", String(atol(me->value))); } if (valName == "EASF01"){ url.replace("%EASF01%", String(atol(me->value))); } if (valName == "EASF02"){ url.replace("%EASF02%", String(atol(me->value))); }
Concernant les reboots, j'ai remarqué que c'est quand je suis connecté à l'interface web en même temps que ça envoie les informations à Domoticz. Si je ne me connecte pas à l'interface, c'est relativement stable.
Je vais creer un clone de ton github et ensuite je vais injecter le code que j'ai écrit, ca sera plus simple.
Pierre
-
C'est bon j'ai fait un pull request sur github.
Voici ce que j'ai quand ça reboote:
May 1 18:05:43 WifInfo-423FC4 Wifinfo Good CRC, not set! From now, we can use EEPROM config !
May 1 18:07:21 WifInfo-423FC4 Wifinfo Good CRC, not set! From now, we can use EEPROM config !
May 1 18:08:51 WifInfo-423FC4 Wifinfo Good CRC, not set! From now, we can use EEPROM config !
May 1 18:17:01 WifInfo-423FC4 Wifinfo Good CRC, not set! From now, we can use EEPROM config !
May 1 18:20:11 WifInfo-423FC4 Wifinfo Good CRC, not set! From now, we can use EEPROM config !
May 1 18:37:21 WifInfo-423FC4 Wifinfo Good CRC, not set! From now, we can use EEPROM config ! -
Bonjour Pierre
J'ai fait une erreur dans la dernière version:
en fin de webClient.cpp fonction validate_value_name
Il faut que tu remplace sizeof(tabNames) par 38 ou la nouvelle taille du tableau tabName si tu ajoute des champs(ce que j'ai fait dans la dernière version pour les 4 champs que tu avait indiqué).
J'ai ajouté par sécurité un ESP.wdtFeed(); en début de build_emoncms_json.marc
-
Il y a un autre problème, le buffer dimensionné à 136 est trop petit avec les variables ajoutées, je l'ai passé de 136 à 300.
webClient-->httpPost -->char buffer[300];
marc
-
J'ai ajouté un test dans build_emoncms_json au cas ou on a jamais reçu de message teleinfo , dans ce cas j'avais un reboot par le watchdog.
if(! first_item) // go to next node me = me->next; //marc else if (me->free) { //1st item is free : empty list ! Debugln("Teleinfo list is empty !"); break; } //fin marc if( ! me->free ) {
C'est le code qui était déjà dans tinfoJSONTable.
Il faudra voir pour httpRequest si tu as encore un soucis et pour jeedomPost.
J'ai dimensionné le tableau à 400 et j'ai mis ta modif String(atol(me->value)).
Github est à jour.
Marc
-
Bonjour
J'ai trouvé 2 problèmes dans le code.
Il faut commenter la ligne 339 du fichier webclient.cpp
La fonction this->on("/tinfo.json", & { plante systématiquement chez moi. J'ai fait en sorte qu'elle sorte des le début et je n'ai visiblement plus de plantage intempestif.Je ne sais pas trop bien ou ça plante, mais je recois juste le message "setReinit tinfoJSONTable" et ensuite ça fait un hard reset.
Je n'ai pas encore trouvé d'où ca peut provenir. Si je trouve, je ferait à nouveau un pull request pour que ce soit incorporé à ton code sans que l'un ou l'autre ait à reprendre les modifs manuellement.
Pierre
-
as-tu remplacé sizeof(tabNames) par 38 ?
Marc -
J'ai repris ton code directement mais ca ne fonctionne pas mieux.
Par ailleurs, en continunant à chercher j'ai remarqué que mes reboots avait lieu au bout d'un nombre variable de minute + 10 secondes systématiquement.
Si je ne me trompe pas, le watchdog hardware est de 10s, il doit y avoir une boucle quelque part qui dure trop longtemps et qui fait rebooter le systeme. Je vais regarder ça.Pierre
-
J'ai trouvé ce qui faisait planter le programme. Il faut modifier la taille maximale des datas en mode standard. Certaines dépassent les 16 octets et peuvent monter à 98 octets.
Il n'y a plus de problème avec le code suivant:
struct _ValueList
{
ValueList *next; // next element (for compatibility)
char name[16]; // LABEL of value name
//char value[16]; // value
char value[98]; //Changed for standard type
uint8_t checksum; // checksum
uint8_t flags; // specific flags
uint8_t free; // checksum
uint8_t filler; // unused, for boundary
};Il faut aussi changer la ligne suivante
memset(me->value, 0, 16); en memset(me->value, 0, 98);Je pense que la vérification des TAG valide devrait etre fait dans la classe TInfo et pas dans la classe webClient. Cela permettrait d'avoir quelque chose de plus générique. Tu peux regarder ce que j'ai écrit dans mon fork de ton répo
Pierre
-
Bonsoir à tous, je n'ai toujours pas de Github mais ma version "remasterisée" pour Linky en mode Standard et Jeedom avec la dernière version du plugin Teleinfo (requette en mode POST en non plus GET) fonctionne. Il me reste à finaliser les interface EmonCMS (que je ne peux pas tester) et MQTT.
Les sources sont ici avec un bin compilé pret à flasher : https://drive.google.com/drive/folders/1SxTt7uEn-4zt3LfUq1NbdaFKlY1nju0r?usp=sharing@Charles libre à vous de récupérer ces sources et de les intégrer a votre travail, ce serait avec plaisir.
-
Nouvelle version dans disponible (au même endroit), correction d'un bug sur la réception des trames et amélioration de la gestion des tags de début et fin de paquets/trames
-
Encore une nouvelle version (25/05/2019 v2.0.1) qui corrige un bug sur la réception des données (pertes et fausses infos TIC quand le minuteur pour émettre les données à Jeedom interrompt la réception du port série). Cette version est stable mais ne gère pas encore le MQTT.
-
Je suis avec grand intérêt ce post.
Est il possible d'ajouter la prise en charge des implusions du compteur gaz (Gazpar) qui est situé juste à côté du compteur electrique ? -
Bonjour @Charles
Je ne sais pas si c'est toujours d'actualité, mais je serai intéressé par l'evolution de ta GUI. Cela à l'air top. Il y a moyen de tester en beta ? avoir accès à un repository ?
(je commence à me plonger dans le code de la Wininfo, c'est plutôt énorme
Merci!
Nicolas.