Hi,
I have a callback to update my graph and a dropdown box where I select which IP I want to update the graph. The graph line is been updated but the legend is not. I created a “graphName=‘Sensor "’ + '” @’ + k.address" variable that I update when I change the dropdown box. The values are being updated when I check the console but the graph is not “name=graphName”. The strange thing is that when I click on the legend it gets updated.
return {'data': [plotly.graph_objs.Scatter( x=list(X), y=list(Y), name=graphName, mode= 'lines+markers')], 'layout' : go.Layout( title="SENSE - Sensor readings queries", showlegend=True, legend=go.layout.Legend(x=0,y=1.0), xaxis=dict(range=[min(X),max(X)]), yaxis=dict(range=[min(Y),max(Y)]),)
#!/bin/python3
import dash
from dash.dependencies import Output, Event
import dash_core_components as dcc
import dash_html_components as html
import plotly
import random
import plotly.graph_objs as go
import os
import itertools
import zmq
import sys
import dash,requests,pandas as pd
from dash.dependencies import Output, Input
import plotly.tools as tls
from io import StringIO
import numpy as np
import datetime
import copy
import csv
from collections import deque
from backend import *X = deque(maxlen=20)
X.append(1)
Y = deque(maxlen=20)
Y.append(1)mx = 2*10**20
mn = -mxload file with all RPi available
available_rpi = pd.read_csv(‘available_rpi.conf’, header=None, dtype={0: str}).set_index(0).squeeze().to_dict()
print(“Raspberry Pi’s available:”)
for key, value in available_rpi.items():
print(‘IP:{} name: {}’.format(key, value))
print()app = dash.Dash(name)
app.layout = html.Div( [
html.H1(children=‘RESENSE’),
html.Div(children=‘’‘RESENSE: Transparent Record and Replay in the Internet of Things (IoT).’‘’),
# html.Div([‘Name : ‘, dcc.Input(id=‘input’,value=‘ACC’,type=‘text’) ]),
# dcc.Markdown(’’’ ‘’'),
html.Label(‘Raspberry Pi’),
dcc.Dropdown(
id = “input”,
options=[{‘label’: v, ‘value’: k} for k, v in available_rpi.items()],
value=‘127.0.0.1’
),
html.Div(id=‘output’),
# Graph for arriving data (static)
dcc.Graph(id=‘data’, animate=True),
dcc.Interval(id=‘graph-update’,interval=2*1000)
])@app.callback(
dash.dependencies.Output(‘output’, ‘children’),
[dash.dependencies.Input(‘input’, ‘value’)])
def selectBackend(dropdown_value):
print(‘You've selected: “{}”’.format(dropdown_value))
global k;
if dropdown_value != “”:
k = Backend(dropdown_value)
k.startConnection()
k.start()
else:
print(‘You've selected nothing’)update the graph ‘data’ as a ‘figure’. The interval updated by the event ‘graph-update’
@app.callback(
Output(‘data’, ‘figure’),
[Input(component_id=‘input’, component_property=‘value’)],
events=[Event(‘graph-update’, ‘interval’)])
def update_graph_scatter(value):
print(“… update_graph_scatter function start …”)
print(“input[{}]”.format(value))
print(“address[{}]”.format(k.address))
graphName=‘Sensor "’ + ‘" @’ + k.address
print(“graphName: {}”.format(graphName))if value == "127.0.0.1": X.append(X[-1]+1) Y.append(Y[-1]+Y[-1]*random.uniform(-0.1,0.1)) elif value == "192.168.1.106": qst = "[" for i, qid in enumerate(k.queries): qst += str(qid) + ("," if i != len(k.queries) -1 else "]") print("queries type[{}] qst: {}".format(type(k.queries), qst)) print("k.X: {}".format(k.X)) for i in k.X: print("k.X type[{}] [{}]: {}".format(type(k.X), i, k.X[i])) print("k.Y: {}".format(k.Y)) for i in k.Y: print("k.Y type[{}] [{}]: {}".format(type(k.Y), i, k.Y[i])) print("k.Z: {}".format(k.Z)) for i in k.Z: print("k.Z type[{}] [{}]: {}".format(type(k.Z), i, k.Z[i])) X.append(X[-1]+1) Y.append(Y[-1]+1) # Y.append(Y[-1]+Y[-1]*random.uniform(-0.1,0.1)) else: print("update_graph_scatter not implemented for input [{}]".format(value)) print(".............. update_graph_scatter end ..............") # return {'data': [data], return {'data': [plotly.graph_objs.Scatter( x=list(X), y=list(Y), name=graphName, mode= 'lines+markers')], 'layout' : go.Layout( title="SENSE - Sensor readings queries", showlegend=True, legend=go.layout.Legend(x=0,y=1.0), xaxis=dict(range=[min(X),max(X)]), yaxis=dict(range=[min(Y),max(Y)]),)}
if name == ‘main’:
selectBackend(“127.0.0.1”)
app.run_server(debug=True)
# app.run_server(
# set to False, otherwise the program launches multiple times (even in the absence of changes and relaunches if changes are made)
# debug=False, port=int(os.getenv(“PORT”, 4444)))