websocket events send to all connected clients
This commit is contained in:
parent
fc2aa37f93
commit
1a6b3ca5f6
|
@ -3,7 +3,7 @@ A hub for controlling IOT devices.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
Python 3.6+
|
Python 3.6+
|
||||||
Python packages: `gunicorn aiohttp aiohttp_jinja2 requests`
|
Python packages: `gunicorn aiohttp aiohttp_jinja2 uvloop requests`
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
1. Get on the floor
|
1. Get on the floor
|
||||||
|
|
20
events.py
20
events.py
|
@ -6,7 +6,7 @@ import types
|
||||||
import models
|
import models
|
||||||
from models import network
|
from models import network
|
||||||
|
|
||||||
async def toggle_outlet(ws, data):
|
async def toggle_outlet(request, ws, data):
|
||||||
"""Toggles the state of a RelayDevice."""
|
"""Toggles the state of a RelayDevice."""
|
||||||
device_id = data.get('device_id')
|
device_id = data.get('device_id')
|
||||||
sub_device_id = data.get('sub_device_id')
|
sub_device_id = data.get('sub_device_id')
|
||||||
|
@ -32,10 +32,10 @@ async def toggle_outlet(ws, data):
|
||||||
data['ok'] = True
|
data['ok'] = True
|
||||||
data['state'] = state
|
data['state'] = state
|
||||||
res = {'event': 'toggle_outlet', 'data': data}
|
res = {'event': 'toggle_outlet', 'data': data}
|
||||||
await ws.send_json(res)
|
await request.app.send_json_all(res)
|
||||||
|
|
||||||
|
|
||||||
async def edit_field(ws, data):
|
async def edit_field(request, ws, data):
|
||||||
"""Edits the text of a particular field."""
|
"""Edits the text of a particular field."""
|
||||||
device_id = data.get('device_id')
|
device_id = data.get('device_id')
|
||||||
sub_device_id = data.get('sub_device_id')
|
sub_device_id = data.get('sub_device_id')
|
||||||
|
@ -89,10 +89,10 @@ async def edit_field(ws, data):
|
||||||
|
|
||||||
data['ok'] = True
|
data['ok'] = True
|
||||||
res = {'event': 'edit_field', 'data': data}
|
res = {'event': 'edit_field', 'data': data}
|
||||||
await ws.send_json(res)
|
await request.app.send_json_all(res)
|
||||||
|
|
||||||
|
|
||||||
async def new_device(ws, data):
|
async def new_device(request, ws, data):
|
||||||
"""
|
"""
|
||||||
Allows adding a new device. Accepts device_type parameter, returns
|
Allows adding a new device. Accepts device_type parameter, returns
|
||||||
the device_id.
|
the device_id.
|
||||||
|
@ -127,10 +127,10 @@ async def new_device(ws, data):
|
||||||
data['ok'] = True
|
data['ok'] = True
|
||||||
data['device_id'] = device.id
|
data['device_id'] = device.id
|
||||||
res = {'event': 'new_device', 'data': data}
|
res = {'event': 'new_device', 'data': data}
|
||||||
await ws.send_json(res)
|
await request.app.send_json_all(res)
|
||||||
|
|
||||||
|
|
||||||
async def lock_device(ws, data):
|
async def lock_device(request, ws, data):
|
||||||
"""Locks or unlocks a device to prevent or allow editing it's fields."""
|
"""Locks or unlocks a device to prevent or allow editing it's fields."""
|
||||||
device_id = data.get('device_id')
|
device_id = data.get('device_id')
|
||||||
locked = bool(data.get('locked'))
|
locked = bool(data.get('locked'))
|
||||||
|
@ -151,10 +151,10 @@ async def lock_device(ws, data):
|
||||||
|
|
||||||
data['ok'] = True
|
data['ok'] = True
|
||||||
res = {'event': 'lock_device', 'data': data}
|
res = {'event': 'lock_device', 'data': data}
|
||||||
await ws.send_json(res)
|
await request.app.send_json_all(res)
|
||||||
|
|
||||||
|
|
||||||
async def delete_device(ws, data):
|
async def delete_device(request, ws, data):
|
||||||
"""Deletes a device."""
|
"""Deletes a device."""
|
||||||
device_id = data.get('device_id')
|
device_id = data.get('device_id')
|
||||||
|
|
||||||
|
@ -173,7 +173,7 @@ async def delete_device(ws, data):
|
||||||
|
|
||||||
data['ok'] = True
|
data['ok'] = True
|
||||||
res = {'event': 'delete_device', 'data': data}
|
res = {'event': 'delete_device', 'data': data}
|
||||||
await ws.send_json(res)
|
await request.app.send_json_all(res)
|
||||||
|
|
||||||
|
|
||||||
events = {}
|
events = {}
|
||||||
|
|
12
juice.py
12
juice.py
|
@ -45,6 +45,7 @@ async def websocket_handler(request):
|
||||||
if not ws_ready.ok:
|
if not ws_ready.ok:
|
||||||
return web.Response(text="Cannot start websocket.")
|
return web.Response(text="Cannot start websocket.")
|
||||||
await ws.prepare(request)
|
await ws.prepare(request)
|
||||||
|
request.app['websockets'].append(ws)
|
||||||
|
|
||||||
async for msg in ws:
|
async for msg in ws:
|
||||||
if msg.type != WSMsgType.TEXT:
|
if msg.type != WSMsgType.TEXT:
|
||||||
|
@ -57,15 +58,24 @@ async def websocket_handler(request):
|
||||||
event = data.get('event')
|
event = data.get('event')
|
||||||
if not event or event not in events.events.keys():
|
if not event or event not in events.events.keys():
|
||||||
break
|
break
|
||||||
await events.events[event](ws, data.get('data'))
|
await events.events[event](request, ws, data.get('data'))
|
||||||
await ws.close()
|
await ws.close()
|
||||||
|
request.app['websockets'].remove(ws)
|
||||||
return ws
|
return ws
|
||||||
|
|
||||||
|
|
||||||
|
async def send_json_all(self, d):
|
||||||
|
"""Sends to all connected websockets."""
|
||||||
|
for ws in self['websockets']:
|
||||||
|
await ws.send_json(d)
|
||||||
|
|
||||||
|
|
||||||
async def init_app():
|
async def init_app():
|
||||||
"""Initializes the application."""
|
"""Initializes the application."""
|
||||||
|
web.Application.send_json_all = send_json_all
|
||||||
app = web.Application(middlewares=[buckler_aiohttp.buckler_session])
|
app = web.Application(middlewares=[buckler_aiohttp.buckler_session])
|
||||||
aiohttp_jinja2.setup(app, loader=jinja2.FileSystemLoader('templates'))
|
aiohttp_jinja2.setup(app, loader=jinja2.FileSystemLoader('templates'))
|
||||||
|
app['websockets'] = []
|
||||||
|
|
||||||
app.router.add_routes(routes)
|
app.router.add_routes(routes)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user