InfluxDB
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
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()