Tracker solaire DIY perturbé par perte Wifi

Et en plus, je n’ai plus ces fameuses logs qui indiquaient une mauvaise com avec l’IMU

Il te reste encore quelle longueur de cable entre l’ESP et l’IMU ?

Non, je dois avoir 10 cm de rab mais j’aimerai bien garder de la marge.

Mais depuis que j’ai bien réglé les butées soft, je n’ai plus ces logs, donc que du bonheur :heart_eyes:

1 « J'aime »

Après avoir vérifier la connectique de mon ancien anémomètre, je l’ai refait à neuf et il fonctionne de nouveau mais je n’ai pas ces caractéristiques donc je vais devoir l’étalonner avec un autre anémomètre…

Avec la configuration que je lui avais mis, il m’indiquait des pointes à plus de 100 km/h et me basculait donc le traqueur en mode storm :wink: , au moins, ça fonctionne :grin:

Depuis, j’essaie de lisser les pics avec un filtre sliding_window_moving_average comme ceci :

substitutions:
  offset_anemo: 0                 # Calibration de l'anémomètre
  rapport_kmh_v: 90               # Rapport entre la vitesse du vent relevé
                                  # par l'anémomètre et la tension relevée
                                  # (1v - 25m/s => 90 km/h) (m/s *3.558=km/h)
  boucle_asserv_anemo: '100ms'    # vitesse de la boucle d'asservissement
                                  # (utilisée pour les calculs internes de
                                  # l'asservissement de l'anémomètre)
  boucle_mesure_anemo: '1s'       # vitesse de la boucle de mesure des
                                  # données remontées dans HA de l'anémomètre

sensor:
  # Description :
  #   Récupération de la tension sur l'anémomètre
  # Utilisation :
  #   - calcul de la vitesse du vent 'vent_kmh'
  - platform: adc
    pin: GPIO34
    name: "Anémomètre"
    id: anemo_tension
    internal: $KEEP_INTERNE
    filters:
    - offset : $offset_anemo
    - sliding_window_moving_average: 
        window_size: 50                   # Moyenne sur 5s
        send_every: 10                    # Envoi toutes les 1s
    - clamp:
        min_value: 0.1
        max_value: 3.0
        ignore_out_of_range: False
    attenuation : 12db # Range 0,075 V ~ 3,12 V
    accuracy_decimals: 2
    unit_of_measurement: V
    update_interval: $boucle_asserv_anemo

  # Description :
  #   Calcul de la vitesse du vent en Km/h
  #   Cette vitesse du vent permet la mise en mode tempête (traqueur en position de sécurité).
  # Utilisation :
  #   - calcul de la vitesse du vent 'vent_kmh'
  - platform: template
    id: vent_kmh
    unit_of_measurement: Km/h
    internal: $KEEP_INTERNE
    update_interval: $boucle_asserv_anemo
    lambda: return (id(anemo_tension).state)*$rapport_kmh_v;
    filters: 
    - clamp:
        min_value: 5
        max_value: 150
        ignore_out_of_range: False
    on_value_range:
      - above: 100                   # Valeur max de vent autorisé
        then:
          - switch.turn_on: storm_mode

  # Description
  #   Ces capteurs sont des copies des capteurs qui sont remonter dans HA à la   fréquence choisie par la variable 'boucle_mesure'
  # Utilisation :
  #   - Remontés dans HA
  - platform: template
    name: Vitesse vent
    unit_of_measurement: Km/h
    accuracy_decimals: 0
    update_interval: $boucle_mesure_anemo
    lambda: return id(vent_kmh).state;

Le passage en mode fonctionne correctement, mais je cherche comment repasser en “mode asservi” si, pendant X minutes, le vent est repassé en dessous d’une valeur $vitesse_vent_faible

