Comment vous organisez vos dossiers / fichiers.yaml dans Home Assistant?

Bonjour la communauté,

Arrivant de Jeedom, j’ai été assez perdu sur le fait de ne plus pouvoir créer de virtuel sur HA.

J’avais besoin de créer de nombreuses entités comprenant un switch ET le retour d’état.

Exemple: un bouton portail pour l’ouvrir et le fermer mais incluant sur l’icône (allumer ou éteint) le retour d’état réel du portail (capteur).

N’y arrivant pas à l’aide de l’interface UI en créant une nouvelle entrée, chatgpt m’a donné un code yaml à mettre directement dans mon fichier configuration.yaml

Seulement, je trouve que cela devient très vite le foutoir là-bas dedans et j’ai donc voulu ranger / organiser tout cela.

J’ai donc mis cette ligne sur ma configuration.yaml

homeassistant:
packages: !include_dir_named perso

Puis j’ai organisé ainsi:

config/

├── configuration.yaml # Fichier principal HA

├── perso/ # Dossier des « packages » personnels (déclaré dans configuration.yaml)
│ │
│ ├── portail/ # Dossier pour tout ce qui concerne le portail
│ │ ├── portail_virtuel.yaml # Boutons ou capteurs virtuels pour le portail
│ │ ├── portillon_virtuel.yaml # Boutons ou capteurs virtuels pour le portillon
│ │ └── … # Autres fichiers portail
│ │
│ ├── piscine/ # Dossier pour tout ce qui concerne la piscine
│ │ ├── filtration_virtuel.yaml # Gestion de la filtration
│ │ ├── pac_virtuel.yaml # Autre équipement piscine
│ │ └── … # Autres fichiers piscine
│ │
│ ├── alarme/ # Dossier pour tout ce qui concerne l’alarme
│ │ ├── sirene.yaml # Code complet sirène (input_boolean + automatisations MQTT)
│ │ └── … # Autres équipements alarme
│ │
│ └── … # Autres dossiers ou fichiers d’équipements

Ca fonctionne très bien, je regroupe également mes automations ici, seulement je me demande si c’est bien de faire ainsi?

