Add news and hourly weather to dashboard

This commit is contained in:
Sam 2026-02-13 12:33:15 +01:00
parent 320f273c3e
commit 076ee15c83

View file

@ -37,6 +37,7 @@ HA_URL = os.getenv("HA_URL", "https://homeassistant.daddelolymp.de")
HA_TOKEN = os.getenv("HA_TOKEN", "") HA_TOKEN = os.getenv("HA_TOKEN", "")
WEATHER_LOCATION = os.getenv("WEATHER_LOCATION", "Leverkusen") WEATHER_LOCATION = os.getenv("WEATHER_LOCATION", "Leverkusen")
WEATHER_LOCATION_SECONDARY = os.getenv("WEATHER_LOCATION_SECONDARY", "Rab,Croatia") WEATHER_LOCATION_SECONDARY = os.getenv("WEATHER_LOCATION_SECONDARY", "Rab,Croatia")
DASHBOARD_DATA_PATH = os.getenv("DASHBOARD_DATA_PATH", "/app/data/dashboard_data.json")
# Caching # Caching
class Cache: class Cache:
@ -49,6 +50,7 @@ class Cache:
"ha": 30, "ha": 30,
"vikunja": 30, "vikunja": 30,
"system": 10, "system": 10,
"briefing_data": 300, # 5 minutes for news/hourly weather
} }
def get(self, key: str) -> Optional[Any]: def get(self, key: str) -> Optional[Any]:
@ -93,6 +95,7 @@ MAX_CHAT_HISTORY = 50
@app.get("/") @app.get("/")
async def dashboard(request: Request): async def dashboard(request: Request):
"""Main dashboard view""" """Main dashboard view"""
briefing_data = await get_briefing_data()
data = { data = {
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M"), "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M"),
"weather": await get_weather(), "weather": await get_weather(),
@ -100,6 +103,8 @@ async def dashboard(request: Request):
"ha_status": await get_homeassistant_status(), "ha_status": await get_homeassistant_status(),
"vikunja_all": await get_vikunja_all_tasks(), "vikunja_all": await get_vikunja_all_tasks(),
"system_status": await get_system_status(), "system_status": await get_system_status(),
"news": briefing_data.get("news", []),
"hourly_weather": briefing_data.get("hourly_weather", {}),
} }
return templates.TemplateResponse("dashboard.html", { return templates.TemplateResponse("dashboard.html", {
"request": request, "request": request,
@ -109,12 +114,13 @@ async def dashboard(request: Request):
@app.get("/api/all") @app.get("/api/all")
async def api_all(): async def api_all():
"""Get all data at once""" """Get all data at once"""
weather, weather_secondary, ha, vikunja, system = await asyncio.gather( weather, weather_secondary, ha, vikunja, system, briefing_data = await asyncio.gather(
get_weather(), get_weather(),
get_weather_secondary(), get_weather_secondary(),
get_homeassistant_status(), get_homeassistant_status(),
get_vikunja_all_tasks(), get_vikunja_all_tasks(),
get_system_status() get_system_status(),
get_briefing_data()
) )
return { return {
"timestamp": datetime.now().isoformat(), "timestamp": datetime.now().isoformat(),
@ -122,9 +128,28 @@ async def api_all():
"weather_secondary": weather_secondary, "weather_secondary": weather_secondary,
"ha_status": ha, "ha_status": ha,
"vikunja_all": vikunja, "vikunja_all": vikunja,
"system_status": system "system_status": system,
"news": briefing_data.get("news", []),
"hourly_weather": briefing_data.get("hourly_weather", {})
} }
async def get_briefing_data() -> dict:
"""Read briefing data (news, hourly weather) from JSON file"""
cached = cache.get("briefing_data")
if cached:
return cached
try:
if os.path.exists(DASHBOARD_DATA_PATH):
with open(DASHBOARD_DATA_PATH, "r") as f:
data = json.load(f)
cache.set("briefing_data", data)
return data
except Exception as e:
print(f"Error reading briefing data: {e}")
return {"news": [], "hourly_weather": {}}
@app.websocket("/ws") @app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket): async def websocket_endpoint(websocket: WebSocket):
await manager.connect(websocket) await manager.connect(websocket)