tu peux essayer quelque chose comme ça

  # Description :
  #   Calcul de la vitesse du vent en Km/h
  #   Cette vitesse du vent permet la mise en mode tempête (traqueur en position de sécurité).
  # Utilisation :
  #   - calcul de la vitesse du vent 'vent_kmh'
  - platform: template
    id: vent_kmh
    unit_of_measurement: Km/h
    internal: $KEEP_INTERNE
    update_interval: $boucle_asserv_anemo
    lambda: return (id(anemo_tension).state)*$rapport_kmh_v;
    filters: 
    - clamp:
        min_value: 5
        max_value: 150
        ignore_out_of_range: False
    on_value_range:
      - above: $seuil_alerte_vent_ON                   # Valeur max de vent autorisé
        then:
          - binary_sensor.turn_on: alerte_vent
      - below: $seuil_alerte_vent_OFF                   # Valeur de vent retour normal
        then:
          - binary_sensor.turn_off: alerte_vent

binary_sensor:
  - platform: template
    id: alerte_vent
    name: alerte vent
    filters:
      - delayed_on: 100ms
      - delayed_off: $duree_retour_vent_faible
    on_press:
      - switch.turn_on: storm_mode
    on_release:
      - switch.turn_off: storm_mode

par contre si tu as un coup de vent la nuit et que ça redevient vent faible, tu vas sortir du storm_mode.

Faudrait ajouter quelques conditions.

switch:
  - platform: template
    id: storm_mode
    name: "Mode intemperie"
    icon: "mdi:weather-lightning-rainy"
    optimistic: True
    on_turn_on:
     - switch.turn_on: night_mode
    on_turn_off:
     - if:
        condition:
          - sun.is_above_horizon: 
        then:
          - switch.turn_off: night_mode

  - platform: template
    id: night_mode
    name: "Mode nuit"
    icon: "mdi:weather-night"
    optimistic: True
    on_turn_on:
      - lambda: return id(sunTangage).publish_state($repos_tangage); #Angle elevation repos
      - lambda: return id(sunRoulis).publish_state($repos_roulis); #Angle azimuth repos

sun:
  latitude: $HOME_LAT
  longitude: $HOME_LON
  on_sunrise:
    - then:
      - if:
          condition:
            - switch.is_off: storm_mode
          then:
            - switch.turn_off: night_mode # Asservir vers position du levée du soleil

  on_sunset:
    - then:
      - switch.turn_on: night_mode # Mettre en position de repos/vent à presque horizontal, avec légère pente pour écoulement pluie
      - number.to_min: number_roulis # RàZ le soir
      - number.to_min: number_tangage # RàZ le soir
          
        

Une proposition avec les conditions.
J’ai séparé storm et night.

Faut aussi penser à changer storm_mode à night_mode dans les sensors sunRoulis et sunTangage

Tu me dira si ça fonctionne. Je n’ai pas encore un anémomètre, bien que je pourrais en simuler un …

Apparemment, en suivant ton code :

# Description :
  #   Calcul de la vitesse du vent en Km/h
  #   Cette vitesse du vent permet la mise en mode tempête (traqueur en position de sécurité).
  # Utilisation :
  #   - calcul de la vitesse du vent 'vent_kmh'
  - platform: template
    id: vent_kmh
    unit_of_measurement: Km/h
    internal: $KEEP_INTERNE
    update_interval: $boucle_asserv_anemo
    lambda: return (id(anemo_tension).state)*$rapport_kmh_v;
    filters: 
    - clamp:
        min_value: 5
        max_value: 150
        ignore_out_of_range: False
    on_value_range:
      - above: $seuil_alerte_vent_ON                   # Valeur max de vent autorisé
        then:
          - binary_sensor.turn_on: alerte_vent
      - below: $seuil_alerte_vent_OFF                   # Valeur de vent retour normal
        then:
          - binary_sensor.turn_off: alerte_vent

binary_sensor:
  - platform: template
    id: alerte_vent
    name: alerte vent
    filters:
      - delayed_on: 100ms
      - delayed_off: $duree_retour_vent_faible
    on_press:
      - switch.turn_on: storm_mode
    on_release:
      - switch.turn_off: storm_mode

J’ai eu cette erreur à la validation du code (j’ai remplacé alerte_vent par wind_alert) :

binary_sensor.turn_on n’est apparemment pas possible sous ESPHome.

J’ai donc dû modifier le code (avec l’aide de Copilot :wink: ) comme ceci :

(en rouge, ce qui va être supprimé, en vert ce qui est ajouté)

