Influx related functionality finished
This commit is contained in:
0
api/__init__.py
Normal file
0
api/__init__.py
Normal file
33
api/testAPI.py
Normal file
33
api/testAPI.py
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
from fastapi import (
|
||||||
|
APIRouter,
|
||||||
|
status,
|
||||||
|
Body, Depends)
|
||||||
|
from influxdb_client.client.influxdb_client_async import InfluxDBClientAsync
|
||||||
|
from influx_related import get_influxdb_client, get_influx_data, write_influx_data
|
||||||
|
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
|
|
||||||
|
@router.get(
|
||||||
|
path="/get_influx/",
|
||||||
|
name='get data from influxdb, last one hour',
|
||||||
|
#response_model=InfluxDBClientAsync,
|
||||||
|
responses={
|
||||||
|
status.HTTP_401_UNAUTHORIZED: {},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
async def get_influx(client: InfluxDBClientAsync = Depends(get_influxdb_client)):
|
||||||
|
return {'results': await get_influx_data(client)}
|
||||||
|
|
||||||
|
@router.post(
|
||||||
|
path="/write_influx/",
|
||||||
|
name='write data to influxdb',
|
||||||
|
#response_model=InfluxDBClientAsync,
|
||||||
|
responses={
|
||||||
|
status.HTTP_401_UNAUTHORIZED: {},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
async def write_influx(temp: float, client: InfluxDBClientAsync = Depends(get_influxdb_client)):
|
||||||
|
await write_influx_data(client, temp)
|
||||||
|
return {"status": "OK"}
|
||||||
|
|
||||||
6
config.py
Normal file
6
config.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
INFLUX_URL='http://localhost:8086'
|
||||||
|
INFLUX_BUCKET='test_bucket'
|
||||||
|
INFLUX_TOKEN='Os1nJwYP1TyPRF0iQhaft677Qh87uPPMoROFtmlh_8uXbc5q1xQDguCjtWZFj6nN69KJylXSupBVt6M5CQZueA=='
|
||||||
|
INFLUX_ORG='my_org'
|
||||||
34
influx_related.py
Normal file
34
influx_related.py
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
from fastapi import FastAPI
|
||||||
|
from influxdb_client.client.influxdb_client_async import InfluxDBClientAsync
|
||||||
|
from influxdb_client import Point
|
||||||
|
from config import *
|
||||||
|
|
||||||
|
influxdb_client: InfluxDBClientAsync
|
||||||
|
|
||||||
|
def init_influx(app: FastAPI):
|
||||||
|
global influxdb_client
|
||||||
|
influxdb_client = InfluxDBClientAsync(
|
||||||
|
url=INFLUX_URL,
|
||||||
|
token=INFLUX_TOKEN,
|
||||||
|
org=INFLUX_ORG,
|
||||||
|
)
|
||||||
|
return influxdb_client
|
||||||
|
|
||||||
|
async def get_influxdb_client() -> InfluxDBClientAsync:
|
||||||
|
global influxdb_client
|
||||||
|
return influxdb_client
|
||||||
|
|
||||||
|
|
||||||
|
async def get_influx_data(client: InfluxDBClientAsync) -> list[dict]:
|
||||||
|
query_api = client.query_api()
|
||||||
|
query = f'from(bucket: "{INFLUX_BUCKET}") |> range(start: -1h)'
|
||||||
|
tables = await query_api.query(query=query, org=INFLUX_ORG)
|
||||||
|
records = [
|
||||||
|
{"time": record.get_time(), "value": record.get_value(), "field": record.get_field()}
|
||||||
|
for table in tables for record in table.records
|
||||||
|
]
|
||||||
|
return records
|
||||||
|
|
||||||
|
async def write_influx_data(client: InfluxDBClientAsync, temp:float):
|
||||||
|
point = Point("measurement").field("temperature", temp)
|
||||||
|
return await client.write_api().write(bucket=INFLUX_BUCKET, record=point)
|
||||||
19
internal_loop.py
Normal file
19
internal_loop.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import asyncio
|
||||||
|
|
||||||
|
from influxdb_client.client.influxdb_client_async import InfluxDBClientAsync
|
||||||
|
from config import INFLUX_BUCKET, INFLUX_ORG
|
||||||
|
from influx_related import get_influx_data
|
||||||
|
|
||||||
|
|
||||||
|
async def internal_loop(influxdb_client: InfluxDBClientAsync):
|
||||||
|
i = 0
|
||||||
|
while True:
|
||||||
|
print("internal_loop", i)
|
||||||
|
i += 1
|
||||||
|
try:
|
||||||
|
records = await get_influx_data(influxdb_client)
|
||||||
|
print("influx records:", len(records))
|
||||||
|
[print(" -", i) for i in records]
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
await asyncio.sleep(5)
|
||||||
36
main.py
Normal file
36
main.py
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import asyncio
|
||||||
|
from contextlib import asynccontextmanager
|
||||||
|
|
||||||
|
import uvicorn
|
||||||
|
from fastapi import FastAPI
|
||||||
|
from internal_loop import internal_loop
|
||||||
|
|
||||||
|
from api import testAPI
|
||||||
|
from influx_related import init_influx
|
||||||
|
|
||||||
|
@asynccontextmanager
|
||||||
|
async def startup(fast_api: FastAPI):
|
||||||
|
# Startup logic
|
||||||
|
print("startup")
|
||||||
|
influxdb_client = init_influx(fast_api)
|
||||||
|
asyncio.create_task(internal_loop(influxdb_client))
|
||||||
|
yield
|
||||||
|
# Shutdown logic
|
||||||
|
|
||||||
|
|
||||||
|
app = FastAPI(lifespan=startup)
|
||||||
|
|
||||||
|
app.include_router(
|
||||||
|
testAPI.router,
|
||||||
|
prefix='/api',
|
||||||
|
tags=['testApi'],
|
||||||
|
)
|
||||||
|
|
||||||
|
# Press the green button in the gutter to run the script.
|
||||||
|
if __name__ == '__main__':
|
||||||
|
uvicorn.run(
|
||||||
|
"main:app",
|
||||||
|
host='0.0.0.0',
|
||||||
|
port=8082,
|
||||||
|
log_level='debug',
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user