hallard / everblu-meters-esp32

Fetch water usage data from Cyble meters for esp8266
8 stars 2 forks source link

Problème de configuration pour ESP32WROOM32 #1

Open ed0uardb opened 10 months ago

ed0uardb commented 10 months ago

Bonjour,

Je fais des recherches sur la relève des compteurs avec everblu depuis quelques jours et les améliorations que vous avez apportées pour le déploiement sur ESP32 m'intéressent. J'ai tester le code de neutrinus sur github, je pense avoir le bon câblage au niveau des pins, le programme avait l'air de bien tourner, wifi et mqtt ok, pas de soucis pour lancer le scan, mais je n'ai jamais réussi a trouver la bonne fréquence.

J'ai comme matériel un ESP32WROOM32 (de Az-delivery), et pour le module RF une E07 (M1101D-SMA).

J'ai réussi à installer votre code cet après-midi et j'ai quelques questions si ça ne vous dérange pas et que vous avez le temps d'y répondre.

Pour installer le code sur une autre carte, esp32dev dans mon cas, dans le fichier platformio.ini ligne 20 il faut bien modifier le default_envs = c3-cc1101 par default_envs = esp32dev ? c'est ce que j'ai fait, mais pendant la compilation j'ai eu des erreurs dans everblu-meters.cpp et cc1101.cpp, concernant des variables non déclarées dans le scope.

Dans everblu-meters.cpp j'ai mis en commentaire :

 /*   // this resets all the neopixels to an off state
    strip.Begin();
    strip.Show();
    delay(100); // Needed to initialize
    DotStar_Clear();
    DotStar_SetBrightness( MY_RGB_BRIGHTNESS );   
    Wire.begin(I2C_SDA, I2C_SCL);
*/

Dans cc1101.cpp, GDO0 était considéré comme non déclaré J'ai rajouté la configuration des pins dans platformio.ini :

[env:esp32dev]
extends = env:common-esp32
board = esp32dev
lib_deps = ${env:common-esp32.lib_deps}
build_flags = ${env:common-esp32.build_flags}
    -D SerialDebug=Serial
    -D GDO0=2 -D GDO2=4         ; CC1101 wiring
    -D SPI_SS=5 -D SPI_MOSI=23   ; SPI 
    -D SPI_CSK=18 -D SPI_MISO=19  ; SPI 

Après ces modifications j'ai pu compiler et charger le code. Je pense avoir réussi a trouver la bonne fréquence, j'ai eu 2 confirmations via mqtt : {"date":"10/10/2023 16:06:20","ts":1696946780,"min":"433.8599","max":"433.8663","frequency":"433.8631"} {"date":"10/10/2023 16:27:06","ts":1696948026,"min":"433.8524","max":"433.8647","frequency":"433.8583"}

Je suis un peu dubitatif sur la différence des résultats obtenus ...

Pour le moment le module est débranché, quand je le redémarrerai va-t-il recommencer un scan ou va-t-il utiliser la fréquence trouvée ? le paramètre -D FORCE_SCAN (ligne 42 dans platformio.ini) étant toujours actif dans mon ESP32 sans rechargement du code.

J'ai refais la manipulation en reprenant le code d'origine, j'ai juste changé default_envs = esp32dev et renseigné les infos pour le wifi, le mqtt, et le serial pour l'everblu. Ca m'affiche ces erreurs dans VisualCode. Capture

EDIT 11/10/23

J'ai rebrancher mon ESP ce matin sur un chargeur usb, il a relancé automatiquement le scan, je l'ai donc laissé faire. Une fois la fréquence trouvée j'ai reçu ce message mqtt : {"date":"11/10/2023 10:00:48","ts":1697011248,"min":"433.8353","max":"433.8706","frequency":"433.8528"}

Puis l'ESP est entré en mode sleep (le programme considère que l'esp fonctionne sur batterie comme l'espc3). j'ai relancer l'esp avec le bouton RST, et là j'ai reçu ce message mqtt : {"ts":1697011251,"date":"Wed Oct 11 10:00:51 2023","esp_battery":{"percent":0,"vbat":0},"liters":344078,"battery":141,"read":66,"rssi":-76,"lqi":-119,"hours":"06:18"}