Voici le code modifié qui passe la validation :

  # Description :
  #   Calcul de la vitesse du vent en Km/h
  #   Cette vitesse du vent permet la mise en mode tempête (traqueur en position
  #   de sécurité).
  # Utilisation :
  #   - calcul de la vitesse du vent 'vent_kmh'
  - platform: template
    id: vent_kmh
    unit_of_measurement: Km/h
    internal: $KEEP_INTERNE
    update_interval: $boucle_asserv_anemo
    lambda: |-
      float vitesse = (id(anemo_tension).state)*$ratio_kmh_v;
      if (vitesse > $high_wind_threshold) {
        id(wind_alert).publish_state(true);
      } else if (vitesse < $low_wind_threshold) {
        id(wind_alert).publish_state(false);
      }
      return vitesse;
    filters: 
      - clamp:
          min_value: 5
          max_value: 150
          ignore_out_of_range: False

Autre petite question.

Je viens de voir dans le code que l’azimut était borné de 60 à 310 mais il est pas censé être négatif :thinking:

  # Description
  #   Récupération de l'azimuth du soleil en bornant sa valeur via le filtre
  #   'clamp'. Toute valeur inférieure sera bornée par la valeur de 'min_value'.
  #   Toute valeur supérieure sera bornée par la valeur de 'max_value'.
  #   Les valeurs de 'min_value' et 'max_value' sont à définir en fonction de
  #   l'emplacement géographique du panneau.
  #   Ce calcul n'est pas remonté à HA ('internal: $KEEP_INTERNE')
  # Utilisation :
  #   - capteurs sunX et sunY
  - platform: sun
    name: Sun Azimuth
    id: sunAzimuth
    type: azimuth
    internal: $KEEP_INTERNE
    filters: 
#      - lambda: |-
#          if(isnan(x)){return {};}
#          else{return x;}
      - offset: $offset_azimuth
      - clamp:
          min_value: 60
          max_value: 310
          ignore_out_of_range: False

pour ma position, j’ai trouvé ce schéma qui indique bien une valeur négative sur le lever du soleil :

Pourtant, ça fonctionne, j’ai du mal à comprendre pourquoi :thinking:

Tu peux trouver une définition ici Azimut — Wikipédia

Ensuite tout est une question de convention.
Pour faire un tour, il faut 360°.
Tu peux faire du -180;+180, ou 0;360, ou -90;270.

1 « J'aime »

@Scorpix , bonjour à toi et désolé de te déranger de nouveau mais j’ai un soucis de mise à jour avec le code ESPHome.

Lorsque je mets ceci :

esp32:
  board: esp32dev
  framework:
    type: esp-idf
    version: latest
    advanced:
      compiler_optimization: PERF # Aide si le µC est à la peine à cause des calculs

J’ai ce message d’erreur à la validation avant compilation :

Et je n’arrive pas à trouver la bonne version de platform_version, j’ai essayé avec :

Platform Version ESP-idf version
6.9.0 5.3.1

La validation passe, mais la compilation plante :

