Première "mauvaise surprise" en usage réel depuis ma migration

Bonjour,

Première « mauvaise surprise » en usage réel depuis ma migration …

Le script ci-joint déclenché hier soir pour passer la maison en mode nocturne est resté « bloqué » en running toute la nuit sur la séquence de fermeture du groupe de volets # Shutters to close et n’a donc jamais exécuté les opérations suivante.

En cause un des volets du groupe qui n’a probablement jamais été considéré « fermé », pourtant physiquement bien fermé.
Probablement qu’il a fermé jusqu’à 1% et n’a donc pas atteint 0%, ça se produit parfois avec les modules fibaro, l’état de position s’arrête à 1% de de la fin aussi bien en fermeture qu’en ouverture, il m’est arrivé d’avoir des volets ouverts à 98% au lieu de 99%.
Et généralement une simple commande de fermeture ou d’ouverture supplémentaire le fait passer de 98 à 99% ou de 1 à 0% sans même que le moteur ne doive tourner physiquement.
Une recalibration peut parfois être nécessaire.

Toujours est-il que je ne m’attendais pas à ce que cela puisse bloquer complètement mon script, et que donc par exemple la défaillance d’un équipement puisse mettre au sol tout un process.
Imaginons qu’un des volets tombe vraiment en panne alors touts les scripts sensés le piloter vont donc bloquer dessus ?

Toujours aussi étonnant c’est qu’après avoir renvoyé ce matin une commande de fermeture manuellement sur le volet qui devait être fermé via le bouton de sa carte lovelace et l’avoir vu passer à l’état « fermé » instantanément sans que le volet ne bouge physiquement vu qu’il était déjà fermé, le script ne s’est pas « débloqué » pour autant, j’ai donc finalement stoppé son exécution moi-même.
Et d’après son historique il était vraiment bloqué sur cette étape car l’étape suivant # Check for opened access point était « non exécutée » et la timeline spécifiait « still running » depuis 7h

J’ai relancé le script juste après l’avoir tué et il s’est parfaitement exécuté jusqu’à la fin vu que les volets étaient à ce moment encore tous fermés.

L’idéal serait de ne pas attendre sur l’exécution du service cover.cover_close mais hormis mettre cette action dans une couche de script supplémentaire pour pouvoir l’exécuter avec un script.turn_on je ne vois pas trop comment éviter que cela se reproduise.

Le problème c’est que j’ai d’autres scripts de transition de mode qui eux aussi doivent positionner les volets, comme celui qui passe la maison en « mode absence », et pour lesquels un blocage de l’exécution pour une raison secondaire serait bien plus problématique.
Et devoir ajouter une couche supplémentaire de script pour toutes les actions sur volet serait assez lourd et encombrant dans la configuration.

En gros, comment feriez vous pour éviter que ce problème ne puisse se reproduire ?

Et pourrait-il arriver aussi sur un service « light.turn_off » sur un groupe de lumières si une des lumières du groupe était injoignable par exemple et ne passait donc pas en état « éteint » ?

###########
# SCRIPTS #
###########
script:
  #----------------------------------------
  # Transition to Home Mode Night
  #----------------------------------------
  home_mode_night:
    alias: "Home Mode Night"
    icon: "mdi:weather-night"
    description: "Switch Home to Night Mode"
    mode: single

    sequence:
      # Kill other modes scripts
      - service: script.turn_off
        target:
          entity_id:
            - script.home_mode_away
            - script.home_mode_presence
            - script.home_mode_bedtime

      # Light to turn off
      - service: light.turn_off
        target:
          entity_id:
            - light.group_outdoor

      # Shutters to open
      - service: cover.open_cover
        target:
          entity_id:
            - group.shutter_night_mode_to_open

      # Shutters to close
      - service: cover.close_cover
        target:
          entity_id:
            - group.shutter_night_mode_to_close

      # Check for opened access point
      - service: script.turn_on
        target:
          entity_id: script.prompt_to_close_access_point
        data:
          variables:
            notif_data:
              prefix_text: ""
              media_player_entity_id: media_player.echo_sejour
              target:
                - voice
                - mobile_app
              who:
                - stephane
              timeout: 60
              reminder: no

      # Waits 5 minute
      - delay:
          minutes: 5

      # Enable presence auto automation
      - service: automation.turn_on
        target:
          entity_id: automation.home_mode_presence_auto

