Purge de la BdD InfluxDB

Mon problème

Bonjour à tous,

Je viens de passer un moment à lire les posts sur le sujet mais je ne trouve pas de réponse.
J’espère que vous ne m’en voudrez pas de recréer un thread.

Je voudrais réduire les éléments stockés dans la base de données InfluxDB (pas la base HA en adaptant le recorder).

Dans ma configuration InfluxDB, j’ai volontairement augmenter la période de rétention


Afin de pouvoir faire des comparaison notamment sur l’électricité consommée sur 1 an glissant.

Toutefois, je suis persuadé que conserver tous les points de mesures n’est absolument pas nécessaire.
Comment pourrais-je voir les éléments qui me prennent le plus de place dans la base et comment faire en sorte de ne conserver par exemple que la valeur Max par jour (au delà de 1 mois par exemple).
J’ai essayé de requête avec InfluxDB mais je ne comprends pas du tout comment cela fonctionne.

Merci pour votre aide.
Si j’y parviens, je pense faire un tutoriel car je suis persuadé que ça servira (en plus de ceux sur home-assistant_V2.db)

Ma configuration


[center]## System Information

version core-2023.1.2
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.10.7
os_name Linux
os_version 5.15.84-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 4995
Installed Version 1.30.1
Stage running
Available Repositories 1207
Downloaded Repositories 28
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.5
update_channel stable
supervisor_version supervisor-2023.01.1
agent_version 1.4.1
docker_version 20.10.22
disk_total 457.7 GB
disk_used 24.2 GB
healthy true
supported true
board rpi4-64
supervisor_api ok
version_api ok
installed_addons File editor (5.5.0), Samba share (10.0.0), Duck DNS (1.15.0), Grafana (8.1.0), InfluxDB (4.5.0), Node-RED (14.0.2), Mosquitto broker (6.1.3), SSH & Web Terminal (13.0.2), Z-Wave JS (0.1.75), Studio Code Server (5.5.2), Zigbee2MQTT (1.30.1-1), Samba Backup (5.2.0)
Dashboards
dashboards 5
resources 21
views 41
mode storage
Recorder
oldest_recorder_run February 5, 2023 at 8:39 AM
current_recorder_run February 9, 2023 at 11:54 AM
estimated_db_size 3200.83 MiB
database_engine sqlite
database_version 3.38.5
[/center]

Salut,
Tu es passé à coté de ce sujet ??!

Bonjour @Pulpy-Luke,

Si si je l’ai vu et j’ai essayé de suivre ce qu’il y a écrit mais c’est de trop haut niveau pour moi :frowning:
Je ne vois absolument pas où taper des commandes SQL pour tenter de faire qq chose sur la base de données ?

Tu peux m’aider stp ?

ça va être compliqué alors parce que c’est juste une utilisation simpliste de influxdb

Pour ça tu as le data-explorer… Et l’aide à la création de requêtes. Heureusement parce que c’est pas du tout du SQL

Il faut aller où ??

Juste là ou tu es

Ok et tu me conseilles de commencer par quoi ? comme commande ?

Par faire quoi ?
Le premier conseil c’est de lire la doc et d’expérimenter
Tu as un éditeur : tu cliques, tu cliques, tu valides et ça fait une requête …

Ensuite, relire la doc et fais un premier bucket trié. Là tu as tous les détails dans le sujet mentionné.

bonjour,
comme crampes2 j’ai eu bcp de mal avec le post que tu sites Pulpy-Luke, surtout quand on est débutant. Quand on suit un post assez long c’est difficile de savoir ce qui est du test, du tuto, de la question…
quand à la doc, tout le monde ne maitrise pas l’anglais, et même si on maitrise un peu la langue de Shakespeare c’est pas évident…
je vais essayé de faire un résumé de ma solution (très très très largement inspiré du post) :

  1. creation des bases : il te faut plusieurs base dans influxdb :
  • 1 base qui va recueillir toutes tes données de HA : db_ha_all (par exemple) avec une rétention de 1 ou 2 mois
  • 1 base qui va recueillir les infos réduites (les min.max, les valeurs par jour, mois année) : db_ha_forever (par exemple) avec une rétention sans limite
  1. création de tasks qui va prendre les données de db_ha_all, les réduires et les mettre dans la base db_ha_forever :
  • sous influxdb, tu vas dans Task puis create task, voici une tache qui prend toutes tes données en kWh et calcule toutes les heures la différence entre le min et le max :
import "date"
import "experimental"
import "math"

option task = {name: "hourly_kwh", cron: "@hourly"}

heure = date.truncate(t: now(), unit: 1h)
heure_avant = experimental.addDuration(d: -1h, to: heure)

DATA1 =
    from(bucket: "db_ha_all")
        |> range(start: heure_avant, stop: heure)
        |> filter(fn: (r) => r["_measurement"] == "kWh")
        |> filter(fn: (r) => r["_field"] == "value")

