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
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
, au moins, ça fonctionne
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 ) 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
# 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
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.
@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...
…
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
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?