Pour info voici son historique d’exécution.

Le sensor.shutter_open_count qui est passé à 2 une minute après la commande de fermeture confirme qu’un des volets n’a pas été vu « fermé » car il aurait du passer à 1, en effet dans ce mode nocturne un de mes volets reste volontairement ouvert.

Le script s’est terminé à 7:31 car je l’ai moi-même forcé à s’arrêter.
Comme spécifié dans le message précédent, le passage à l’état « fermé » du volet qui ne l’était pas n’a pas débloqué le script, peut-être qu’après autant de temps à attendre sur le service « cover.cover_close » c’était peine perdue.

Réflexion personnelle :

Est-ce qu’utiliser cover.set_cover_position avec une position à 0% aurait aussi bloqué ?
Je ne sais pas si le « cover » applique une tolérance de position pour la complétion dans le cas d’un set_cover_position qu’il n’appliquerait pas sur une action ouverture ou fermeture ?

Comme le cover est créé par l’intégration Zwave je n’ai pas trop de contrôle sur son fonctionnement et ses paramètres, je ne peux pas non plus lui activer le mode « optimistic » par exemple, enfin je pense.

Pour le moment en solution de contournement j’ai créé 3 scripts « wrapper » pour piloter les volets que j’utilise en lieu et place des services « cover.____ » en les appelant avec le service script.turn_on pour obtenir une exécution //

Je ne sais pas si c’est LA solution, si il y avait plus simple ou si j’ai complètement raté un fondamental de Home Asssistant mais ça devrait faire le taf.

Vous en pensez quoi ?

###########
# SCRIPTS #
###########
script:
  #----------------------------------------
  # Cover Close
  #----------------------------------------
  cover_close:
    alias: "Cover Close"
    icon: "mdi:window-shutter"
    description: "Cover Close"
    mode: restart

    sequence:
      - service: cover.close_cover
        target:
          entity_id: "{{ entity_id }}"

  #----------------------------------------
  # Cover Open
  #----------------------------------------
  cover_open:
    alias: "Cover Open"
    icon: "mdi:window-shutter-open"
    description: "Cover Open"
    mode: restart

    sequence:
      - service: cover.open_cover
        target:
          entity_id: "{{ entity_id }}"          

  #----------------------------------------
  # Cover Set Position
  #----------------------------------------
  cover_set_position:
    alias: "Cover Set Position"
    icon: "mdi:window-shutter-cog"
    description: "Cover Set Position"
    mode: restart

    sequence:
      - service: cover.set_cover_position
        target:
          entity_id: "{{ entity_id }}"
        data:
          position: "{{ data.position }}"

Et donc mon script de mode nocturne est devenu :

###########
# SCRIPTS #
###########
script:
  #----------------------------------------
  # Transition to Home Mode Night
  #----------------------------------------
  home_mode_night:
    alias: "Home Mode Night"
    icon: "mdi:weather-night"
    description: "Switch Home to Night Mode"
    mode: single

    sequence:
      # Kill other modes scripts
      - service: script.turn_off
        target:
          entity_id:
            - script.home_mode_away
            - script.home_mode_presence
            - script.home_mode_bedtime

      # Light to turn off
      - service: light.turn_off
        target:
          entity_id:
            - light.group_outdoor

      # Shutters to open
      - service: script.turn_on
        target:
          entity_id: script.cover_open
        data:
          variables:
            entity_id:
              - group.shutter_night_mode_to_open

      # Shutters to close
      - service: script.turn_on
        target:
          entity_id: script.cover_close
        data:
          variables:
            entity_id:
              - group.shutter_night_mode_to_close

      # Check for opened access point
      - service: script.turn_on
        target:
          entity_id: script.prompt_to_close_access_point
        data:
          variables:
            notif_data:
              prefix_text: ""
              media_player_entity_id: media_player.echo_sejour
              target:
                - voice
                - mobile_app
              who:
                - stephane
              timeout: 60
              reminder: no

      # Waits 5 minute
      - delay:
          minutes: 5

      # Enable presence auto automation
      - service: automation.turn_on
        target:
          entity_id: automation.home_mode_presence_auto

Logiquement il ne devrait plus se bloquer pour un problème de cover vu que les cover sont pris en charges par un autre script en //
J’ai appliqué cette modif sur tous les autres script qui pouvaient bloquer sur les covers.

