├── Dashboard
├── Lecture1-Node-RED-Dashboard-Intro
│ ├── README.md
│ ├── flows
│ │ └── Dashboard-Intro.json
│ ├── screenshots
│ │ ├── NRD-Intro-Example.png
│ │ └── NRD-Intro-ExampleFlow.png
│ └── slides
│ │ ├── README.md
│ │ ├── closing.png
│ │ ├── nrdi-agenda.png
│ │ ├── nrdi-chart.png
│ │ ├── nrdi-dashboard.png
│ │ ├── nrdi-dashchart.png
│ │ ├── nrdi-dashgauge.png
│ │ ├── nrdi-dashnotify.png
│ │ ├── nrdi-dashslider.png
│ │ ├── nrdi-dashswitch.png
│ │ ├── nrdi-dashtext.png
│ │ ├── nrdi-flow.png
│ │ ├── nrdi-gauge.png
│ │ ├── nrdi-notify.png
│ │ ├── nrdi-palette.png
│ │ ├── nrdi-palette1.png
│ │ ├── nrdi-slider.png
│ │ ├── nrdi-switch.png
│ │ ├── nrdi-text.png
│ │ └── nrdi-title.png
├── Lecture2-Node-RED-Layout-Config
│ ├── README.md
│ ├── flows
│ │ └── NRD-Layout-TwitterImageAnalysis-Example.json
│ ├── screenshots
│ │ ├── NRD-Layout-TwitterExample.png
│ │ └── NRD-Layout-TwitterExampleFlow.png
│ └── slides
│ │ ├── NRD-Layout-AddGroup.png
│ │ ├── NRD-Layout-AddLink.png
│ │ ├── NRD-Layout-AddTab.png
│ │ ├── NRD-Layout-AddWidget.png
│ │ ├── NRD-Layout-DashTab.png
│ │ ├── NRD-Layout-DashTwitter.png
│ │ ├── NRD-Layout-DashWidget.png
│ │ ├── NRD-Layout-Launch.png
│ │ ├── NRD-Layout-MoveWidget.png
│ │ ├── NRD-Layout-PaletteBlank.png
│ │ ├── NRD-Layout-Resize.png
│ │ ├── NRD-Layout-SiteConfig.png
│ │ ├── NRD-Layout-Theme.png
│ │ ├── NRD-Layout-Title.png
│ │ ├── NRD-Layout-Trailer.png
│ │ └── README.md
├── Lecture3-Node-RED-Charts
│ ├── README.md
│ ├── flows
│ │ ├── Dashboard-Chart-Advanced.json
│ │ ├── Dashboard-Chart-Historical.json
│ │ └── Dashboard-Chart-Intro.json
│ ├── screenshots
│ │ ├── NRD-AdvancedCharts-Flow.png
│ │ ├── NRD-AdvancedCharts.png
│ │ ├── NRD-Charts-Historical-Dashboard.png
│ │ ├── NRD-Charts-Historical-Flow-LineChartArray.png
│ │ ├── NRD-Charts-Historical-Flow.png
│ │ ├── NRD-Charts-Intro-Dashboard-Line.png
│ │ ├── NRD-Charts-Intro-Dashboard-bar.png
│ │ ├── NRD-Charts-Intro-Dashboard-pie.png
│ │ ├── NRD-Charts-Intro-Dashboard.png
│ │ ├── NRD-Charts-Intro-Flow-BarArray.png
│ │ ├── NRD-Charts-Intro-Flow-LineChartArray.png
│ │ ├── NRD-Charts-Intro-Flow-LineChartArrayM.png
│ │ ├── NRD-Charts-Intro-Flow-PieArray.png
│ │ └── NRD-Charts-Intro-Flow.png
│ └── slides
│ │ ├── NRD-Chart-1LineExample.png
│ │ ├── NRD-Chart-AdvHistDash.png
│ │ ├── NRD-Chart-AdvHistDatePick.png
│ │ ├── NRD-Chart-AdvHistFlow.png
│ │ ├── NRD-Chart-BarExample.png
│ │ ├── NRD-Chart-ChartNode.png
│ │ ├── NRD-Chart-DatePickNode.png
│ │ ├── NRD-Chart-ExampleFlow.png
│ │ ├── NRD-Chart-HistoricalExample.png
│ │ ├── NRD-Chart-MLineExample.png
│ │ ├── NRD-Chart-PaletteBlank.png
│ │ ├── NRD-Chart-PieExample.png
│ │ ├── NRD-Chart-Title.png
│ │ ├── NRD-Chart-Trailer.png
│ │ ├── NRD-Charts-ExampleDashboard.png
│ │ └── README.md
└── Lecture4-Node-RED-Forms-Templates
│ ├── README.md
│ ├── flows
│ ├── NRD-FT-AssetRegForm-Example.json
│ └── NRD-FT-ISS-Template-Example.json
│ ├── screenshots
│ ├── NRD-Forms-AssetReg-Button.png
│ ├── NRD-Forms-AssetReg-Dropdown.png
│ ├── NRD-Forms-AssetReg-Form.png
│ ├── NRD-Forms-AssetReg-Template.png
│ ├── NRD-Forms-AssetReg.png
│ ├── NRD-Forms-Flow.png
│ ├── NRD-Forms-Nodedetails.png
│ ├── NRD-ISS-TemplateWorldMap-Dashboard.png
│ └── NRD-ISS-TemplateWorldMap-flow-annotated-.png
│ └── slides
│ ├── NRD-FT-AssetReg-Button.png
│ ├── NRD-FT-AssetReg-Dropdown.png
│ ├── NRD-FT-AssetReg-Form.png
│ ├── NRD-FT-AssetReg-Template.png
│ ├── NRD-FT-AssetRegDash.png
│ ├── NRD-FT-AssetRegFlow.png
│ ├── NRD-FT-ButtonNode.png
│ ├── NRD-FT-DropdownNode.png
│ ├── NRD-FT-FormNode.png
│ ├── NRD-FT-ISS-Dash.png
│ ├── NRD-FT-ISS-Flow.png
│ ├── NRD-FT-PaletteBlank.png
│ ├── NRD-FT-TemplateNode.png
│ ├── NRD-FT-title.png
│ ├── NRD-FT-trailer.png
│ └── README.md
└── README.md
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/README.md:
--------------------------------------------------------------------------------
1 | # Coursera - Developers Guide to Node-RED
2 | Lecture 1 - Introduction to Node-RED Dashboard - *Resources*
3 |
4 | ## Review the Lecture 1 slides
5 | [Slides](slides/README.md)
6 |
7 | ## Download the Lecture 1 flow
8 | [Lecture 1 flow](flows/Dashboard-Intro.json)
9 |
10 | ## Screenshots of Lecture 1 Node-RED
11 | 
12 | 
13 |
14 |
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/flows/Dashboard-Intro.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "id": "19be5ee2.ff2ff9",
4 | "type": "tab",
5 | "label": "Dashboard Intro",
6 | "disabled": false,
7 | "info": ""
8 | },
9 | {
10 | "id": "4b0e3185.ea0c68",
11 | "type": "inject",
12 | "z": "19be5ee2.ff2ff9",
13 | "name": "",
14 | "topic": "",
15 | "payload": "",
16 | "payloadType": "date",
17 | "repeat": "1",
18 | "crontab": "",
19 | "once": false,
20 | "x": 110,
21 | "y": 140,
22 | "wires": [
23 | [
24 | "fae795ff.fd8b3"
25 | ]
26 | ]
27 | },
28 | {
29 | "id": "3aa200f4.bb8e",
30 | "type": "function",
31 | "z": "19be5ee2.ff2ff9",
32 | "name": "Random #s",
33 | "func": "if( msg.payload === false ) {\n return null;\n}\nmsg.payload = Math.round(Math.random()*100);\nreturn msg;",
34 | "outputs": 1,
35 | "noerr": 0,
36 | "x": 430,
37 | "y": 140,
38 | "wires": [
39 | [
40 | "5177e366.baac1c"
41 | ]
42 | ]
43 | },
44 | {
45 | "id": "b1c0c80b.60b228",
46 | "type": "ui_chart",
47 | "z": "19be5ee2.ff2ff9",
48 | "name": "Chart",
49 | "group": "309b41b2.77ed86",
50 | "order": 0,
51 | "width": 0,
52 | "height": 0,
53 | "label": "Random #",
54 | "chartType": "line",
55 | "legend": "false",
56 | "xformat": "HH:mm:ss",
57 | "interpolate": "linear",
58 | "nodata": "Querying Entropy",
59 | "dot": false,
60 | "ymin": "0",
61 | "ymax": "100",
62 | "removeOlder": "1",
63 | "removeOlderPoints": "",
64 | "removeOlderUnit": "60",
65 | "cutout": "",
66 | "useOneColor": false,
67 | "colors": [
68 | "#1f77b4",
69 | "#aec7e8",
70 | "#ff7f0e",
71 | "#2ca02c",
72 | "#98df8a",
73 | "#d62728",
74 | "#ff9896",
75 | "#9467bd",
76 | "#c5b0d5"
77 | ],
78 | "useOldStyle": true,
79 | "x": 350,
80 | "y": 240,
81 | "wires": [
82 | [],
83 | []
84 | ]
85 | },
86 | {
87 | "id": "e3c5862b.3bcbe8",
88 | "type": "ui_gauge",
89 | "z": "19be5ee2.ff2ff9",
90 | "name": "Gauge",
91 | "group": "309b41b2.77ed86",
92 | "order": 0,
93 | "width": 0,
94 | "height": 0,
95 | "gtype": "gage",
96 | "title": "Gauge",
97 | "label": "units",
98 | "format": "{{value}}",
99 | "min": 0,
100 | "max": "100",
101 | "colors": [
102 | "#00b500",
103 | "#e6e600",
104 | "#ca3838"
105 | ],
106 | "seg1": "",
107 | "seg2": "",
108 | "x": 350,
109 | "y": 280,
110 | "wires": []
111 | },
112 | {
113 | "id": "282f9f47.6b0978",
114 | "type": "ui_slider",
115 | "z": "19be5ee2.ff2ff9",
116 | "name": "",
117 | "label": "Slider",
118 | "group": "309b41b2.77ed86",
119 | "order": 0,
120 | "width": 0,
121 | "height": 0,
122 | "passthru": true,
123 | "topic": "",
124 | "min": 0,
125 | "max": "100",
126 | "step": "",
127 | "x": 350,
128 | "y": 320,
129 | "wires": [
130 | []
131 | ]
132 | },
133 | {
134 | "id": "5bc82e5b.f48f98",
135 | "type": "ui_text",
136 | "z": "19be5ee2.ff2ff9",
137 | "group": "309b41b2.77ed86",
138 | "order": 0,
139 | "width": 0,
140 | "height": 0,
141 | "name": "",
142 | "label": "Text",
143 | "format": "{{msg.payload}}",
144 | "layout": "row-spread",
145 | "x": 350,
146 | "y": 360,
147 | "wires": []
148 | },
149 | {
150 | "id": "fae795ff.fd8b3",
151 | "type": "ui_switch",
152 | "z": "19be5ee2.ff2ff9",
153 | "name": "",
154 | "label": "Switch",
155 | "group": "f9661b60.25bf98",
156 | "order": 2,
157 | "width": 0,
158 | "height": 0,
159 | "passthru": true,
160 | "decouple": "false",
161 | "topic": "",
162 | "style": "",
163 | "onvalue": "true",
164 | "onvalueType": "bool",
165 | "onicon": "",
166 | "oncolor": "",
167 | "offvalue": "false",
168 | "offvalueType": "bool",
169 | "officon": "",
170 | "offcolor": "",
171 | "x": 270,
172 | "y": 140,
173 | "wires": [
174 | [
175 | "3aa200f4.bb8e"
176 | ]
177 | ]
178 | },
179 | {
180 | "id": "edcf26b.c6b3ed8",
181 | "type": "cloudant out",
182 | "z": "19be5ee2.ff2ff9",
183 | "name": "",
184 | "cloudant": "",
185 | "database": "historicaldata0",
186 | "service": "coursera-advanced-nodered-cloudantNoSQLDB",
187 | "payonly": true,
188 | "operation": "insert",
189 | "x": 780,
190 | "y": 480,
191 | "wires": []
192 | },
193 | {
194 | "id": "cc587759.3be438",
195 | "type": "function",
196 | "z": "19be5ee2.ff2ff9",
197 | "name": "Time Series DB",
198 | "func": "return {\n payload: {\n time: new Date().getTime(),\n data: msg.payload\n }\n};",
199 | "outputs": 1,
200 | "noerr": 0,
201 | "x": 380,
202 | "y": 520,
203 | "wires": [
204 | [
205 | "c4ffeaa1.63d",
206 | "be4c613.7e2012"
207 | ]
208 | ]
209 | },
210 | {
211 | "id": "c4ffeaa1.63d",
212 | "type": "function",
213 | "z": "19be5ee2.ff2ff9",
214 | "name": "Modulo",
215 | "func": "var splitdata = msg.payload.time % 3;\nif( splitdata === 0 ) {\n return [msg, null, null];\n} else if( splitdata == 1 ) {\n return [null, msg, null];\n} else if( splitdata == 2) {\n return [null, null, msg];\n}\nreturn [null, null, null];",
216 | "outputs": "3",
217 | "noerr": 0,
218 | "x": 560,
219 | "y": 520,
220 | "wires": [
221 | [
222 | "edcf26b.c6b3ed8"
223 | ],
224 | [
225 | "ec93c76f.ccbc9"
226 | ],
227 | [
228 | "ba6796e7.10f0d"
229 | ]
230 | ]
231 | },
232 | {
233 | "id": "ec93c76f.ccbc9",
234 | "type": "cloudant out",
235 | "z": "19be5ee2.ff2ff9",
236 | "name": "",
237 | "cloudant": "",
238 | "database": "historicaldata1",
239 | "service": "coursera-advanced-nodered-cloudantNoSQLDB",
240 | "payonly": true,
241 | "operation": "insert",
242 | "x": 780,
243 | "y": 520,
244 | "wires": []
245 | },
246 | {
247 | "id": "ba6796e7.10f0d",
248 | "type": "cloudant out",
249 | "z": "19be5ee2.ff2ff9",
250 | "name": "",
251 | "cloudant": "",
252 | "database": "historicaldata2",
253 | "service": "coursera-advanced-nodered-cloudantNoSQLDB",
254 | "payonly": true,
255 | "operation": "insert",
256 | "x": 780,
257 | "y": 560,
258 | "wires": []
259 | },
260 | {
261 | "id": "be4c613.7e2012",
262 | "type": "cloudant out",
263 | "z": "19be5ee2.ff2ff9",
264 | "name": "",
265 | "cloudant": "",
266 | "database": "historicaldata",
267 | "service": "coursera-advanced-nodered-cloudantNoSQLDB",
268 | "payonly": true,
269 | "operation": "insert",
270 | "x": 580,
271 | "y": 460,
272 | "wires": []
273 | },
274 | {
275 | "id": "b6eb769c.a5079",
276 | "type": "ui_text",
277 | "z": "19be5ee2.ff2ff9",
278 | "group": "f9661b60.25bf98",
279 | "order": 1,
280 | "width": 0,
281 | "height": 0,
282 | "name": "",
283 | "label": "",
284 | "format": "{{msg.payload}}",
285 | "layout": "row-spread",
286 | "x": 270,
287 | "y": 60,
288 | "wires": []
289 | },
290 | {
291 | "id": "3f75e974.626b46",
292 | "type": "inject",
293 | "z": "19be5ee2.ff2ff9",
294 | "name": "Instructions",
295 | "topic": "",
296 | "payload": "Use the toggle switch to start / stop the generation of random numbers",
297 | "payloadType": "str",
298 | "repeat": "",
299 | "crontab": "",
300 | "once": true,
301 | "x": 110,
302 | "y": 60,
303 | "wires": [
304 | [
305 | "b6eb769c.a5079"
306 | ]
307 | ]
308 | },
309 | {
310 | "id": "d02570ff.b8e37",
311 | "type": "ui_toast",
312 | "z": "19be5ee2.ff2ff9",
313 | "position": "top right",
314 | "displayTime": "5",
315 | "highlight": "",
316 | "outputs": 0,
317 | "ok": "OK",
318 | "cancel": "",
319 | "topic": "",
320 | "name": "",
321 | "x": 790,
322 | "y": 400,
323 | "wires": []
324 | },
325 | {
326 | "id": "6cfa6003.e8658",
327 | "type": "switch",
328 | "z": "19be5ee2.ff2ff9",
329 | "name": "Warn on High Values",
330 | "property": "payload",
331 | "propertyType": "msg",
332 | "rules": [
333 | {
334 | "t": "gt",
335 | "v": "80",
336 | "vt": "num"
337 | }
338 | ],
339 | "checkall": "true",
340 | "outputs": 1,
341 | "x": 400,
342 | "y": 400,
343 | "wires": [
344 | [
345 | "e79aba0f.8bfa98"
346 | ]
347 | ]
348 | },
349 | {
350 | "id": "e79aba0f.8bfa98",
351 | "type": "template",
352 | "z": "19be5ee2.ff2ff9",
353 | "name": "Alert Msg",
354 | "field": "payload",
355 | "fieldType": "msg",
356 | "format": "handlebars",
357 | "syntax": "mustache",
358 | "template": "Alert : Critical Value Detected {{payload}}",
359 | "output": "str",
360 | "x": 600,
361 | "y": 400,
362 | "wires": [
363 | [
364 | "d02570ff.b8e37"
365 | ]
366 | ]
367 | },
368 | {
369 | "id": "5177e366.baac1c",
370 | "type": "link out",
371 | "z": "19be5ee2.ff2ff9",
372 | "name": "",
373 | "links": [
374 | "7f90fe78.29a6a"
375 | ],
376 | "x": 555,
377 | "y": 140,
378 | "wires": []
379 | },
380 | {
381 | "id": "7f90fe78.29a6a",
382 | "type": "link in",
383 | "z": "19be5ee2.ff2ff9",
384 | "name": "",
385 | "links": [
386 | "5177e366.baac1c"
387 | ],
388 | "x": 95,
389 | "y": 360,
390 | "wires": [
391 | [
392 | "b1c0c80b.60b228",
393 | "e3c5862b.3bcbe8",
394 | "282f9f47.6b0978",
395 | "5bc82e5b.f48f98",
396 | "6cfa6003.e8658",
397 | "cc587759.3be438"
398 | ]
399 | ]
400 | },
401 | {
402 | "id": "309b41b2.77ed86",
403 | "type": "ui_group",
404 | "z": "19be5ee2.ff2ff9",
405 | "name": "Dashboard Controls",
406 | "tab": "744ce3c9.d4c3fc",
407 | "order": 2,
408 | "disp": true,
409 | "width": "6"
410 | },
411 | {
412 | "id": "f9661b60.25bf98",
413 | "type": "ui_group",
414 | "z": "",
415 | "name": "Start / Stop",
416 | "tab": "744ce3c9.d4c3fc",
417 | "order": 1,
418 | "disp": true,
419 | "width": "6"
420 | },
421 | {
422 | "id": "744ce3c9.d4c3fc",
423 | "type": "ui_tab",
424 | "z": "19be5ee2.ff2ff9",
425 | "name": "Introduction",
426 | "icon": "dashboard",
427 | "order": 2
428 | }
429 | ]
430 |
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/screenshots/NRD-Intro-Example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/screenshots/NRD-Intro-Example.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/screenshots/NRD-Intro-ExampleFlow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/screenshots/NRD-Intro-ExampleFlow.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/README.md:
--------------------------------------------------------------------------------
1 | # Coursera - Developers Guide to Node-RED Lecture 1
2 | Lecture 1 - Introduction to Node-RED Dashboard Slides
3 | 
4 | 
5 | 
6 | 
7 | 
8 | 
9 | 
10 | 
11 | 
12 | 
13 | 
14 | 
15 | 
16 | 
17 | 
18 | 
19 | 
20 | 
21 | 
22 | 
23 |
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/closing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/closing.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-agenda.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-agenda.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-chart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-chart.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashboard.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashchart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashchart.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashgauge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashgauge.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashnotify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashnotify.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashslider.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashslider.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashswitch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashswitch.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashtext.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-dashtext.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-flow.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-gauge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-gauge.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-notify.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-notify.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-palette.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-palette.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-palette1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-palette1.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-slider.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-slider.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-switch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-switch.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-text.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-text.png
--------------------------------------------------------------------------------
/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-title.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture1-Node-RED-Dashboard-Intro/slides/nrdi-title.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/README.md:
--------------------------------------------------------------------------------
1 | # Coursera - Developers Guide to Node-RED
2 | Lecture 2 - Node-RED Dashboard Layout and Configuration - *Resources*
3 |
4 | ## Review the Lecture 2 Node-RED Dashboard Layout and Configuration slides
5 | [Slides](slides/README.md)
6 |
7 | ## Download the Lecture 2 Twitter Image Analysis Example flow
8 | [Lecture 2 Twitter Image Analysis Example flow](flows/NRD-Layout-TwitterImageAnalysis-Example.json)
9 |
10 | ## Screenshots of Lecture 2 Node-RED
11 | 
12 | 
13 |
14 |
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/flows/NRD-Layout-TwitterImageAnalysis-Example.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "id": "d7960f6f.32922",
4 | "type": "tab",
5 | "label": "Twitter Image Analysis",
6 | "disabled": false,
7 | "info": ""
8 | },
9 | {
10 | "id": "719866fa.611578",
11 | "type": "ui_template",
12 | "z": "d7960f6f.32922",
13 | "group": "ae40ee.11eabf1",
14 | "name": "Photo",
15 | "order": 3,
16 | "width": "9",
17 | "height": "8",
18 | "format": "
\n
",
19 | "storeOutMessages": false,
20 | "fwdInMessages": false,
21 | "templateScope": "local",
22 | "x": 570,
23 | "y": 280,
24 | "wires": [
25 | [
26 | "6a7c7ce7.95586c"
27 | ]
28 | ]
29 | },
30 | {
31 | "id": "4c4350d1.545708",
32 | "type": "comment",
33 | "z": "d7960f6f.32922",
34 | "name": "Reload picture into Node-RED Dashboard",
35 | "info": "",
36 | "x": 1060,
37 | "y": 280,
38 | "wires": []
39 | },
40 | {
41 | "id": "72ac291.8b545d8",
42 | "type": "function",
43 | "z": "d7960f6f.32922",
44 | "name": "Extract Twitter Image URL",
45 | "func": "msg.payload = \"\";\nif (typeof msg.tweet.entities.media !== 'undefined') {\n if (typeof msg.tweet.entities.media[0].media_url !== 'undefined') {\n msg.payload = msg.tweet.entities.media[0].media_url;\n } \n}\n\nif (typeof msg.tweet.extended_tweet !== 'undefined') {\n if (typeof msg.tweet.extended_tweet.entities !== 'undefined') {\n if (typeof msg.tweet.extended_tweet.entities.media !== 'undefined') {\n if (typeof msg.tweet.extended_tweet.entities.media[0].media_url !== 'undefined') {\n msg.payload = msg.tweet.entities.media[0].media_url;\n }\n }\n }\n}\n\nif(typeof msg.tweet.retweeted_status !== 'undefined') {\n if( typeof msg.tweet.retweeted_status.extended_tweet !== 'undefined') {\n if( typeof msg.tweet.retweeted_status.extended_tweet.entities !== 'undefined') {\n if( typeof msg.tweet.retweeted_status.extended_tweet.entities.media[0].media_url !== 'undefined') {\n msg.payload = msg.tweet.retweeted_status.extended_tweet.entities.media[0].media_url;\n }\n }\n }\n}\n\n\nif( msg.payload.length ) {\n return [ msg, null ];\n} else {\n return [ null, msg ];\n}",
46 | "outputs": "2",
47 | "noerr": 0,
48 | "x": 370,
49 | "y": 240,
50 | "wires": [
51 | [
52 | "6411acb4.cf82ec",
53 | "fc2667a3.11a148",
54 | "719866fa.611578",
55 | "3326e141.b60ade",
56 | "ab7a352a.af168",
57 | "e87a0d51.5ab72"
58 | ],
59 | []
60 | ]
61 | },
62 | {
63 | "id": "6411acb4.cf82ec",
64 | "type": "debug",
65 | "z": "d7960f6f.32922",
66 | "name": "Image URL to analyze",
67 | "active": true,
68 | "console": "false",
69 | "complete": "payload",
70 | "x": 620,
71 | "y": 240,
72 | "wires": []
73 | },
74 | {
75 | "id": "1396daac.4ea22d",
76 | "type": "debug",
77 | "z": "d7960f6f.32922",
78 | "name": "",
79 | "active": true,
80 | "console": "false",
81 | "complete": "result",
82 | "x": 830,
83 | "y": 360,
84 | "wires": []
85 | },
86 | {
87 | "id": "fc2667a3.11a148",
88 | "type": "visual-recognition-v3",
89 | "z": "d7960f6f.32922",
90 | "name": "",
91 | "apikey": "",
92 | "image-feature": "classifyImage",
93 | "lang": "en",
94 | "x": 610,
95 | "y": 320,
96 | "wires": [
97 | [
98 | "1396daac.4ea22d",
99 | "f5dd7c91.b43ff8"
100 | ]
101 | ]
102 | },
103 | {
104 | "id": "9f82c714.f98cb8",
105 | "type": "twitter in",
106 | "z": "d7960f6f.32922",
107 | "twitter": "",
108 | "tags": "",
109 | "user": "false",
110 | "name": "",
111 | "topic": "tweets",
112 | "inputs": 1,
113 | "x": 110,
114 | "y": 80,
115 | "wires": [
116 | [
117 | "69bd043c.43690c"
118 | ]
119 | ]
120 | },
121 | {
122 | "id": "cde1d941.2c6918",
123 | "type": "debug",
124 | "z": "d7960f6f.32922",
125 | "name": "",
126 | "active": true,
127 | "console": "false",
128 | "complete": "tweet",
129 | "x": 580,
130 | "y": 80,
131 | "wires": []
132 | },
133 | {
134 | "id": "c584a65f.927a5",
135 | "type": "inject",
136 | "z": "d7960f6f.32922",
137 | "name": "",
138 | "topic": "",
139 | "payload": "{\"created_at\":\"Sat Sep 23 14:19:37 +0000 2017\",\"id\":911595915168899100,\"id_str\":\"911595915168899072\",\"text\":\"RT @IBM: Watch how a new solution is harnessing the power of #IBMIot to combat the poaching of endangered 🦏:… \",\"source\":\"Twitter Web Client\",\"truncated\":false,\"in_reply_to_status_id\":null,\"in_reply_to_status_id_str\":null,\"in_reply_to_user_id\":null,\"in_reply_to_user_id_str\":null,\"in_reply_to_screen_name\":null,\"user\":{\"id\":2577403879,\"id_str\":\"2577403879\",\"name\":\"John Walicki\",\"screen_name\":\"johnwalicki\",\"location\":\"New Jersey, USA\",\"url\":null,\"description\":\"IBM Watson Internet of Things Developer Advocate, Über Geek, Family Guy. #IoT #OpenSource, #Linux, #AI My tweets are my own.\",\"translator_type\":\"none\",\"protected\":false,\"verified\":false,\"followers_count\":646,\"friends_count\":850,\"listed_count\":153,\"favourites_count\":1770,\"statuses_count\":1473,\"created_at\":\"Thu Jun 19 19:54:32 +0000 2014\",\"utc_offset\":null,\"time_zone\":null,\"geo_enabled\":false,\"lang\":\"en\",\"contributors_enabled\":false,\"is_translator\":false,\"profile_background_color\":\"C0DEED\",\"profile_background_image_url\":\"http://abs.twimg.com/images/themes/theme1/bg.png\",\"profile_background_image_url_https\":\"https://abs.twimg.com/images/themes/theme1/bg.png\",\"profile_background_tile\":false,\"profile_link_color\":\"1DA1F2\",\"profile_sidebar_border_color\":\"C0DEED\",\"profile_sidebar_fill_color\":\"DDEEF6\",\"profile_text_color\":\"333333\",\"profile_use_background_image\":true,\"profile_image_url\":\"http://pbs.twimg.com/profile_images/711615965721718784/7My0kbZI_normal.jpg\",\"profile_image_url_https\":\"https://pbs.twimg.com/profile_images/711615965721718784/7My0kbZI_normal.jpg\",\"profile_banner_url\":\"https://pbs.twimg.com/profile_banners/2577403879/1476478381\",\"default_profile\":true,\"default_profile_image\":false,\"following\":null,\"follow_request_sent\":null,\"notifications\":null},\"geo\":null,\"coordinates\":null,\"place\":null,\"contributors\":null,\"retweeted_status\":{\"created_at\":\"Fri Sep 22 13:15:04 +0000 2017\",\"id\":911217282067714000,\"id_str\":\"911217282067714048\",\"text\":\"Watch how a new solution is harnessing the power of #IBMIot to combat the poaching of endangered 🦏:… https://t.co/91BD2uZqFk\",\"display_text_range\":[0,140],\"source\":\"Sprinklr\",\"truncated\":true,\"in_reply_to_status_id\":null,\"in_reply_to_status_id_str\":null,\"in_reply_to_user_id\":null,\"in_reply_to_user_id_str\":null,\"in_reply_to_screen_name\":null,\"user\":{\"id\":18994444,\"id_str\":\"18994444\",\"name\":\"IBM\",\"screen_name\":\"IBM\",\"location\":\"Armonk, New York\",\"url\":\"http://www.ibm.com\",\"description\":\"Official IBM Twitter account. Follows the IBM Social Computing Guidelines.\",\"translator_type\":\"none\",\"protected\":false,\"verified\":true,\"followers_count\":396044,\"friends_count\":6427,\"listed_count\":5154,\"favourites_count\":2637,\"statuses_count\":9814,\"created_at\":\"Wed Jan 14 20:41:57 +0000 2009\",\"utc_offset\":-14400,\"time_zone\":\"Eastern Time (US & Canada)\",\"geo_enabled\":false,\"lang\":\"en\",\"contributors_enabled\":false,\"is_translator\":false,\"profile_background_color\":\"FFFFFF\",\"profile_background_image_url\":\"http://pbs.twimg.com/profile_background_images/378800000152426467/Viwc1IvP.jpeg\",\"profile_background_image_url_https\":\"https://pbs.twimg.com/profile_background_images/378800000152426467/Viwc1IvP.jpeg\",\"profile_background_tile\":false,\"profile_link_color\":\"2FC2EF\",\"profile_sidebar_border_color\":\"000000\",\"profile_sidebar_fill_color\":\"252429\",\"profile_text_color\":\"666666\",\"profile_use_background_image\":false,\"profile_image_url\":\"http://pbs.twimg.com/profile_images/875111316821651456/AmZkYTWP_normal.jpg\",\"profile_image_url_https\":\"https://pbs.twimg.com/profile_images/875111316821651456/AmZkYTWP_normal.jpg\",\"profile_banner_url\":\"https://pbs.twimg.com/profile_banners/18994444/1495457811\",\"default_profile\":false,\"default_profile_image\":false,\"following\":null,\"follow_request_sent\":null,\"notifications\":null},\"geo\":null,\"coordinates\":null,\"place\":null,\"contributors\":null,\"is_quote_status\":false,\"extended_tweet\":{\"full_text\":\"Watch how a new solution is harnessing the power of #IBMIot to combat the poaching of endangered 🦏: https://t.co/zL55BXKLFq #WorldRhinoDay https://t.co/eBpZmbbnB7\",\"display_text_range\":[0,138],\"entities\":{\"hashtags\":[{\"text\":\"IBMIot\",\"indices\":[52,59]},{\"text\":\"WorldRhinoDay\",\"indices\":[124,138]}],\"urls\":[{\"url\":\"https://t.co/zL55BXKLFq\",\"expanded_url\":\"http://bitly.com/2hknTRt\",\"display_url\":\"bitly.com/2hknTRt\",\"indices\":[100,123]}],\"user_mentions\":[],\"symbols\":[],\"media\":[{\"id\":911217279353880600,\"id_str\":\"911217279353880576\",\"indices\":[139,162],\"media_url\":\"http://pbs.twimg.com/media/DKVLSakWAAAc3Fl.jpg\",\"media_url_https\":\"https://pbs.twimg.com/media/DKVLSakWAAAc3Fl.jpg\",\"url\":\"https://t.co/eBpZmbbnB7\",\"display_url\":\"pic.twitter.com/eBpZmbbnB7\",\"expanded_url\":\"https://twitter.com/IBM/status/911217282067714048/photo/1\",\"type\":\"photo\",\"sizes\":{\"small\":{\"w\":680,\"h\":453,\"resize\":\"fit\"},\"medium\":{\"w\":1024,\"h\":682,\"resize\":\"fit\"},\"thumb\":{\"w\":150,\"h\":150,\"resize\":\"crop\"},\"large\":{\"w\":1024,\"h\":682,\"resize\":\"fit\"}}}]},\"extended_entities\":{\"media\":[{\"id\":911217279353880600,\"id_str\":\"911217279353880576\",\"indices\":[139,162],\"media_url\":\"http://pbs.twimg.com/media/DKVLSakWAAAc3Fl.jpg\",\"media_url_https\":\"https://pbs.twimg.com/media/DKVLSakWAAAc3Fl.jpg\",\"url\":\"https://t.co/eBpZmbbnB7\",\"display_url\":\"pic.twitter.com/eBpZmbbnB7\",\"expanded_url\":\"https://twitter.com/IBM/status/911217282067714048/photo/1\",\"type\":\"photo\",\"sizes\":{\"small\":{\"w\":680,\"h\":453,\"resize\":\"fit\"},\"medium\":{\"w\":1024,\"h\":682,\"resize\":\"fit\"},\"thumb\":{\"w\":150,\"h\":150,\"resize\":\"crop\"},\"large\":{\"w\":1024,\"h\":682,\"resize\":\"fit\"}}}]}},\"quote_count\":2,\"reply_count\":0,\"retweet_count\":35,\"favorite_count\":46,\"entities\":{\"hashtags\":[{\"text\":\"IBMIot\",\"indices\":[52,59]}],\"urls\":[{\"url\":\"https://t.co/91BD2uZqFk\",\"expanded_url\":\"https://twitter.com/i/web/status/911217282067714048\",\"display_url\":\"twitter.com/i/web/status/9…\",\"indices\":[101,124]}],\"user_mentions\":[],\"symbols\":[]},\"favorited\":false,\"retweeted\":false,\"possibly_sensitive\":false,\"filter_level\":\"low\",\"lang\":\"en\"},\"is_quote_status\":false,\"quote_count\":0,\"reply_count\":0,\"retweet_count\":0,\"favorite_count\":0,\"entities\":{\"hashtags\":[{\"text\":\"IBMIot\",\"indices\":[61,68]}],\"urls\":[],\"user_mentions\":[{\"screen_name\":\"IBM\",\"name\":\"IBM\",\"id\":18994444,\"id_str\":\"18994444\",\"indices\":[3,7]}],\"symbols\":[]},\"favorited\":false,\"retweeted\":false,\"possibly_sensitive\":false,\"filter_level\":\"low\",\"lang\":\"en\",\"timestamp_ms\":\"1506176377466\"}",
140 | "payloadType": "json",
141 | "repeat": "",
142 | "crontab": "",
143 | "once": false,
144 | "x": 110,
145 | "y": 460,
146 | "wires": [
147 | [
148 | "d6afeeee.4aa088"
149 | ]
150 | ]
151 | },
152 | {
153 | "id": "d6afeeee.4aa088",
154 | "type": "change",
155 | "z": "d7960f6f.32922",
156 | "name": "",
157 | "rules": [
158 | {
159 | "t": "set",
160 | "p": "tweet",
161 | "pt": "msg",
162 | "to": "payload",
163 | "tot": "msg"
164 | }
165 | ],
166 | "action": "",
167 | "property": "",
168 | "from": "",
169 | "to": "",
170 | "reg": false,
171 | "x": 300,
172 | "y": 440,
173 | "wires": [
174 | [
175 | "72ac291.8b545d8",
176 | "7eaf6775.b46e4",
177 | "ab7a352a.af168"
178 | ]
179 | ]
180 | },
181 | {
182 | "id": "424a428d.7c1e14",
183 | "type": "comment",
184 | "z": "d7960f6f.32922",
185 | "name": "Sample Tweets",
186 | "info": "",
187 | "x": 120,
188 | "y": 380,
189 | "wires": []
190 | },
191 | {
192 | "id": "f5dd7c91.b43ff8",
193 | "type": "function",
194 | "z": "d7960f6f.32922",
195 | "name": "Process Results",
196 | "func": "if (typeof msg.result == 'undefined') {\n return null;\n}\n\n// Text Extraction\nif (typeof msg.result.images[0].text != 'undefined') {\n var image_text = msg.result.images[0].text;\n msg.payload = image_text;\n msg.template = image_text;\n if( image_text.length >0 ) {\n msg.template= \"Watson found the words: \"+image_text;\n }\n return msg;\n}\n\nvar bestcolor = -1;\nvar colorscore = 0;\nvar c_id = 0;\nvar say = \"\";\nvar item;\n\nfor ( c_id=0; c_id < (msg.result.images[0].classifiers.length); c_id++ ){\n // find the best color, if any\n for( i =0; i<(msg.result.images[0].classifiers[c_id].classes.length); i++ ){\n var object = msg.result.images[0].classifiers[c_id].classes[i].class;\n if ( object.includes(\"color\") ) {\n if( msg.result.images[0].classifiers[c_id].classes[i].score > colorscore){\n bestcolor = i;\n colorscore = msg.result.images[0].classifiers[c_id].classes[i].score;\n }\n }\n }\n \n var bestItem = 0;\n var itemScore = 0;\n for( i =0; i<(msg.result.images[0].classifiers[c_id].classes.length); i++ ){\n var object = msg.result.images[0].classifiers[c_id].classes[i].class;\n if ( !object.includes(\"color\") ) {\n if( msg.result.images[0].classifiers[c_id].classes[i].score > itemScore){\n// bestItem = i;\n bestItem = 0;\n itemScore = msg.result.images[0].classifiers[c_id].classes[i].score;\n }\n }\n }\n \n if( bestcolor != \"-1\") {\n // found a color\n item = msg.result.images[0].classifiers[c_id].classes[bestcolor].class + \" \" + msg.result.images[0].classifiers[c_id].classes[bestItem].class;\n bestcolor = -1;\n } else {\n item = msg.result.images[0].classifiers[c_id].classes[bestItem].class;\n }\n// say = say + \" Watson's \" + msg.result.images[0].classifiers[c_id].name + \" classifier thinks this picture contains a \" + item +\".\";\n say = say + \" Watson thinks this picture contains a \" + item +\".\";\n}\nmsg.payload = say;\n\nvar picInfo = msg.result.images[0].classifiers[0].classes;\nvar arrayLength = picInfo.length;\n\nmsg.template=\"\";\n\nmsg.template=msg.template+\"\"+say+\"
Class | Confidence |
\";\nfor (var i = 0; i < arrayLength; i++) {\n msg.template = msg.template + \"\" + picInfo[i].class + \" | \" + picInfo[i].score + \" |
\";\n}\nmsg.template = msg.template + \"
\"\n\n\nreturn msg;",
197 | "outputs": 1,
198 | "noerr": 0,
199 | "x": 840,
200 | "y": 320,
201 | "wires": [
202 | [
203 | "7bc3d5f3.2f1354",
204 | "ddd43261.4edde"
205 | ]
206 | ]
207 | },
208 | {
209 | "id": "7bc3d5f3.2f1354",
210 | "type": "debug",
211 | "z": "d7960f6f.32922",
212 | "name": "What did Watson find?",
213 | "active": true,
214 | "console": "false",
215 | "complete": "payload",
216 | "x": 1080,
217 | "y": 360,
218 | "wires": []
219 | },
220 | {
221 | "id": "3326e141.b60ade",
222 | "type": "change",
223 | "z": "d7960f6f.32922",
224 | "name": "Tweet Text",
225 | "rules": [
226 | {
227 | "t": "set",
228 | "p": "payload",
229 | "pt": "msg",
230 | "to": "tweet.text",
231 | "tot": "msg"
232 | }
233 | ],
234 | "action": "",
235 | "property": "",
236 | "from": "",
237 | "to": "",
238 | "reg": false,
239 | "x": 590,
240 | "y": 200,
241 | "wires": [
242 | [
243 | "b32e795f.a7f23",
244 | "1bc67f6e.dd4791"
245 | ]
246 | ]
247 | },
248 | {
249 | "id": "b32e795f.a7f23",
250 | "type": "ui_text",
251 | "z": "d7960f6f.32922",
252 | "group": "ae40ee.11eabf1",
253 | "order": 2,
254 | "width": 0,
255 | "height": 0,
256 | "name": "Tweet Text",
257 | "label": "",
258 | "format": "{{msg.payload}}",
259 | "layout": "row-spread",
260 | "x": 830,
261 | "y": 200,
262 | "wires": []
263 | },
264 | {
265 | "id": "ddd43261.4edde",
266 | "type": "ui_template",
267 | "z": "d7960f6f.32922",
268 | "group": "b2527f39.a0a148",
269 | "name": "Results Table",
270 | "order": 1,
271 | "width": "9",
272 | "height": "10",
273 | "format": "",
274 | "storeOutMessages": true,
275 | "fwdInMessages": true,
276 | "templateScope": "local",
277 | "x": 1060,
278 | "y": 320,
279 | "wires": [
280 | []
281 | ]
282 | },
283 | {
284 | "id": "b9519923.896fd8",
285 | "type": "inject",
286 | "z": "d7960f6f.32922",
287 | "name": "",
288 | "topic": "",
289 | "payload": "{\"created_at\":\"Sat Sep 23 17:48:40 +0000 2017\",\"id\":911648524663709700,\"id_str\":\"911648524663709698\",\"text\":\"Breaking 2 @NikeRunning @NatGeo https://t.co/aAygp48EAq\",\"display_text_range\":[0,31],\"source\":\"Twitter for iPhone\",\"truncated\":false,\"in_reply_to_status_id\":null,\"in_reply_to_status_id_str\":null,\"in_reply_to_user_id\":null,\"in_reply_to_user_id_str\":null,\"in_reply_to_screen_name\":null,\"user\":{\"id\":109308126,\"id_str\":\"109308126\",\"name\":\"Jrmi\",\"screen_name\":\"JeremieRoturier\",\"location\":\"London, England\",\"url\":\"http://jeremieroturier.com\",\"description\":\"Sportsaholic and writing junkie. Member of @JolieFoulee, founder of @EtoileFO. Take pics for quality football magazines. Work at @Apple x @beatsbydre. Ex @Nike.\",\"translator_type\":\"none\",\"protected\":false,\"verified\":false,\"followers_count\":472,\"friends_count\":665,\"listed_count\":24,\"favourites_count\":631,\"statuses_count\":4333,\"created_at\":\"Thu Jan 28 16:42:30 +0000 2010\",\"utc_offset\":7200,\"time_zone\":\"Paris\",\"geo_enabled\":true,\"lang\":\"en\",\"contributors_enabled\":false,\"is_translator\":false,\"profile_background_color\":\"8C12FF\",\"profile_background_image_url\":\"http://pbs.twimg.com/profile_background_images/106316656/chat_noir.jpg\",\"profile_background_image_url_https\":\"https://pbs.twimg.com/profile_background_images/106316656/chat_noir.jpg\",\"profile_background_tile\":true,\"profile_link_color\":\"85459E\",\"profile_sidebar_border_color\":\"8956B3\",\"profile_sidebar_fill_color\":\"030303\",\"profile_text_color\":\"17BEE8\",\"profile_use_background_image\":true,\"profile_image_url\":\"http://pbs.twimg.com/profile_images/730899031162036224/_8p6sEXu_normal.jpg\",\"profile_image_url_https\":\"https://pbs.twimg.com/profile_images/730899031162036224/_8p6sEXu_normal.jpg\",\"profile_banner_url\":\"https://pbs.twimg.com/profile_banners/109308126/1472307658\",\"default_profile\":false,\"default_profile_image\":false,\"following\":null,\"follow_request_sent\":null,\"notifications\":null},\"geo\":null,\"coordinates\":null,\"place\":{\"id\":\"3078869807f9dd36\",\"url\":\"https://api.twitter.com/1.1/geo/id/3078869807f9dd36.json\",\"place_type\":\"city\",\"name\":\"Berlin\",\"full_name\":\"Berlin, Germany\",\"country_code\":\"DE\",\"country\":\"Germany\",\"bounding_box\":{\"type\":\"Polygon\",\"coordinates\":[[[13.088304,52.338079],[13.088304,52.675323],[13.760909,52.675323],[13.760909,52.338079]]]},\"attributes\":{}},\"contributors\":null,\"is_quote_status\":false,\"quote_count\":0,\"reply_count\":0,\"retweet_count\":0,\"favorite_count\":0,\"entities\":{\"hashtags\":[],\"urls\":[],\"user_mentions\":[{\"screen_name\":\"NikeRunning\",\"name\":\"Nike+ Run Club\",\"id\":337726224,\"id_str\":\"337726224\",\"indices\":[11,23]},{\"screen_name\":\"NatGeo\",\"name\":\"National Geographic\",\"id\":17471979,\"id_str\":\"17471979\",\"indices\":[24,31]}],\"symbols\":[],\"media\":[{\"id\":911648512970051600,\"id_str\":\"911648512970051585\",\"indices\":[32,55],\"media_url\":\"http://pbs.twimg.com/media/DKbTfg-X0AEAI9P.jpg\",\"media_url_https\":\"https://pbs.twimg.com/media/DKbTfg-X0AEAI9P.jpg\",\"url\":\"https://t.co/aAygp48EAq\",\"display_url\":\"pic.twitter.com/aAygp48EAq\",\"expanded_url\":\"https://twitter.com/JeremieRoturier/status/911648524663709698/photo/1\",\"type\":\"photo\",\"sizes\":{\"thumb\":{\"w\":150,\"h\":150,\"resize\":\"crop\"},\"large\":{\"w\":1776,\"h\":1184,\"resize\":\"fit\"},\"medium\":{\"w\":1200,\"h\":800,\"resize\":\"fit\"},\"small\":{\"w\":680,\"h\":453,\"resize\":\"fit\"}}}]},\"extended_entities\":{\"media\":[{\"id\":911648512970051600,\"id_str\":\"911648512970051585\",\"indices\":[32,55],\"media_url\":\"http://pbs.twimg.com/media/DKbTfg-X0AEAI9P.jpg\",\"media_url_https\":\"https://pbs.twimg.com/media/DKbTfg-X0AEAI9P.jpg\",\"url\":\"https://t.co/aAygp48EAq\",\"display_url\":\"pic.twitter.com/aAygp48EAq\",\"expanded_url\":\"https://twitter.com/JeremieRoturier/status/911648524663709698/photo/1\",\"type\":\"photo\",\"sizes\":{\"thumb\":{\"w\":150,\"h\":150,\"resize\":\"crop\"},\"large\":{\"w\":1776,\"h\":1184,\"resize\":\"fit\"},\"medium\":{\"w\":1200,\"h\":800,\"resize\":\"fit\"},\"small\":{\"w\":680,\"h\":453,\"resize\":\"fit\"}}}]},\"favorited\":false,\"retweeted\":false,\"possibly_sensitive\":false,\"filter_level\":\"low\",\"lang\":\"en\",\"timestamp_ms\":\"1506188920547\"}",
290 | "payloadType": "json",
291 | "repeat": "",
292 | "crontab": "",
293 | "once": false,
294 | "x": 110,
295 | "y": 420,
296 | "wires": [
297 | [
298 | "d6afeeee.4aa088"
299 | ]
300 | ]
301 | },
302 | {
303 | "id": "d7b640d.dd860c",
304 | "type": "comment",
305 | "z": "d7960f6f.32922",
306 | "name": "Paste API keys for Visual Recognition",
307 | "info": "1. Log into IBM Cloud\n2. Create an instance of the \nWatson Visual Recognition service.\n3. Visit the Service Credentials tab\n4. Click on View Credentials\n5. Copy/Paste the password and username into\nthis Node-RED node.",
308 | "x": 570,
309 | "y": 360,
310 | "wires": []
311 | },
312 | {
313 | "id": "7eaf6775.b46e4",
314 | "type": "debug",
315 | "z": "d7960f6f.32922",
316 | "name": "",
317 | "active": true,
318 | "console": "false",
319 | "complete": "false",
320 | "x": 530,
321 | "y": 440,
322 | "wires": []
323 | },
324 | {
325 | "id": "69bd043c.43690c",
326 | "type": "delay",
327 | "z": "d7960f6f.32922",
328 | "name": "",
329 | "pauseType": "rate",
330 | "timeout": "5",
331 | "timeoutUnits": "seconds",
332 | "rate": "1",
333 | "nbRateUnits": "10",
334 | "rateUnits": "second",
335 | "randomFirst": "1",
336 | "randomLast": "5",
337 | "randomUnits": "seconds",
338 | "drop": false,
339 | "x": 300,
340 | "y": 80,
341 | "wires": [
342 | [
343 | "72ac291.8b545d8",
344 | "cde1d941.2c6918"
345 | ]
346 | ]
347 | },
348 | {
349 | "id": "1bc67f6e.dd4791",
350 | "type": "sentiment",
351 | "z": "d7960f6f.32922",
352 | "name": "",
353 | "x": 820,
354 | "y": 160,
355 | "wires": [
356 | [
357 | "d191cafb.c9143"
358 | ]
359 | ]
360 | },
361 | {
362 | "id": "d25d922b.d2931",
363 | "type": "ui_gauge",
364 | "z": "d7960f6f.32922",
365 | "name": "",
366 | "group": "594f7eff.57134",
367 | "order": 0,
368 | "width": 0,
369 | "height": 0,
370 | "gtype": "gage",
371 | "title": "Sentiment Score",
372 | "label": "",
373 | "format": "{{value}}",
374 | "min": "-10",
375 | "max": 10,
376 | "colors": [
377 | "#ff0000",
378 | "#e6e600",
379 | "#008040"
380 | ],
381 | "seg1": "",
382 | "seg2": "",
383 | "x": 1230,
384 | "y": 160,
385 | "wires": []
386 | },
387 | {
388 | "id": "d191cafb.c9143",
389 | "type": "change",
390 | "z": "d7960f6f.32922",
391 | "name": "Sentiment Score",
392 | "rules": [
393 | {
394 | "t": "set",
395 | "p": "payload",
396 | "pt": "msg",
397 | "to": "sentiment.score",
398 | "tot": "msg"
399 | }
400 | ],
401 | "action": "",
402 | "property": "",
403 | "from": "",
404 | "to": "",
405 | "reg": false,
406 | "x": 1010,
407 | "y": 160,
408 | "wires": [
409 | [
410 | "d25d922b.d2931",
411 | "7a0fe77.644fc98"
412 | ]
413 | ]
414 | },
415 | {
416 | "id": "7a0fe77.644fc98",
417 | "type": "debug",
418 | "z": "d7960f6f.32922",
419 | "name": "",
420 | "active": true,
421 | "console": "false",
422 | "complete": "false",
423 | "x": 1210,
424 | "y": 200,
425 | "wires": []
426 | },
427 | {
428 | "id": "ab7a352a.af168",
429 | "type": "change",
430 | "z": "d7960f6f.32922",
431 | "name": "Twitter Handle",
432 | "rules": [
433 | {
434 | "t": "set",
435 | "p": "payload",
436 | "pt": "msg",
437 | "to": "tweet.user.screen_name",
438 | "tot": "msg"
439 | }
440 | ],
441 | "action": "",
442 | "property": "",
443 | "from": "",
444 | "to": "",
445 | "reg": false,
446 | "x": 600,
447 | "y": 400,
448 | "wires": [
449 | [
450 | "6f96b982.1ed5c8"
451 | ]
452 | ]
453 | },
454 | {
455 | "id": "6f96b982.1ed5c8",
456 | "type": "ui_text",
457 | "z": "d7960f6f.32922",
458 | "group": "ae40ee.11eabf1",
459 | "order": 1,
460 | "width": 0,
461 | "height": 0,
462 | "name": "",
463 | "label": "User: ",
464 | "format": "{{msg.payload}}",
465 | "layout": "row-left",
466 | "x": 810,
467 | "y": 400,
468 | "wires": []
469 | },
470 | {
471 | "id": "6a7c7ce7.95586c",
472 | "type": "ui_ui_control",
473 | "z": "d7960f6f.32922",
474 | "name": "",
475 | "x": 820,
476 | "y": 280,
477 | "wires": [
478 | []
479 | ]
480 | },
481 | {
482 | "id": "e87a0d51.5ab72",
483 | "type": "function",
484 | "z": "d7960f6f.32922",
485 | "name": "Tweet URL",
486 | "func": "msg.payload = \"Open Tweet\";\nif( typeof msg.payload.retweeted_status != 'undefined') {\n msg.payload = \"Open Tweet\";\n}\nreturn msg;",
487 | "outputs": 1,
488 | "noerr": 0,
489 | "x": 590,
490 | "y": 120,
491 | "wires": [
492 | [
493 | "b35854f2.84548",
494 | "62654956.719388"
495 | ]
496 | ]
497 | },
498 | {
499 | "id": "b35854f2.84548",
500 | "type": "ui_template",
501 | "z": "d7960f6f.32922",
502 | "group": "594f7eff.57134",
503 | "name": "Open Tweet",
504 | "order": 0,
505 | "width": 0,
506 | "height": 0,
507 | "format": "",
508 | "storeOutMessages": true,
509 | "fwdInMessages": true,
510 | "templateScope": "local",
511 | "x": 830,
512 | "y": 120,
513 | "wires": [
514 | []
515 | ]
516 | },
517 | {
518 | "id": "62654956.719388",
519 | "type": "debug",
520 | "z": "d7960f6f.32922",
521 | "name": "",
522 | "active": true,
523 | "console": "false",
524 | "complete": "false",
525 | "x": 830,
526 | "y": 80,
527 | "wires": []
528 | },
529 | {
530 | "id": "ae40ee.11eabf1",
531 | "type": "ui_group",
532 | "z": "d7960f6f.32922",
533 | "name": "Tweet",
534 | "tab": "4a137c76.fb1364",
535 | "order": 1,
536 | "disp": true,
537 | "width": "9"
538 | },
539 | {
540 | "id": "b2527f39.a0a148",
541 | "type": "ui_group",
542 | "z": "",
543 | "name": "Results",
544 | "tab": "4a137c76.fb1364",
545 | "order": 2,
546 | "disp": true,
547 | "width": "9"
548 | },
549 | {
550 | "id": "594f7eff.57134",
551 | "type": "ui_group",
552 | "z": "",
553 | "name": "Sentiment",
554 | "tab": "4a137c76.fb1364",
555 | "order": 3,
556 | "disp": false,
557 | "width": "8"
558 | },
559 | {
560 | "id": "4a137c76.fb1364",
561 | "type": "ui_tab",
562 | "z": "d7960f6f.32922",
563 | "name": "Twitter Image Analysis",
564 | "icon": "dashboard",
565 | "order": 3
566 | }
567 | ]
568 |
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/screenshots/NRD-Layout-TwitterExample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/screenshots/NRD-Layout-TwitterExample.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/screenshots/NRD-Layout-TwitterExampleFlow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/screenshots/NRD-Layout-TwitterExampleFlow.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-AddGroup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-AddGroup.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-AddLink.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-AddLink.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-AddTab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-AddTab.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-AddWidget.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-AddWidget.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-DashTab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-DashTab.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-DashTwitter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-DashTwitter.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-DashWidget.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-DashWidget.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-Launch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-Launch.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-MoveWidget.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-MoveWidget.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-PaletteBlank.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-PaletteBlank.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-Resize.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-Resize.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-SiteConfig.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-SiteConfig.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-Theme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-Theme.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-Title.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-Title.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-Trailer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture2-Node-RED-Layout-Config/slides/NRD-Layout-Trailer.png
--------------------------------------------------------------------------------
/Dashboard/Lecture2-Node-RED-Layout-Config/slides/README.md:
--------------------------------------------------------------------------------
1 | # Coursera - Developers Guide to Node-RED Lecture 2
2 | Lecture 2 - Node-RED Dashboard Layout and Configuration Slides
3 | 
4 | 
5 | 
6 | 
7 | 
8 | 
9 | 
10 | 
11 | 
12 | 
13 | 
14 | 
15 | 
16 | 
17 | 
18 | 
19 |
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/README.md:
--------------------------------------------------------------------------------
1 | # Coursera Node-RED Dashboard Charts
2 | ## Developers Guide to Node-RED
3 |
4 | This lecture introduces Node-RED Dashboard Chart features
5 |
6 | ## Review the Lecture 3 Node-RED Dashboard Charts slides
7 | [Slides](slides/README.md)
8 |
9 | ## Download the Lecture 3 Node-RED Dashboard Example flows
10 | * Get the Dashboard Chart Intro flow [here](flows/Dashboard-Chart-Intro.json)
11 | * Get the Dashboard Advanced Chart flow [here](flows/Dashboard-Chart-Advanced.json)
12 | * Get the Dashboard Historical flow [here](flows/Dashboard-Chart-Historical.json)
13 |
14 | ## Screenshots of Lecture 3 Node-RED Dashboard Charts
15 | 
16 | 
17 | 
18 | 
19 | 
20 | 
21 | 
22 | 
23 | 
24 | 
25 | 
26 | 
27 | 
28 | 
29 |
30 |
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/flows/Dashboard-Chart-Advanced.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "id": "2da00948.a80b3e",
4 | "type": "tab",
5 | "label": "Advanced Historical Chart",
6 | "disabled": false,
7 | "info": ""
8 | },
9 | {
10 | "id": "3877a7c.cbc1cd8",
11 | "type": "debug",
12 | "z": "2da00948.a80b3e",
13 | "name": "",
14 | "active": true,
15 | "console": "false",
16 | "complete": "false",
17 | "x": 1250,
18 | "y": 300,
19 | "wires": []
20 | },
21 | {
22 | "id": "3ea4bea1.273f02",
23 | "type": "ui_chart",
24 | "z": "2da00948.a80b3e",
25 | "name": "",
26 | "group": "accfc4c.c4a8438",
27 | "order": 0,
28 | "width": 0,
29 | "height": 0,
30 | "label": "A Chart of Random DataSets",
31 | "chartType": "line",
32 | "legend": "false",
33 | "xformat": "HH:mm:ss",
34 | "interpolate": "linear",
35 | "nodata": "",
36 | "dot": false,
37 | "ymin": "",
38 | "ymax": "",
39 | "removeOlder": 1,
40 | "removeOlderPoints": "5000",
41 | "removeOlderUnit": "3600",
42 | "cutout": 0,
43 | "useOneColor": false,
44 | "colors": [
45 | "#1f77b4",
46 | "#aec7e8",
47 | "#ff7f0e",
48 | "#2ca02c",
49 | "#98df8a",
50 | "#d62728",
51 | "#ff9896",
52 | "#9467bd",
53 | "#c5b0d5"
54 | ],
55 | "useOldStyle": false,
56 | "x": 1300,
57 | "y": 260,
58 | "wires": [
59 | [],
60 | []
61 | ]
62 | },
63 | {
64 | "id": "75923f47.dd13b8",
65 | "type": "function",
66 | "z": "2da00948.a80b3e",
67 | "name": "Create a Chart Array for Chart.js",
68 | "func": "var starttime = flow.get(\"StartTime\");\nvar endtime = flow.get(\"EndTime\");\nvar PlotSeries0 = flow.get(\"PlotSeries0\");\nvar PlotSeries1 = flow.get(\"PlotSeries1\"); // Switch can be True / False\nvar PlotSeries2 = flow.get(\"PlotSeries2\");\nvar Series0Data = flow.get(\"Series0Data\");\nvar Series1Data = flow.get(\"Series1Data\");\nvar Series2Data = flow.get(\"Series2Data\");\n\n// Example Chart Data\n// [{\"series\":[\"A\",\"B\",\"C\"],\"data\":[[{\"x\":1504029632890,\"y\":5},{\"x\":1504029636001,\"y\":4}]],\"labels\":[\"\"]}]\n// The Array has this structure, inserting the first element as a template.\nvar ChartData = [ {\"series\":[\"Series0\",\"Series1\",\"Series2\"],\n \"data\":[\n [{\"x\":starttime,\"y\":0}],\n [{\"x\":starttime,\"y\":0}],\n [{\"x\":starttime,\"y\":0}]\n ],\n \"labels\":[\"Data 0\",\"Data 1\",\"Data 2\"]}];\n \n// Now that the json object is defined, remove the bogus first data {x,y} object.\n// This triggers an odd bug in node-red-dashboard chart however when data[0] array has zero elements.\nChartData[0].data[0].shift(); \nChartData[0].data[1].shift(); \nChartData[0].data[2].shift(); \n \n \nif( PlotSeries0 === true ) {\n for( var i=0; i < Series0Data.length; i++ ) {\n // Filter on the selected timestamp range\n if( (Series0Data[i].time > starttime) && (Series0Data[i].time < endtime)) {\n ChartData[0].data[0].push( { \"x\":Series0Data[i].time,\"y\":Series0Data[i].data } );\n }\n }\n // Now we need to sort on the time so that we give the Chart node an array in time order\n ChartData[0].data[0].sort(function sortNumber(a,b) { return a.x - b.x; });\n}\nif( PlotSeries1 === true ) {\n for( var i=0; i < Series1Data.length; i++ ) {\n // Filter on the selected timestamp range\n if( (Series1Data[i].time > starttime) && (Series1Data[i].time < endtime)) {\n ChartData[0].data[1].push( { \"x\":Series1Data[i].time,\"y\":Series1Data[i].data } );\n }\n }\n // Now we need to sort on the time so that we give the Chart node an array in time order\n ChartData[0].data[1].sort(function sortNumber(a,b) { return a.x - b.x; });\n}\nif( PlotSeries2 === true ) {\n for( var i=0; i < Series2Data.length; i++ ) {\n // Filter on the selected timestamp range\n if( (Series2Data[i].time > starttime) && (Series2Data[i].time < endtime)) {\n ChartData[0].data[2].push( { \"x\":Series2Data[i].time,\"y\":Series2Data[i].data } );\n }\n }\n // Now we need to sort on the time so that we give the Chart node an array in time order\n ChartData[0].data[2].sort(function sortNumber(a,b) { return a.x - b.x; });\n}\nmsg.payload = ChartData;\nreturn msg;",
69 | "outputs": 1,
70 | "noerr": 0,
71 | "x": 1000,
72 | "y": 280,
73 | "wires": [
74 | [
75 | "3ea4bea1.273f02",
76 | "3877a7c.cbc1cd8"
77 | ]
78 | ]
79 | },
80 | {
81 | "id": "e79b4a61.c10278",
82 | "type": "cloudant in",
83 | "z": "2da00948.a80b3e",
84 | "name": "",
85 | "cloudant": "",
86 | "database": "historicaldata0",
87 | "service": "coursera-advanced-nodered-cloudantNoSQLDB",
88 | "search": "_all_",
89 | "design": "",
90 | "index": "",
91 | "x": 520,
92 | "y": 220,
93 | "wires": [
94 | [
95 | "f7e3137d.e321d"
96 | ]
97 | ]
98 | },
99 | {
100 | "id": "777369e5.b10768",
101 | "type": "ui_date_picker",
102 | "z": "2da00948.a80b3e",
103 | "name": "",
104 | "label": "Start Date",
105 | "group": "79893d76.03a0dc",
106 | "order": 5,
107 | "width": 0,
108 | "height": 0,
109 | "passthru": true,
110 | "topic": "",
111 | "x": 500,
112 | "y": 80,
113 | "wires": [
114 | [
115 | "e37273c3.4711f8"
116 | ]
117 | ]
118 | },
119 | {
120 | "id": "4ca42419.06fa54",
121 | "type": "ui_date_picker",
122 | "z": "2da00948.a80b3e",
123 | "name": "",
124 | "label": "End Date",
125 | "group": "79893d76.03a0dc",
126 | "order": 6,
127 | "width": 0,
128 | "height": 0,
129 | "passthru": true,
130 | "topic": "",
131 | "x": 500,
132 | "y": 120,
133 | "wires": [
134 | [
135 | "207f73b.a5b1a8c"
136 | ]
137 | ]
138 | },
139 | {
140 | "id": "784164e.50c171c",
141 | "type": "comment",
142 | "z": "2da00948.a80b3e",
143 | "name": "Select Date Range",
144 | "info": "",
145 | "x": 310,
146 | "y": 40,
147 | "wires": []
148 | },
149 | {
150 | "id": "becc10a8.6080e8",
151 | "type": "ui_text",
152 | "z": "2da00948.a80b3e",
153 | "group": "79893d76.03a0dc",
154 | "order": 4,
155 | "width": "6",
156 | "height": "2",
157 | "name": "Blank text",
158 | "label": "",
159 | "format": "",
160 | "layout": "row-spread",
161 | "x": 500,
162 | "y": 40,
163 | "wires": []
164 | },
165 | {
166 | "id": "90d40017.1ab34",
167 | "type": "debug",
168 | "z": "2da00948.a80b3e",
169 | "name": "",
170 | "active": true,
171 | "console": "false",
172 | "complete": "false",
173 | "x": 910,
174 | "y": 80,
175 | "wires": []
176 | },
177 | {
178 | "id": "1cd5274e.0b5181",
179 | "type": "debug",
180 | "z": "2da00948.a80b3e",
181 | "name": "",
182 | "active": true,
183 | "console": "false",
184 | "complete": "false",
185 | "x": 910,
186 | "y": 120,
187 | "wires": []
188 | },
189 | {
190 | "id": "9586e5b6.7d6408",
191 | "type": "change",
192 | "z": "2da00948.a80b3e",
193 | "name": "Start Date - 11/01/2017",
194 | "rules": [
195 | {
196 | "t": "set",
197 | "p": "payload",
198 | "pt": "msg",
199 | "to": "1509580800000",
200 | "tot": "num"
201 | }
202 | ],
203 | "action": "",
204 | "property": "",
205 | "from": "",
206 | "to": "",
207 | "reg": false,
208 | "x": 290,
209 | "y": 80,
210 | "wires": [
211 | [
212 | "777369e5.b10768"
213 | ]
214 | ]
215 | },
216 | {
217 | "id": "dd681895.de181",
218 | "type": "change",
219 | "z": "2da00948.a80b3e",
220 | "name": "End Date - 11/07/2017",
221 | "rules": [
222 | {
223 | "t": "set",
224 | "p": "payload",
225 | "pt": "msg",
226 | "to": "1510099200000",
227 | "tot": "num"
228 | }
229 | ],
230 | "action": "",
231 | "property": "",
232 | "from": "",
233 | "to": "",
234 | "reg": false,
235 | "x": 290,
236 | "y": 120,
237 | "wires": [
238 | [
239 | "4ca42419.06fa54"
240 | ]
241 | ]
242 | },
243 | {
244 | "id": "e37273c3.4711f8",
245 | "type": "change",
246 | "z": "2da00948.a80b3e",
247 | "name": "Set Start Time Range",
248 | "rules": [
249 | {
250 | "t": "set",
251 | "p": "StartTime",
252 | "pt": "flow",
253 | "to": "payload",
254 | "tot": "msg"
255 | }
256 | ],
257 | "action": "",
258 | "property": "",
259 | "from": "",
260 | "to": "",
261 | "reg": false,
262 | "x": 700,
263 | "y": 80,
264 | "wires": [
265 | [
266 | "90d40017.1ab34"
267 | ]
268 | ]
269 | },
270 | {
271 | "id": "207f73b.a5b1a8c",
272 | "type": "change",
273 | "z": "2da00948.a80b3e",
274 | "name": "Set End Time Range",
275 | "rules": [
276 | {
277 | "t": "set",
278 | "p": "EndTime",
279 | "pt": "flow",
280 | "to": "payload",
281 | "tot": "msg"
282 | }
283 | ],
284 | "action": "",
285 | "property": "",
286 | "from": "",
287 | "to": "",
288 | "reg": false,
289 | "x": 700,
290 | "y": 120,
291 | "wires": [
292 | [
293 | "1cd5274e.0b5181"
294 | ]
295 | ]
296 | },
297 | {
298 | "id": "3e4b0246.d4ea5e",
299 | "type": "inject",
300 | "z": "2da00948.a80b3e",
301 | "name": "",
302 | "topic": "",
303 | "payload": "true",
304 | "payloadType": "bool",
305 | "repeat": "",
306 | "crontab": "",
307 | "once": true,
308 | "x": 90,
309 | "y": 100,
310 | "wires": [
311 | [
312 | "9586e5b6.7d6408",
313 | "dd681895.de181"
314 | ]
315 | ]
316 | },
317 | {
318 | "id": "d37bc5ad.816138",
319 | "type": "cloudant in",
320 | "z": "2da00948.a80b3e",
321 | "name": "",
322 | "cloudant": "",
323 | "database": "historicaldata1",
324 | "service": "coursera-advanced-nodered-cloudantNoSQLDB",
325 | "search": "_all_",
326 | "design": "",
327 | "index": "",
328 | "x": 520,
329 | "y": 280,
330 | "wires": [
331 | [
332 | "c2180ed1.a5dc88"
333 | ]
334 | ]
335 | },
336 | {
337 | "id": "8ccb3b9b.72796",
338 | "type": "cloudant in",
339 | "z": "2da00948.a80b3e",
340 | "name": "",
341 | "cloudant": "",
342 | "database": "historicaldata2",
343 | "service": "coursera-advanced-nodered-cloudantNoSQLDB",
344 | "search": "_all_",
345 | "design": "",
346 | "index": "",
347 | "x": 520,
348 | "y": 340,
349 | "wires": [
350 | [
351 | "5dcd2013.7801b8"
352 | ]
353 | ]
354 | },
355 | {
356 | "id": "5aabcf1b.6735a8",
357 | "type": "ui_switch",
358 | "z": "2da00948.a80b3e",
359 | "name": "",
360 | "label": "Random Data #0",
361 | "group": "79893d76.03a0dc",
362 | "order": 1,
363 | "width": 0,
364 | "height": 0,
365 | "passthru": true,
366 | "decouple": "false",
367 | "topic": "Series0",
368 | "style": "",
369 | "onvalue": "true",
370 | "onvalueType": "bool",
371 | "onicon": "",
372 | "oncolor": "",
373 | "offvalue": "false",
374 | "offvalueType": "bool",
375 | "officon": "",
376 | "offcolor": "",
377 | "x": 110,
378 | "y": 220,
379 | "wires": [
380 | [
381 | "237bce55.43d4a2"
382 | ]
383 | ]
384 | },
385 | {
386 | "id": "5c675908.786168",
387 | "type": "ui_switch",
388 | "z": "2da00948.a80b3e",
389 | "name": "",
390 | "label": "Random Data #1",
391 | "group": "79893d76.03a0dc",
392 | "order": 2,
393 | "width": 0,
394 | "height": 0,
395 | "passthru": true,
396 | "decouple": "false",
397 | "topic": "Series1",
398 | "style": "",
399 | "onvalue": "true",
400 | "onvalueType": "bool",
401 | "onicon": "",
402 | "oncolor": "",
403 | "offvalue": "false",
404 | "offvalueType": "bool",
405 | "officon": "",
406 | "offcolor": "",
407 | "x": 110,
408 | "y": 280,
409 | "wires": [
410 | [
411 | "4a49d756.4dc0f"
412 | ]
413 | ]
414 | },
415 | {
416 | "id": "72ac68c0.62e1e",
417 | "type": "ui_switch",
418 | "z": "2da00948.a80b3e",
419 | "name": "",
420 | "label": "Random Data #2",
421 | "group": "79893d76.03a0dc",
422 | "order": 3,
423 | "width": 0,
424 | "height": 0,
425 | "passthru": true,
426 | "decouple": "false",
427 | "topic": "",
428 | "style": "",
429 | "onvalue": "true",
430 | "onvalueType": "bool",
431 | "onicon": "",
432 | "oncolor": "",
433 | "offvalue": "false",
434 | "offvalueType": "bool",
435 | "officon": "",
436 | "offcolor": "",
437 | "x": 110,
438 | "y": 340,
439 | "wires": [
440 | [
441 | "ff0a1878.557288"
442 | ]
443 | ]
444 | },
445 | {
446 | "id": "237bce55.43d4a2",
447 | "type": "change",
448 | "z": "2da00948.a80b3e",
449 | "name": "",
450 | "rules": [
451 | {
452 | "t": "set",
453 | "p": "PlotSeries0",
454 | "pt": "flow",
455 | "to": "payload",
456 | "tot": "msg"
457 | }
458 | ],
459 | "action": "",
460 | "property": "",
461 | "from": "",
462 | "to": "",
463 | "reg": false,
464 | "x": 310,
465 | "y": 220,
466 | "wires": [
467 | [
468 | "e79b4a61.c10278"
469 | ]
470 | ]
471 | },
472 | {
473 | "id": "4a49d756.4dc0f",
474 | "type": "change",
475 | "z": "2da00948.a80b3e",
476 | "name": "",
477 | "rules": [
478 | {
479 | "t": "set",
480 | "p": "PlotSeries1",
481 | "pt": "flow",
482 | "to": "payload",
483 | "tot": "msg"
484 | }
485 | ],
486 | "action": "",
487 | "property": "",
488 | "from": "",
489 | "to": "",
490 | "reg": false,
491 | "x": 310,
492 | "y": 280,
493 | "wires": [
494 | [
495 | "d37bc5ad.816138"
496 | ]
497 | ]
498 | },
499 | {
500 | "id": "ff0a1878.557288",
501 | "type": "change",
502 | "z": "2da00948.a80b3e",
503 | "name": "",
504 | "rules": [
505 | {
506 | "t": "set",
507 | "p": "PlotSeries2",
508 | "pt": "flow",
509 | "to": "payload",
510 | "tot": "msg"
511 | }
512 | ],
513 | "action": "",
514 | "property": "",
515 | "from": "",
516 | "to": "",
517 | "reg": false,
518 | "x": 310,
519 | "y": 340,
520 | "wires": [
521 | [
522 | "8ccb3b9b.72796"
523 | ]
524 | ]
525 | },
526 | {
527 | "id": "f7e3137d.e321d",
528 | "type": "change",
529 | "z": "2da00948.a80b3e",
530 | "name": "",
531 | "rules": [
532 | {
533 | "t": "set",
534 | "p": "Series0Data",
535 | "pt": "flow",
536 | "to": "payload",
537 | "tot": "msg"
538 | }
539 | ],
540 | "action": "",
541 | "property": "",
542 | "from": "",
543 | "to": "",
544 | "reg": false,
545 | "x": 720,
546 | "y": 220,
547 | "wires": [
548 | [
549 | "75923f47.dd13b8"
550 | ]
551 | ]
552 | },
553 | {
554 | "id": "c2180ed1.a5dc88",
555 | "type": "change",
556 | "z": "2da00948.a80b3e",
557 | "name": "",
558 | "rules": [
559 | {
560 | "t": "set",
561 | "p": "Series1Data",
562 | "pt": "flow",
563 | "to": "payload",
564 | "tot": "msg"
565 | }
566 | ],
567 | "action": "",
568 | "property": "",
569 | "from": "",
570 | "to": "",
571 | "reg": false,
572 | "x": 720,
573 | "y": 280,
574 | "wires": [
575 | [
576 | "75923f47.dd13b8"
577 | ]
578 | ]
579 | },
580 | {
581 | "id": "5dcd2013.7801b8",
582 | "type": "change",
583 | "z": "2da00948.a80b3e",
584 | "name": "",
585 | "rules": [
586 | {
587 | "t": "set",
588 | "p": "Series2Data",
589 | "pt": "flow",
590 | "to": "payload",
591 | "tot": "msg"
592 | }
593 | ],
594 | "action": "",
595 | "property": "",
596 | "from": "",
597 | "to": "",
598 | "reg": false,
599 | "x": 720,
600 | "y": 340,
601 | "wires": [
602 | [
603 | "75923f47.dd13b8"
604 | ]
605 | ]
606 | },
607 | {
608 | "id": "accfc4c.c4a8438",
609 | "type": "ui_group",
610 | "z": "",
611 | "name": "Historical Data",
612 | "tab": "6a569670.96b548",
613 | "order": 1,
614 | "disp": true,
615 | "width": "18"
616 | },
617 | {
618 | "id": "79893d76.03a0dc",
619 | "type": "ui_group",
620 | "z": "",
621 | "name": "Chart Controls",
622 | "tab": "6a569670.96b548",
623 | "order": 2,
624 | "disp": true,
625 | "width": "6"
626 | },
627 | {
628 | "id": "6a569670.96b548",
629 | "type": "ui_tab",
630 | "z": "",
631 | "name": "Advanced Charts",
632 | "icon": "dashboard",
633 | "order": 4
634 | }
635 | ]
636 |
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/flows/Dashboard-Chart-Historical.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "id": "bbee03f2.5d15c",
4 | "type": "tab",
5 | "label": "Historical Chart",
6 | "disabled": false,
7 | "info": ""
8 | },
9 | {
10 | "id": "60a9bb2.7c76744",
11 | "type": "debug",
12 | "z": "bbee03f2.5d15c",
13 | "name": "",
14 | "active": true,
15 | "console": "false",
16 | "complete": "false",
17 | "x": 910,
18 | "y": 100,
19 | "wires": []
20 | },
21 | {
22 | "id": "b425187b.f4f928",
23 | "type": "ui_chart",
24 | "z": "bbee03f2.5d15c",
25 | "name": "",
26 | "group": "dfcb4ecc.ad5b48",
27 | "order": 0,
28 | "width": 0,
29 | "height": 0,
30 | "label": "A Chart of Random Data",
31 | "chartType": "line",
32 | "legend": "false",
33 | "xformat": "HH:mm:ss",
34 | "interpolate": "linear",
35 | "nodata": "",
36 | "dot": false,
37 | "ymin": "",
38 | "ymax": "",
39 | "removeOlder": 1,
40 | "removeOlderPoints": "5000",
41 | "removeOlderUnit": "3600",
42 | "cutout": 0,
43 | "useOneColor": false,
44 | "colors": [
45 | "#1f77b4",
46 | "#aec7e8",
47 | "#ff7f0e",
48 | "#2ca02c",
49 | "#98df8a",
50 | "#d62728",
51 | "#ff9896",
52 | "#9467bd",
53 | "#c5b0d5"
54 | ],
55 | "useOldStyle": false,
56 | "x": 950,
57 | "y": 60,
58 | "wires": [
59 | [],
60 | []
61 | ]
62 | },
63 | {
64 | "id": "7687d18b.9f3958",
65 | "type": "function",
66 | "z": "bbee03f2.5d15c",
67 | "name": "Create a Chart Array for Chart.js",
68 | "func": "// This function reformats the timeseries data into an array that \n// Chart.js (See http://www.chartjs.org/ ) will plot\n// The node-red-dashboard Chart node uses Chart.js \n\n// The Array has this structure, inserting the first element as a template.\nvar ChartData = [ {\"series\":[\"Data\"],\n \"data\":[[{\"x\":msg.payload[0].time,\"y\":msg.payload[0].data}]],\n \"labels\":[\"Data\"]}];\n\n// Start at 1 because we've already added element 0 in the initial array definition\nfor( var i=1; i < msg.payload.length; i++ ) {\n ChartData[0].data[0].push( { \"x\":msg.payload[i].time,\"y\":msg.payload[i].data } );\n}\n// Now we need to sort on the time so that we give the Chart node an array in time order\nChartData[0].data[0].sort(function sortNumber(a,b) { return a.x - b.x; });\n\nmsg.payload = ChartData;\nreturn msg;",
69 | "outputs": 1,
70 | "noerr": 0,
71 | "x": 630,
72 | "y": 60,
73 | "wires": [
74 | [
75 | "b425187b.f4f928",
76 | "60a9bb2.7c76744"
77 | ]
78 | ]
79 | },
80 | {
81 | "id": "3a6c7023.a11ae",
82 | "type": "cloudant in",
83 | "z": "bbee03f2.5d15c",
84 | "name": "",
85 | "cloudant": "",
86 | "database": "historicaldata",
87 | "service": "coursera-advanced-nodered-cloudantNoSQLDB",
88 | "search": "_all_",
89 | "design": "",
90 | "index": "",
91 | "x": 360,
92 | "y": 60,
93 | "wires": [
94 | [
95 | "2ce9238f.6eec24",
96 | "7687d18b.9f3958"
97 | ]
98 | ]
99 | },
100 | {
101 | "id": "2ce9238f.6eec24",
102 | "type": "debug",
103 | "z": "bbee03f2.5d15c",
104 | "name": "",
105 | "active": true,
106 | "console": "false",
107 | "complete": "false",
108 | "x": 570,
109 | "y": 100,
110 | "wires": []
111 | },
112 | {
113 | "id": "3adf71ec.51bea6",
114 | "type": "ui_button",
115 | "z": "bbee03f2.5d15c",
116 | "name": "",
117 | "group": "dca2d7d4.d33f98",
118 | "order": 0,
119 | "width": 0,
120 | "height": 0,
121 | "passthru": false,
122 | "label": "Random Data",
123 | "color": "",
124 | "bgcolor": "",
125 | "icon": "",
126 | "payload": "",
127 | "payloadType": "str",
128 | "topic": "",
129 | "x": 120,
130 | "y": 60,
131 | "wires": [
132 | [
133 | "3a6c7023.a11ae"
134 | ]
135 | ]
136 | },
137 | {
138 | "id": "dfcb4ecc.ad5b48",
139 | "type": "ui_group",
140 | "z": "",
141 | "name": "Historical Data",
142 | "tab": "ce519f65.146028",
143 | "order": 1,
144 | "disp": true,
145 | "width": "18"
146 | },
147 | {
148 | "id": "dca2d7d4.d33f98",
149 | "type": "ui_group",
150 | "z": "",
151 | "name": "Chart Controls",
152 | "tab": "ce519f65.146028",
153 | "order": 2,
154 | "disp": true,
155 | "width": "6"
156 | },
157 | {
158 | "id": "ce519f65.146028",
159 | "type": "ui_tab",
160 | "z": "",
161 | "name": "Historical Data",
162 | "icon": "dashboard",
163 | "order": 3
164 | }
165 | ]
166 |
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/flows/Dashboard-Chart-Intro.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "id": "9781ef05.ee8f38",
4 | "type": "tab",
5 | "label": "Chart Intro",
6 | "disabled": false,
7 | "info": ""
8 | },
9 | {
10 | "id": "de322574.f34f68",
11 | "type": "ui_chart",
12 | "z": "9781ef05.ee8f38",
13 | "name": "",
14 | "group": "4b78ff21.a7a458",
15 | "order": 0,
16 | "width": 0,
17 | "height": 0,
18 | "label": "Single Line Plot",
19 | "chartType": "line",
20 | "legend": "false",
21 | "xformat": "HH:mm:ss",
22 | "interpolate": "linear",
23 | "nodata": "",
24 | "dot": false,
25 | "ymin": "",
26 | "ymax": "",
27 | "removeOlder": 1,
28 | "removeOlderPoints": "",
29 | "removeOlderUnit": "3600",
30 | "cutout": 0,
31 | "useOneColor": false,
32 | "colors": [
33 | "#1f77b4",
34 | "#aec7e8",
35 | "#ff7f0e",
36 | "#2ca02c",
37 | "#98df8a",
38 | "#d62728",
39 | "#ff9896",
40 | "#9467bd",
41 | "#c5b0d5"
42 | ],
43 | "useOldStyle": false,
44 | "x": 600,
45 | "y": 120,
46 | "wires": [
47 | [],
48 | []
49 | ]
50 | },
51 | {
52 | "id": "1dbd2cca.5f75e3",
53 | "type": "function",
54 | "z": "9781ef05.ee8f38",
55 | "name": "Fill Single Chart Array",
56 | "func": "var chart = [{\n \"series\":[\"A\"],\n \"data\":[[{\"x\":1504029632890,\"y\":5},\n {\"x\":1504029633514,\"y\":8},\n {\"x\":1504029634400,\"y\":3}]],\n \"labels\":[\"\"]\n}];\nmsg.payload = chart;\n\nreturn msg;",
57 | "outputs": 1,
58 | "noerr": 0,
59 | "x": 320,
60 | "y": 120,
61 | "wires": [
62 | [
63 | "de322574.f34f68",
64 | "9a60424a.b51a9"
65 | ]
66 | ]
67 | },
68 | {
69 | "id": "9a60424a.b51a9",
70 | "type": "debug",
71 | "z": "9781ef05.ee8f38",
72 | "name": "",
73 | "active": true,
74 | "console": "false",
75 | "complete": "false",
76 | "x": 590,
77 | "y": 160,
78 | "wires": []
79 | },
80 | {
81 | "id": "ea61a1dd.439ff",
82 | "type": "comment",
83 | "z": "9781ef05.ee8f38",
84 | "name": "Sample Dashboard that plots various Chart types",
85 | "info": "",
86 | "x": 250,
87 | "y": 60,
88 | "wires": []
89 | },
90 | {
91 | "id": "52c5b242.79d1ec",
92 | "type": "ui_chart",
93 | "z": "9781ef05.ee8f38",
94 | "name": "",
95 | "group": "4b78ff21.a7a458",
96 | "order": 0,
97 | "width": 0,
98 | "height": 0,
99 | "label": "Multiple Line Plots",
100 | "chartType": "line",
101 | "legend": "false",
102 | "xformat": "HH:mm:ss",
103 | "interpolate": "linear",
104 | "nodata": "",
105 | "dot": false,
106 | "ymin": "",
107 | "ymax": "",
108 | "removeOlder": 1,
109 | "removeOlderPoints": "",
110 | "removeOlderUnit": "3600",
111 | "cutout": 0,
112 | "useOneColor": false,
113 | "colors": [
114 | "#1f77b4",
115 | "#aec7e8",
116 | "#ff7f0e",
117 | "#2ca02c",
118 | "#98df8a",
119 | "#d62728",
120 | "#ff9896",
121 | "#9467bd",
122 | "#c5b0d5"
123 | ],
124 | "useOldStyle": false,
125 | "x": 610,
126 | "y": 220,
127 | "wires": [
128 | [],
129 | []
130 | ]
131 | },
132 | {
133 | "id": "5c600274.25b0ec",
134 | "type": "function",
135 | "z": "9781ef05.ee8f38",
136 | "name": "Fill Multiple Line Chart Array",
137 | "func": "var chart = [ {\"series\":[\"A\",\"B\",\"C\"],\n \"data\":[\n [{\"x\":1504029632890,\"y\":5},\n {\"x\":1504029636001,\"y\":4},\n {\"x\":1504029638656,\"y\":2}],\n [{\"x\":1504029633514,\"y\":6},\n {\"x\":1504029636622,\"y\":7},\n {\"x\":1504029639539,\"y\":6}],\n [{\"x\":1504029634400,\"y\":7},\n {\"x\":1504029637959,\"y\":9},\n {\"x\":1504029640317,\"y\":7}]\n ],\n \"labels\":[\"\"]}];\nmsg.payload = chart;\n\nreturn msg;",
138 | "outputs": 1,
139 | "noerr": 0,
140 | "x": 340,
141 | "y": 220,
142 | "wires": [
143 | [
144 | "52c5b242.79d1ec",
145 | "3f84a4a4.49b724"
146 | ]
147 | ]
148 | },
149 | {
150 | "id": "3f84a4a4.49b724",
151 | "type": "debug",
152 | "z": "9781ef05.ee8f38",
153 | "name": "",
154 | "active": true,
155 | "console": "false",
156 | "complete": "false",
157 | "x": 590,
158 | "y": 260,
159 | "wires": []
160 | },
161 | {
162 | "id": "36292836.481028",
163 | "type": "ui_chart",
164 | "z": "9781ef05.ee8f38",
165 | "name": "",
166 | "group": "c01ba52a.67bb",
167 | "order": 0,
168 | "width": 0,
169 | "height": 0,
170 | "label": "Vertical Bar Chart",
171 | "chartType": "bar",
172 | "legend": "false",
173 | "xformat": "HH:mm:ss",
174 | "interpolate": "linear",
175 | "nodata": "",
176 | "dot": false,
177 | "ymin": "0",
178 | "ymax": "100",
179 | "removeOlder": 1,
180 | "removeOlderPoints": "",
181 | "removeOlderUnit": "3600",
182 | "cutout": 0,
183 | "useOneColor": false,
184 | "colors": [
185 | "#1f77b4",
186 | "#aec7e8",
187 | "#ff7f0e",
188 | "#2ca02c",
189 | "#98df8a",
190 | "#d62728",
191 | "#ff9896",
192 | "#9467bd",
193 | "#c5b0d5"
194 | ],
195 | "useOldStyle": false,
196 | "x": 610,
197 | "y": 540,
198 | "wires": [
199 | [],
200 | []
201 | ]
202 | },
203 | {
204 | "id": "6f43d8f4.8088b8",
205 | "type": "inject",
206 | "z": "9781ef05.ee8f38",
207 | "name": "",
208 | "topic": "",
209 | "payload": "true",
210 | "payloadType": "bool",
211 | "repeat": "",
212 | "crontab": "",
213 | "once": true,
214 | "x": 130,
215 | "y": 120,
216 | "wires": [
217 | [
218 | "1dbd2cca.5f75e3"
219 | ]
220 | ]
221 | },
222 | {
223 | "id": "6d542a0f.ce81ac",
224 | "type": "inject",
225 | "z": "9781ef05.ee8f38",
226 | "name": "",
227 | "topic": "",
228 | "payload": "true",
229 | "payloadType": "bool",
230 | "repeat": "",
231 | "crontab": "",
232 | "once": true,
233 | "x": 130,
234 | "y": 220,
235 | "wires": [
236 | [
237 | "5c600274.25b0ec"
238 | ]
239 | ]
240 | },
241 | {
242 | "id": "9503a2cc.3ad51",
243 | "type": "inject",
244 | "z": "9781ef05.ee8f38",
245 | "name": "",
246 | "topic": "",
247 | "payload": "true",
248 | "payloadType": "bool",
249 | "repeat": "",
250 | "crontab": "",
251 | "once": true,
252 | "x": 130,
253 | "y": 540,
254 | "wires": [
255 | [
256 | "484a00a6.c4efc8"
257 | ]
258 | ]
259 | },
260 | {
261 | "id": "484a00a6.c4efc8",
262 | "type": "function",
263 | "z": "9781ef05.ee8f38",
264 | "name": "Fill Bar Chart Array",
265 | "func": "var bar={};\nbar.labels = [\"Q1 16\",\"Q2 16\",\"Q3 16\",\"Q4 16\",\"Q1 17\",\"Q2 17\",\"Q3 17\"];\nbar.series = ['Sales A', 'Sales B', 'Sales C', 'Sales D'];\n// An array of 4 arrays of 7 elements\nbar.data = [\n [65, 59, 80, 81, 56, 55, 40],\n [28, 48, 40, 19, 86, 27, 90],\n [38, 28, 20, 49, 45, 60, 20],\n [58, 18, 40, 29, 15, 30, 60]\n ];\nreturn {payload:[bar]};",
266 | "outputs": 1,
267 | "noerr": 0,
268 | "x": 310,
269 | "y": 540,
270 | "wires": [
271 | [
272 | "36292836.481028",
273 | "deb3d985.497c68",
274 | "e57aa881.bf64b"
275 | ]
276 | ]
277 | },
278 | {
279 | "id": "deb3d985.497c68",
280 | "type": "debug",
281 | "z": "9781ef05.ee8f38",
282 | "name": "",
283 | "active": true,
284 | "console": "false",
285 | "complete": "false",
286 | "x": 590,
287 | "y": 620,
288 | "wires": []
289 | },
290 | {
291 | "id": "e57aa881.bf64b",
292 | "type": "ui_chart",
293 | "z": "9781ef05.ee8f38",
294 | "name": "",
295 | "group": "c01ba52a.67bb",
296 | "order": 0,
297 | "width": 0,
298 | "height": 0,
299 | "label": "Horizontal Bar Chart",
300 | "chartType": "horizontalBar",
301 | "legend": "false",
302 | "xformat": "HH:mm:ss",
303 | "interpolate": "linear",
304 | "nodata": "",
305 | "dot": false,
306 | "ymin": "0",
307 | "ymax": "100",
308 | "removeOlder": 1,
309 | "removeOlderPoints": "",
310 | "removeOlderUnit": "3600",
311 | "cutout": 0,
312 | "useOneColor": false,
313 | "colors": [
314 | "#1f77b4",
315 | "#aec7e8",
316 | "#ff7f0e",
317 | "#2ca02c",
318 | "#98df8a",
319 | "#d62728",
320 | "#ff9896",
321 | "#9467bd",
322 | "#c5b0d5"
323 | ],
324 | "useOldStyle": false,
325 | "x": 610,
326 | "y": 580,
327 | "wires": [
328 | [],
329 | []
330 | ]
331 | },
332 | {
333 | "id": "3cd5b8af.71708",
334 | "type": "ui_chart",
335 | "z": "9781ef05.ee8f38",
336 | "name": "",
337 | "group": "a99459cd.12661",
338 | "order": 1,
339 | "width": 0,
340 | "height": 0,
341 | "label": "Pie Chart",
342 | "chartType": "pie",
343 | "legend": "true",
344 | "xformat": "HH:mm:ss",
345 | "interpolate": "linear",
346 | "nodata": "",
347 | "dot": false,
348 | "ymin": "",
349 | "ymax": "",
350 | "removeOlder": 1,
351 | "removeOlderPoints": "",
352 | "removeOlderUnit": "3600",
353 | "cutout": 0,
354 | "useOneColor": false,
355 | "colors": [
356 | "#1f77b4",
357 | "#aec7e8",
358 | "#ff7f0e",
359 | "#2ca02c",
360 | "#98df8a",
361 | "#d62728",
362 | "#ff9896",
363 | "#9467bd",
364 | "#c5b0d5"
365 | ],
366 | "useOldStyle": false,
367 | "x": 580,
368 | "y": 320,
369 | "wires": [
370 | [],
371 | []
372 | ]
373 | },
374 | {
375 | "id": "6e18a34.2f216dc",
376 | "type": "function",
377 | "z": "9781ef05.ee8f38",
378 | "name": "Fill Pie Chart Array",
379 | "func": "var pie={};\npie.labels = [\"Geo1\",\"Geo2\",\"Geo3\",\"Geo4\",\"Geo5\"];\npie.series = ['Sales A', 'Sales B', 'Sales C', 'Sales D'];\npie.data = [ [16, 27, 42, 65, 89] ];\n//return {payload:[pie]};\n\nvar pie={ \"labels\" : [\"Geo1\",\"Geo2\",\"Geo3\",\"Geo4\",\"Geo5\"],\n \"series\" : ['Sales A', 'Sales B', 'Sales C', 'Sales D'],\n \"data\" : [ [16, 27, 42, 65, 89] ]\n };\nmsg.payload = [pie];\nreturn msg;",
380 | "outputs": 1,
381 | "noerr": 0,
382 | "x": 310,
383 | "y": 320,
384 | "wires": [
385 | [
386 | "3cd5b8af.71708",
387 | "105175e5.8a2c4a",
388 | "2f1d8f57.4b21d8",
389 | "4320a082.d081c8",
390 | "6400193d.43bab"
391 | ]
392 | ]
393 | },
394 | {
395 | "id": "bbdd7914.8f73b8",
396 | "type": "inject",
397 | "z": "9781ef05.ee8f38",
398 | "name": "",
399 | "topic": "",
400 | "payload": "true",
401 | "payloadType": "bool",
402 | "repeat": "",
403 | "crontab": "",
404 | "once": true,
405 | "x": 130,
406 | "y": 320,
407 | "wires": [
408 | [
409 | "6e18a34.2f216dc"
410 | ]
411 | ]
412 | },
413 | {
414 | "id": "105175e5.8a2c4a",
415 | "type": "debug",
416 | "z": "9781ef05.ee8f38",
417 | "name": "",
418 | "active": true,
419 | "console": "false",
420 | "complete": "false",
421 | "x": 590,
422 | "y": 480,
423 | "wires": []
424 | },
425 | {
426 | "id": "2f1d8f57.4b21d8",
427 | "type": "ui_chart",
428 | "z": "9781ef05.ee8f38",
429 | "name": "",
430 | "group": "a99459cd.12661",
431 | "order": 3,
432 | "width": 0,
433 | "height": 0,
434 | "label": "Polar Area Chart",
435 | "chartType": "polar-area",
436 | "legend": "false",
437 | "xformat": "HH:mm:ss",
438 | "interpolate": "linear",
439 | "nodata": "",
440 | "dot": false,
441 | "ymin": "",
442 | "ymax": "",
443 | "removeOlder": 1,
444 | "removeOlderPoints": "",
445 | "removeOlderUnit": "3600",
446 | "cutout": 0,
447 | "useOneColor": false,
448 | "colors": [
449 | "#1f77b4",
450 | "#aec7e8",
451 | "#ff7f0e",
452 | "#2ca02c",
453 | "#98df8a",
454 | "#d62728",
455 | "#ff9896",
456 | "#9467bd",
457 | "#c5b0d5"
458 | ],
459 | "useOldStyle": false,
460 | "x": 600,
461 | "y": 400,
462 | "wires": [
463 | [],
464 | []
465 | ]
466 | },
467 | {
468 | "id": "6400193d.43bab",
469 | "type": "ui_chart",
470 | "z": "9781ef05.ee8f38",
471 | "name": "",
472 | "group": "a99459cd.12661",
473 | "order": 4,
474 | "width": 0,
475 | "height": 0,
476 | "label": "Radar Chart",
477 | "chartType": "radar",
478 | "legend": "false",
479 | "xformat": "HH:mm:ss",
480 | "interpolate": "linear",
481 | "nodata": "",
482 | "dot": false,
483 | "ymin": "",
484 | "ymax": "",
485 | "removeOlder": 1,
486 | "removeOlderPoints": "",
487 | "removeOlderUnit": "3600",
488 | "cutout": 0,
489 | "useOneColor": false,
490 | "colors": [
491 | "#1f77b4",
492 | "#aec7e8",
493 | "#ff7f0e",
494 | "#2ca02c",
495 | "#98df8a",
496 | "#d62728",
497 | "#ff9896",
498 | "#9467bd",
499 | "#c5b0d5"
500 | ],
501 | "useOldStyle": false,
502 | "x": 590,
503 | "y": 440,
504 | "wires": [
505 | [],
506 | []
507 | ]
508 | },
509 | {
510 | "id": "4320a082.d081c8",
511 | "type": "ui_chart",
512 | "z": "9781ef05.ee8f38",
513 | "name": "",
514 | "group": "a99459cd.12661",
515 | "order": 2,
516 | "width": 0,
517 | "height": 0,
518 | "label": "Donut Chart",
519 | "chartType": "pie",
520 | "legend": "false",
521 | "xformat": "HH:mm:ss",
522 | "interpolate": "linear",
523 | "nodata": "",
524 | "dot": false,
525 | "ymin": "",
526 | "ymax": "",
527 | "removeOlder": 1,
528 | "removeOlderPoints": "",
529 | "removeOlderUnit": "3600",
530 | "cutout": "40",
531 | "useOneColor": false,
532 | "colors": [
533 | "#1f77b4",
534 | "#aec7e8",
535 | "#ff7f0e",
536 | "#2ca02c",
537 | "#98df8a",
538 | "#d62728",
539 | "#ff9896",
540 | "#9467bd",
541 | "#c5b0d5"
542 | ],
543 | "useOldStyle": false,
544 | "x": 590,
545 | "y": 360,
546 | "wires": [
547 | [],
548 | []
549 | ]
550 | },
551 | {
552 | "id": "4b78ff21.a7a458",
553 | "type": "ui_group",
554 | "z": "",
555 | "name": "Line Chart Examples",
556 | "tab": "37891d11.65a522",
557 | "disp": true,
558 | "width": "8"
559 | },
560 | {
561 | "id": "c01ba52a.67bb",
562 | "type": "ui_group",
563 | "z": "",
564 | "name": "Bar Chart Examples",
565 | "tab": "37891d11.65a522",
566 | "order": 3,
567 | "disp": true,
568 | "width": "8"
569 | },
570 | {
571 | "id": "a99459cd.12661",
572 | "type": "ui_group",
573 | "z": "",
574 | "name": "Pie Chart Examples",
575 | "tab": "37891d11.65a522",
576 | "order": 2,
577 | "disp": true,
578 | "width": "6"
579 | },
580 | {
581 | "id": "37891d11.65a522",
582 | "type": "ui_tab",
583 | "z": "",
584 | "name": "Chart Examples",
585 | "icon": "dashboard",
586 | "order": 1
587 | }
588 | ]
589 |
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-AdvancedCharts-Flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-AdvancedCharts-Flow.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-AdvancedCharts.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-AdvancedCharts.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Historical-Dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Historical-Dashboard.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Historical-Flow-LineChartArray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Historical-Flow-LineChartArray.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Historical-Flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Historical-Flow.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Dashboard-Line.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Dashboard-Line.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Dashboard-bar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Dashboard-bar.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Dashboard-pie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Dashboard-pie.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Dashboard.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Flow-BarArray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Flow-BarArray.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Flow-LineChartArray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Flow-LineChartArray.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Flow-LineChartArrayM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Flow-LineChartArrayM.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Flow-PieArray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Flow-PieArray.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/screenshots/NRD-Charts-Intro-Flow.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-1LineExample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-1LineExample.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-AdvHistDash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-AdvHistDash.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-AdvHistDatePick.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-AdvHistDatePick.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-AdvHistFlow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-AdvHistFlow.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-BarExample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-BarExample.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-ChartNode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-ChartNode.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-DatePickNode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-DatePickNode.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-ExampleFlow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-ExampleFlow.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-HistoricalExample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-HistoricalExample.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-MLineExample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-MLineExample.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-PaletteBlank.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-PaletteBlank.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-PieExample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-PieExample.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-Title.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-Title.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-Trailer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Chart-Trailer.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Charts-ExampleDashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture3-Node-RED-Charts/slides/NRD-Charts-ExampleDashboard.png
--------------------------------------------------------------------------------
/Dashboard/Lecture3-Node-RED-Charts/slides/README.md:
--------------------------------------------------------------------------------
1 | # Coursera - Developers Guide to Node-RED Lecture 3
2 | Lecture 3 - Node-RED Dashboard Chart Slides
3 | 
4 | 
5 | 
6 | 
7 | 
8 | 
9 | 
10 | 
11 | 
12 | 
13 | 
14 | 
15 | 
16 | 
17 | 
18 | 
19 |
20 |
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/README.md:
--------------------------------------------------------------------------------
1 | # Coursera - Developers Guide to Node-RED
2 | Lecture 4 - Node-RED Dashboard Forms and Templates - *Resources*
3 |
4 | ## Review the Lecture 4 Node-RED Dashboard Forms and Template slides
5 | [Slides](slides/README.md)
6 |
7 | ## Download the Lecture 4 Example flows
8 | * [Lecture 4 Asset Registration Form Example flow](flows/NRD-FT-AssetRegForm-Example.json)
9 | * [Lecture 4 International Space Station Template Example flow](flows/NRD-FT-ISS-Template-Example.json)
10 |
11 | ## Screenshots of Lecture 4 Node-RED Forms and Templates
12 | 
13 | 
14 | 
15 | 
16 | 
17 | 
18 | 
19 | 
20 | 
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/flows/NRD-FT-AssetRegForm-Example.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "id": "7d2a397e.55e91",
4 | "type": "tab",
5 | "label": "Dashboard Form",
6 | "disabled": false,
7 | "info": ""
8 | },
9 | {
10 | "id": "463ff91d.77c5f8",
11 | "type": "inject",
12 | "z": "7d2a397e.55e91",
13 | "name": "Reset Database load",
14 | "topic": "",
15 | "payload": "true",
16 | "payloadType": "bool",
17 | "repeat": "",
18 | "crontab": "",
19 | "once": true,
20 | "x": 180,
21 | "y": 80,
22 | "wires": [
23 | [
24 | "fb148e72.d2301"
25 | ]
26 | ]
27 | },
28 | {
29 | "id": "fb148e72.d2301",
30 | "type": "change",
31 | "z": "7d2a397e.55e91",
32 | "name": "",
33 | "rules": [
34 | {
35 | "t": "set",
36 | "p": "db-loaded",
37 | "pt": "flow",
38 | "to": "false",
39 | "tot": "bool"
40 | }
41 | ],
42 | "action": "",
43 | "property": "",
44 | "from": "",
45 | "to": "",
46 | "reg": false,
47 | "x": 410,
48 | "y": 100,
49 | "wires": [
50 | [
51 | "194e3484.cc827b"
52 | ]
53 | ]
54 | },
55 | {
56 | "id": "5ac4932c.12e164",
57 | "type": "inject",
58 | "z": "7d2a397e.55e91",
59 | "name": "",
60 | "topic": "",
61 | "payload": "true",
62 | "payloadType": "bool",
63 | "repeat": "",
64 | "crontab": "",
65 | "once": true,
66 | "x": 130,
67 | "y": 160,
68 | "wires": [
69 | [
70 | "194e3484.cc827b"
71 | ]
72 | ]
73 | },
74 | {
75 | "id": "194e3484.cc827b",
76 | "type": "switch",
77 | "z": "7d2a397e.55e91",
78 | "name": "Load Asset Database",
79 | "property": "db-loaded",
80 | "propertyType": "flow",
81 | "rules": [
82 | {
83 | "t": "false"
84 | },
85 | {
86 | "t": "true"
87 | }
88 | ],
89 | "checkall": "true",
90 | "outputs": 2,
91 | "x": 340,
92 | "y": 160,
93 | "wires": [
94 | [
95 | "58808077.7fe168"
96 | ],
97 | []
98 | ],
99 | "outputLabels": [
100 | "IoTP Target DB not loaded",
101 | "IoTP Target DB loaded"
102 | ]
103 | },
104 | {
105 | "id": "58808077.7fe168",
106 | "type": "cloudant in",
107 | "z": "7d2a397e.55e91",
108 | "name": "",
109 | "cloudant": "",
110 | "database": "assets",
111 | "service": "your-nodered-cloudantNoSQLDB",
112 | "search": "_all_",
113 | "design": "",
114 | "index": "",
115 | "x": 570,
116 | "y": 160,
117 | "wires": [
118 | [
119 | "cacf1515.4840c8",
120 | "19fe7368.545c85"
121 | ]
122 | ]
123 | },
124 | {
125 | "id": "72786345.d1af84",
126 | "type": "debug",
127 | "z": "7d2a397e.55e91",
128 | "name": "",
129 | "active": true,
130 | "console": "false",
131 | "complete": "false",
132 | "x": 1070,
133 | "y": 160,
134 | "wires": []
135 | },
136 | {
137 | "id": "e10934e2.116278",
138 | "type": "ui_form",
139 | "z": "7d2a397e.55e91",
140 | "name": "",
141 | "label": "Add a new Asset",
142 | "group": "1564c20b.a3bce6",
143 | "order": 0,
144 | "width": 0,
145 | "height": 0,
146 | "options": [
147 | {
148 | "label": "Asset Name",
149 | "value": "AssetName",
150 | "type": "text",
151 | "required": true
152 | },
153 | {
154 | "label": "Asset Type",
155 | "value": "AssetType",
156 | "type": "text",
157 | "required": true
158 | },
159 | {
160 | "label": "Asset ID",
161 | "value": "AssetID",
162 | "type": "text",
163 | "required": true
164 | },
165 | {
166 | "label": "Location",
167 | "value": "Location",
168 | "type": "text",
169 | "required": true
170 | }
171 | ],
172 | "formValue": {
173 | "AssetName": "",
174 | "AssetType": "",
175 | "AssetID": "",
176 | "Location": ""
177 | },
178 | "payload": "",
179 | "topic": "",
180 | "x": 120,
181 | "y": 260,
182 | "wires": [
183 | [
184 | "4bd0efec.74978",
185 | "aa282796.3d8f98"
186 | ]
187 | ]
188 | },
189 | {
190 | "id": "4bd0efec.74978",
191 | "type": "debug",
192 | "z": "7d2a397e.55e91",
193 | "name": "",
194 | "active": true,
195 | "console": "false",
196 | "complete": "false",
197 | "x": 350,
198 | "y": 300,
199 | "wires": []
200 | },
201 | {
202 | "id": "df774808.3edcd",
203 | "type": "ui_dropdown",
204 | "z": "7d2a397e.55e91",
205 | "name": "",
206 | "label": "Select an Asset to Delete",
207 | "place": "Existing Asset",
208 | "group": "606a860d.2e36a",
209 | "order": 0,
210 | "width": 0,
211 | "height": 0,
212 | "passthru": true,
213 | "options": [
214 | {
215 | "label": "AssetName",
216 | "value": "Asset Name",
217 | "type": "str"
218 | }
219 | ],
220 | "payload": "",
221 | "topic": "",
222 | "x": 500,
223 | "y": 560,
224 | "wires": [
225 | [
226 | "44737136.97dab"
227 | ]
228 | ]
229 | },
230 | {
231 | "id": "9b1993f4.026798",
232 | "type": "function",
233 | "z": "7d2a397e.55e91",
234 | "name": "Load Dropdown list",
235 | "func": "var AssetList = global.get(\"Assets\");\nif (typeof AssetList == 'undefined') {\n return null;\n}\nvar DropDownList = [];\n\n// Just load the list of Asset in the dropdown, not the Asset details\nfor (i=0; i < AssetList.length; i++) {\n DropDownList.push(AssetList[i].AssetName);\n}\nmsg.options = DropDownList;\nreturn msg;",
236 | "outputs": 1,
237 | "noerr": 0,
238 | "x": 250,
239 | "y": 560,
240 | "wires": [
241 | [
242 | "df774808.3edcd",
243 | "bef01044.a097a8"
244 | ]
245 | ]
246 | },
247 | {
248 | "id": "bef01044.a097a8",
249 | "type": "debug",
250 | "z": "7d2a397e.55e91",
251 | "name": "",
252 | "active": true,
253 | "console": "false",
254 | "complete": "options",
255 | "x": 460,
256 | "y": 520,
257 | "wires": []
258 | },
259 | {
260 | "id": "aa282796.3d8f98",
261 | "type": "function",
262 | "z": "7d2a397e.55e91",
263 | "name": "Add to Asset Array",
264 | "func": "var AssetList = global.get(\"Assets\") || [];\n\n// Add the new Asset / Asset Details as an json object to the array of Assets\nAssetList.push(msg.payload);\n\nglobal.set(\"Assets\",AssetList);\nreturn msg;",
265 | "outputs": 1,
266 | "noerr": 0,
267 | "x": 370,
268 | "y": 260,
269 | "wires": [
270 | [
271 | "1d8a9128.0127af",
272 | "c8a1d4ab.2345d8"
273 | ]
274 | ]
275 | },
276 | {
277 | "id": "c8a1d4ab.2345d8",
278 | "type": "cloudant out",
279 | "z": "7d2a397e.55e91",
280 | "name": "",
281 | "cloudant": "",
282 | "database": "assets",
283 | "service": "your-nodered-cloudantNoSQLDB",
284 | "payonly": true,
285 | "operation": "insert",
286 | "x": 570,
287 | "y": 300,
288 | "wires": []
289 | },
290 | {
291 | "id": "697c066e.69b338",
292 | "type": "cloudant out",
293 | "z": "7d2a397e.55e91",
294 | "name": "",
295 | "cloudant": "",
296 | "database": "assets",
297 | "service": "your-nodered-cloudantNoSQLDB",
298 | "payonly": false,
299 | "operation": "delete",
300 | "x": 1050,
301 | "y": 400,
302 | "wires": []
303 | },
304 | {
305 | "id": "357caef2.4ed1aa",
306 | "type": "function",
307 | "z": "7d2a397e.55e91",
308 | "name": "Remove Asset from Array",
309 | "func": "// If the Delete Asset button has been pressed\nif( msg.payload === true ) {\n var AssetList = global.get(\"Assets\");\n if (typeof Assets == 'undefined') {\n return null;\n }\n var SelectedAsset = flow.get(\"SelectedAsset\");\n var Asset2Delete = {};\n // Dropdown will return just the \"AssetName\" in the flow.SelectedOrg variable\n // Iterate through the list, looking for the entry to remove\n for (i=0; i < AssetList.length; i++) {\n if( AssetList[i].AssetName === SelectedAsset ) {\n Asset2Delete = AssetList[i];\n // Remove the Asset json object to the AssetList array\n AssetList.splice(i,1);\n }\n }\n // Update the global array\n global.set(\"Assets\",AssetList);\n \n\n // To delete documents from the database, provide values for \n // _id and _rev and select the remove option in the Cloudant node. \n // You can pass these values in the msg object itself or as an object in the msg.payload.\n // Asset2Delete will contain :\n // {\"_id\":\"6c8e321192522d363c7d439993529cac\",\n // \"_rev\":\"1-1fbb9d32a306748e63e11f023cf3c4db\",\n // \"AssetName\":\"JWJWJW\",\n // \"key\":\"value\"}\n \n msg.payload = Asset2Delete;\n return msg;\n} else { \n return null;\n}",
310 | "outputs": 1,
311 | "noerr": 0,
312 | "x": 820,
313 | "y": 400,
314 | "wires": [
315 | [
316 | "139ba24.47b1f5e",
317 | "1d8a9128.0127af",
318 | "697c066e.69b338"
319 | ]
320 | ]
321 | },
322 | {
323 | "id": "139ba24.47b1f5e",
324 | "type": "debug",
325 | "z": "7d2a397e.55e91",
326 | "name": "",
327 | "active": true,
328 | "console": "false",
329 | "complete": "false",
330 | "x": 1070,
331 | "y": 440,
332 | "wires": []
333 | },
334 | {
335 | "id": "44737136.97dab",
336 | "type": "change",
337 | "z": "7d2a397e.55e91",
338 | "name": "",
339 | "rules": [
340 | {
341 | "t": "set",
342 | "p": "SelectedAsset",
343 | "pt": "flow",
344 | "to": "payload",
345 | "tot": "msg"
346 | }
347 | ],
348 | "action": "",
349 | "property": "",
350 | "from": "",
351 | "to": "",
352 | "reg": false,
353 | "x": 760,
354 | "y": 560,
355 | "wires": [
356 | [
357 | "4f87e63f.bc6048"
358 | ]
359 | ]
360 | },
361 | {
362 | "id": "4f87e63f.bc6048",
363 | "type": "ui_button",
364 | "z": "7d2a397e.55e91",
365 | "name": "",
366 | "group": "606a860d.2e36a",
367 | "order": 0,
368 | "width": "8",
369 | "height": "1",
370 | "passthru": false,
371 | "label": "Delete this Asset",
372 | "color": "",
373 | "bgcolor": "",
374 | "icon": "",
375 | "payload": "true",
376 | "payloadType": "bool",
377 | "topic": "",
378 | "x": 990,
379 | "y": 560,
380 | "wires": [
381 | [
382 | "357caef2.4ed1aa"
383 | ]
384 | ]
385 | },
386 | {
387 | "id": "8c4d880b.abfdc8",
388 | "type": "link in",
389 | "z": "7d2a397e.55e91",
390 | "name": "",
391 | "links": [
392 | "1d8a9128.0127af"
393 | ],
394 | "x": 95,
395 | "y": 560,
396 | "wires": [
397 | [
398 | "9b1993f4.026798"
399 | ]
400 | ]
401 | },
402 | {
403 | "id": "1d8a9128.0127af",
404 | "type": "link out",
405 | "z": "7d2a397e.55e91",
406 | "name": "",
407 | "links": [
408 | "8c4d880b.abfdc8"
409 | ],
410 | "x": 1005,
411 | "y": 260,
412 | "wires": []
413 | },
414 | {
415 | "id": "cacf1515.4840c8",
416 | "type": "debug",
417 | "z": "7d2a397e.55e91",
418 | "name": "",
419 | "active": false,
420 | "console": "false",
421 | "complete": "true",
422 | "x": 810,
423 | "y": 120,
424 | "wires": []
425 | },
426 | {
427 | "id": "ff1c6f61.043948",
428 | "type": "inject",
429 | "z": "7d2a397e.55e91",
430 | "name": "",
431 | "topic": "",
432 | "payload": "",
433 | "payloadType": "date",
434 | "repeat": "10",
435 | "crontab": "",
436 | "once": false,
437 | "x": 150,
438 | "y": 660,
439 | "wires": [
440 | [
441 | "a6363278.a24bc8"
442 | ]
443 | ]
444 | },
445 | {
446 | "id": "a6363278.a24bc8",
447 | "type": "function",
448 | "z": "7d2a397e.55e91",
449 | "name": "Build an Inventory Table",
450 | "func": "var AssetList = global.get(\"Assets\");\nif (typeof AssetList == 'undefined') {\n return null;\n}\n\nmsg.template=\"\";\n\nmsg.template=msg.template+\"Assets | Type | ID | Location |
\";\n\nfor (var i = 0; i < AssetList.length; i++) {\n msg.template = msg.template + \"\" + AssetList[i].AssetName + \" | \" + AssetList[i].AssetType + \" | \" + AssetList[i].AssetID + \" | \" +AssetList[i].Location + \" |
\";\n}\nmsg.template = msg.template + \"
\"\n\nreturn msg;",
451 | "outputs": 1,
452 | "noerr": 0,
453 | "x": 370,
454 | "y": 660,
455 | "wires": [
456 | [
457 | "959ed280.bff25",
458 | "a3f36e89.29e2a8"
459 | ]
460 | ]
461 | },
462 | {
463 | "id": "959ed280.bff25",
464 | "type": "ui_template",
465 | "z": "7d2a397e.55e91",
466 | "group": "48c6a879.78bc38",
467 | "name": "",
468 | "order": 0,
469 | "width": "12",
470 | "height": "7",
471 | "format": "",
472 | "storeOutMessages": false,
473 | "fwdInMessages": false,
474 | "templateScope": "local",
475 | "x": 580,
476 | "y": 640,
477 | "wires": [
478 | []
479 | ]
480 | },
481 | {
482 | "id": "a3f36e89.29e2a8",
483 | "type": "debug",
484 | "z": "7d2a397e.55e91",
485 | "name": "",
486 | "active": false,
487 | "console": "false",
488 | "complete": "template",
489 | "x": 600,
490 | "y": 680,
491 | "wires": []
492 | },
493 | {
494 | "id": "19fe7368.545c85",
495 | "type": "change",
496 | "z": "7d2a397e.55e91",
497 | "name": "Store DB in Global variable",
498 | "rules": [
499 | {
500 | "t": "set",
501 | "p": "Assets",
502 | "pt": "global",
503 | "to": "payload",
504 | "tot": "msg"
505 | },
506 | {
507 | "t": "set",
508 | "p": "db-loaded",
509 | "pt": "flow",
510 | "to": "true",
511 | "tot": "bool"
512 | }
513 | ],
514 | "action": "",
515 | "property": "",
516 | "from": "",
517 | "to": "",
518 | "reg": false,
519 | "x": 810,
520 | "y": 160,
521 | "wires": [
522 | [
523 | "1d8a9128.0127af",
524 | "72786345.d1af84"
525 | ]
526 | ]
527 | },
528 | {
529 | "id": "1564c20b.a3bce6",
530 | "type": "ui_group",
531 | "z": "",
532 | "name": "Add an Asset",
533 | "tab": "d428e4e4.018dd8",
534 | "order": 1,
535 | "disp": true,
536 | "width": "6"
537 | },
538 | {
539 | "id": "606a860d.2e36a",
540 | "type": "ui_group",
541 | "z": "",
542 | "name": "Select an Asset to Delete",
543 | "tab": "d428e4e4.018dd8",
544 | "order": 2,
545 | "disp": true,
546 | "width": "8"
547 | },
548 | {
549 | "id": "48c6a879.78bc38",
550 | "type": "ui_group",
551 | "z": "",
552 | "name": "Inventory List",
553 | "tab": "d428e4e4.018dd8",
554 | "order": 3,
555 | "disp": true,
556 | "width": "12"
557 | },
558 | {
559 | "id": "d428e4e4.018dd8",
560 | "type": "ui_tab",
561 | "z": "",
562 | "name": "Asset Registration",
563 | "icon": "dashboard",
564 | "order": 7
565 | }
566 | ]
567 |
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/flows/NRD-FT-ISS-Template-Example.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "id": "f46adcd0.a3fd6",
4 | "type": "tab",
5 | "label": "Space Station",
6 | "disabled": false,
7 | "info": ""
8 | },
9 | {
10 | "id": "58e10a37.fdb854",
11 | "type": "inject",
12 | "z": "f46adcd0.a3fd6",
13 | "name": "Every 5 sec",
14 | "topic": "",
15 | "payload": "",
16 | "payloadType": "date",
17 | "repeat": "5",
18 | "crontab": "",
19 | "once": false,
20 | "x": 130,
21 | "y": 180,
22 | "wires": [
23 | [
24 | "fbfe51ef.c8f33"
25 | ]
26 | ]
27 | },
28 | {
29 | "id": "ca6c89d0.35dc5",
30 | "type": "http request",
31 | "z": "f46adcd0.a3fd6",
32 | "name": "",
33 | "method": "GET",
34 | "ret": "obj",
35 | "url": "http://api.open-notify.org/iss-now.json",
36 | "tls": "",
37 | "x": 610,
38 | "y": 180,
39 | "wires": [
40 | [
41 | "92d3a151.7e9a8",
42 | "205dfcd6.e46eec"
43 | ]
44 | ]
45 | },
46 | {
47 | "id": "92d3a151.7e9a8",
48 | "type": "debug",
49 | "z": "f46adcd0.a3fd6",
50 | "name": "",
51 | "active": false,
52 | "console": "false",
53 | "complete": "false",
54 | "x": 790,
55 | "y": 240,
56 | "wires": []
57 | },
58 | {
59 | "id": "205dfcd6.e46eec",
60 | "type": "function",
61 | "z": "f46adcd0.a3fd6",
62 | "name": "Extract ISS Location",
63 | "func": "var iss_location = msg.payload.iss_position;\n\nmsg.payload = { \n name : \"International Space Station\",\n lat : parseFloat(iss_location.latitude),\n lon : parseFloat(iss_location.longitude),\n icon:\"iss\",\n iconColor:'#900000',\n command : { \"zoom\" : 5 }\n};\n\nreturn msg;",
64 | "outputs": 1,
65 | "noerr": 0,
66 | "x": 820,
67 | "y": 180,
68 | "wires": [
69 | [
70 | "2585f620.3048ca",
71 | "ec1b2e44.eb46b",
72 | "837b3d01.4eb418"
73 | ]
74 | ]
75 | },
76 | {
77 | "id": "2585f620.3048ca",
78 | "type": "debug",
79 | "z": "f46adcd0.a3fd6",
80 | "name": "",
81 | "active": true,
82 | "console": "false",
83 | "complete": "false",
84 | "x": 1030,
85 | "y": 240,
86 | "wires": []
87 | },
88 | {
89 | "id": "ec1b2e44.eb46b",
90 | "type": "worldmap",
91 | "z": "f46adcd0.a3fd6",
92 | "name": "",
93 | "lat": "",
94 | "lon": "",
95 | "zoom": "5",
96 | "layer": "Esri Satellite",
97 | "cluster": "",
98 | "maxage": "",
99 | "usermenu": "show",
100 | "panit": "true",
101 | "x": 1050,
102 | "y": 180,
103 | "wires": []
104 | },
105 | {
106 | "id": "d67f427e.81297",
107 | "type": "ui_template",
108 | "z": "f46adcd0.a3fd6",
109 | "group": "ec94d4cd.2fd47",
110 | "name": "Embedded Map",
111 | "order": 0,
112 | "width": "20",
113 | "height": "15",
114 | "format": "",
115 | "storeOutMessages": true,
116 | "fwdInMessages": true,
117 | "templateScope": "local",
118 | "x": 780,
119 | "y": 100,
120 | "wires": [
121 | []
122 | ]
123 | },
124 | {
125 | "id": "4efaeffb.81abf8",
126 | "type": "template",
127 | "z": "f46adcd0.a3fd6",
128 | "name": "Add Map to Dashboard",
129 | "field": "payload",
130 | "fieldType": "msg",
131 | "format": "handlebars",
132 | "syntax": "mustache",
133 | "template": "",
134 | "x": 550,
135 | "y": 100,
136 | "wires": [
137 | [
138 | "d67f427e.81297"
139 | ]
140 | ]
141 | },
142 | {
143 | "id": "b94ec401.977e68",
144 | "type": "comment",
145 | "z": "f46adcd0.a3fd6",
146 | "name": "One time - Add Map to Dashboard",
147 | "info": "",
148 | "x": 180,
149 | "y": 60,
150 | "wires": []
151 | },
152 | {
153 | "id": "6a74391e.73ba5",
154 | "type": "inject",
155 | "z": "f46adcd0.a3fd6",
156 | "name": "Init WorldMap",
157 | "topic": "",
158 | "payload": "true",
159 | "payloadType": "bool",
160 | "repeat": "",
161 | "crontab": "",
162 | "once": true,
163 | "x": 130,
164 | "y": 100,
165 | "wires": [
166 | [
167 | "b7822e81.e33958"
168 | ]
169 | ]
170 | },
171 | {
172 | "id": "b7822e81.e33958",
173 | "type": "function",
174 | "z": "f46adcd0.a3fd6",
175 | "name": "Inject /worldmap",
176 | "func": "msg.payload = {};\nmsg.payload.url = \"/worldmap\";\nmsg.payload.command = {};\n\nmsg.payload.command = {\n layer:\"Esri Satellite\",\n lat:40.978679,\n lon:-74.1015797,\n zoom:5,\n map: { name: \"Esri Satellite\" }\n };\nreturn msg;\n",
177 | "outputs": 1,
178 | "noerr": 0,
179 | "x": 320,
180 | "y": 100,
181 | "wires": [
182 | [
183 | "4efaeffb.81abf8"
184 | ]
185 | ]
186 | },
187 | {
188 | "id": "be6ebb31.73a5e",
189 | "type": "comment",
190 | "z": "f46adcd0.a3fd6",
191 | "name": "Query the location of the International Space Station",
192 | "info": "",
193 | "x": 234.44444444444446,
194 | "y": 144.44444444444443,
195 | "wires": []
196 | },
197 | {
198 | "id": "fbfe51ef.c8f33",
199 | "type": "ui_switch",
200 | "z": "f46adcd0.a3fd6",
201 | "name": "",
202 | "label": "switch",
203 | "group": "126ac135.b186df",
204 | "order": 0,
205 | "width": 0,
206 | "height": 0,
207 | "passthru": true,
208 | "decouple": "false",
209 | "topic": "",
210 | "style": "",
211 | "onvalue": "true",
212 | "onvalueType": "bool",
213 | "onicon": "",
214 | "oncolor": "",
215 | "offvalue": "false",
216 | "offvalueType": "bool",
217 | "officon": "",
218 | "offcolor": "",
219 | "x": 290,
220 | "y": 180,
221 | "wires": [
222 | [
223 | "5f1285cc.c4f7ec"
224 | ]
225 | ]
226 | },
227 | {
228 | "id": "5f1285cc.c4f7ec",
229 | "type": "switch",
230 | "z": "f46adcd0.a3fd6",
231 | "name": "Switch On",
232 | "property": "payload",
233 | "propertyType": "msg",
234 | "rules": [
235 | {
236 | "t": "true"
237 | }
238 | ],
239 | "checkall": "true",
240 | "outputs": 1,
241 | "x": 440,
242 | "y": 180,
243 | "wires": [
244 | [
245 | "ca6c89d0.35dc5"
246 | ]
247 | ]
248 | },
249 | {
250 | "id": "837b3d01.4eb418",
251 | "type": "worldmap-tracks",
252 | "z": "f46adcd0.a3fd6",
253 | "depth": "20",
254 | "name": "",
255 | "x": 950,
256 | "y": 120,
257 | "wires": [
258 | [
259 | "ec1b2e44.eb46b"
260 | ]
261 | ]
262 | },
263 | {
264 | "id": "ec94d4cd.2fd47",
265 | "type": "ui_group",
266 | "z": "f46adcd0.a3fd6",
267 | "name": "Space Station",
268 | "tab": "e5c442af.9d2358",
269 | "order": 2,
270 | "disp": true,
271 | "width": "20"
272 | },
273 | {
274 | "id": "126ac135.b186df",
275 | "type": "ui_group",
276 | "z": "",
277 | "name": "Start/Stop",
278 | "tab": "e5c442af.9d2358",
279 | "order": 1,
280 | "disp": true,
281 | "width": "3"
282 | },
283 | {
284 | "id": "e5c442af.9d2358",
285 | "type": "ui_tab",
286 | "z": "f46adcd0.a3fd6",
287 | "name": "International Space Station Location",
288 | "icon": "fa-space-shuttle",
289 | "order": 10
290 | }
291 | ]
292 |
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-AssetReg-Button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-AssetReg-Button.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-AssetReg-Dropdown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-AssetReg-Dropdown.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-AssetReg-Form.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-AssetReg-Form.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-AssetReg-Template.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-AssetReg-Template.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-AssetReg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-AssetReg.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-Flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-Flow.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-Nodedetails.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-Forms-Nodedetails.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-ISS-TemplateWorldMap-Dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-ISS-TemplateWorldMap-Dashboard.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-ISS-TemplateWorldMap-flow-annotated-.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/screenshots/NRD-ISS-TemplateWorldMap-flow-annotated-.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-AssetReg-Button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-AssetReg-Button.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-AssetReg-Dropdown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-AssetReg-Dropdown.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-AssetReg-Form.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-AssetReg-Form.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-AssetReg-Template.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-AssetReg-Template.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-AssetRegDash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-AssetRegDash.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-AssetRegFlow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-AssetRegFlow.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-ButtonNode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-ButtonNode.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-DropdownNode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-DropdownNode.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-FormNode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-FormNode.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-ISS-Dash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-ISS-Dash.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-ISS-Flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-ISS-Flow.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-PaletteBlank.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-PaletteBlank.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-TemplateNode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-TemplateNode.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-title.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-title.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-trailer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnwalicki/Coursera-Developer-Guide-Advanced-Node-RED/24401271003e4c03d99b0911af849067e08ec790/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/NRD-FT-trailer.png
--------------------------------------------------------------------------------
/Dashboard/Lecture4-Node-RED-Forms-Templates/slides/README.md:
--------------------------------------------------------------------------------
1 | # Coursera - Developers Guide to Node-RED Lecture 4
2 | Lecture 4 - Node-RED Dashboard Forms and Templates
3 | 
4 | 
5 | 
6 | 
7 | 
8 | 
9 | 
10 | 
11 | 
12 | 
13 | 
14 | 
15 | 
16 | 
17 | 
18 | 
19 |
20 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Coursera - Developers Guide to Node-RED
2 |
3 | ## Start the [A Developer's Guide to Node-RED](https://www.coursera.org/learn/developer-nodered) Course
4 |
5 | Node-RED is a flow-based programming environment from the JS Foundation. It provides a palette of nodes that allow users to very quickly wire up IoT applications that can combine streams of both physical and digital events. Its Node.JS runtime is easy to install on both devices and the cloud, and provides a framework for extending its capabilities.
6 |
7 | In this [course](https://www.coursera.org/learn/developer-nodered), learners will be introduced to many of Node-RED's core features, learn how to create dashboards for their data, access external systems and create new nodes for the palette. Once they have completed the course, they will be able to leverage the full power of Node-RED to continue their IoT development experience.
8 |
9 | The Node-RED Dashboard chapter is split into four Lectures
10 | * Lecture 1 - [Node-RED Dashboard Introduction](Dashboard/Lecture1-Node-RED-Dashboard-Intro/README.md)
11 | * Lecture 2 - [Node-RED Dashboard Layout](Dashboard/Lecture2-Node-RED-Layout-Config/README.md)
12 | * Lecture 3 - [Node-RED Dashboard Charts](Dashboard/Lecture3-Node-RED-Charts/README.md)
13 | * Lecture 4 - [Node-RED Dashboard Forms and Templates](Dashboard/Lecture4-Node-RED-Forms-Templates/README.md)
14 |
--------------------------------------------------------------------------------