annotate environment.py @ 3:e7f33fa31883

port to starlette/asyncio
author drewp@bigasterisk.com
date Sun, 24 Apr 2022 14:46:32 -0700
parents 0f532eb91364
children b5bfd0dd69d6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
1 #!/usr/bin/python
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
2 """
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
3 return some rdf about the environment, e.g. the current time,
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
4 daytime/night, overall modes like 'maintenance mode', etc
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
5
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
6 """
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
7 import asyncio
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
8 import datetime
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
9 import logging
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
10 from dateutil.relativedelta import FR, relativedelta
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
11 from dateutil.tz import tzlocal
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
12 from prometheus_client import Gauge, Summary
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
13 from rdflib import Literal, Namespace
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
14 from starlette.applications import Starlette
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
15 from starlette.routing import Route
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
16 from starlette.staticfiles import StaticFiles
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
17 from starlette_exporter import PrometheusMiddleware, handle_metrics
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
18
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
19 import background_loop
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
20 from patchablegraph import PatchableGraph
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
21 from patchablegraph.handler import StaticGraph, GraphEvents
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
22 # from rdfdoc import Doc
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
23 from twilight import isWithinTwilight
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
24
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
25 ROOM = Namespace("http://projects.bigasterisk.com/room/")
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
26 DEV = Namespace("http://projects.bigasterisk.com/device/")
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
27
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
28 logging.basicConfig(level=logging.INFO)
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
29
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
30 STAT_UPDATE_UP = Gauge('background_loop_up', 'not erroring')
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
31 STAT_UPDATE_CALLS = Summary('background_loop_calls', 'calls')
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
32
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
33
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
34 def update(masterGraph):
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
35
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
36 def stmt(s, p, o):
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
37 masterGraph.patchObject(ROOM.environment, s, p, o)
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
38
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
39 now = datetime.datetime.now(tzlocal())
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
40
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
41 stmt(DEV.environment, ROOM.localHour, Literal(now.hour))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
42 stmt(DEV.environment, ROOM.localTimeToMinute, Literal(now.strftime("%H:%M")))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
43
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
44 stmt(DEV.environment, ROOM.localTimeToSecond, Literal(now.strftime("%H:%M:%S")))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
45
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
46 stmt(DEV.environment, ROOM.localDayOfWeek, Literal(now.strftime("%A")))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
47 stmt(DEV.environment, ROOM.localMonthDay, Literal(now.strftime("%B %e")))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
48 stmt(DEV.environment, ROOM.localDate, Literal(now.strftime("%Y-%m-%d")))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
49
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
50 for offset in range(-12, 7):
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
51 d = now.date() + datetime.timedelta(days=offset)
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
52 if d == d + relativedelta(day=31, weekday=FR(-1)):
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
53 stmt(DEV.calendar, ROOM.daysToLastFridayOfMonth, Literal(offset))
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
54
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
55 stmt(DEV.calendar, ROOM.twilight, ROOM['withinTwilight'] if isWithinTwilight(now) else ROOM['daytime'])
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
56
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
57
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
58 def main():
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
59 masterGraph = PatchableGraph()
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
60
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
61 asyncio.create_task(background_loop.loop_forever(lambda first: update(masterGraph), 1, STAT_UPDATE_UP, STAT_UPDATE_CALLS))
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
62
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
63 app = Starlette(
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
64 debug=True,
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
65 routes=[
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
66 Route('/', StaticFiles(directory='.', html=True)),
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
67 Route('/graph/environment', StaticGraph(masterGraph)),
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
68 Route('/graph/environment/events', GraphEvents(masterGraph)),
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
69 # Route('/doc', Doc),
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
70 ])
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
71
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
72 app.add_middleware(PrometheusMiddleware, app_name='environment')
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
73 app.add_route("/metrics", handle_metrics)
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
74 return app
0
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
75
3c1bc3bc5a6c pull out of homeauto/ project, and add skaffold/pipenv
drewp@bigasterisk.com
parents:
diff changeset
76
3
e7f33fa31883 port to starlette/asyncio
drewp@bigasterisk.com
parents: 1
diff changeset
77 app = main()