我正在尝试从Ubidots获取传感器数据,并使用Matplotlib在图表中绘制它们。然后,图表可以通过Flask显示在Web服务器上。运行代码时出现以下错误:
ValueError: invalid literal for float(): 08:13:44
Matplotlib-Flask.py
from flask import Flask, request, render_template
import time
from datetime import datetime
from ubidots import ApiClient
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.animation as animation
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
import io
app = Flask(__name__)
//get the latest value of the ldr sensor from Ubidots
def get_records():
api = ApiClient(token='XXXXXXXXXXXXXXXXXXXXXXX')
my_variable = api.get_variable('XXXXXXXXXXXXXXXXXXXX')
ldr = my_variable.get_values(1)
return ldr
//get the latest timestamp from Ubidots
def get_time():
api = ApiClient(token='XXXXXXXXXXXXXXXXXXXXXXXX')
variable = api.get_variable('XXXXXXXXXXXXXXXXXXXXXX')
value = variable.get_values(1)[0]
timestamp = value.get('timestamp')
time= datetime.fromtimestamp(timestamp / 1000).strftime('%H:%M:%S')
return time
//render the graph with x and y values of time and sensor values respectively and send to Flask
@app.route('/', methods=['POST'])
def my_form_post():
ldr= get_records()
time= get_time()
templateData = {
'ldr' : ldr,
'time' : time
}
return render_template('main.html', **templateData)
//Plotting the graph using Matplotlib
@app.route('/')
def plot_temp():
ldr= get_records()
ys = ldr
fig = Figure()
axis = fig.add_subplot(1,1,1)
axis.set_title("Light Intensity")
axis.set_xlabel("Time")
axis.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S'))
axis.grid(True)
time= get_time()
xs = time
axis.plot(xs,ys)
canvas = FigureCanvas(fig)
output = io.BytesIO()
canvas.print_png(output)
response = make_response(output.getvalue())
response.mimetype = 'image/png'
ani= animation.FuncAnimation(fig, animate, interval=3000)
return response
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80, debug=True)
main.html中:
<!DOCTYPE html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>Hello, World!</h1>
<h2>The date and time on the server is: {{ time }}</h2>
<img src="/" alt="Image Placeholder" width="49%">
</body>
</html>
我在浏览器中打开页面时出现以下错误:
ValueError: invalid literal for float(): 08:13:44
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1997, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1598, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/pi/MatPlotLib-Flask.py", line 51, in plot_temp
axis.plot(xs,ys)
File "/usr/lib/python2.7/dist-packages/matplotlib/__init__.py", line 1894, in inner
return func(ax, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/matplotlib/axes/_axes.py", line 1407, in plot
self.add_line(line)
File "/usr/lib/python2.7/dist-packages/matplotlib/axes/_base.py", line 1787, in add_line
self._update_line_limits(line)
File "/usr/lib/python2.7/dist-packages/matplotlib/axes/_base.py", line 1809, in _update_line_limits
path = line.get_path()
File "/usr/lib/python2.7/dist-packages/matplotlib/lines.py", line 989, in get_path
self.recache()
File "/usr/lib/python2.7/dist-packages/matplotlib/lines.py", line 676, in recache
x = np.asarray(xconv, np.float_)
File "/usr/lib/python2.7/dist-packages/numpy/core/numeric.py", line 531, in asarray
return array(a, dtype, copy=False, order=order)
ValueError: invalid literal for float(): 08:13:44
我使用了以下参考链接:
Ubidots时间戳:http://community.ubidots.com/t/convert-timestamp-on-json/473/2
Ubidots Python API:https://github.com/ubidots/ubidots-python
烧瓶:http://www.mattrichardson.com/Raspberry-Pi-Flask/index.html
使用Flask的Matplotlib图:http://www.instructables.com/id/From-Data-to-Graph-a-Web-Jorney-With-Flask-and-SQL/
Matplotlib-获取ValueError float()的无效文字:08:13:44
更新了代码:
def get_UbiTimestamp():
api = ApiClient(token='A1E-6l4DwwC86SDR6QRTJWXGDwshTGPHFl')
variable = api.get_variable('5a5f80eec03f971388983b8e')
value = variable.get_values(1)[0]
timestamp = value.get('timestamp')
time1= datetime.fromtimestamp(timestamp / 1000).strftime('%H:%M:%S')
t = map(int, time1.split(':'))
global converted_t
converted_t = t[0] * 60 ** 2 + t[1] * 60 + t[2]
return converted_t
my_form_post()和plot_temp():
def my_form_post():
ldr= get_records()
time= get_UbiTimestamp()
templateData = {
'ldr' : ldr,
'time' : converted_t
}
return render_template('main.html', **templateData)
def plot_temp():
//some codes
time= get_UbiTimestamp()
xs = converted_t
axis.plot(xs,ys)
错误:ValueError: invalid literal for int() with base 10: 'timestamp'
`