Mais est-ce que cela peut arriver aussi sur des « light » et des « switch » pour X raisons ?

Bonjour.

Tu peux essayer de réaliser les actions qui peuvent bloquer le script en parallèle et non pas en séquentiel, et le reste du script en parallèle avec tes volets.

Ex : Si tu as 5 volets, tu lances 6 opérations en parallèle, les 5 premières correspondent aux 5 volets, la 6ème au reste de la séquence (alarme, lumière, etc.).

Pour ma part, je créerais une variable d’état et scinderais en 2 scripts : le second script servirait à initialiser la variable à True (par exemple) puis à réaliser les opérations en parallèle citées plus haut plus à remettre la variable à False.

Le premier script (celui qui sera appelé) lancerait le 2nd script, attendrait le temps nécessaire à l’exécution du 2nd script ajouté à un délai de sécurité et le ‹ killerait › si la variable est encore à True.

Mais je débute en HA, ce n’est peut-être pas une bonne méthode.

Oui je vois plusieurs solutions, mais toutes assez complexes surtout lorsque qu’il n’y a pas qu’un script ou une automation à traiter de la sorte.

Une autre option était de faire un input_select reprenant toutes les « configurations » de volet voulues et d’y associer une automatisation qui s’occupe de positionner les volets en fonction.

Ensuite dans les autres script il suffit de changer le input_select pour effectuer en // toutes les actions sur les covers sans se soucier qu’elles se terminent ou non.

Et par sécurité prévoir une option « none » qui ne fait rien ou qui « kill » des choses si nécessaire dans le input_select et toujours le remettre à « none » après un certain temps pour que tout nouveau choix déclenche l’automatisation liée et ça ferait office de « timeout ».
Car si l’ input_select ne change pas vraiment de valeur l’automatisation ne sera pas triggée et les volets ne seront pas remis en position si l’un d’eux avait été manœuvré par un autre moyen.

En plus des bonnes remarques de Tioche, il faut mieux éviter les wait. Sur de la programmation événementielle ça sert à rien sauf avoir des trucs qui tourne en fond (comme sous jeedom)

J’ai pas de wait dans mon script, je veux justement qu’il attende pas sur cover.close_cover si un des volets ne ferme pas totalement.

Pour le delay de 5 minutes j’aurais pu l’éviter effectivement … mais de toute façon mon script bloqué n’est même pas arrivé jusque là.

Et l’orque j’utilise un wait_trigger je mets toujours un timeout que je gère derrière.

J’avoue ne pas avoir lu en détail tous les éléments techniques, mais en exprimant le besoin fonctionnel indépendamment de la plate-forme domotique, on peut peut-être proposer des idées de réalisation. :slight_smile:

De prime abord, j’aurais tendance à dire qu’on ne met pas de « Wait » sur action en domotique, parce que si un truc se plante (ce qui arrive forcément), il ne faut pas bloquer le reste, par contre mettre des contrôles oui, si un truc se plante, on essaye de mettre des actions correctrices et au pire une alerte.

Lis au moins le premier post, tout y est.

J’ai pas vraiment un problème pour construire un script ou arriver à une finalité, juste un comportement de blocage du service cover.close_cover qui est lancé sur un groupe de covers auquel je ne m’attendais pas si un des covers ne se ferme pas totalement.
A la base je pensais que le service envoyait la commande de fermeture et puis se terminait sans attendre de confirmation de finalisation de la commande.

Mais bon après avoir épluché pas mal de choses je pense que l’utilisation de services « wrapper » intermédiaires comme expliqué dans le troisième post reste la meilleure option pour que les actions sur ces covers soient effectuées en // et ne puisse bloquer le script principal.

On ne peut malheureusement pas appliquer un timeout sur un service comme celui là, en tous cas j’ai rien trouvé.

Oui, ce n’est pas très clair pour moi, de mon côté, si je comprends bien, c’est le service HA cover.close qui reste bloqué en wait, c’est vrai que je ne trouve pas ça très logique.

Pour info, j’ai des volets Somfy avec retour d’état, commandés par l’intégration Overkiz et il arrive parfois (rarement) que la box ne réponde pas mais dans ce cas la fonction n’est pas exécutée, mais ne reste pas en wait.

J’ai tendance à imaginer que c’est l’intégration qui reste en wait et dans ce cas là, HA n’y peut rien et il faudrait peut-être vérifier que c’est normal et pas un bug.