DATA1
    |> set(key: "source", value: "calculated")
    |> reduce(
        fn: (r, accumulator) =>
            ({
                min:
                    if r._value < accumulator.min and r._value != 0.0 then
                        r._value
                    else
                        accumulator.min,
                max: if r._value > accumulator.max then r._value else accumulator.max,
                _time: r._time,
            }),
        identity: {min: 10000000000.0, max: -10000000000.0, _time: now()},
    )
    |> map(fn: (r) => ({r with _time: heure_avant}))
    |> map(fn: (r) => ({r with _value: math.round(x: (r.max - r.min) * 100.0) / 100.0}))
    |> to(bucket: "db_ha_forever")
  • pour faire la même chose tous les jours pour toutes les données kWh et € :
import "date"
import "experimental"
import "math"

option task = {name: "daily_kwh_€", cron: "@daily"}

TODAY = date.truncate(t: now(), unit: 1d)
YESTERDAY = experimental.addDuration(d: -1d, to: TODAY)

DATA1 =
    from(bucket: "db_ha_all")
        |> range(start: YESTERDAY, stop: TODAY)
        |> filter(fn: (r) => r["_measurement"] == "kWh" or r["_measurement"] == "€")
        |> filter(fn: (r) => r["_field"] == "value")

DATA1
    |> set(key: "source", value: "calculated")
    |> reduce(
        fn: (r, accumulator) =>
            ({
                min:
                    if r._value < accumulator.min and r._value != 0.0 then
                        r._value
                    else
                        accumulator.min,
                max: if r._value > accumulator.max then r._value else accumulator.max,
                _time: r._time,
            }),
        identity: {min: 10000000000.0, max: -10000000000.0, _time: YESTERDAY},
    )
    |> map(fn: (r) => ({r with _time: YESTERDAY}))
    |> map(fn: (r) => ({r with _value: math.round(x: (r.max - r.min) * 100.0) / 100.0}))
    |> map(fn: (r) => ({r with min: r.min}))
    |> map(fn: (r) => ({r with min: r.max}))
    |> to(bucket: "db_ha_forever")
  • idem mais tous les mois :
import "date"
import "experimental"
import "math"

option task = {name: "monthly_kwh_€", cron: "@monthly"}

MONTH = date.truncate(t: now(), unit: 1mo)
MONTH_avant = experimental.addDuration(d: -1mo, to: MONTH)

DATA1 =
    from(bucket: "db_ha_all")
        |> range(start: MONTH_avant, stop: MONTH)
        |> filter(fn: (r) => r["_measurement"] == "kWh" or r["_measurement"] == "€")
        |> filter(fn: (r) => r["_field"] == "value")

DATA1
    |> set(key: "source", value: "calculated")
    |> reduce(
        fn: (r, accumulator) =>
            ({
                min:
                    if r._value < accumulator.min and r._value != 0.0 then
                        r._value
                    else
                        accumulator.min,
                max: if r._value > accumulator.max then r._value else accumulator.max,
                _time: r._time,
            }),
        identity: {min: 10000000000.0, max: -10000000000.0, _time: now()},
    )
    |> map(fn: (r) => ({r with _time: MONTH}))
    |> map(fn: (r) => ({r with _value: math.round(x: (r.max - r.min) * 100.0) / 100.0}))
    |> to(bucket: "db_ha_forever")
  • pour les températures :
import "date"
import "experimental"
import "math"

option task = {name: "daily_temperature ", cron: "@daily"}

TODAY = date.truncate(t: now(), unit: 1d)
YESTERDAY = experimental.addDuration(d: -1d, to: TODAY)
DATA =
    from(bucket: "db_ha_all")
        |> range(start: YESTERDAY, stop: TODAY)
        |> filter(fn: (r) => r["_measurement"] == "°C" or r["_measurement"] == "%")
        |> filter(fn: (r) => r["_field"] == "value")

DATA
    |> mean()
    |> map(fn: (r) => ({r with _time: YESTERDAY}))
    |> set(key: "statistics", value: "mean")
    |> set(key: "source", value: "calculated")
    |> map(fn: (r) => ({r with _value: math.round(x: r._value * 10.0) / 10.0}))
    |> to(bucket: "db_ha_jour")
DATA
    |> min()
    |> map(fn: (r) => ({r with _time: YESTERDAY}))
    |> set(key: "statistics", value: "min")
    |> set(key: "source", value: "calculated")
    |> to(bucket: "db_ha_jour")
DATA
    |> max()
    |> map(fn: (r) => ({r with _time: YESTERDAY}))
    |> set(key: "statistics", value: "max")
    |> set(key: "source", value: "calculated")
    |> to(bucket: "db_ha_forever")

tu y retrouves les task de Neuvidor… :slight_smile:
En jouant sur date.truncate tu peux faire pareil par année. y a aussi moyen de faire les mois, jour et heure en cours ( pour ne pas attendre la fin de la période pour avoir la valeur courant : voir les posts de Neuvidor).
après il faut que tu crées les liens entre Grafana et ces 2 bases. faut jouer un peu sur les paramètres de grafana pour avoir des histogramme qui tiennent le route.

1 « J'aime »

Merci pour la synthèse.
Reste à voir si c’est plus digeste comme ça.
Trouver comment adapter, comprendre ce que ça fait etc sont des choses qu’il faut faire dans tous les cas. Anglais compris :wink: