Files
Influxlibrary_Prax22/Influxclient.py
2022-12-09 11:20:16 +01:00

115 lines
3.2 KiB
Python

# -*- coding: utf-8 -*-
"""
Created on Mon Oct 17 13:45:38 2022
@author: Daniel Häfliger
"""
import pandas as pd
import math
import requests, json
from datetime import datetime, date, time
# Convert a date and time to to complex numbers
# [year_real, year_imag, day_real, day_imag]
def Convert_Date(atime):
y_r = math.sin(atime.timetuple().tm_yday/365*2*math.pi)
y_i = math.cos(atime.timetuple().tm_yday/365*2*math.pi)
d_r = math.sin((atime.hour*3600+atime.minute*60+atime.second)/((24*3600))*2*math.pi)
d_i = math.cos((atime.hour*3600+atime.minute*60+atime.second)/((24*3600))*2*math.pi)
return [y_r, y_i, d_r, d_i]
# Return a list of datas of a specified measurement of an influxDB
def Get_Value(client, bucket, atime, measurement, datapoint):
query_api = client.query_api()
query = 'from(bucket:"'+bucket+'")\
|> range(start: -'+atime+')\
|> filter(fn:(r) => r._field == "'+datapoint+'" )\
|> filter(fn:(r) => r._measurement == "'+measurement+'" )'
result = query_api.query(org=client.org, query=query)
thelist = []
for table in result:
for record in table.records:
thelist.append((record.get_value()))
return thelist
# Return the time of datas of a specified measurement of an influxDB
def Get_Time(client, bucket, atime, measurement, datapoint):
query_api = client.query_api()
query = 'from(bucket:"'+bucket+'")\
|> range(start: -'+atime+')\
|> filter(fn:(r) => r._field == "'+datapoint+'" )\
|> filter(fn:(r) => r._measurement == "'+measurement+'" )'
result = query_api.query(org=client.org, query=query)
thelist = []
for table in result:
for record in table.records:
thelist.append((record.get_time()))
a=[]
b=[]
c=[]
d=[]
for i in thelist:
x = Convert_Date(i)
a.append(x[0])
b.append(x[1])
c.append(x[2])
d.append(x[3])
return [a,b,c,d,thelist]
# Need duration in hours, interval in minutes
# Retruns array with complex time, timestamp and prediction
# Works only for max 3 days due api returns only values until then
def GetPrediction(duration, intervall, datapoint):
xfile = pd.read_xml('config.xml')
apikey = (xfile.loc[xfile['category'] == 'influx'].weatherapitoken[0])
place = (xfile.loc[xfile['category'] == 'influx'].place[0])
dats = requests.get("https://api.weatherapi.com/v1/forecast.json?key="+apikey+"&q="+place+"&days=3&aqi=yes&alerts=no")
dats=json.loads(dats.content)
a=[]
b=[]
c=[]
d=[]
e=[]
f=[]
now = datetime.now()
daycounter = 0
lasthour=now.hour
for i in range(0, int(duration*60/intervall)):
now = datetime.timestamp(now)+(intervall*60)
now = datetime.fromtimestamp(now)
x = Convert_Date(now)
a.append(x[0])
b.append(x[1])
c.append(x[2])
d.append(x[3])
e.append(now)
bc = dats["forecast"]["forecastday"][daycounter]["hour"][now.hour][datapoint]
f.append(bc)
if lasthour>now.hour:
daycounter+=1
lasthour=now.hour
return[a,b,c,d,e,f]