INFO ESPHome 2025.8.0
INFO Reading configuration /config/solar-tracker.yaml...
WARNING The selected ESP-IDF framework version is not the recommended one. If there are connectivity or build issues please remove the manual version.
WARNING The selected ESP-IDF framework version is not the recommended one. If there are connectivity or build issues please remove the manual version.
WARNING GPIO12 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
INFO Detected timezone 'Europe/Paris'
INFO Generating C++ source...
INFO Compiling app...
Processing solar-tracker (board: esp32dev; framework: espidf; platform: platformio/espressif32@6.9.0)
--------------------------------------------------------------------------------
Tool Manager: Installing platformio/framework-espidf @ ~3.50301.0
INFO Installing platformio/framework-espidf @ ~3.50301.0
Unpacking  [####################################]  100%          
[Errno 39] Directory not empty: '/config/.esphome/platformio/packages/framework-espidf/components/esp_driver_gptimer' 
Please manually remove the file `/config/.esphome/platformio/packages/framework-espidf/components/esp_driver_gptimer`
[Errno 39] Directory not empty: '/config/.esphome/platformio/packages/framework-espidf/components' 
Please manually remove the file `/config/.esphome/platformio/packages/framework-espidf/components`
[Errno 39] Directory not empty: '/config/.esphome/platformio/packages/framework-espidf' 
Please manually remove the file `/config/.esphome/platformio/packages/framework-espidf`
Tool Manager: Warning! Package Mirror: [Errno 17] File exists: '/config/.esphome/platformio/packages/framework-espidf'
WARNING Warning! Package Mirror: [Errno 17] File exists: '/config/.esphome/platformio/packages/framework-espidf'
Tool Manager: Looking for another mirror...
WARNING Looking for another mirror...
Unpacking  [####################################]  100%          
[Errno 39] Directory not empty: '/config/.esphome/platformio/packages/framework-espidf/components/esp_driver_gptimer' 
Please manually remove the file `/config/.esphome/platformio/packages/framework-espidf/components/esp_driver_gptimer`
[Errno 39] Directory not empty: '/config/.esphome/platformio/packages/framework-espidf/components' 
Please manually remove the file `/config/.esphome/platformio/packages/framework-espidf/components`
[Errno 39] Directory not empty: '/config/.esphome/platformio/packages/framework-espidf' 
Please manually remove the file `/config/.esphome/platformio/packages/framework-espidf`
Tool Manager: Warning! Package Mirror: [Errno 17] File exists: '/config/.esphome/platformio/packages/framework-espidf'
WARNING Warning! Package Mirror: [Errno 17] File exists: '/config/.esphome/platformio/packages/framework-espidf'
Tool Manager: Looking for another mirror...
WARNING Looking for another mirror...
Unpacking  [#####-------------------------------]   16%  00:00:10

Et ça tourne en boucle sur WARNING Looking for another mirror...:sob:
Pour info j’utilise un ESP32-WROOM-32 de ce type :

Tout d’abord, est-ce que ça fonctionne bien ? ça donne quoi le suivi et la production ?

Tu peux supprimer la ligne version: latest

ça devrait compiler à nouveau. En revanche, j’ai beaucoup de soucis sur mes autres ESP depuis cette nouvelle version 2025.8.

@Scorpix , désolé, effectivement je n’ai pas donné de nouvelle du suivi …

Alors, le suivi de la position du soleil fonctionne très bien, comme tu peux le voir sur la journée d’hier :

On voit sur la courbe des suivis des axes quelques écart de position, pour le roulis entre 9h30 et 11h30 tous les jours, pareil pour le tangage entre 12h30 et 15h30. Durant ces périodes, on peut voir que le vérin de l’axe en défaut est en permanence en fonctionnement mais le traqueur ne bouge pas car il est en buté. Mais progressivement les données de l’IMU se recalent pour arriver à la position réelle du traqueur. C’est un peu étrange mais, n’ayant pas eu le temps de m’y penché, j’ai dû laisser ce fonctionnement.

Et la “position de sécurité” (anciennement position “nuit/intempérie”) et bien appelé à chaque coucher du soleil :

Je n’ai pas encore eu le temps de valider la mise en sécurité suite à une “rafale” de vent car pas mal pris en ce moment mais dès que j’ai un peu de temps, je m’y colle …

En conclusion, ton code est parfait et j’arrive même à oublier mon traqueur pendant plusieurs jours. Que du bonheur, merci à toi !!

Pour la compilation du code avec la version ESPHome 2025.8.0, j’ai donc supprimé version: latest mais j’ai toujours des erreurs :

INFO ESPHome 2025.8.0
INFO Reading configuration /config/solar-tracker.yaml...
WARNING GPIO12 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
INFO Detected timezone 'Europe/Paris'
INFO Generating C++ source...
INFO Compiling app...
Processing solar-tracker (board: esp32dev; framework: espidf; platform: https://github.com/pioarduino/platform-espressif32/releases/download/54.03.21-2/platform-espressif32.zip)
--------------------------------------------------------------------------------
INFO Package configuration completed successfully
Tool Manager: Installing https://github.com/pioarduino/esp-idf/releases/download/v5.4.2/esp-idf-v5.4.2.zip
INFO Installing https://github.com/pioarduino/esp-idf/releases/download/v5.4.2/esp-idf-v5.4.2.zip
Unpacking  [####################################]  100%          
[Errno 39] Directory not empty: '/config/.esphome/platformio/packages/framework-espidf/components/esp_driver_gptimer' 
Please manually remove the file `/config/.esphome/platformio/packages/framework-espidf/components/esp_driver_gptimer`
[Errno 39] Directory not empty: '/config/.esphome/platformio/packages/framework-espidf/components' 
Please manually remove the file `/config/.esphome/platformio/packages/framework-espidf/components`
[Errno 39] Directory not empty: '/config/.esphome/platformio/packages/framework-espidf' 
Please manually remove the file `/config/.esphome/platformio/packages/framework-espidf`
FileExistsError: Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/platformio/__main__.py", line 103, in main
    cli()  # pylint: disable=no-value-for-parameter
    ^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/platformio/cli.py", line 85, in invoke
    return super().invoke(ctx)
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/click/decorators.py", line 33, in new_func
    return f(get_current_context(), *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/platformio/run/cli.py", line 147, in cli
    process_env(
  File "/usr/local/lib/python3.12/site-packages/platformio/run/cli.py", line 210, in process_env
    ).process()
      ^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/platformio/run/processor.py", line 81, in process
    install_project_env_dependencies(
  File "/usr/local/lib/python3.12/site-packages/platformio/package/commands/install.py", line 132, in install_project_env_dependencies
    _install_project_env_platform(project_env, options),
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/platformio/package/commands/install.py", line 149, in _install_project_env_platform
    PlatformPackageManager().install(
  File "/usr/local/lib/python3.12/site-packages/platformio/package/manager/platform.py", line 62, in install
    p.install_required_packages(force=force)
  File "/usr/local/lib/python3.12/site-packages/platformio/platform/_packages.py", line 76, in install_required_packages
    self.install_package(name, force=force)
  File "/usr/local/lib/python3.12/site-packages/platformio/platform/_packages.py", line 70, in install_package
    return self.pm.install(spec or self.get_package_spec(name), force=force)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/platformio/package/manager/_install.py", line 47, in install
    pkg = self._install(spec, skip_dependencies=skip_dependencies, force=force)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/platformio/package/manager/_install.py", line 97, in _install
    pkg = self.install_from_uri(spec.uri, spec)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/platformio/package/manager/_install.py", line 204, in install_from_uri
    return self._install_tmp_pkg(pkg_item)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/platformio/package/manager/_install.py", line 296, in _install_tmp_pkg
    shutil.copytree(tmp_pkg.path, dst_pkg.path, symlinks=True)
  File "/usr/local/lib/python3.12/shutil.py", line 600, in copytree
    return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/shutil.py", line 498, in _copytree
    os.makedirs(dst, exist_ok=dirs_exist_ok)
  File "<frozen os>", line 225, in makedirs
FileExistsError: [Errno 17] File exists: '/config/.esphome/platformio/packages/framework-espidf'

============================================================

An unexpected error occurred. Further steps:

* Verify that you have the latest version of PlatformIO using
  `python -m pip install -U platformio` command

* Try to find answer in FAQ Troubleshooting section
  https://docs.platformio.org/page/faq/index.html

* Report this problem to the developers
  https://github.com/platformio/platformio-core/issues

============================================================

Super si ça fonctionne bien !

Tu compiles sur HomeAssistant ou en local sur un PC avec ESPHome ?

Tu peux essayer de faire un clean build files. Et aussi la commande qu’ils proposent.

Je compile sur ESPHome installé sur Docker.

D’habitude, tout fonctionnait très bien mais depuis la 2025.08, j’ai ces messages…

J’ai déjà fait le clean build files mais ça n’a rien changé.

Je testerai les commandes quand je rentrerai de vacances, samedi :wink:

JE n’ai pas pu m’empêcher de tester les commandes avant de partir en vacances et ça ne sent pas très bon, j’ai une erreur E/S lorsque j’essaie de supprimer le répertoire :

Bonjour,

As-tu essayé de compiler en changeant de framework : “arduino” au lieu de “espidf”? Je n’ai pas ce problème avec le framework arduino. D’ailleurs, pour comprendre, pourquoi avoir utilisé espidf plutôt que arduino?