Ensure you have completed all the steps in the following documents before continuing:
efmAdmin
user with the password that was set during installation
The “radiation”-style warning in the upper right-hand of the page indicates that there are downstream brokers in quarantine.
Permissions > Quarantine > Authorize
Authorize
button at the bottom
You should now see the IR829 roadway broker
efm-roadway1
listed underneath theRoot Broker
in theBrokers
section on the left-hand of the page.
efm-roadway1
from the Brokers
section
Management > links > Install Link
MQTT
from the link
dropdown
mqtt
as the name and click Invoke
It should say success True
if the operation was successful.
Management > links > mqtt > Start Link
Invoke
Management > links > Install Link from Zip
Choose File
and select the dslink-c-serial_0.8.0_x86_64.zip
DSLink file
serial
as the name and click Invoke
It should say success True
if the operation was successful.
Management > links > serial > Start Link
Invoke
efmAdmin
user, if prompted
Data > downstream > efm-roadway1 > downstream > mqtt
Metrics
right-click on Broker Enabled: false
, set the value to true
, and click Invoke
mqtt
and select Add Server
local-broker
tcp://localhost
efm-roadway1
Invoke
... > mqtt > local-broker > Subscriptions
This
... >
convention means to stay where you were in theData
section, but to dive deeper into the hierarchy. It saves rewriting the entire path when you are not changing your broker focus. In this case, the...
meansData > downstream > efm-roadway1 > downstream
Subscriptions
and select Subscribe
local-rwis
weather/#
Invoke
local-vehicles
vehicles/#
Invoke
The active MQTT channel subscriptions will show up under the Metrics
section.
... > efm-roadway1 > downstream > dataflow
dataflow
and select Create Dataflow
clear-local-mqtt-logs
and click Invoke
... > dataflow > clear-local-mqtt-logs
clear-local-mqtt-logs
dataflow in the right-hand editor workspace by clicking on its dataflow icon
... > efm-roadway1 > sys > links > mqtt
mqtt
and drag Log > Clear
to the editor workspace Dataflow
section
This is a process you will become very familiar with: dragging various functional “blocks” to the editor workspace to build a dataflow, editing their properties, and connecting their inputs and outputs. This is essentially graphical programming and as you will see can perform fairly complex logic and data operations.
clear_log
to clear-mqtt-log
Properties
section:
600
true
As you likely have already figured out, this
clear-local-mqtt-logs
dataflow will clear the MQTT log every 10 minutes. Without this in place the default MQTT DSLink log level would eventually fill up the small amount of storage of the IR829 EFM instance.
You can see this log in the EFM System Administrator under the
Life cycle
section for theefm-roadway1
broker’smqtt
link.
clear-local-mqtt-logs
dataflow by clicking the x
icon next to its name above the editor workspace
... > efm-roadway1 > downstream > c-serial
c-serial
and select add connection
dms-serial
/dev/ttyS2
115200
8
1
none
null
0x05
0x0D
Invoke
... > efm-roadway1 > downstream > dataflow
dataflow
and select Create Dataflow
clear-local-serial-logs
and click Invoke
This is another dataflow that will clear a DSLink log. This time it’s for the Serial DSLink, but the reason and process is the same.
... > dataflow > clear-local-serial-logs
clear-local-serial-logs
dataflow in the right-hand editor workspace by clicking on its dataflow icon
... > efm-roadway1 > sys > links > serial
serial
and drag Log > Clear
to the editor workspace Dataflow
section
clear_log
to clear-serial-log
Properties
section:
3600
true
Note that this time you are setting the log to clear every hour instead of every 10 minutes like with the MQTT log. This is to aid in potential serial connectivity troubleshooting.
clear-local-serial-logs
dataflow by clicking the x
icon next to its name above the editor workspace
Make sure the RWIS/Car Simulator and DMS are connected and running before starting this section.
... > efm-roadway1 > downstream > dataflow
dataflow
and select Create Dataflow
publish-local-rwis
and click Invoke
... > dataflow > publish-local-rwis
publish-local-rwis
dataflow in the right-hand editor workspace by clicking on its dataflow icon
... > efm-roadway1 > downstream > mqtt > local-broker > Data > weather
Metrics
section, drag roadway-rwis1
to the editor workspace Dataflow
section
If you don’t see any data listed under
Metrics
fromroadway1-rwis1
go back to the Raspberry Pi RWIS and Car Simulator document and review the troubleshooting section. Make sure you have correctly set up the MQTT DSLink and MQTT configuration as detailed above as well.
If you do see
roadway-rwis1
data listed, you probably noticed that it is changing every 3 seconds. The EFM Dataflow Editor shows data updates in realtime.
roadway1_rwis1
to roadway1-rwis1-mqtt
Properties
section, mouse over the lastUpdate
field until a blue dot appears
Pinned
box
Pinning a field adds it to that block’s listed fields in the Dataflow section so it is easy to link it to an input field of other blocks.
... > efm-roadway1 > data
data
and drag publish
to the editor workspace Dataflow
section
Properties
section:
true
/data/weather/roadway1-rwis1
Make sure you are updating the
Path
property toward the bottom and not thepath
property near the middle of theProperties
section. ThePath
is how other EFM brokers are able to subscribe to the roadway broker’s published data.
value
field to the publish Value
field by dragging the red arrowhead from one block to the open spot on the other
If you ever accidentally link the wrong fields, you can simply double-click the arrowhead and the link will be removed.
lastUpdate
field to the publish Timestamp
field
You can confirm that the data is successfully published by navigating to
... > efm-roadway1 > data
and expanding theweather > roadway1-rwis1
entry under theMetrics
section. The data values should change every 3 seconds, just like the source data. This is an example of how EFM can publish data upstream as it is received locally without modification. The next dataflow will add some additional filtering logic to its publish activity.
publish-local-rwis
dataflow by clicking the x
icon next to its name above the editor workspace
... > efm-roadway1 > downstream > dataflow
dataflow
and select Create Dataflow
publish-crash-reports
and click Invoke
... > dataflow > publish-crash-reports
publish-crash-reports
dataflow in the right-hand editor workspace by clicking on its dataflow icon
... > efm-roadway1 > downstream > mqtt > local-broker > Data > vehicles
Metrics
section, drag roadway-rsu1
to the editor workspace Dataflow
section
Once again, if you don’t see any data listed under
Metrics
fromroadway1-rsu1
go back to the Raspberry Pi RWIS and Car Simulator document and review the troubleshooting section as well as the MQTT setup sections above.
roadway1_rsu1
to roadway1-rsu1-mqtt
Properties
section, mouse over the lastUpdate
field until a blue dot appears
Pinned
box
Blocks
section, expand Table Operations
JSON Parser
to the editor workspace Dataflow
section
This block will parse the JSON data that is received over MQTT and convert it into table format. Take a minute to look at all the different blocks that are available for dataflow logic and processing. As you create progressively more complex dataflows below you will become familiar with many of these blocks.
jsonParser
to vehicle-table
value
field to the vehicle-table input
field
... > efm-roadway1 > data
data
and drag publish
to the editor workspace Dataflow
section
Properties
section:
true
/data/vehicles/crash-reports
enabled
field in the Properties
section until a blue dot appears
Pinned
box
vehicle-table
and click on the Table
button for the output
field in the Properties
section to see the underlying table data
crashed
column to the publish enabled
field
The resulting field input indicator for the
publish
block will be gray with a circle indicating it’s from an external resource that can’t be easily represented graphically within the dataflow editor.
This is also how the logic of this dataflow works. The vehicle data is only published when the
crashed
field istrue
.
value
field to the publish Value
field
lastUpdate
field to the publish Timestamp
field
You can confirm that the data is successfully published by navigating to
... > efm-roadway1 > data
and expanding thevehicles > crash-reports
entry under theMetrics
section. The data values should change every second, but only when the Car Simulator is not sitting flat on its rubber feet. You can confirm this within thepublish-crash-reports
dataflow as well, watching theenabled
field in thepublish
block, which should change totrue
during simulated vehicle safety events and stayfalse
otherwise.
This is an example of how EFM can intelligently filter large input data streams locally before they are published upstream. The next dataflow will use even more logic to tie local RWIS visibility data to local DMS output completely at the roadway.
publish-crash-reports
dataflow by clicking the x
icon next to its name above the editor workspace
... > efm-roadway1 > downstream > dataflow
dataflow
and select Create Dataflow
local-rwis-dms
and click Invoke
... > dataflow > local-rwis-dms
local-rwis-dms
dataflow in the right-hand editor workspace by clicking on its dataflow icon
... > efm-roadway1 > downstream > mqtt > local-broker > Data > weather
Metrics
section, drag roadway-rwis1
to the editor workspace Dataflow
section
roadway1_rwis1
to roadway1-rwis1-mqtt
Blocks
section, drag Table Operations > JSON Parser
to the editor workspace Dataflow
section
jsonParser
to rwis-table
value
field to the rwis-table input
field
Blocks
section, drag Logic > If
to the editor workspace Dataflow
section
If
to light-level-trigger
rwis-table
and click on the Table
button for the output
field in the Properties
section to see the underlying table data
light
column to the light-level-trigger input 0
field
light-level-trigger
and edit the following values in the right-hand Properties
section:
<
200
[+FOG,AHEAD];[+USE,CAUTION]
[+DRIVE,SAFE];[+DRIVE,SAFE]
This one
if
block is providing the main logic for this dataflow. It is evaluating the RWIS light level and setting the message to be displayed on the DMS for either low or regular visibility. The rest of the dataflow takes this output, sends it to the DMS over serial, and publishes the DMS state upstream.
Most dataflows can be broken down logically to an “input-logic-output” cycle. It can be helpful to keep this in mind when trying to understand more complex dataflows. You may have also noticed that data-oriented dataflow blocks (usually used for input and output) are red while logic and operations blocks are orange.
Blocks
section, drag String Operations > Split
to the editor workspace Dataflow
section
split
block and edit the following values in the right-hand Properties
section:
;
output
field to the split input
field
Blocks
section, drag Table Operations > Page
to the editor workspace Dataflow
section
tablePage
to table-page
table-page
and edit the following values in the right-hand Properties
section:
1
currentPage
field, click the blue dot, and check the Pinned
box
totalPage
field, click the blue dot, and check the Pinned
box
output
field to the table-page input
field
Blocks
section, drag Logic > Stop Watch
to the editor workspace Dataflow
section
stopwatch
to table-row-loop
table-row-loop
and edit the following values in the right-hand Properties
section:
true
2
reset
field, click the blue dot, and check the Pinned
box
output
field to the table-page currentPage
field
Blocks
section, drag Logic > If
to the editor workspace Dataflow
section
if1
to row-loop-reset
row-loop-reset
and edit the following values in the right-hand Properties
section:
>=
output
field to the row-loop-reset input 0
field
totalPage
field to the row-loop-reset input 1
field
output
field to the row-loop-reset then
field
output
field to the table-row-loop reset
field
Blocks
section, drag Table Operations > Table Row Cells
to the editor workspace Dataflow
section
tableRowCells
to select-value
select-value
and edit the following values in the right-hand Properties
section:
0
value
output
field to the select-value table
field
... > efm-roadway1 > downstream > c-serial
Metrics
section, right-click on dms-serial
and drag send message
to the editor workspace Dataflow
section
SendMessage
to send-to-dms
send-to-dms
and edit the following values in the right-hand Properties
section:
true
value 0
field to the send-to-dms Message
field
The DMS should have just changed its display from the 3 green lights to
DRIVE SAFE
in orange.
... > efm-roadway1 > data
data
and drag publish
to the editor workspace Dataflow
section
Properties
section:
true
/data/dms/roadway1-dms1
Message
field to the publish Value
field
FOG AHEAD
and USE CAUTION
DRIVE SAFE
If the DMS isn’t updating, review the troubleshooting steps outlined in Raspberry Pi Serial DMS , the Serial DSLink setup on the roadway broker, and the IR829 IOS and IOx serial port configuration.
local-rwis-dms
dataflow by clicking the x
icon next to its name above the editor workspace
Data > downstream > ParStream-Import
ParStream-Import
and select Add Database
historian
localhost
9042
HIGH
true
Invoke
Data > downstream > dataflow
We are creating these next dataflows on the regional broker, which is where the ParStream database resides and where the ParStream connection is configured above. This makes sense given the main purpose of the regional broker is to aggregate the data from roadway brokers.
dataflow
and select Create Dataflow
save-all-crash-data
and click Invoke
... > dataflow > save-all-crash-data
save-all-crash-data
dataflow in the right-hand editor workspace by clicking on its dataflow icon
Blocks
section, drag Table Operations > JSON Parser
to the editor workspace Dataflow
section
jsonParser
to parsed-crash-data
... > downstream > DQL
DQL
and drag Query
to the editor workspace Dataflow
section
query
to get-all-crash-data
get-all-crash-data
and edit the following values in the right-hand Properties
section:
30
list brokers | sublist /data/vehicles/ | filter :name="crash-reports" | subscribe value.timestamp as timestamp, value
This is Distributed Query Language (DQL), which provides a powerful, flexible way to extract published data throughout all the brokers within an EFM deployment. This particular DQL query gets any
crash-reports
data published by any broker the regional broker knows about. In this demo environment, the only other broker is the roadside broker you configured above.
Invoke
button associated with the invoke
field
Table
button associated with the output
field
value
column to the parsed-crash-data input
field
If you don’t see any data in the table, turn the Car Simulator on its side to have it send crash data.
... > downstream > ParStream-Import > historian > Tables > crash_data
If you don’t see the
crash_data
table listed, right-click onhistorian
and selectIntrospect
and then check again.
crash_data
and drag Insert Row
to the editor workspace Dataflow
section
insertRow
to save-crash-data
save-crash-data
and edit the following values in the right-hand Properties
section:
true
get-all-crash-data
and click the Table
button associated with the output
field in the Properties
section
timestamp
column to the save-crash-data ts
field
parsed-crash-data
and click the Table
button associated with the output
field in the Properties
section
save-crash-data
id
value to the save-crash-data station
field
vehicle
value to the save-crash-data vehicle
field
motion_x
value to the save-crash-data motion_x
field
motion_y
value to the save-crash-data motion_y
field
motion_z
value to the save-crash-data motion_z
field
heading
value to the save-crash-data heading
field
You will fully confirm whether this dataflow is working correctly when you configure the DOT Demo DGLux dashboard below. For now you should see the
save-crash-data
fields update when you place the Car Simulator on its side and see a value ofINSERTED
for theStatus
field in itsProperties
section.
save-all-crash-data
dataflow by clicking the x
icon next to its name above the editor workspace
Data > downstream > dataflow
dataflow
and select Create Dataflow
save-sampled-rwis-data
and click Invoke
... > dataflow > save-sampled-rwis-data
save-sampled-rwis-data
dataflow in the right-hand editor workspace by clicking on its dataflow icon
Blocks
section, drag Table Operations > JSON Parser
to the editor workspace Dataflow
section
jsonParser
to parsed-rwis-data
... > downstream > DQL
DQL
and drag Query
to the editor workspace Dataflow
section
query
to get-all-rwis-data
get-all-rwis-data
and edit the following values in the right-hand Properties
section:
30
list brokers | sublist /data/weather/? | subscribe
This DQL query gets any
weather
data published by any broker the regional broker knows about.
Invoke
button associated with the invoke
field
Table
button associated with the output
field
value
column to the parsed-rwis-data input
field
You should see this table data update every 3 seconds.
Blocks
section, drag Table Operations > Realtime Recorder
to the editor workspace Dataflow
section
realtimeRecorder
to buffered-rwis-data
buffered-rwis-data
block (3) times to add 3 more name
and value
fields
name 0
field in the Properties
section
Pinned
box
value 0
field in the Properties
section
Pinned
box
Properties
section:
60
id
temp_c
press_hpa
light
parsed-rwis-data
and click the Table
button associated with the output
field in the Properties
section
buffered-rwis-data
id
value to the buffered-rwis-data value 0
field
temp_c
value to the buffered-rwis-data value 1
field
press_hpa
value to the buffered-rwis-data value 2
field
light
value to the buffered-rwis-data value 3
field
If you select the
buffered-rwis-data
block and click theTable
button associated with theoutput
field in itsProperties
section you will see that it is generating a table with 60 seconds of rolling RWIS data. This table is the data source for the 60-second moving average that will ultimately end up saved into ParStream. This is an example of how EFM can intelligently sample data to drive insight and efficiency or otherwise enforce a DOT’s desired operational policies.
Blocks
section, drag Tables Operations > Aggregation
to the editor workspace Dataflow
section
tableAggregation
to last-ts
last-ts
and edit the following values in the right-hand Properties
section:
timestamp
Last
output
field to the last-ts input
field
Blocks
, drag Date Time Operations > Date Math
to the editor workspace Dataflow
section
dateMath
to ts-to-utc
ts-to-utc
and unpin the following fields by right-clicking on the blue dot and unchecking the Pinned
box:
This will make the block much smaller and easier to position in the editor workspace by only exposing the needed
input
andoutput
fields.
output
field to the ts-to-utc input
field
Blocks
section, drag Table Operations > Aggregation
to the editor workspace Dataflow
section
tableAggregation1
to avg-temp_c
avg-temp_c
and edit the following values in the right-hand Properties
section:
temp_c
Average
output
field to the avg-temp_c input
field
Blocks
section, drag Table Operations > Aggregation
to the editor workspace Dataflow
section
tableAggregation2
to avg-press_hpa
avg-press_hpa
and edit the following values in the right-hand Properties
section:
press_hpa
Average
output
field to the avg-press_hpa input
field
Blocks
section, drag Table Operations > Aggregation
to the editor workspace Dataflow
section
tableAggregation3
to avg-light
avg-light
and edit the following values in the right-hand Properties
section:
light
Average
output
field to the avg-light input
field
... > downstream > ParStream-Import > historian > Tables > rwis_data
rwis_data
and drag Insert Row
to the editor workspace Dataflow
section
insertRow
to save-rwis-data
save-rwis-data
and edit the following values in the right-hand Properties
section:
60
output
field to the save-rwis-data ts
field
value 0
field to the save-rwis-data station
field
output
field to the save-rwis-data temp_c
field
output
field the save-rwis-data press_hpa
field
output
field to the save-rwis-data light
field
As before, you will fully confirm whether this dataflow is working correctly when you configure the DOT Demo DGLux dashboard below. For now you should see the averaged
save-rwis-data
fields update every 3 seconds (the ParStream INSERT itself only happens every 60 seconds per theinterval
field) and see a value ofINSERTED
for theStatus
field in itsProperties
section.
save-sampled-rwis-data
dataflow by clicking the x
icon next to its name above the editor workspace
The first time you connect to the DGLux dashboard tool it will prompt you to install a license. DGLux is separately licensed from EFM. It is used here to show the power of EFM and give an example of how to extract operational data from the system. Most DOTs will use their own Traffic Management System (TMS) rather than something like DGLux.
Request License
180-day Trial License
Submit Request
Atrius Solution Builder License Generated
Input license data here:
field in the DGLux5 License
dialog that should still be open
Submit License
I Agree
CREATE NEW > Default > Blank Project
Choose
DOT Dashboard
for the project name and click OK
DGLux is a powerful, complicated tool. Rather than send time trying to learn it, you are going to import an existing dashboard to get started as quickly as possible. Feel free to make a copy of the dashboard or create a new DGLux project if you are interested in becoming more familiar with the tool.
You may have to manually save this to your downloads folder as your web browser will want to display it inline.
Project
section, select the DOT Dashboard > assets
folder and click the Upload
button
cisco_logo.png
file you downloaded and click Open
assets
folder
Project
section, select the DOT Dashboard
folder and click the Upload
button again
index.dg5
file you downloaded and click Open
Ok
when prompted to overwrite the existing index.dg5
file
You should see the DMS display update in real time based on your setup. Cover your RWIS sensor and the display should change. The RWIS graphs should update every 60 seconds. Placing the Car Simulator on its side should trigger new entries in the
Vehicle Safety Events
table. There are also examples of live roadway video data (public feeds from the Internet) and an example Google Maps traffic view. If any of these aren’t updating or don’t look correct, don’t be afraid to reach out for help.
Also be aware that these are publicly-accessible dashboards, so be careful who you share the URL with and be respectful of others’ dashboards. You wouldn’t want someone clearing your ParStream tables in the middle of a demo.