Récupération données InfluxDB sous Python pour post-traitement

Histoire de bien réguler ma commande de chaudière, j’ai besoin de post-traiter quelques mesures qui sont stockées régulièrement sur InfluxDB. Ceci peut être utile pour, par exemple, calculer l’erreur (P), la pente de l’erreur (D), et l’intégration de l’erreur (I) avec pandas pour tenter de réguler la chaudière avec un régulateur PID.

from influxdb import DataFrameClient
import pandas as pd
import plotly.plotly as py
import plotly.graph_objs as go

dbname = 'temperature'
client = DataFrameClient(host, 8086,username,password, dbname)

consigne = client.query("SELECT value FROM consigne_chaudiere")

Petit problème, mes sondes ne sont pas toutes enregistrées en même temps (quelques ms d’écart, voir minutes pour la sonde extérieure). On doit donc retravailler le tableau, resample à 1minute, et interpoler linéairement pour les trous qui apparaissent (NaN).

consigne = client.query("SELECT value FROM consigne_chaudiere")
consigne = pd.concat(consigne, axis=1)
consigne.columns = consigne.columns.droplevel()
consigne.index.name="time"
times = pd.to_datetime(consigne.index)
consigne  = (consigne.groupby(times.round('1min') )['value'].mean()).asfreq('Min')
consigne2 = consigne.resample('T')
consigne_interpolated = consigne2.interpolate(method='linear')

On fait pareil avec la mesure de température (salon), puis on peut calculer l’erreur entre les deux car les points correspondent temporellement dans les deux séries.

A moi les folles soirées de calcul et de test de régulation !