63 lines
1.8 KiB
Python
Executable file
63 lines
1.8 KiB
Python
Executable file
#!/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()
|