# HG changeset patch # User drewp@bigasterisk.com # Date 1706485450 28800 # Node ID c6fd04e07db086cc58cb750baaf21162476a966e # Parent 42a494b8ee1aed25262ac786f4a34e9c4816ab88 refactor light.py diff -r 42a494b8ee1a -r c6fd04e07db0 light.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/light.py Sun Jan 28 15:44:10 2024 -0800 @@ -0,0 +1,53 @@ + +import asyncio +import logging +from dataclasses import dataclass + +log = logging.getLogger('light') + +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)]} diff -r 42a494b8ee1a -r c6fd04e07db0 light_bridge.py --- 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())