Différences entre les versions de « InfluxDB »

De Wiki de Mémoire Vive
Aller à la navigation Aller à la recherche
 
(6 versions intermédiaires par le même utilisateur non affichées)
Ligne 10 : Ligne 10 :


Peut s'utiliser avec Python qui se charge de la partie amont pour alimenter influxDB.
Peut s'utiliser avec Python qui se charge de la partie amont pour alimenter influxDB.
Avec Home Assistant le couplage est automatisé, il faut ajouter quelques lignes dans le fichier configuration.yaml.


== Configuration Home Assistant ==
== Configuration Home Assistant ==
Ajouter ceci dans configuration.xml, en mettant l'adresse publique de la box et en mettant une source personnalisée, source: xxxx


<pre>
<pre>
Ligne 24 : Ligne 28 :
   tags:
   tags:
     source: HAmv
     source: HAmv
</pre>
Exemple de requete curl pour envoyer une requête à influxDB,
<pre>
curl -i -X POST "http://88.136.157.51:8086/api/v2/write?org=mv&bucket=temperature-exterieure" \
  --header "Authorization: Token rkFHS03mqejy32-FLeY7ASscBs8cnBsILRFZ9M6_UijtA09-vkT5lZhxzxFJXIf6XUDgnYlueyyp0eqEW9lGzA==" \
  --header "Content-Type: text/plain; charset=utf-8" \
  --data-binary "sensor_temp,source=HAdenis,entity=sensor.temp_tuya_19_3_2014_2_temperature value=8.5"
</pre>
Un exemple en précisant le capteur à suivre,
<pre>
influxdb:
  api_version: 2
  ssl: false
  host: "88.136.157.51"
  port: 8086
  token: "rkFHS03mqejy32-FLeY7ASscBs8cnBsILRFZ9M6_UijtA09-vkT5lZhxzxFJXIf6XUDgnYlueyyp0eqEW9lGzA=="
  organization: "mv"
  bucket: "temperature-exterieure"
  tags:
    source: "HAdenis"
  include:
    entities:
      - sensor.temp_tuya_19_3_2014_2_temperature
</pre>
Et un exemple de script de consultation des données en Python,
<pre>
from influxdb_client import InfluxDBClient
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime, timedelta, timezone
# Connexion à InfluxDB
url = "http://88.136.157.51:8086"  # Remplacez par l'URL de votre InfluxDB
token = "rkFHS03mqejy32-FLeY7ASscBs8cnBsILRFZ9M6_UijtA09-vkT5lZhxzxFJXIf6XUDgnYlueyyp0eqEW9lGzA=="  # Remplacez par votre token d'accès
org = "mv"  # Remplacez par votre organisation
bucket = "temperature-exterieure"
client = InfluxDBClient(url=url, token=token, org=org)
query_api = client.query_api()
# Requête Flux
query = f'''
from(bucket: "{bucket}")
  |> range(start: -1d, stop: now())
  |> filter(fn: (r) => r["source"] == "Fred" or r["source"] == "HA37" or r["source"] == "HAdenis" or r["source"] == "HAdominique")
  |> filter(fn: (r) => r["_measurement"] == "°C")
  |> filter(fn: (r) => r["entity_id"] == "ewelink_th01_temperature_2" or r["entity_id"] == "daikinap43817_climatecontrol_outdoor_temperature" or r["entity_id"] == "t_ext" or r["entity_id"] == "temp_tuya_19_3_2014_2_temperature")
  |> filter(fn: (r) => r["_field"] == "value")
  |> aggregateWindow(every: 1h, fn: mean, createEmpty: false)
  |> yield(name: "mean")
'''
# Exécuter la requête
result = query_api.query(query)
# Préparer les données pour le graphique
timestamps = []
values = []
labels = []
for table in result:
    for record in table.records:
        timestamps.append(record.get_time())
        values.append(record.get_value())
        labels.append(record.values.get('entity_id', ''))
# Créer un DataFrame pour faciliter l'affichage
df = pd.DataFrame({
    'timestamp': timestamps,
    'value': values,
    'entity_id': labels
})
# Afficher les données sous forme de graphique
plt.figure(figsize=(10, 6))
for entity_id in df['entity_id'].unique():
    subset = df[df['entity_id'] == entity_id]
    plt.plot(subset['timestamp'], subset['value'], label=entity_id)
plt.xlabel('Temps')
plt.ylabel('Température (°C)')
plt.title('Température extérieure par source')
plt.xticks(rotation=45)
plt.legend()
plt.tight_layout()
plt.show()
</pre>
</pre>

Version actuelle datée du 29 janvier 2025 à 21:50

Installation sous Proxmox,

