Différences entre les versions de « InfluxDB »
(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()