diff --git a/main.py b/main.py index f8789f7..039a93e 100644 --- a/main.py +++ b/main.py @@ -14,6 +14,7 @@ import settings import asyncio import json import time +import requests from aiohttp import web, ClientSession, ClientError from asyncio_mqtt import Client from datetime import datetime, timedelta @@ -28,6 +29,15 @@ sensors_client = InfluxDBClient('localhost', 8086, database='sensors1' if PROD e solar_client = InfluxDBClient('localhost', 8086, database='solar2') PORT = 6903 if PROD else 6904 +def controller_message(message): + payload = dict(home=message) + r = requests.post('https://tbot.tannercollin.com/message', data=payload, timeout=10) + if r.status_code == 200: + return True + else: + logging.exception('Unable to communicate with controller! Message: ' + message) + return False + class Sensors(): sensors = [] @@ -391,9 +401,14 @@ async def history(request): async def latest(request): result = dict() + api_key = request.rel_url.query.get('api_key', '') + authed = api_key == settings.SENSORS_API_KEY for sensor in sensors: - if sensor.type_ in ['solar', 'owntracks']: + if sensor.type_ in ['solar']: + continue + + if not authed and sensor.type_ in ['owntracks']: continue q = 'select * from {} where "name" = \'{}\' order by desc limit 1'.format(sensor.type_, sensor.name) @@ -410,6 +425,26 @@ async def latest(request): async def index(request): return web.Response(text='hello world', content_type='text/html') +async def run_webserver(): + #web.run_app(app, port=PORT, loop=loop) + logging.info('Starting webserver on port: %s', PORT) + runner = web.AppRunner(app) + await runner.setup() + site = web.TCPSite(runner, '0.0.0.0', PORT) + await site.start() + + while True: await asyncio.sleep(10) + + +def task_died(future): + if os.environ.get('SHELL'): + logging.error('Sensors server task died!') + else: + logging.error('Sensors server task died! Waiting 60s and exiting...') + controller_message('Sensors server task died! Waiting 60s and exiting...') + time.sleep(60) + exit() + if __name__ == '__main__': app.router.add_get('/', index) app.router.add_post('/owntracks', owntracks) @@ -429,6 +464,8 @@ if __name__ == '__main__': sensors.add(SolarSensor('solar', 'Solar')) loop = asyncio.get_event_loop() - loop.create_task(poll_sensors()) - loop.create_task(fetch_mqtt()) - web.run_app(app, port=PORT, loop=loop) + loop.create_task(poll_sensors()).add_done_callback(task_died) + loop.create_task(fetch_mqtt()).add_done_callback(task_died) + loop.create_task(run_webserver()).add_done_callback(task_died) + + loop.run_forever() diff --git a/settings.py.example b/settings.py.example index 6f836dd..d529d43 100644 --- a/settings.py.example +++ b/settings.py.example @@ -1 +1 @@ -THERMOSTAT_IP = '' +SENSORS_API_KEY = ''