Mercurial > code > home > repos > light-bridge
diff light_bridge.py @ 2:c6fd04e07db0
refactor light.py
author | drewp@bigasterisk.com |
---|---|
date | Sun, 28 Jan 2024 15:44:10 -0800 |
parents | 42a494b8ee1a |
children | 7eeda7f4f9cd |
line wrap: on
line diff
--- a/light_bridge.py Sun Jan 28 15:43:54 2024 -0800 +++ b/light_bridge.py Sun Jan 28 15:44:10 2024 -0800 @@ -1,23 +1,23 @@ """ replaces a lot of mqtt_to_rdf and rdf_to_mqtt """ -import asyncio -from dataclasses import dataclass -from functools import partial import json import logging +from functools import partial import time import background_loop from patchablegraph import PatchableGraph from patchablegraph.handler import GraphEvents, StaticGraph from rdflib import Namespace +from sse_starlette.sse import EventSourceResponse from starlette.applications import Starlette from starlette.requests import Request from starlette.responses import JSONResponse from starlette.routing import Route from starlette_exporter import PrometheusMiddleware, handle_metrics -from sse_starlette.sse import EventSourceResponse + +from light import Color, Light, Lights EX = Namespace('http://example.com/') @@ -25,54 +25,6 @@ log = logging.getLogger() -class Color(str): - - def to_js(self): - return self - - -@dataclass -class Light: - name: str - address: str - online: bool - colorRequest: Color - colorMessage: dict - colorCurrent: Color - latencyMs: float - - def to_js(self): - return { - 'light': { - 'name': self.name, - 'address': self.address, - 'online': self.online, - 'colorRequest': self.colorRequest.to_js(), - 'colorMessage': self.colorMessage, - 'colorCurrent': self.colorCurrent.to_js(), - 'latencyMs': self.latencyMs, - } - } - - -class Lights: - _d: dict[str, Light] = {} - - def add(self, d: Light): - self._d[d.name] = d - - def byName(self, name: str) -> Light: - return self._d[name] - - async def changes(self): # yields None on any data change - while True: - yield None - await asyncio.sleep(1) - - def to_js(self): - return {'lights': [d.to_js() for d in sorted(self._d.values(), key=lambda r: r.name)]} - - async def output(lights: Lights, request: Request) -> JSONResponse: light = lights.byName(request.query_params['light']) return JSONResponse(light.to_js()) @@ -82,7 +34,6 @@ async def g(): async for ping in lights.changes(): - await asyncio.sleep(1) yield json.dumps({'now': time.time()} | lights.to_js()) return EventSourceResponse(g())