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-roadway1listed underneath theRoot Brokerin theBrokerssection 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 theDatasection, 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-logsdataflow 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 cyclesection for theefm-roadway1broker’smqttlink.
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
Metricsfromroadway1-rwis1go 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-rwis1data 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
Pathproperty toward the bottom and not thepathproperty near the middle of thePropertiessection. ThePathis 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 > dataand expanding theweather > roadway1-rwis1entry under theMetricssection. 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
Metricsfromroadway1-rsu1go 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
publishblock 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
crashedfield 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 > dataand expanding thevehicles > crash-reportsentry under theMetricssection. 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-reportsdataflow as well, watching theenabledfield in thepublishblock, which should change totrueduring simulated vehicle safety events and stayfalseotherwise.
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
ifblock 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 SAFEin 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-reportsdata 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_datatable listed, right-click onhistorianand selectIntrospectand 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-datafields update when you place the Car Simulator on its side and see a value ofINSERTEDfor theStatusfield in itsPropertiessection.
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
weatherdata 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-datablock and click theTablebutton associated with theoutputfield in itsPropertiessection 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
inputandoutputfields.
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-datafields update every 3 seconds (the ParStream INSERT itself only happens every 60 seconds per theintervalfield) and see a value ofINSERTEDfor theStatusfield in itsPropertiessection.
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 Eventstable. 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.