Pollens custom component sensor

Erreur depuis hier sur le sensor

Logger: homeassistant.components.sensor
Source: custom_components/pollens/sensor.py:148 
Integration: Capteur (documentation, issues) 
First occurred: 7:42:01 (2 occurrences) 
Last logged: 7:42:01

Error adding entities for domain sensor with platform pollens
Error while setting up pollens platform for sensor
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 317, in async_add_entities
    await asyncio.gather(*tasks)
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 509, in _async_add_entity
    await entity.add_to_platform_finish()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 530, in add_to_platform_finish
    self.async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 295, in async_write_ha_state
    self._async_write_ha_state()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 334, in _async_write_ha_state
    icon = (entry and entry.icon) or self.icon
  File "/config/custom_components/pollens/sensor.py", line 148, in icon
    return ICONS[self._data.get("riskLevel")]
KeyError: 2

Pour quel département ? J’ai corrigé un problème sur le pollen « Cupressacées » :roll_eyes: que je n’avais pas géré, mais qui ne semble pas être celui pour lequel vous avez un problème.

Edit : Corrigé dans la version 2021.3.18

Bonsoir à tous,
J’ai bien réussi à importer le repository dans HACS et je suis averti des mises à jour.
Maintenant, question basique : je l’utilise comment ce « sensor » ?
Dans Lovelace, quand je crée une carte « entité » je ne trouve pas trace du sensor « pollen ».
Faut il le rechercher sous un autre nom ? ou bien faut il avant ajouter une intégration via configuration/intégration ?
Je précise que j’ai bien ajouté dans configuration.yaml la section « sensor » indiquée le manuel
Bref je débute et là il me manque un panneau de direction :wink:
Merci par avance pour vos infos
cdlt
Christophe

Bonjour cchristo
En fait il faut manuellement ajouter le composant dans le fichier configuration.yaml comme expliqué dans le README

sensor:
  - platform: pollens
    location: "60"
    timeout: 60

Indiquer le bon numéro de département. Le timeout est facultatif

Après avoir redémarré HomeAssistant, le sensor devrait appararaitre sours le nom sensor.pollens_dpt (sensor.pollens_oise dans l’exemple).
Ne pas hésiter a regarder dans les LOG de homeassistant s’il n’y a pas une erreur.

Bonjour chris60600

j’avais bien ajouté la section dans le fichier configuration.yaml, mais quand tu dis "le sensor devrait appararaitre sours le nom sensor.pollens_dpt " : il apparaît où ?
Cela devrait il créer automatiquement une carte dans lovelace ?

En configuration du tableau de bord automatique, tu auras une entrée ajoutée (pas forcément une carte dédiée).

Quand @chris60600 te dis que tu devrais avoir une entité, il te faut te rendre dans Outils de développement -> Onglet ETATS

je corrige : la section dans le fichier configuration.yaml, est bien prise en compte.
je trouve le sensor.pollens_paris par contre j’aimerais afficher une carte avec les attributs de l’entité.
La seule info que me donne l’entité dans une carte est son « état global » mais pas le détail (donnés par les attributs) des différentes plantes (aulne, peuplier, … ) :

url: 'https://pollens.fr'
departement: Paris
aulne: très faible
peuplier: très faible
saule: très faible
cupressacees: très faible
friendly_name: pollens Paris
icon: 'mdi:alert-outline'

Comment faire pour créer une carte avec les valeurs des attributs de l’entité ?
Graphiquement cela ne semble pas réalisable, donc il faut probablement passer par l’éditeur de code ?

Oui, graphiquement ce n’est pas encore possible, mais la documentation de la carte explique comment faire :wink:

Regarde par là : Heure de lever et coucher du soleil - #5 par Clemalex

Le code te servira de modèle pour afficher les attributs et non l’état :+1:

Super.
Merci beaucoup, j’ai réussi à obtenir ce que je veux :

image

Ajoute ton code :+1:

Voici le code de la carte créée dans lovelace.

type: entities
entities:
  - entity: sensor.pollens_paris
    name: Statut Global
  - entity: sensor.pollens_paris
    name: Aulne
    type: attribute
    attribute: aulne
  - entity: sensor.pollens_paris
    name: Peuplier
    type: attribute
    attribute: peuplier
  - entity: sensor.pollens_paris
    name: Saule
    type: attribute
    attribute: saule
  - entity: sensor.pollens_paris
    name: Cupressacees
    type: attribute
    attribute: cupressacees
title: Pollens à Paris

Cependant ce n’est pas la bonne solution car j’imagine que les attributs (les pollens) sont mis à jour et changent dès qu’un nouveau pollen (disp)apparaît.
Idéalement j’aimerais afficher un graphique similaire à celui du site pollens.fr à partir des attributs remontés par le « sensor » (c’est à dire un graphique limité aux lignes des pollens actifs) :

La bonne approche doit être du coté d’un template … mais là je découvre.
Si vous avez des pointeurs sur l’usage des templates dans lovelace, je suis preneur.
Dans mon cas je ne dois pas écrire « en dur » les noms (« name ») des pollens mais les déduires des attributs du sensor.

j’avance très doucement :
avec le code suivant je détecte les pollens renseignés avec leur niveau de risque :

