0
|
1 """
|
|
2 replaces a lot of mqtt_to_rdf and rdf_to_mqtt
|
|
3 """
|
|
4 import json
|
|
5 import logging
|
2
|
6 from functools import partial
|
1
|
7 import time
|
0
|
8
|
|
9 import background_loop
|
|
10 from patchablegraph import PatchableGraph
|
|
11 from patchablegraph.handler import GraphEvents, StaticGraph
|
|
12 from rdflib import Namespace
|
2
|
13 from sse_starlette.sse import EventSourceResponse
|
0
|
14 from starlette.applications import Starlette
|
|
15 from starlette.requests import Request
|
|
16 from starlette.responses import JSONResponse
|
|
17 from starlette.routing import Route
|
|
18 from starlette_exporter import PrometheusMiddleware, handle_metrics
|
2
|
19
|
|
20 from light import Color, Light, Lights
|
0
|
21
|
|
22 EX = Namespace('http://example.com/')
|
|
23
|
|
24 logging.basicConfig(level=logging.INFO)
|
|
25 log = logging.getLogger()
|
|
26
|
|
27
|
|
28 async def output(lights: Lights, request: Request) -> JSONResponse:
|
|
29 light = lights.byName(request.query_params['light'])
|
|
30 return JSONResponse(light.to_js())
|
|
31
|
|
32
|
|
33 async def table(lights: Lights, req: Request) -> EventSourceResponse:
|
|
34
|
|
35 async def g():
|
|
36 async for ping in lights.changes():
|
1
|
37 yield json.dumps({'now': time.time()} | lights.to_js())
|
0
|
38
|
|
39 return EventSourceResponse(g())
|
|
40
|
|
41
|
|
42 def main():
|
|
43 lights = Lights()
|
|
44 lights.add(Light('do-desk', 'topic1', True, Color('#ff0000'), {'r': 255}, Color('#000000'), 100))
|
|
45 lights.add(Light('do-desk2', 'topic2', True, Color('#ff00ff'), {'r': 255}, Color('#000000'), 200))
|
|
46 graph = PatchableGraph()
|
|
47 app = Starlette(debug=True,
|
|
48 routes=[
|
|
49 Route('/api/output', partial(output, lights), methods=['PUT']),
|
|
50 Route('/api/table', partial(table, lights)),
|
|
51 Route('/api/graph', StaticGraph(graph)),
|
|
52 Route('/api/graph/events', GraphEvents(graph)),
|
|
53 ])
|
|
54
|
|
55 app.add_middleware(PrometheusMiddleware, app_name='light-bridge')
|
|
56 app.add_route("/metrics", handle_metrics)
|
|
57 # app.state.loop = background_loop.loop_forever(lambda first_run=False: update(graph), 1)
|
|
58
|
|
59 return app
|
|
60
|
|
61
|
|
62 app = main()
|