La relève s'est donc bien passé, c'est bon signe ! mais ce dernier message mqtt aurait du être envoyé avant le mode sleep en même temps que la confirmation de la fréquence je pense ? Ensuite l'esp a recommencé à faire un scan !

J'ai donc désactivé le paramètre ;-D FORCE_SCAN (ligne 42 dans platformio.ini) et changé la fréquence dans everblu-meters.cpp ligne 423 (c'est bien le bon endroit pour modifier la fréquence ?) float frequency = preferences.getFloat("frequency", 433.85280f);

Compilation, recharge du code dans l'ESP, et là pas de lecture possible ... { "ts": 1697012483, "date": "Wed Oct 11 10:21:23 2023", "esp_battery": { "percent": 0, "vbat": 0 }, "type": "No Data", "retries": 5 }

Voilà où j'en suis pour le moment, j'ai pas envie de vider la pile de l'everblu donc j'évite de faire trop de tests inutiles. Je vais réessayer dans la semaine un scan de fréquence en plaçant l'ESP au plus proche du compteur.

EDIT 12/10/23

Aujourd'hui nouveau test de relève ==> Echec

Reload du firmware avec -D FORCE_SCAN activé. J'ai branché l'ESP sur un powerbank pour le poser juste au dessus du regard du compteur d'eau.

Test de fréquence OK, mais relève NOK

{"date":"12/10/2023 11:34:28","ts":1697103268,"min":"433.7691","max":"433.8329","frequency":"433.8008"}
{"ts":1697103272,"date":"Thu Oct 12 11:34:32 2023","esp_battery":{"percent":0,"vbat":0},"type":"No Data","retries":4}

Il a alors relancé automatiquement un nouveau scan OK, et cette fois-ci une relève OK

{"date":"12/10/2023 11:50:38","ts":1697104238,"min":"433.7691","max":"433.7992","frequency":"433.7841"}

{"ts":1697104242,"date":"Thu Oct 12 11:50:42 2023","esp_battery":{"percent":0,"vbat":0},"liters":344367,"battery":141,"read":98,"rssi":-24,"lqi":-128,"hours":"06:18"}

J'ai réussi à faire 2 relèves, uniquement en mode "scanning", avec 2 fréquences trouvées ... 433.8528Mhz et 433.7841Mhz.

Ensuite j'ai rechargé le firmware en mode "normal" (;-D FORCE_SCAN) et en remettant la fréquence par défaut 433.82000Mhz.

