Etat par défaut des GPIO au reboot

Bonjour à tous,

J’utilise le code ci-dessous pour contrôler mon volet roulant à base d’un esp8266 et tout fonctionne trés bien, mon probléme c’est que lorsque je dois rebooter l’esp mon volet descent sytématiquement.
J’ai essayé restore_mode: ALWAYS_OFF; on_boot et rien n’y fait.
Auriez-vous une idée ?

esphome:
  name: volet-salon
  friendly_name: Volet salon
  on_boot: 
    priority: 600
    then: 
      - switch.turn_off: descendre_gpio
      - switch.turn_off: monter_gpio
      - switch.turn_off: stop_gpio

esp8266:
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "*************"

ota:
  - platform: esphome
    password: "***********"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "*******"
    password: "*******"

captive_portal:

# Server Web
web_server:
  port: 80

#config MQTT
mqtt:
  broker: 192.168.1.**
  username: ********
  password: *********
  port: 1883
  topic_prefix: volet-salon
  discovery_prefix: esphome
  discovery: False

# GPIO pour les commandes avec interlock
switch:
  - platform: gpio
    id: descendre_gpio
    pin:
      number: 13
      inverted: False
      mode: 
       output: True
    interlock: [monter_gpio, stop_gpio]
    on_turn_on: 
      - delay: 500ms
      - switch.turn_off: descendre_gpio
          

  - platform: gpio
    id: monter_gpio
    pin:
      number: 14
      inverted: False
      mode: 
        output: True
    interlock: [descendre_gpio, stop_gpio]
    on_turn_on: 
      - delay: 500ms
      - switch.turn_off: monter_gpio

  - platform: gpio
    id: stop_gpio
    pin:
      number: 12
      inverted: False
      mode:
        output: True
    interlock: [monter_gpio, descendre_gpio]
    on_turn_on: 
      - delay: 500ms
      - switch.turn_off: stop_gpio

  # Boutons créés avec liaison au cover
  - platform: template
    name: "Monter"
    id: monter
    turn_on_action:
      - switch.turn_on: monter_gpio
      - delay: 500ms
      - switch.turn_off: monter_gpio
      - cover.stop:
          id: volet  # Arrête le volet pour synchronisation
      - cover.control:
          id: volet
          position: 1.0  # Définit la position à ouverte

  - platform: template
    name: "Stop"
    id: stop
    turn_on_action:
      - switch.turn_on: stop_gpio
      - delay: 500ms
      - switch.turn_off: stop_gpio
      - cover.stop:
          id: volet  # Arrête le volet

  - platform: template
    name: "Descendre"
    id: descendre
    turn_on_action:
      - switch.turn_on: descendre_gpio
      - delay: 500ms
      - switch.turn_off: descendre_gpio
      - cover.stop:
          id: volet  # Arrête le volet pour synchronisation
      - cover.control:
          id: volet
          position: 0.0  # Définit la position à fermée   

  - platform: restart
    name: "volet-salon Restart" 

# Configuration pour contrôler la position
cover:
  - platform: time_based
    name: "Volet Roulant"
    assumed_state: True
    id: volet
    open_action:
      - switch.turn_on: monter_gpio
    open_duration: 20s
    close_action:
      - switch.turn_on: descendre_gpio
    close_duration: 20s
    stop_action:
      - switch.turn_on: stop_gpio

Salut,

tu peux essayer ça si ça aide.
Je pense que ça vient du fait que les pins sont flottants au démarrage car pas encore initialisés.
D’après la doc ça doit aider. (ça marche sur mon garage en tous cas.)

esp8266:
  board: esp01_1m
  early_pin_init: false

Salut,
Je viens de tester et ça ne change rien, il faut mettre seulement " early_pin_init: false" ?

Les 2 autres lignes tu les as déjà…

Voilà ce que dit la doc sur cette option:

  • early_pin_init (Optional, boolean): Specifies whether pins should be initialised as early as possible to known values. Recommended value is false where switches are involved, as these will toggle when updating the firmware or when restarting the device. Defaults to true.

Donc ça ne fonctionne pas pour moi, merci.

Faut regarder dans la doc des ESP, certains GPIO sont connu pour « glitcher » le temps de l’init. Sans doute un choix de GPIO utilisés en sortie à revoir.

Un peu de lecture :
https://rabbithole.wwwdotorg.org/2017/03/28/esp8266-gpio.html

Si je comprends bien l’idée aucune solution existe, il me faut souder sur d’autre GPIO ?

Ce que dit l’article, c’est qu’en dehors des GPIO4 et GPIO5, tu n’a aucune certitude de ne pas avoir d’état transitoires provoquant des effets non voulu.
Donc si tu n’as besoin que de 2 sorties « fiables » il faut utiliser ces deux là en priorité.
Sinon il faut passer par des mécanismes de « verrouillage » hardware (genre aucun relais ne peut être alimenté tant qu’une de ces deux sortie « fiable » n’est activé)
ou utiliser une extension I2C, dont, normalement, l’état des sorties est connu et fiable tant qu’on ne lui envoi pas une commande valide.