{% set  ns = namespace(pollen = []) %}
{%  for item in states.sensor.pollens_paris.attributes %}
  {% if item in ("ambroisies","armoise", "aulne", "bouleau", "charme", 
                "chataigner", "chene", "cupressacees", "frene", 
                "gramines", "noisetier", "olivier", "oseille", "peuplier", 
                "plantain", "platane", "saule", "tilleul", "urticacees") -%} 
     {% set ns.pollen = ns.pollen + [item + ':' + state_attr('sensor.pollens_paris', item)] %}
  {%- endif %}
{% endfor %}
{% set list = ns.pollen | join('\n') %}
{{list}}

La liste {{list}} me donne bien uniquement les pollens présents dans le sensor.

aulne:très faible
peuplier:très faible
saule:très faible
cupressacees:très faible

Maintenant il me reste à utiliser ce code pour que ma carte dans lovelace soit dynamique … et là j’ai besoin de votre aide

Juste si tu veux ne pas lister tous les types de pollens :

{% set  ns = namespace(pollen = []) %}
{%  for item in states.sensor.pollens_paris.attributes %}
  {% if not item in ("attribution","url", "departement", "friendly_name", "icon") -%}  
     {% set ns.pollen = ns.pollen + [item ~ ': ' ~ state_attr('sensor.pollens_paris', item)] %}
  {%- endif %}
{% endfor %}
{% set list = ns.pollen | join('\n') %}
{{list}}

Qu’elle carte ?

bonsoir @Clemalex

effectivement, plus simple d’écarter les valeurs désirées.

pour la sortie dans Lovelace, j’utilise une carte de type « entities » pour afficher les différents attributs. Ce qui donne le code suivant par ex où j’ai écrit en dur les noms des pollens. Ce qui n’est pas propre puisque demain ce sera peut être d’autres pollens :

type: entities
entities:
  - entity: sensor.pollens_paris
    name: Statut Global
  - entity: sensor.pollens_paris
    name: Aulne
    type: attribute
    attribute: aulne
  - entity: sensor.pollens_paris
    name: Peuplier
    type: attribute
    attribute: peuplier

je veux donc utiliser le code que tu as modifié pour construire une carte avec les valeurs (pollens) récupérées.
En fait, je pense que la solution est de faire un « sensor template » utilisant ce code … mais je n’ai pas encore tout compris :woozy_face: :face_with_thermometer:

Erreur sur le sensors.yaml
je veux créer autant de sensors qu’il y a de pollens dans pollen_paris. Ensuite, j’utiliserai une carte de types « entities » pour dynamiquement les sensors correspondant aux différents pollens.

Dans l’outil de dev ça fonctionne :

{% set  ns = namespace(pollen = []) -%}
{%  for item in states.sensor.pollens_paris.attributes -%}
  {% if not item in ("attribution","url", "departement", "friendly_name", "icon") -%}
     {% set ns.pollen = ns.pollen  + [item + ':' + state_attr('sensor.pollens_paris', item)] -%}
  {%- endif -%}
{% endfor -%}

- platform: template
  sensors:
      {% for pollen in ns.pollen -%}
      {% set p = pollen.split(':')[0] -%}
      - sensor.pollen_{{p}}
         friendly_name: Pollen {{ p }}
         value_template: {% set risk = pollen.split(':')[1] -%}{{risk}}
     {% endfor -%}

donne en sortie le résultat attendu :

- platform: template
  sensors:
      - sensor.pollen_aulne
         friendly_name: Pollen aulne
         value_template: très faible
     - sensor.pollen_peuplier
         friendly_name: Pollen peuplier
         value_template: très faible
     - sensor.pollen_saule
         friendly_name: Pollen saule
         value_template: très faible
     - sensor.pollen_cupressacees
         friendly_name: Pollen cupressacees
         value_template: très faible

par contre quand je mets le code dans sensors.yaml j’ai une erreur :

Configuration invalide
Error loading /config/configuration.yaml: while scanning for the next token
found character ‹ % › that cannot start any token
in « /config/sensors.yaml », line 5, column 2

contenu de sensors.yaml :

- platform: pollens
  location: "75"
  timeout: 60

{% set  ns = namespace(pollen = []) -%}
{%  for item in states.sensor.pollens_paris.attributes -%}
  {% if not item in ("attribution","url", "departement", "friendly_name", "icon") -%}
     {% set ns.pollen = ns.pollen  + [item + ':' + state_attr('sensor.pollens_paris', item)] -%}
  {%- endif -%}
{% endfor -%}
- platform: template
  sensors:
      {% for pollen in ns.pollen -%}
      {% set p = pollen.split(':')[0] -%}
      pollen_{{p}}
        friendly_name: Pollen {{ p }}
        value_template: {% set risk = pollen.split(':')[1] -%}{{risk}}
     {% endfor %}

Une bonne source d’inspiration :

Bonjour,

N’hésitez pas a me remonter les améliorations que vous voudriez voir implémentées.
J’avais pensé au sensor pollen dominant, et a ajouter la possibilité de passer par l’interface graphique pour configurer l’intégration.
Je ne dis pas que je vais tout faire maintenant…

:+1:


Bonjour,

Pour moi ton code ci-dessous doit se trouver sous "sensors:" de ta "platform: template" et non dans le « coeur » de sensors.yaml.

Un jolie carte Lovelace associée :+1:.

Pour avoir deux trois plugins en cours sur hacs je sais que ce n’est pas facile donc pas d’urgence ou autre c’est juste une idée comme ça au hasard.