YAML : Questions influxdb et sensor associés

Mon problème

Bonjour à tous, je rentre de plus en plus dans le détail et la personnalisation de Home Assistant au fur et à mesure que je déploie mes capteurs mais là j’ai un soucis de compréhension après la lecture d’un tuto et de la doc officiel.

Je suis intéressé par l’externalisation du stockage des remontées de mes capteurs (notamment température, humidité) dans une base InfluxDB comme je le fais déjà avec mon module de téléinformation EDF. J’ai donc suivi la doc (InfluxDB - Home Assistant) et j’ai également lu le tuto : [InfluxDB v1.8.x] Aller encore plus loin!

Si j’ai bien compris la différence est que d’un côté (officiel) on duplique la base de données HA vers InfluxDB en listant les capteurs inclu/exclu. De l’autre côté (tuto) nous envoyons uniquement les données que l’on souhaite vers InfluxDB grâce aux flow node-red. Est-ce que j’ai bien compris déjà ?

Avant de valider ma stratégie, je voulais donc vous poser la question :slight_smile:

Ensuite étant donné que j’ai déjà mes données de téléinfo edf dans une base influxdb (envoyé via un flow node-red pour le coup) j’ai voulu créer manuellement mon sensor pour éviter d’avoir à afficher un graphique grafana dans mes dashboard lovelace mais plus d’utiliser les cartes « standards ».
J’ai donc mis le code suivant dans mon configuration.yaml

sensor:
  - platform: influxdb
    api_version: 2
    ssl: false
    host: 192.168.1.20
    port: 8086
    organization: "XXXXXXXX"
    bucket: "homeassistant"
    token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    queries_flux:
      - name: "elec puissance instan"
        group_function: mean
        imports:
          - strings
        query: >
          filter(fn: (r) => r._measurement == "W" and r._field == "value" and r.entity == "conso_teleinfo") 
          |> sort(columns: ["_time"], desc: true)
          |> first()
        range_start: "-1m"

Mais ce code n’a eu aucune effet … le sensor n’apparait pas dans http://homeassistant.local:8123/config/entities … Du coup j’ai cherché un peu pourquoi et j’ai trouvé ce lien dans la doc officiel : Template - Home Assistant
Il est indiqué qu’on pouvait déclarer les sensor via un code différent (exemple de la doc) :

template:
  - sensor:
      - name: "Average temperature"
        unit_of_measurement: "°C"
        state: >
          {% set bedroom = states('sensor.bedroom_temperature') | float %}
          {% set kitchen = states('sensor.kitchen_temperature') | float %}

          {{ ((bedroom + kitchen) / 2) | round(1, default=0) }}

Du coup je suis perdu :faut-il utiliser « sensor » direct ou « template → sensor » ?

Merci beaucoup pour votre aide !

Ma configuration


[center]## System Information

version core-2022.9.5
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.10.5
os_name Linux
os_version 5.15.61-v8
arch aarch64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
GitHub API Calls Remaining 5000
Installed Version 1.27.2
Stage running
Available Repositories 1119
Downloaded Repositories 8
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 9.0
update_channel stable
supervisor_version supervisor-2022.09.1
agent_version 1.3.0
docker_version 20.10.17
disk_total 6.6 GB
disk_used 4.4 GB
healthy true
supported true
board rpi3-64
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (9.6.1), Samba Backup (5.1.2), Node-RED (13.4.0), File editor (5.4.1), Grafana (8.0.2)
Dashboards
dashboards 2
resources 4
views 15
mode storage
Recorder
oldest_recorder_run 16 septembre 2022, 06:39
current_recorder_run 24 septembre 2022, 22:26
estimated_db_size 110.80 MiB
database_engine sqlite
database_version 3.38.5
[/center] ___

Bonjour à tous,

Personne ne peut m’orienter sur une solution ? :frowning:

Salut,

J’ai pas toutes réponses notamment pur tout ce qui récupération de sensors à partir de grafana (mais c’est un truc que je me mets de coté).
J’ai vu ça mais un peu vieux

A voir s’il n’y a pas des erreurs/warnings dans les logs concernant le ‹ format › du tempate
Pour l’ajout dans la base influxdb, que ce soit à partir de la méthologie officielle ou à partir de nodered, il n’y a pas beaucoup de différence. A mon avis les éléments importants à prendre en compte c’est de pouvoir dans les 2 cas, faire le tri de ce qu’on envoie dans la base (histoire d’éviter de polluer le contenu)

Ca marche chez moi comme ça:

1 « J'aime »

Salut il manque juste le bloc/hierarchie yaml avant sensor pour être complet. Template probablement ?