Faut garder à l’esprit que les GPIO de ces ESP sont destiné à s’interfacer à des périphériques rapides (communication, comptage, interruption) et que pour des capteurs / actionneurs lent (bouton, relais, etc…) on passe par des I/O déportées (I2C, SPI, etc)

Oui c’est bien ce que je voudrais faire, mais je n’y arrive pas :sweat_smile:

Je viens de faire un teste en inversant 2 pins celui de la descente et le stop, vu qu’a chaque redémarrage le volet se ferme et bien ça ne change rien mon volet se ferme quand même.
De plus avant avec espeasy je n’avais jamais remarqué ce probléme.

Les 12 13 et 14 que tu as pris correspondent à D5 D6 & D7 qui devraient être ok à être utilsés.
As-tu dejà essayé d’activer un pullup ou pulldown sur ces pins? (suivant comment tu as cablé)

Je ne comprends pas trop ce que tu veux me dire, pour le cablage chaque pin de mon esp est relié à un pin de ma télécommande et j’envois du 3v3 de l’esp vers la télécomande, pour le pullup ou pulldown je ne vois pas lequel activer ni comment.

C’est des options dans la config des pins, mais je ne sais pas si ça servirait au reboot…

De mon côté je pilote les télécommandes avec des relais entre l’esp et la télécommande…
Et je n’utilise pas de « switch », mais des « outputs » avec des « button » par dessus pour contrôler l’output. Peut-être que ça change le comportement?


esphome:
  name: "commande-volets"
  platform: ESP8266
  board: nodemcuv2

# Enable logging
logger:
  baud_rate: 0
  
uart:
  rx_pin: GPIO3
  tx_pin: GPIO1
  baud_rate: 9600
  
# Enable Home Assistant API
api:
  encryption:
    key: "D5OF7wYM="

ota:
  password: "20fd85db1"
  platform: esphome

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Commande Volet Fallback Hotspot"
    password: "zV4dGRTEDgOr"

captive_portal:

output:
  - platform: gpio
    pin: GPIO12
    id: output1
    inverted: true
  - platform: gpio
    pin: GPIO14
    id: output2
    inverted: true
  - platform: gpio
    pin: GPIO4
    id: output3
    inverted: true
  - platform: gpio
    pin: GPIO5
    id: output4
    inverted: true

button:
  - platform: output
    name: "Button ALL"
    id: btn_all
    output: output1
    duration: 400ms
    internal: true
  - platform: output
    name: "Button Down"
    id: btn_down
    output: output2
    duration: 400ms
    internal: true
  - platform: output
    name: "Button Screen"
    id: btn_screen
    output: output3
    duration: 400ms
    internal: true
  - platform: output
    name: "Button Up"
    id: btn_up
    output: output4
    duration: 400ms
    internal: true
  - platform: template
    name: "Close All"
    internal: true
    id: close_all
    on_press:
      - button.press: btn_all
      - delay: 500ms
      - button.press: btn_screen
      - delay: 500ms
      - button.press: btn_down
  - platform: template
    name: "Open All"
    internal: true
    id: open_all
    on_press:
      - button.press: btn_all
      - delay: 500ms
      - button.press: btn_screen
      - delay: 500ms
      - button.press: btn_up
  - platform: template
    name: "Close Screen"
    internal: true
    id: close_scr
    on_press:
      - button.press: btn_screen
      - delay: 500ms
      - button.press: btn_down
  - platform: template
    name: "Open Screen"
    internal: true
    id: open_scr
    on_press:
      - button.press: btn_screen
      - delay: 500ms
      - button.press: btn_up
  - platform: template
    name: "Close Shades"
    internal: true
    id: close_volets
    on_press:
      - button.press: btn_all
      - delay: 500ms
      - button.press: btn_down
  - platform: template
    name: "Open Shades"
    id: open_volets
    internal: true
    on_press:
      - button.press: btn_all
      - delay: 500ms
      - button.press: btn_up

cover:
  - platform: template
    name: "Volets"
    device_class: shutter
    open_action:
      - button.press: open_volets
    close_action:
      - button.press: close_volets
    assumed_state: true
  - platform: template
    name: "Screen"
    device_class: shade
    open_action:
      - button.press: open_scr
    close_action:
      - button.press: close_scr
    assumed_state: true
  - platform: template
    name: "Tout"
    device_class: shutter
    open_action:
      - button.press: open_all
    close_action:
      - button.press: close_all
    assumed_state: true

Je pense que la différence est le fonctionement de ta télécommande car tu mets « inverted: true » donc si j’ai bien compris tu as une tension dés le début.

Inverted = true, c’est surement lié à la façon dont j’ai cablé les relais, comme je l’ai dit je ne me branche pas directement sur la commande, je ne voulais pas risquer de mixer les tensions…

Salut,
Depuis hier j’ai avancé, maintenant mon volet se positionne tout le temps à 50%, mais je n’ai aucune idée du pourquoi ?