--- Terminal on COM5 | 115200 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
18:51:05.060 > ts Ju[  2026][E][Preferences.cpp:503] getBytesLength(): nvs_get_blob len fail: frequency NOT_FOUND
18:51:05.060 >
18:51:05.060 > ================================
18:51:05.060 > Device Name   : cyble-20-0507012-espxxxxx
18:51:05.060 > Wakeup by     : not from sleep:0
18:51:05.060 > Meter Year    : 20
18:51:05.060 > Meter Serial  : 507012
18:51:05.060 > SPI Speed     : 1.0MHz
18:51:05.060 > Frequency     : 433.8200MHz
18:51:05.060 > Retries left  : 5/6
18:51:05.060 > Retries delay : 15
18:51:05.060 > ===========================
18:51:05.060 > CC1101 Version : 0x0014
18:51:05.060 > Found CC1101
18:51:05.060 > Trying to connect WiFi.
18:51:05.060 > WiFi: Connecting to wifixxx ... (2.936000s)
18:51:05.060 > ..WiFi: Connected (3.938000s), ip : 192.168.1.11
18:51:05.060 > [  3944][E][WiFiServer.cpp:91] begin(): ---------------- IPv6
18:51:05.060 > [  3946][E][WiFiServer.cpp:86] begin(): ---------------- IPv4
18:51:05.060 > WEB: Updater ready, open http://cyble-20-0507012-espxxxxx.local in your browser and login with username 'xxxxx' and password 'xxxxx'.
18:51:05.060 > *MQTT: Connecting to broker "192.168.1.46" with client name "cyble-20-0507012-espxxxxx" and username "xxxxx" ... (4.480000s) - ok. (4.604000s)
18:51:05.060 > ****** Connected to MQTT Broker *****
18:51:05.060 > *
18:51:05.060 > Connected in 3s
18:51:05.060 > Waiting for time sync
18:51:05.834 > ***** Got time adjustment from NTP *****
18:51:05.839 > Next wake tomorrow at October 13 2023 15:00:00 (in 72535 seconds)
18:51:05.991 > 
18:51:05.992 > Synced in 3s
18:51:05.994 > Setting to 433.820007.4fMHz
18:51:05.998 > Trying Reading #1 out of 6 from meter
18:51:06.007 > MARCSTATE : raw:0x13  0x13 free_byte:0x0F sts:0x02 sending 2s WUP...
18:51:07.997 > txbuffer:
18:51:08.001 > 0x50, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0x64, 0x70, 0x47, 0x00, 0x75, 0x17, 0x14,
18:51:08.008 > 0x77, 0x07, 0x1E, 0xF1, 0x0F, 0x00, 0x75, 0x17, 0x02, 0x72, 0x87, 0x05, 0x71, 0x47, 0x00, 0x72,
18:51:08.017 > 0x87, 0x01, 0x77, 0xEF, 0x6A, 0xFF, 0xFF,
18:51:08.189 > 204 free_byte:0x0C sts:0x07
18:51:08.219 > 
18:51:08.220 > size_byte=18  l_radian_frame_size_byte=25
18:51:08.369 > TMO on REC
18:51:08.399 > 
18:51:08.401 > size_byte=124  l_radian_frame_size_byte=171
18:51:09.100 > TMO on REC
18:51:09.103 > No data, are you in business hours?
18:51:09.108 > MQTT << [everblu/cyble-20-0507012-espxxxxx/error] {"ts":1697129468,"date":"Thu Oct 12 18:51:08 2023","esp_battery":{"percent":0,"vbat":0},"type":"No Data","retries":1}
18:51:09.576 > 5 retries left out of 6
18:51:12.610 > MQTT << [everblu/cyble-20-0507012-espxxxxx/sleep_until] {"seconds":15,"ts":1697129487,"date":"Thu Oct 12 18:51:27 2023"}18:51:12.661 > Going to deep sleep mode for 15 seconds

    *************************J'ai enlevé le milieu du serial monitoring************************************************************