Petit complément d’info, perso avec influxdb/api v2 je passe plus par le user/password comme dans l’exemple mais par le token

# api_version: 1
# username: !secret influxdb_user
# password: !secret influxdb_password
# database: homeassistantDB
api_version: 2
token: !secret influxdb_token
bucket: !secret influxdb_bucket_in
organization: !secret influxdb_org
host: !secret influxdb_ip
ssl: false
verify_ssl: false
port: !secret
max_retries: 3
default_measurement: state

ensuite à relire le truc j’ai quand même l’impression que les 2 commandes ne font pas la même chose.
Autant la première ça ressemble bien à un truc à aller chercher dans influxdb, autant le template, on dirait plus de la manip d’affichage, les ‹ sensors › sont à la norme HA :face_with_diagonal_mouth:

1 « J'aime »

Oui. j’aurais du faire la capture complète.

Merci pour les retours. J’essayerai de lire tout ça ce soir tranquillement. C’est quand même pas super limpide tout va en tout cas :slightly_smiling_face:

Pour la connexion a influxdb je confirme que seule la connexion par token fonctionne. Impossible en v2 de passer un login/MDP

Je refais des tests après la lecture et comparaison de ce que j’ai fait et vous reviens avec j’espère un truc qui marche :crossed_fingers::crossed_fingers:

Comme promis je reviens avec mes avancées.

L’une des solutions est visiblement d’ajouter un 1er bloc dans mon configuration.yaml avec juste la configuration influxdb. Même si cette configuration n’envoie rien à ma base influxdb (j’ai tout mis en exclude) elle permet de créer la connexion à la base. Ce bloc est donc obligatoire même si l’on veut juste récupérer des infos d’une base sans en envoyer.

influxdb:
    api_version: 2
    ssl: false
    verify_ssl: false
    max_retries: 3
    host: 192.168.1.20
    port: 8086
    token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    organization: "AAAAAAAAAA"
    bucket: "homeassistant"
    exclude:
        entity_globs: "*"

Ensuite j’ai (pour l’instant) supprimer mes autres sensor déclarés car j’avais une erreur si j’ajouté « platform: influxdb » dans un bloc « template → sensor ». J’ai donc pour l’instant abandonné et essayé directement avec « sensor ».

J’ai donc ajouté le code suivant :

sensor:
  - platform: influxdb
    api_version: 2
    ssl: false
    verify_ssl: false
    host: 192.168.1.20
    port: 8086
    token: "XXXXXXXXXXXXXXXXXXXXXXXXXXx"
    organization: "AAAAAAAAAAA"
    bucket: "homeassistant"
    queries_flux:
      - name: "Electricité puissance instantanée"
        imports:
          - strings
        unit_of_measurement: "Wh"
        value_template: '{{ value | round(1) }}'
        query: >
          filter(fn: (r) => r._measurement == "W")
          |> filter(fn: (r) => r._field == "value")
          |> filter(fn: (r) => r.entity == "conso_teleinfo")
          |> sort(columns: ["_time"], desc: true)
          |> first()
        range_start: "-1m"

Grâce à c’est codes : plus d’erreurs dans mes notifications au redémarrage ni de message d’erreur dans les logs.

En plus j’ai même un sensor qui remonte dans mes entités Home Assistant !!

Il me reste une chose à comprendre c’est pourquoi dans les données récupérées je n’ai que quelques minutes.

Salut

C’est étonnant puisque tu remet cette configuration dans le bloc pour lire la base… Il se passe quoi par exemple quand on mets un truc différent d’un coté et de l’autre ? C’est pas logique, l’une ou l’autre n’est forcement pas utilisée…

Il faut tester la query et vérifier le contenu de la base…

Oui j’ai trouvé ça très étonnant c’est pour ça que j’avais fait un dernier en supprimant la 1ère partie en me disant que vu que les paramètres sont strictement identiques ça n’avait pas d’importance et au redémarrage j’avais un message d’erreur … Dans la même logique j’avais oublié de mettre "ssl: false et « verify-ssl: false » dans la partie du sensor et là aussi j’avais un message d’erreur qui m’indiquait que le certificat ssl n’avait pas été trouvé … bref pas très compréhensible mais maintenant ça marche …

Pour la query j’ai juste une question : le sensor représente 1 valeur à 1 instant t c’est bien ça ? Du coup comment je peux lui dire que finalement c’est pas 1 valeur que je veux mais X valeurs (genre les 24 dernières heures) ? Ou alors c’est le concept de « sensor » que je n’ai pas compris.

De mon coté j’ai regardé la doc et l’exemple …

