63 lines
1.8 KiB
Python
63 lines
1.8 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
from bottle import Bottle, request, response, template, static_file
|
||
|
import serial
|
||
|
import json
|
||
|
import time
|
||
|
|
||
|
app = application = Bottle()
|
||
|
|
||
|
serial_in_use = False
|
||
|
|
||
|
@app.route('/')
|
||
|
@app.route('/index.html')
|
||
|
def index():
|
||
|
return template('index')
|
||
|
|
||
|
@app.route('/websocket')
|
||
|
def handle_websocket():
|
||
|
global serial_in_use
|
||
|
|
||
|
wsock = request.environ.get('wsgi.websocket')
|
||
|
if not wsock:
|
||
|
abort(400, 'Expected WebSocket request.')
|
||
|
|
||
|
if serial_in_use:
|
||
|
abort(503, 'Serial connection already in use.')
|
||
|
|
||
|
with serial.Serial('/dev/ttyUSB0', 38400, timeout=10) as ser:
|
||
|
#with open('/dev/null') as ser:
|
||
|
serial_in_use = True
|
||
|
print("Serial locked.")
|
||
|
while True:
|
||
|
try:
|
||
|
line = ser.readline()
|
||
|
#line = '{"vin": 1240, "vout": 15300, "iout": 817, "pout": 12345, "energy": 9387, "pwm": 314}\r\n'
|
||
|
time.sleep(1)
|
||
|
if line[0] != '{':
|
||
|
# print all lines that are probably not JSON
|
||
|
print(line)
|
||
|
continue
|
||
|
|
||
|
data = json.loads(line)
|
||
|
wsock.send(json.dumps(data))
|
||
|
except json.JSONDecodeError:
|
||
|
print(f"Failed to decode line as JSON: »{line}«.")
|
||
|
except WebSocketError:
|
||
|
break
|
||
|
serial_in_use = False
|
||
|
print("Serial unlocked.")
|
||
|
|
||
|
|
||
|
@app.route('/static/<filename:path>')
|
||
|
def send_static(filename):
|
||
|
return static_file(filename, root='./static')
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
from gevent.pywsgi import WSGIServer
|
||
|
from geventwebsocket import WebSocketError
|
||
|
from geventwebsocket.handler import WebSocketHandler
|
||
|
server = WSGIServer(("0.0.0.0", 8080), app,
|
||
|
handler_class=WebSocketHandler)
|
||
|
server.serve_forever()
|