18:53:04.303 > MQTT << [everblu/cyble-20-0507012-espxxxxx/sleep_until] {"seconds":15,"ts":1697129598,"date":"Thu Oct 12 18:53:18 2023"}18:53:04.353 > Going to deep sleep mode for 15 seconds
18:53:20.596 > ets Jul 29 2019 12:21:46
18:53:20.601 >
18:53:20.601 > rst:0x5 (DEEPSLEEP_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
18:53:20.605 > configsip: 0, SPIWP:0xee
18:53:20.607 > clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
18:53:20.614 > mode:DIO, clock div:2
18:53:20.617 > load:0x3fff0030,len:184
18:53:20.715 > load:0x40078000,len:12732
18:53:20.715 > ␛[33m=> 0x40078000: ?? ??:0␛[0m
18:53:20.715 > ho 0 tail 12 room 4
18:53:20.715 > load:0x40080400,len:2908
18:53:20.998 > ␛[33m=> 0x40080400: _init at ??:?␛[0m
18:53:20.998 > entry 0x400805c4
18:53:20.998 > ␛[33m=> 0x400805c4: ?? ??:0␛[0m
18:53:22.678 > [  2027][E][Preferences.cpp:503] getBytesLength(): nvs_get_blob len fail: frequency NOT_FOUND
18:53:22.688 >
18:53:22.688 > ================================
18:53:22.692 > Device Name   : cyble-20-0507012-espxxxxx
18:53:22.696 > Wakeup by     : timer
18:53:22.697 > Meter Year    : 20
18:53:22.699 > Meter Serial  : 507012
18:53:22.703 > SPI Speed     : 1.0MHz
18:53:22.705 > Frequency     : 433.8200MHz
18:53:22.705 > Retries left  : 1/6
18:53:22.707 > Retries delay : 15
18:53:22.709 > ===========================
18:53:22.711 > CC1101 Version : 0x0014 
18:53:22.713 > Found CC1101
18:53:22.957 > Trying to connect WiFi.
18:53:23.515 > WiFi: Connecting to wifixxx ... (2.860000s) 
18:53:23.961 > ..WiFi: Connected (3.861000s), ip : 192.168.1.11 
18:53:24.519 > [  3867][E][WiFiServer.cpp:91] begin(): ---------------- IPv6
18:53:24.525 > [  3868][E][WiFiServer.cpp:86] begin(): ---------------- IPv4
18:53:24.531 > WEB: Updater ready, open http://cyble-20-0507012-espxxxxx.local in your browser and login with username 'xxxxx' and password 'xxxxx'.
18:53:25.003 > *MQTT: Connecting to broker "192.168.1.46" with client name "cyble-20-0507012-espxxxxx" and username "xxxxx" ... (4.403000s) - ok. (4.846000s) 
18:53:25.947 > ****** Connected to MQTT Broker *****
18:53:26.449 > *
18:53:26.501 > Connected in 3s
18:53:26.503 > Waiting for time sync
18:54:26.756 > Unable to sync time in 60s
18:54:54.607 > Going to deep sleep mode for 3600 seconds

J'ai aussi essayé le mqtt.enableHTTPWebUpdater(); // Enable the web updater., ça fonctionne bien. Par contre mqtt.enableDebuggingMessages(); // Enable debugging messages sent to serial output est bien censé envoyé les messages de serial monitor par MQTT ? je ne crois pas que ça fonctionne pas. //mqtt.enableLastWillMessage(String(topic + "lastwill").c_str(), "offline", true); empêche la connexion au broker mqtt.

mqtt.enableOTA(); // Enable OTA (Over The Air) updates. Je ne comprends pas comment ça fonctionne.

rommess commented 10 months ago

Pour apporter ma petite pierre, perso j'ai utilisé le code de psykokwak-com avant que hallard sorte le sien (qui est bien optimisé faut l'avouer) Ton cas: les deux frequences trouvées sont peut etre, en fonction de ton emplacement, ton compteur ainsi que celui de ton voisin.. Tu peux monitorer ton ESP via le cable usb pour avoir le debug en serie via putty par exemple, ainsi voir si il scan ou si il essaye de lire ton compteur (en fonction de l'heure que tu as mis.)

ed0uardb commented 10 months ago

Merci pour ta réponse, Avec le n° de série qu'on ajoute dans le fichier de config ça n'est pas censé réveiller uniquement le module everblu concerné ? J'ai aussi essayé le code de psykokwak, mais je n'ai pas réussi a obtenir de résultat pour la fréquence. Je me demande si l'alimentation de mon port USB est assez stable, car une fois le code de hallard installé et comme il permet de suivre le scan par mqtt, j'ai branché l'ESP sur un chargeur usb et là j'ai trouvé les 2 fréquences.

rommess commented 10 months ago

alors, as tu pu avancer sur ton scan ? met ton pc portable directement a coté du compteur everblue et monitor ca en direct. Des que tu as la fréquence, alors injecte la dans le code.

hallard commented 10 months ago

Désolé j'arrive juste sur le sujet, la petite subtilité est

float frequency = preferences.getFloat("frequency",  433.82000f);

En fait ça prends la dernière fréquence sauvée et met 433.82000f si il n'y en a jamais eu (donc après un scan elle peut être sauvée et dans ce cas il ne prend pas le 2eme paramètre)

donc pour la mettre manuellement tu dois la supprimer de la config avec un remove

preferences.remove("frequency");
float frequency = preferences.getFloat("frequency",  tafrequence);

tu build et flash (ce qui au 1er boot va sauver ta fréquence) et ensuite tu commentes à nouveau le remove

//preferences.remove("frequency");

tu build et reflash

Bien entendu le tout avec le FORCE_SCAN désactivé :-)

ed0uardb commented 10 months ago

Désolé j'arrive juste sur le sujet, la petite subtilité est

float frequency = preferences.getFloat("frequency",  433.82000f);

En fait ça prends la dernière fréquence sauvée et met 433.82000f si il n'y en a jamais eu (donc après un scan elle peut être sauvée et dans ce cas il ne prend pas le 2eme paramètre)

donc pour la mettre manuellement tu dois la supprimer de la config avec un remove

preferences.remove("frequency");
float frequency = preferences.getFloat("frequency",  tafrequence);

tu build et flash (ce qui au 1er boot va sauver ta fréquence) et ensuite tu commentes à nouveau le remove

//preferences.remove("frequency");

tu build et reflash

Bien entendu le tout avec le FORCE_SCAN désactivé :-)

Merci pour ta réponse, j'avais compris comment supprimer la fréquence sauvegarder mais pas comment l'injecter manuellement.

Mon problème c'est de n'avoir jamais la même fréquence lors du scan avec relève OK dans la foulée. A chaque fois que j'ai eu un test scan OK, j'ai build reflash avec le 'FORCE_SCAN' désactivé, mais la relève ne fonctionne pas, tout les retry renvoient 'no data'. Est-il possible que mon module CC1101 soit instable au niveau de sa fréquence ? Est-ce que d'être sur une breadboard avec des fils dupont peut rendre le système instable ?

hallard commented 10 months ago

Tous les CC1101 que j'ai fonctionnent correctement c'est de ebytes et pas les clones avec parfois des crystal pas très précis (et variant avec la temperature) Clairement le breadboard peut jouer :-)

si tu es sur PI j'ai qq modules https://www.tindie.com/products/hallard/cc1101-mini-shield-for-raspberry-pi/ sinon il doit me rester qq proto ESP32 C3 aussi

image

C'est sur ceux la que tourne le code avec la batterie :-)

rommess commented 10 months ago

hello @ed0uardb , est ce que tu utilise MQTT avec Home Assistant ? si oui est ce que l'entité everblu/cyble-xx-espxx remonte automatiquement dans ton intégration MQTT ?

ed0uardb commented 10 months ago

hello @ed0uardb , est ce que tu utilise MQTT avec Home Assistant ? si oui est ce que l'entité everblu/cyble-xx-espxx remonte automatiquement dans ton intégration MQTT ?

Salut @rommess Aucun problème niveau MQTT, j'ai bien mon topic qui remonte sur mon Jeedom, mais pour les tests j'utilise MQTT Explorer. Dans l'ensemble tout fonctionne bien, juste ce problème d'instabilité sur la fréquence à utiliser... ça semble plus être un problème matériel que logiciel.

ed0uardb commented 10 months ago

Salut @hallard,

En fait tu créés toi même tes PCB et tu soudes tout ? Si tu as un proto esp32 C3 je suis éventuellement preneur. Quel est le tarif ? j'ai essayé de trouver un autre module CC1101 mais à part les clones chinois cheap, les prix sont hauts avec parfois plus de frais de port.

rommess commented 10 months ago

Jeedom donc, merci pour ta réponse. Utilisant le même matériel que toi (esp32 dev kit v1 et le CC1101) et le code de hallard (suite au remplacement de mon compteur de 2009 par un de 2023, pas de problème pour qu'il trouve la frequence des le debut du run (meme sans le force_scan)

Perso, en terme de cablage j'ai ca (fait pas attention au couleurs, c'etait pour moi) CC1101 <-> ESP32 1.GND noir GND 2.VCC (3V3) rouge 3V3 3.GOD0 (GDO0) jaune D22 4.CSN (SPI chip select) vert D5 5.SCK (SPI clock) orange D18 6.MOSI (SPI MOSI) bleu D23 7.GOD1 (SPI MISO) marron D19 8.GOD2 (GDO2) D21

Comme tu dis, peut etre un probleme materiel sur ton cc1101 ..

hallard commented 10 months ago

En fait tu créés toi même tes PCB et tu soudes tout ?

Disons que je fais assembler, avant oui je faisais à la main et avec mon four c'était sport :-)

Si tu as un proto esp32 C3 je suis éventuellement preneur. Quel est le tarif ?

Oui il me reste qq boards assemblées (celle de la photo précédente) la board [env:c3-cc1101] dans le platformio.ini vu le prix que j'ai payé pour les proto je peux te la faire à 25€ port compris en lettre suivi. Elle contient le chargeur de batterie et le chip I2C pour monitorer la batterie aussi.

sinon tu peux prendre celle sur tindie qui contient juste un CC1101 de chez ebyte qui eux sont d'excellente qualité mais tu devras souder les Pin du SPI depuis entre ton ESP la carte.

ed0uardb commented 10 months ago

@rommess

CC1101 <--> ESP32

  1. GND GND
  2. VCC 3V3
  3. GDO0 GPIO2
  4. SCK GPIO18
  5. MOSI GPIO23
  6. MISO GPIO19
  7. CSN GPIO5
  8. GDO2 GPIO21

Dans mes notes le GDO0 se branchait sur GPIO22, mais je sais pas pourquoi sur mon montage et dans le code j'ai mis sur le GPIO2. Je retesterai sur le GPIO22

Tu as quoi comme module CC1101 ?

rommess commented 10 months ago

le V2, E07-M11010 en cables dupont sur l'esp

hallard commented 10 months ago

le V2, E07-M11010 en cables dupont sur l'esp

un module EByte, pas de secret :-)

ed0uardb commented 10 months ago

@hallard

Par acquis de conscience je vais refaire un test demain et si ce n'est pas concluant je prendrai ton esp32 c3 Je te confirme ça demain soir.

Si c'était pour moi je m'accommoderai de ce problème en refaisant le scan à chaque fois, mais comme c'est pour mon père qui a besoin de faire une relève par mois, il faut que ça soit stable et simple à utiliser. L'idéal ça aurait été un esp32 avec un petit écran : on allume on attend que la relève s'affiche et hop on éteint. Mais c'est hors de mes compétences ou alors ça me prendrai des mois !

hallard commented 10 months ago

Ya un connecteur QWIIC pour un afficheur OLED sur la carte ESP32 tu dois pouvoir y connecter un truc comme ça (ok faudra ré écrire un peu de code) https://www.amazon.fr/DollaTek-Module-Broches-Interface-Arduino/dp/B07QJW7Z4C

je te mettrais le cordon qui va bien si tu veux.

ed0uardb commented 10 months ago

J'ai compris mon erreur ! Trop de manipulation à brancher débrancher l'usb de l'esp32. Dans les premiers tests je n'arrivai pas du tout à trouver la fréquence, j'ai donc par la suite fait mes tests en branchant l'esp32 sur un powerbank près du compteur, le problème c'est qu'en rebranchant l'esp32 sur mon pc pour le flasher ça remet en route le programme avec le 'FORCE_SCAN' activé :

#if defined FORCE_SCAN float frequency = preferences.getFloat("frequency", 0.0f);

je flash et quand je relance l'esp32 sur la powerbank la fréquence est de nouveau celle par défaut 433.82000f.

J'ai donc entré manuellement ma dernière fréquence qui a fonctionnée ce matin 433,7830 comme expliqué par @hallard, tout ça en laissant bien l'esp branché sur le pc pour ne pas provoquer le redémarrage du programme.

donc pour la mettre manuellement tu dois la supprimer de la config avec un remove

`preferences.remove("frequency");

float frequency = preferences.getFloat("frequency", tafrequence);`

tu build et flash (ce qui au 1er boot va sauver ta fréquence) et ensuite tu commentes à nouveau le remove

//preferences.remove("frequency");

tu build et reflash

Bien entendu le tout avec le FORCE_SCAN désactivé :-)

Maintenant ça fonctionne, si je souhaite faire une relève j'ai juste à brancher mon esp32 et attendre ma trame mqtt.