# Example configuration.yaml entry
sensor:
  - platform: influxdb
    api_version: 2
    organization: RANDOM_16_DIGIT_HEX_ID
    token: GENERATED_AUTH_TOKEN
    queries_flux:
      - group_function: mean
        imports:
          - strings
        name: "Mean humidity reported from past day"
        query: >
          filter(fn: (r) => r._field == "value" and r.domain == "sensor" and strings.containsStr(v: r.entity_id, substr: "humidity"))
          |> keep(columns: ["_value"])
        range_start: "-1d"

Là on voit clairement que seules les infos poteniellement indispensables sont TOKEN et ORG…
Personnellement j’aurai bien aimer changer de bucket aussi

Oui c’est ce que j’avais lu et fait au départ aussi… C’est peut être un bug du coup ? Ou alors c’est juste que la doc a pas évoluer dans le temps et qu’il manque des choses ?

Je ne sais pas mais ça m’étonnerai.
Avec les paramètres minimaux et un token dédié à la lecture, j’ai une erreur 401. Donc techniquement c’est suffisant.
Je n’ai pas encore creusé beaucoup les options du token et org (chez moi pas en hexa…)

Platform influxdb not ready yet: InfluxDB bucket is not accessible due to '(401) Reason: Unauthorized HTTP response headers: HTTPHeaderDict({'Date': 'Mon, 03 Oct 2022 16:23:39 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '55', 'Connection': 'keep-alive', 'trace-id': '3d237e446df61b94', 'trace-sampled': 'false', 'x-platform-error-code': 'unauthorized', 'Strict-Transport-Security': 'max-age=15724800; includeSubDomains', 'X-Influxdb-Request-ID': 'b3796dba2290a8d2a664b497c60a348b', 'X-Influxdb-Build': 'Cloud'}) HTTP response body: b'{"code":"unauthorized","message":"unauthorized access"}' '. Please check that the bucket, org and token are correct and that the token has the correct permissions set.; Retrying in background in 30 seconds

Je viens de mettre en commentaire toute la partie « influxdb: » et mes sensors sont encore présents.
Par contre j’ai un message d’erreur au démarrage :
Invalid config : The following integrations and platforms could not be set up:

  • influxdb
  • influxdb.sensor
    Please check your config and [logs]

Dans les logs j’ai ceci :
Unable to prepare setup for platform influxdb.sensor: Unable to set up component.
22:14:04 – (ERREUR) setup.py
Error during setup of component influxdb
22:14:04 – (ERREUR) components/influxdb/init.py

Du coup pas sûr que mes sensors fonctionnent bien …

En parallèle, je viens de comparer le code initial que j’ai mis dans mon 1er poste et celui qui fonctionne maintenant:

  • Je n’avais pas mis « verify_ssl » mais pas sûr que ça soit le point bloquant
  • La query que j’avais mise n’était pas formatté exactement de la même façon : probablement le point bloquant

J’avais initialement mis ceci :

query: >
          filter(fn: (r) => r._measurement == "W" and r._field == "value" and r.entity == "conso_teleinfo") 
          |> sort(columns: ["_time"], desc: true)
          |> first()
        range_start: "-1m"

alors que maintenant j’ai ceci :

query: >
          filter(fn: (r) => r._measurement == "W")
          |> filter(fn: (r) => r._field == "value")
          |> filter(fn: (r) => r.entity == "conso_teleinfo")
        range_start: "-24h"
        group_function: mean

J’ai l’impression que les « and » n’étaient pas souhaitables dans la query et que si la query ne fonctionne pas alors erreur donc pas d’affichage du sensor sauf que mon dernier test ne confirme pas ça …

Bon ben tu as raison : il faut redéclarer pleins de trucs pour que ça marche…
Du coup, souci de syntaxe de ma query

EDIT : ça marche

- platform: influxdb
  api_version: 2
  token: !secret influxdb_token_out
  bucket: !secret influxdb_bucket_out
  organization: !secret influxdb_org
  host: !secret influxdb_ip
  ssl: false
  verify_ssl: false
  port: !secret influxdb_port
  queries_flux:
    - group_function: first
      name: "sonde_jardin_temperature historique"
      query: >
        filter(fn: (r) => r["entity_id"] == "sonde_jardin_temperature")
      range_start: "-365d"
```

Ah du coup tu as bien comme moi ? Il te faut la déclaration influxdb puis celle du sensor ?

ouais…
Et j’ai même l’impression qu’il faut refaire tout le bloc pour chaque sensor … c’est lourd

Bonjour à tous,
Je suis vraiment en galère avec cette histoire de token. J’essai de connecter grafana à influxdb, tous installé sur haos, mais je n’arrive pas à trouver comment le générer. Quelqu’un peu m’aider ?