Nouvelle intégration Vigieau

Et voilà la personne qui me l’a dis Nouvelle intégration Vigieau - #45 par Christophe69480

@titof2375 Merci pour les liens.

Je vais chercher car je ne trouve pas ce que je souhaite.
Plus clairement par rapport à mon premier post sur le sujet:

  • Actuellement s’il y a une restriction horaire par exemple entre 11h00 et 18h00, l’icon reste dans la couleur du niveau d’alerte.
  • Je souhaite animer la couleur/texte en fonction de la plage horaire, 11h00 à 18h00 dans la couleur du niveau d’alerte le reste du temps en vert. J’ai bien trouvé les attributs mais ne comprend pas comment les récupérer dans le code.

Fred

pour l’animation je ne sais pas par contre je suis intersse

Bonjour, chez moi mon niveau d’alerte a changé et sur l’intégration rien n’a changé


Ci dessus une capture d’écran du site vigieau et ci dessous une capture d’écran de intégration

, Comment la mise a jour ce fait sur l’intégration ?
Autre chose voilà mes log

Logger: homeassistant.components.sensor
Source: custom_components/vigieau/init.py:220
Integration: Capteur (documentation, issues)
First occurred: 12:54:07 (1 occurrences)
Last logged: 12:54:07

Error while setting up vigieau platform for sensor
Traceback (most recent call last):
File « /usr/src/homeassistant/homeassistant/helpers/entity_platform.py », line 353, in _async_setup_platform
await asyncio.shield(task)
File « /config/custom_components/vigieau/sensor.py », line 42, in async_setup_entry
await vigieau_coordinator.async_config_entry_first_refresh()
File « /usr/src/homeassistant/homeassistant/helpers/update_coordinator.py », line 251, in async_config_entry_first_refresh
await self._async_refresh(
File « /usr/src/homeassistant/homeassistant/helpers/update_coordinator.py », line 374, in _async_refresh
self.async_update_listeners()
File « /usr/src/homeassistant/homeassistant/helpers/update_coordinator.py », line 164, in async_update_listeners
update_callback()
File « /config/custom_components/vigieau/init.py », line 220, in _handle_coordinator_update
self._attr_icon = {
^
KeyError: ‹ alerte_renforcée ›

Bonjour,

l’intégration se met à jour toutes les heures. Dans le cas précis du passage à l’alerte renforcée, la 0.3.8 corrige le problème.

1 « J'aime »

Re,

J’ai réussi à bidouiller un truc pour afficher la plage horaire dans le cadre.
Je bute sur la conversion de la seconde commande du screenshot ci-dessous pour l’intégrer dans la carte.
Une idée ?

Capture d’écran 2023-07-24 à 18.49.38

type: custom:stack-in-card
mode: vertical
keep:
  box_shadow: false
  margin: false
  border_radius: false
  background: false
  outer_padding: false
cards:
  - type: custom:mod-card
    card_mod:
      style:
        .: |
          :host {
            --text-divider-color: rgb(68, 115, 158);
            --text-divider-line-size: 1px;
          }
    card: null
  - type: custom:mod-card
    card_mod:
      style: |
        ha-card {
          margin: -10px 0px 0px 0px;
        }  
    card:
      type: horizontal-stack
      cards:
        - type: custom:bar-card
          entities:
            - entity: sensor.alert_level
              name: 'Meuse niveau :'
              icon: mdi:alert-circle
              height: 25px
              positions:
                indicator: 'off'
                icon: 'off'
              severity:
                - text: Vigilance
                  color: green
                - text: Alerte
                  color: yellow
                - text: Alerte renforcée
                  color: orange
                - text: Crise
                  color: red
          card_mod:
            style: >
              bar-card-currentbar, bar-card-backgroundbar {
                border-radius: 25px;
              }

              #states > bar-card-row > bar-card-card > bar-card-background >
              bar-card-contentbar > bar-card-name {
                font-size: 16px;
              }  ha-card {
                margin-top: -2px;
                background: none;
                border: none;
              }
  - type: custom:mod-card
    card_mod:
      style: |
        ha-card {
          margin: -5px 5px 5px 5px;
        }
    card:
      type: custom:auto-entities
      card:
        type: grid
        columns: 5
        square: true
      card_param: cards
      filter:
        include:
          - entity_id: sensor.*_restrictions
            options:
              type: custom:button-card
              color_type: icon
              aspect_ratio: 1/1
              show_name: false
              show_state: true
              show_label: true
              label: |
                [[[ 
                   if (entity.attributes.friendly_name == 'Arrosage des jardins potagers') {
                     var hd = entity.attributes['Arrosage des jardins potagers (heureDebut)']
                     var hf = entity.attributes['Arrosage des jardins potagers (heureFin)']
                   } 
                   else
                   {
                    if (entity.attributes.friendly_name == 'Arrosage des pelouses') {
                     var hd = entity.attributes['Arrosage des pelouses, massifs fleuris (y compris jardinières, balconnières et fleurs en pot) (heureDebut)']
                     var hf = entity.attributes['Arrosage des pelouses, massifs fleuris (y compris jardinières, balconnières et fleurs en pot) (heureFin)']
                     }
                   }
                   if (hd != undefined) {
                     return hd + ' à ' + hf
                   }
                ]]]               
              name: |
                [[[
                  return entity.attributes.friendly_name
                ]]]
              styles:
                card:
                  - '--mdc-ripple-color': rgb(68, 115, 158)
                  - '--mdc-ripple-press-opacity': 0.5
                  - border-radius: 8px
                name:
                  - font-size: 9px
                  - white-space: normal
                label:
                  - font-size: 9px
                  - white-space: normal
                  - color: red
                state:
                  - font-size: 9px
                  - white-space: normal
              state:
                - value: Aucune restriction
                  operator: '=='
                  color: green
                  styles:
                    card:
                      - box-shadow: 0px 0px 0px 2px green
                    state:
                      - color: green
                - value: Interdiction sauf exception
                  operator: '=='
                  color: orange
                  styles:
                    card:
                      - box-shadow: 0px 0px 0px 2px orange
                    state:
                      - color: orange
                - value: Interdiction
                  operator: '=='
                  color: red
                  styles:
                    card:
                      - box-shadow: 0px 0px 0px 2px red
                    state:
                      - color: red
                - value: Interdiction sur plage horaire
                  operator: '=='
                  styles:
                    icon:
                      - color: |
                          [[[ 
                              return 'orange'
                          ]]]      
                    card:
                      - box-shadow: 0px 0px 0px 2px orange
                    state:
                      - color: orange
              size: 50%
      sort:
        method: name
        reverse: false

Suite à la derniere update j’ai cette erreur :

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 353, in _async_setup_platform
    await asyncio.shield(task)
  File "/config/custom_components/vigieau/sensor.py", line 42, in async_setup_entry
    await vigieau_coordinator.async_config_entry_first_refresh()
  File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 251, in async_config_entry_first_refresh
    await self._async_refresh(
  File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 374, in _async_refresh
    self.async_update_listeners()
  File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 164, in async_update_listeners
    update_callback()
  File "/config/custom_components/vigieau/__init__.py", line 291, in _handle_coordinator_update
    restriction = usage.get("niveauRestriction", usage["erreur"])
                                                 ~~~~~^^^^^^^^^^
KeyError: 'erreur'

Le plus simple serait probablement que l’intégration expose un booléen pour la restriction plutot que du texte. Une fois que c’est le cas, on peut facilement exposer le status réel de l’interdiction en fonction de l’horaire.

Source: custom_components/vigieau/__init__.py:291
Integration: Capteur (documentation, issues)
First occurred: 19:15:19 (1 occurrences)
Last logged: 19:15:19

Error while setting up vigieau platform for sensor
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 353, in _async_setup_platform
    await asyncio.shield(task)
  File "/config/custom_components/vigieau/sensor.py", line 42, in async_setup_entry
    await vigieau_coordinator.async_config_entry_first_refresh()
  File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 251, in async_config_entry_first_refresh
    await self._async_refresh(
  File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 374, in _async_refresh
    self.async_update_listeners()
  File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 164, in async_update_listeners
    update_callback()
  File "/config/custom_components/vigieau/__init__.py", line 291, in _handle_coordinator_update
    restriction = usage.get("niveauRestriction", usage["erreur"])
                                                 ~~~~~^^^^^^^^^^
KeyError: 'erreur'

je suis en 0.3.9


sdfdsf56f4f65d4f65df4d654f1sd65f4sd89f47dfv4cvx1cvcsd4dfz89ef4

Sorry pour cette release un peu ratée. Je cherchais à gérer le problème de l’API pour les données de ma commune.
Le problème devrait être corrigé en 0.3.10.

Et en cas d’erreur de l’API (si l’api n’a pas les infos mais retourne quand même un résultat):

Je voudrais avoir votre avis sur la prochaine évolution sur laquelle je vais travailler.
Aujourd’hui les capteurs retournent la restriction avec du texte. En pratique les restrictions sont:

  • Autorisé (si aucune restriction)
  • Interdiction
  • Interdiction sur plage horaire
  • Interdiction sauf exception

Une autre façon de présenter les données serait d’utiliser des capteurs binaires « Interdit » ou « Autorisé ». Toute interdiction serait vu comme « on » pour le capteur.
Le raisonnement est le suivant:

  • les exceptions, quand elles existent, sont des cas limites (1er remplissage de piscine par ex). J’imagine qu’une automatisation ne s’intéresse pas à ce genre de cas et qu’on peut donc considérer que l’usage est interdit (et garder l’exception pour un attribut)
  • les restrictions horaires pourraient être exprimées de façon naturelle: le capteur est « on » pendant la plage interdite (ou autorisée, cf le sondage plus bas)
  • les automatisations sont plus faciles à écrire avec des capteurs binaires.

Je voudrais avoir votre avis:

  • Garder les capteurs comme aujourd’hui
  • Passer aux capteurs binaires « on » signifie interdit
  • Passer aux capteurs binaires « on » signifie autorisé
0 votant

Bien sûr, en plus de voter, n’hésitez pas à donner un cas d’usage concret pour illustrer l’interêt d’un mode ou de l’autre.

1 « J'aime »

Salut, alors pour moi un on ou un off, serait pas top, car dans les restrictions,il peut y avoir de horaires ou des recommandations, par contre si effectivement tu pouvais faire un ok quand on peut arrosé et no quand on peut pas ça serait un plus

Vote réalisé.
FYI, j’ai poussé une PR pour permettre :

  • de choisir le mode de localisation (coordonnées HA, ou code postal)
  • la possibilité d’ajouter plusieurs localisation.

Il y a pas mal d’autres modifs également, mais qui n’impacte pas le fonctionnement (:crossed_fingers:) j’espère que ça ne sera pas trop galère à merger et que tu pourras prendre en compte.
Dispo si besoin

1 « J'aime »

Alors, tout d’abord, je voulais te remercire pour ton travail et cette intégration très utile.
Pour moi, le plus utile serait des états comme ceux présentés par Fred55, qui indiquent l’interdiction partielle avec plage horaire.
Je ne compte pas utiliser des capteurs binaires pour gérer des automations sur mon arrosage par exemple. Seule l’information mise à jour, mais avec toutes les informations (y compris les plages horaires) est utile pour moi.
Merci encore pour tout.

1 « J'aime »

Bonjour,

J’ai finalement trouvé la fonction que je cherchais pour changer la couleur icône fonction plage horaire.

Reste cet histoire d’indexage pour trouver automatiquement ce qu’il faut animer sans le coder en dur.

@kamaradclimber oui ce serai plus simple d’intégrer la gestion plage horaire dans l’intégration.

Capture d’écran 2023-07-25 à 08.53.43

type: custom:stack-in-card
mode: vertical
keep:
  box_shadow: false
  margin: false
  border_radius: false
  background: false
  outer_padding: false
cards:
  - type: custom:mod-card
    card_mod:
      style:
        .: |
          :host {
            --text-divider-color: rgb(68, 115, 158);
            --text-divider-line-size: 1px;
          }
    card: null
  - type: custom:mod-card
    card_mod:
      style: |
        ha-card {
          margin: -10px 0px 0px 0px;
        }  
    card:
      type: horizontal-stack
      cards:
        - type: custom:bar-card
          entities:
            - entity: sensor.alert_level
              name: Meuse niveau
              icon: mdi:alert-circle
              height: 25px
              positions:
                indicator: 'off'
                icon: 'off'
              severity:
                - text: Vigilance
                  color: green
                - text: Alerte
                  color: yellow
                - text: Alerte renforcée
                  color: orange
                - text: Crise
                  color: red
          card_mod:
            style: >
              bar-card-currentbar, bar-card-backgroundbar {
                border-radius: 25px;
              }

              #states > bar-card-row > bar-card-card > bar-card-background >
              bar-card-contentbar > bar-card-name {
                font-size: 16px;
                color: black;
              }   ha-card {
                margin-top: -2px;
                background: none;
                border: none;
              }
  - type: custom:mod-card
    card_mod:
      style: |
        ha-card {
          margin: -5px 5px 5px 5px;
        }
    card:
      type: custom:auto-entities
      card:
        type: grid
        columns: 5
        square: true
      card_param: cards
      filter:
        include:
          - entity_id: sensor.*_restrictions
            options:
              type: custom:button-card
              color_type: icon
              aspect_ratio: 1/1
              show_name: false
              show_state: true
              show_label: true
              label: |
                [[[ 
                   if (entity.attributes.friendly_name == 'Arrosage des jardins potagers') {
                     var hd = entity.attributes['Arrosage des jardins potagers (heureDebut)']
                     var hf = entity.attributes['Arrosage des jardins potagers (heureFin)']
                   } 
                   else
                   {
                     if (entity.attributes.friendly_name == 'Arrosage des pelouses') {
                       var hd = entity.attributes['Arrosage des pelouses, massifs fleuris (y compris jardinières, balconnières et fleurs en pot) (heureDebut)']
                       var hf = entity.attributes['Arrosage des pelouses, massifs fleuris (y compris jardinières, balconnières et fleurs en pot) (heureFin)']
                     }
                   }
                   if (hd != undefined) {
                     return hd + ' à ' + hf
                   }
                ]]]               
              name: |
                [[[
                   return entity.attributes.friendly_name
                ]]]
              styles:
                card:
                  - '--mdc-ripple-color': rgb(68, 115, 158)
                  - '--mdc-ripple-press-opacity': 0.5
                  - border-radius: 8px
                name:
                  - font-size: 9px
                  - white-space: normal
                label:
                  - font-size: 9px
                  - white-space: normal
                  - color: red
                state:
                  - font-size: 9px
                  - white-space: normal
              state:
                - value: Aucune restriction
                  operator: '=='
                  color: green
                  styles:
                    card:
                      - box-shadow: 0px 0px 0px 2px green
                    state:
                      - color: green
                - value: Interdiction sauf exception
                  operator: '=='
                  color: orange
                  styles:
                    card:
                      - box-shadow: 0px 0px 0px 2px orange
                    state:
                      - color: orange
                - value: Interdiction
                  operator: '=='
                  color: red
                  styles:
                    card:
                      - box-shadow: 0px 0px 0px 2px red
                    state:
                      - color: red
                - value: Interdiction sur plage horaire
                  operator: '=='
                  styles:
                    icon:
                      - color: |
                          [[[ 
                             if (entity.attributes.friendly_name == 'Arrosage des jardins potagers') {
                               var hd = entity.attributes['Arrosage des jardins potagers (heureDebut)']
                               var hf = entity.attributes['Arrosage des jardins potagers (heureFin)']
                             } 
                             else
                             {
                               if (entity.attributes.friendly_name == 'Arrosage des pelouses') {
                                 var hd = entity.attributes['Arrosage des pelouses, massifs fleuris (y compris jardinières, balconnières et fleurs en pot) (heureDebut)']
                                 var hf = entity.attributes['Arrosage des pelouses, massifs fleuris (y compris jardinières, balconnières et fleurs en pot) (heureFin)']
                               }
                             }
                            if ( (new Date()).toLocaleTimeString("fr-FR")  > hd) {
                              if ( (new Date()).toLocaleTimeString("fr-FR")  < hf )
                                return 'orange'
                            }
                            return 'green'
                          ]]]      
                    card:
                      - box-shadow: |
                          [[[ 
                             if (entity.attributes.friendly_name == 'Arrosage des jardins potagers') {
                               var hd = entity.attributes['Arrosage des jardins potagers (heureDebut)']
                               var hf = entity.attributes['Arrosage des jardins potagers (heureFin)']
                             } 
                             else
                             {
                               if (entity.attributes.friendly_name == 'Arrosage des pelouses') {
                                 var hd = entity.attributes['Arrosage des pelouses, massifs fleuris (y compris jardinières, balconnières et fleurs en pot) (heureDebut)']
                                 var hf = entity.attributes['Arrosage des pelouses, massifs fleuris (y compris jardinières, balconnières et fleurs en pot) (heureFin)']
                               }
                             }
                             if ( (new Date()).toLocaleTimeString("fr-FR")  > hd) {
                               if ( (new Date()).toLocaleTimeString("fr-FR")  < hf )
                                 return '0px 0px 0px 2px orange'
                             }
                             return '0px 0px 0px 2px green'
                          ]]]                        
                    state:
                      - color: orange
              size: 50%
        exclude:
          - entity_id: sensor.*_restrictions
            state: Aucune restriction
      sort:
        method: name
        reverse: false

Merci à ceux qui ont produit le code que j’ai uniquement amélioré à mon goût.

Fred

ca devient compliqué là…
les horaires sont liés au niveau d’alerte apparement
il serait probablement plus simple de le gerer au niveau de l’alerte non ?

page 5 du document

Merci @kamaradclimber pour les logos :+1:

@kamaradclimber

est-il possible dans l’intégration d’avoir cela :

Categorie: Arrosage des jardins potagers: Interdiction sur plage horaire
Debut: 11:00
Fin: 18:00
icon: mdi:watering-can
friendly_name: Arrosage des jardins potagers

Ce serait plus simple à gérer dans le code avec un item constant quelques soit le sensor.

plutôt que

Categorie: Arrosage des jardins potagers: Interdiction sur plage horaire
Arrosage des jardins potagers (heureDebut): 11:00
Arrosage des jardins potagers (heureFin): 18:00
icon: mdi:watering-can
friendly_name: Arrosage des jardins potagers

fred

Pas si simple, car un capteur est utilisé potentiellement par plusieurs restrictions et donc des horaires différents.

1 « J'aime »

@kamaradclimber

Je n’ai pas regardé le code de l’intégration, il me paraissait simple de tronquer le string pour garder heureDebut plutôt que Arrosage des jardins potagers (heureDebut): 11:00

Je vais essayer de trouver une solution dans le code carte.

Merci pour tes intégrations très utiles.

J’ai modifié dans init.py les ligne suivantes :
Capture d’écran 2023-07-25 à 13.30.04

Cela semble fonctionner.

Fred