https://community-scripts.github.io/ProxmoxVE/scripts?id=influxdb

Version 2, avec Telegraph.

Objectif : stocker des données en séries temporelles pour les exploiter ensuite sous forme de graphique ou tableau de bord.

En lien avec une source de données temps réel par exemple.

Peut s'utiliser avec Python qui se charge de la partie amont pour alimenter influxDB.

Avec Home Assistant le couplage est automatisé, il faut ajouter quelques lignes dans le fichier configuration.yaml.

Configuration Home Assistant[modifier]

Ajouter ceci dans configuration.xml, en mettant l'adresse publique de la box et en mettant une source personnalisée, source: xxxx

influxdb:
  api_version: 2
  ssl: false
  host: 192.168.1.84
  port: 8086
  token: rkFHS03mqejy32-FLeY7ASscBs8cnBsILRFZ9M6_UijtA09-vkT5lZhxzxFJXIf6XUDgnYlueyyp0eqEW9lGzA==
  organization: mv
  bucket: temperature-exterieure
  tags:
    source: HAmv

Exemple de requete curl pour envoyer une requête à influxDB,

curl -i -X POST "http://88.136.157.51:8086/api/v2/write?org=mv&bucket=temperature-exterieure" \
  --header "Authorization: Token rkFHS03mqejy32-FLeY7ASscBs8cnBsILRFZ9M6_UijtA09-vkT5lZhxzxFJXIf6XUDgnYlueyyp0eqEW9lGzA==" \
  --header "Content-Type: text/plain; charset=utf-8" \
  --data-binary "sensor_temp,source=HAdenis,entity=sensor.temp_tuya_19_3_2014_2_temperature value=8.5"

Un exemple en précisant le capteur à suivre,

influxdb:
  api_version: 2
  ssl: false
  host: "88.136.157.51"
  port: 8086
  token: "rkFHS03mqejy32-FLeY7ASscBs8cnBsILRFZ9M6_UijtA09-vkT5lZhxzxFJXIf6XUDgnYlueyyp0eqEW9lGzA=="
  organization: "mv"
  bucket: "temperature-exterieure"
  tags:
    source: "HAdenis"
  include:
    entities:
      - sensor.temp_tuya_19_3_2014_2_temperature

Et un exemple de script de consultation des données en Python,

from influxdb_client import InfluxDBClient
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime, timedelta, timezone

# Connexion à InfluxDB
url = "http://88.136.157.51:8086"  # Remplacez par l'URL de votre InfluxDB
token = "rkFHS03mqejy32-FLeY7ASscBs8cnBsILRFZ9M6_UijtA09-vkT5lZhxzxFJXIf6XUDgnYlueyyp0eqEW9lGzA=="  # Remplacez par votre token d'accès
org = "mv"  # Remplacez par votre organisation
bucket = "temperature-exterieure"

client = InfluxDBClient(url=url, token=token, org=org)
query_api = client.query_api()

# Requête Flux
query = f'''
from(bucket: "{bucket}")
  |> range(start: -1d, stop: now())
  |> filter(fn: (r) => r["source"] == "Fred" or r["source"] == "HA37" or r["source"] == "HAdenis" or r["source"] == "HAdominique")
  |> filter(fn: (r) => r["_measurement"] == "°C")
  |> filter(fn: (r) => r["entity_id"] == "ewelink_th01_temperature_2" or r["entity_id"] == "daikinap43817_climatecontrol_outdoor_temperature" or r["entity_id"] == "t_ext" or r["entity_id"] == "temp_tuya_19_3_2014_2_temperature")
  |> filter(fn: (r) => r["_field"] == "value")
  |> aggregateWindow(every: 1h, fn: mean, createEmpty: false)
  |> yield(name: "mean")
'''

# Exécuter la requête
result = query_api.query(query)

# Préparer les données pour le graphique
timestamps = []
values = []
labels = []

for table in result:
    for record in table.records:
        timestamps.append(record.get_time())
        values.append(record.get_value())
        labels.append(record.values.get('entity_id', ''))

# Créer un DataFrame pour faciliter l'affichage
df = pd.DataFrame({
    'timestamp': timestamps,
    'value': values,
    'entity_id': labels
})

# Afficher les données sous forme de graphique
plt.figure(figsize=(10, 6))
for entity_id in df['entity_id'].unique():
    subset = df[df['entity_id'] == entity_id]
    plt.plot(subset['timestamp'], subset['value'], label=entity_id)

plt.xlabel('Temps')
plt.ylabel('Température (°C)')
plt.title('Température extérieure par source')
plt.xticks(rotation=45)
plt.legend()
plt.tight_layout()
plt.show()