Files
home-automation-backend/src/main.py

60 lines
1.7 KiB
Python
Raw Normal View History

2024-07-16 15:55:45 +02:00
from contextlib import asynccontextmanager
2024-08-27 16:34:04 +02:00
from pathlib import Path
2024-07-16 15:55:45 +02:00
from fastapi import FastAPI
2024-08-27 11:01:14 +02:00
from src.components.poo_recorder import PooRecorder
2024-08-15 14:51:33 +02:00
from src.config import Config
2024-08-27 11:01:14 +02:00
from src.util.homeassistant import HomeAssistant
2024-08-27 16:34:04 +02:00
from src.util.location_recorder import LocationRecorder
2024-08-27 11:01:14 +02:00
from src.util.mqtt import MQTT
from src.util.notion import NotionAsync
from src.util.ticktick import TickTick
2024-07-16 15:55:45 +02:00
2024-08-15 14:51:33 +02:00
Config.init()
2024-08-27 16:34:04 +02:00
location_recorder_db = str(Path(__file__).resolve().parent / ".." / "location_recorder.db")
2024-08-15 16:50:56 +02:00
ticktick = TickTick()
2024-08-16 16:57:25 +02:00
notion = NotionAsync(token=Config.get_env(key="NOTION_TOKEN"))
2024-08-07 16:58:06 +02:00
mqtt = MQTT()
2024-08-27 16:34:04 +02:00
location_recorder = LocationRecorder(db_path=location_recorder_db)
homeassistant = HomeAssistant(ticktick=ticktick, location_recorder=location_recorder)
poo_recorder = PooRecorder(mqtt=mqtt, notion=notion, homeassistant=homeassistant)
2024-07-16 15:55:45 +02:00
@asynccontextmanager
2024-07-17 16:44:30 +02:00
async def _lifespan(_app: FastAPI): # noqa: ANN202
2024-08-07 16:58:06 +02:00
await mqtt.start()
2024-08-27 16:34:04 +02:00
await location_recorder.create_db_engine()
2024-07-16 15:55:45 +02:00
yield
2024-08-07 16:58:06 +02:00
await mqtt.stop()
2024-07-16 15:55:45 +02:00
app = FastAPI(lifespan=_lifespan)
2024-08-16 23:29:59 +02:00
@app.get("/homeassistant/status")
async def get_status() -> dict:
return {"Status": "Ok"}
@app.post("/homeassistant/publish")
2024-08-21 16:30:43 +02:00
async def homeassistant_publish(payload: HomeAssistant.Message) -> dict:
2024-08-21 21:11:29 +02:00
return await homeassistant.process_message(message=payload)
2024-08-16 23:29:59 +02:00
2024-08-16 16:57:25 +02:00
# Poo recorder
2024-08-07 14:44:24 +02:00
@app.post("/poo/record")
2024-08-24 22:11:15 +02:00
async def record(record_detail: PooRecorder.RecordField) -> PooRecorder.RecordField:
await poo_recorder.record(record_detail)
2024-08-07 14:44:24 +02:00
return record_detail
2024-08-15 16:50:56 +02:00
2024-08-16 16:57:25 +02:00
# ticktick
2024-08-15 16:50:56 +02:00
@app.get("/ticktick/auth/code")
async def ticktick_auth(code: str, state: str) -> dict:
2024-08-21 21:11:29 +02:00
if await ticktick.retrieve_access_token(code, state):
2024-08-15 16:50:56 +02:00
return {"State": "Token Retrieved"}
return {"State": "Token Retrieval Failed"}