Egalement, j’ai tendance à penser que lorsqu’on programme des choses un peu sophistiquées, le couple Automation/Script arrive vite à monter des usines à gaz pas très simples à maintenir, et qu’il vaut mieux passer sous NodeRed. Par exemple, il est très simple en NodeRed de paralléliser les opérations si c’est nécessaire et c’est facile à maintenir en mode graphique.

D’ailleurs, ça vient de m’arriver aujourd’hui (!), le volet s’est ouvert, mais le retour d’état est resté bloqué à 71% en position montée, mais rien n’a été bloqué dans mes automatisations.

Je n’ai jamais vu l’intérêt de rajouter en + NodeRed, sauf peut être si on est allergique au code YAML…

Mon troll mis à part, j’ai remarqué des problèmes dans des scripts en place depuis longtemps et qui ne s’exécutaient pas totalement depuis la version 2023.7.x

J’ai résolu en supprimant un maximum de delay: (info trouvée sur le Github HA, mais ça reste pas très clair).

Quant aux volets, les miens sur (Shelly 2.5) ne sont pas bloquants si pas dispo (ce qui m’est arrivé avec une beta Unifi), au pire il reste ouvert. Mais je pense que ça dépend du type de pilotage (son intégration).

Oui, tout le monde n’est pas développeur, et perso, NodeRed me permet de faire des choses complexes que je ne saurais pas maintenir autrement, par exemple:

Ca évite également d’avoir des automatisations ET des scripts, sauf cas particuliers, tout est dans le NodeRed

Pour mes volets, ça donne un truc comme ça:

Je te taquinait et chacun fait à sa mode, mais je ne suis pas dev, pourtant au fil du temps j’ai trouvé le yaml plus simple et surtout j’évite une dépendance externe à HA. Ceci étant j’utilise AppDaemon qui est externe…

1 « J'aime »

Je suis un peu du même avis que @mycanaletto concernant NodeRed, enfin pour le moment …

Disons que tant que j’arrive à faire tout ce que je veux en yaml j’y reste, NodeRed est installé sur mon instance, je l’ai testé sur des trucs basiques mais il est actuellement désactivé car non utilisé, appDaemon est installé aussi mais également désactivé pour le moment.

De plus je trouve que pour modifier des trucs, faire du remplacement global ou faire des recherches sur qui fais quoi et où il le fait, la recherche dans les fichiers yaml via VSCode est plus efficace que de faire des recherches dans une multitude de flow et de nœuds NodeRed

Ceci dis tes flow node-red que tu présentes auraient probablement été difficiles à faire en yaml.

Perso j’utilise une config 100% basée sur le principe « packages » et donc je mixe les automations et les scripts qui ont un rapports entre eux dans le même fichier yaml, ainsi que même la définition des helpers, des sensors, de la customisation, … en gros tout ce qui a un rapport avec une même fonction se trouve dans le même fichier, ça simplifie la maintenance,
Alors oui dans l’UI ils sont pas dans la même view mais c’est un moindre mal, j’y vais que pour faire du debug et consulter les historiques d’exécution.

@mycanaletto , j’ai effectivement un delay dans ce script mais l’historique montre que l’exécution s’est bloquée spécifiquement sur le service cover donc bien avant d’arriver au délai. Et il y avait effectivement un des volets du groupe qui n’était pas considéré totalement fermé.
Ca dépend effectivement surement de l’intégration, mes volets utilisent des modules fibaro en zwave et dépendent donc de la gestion des covers qui est faite par l’intégration zwave.

Aujourd’hui je me suis plus cassé les dents sur ma première carte custom pour ma VMC qui est maintenant également gérée à 100% par HA et plus par jeedom :

Je me suis inspiré de GitHub - timjong93/lovelace-wtw: Home Assistant Lovelace card for an air based heat exchanger like the WHR-930 mais j’ai modifié plein de trucs et solutionné des problèmes de dimensionnement de l’image et rendu toutes les valeurs cliquables pour afficher le popup « more-info » des sensors correspondants.
chatGPT m’a filé un très gros coup de main sur le JS/HTML/CSS que je sais « lire et interpréter » mais ne maitrise pas trop sur des grosses modifs …

Bravo au développeur :slight_smile: et on pourra dire qu’avec HA, chacun trouve ce qui lui convient !