Par exemple, il n’est plus possible de modifier mes automations dans l’interface ui (ca me demande de migré vers automation.yaml

Quizz d’une éventuelle futur Maj de HA

Comment faites vous?

Merci par avance.

Hello,

Perso j’ai un peu de packages mais surtout des !include dans mon configuration.yaml

ça permet aussi de bien structurer je trouve

cdt

1 « J'aime »

Merci pour ta réponse:

J’ai oublié de dire que je suis novice et ne touche pas a la programmation (j’arrive tout de meme à comprendre un peu)

C’est chatgpt qui m’a conseillé ce que j’ai fait.

Le package (packages: !include_dir_named perso) permet si j’ai bien compris au fichier configuration.yaml de lire tout ce que contient le dossier perso (et ses sous dossiers) que j’ai créer.

Seulement, je peux plus modifier mes automatisations dans l’interface ui :frowning:

Ta solution fonctionne comment?

Bonjour,

moi j’utilise packages aussi, mais j’ai laissé les group ,automation, scène et script par défaut.

#########################
#          HA           #
#########################
homeassistant:
  packages: !include_dir_named packages


#########################
#        INCLUDE        #
#########################
group: !include groups.yaml
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

Et tout le reste dans packages.

1 « J'aime »

Tu pourrai m’expliquer svp?

A quoi servent les includes?

moi j’ai ca dans configuration.yaml

et ca donne ca avec mon package (perso)

Seulement j’ai un fichier (sirène) dans alarme comprenant fichier.yaml avec automation, bouton etc… dans ce même fichier.

##############################
# Boutons virtuels (input_boolean)
##############################
input_boolean:
  on_off_sirene:
    name: "ON/OFF Sirène"
    icon: mdi:bell-alert
    # Bouton principal pour activer/désactiver la sirène (alarme réelle)

  test_sirene:
    name: "Test Sirène"
    icon: mdi:alarm-light
    # Bouton pour tester la sirène rapidement (5 secondes)

##############################
# Automatisations qui pilotent la sirène
##############################
automation:
  - id: alarme_sirene_activation
    alias: "Activation Sirène principale"
    description: "Quand ON, sirène sonne 30 min (max). Quand OFF, arrêt immédiat."
    trigger:
      - platform: state
        entity_id: input_boolean.on_off_sirene
    mode: single
    action:
      - choose:
          - conditions:
              - condition: state
                entity_id: input_boolean.on_off_sirene
                state: "on"
            sequence:
              - service: mqtt.publish
                data:
                  topic: "zigbee2mqtt/Sirène/set"
                  payload: '{"warning": {"duration": 1800, "mode": "emergency", "strobe": false}}'
                  qos: 0
                  retain: false
                  # Sirène sonne 1800 secondes = 30 minutes (durée max)
          - conditions:
              - condition: state
                entity_id: input_boolean.on_off_sirene
                state: "off"
            sequence:
              - service: mqtt.publish
                data:
                  topic: "zigbee2mqtt/Sirène/set"
                  payload: '{"warning": {"mode": "stop"}}'
                  qos: 0
                  retain: false
                  # Arrête la sirène immédiatement

  - id: alarme_sirene_test
    alias: "Test rapide Sirène"
    description: "Quand ON, test court 5s puis le bouton revient à OFF."
    trigger:
      - platform: state
        entity_id: input_boolean.test_sirene
        to: "on"
    mode: restart
    action:
      - service: mqtt.publish
        data:
          topic: "zigbee2mqtt/Sirène/set"
          payload: '{"warning": {"duration": 5, "mode": "emergency", "strobe": false}}'
          qos: 0
          retain: false
          # Sirène sonne 5 secondes pour test
      - delay: "00:00:06"  # Attend 6 secondes pour laisser la sirène sonner
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.test_sirene
        # Remet le bouton test à OFF automatiquement

Ca fonctionne mais je peux pas modifier dans automation et je me demande si c’est bien de faire ainsi pour les automations.

Pourriez vous m’expliquer svp?

Si je met toutes mes automations dans automation.yaml c’est également vite le foutoir non?

Ou alors vous passez par l’interface visuel et vous rentrer le yaml par là?

Vu ta structure /config/perso/dossier/fichier.yaml, il te faudrait mettre :

packages: !include_dir_merge_named perso/

Regarde les explications de la doc.

Re,

1 on fait une save si possible externalisée avent de toucher aux fichiers de config

2 on met en place une réelle politique de backup :wink:

Pour le reste, le principe est simple, dans mqtt.yaml, je met tous les sensors mqtt que j’ai créé

et ensuite je charge ce fichier automatiquement avec un include mqtt: !include mqtt.yaml

après avoir créé les fichiers et modifié configuration.yaml, il faut redémarrer HA

cdt

J’ai voulu changer et en vérifiant la configuration avant de redemarer, je me suis retrouvé avec une pile d’erreur:Avertissements de configuration
Setup of package 'notify' failed: Invalid package definition 'notify': expected a dictionary. Package will not be initialized
Setup of package 'input_boolean' failed: Integration 'on_off_sirene' not found.
Setup of package 'input_boolean' failed: Integration 'test_sirene' not found.
Setup of package 'automation' failed: Invalid package definition 'automation': expected a dictionary. Package will not be initialized
Setup of package 'input_datetime' failed: Integration 'heure_debut_filtration_1_piscine' not found.
Setup of package 'input_datetime' failed: Integration 'heure_fin_filtration_1_piscine' not found.
Setup of package 'input_datetime' failed: Integration 'heure_debut_filtration_2_piscine' not found.
Setup of package 'input_datetime' failed: Integration 'heure_fin_filtration_2_piscine' not found.
Setup of package 'input_datetime' failed: Integration 'heure_pivot_filtration_piscine' not found.
Setup of package 'input_datetime' failed: Integration 'heure_pivot_filtration_hivernage_piscine' not found.
Setup of package 'input_number' failed: Integration 'duree_filtration_piscine' not found.
Setup of package 'input_number' failed: Integration 'duree_coupure_filtration_piscine' not found.
Setup of package 'input_number' failed: Integration 'duree_coupure_filtration_hivernage_piscine' not found.
Setup of package 'input_number' failed: Integration 'coefficient_filtration_piscine' not found.
Setup of package 'input_button' failed: Integration 'recalcul_temps_filtration_piscine' not found.
Setup of package 'input_select' failed: Integration 'mode_filtration_piscine' not found.
Setup of package 'template' failed: Invalid package definition 'template': expected a dictionary. Package will not be initialized

J’ai donc remis comme avant (ca fonctionnait)

Pour les automations, tu fais comment?

Tous dans le fichier automation? tu passes par l’interface ui?

Du coup j’ai tout changé mes fichiers:

je suis passé à:

packages: !include_dir_merge_named perso/

et j’ai rajouté à chaque début (de tous mes fichiers yaml perso)

nom_du_fichier_package:

Oui, j’ai laissé par défaut et utilise tout par le UI.

Désolé si je comprend pas très bien.

Donc, pour les entités etc… un peu spécial à configurer via ui, tu passes par le package c’est bien ça?

C’est mieux la version:

Comme tu as fait,

Ou

packages: !include_dir_merge_named packages/

Comme j’ai fait pour les sous dossiers. (Ce que tu m’as suggéré)

Enfin, pour les automations, Tu me conseilles de ne pas les inclure dans mes fichiers.yaml packages et de plutôt passer par l’interface ui?

On peut copier coller les automations (que j’ai dans mes fichiers.yaml dans les dossiers du package) dans l’édition yaml des automations?

Enfaite, je cherche à comprendre et surtout classer au mieux pour m’y retrouver.

En te remerciant encore par avance.

Salut

Alors pour

packages: !include_dir_merge_named packages/

Ou

packages: !include_dir_named packages/

Comme tu as pu le voir c’est juste une histoire de première ligne qui doit contenir le nom du package perso avec la même structure que toi j’utilise dir_named.

Par contre je te suggère de nommer ton fichier packages au lieu de perso. C’est à ce nom que tout les tutos de personnes qui partagent des fichier yaml font référence dans leur explications. Ça fait un truc en moins à penser quand on parle package tu sais de suite que c’est dans le dossier packages et tu n’as pas à te dire ‘alors pour moi packages, c’est perso‘.

Pour les automatisations soit tu les laisses dans le package et tu les modifies en yaml (ça va si c’est juste une valeur) sinon tu les migres et tu supprimes l’automatisation du package.

Là aussi perso j’ai les 2.

2 « J'aime »

Pour ma part, je classe tout par entity puis par pièce !

1 « J'aime »

Avant de faire cela, je suggère de faire :

outils de développement + YAML + vérifier la configuration

sinon un petit !include_dir_named packages

1 « J'aime »

Oui, merci de le rappeler.
J’ai bien failli tout planter ce matin mais j’avais vérifié… ouf

j’ai laissé la configuration par défaut pour automation group scene et script. Je les créer et modifie par le UI.
J’utilise le packages pour tout le reste.

ces 4 fichiers YAML, ce trouve dans /config/ et tout le reste dans packages.

Je re passerai bien en (packages: !include_dir_named packages/ ) comme nombreux d’entres vous mais, si je suis passé en (packages: !include_dir_merge_named packages/ ) c’est à cause de ma sirène zigbee Heiman HS2WD-E.

Celle ci n’a pas de bouton pour l’activé et j’ai bien galéré pour la faire sonner.

Chatgpt m’a fait un code yaml qui a fonctionné du premier coup:

sirene_package:
  input_boolean:
    on_off_sirene:
      name: "ON/OFF Sirène"
      icon: mdi:bell-alert
      # Bouton principal pour activer/désactiver la sirène (alarme réelle)

    test_sirene:
      name: "Test Sirène"
      icon: mdi:alarm-light
      # Bouton pour tester la sirène rapidement (5 secondes)

  automation:
    - id: alarme_sirene_activation
      alias: "Activation Sirène principale"
      description: "Quand ON, sirène sonne 30 min (max). Quand OFF, arrêt immédiat."
      trigger:
        - platform: state
          entity_id: input_boolean.on_off_sirene
      mode: single
      action:
        - choose:
            - conditions:
                - condition: state
                  entity_id: input_boolean.on_off_sirene
                  state: "on"
              sequence:
                - service: mqtt.publish
                  data:
                    topic: "zigbee2mqtt/Sirène/set"
                    payload: '{"warning": {"duration": 1800, "mode": "emergency", "strobe": false}}'
                    qos: 0
                    retain: false
                    # Sirène sonne 1800 secondes = 30 minutes (durée max)
            - conditions:
                - condition: state
                  entity_id: input_boolean.on_off_sirene
                  state: "off"
              sequence:
                - service: mqtt.publish
                  data:
                    topic: "zigbee2mqtt/Sirène/set"
                    payload: '{"warning": {"mode": "stop"}}'
                    qos: 0
                    retain: false
                    # Arrête la sirène immédiatement

    - id: alarme_sirene_test
      alias: "Test rapide Sirène"
      description: "Quand ON, test court 5s puis le bouton revient à OFF."
      trigger:
        - platform: state
          entity_id: input_boolean.test_sirene
          to: "on"
      mode: restart
      action:
        - service: mqtt.publish
          data:
            topic: "zigbee2mqtt/Sirène/set"
            payload: '{"warning": {"duration": 5, "mode": "emergency", "strobe": false}}'
            qos: 0
            retain: false
            # Sirène sonne 5 secondes pour test
        - delay: "00:00:06"  # Attend 6 secondes pour laisser la sirène sonner
        - service: input_boolean.turn_off
          target:
            entity_id: input_boolean.test_sirene
          # Remet le bouton test à OFF automatiquement

L’automation et les input boolean sont dans le même code.yaml.

Je déplacerai bien la partie automation (avec les autres automations) mais il me suggère de laisser ainsi car plus pratique.

Vous en pensez quoi?

Le reste de mes fichiers sont de type cover.

Je pense que chatgpt dit ce qu’on veut lui faire dire. Insiste un peu et il finira par te dire que l’autre méthode est mieux :rofl:

1 « J'aime »

Et tu as parfaitement raison… :rofl: :joy:

D’ou mes questions aux expert :smiley:

1 « J'aime »

Personnellement je ne pense pas qu’il y a de meilleures ou de moins bonnes solutions. Tu risques d’avoir des experts pour les deux façons de faire.

1 « J'aime »