diff --git a/Dashboard_getting_started/Resources/IMPORT_Dashboard.json b/Dashboard_getting_started/Resources/IMPORT_Dashboard.json
new file mode 100644
index 0000000..b0b985f
--- /dev/null
+++ b/Dashboard_getting_started/Resources/IMPORT_Dashboard.json
@@ -0,0 +1,1213 @@
+[
+ {
+ "id": "c8542287.a2c4a",
+ "type": "tab",
+ "allowCycles": false,
+ "label": "Dashboard",
+ "disabled": false,
+ "info": ""
+ },
+ {
+ "id": "6665a508.80824c",
+ "type": "change",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "{\"group\":{\"hide\":[\"Overview_Info\"]}}",
+ "tot": "json"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 720,
+ "y": 60,
+ "wires": [
+ [
+ "95c11b4a.0a4898"
+ ]
+ ]
+ },
+ {
+ "id": "5388bd1d.0a1dc4",
+ "type": "change",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "{\"group\":{\"show\":[\"Overview_Info\"]}}",
+ "tot": "json"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 720,
+ "y": 120,
+ "wires": [
+ [
+ "b4d46175.f8203"
+ ]
+ ]
+ },
+ {
+ "id": "c476965c.34c478",
+ "type": "change",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "Basic",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 700,
+ "y": 680,
+ "wires": [
+ [
+ "66d14505.6118ec",
+ "b69374d2.cbdec8"
+ ]
+ ]
+ },
+ {
+ "id": "4ba58c0b.4cdef4",
+ "type": "change",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "Performance",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 700,
+ "y": 720,
+ "wires": [
+ [
+ "66d14505.6118ec",
+ "b69374d2.cbdec8"
+ ]
+ ]
+ },
+ {
+ "id": "8f9aab20.3aad28",
+ "type": "change",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "Eco",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 700,
+ "y": 760,
+ "wires": [
+ [
+ "66d14505.6118ec",
+ "b69374d2.cbdec8"
+ ]
+ ]
+ },
+ {
+ "id": "268051eb.8e036e",
+ "type": "change",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "Detail",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 1560,
+ "y": 720,
+ "wires": [
+ [
+ "c40b6ea.69b8d9"
+ ]
+ ]
+ },
+ {
+ "id": "178d9332.67362d",
+ "type": "change",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "rules": [
+ {
+ "t": "set",
+ "p": "payload",
+ "pt": "msg",
+ "to": "Critical failure",
+ "tot": "str"
+ }
+ ],
+ "action": "",
+ "property": "",
+ "from": "",
+ "to": "",
+ "reg": false,
+ "x": 700,
+ "y": 920,
+ "wires": [
+ [
+ "38117cec.e3a854"
+ ]
+ ]
+ },
+ {
+ "id": "e8cc1ed5.f3f4c",
+ "type": "comment",
+ "z": "c8542287.a2c4a",
+ "name": "Basic Machine",
+ "info": "",
+ "sticky": 0,
+ "x": 110,
+ "y": 160,
+ "wires": []
+ },
+ {
+ "id": "eaf62352.0dfa1",
+ "type": "comment",
+ "z": "c8542287.a2c4a",
+ "name": "Performance",
+ "info": "",
+ "sticky": 0,
+ "x": 110,
+ "y": 240,
+ "wires": []
+ },
+ {
+ "id": "8d691e1a.dbfc8",
+ "type": "comment",
+ "z": "c8542287.a2c4a",
+ "name": "Eco Machine",
+ "info": "",
+ "sticky": 0,
+ "x": 110,
+ "y": 320,
+ "wires": []
+ },
+ {
+ "id": "7e64a72b.5ce7d8",
+ "type": "create event",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "asset": "4c011fd02a2b4990a80d2c4c6d25ef23",
+ "assetName": "Basic Machine",
+ "severity": "10",
+ "acknowledged": "false",
+ "source": "VFC",
+ "description": "Basic machine has experienced a critical failure",
+ "x": 1750,
+ "y": 780,
+ "wires": []
+ },
+ {
+ "id": "a4949bd1.4f2158",
+ "type": "create event",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "asset": "a12faec62d33439ea297adcde30ef5d2",
+ "assetName": "Performance Machine",
+ "severity": "10",
+ "acknowledged": "false",
+ "source": "VFC",
+ "description": "Performance machine has experienced a critical failure",
+ "x": 1750,
+ "y": 820,
+ "wires": []
+ },
+ {
+ "id": "7630dfe1.ba26f",
+ "type": "create event",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "asset": "1ccfd846e53447de88fdaaeeeddd6d78",
+ "assetName": "Eco Machine",
+ "severity": "10",
+ "acknowledged": "false",
+ "source": "VFC",
+ "description": "Eco machine has experienced a critical failure",
+ "x": 1750,
+ "y": 860,
+ "wires": []
+ },
+ {
+ "id": "f0f898db.86d8c8",
+ "type": "function",
+ "z": "c8542287.a2c4a",
+ "name": "Fair Frankfurt",
+ "func": "var long = msg.payload.longitude;\nvar lat = msg.payload.latitude;\n\nvar maploc = {'longitude':long,'latitude': lat,'zoomLevel': 12};\nmsg.payload = maploc;\nmsg.name = 'Basic';\nreturn msg;\n",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 930,
+ "y": 200,
+ "wires": [
+ [
+ "45f89bb.e819864",
+ "5477362c.2e3358"
+ ]
+ ]
+ },
+ {
+ "id": "df535891.ce74c8",
+ "type": "function",
+ "z": "c8542287.a2c4a",
+ "name": "Fair München",
+ "func": "var long = msg.payload.longitude;\nvar lat = msg.payload.latitude;\n\nvar maploc = {'longitude':long,'latitude': lat,'zoomLevel': 12};\nmsg.payload = maploc;\nmsg.name = 'Performance';\nreturn msg;\n",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 940,
+ "y": 240,
+ "wires": [
+ [
+ "45f89bb.e819864",
+ "5477362c.2e3358"
+ ]
+ ]
+ },
+ {
+ "id": "c6ff14bd.b82788",
+ "type": "function",
+ "z": "c8542287.a2c4a",
+ "name": "Fair Berlin",
+ "func": "var long = msg.payload.longitude;\nvar lat = msg.payload.latitude;\n\nvar maploc = {'longitude':long,'latitude': lat,'zoomLevel': 12};\nmsg.payload = maploc;\nmsg.name = 'Eco';\nreturn msg;\n",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 920,
+ "y": 280,
+ "wires": [
+ [
+ "5477362c.2e3358",
+ "45f89bb.e819864"
+ ]
+ ]
+ },
+ {
+ "id": "20020e56.62dd32",
+ "type": "function",
+ "z": "c8542287.a2c4a",
+ "name": "Extract Machine Status",
+ "func": "var lastDataPoint = msg.payload.slice(-1)[0];\nmsg.payload =lastDataPoint['Machine_Status'];\nreturn msg;\n",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 980,
+ "y": 420,
+ "wires": [
+ [
+ "d5d39b05.d2f5d8"
+ ]
+ ]
+ },
+ {
+ "id": "24046c2.d71fb94",
+ "type": "function",
+ "z": "c8542287.a2c4a",
+ "name": "Extract Software Version",
+ "func": "msg.payload = msg.payload['Software_Version'];\nreturn msg;\n",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 990,
+ "y": 580,
+ "wires": [
+ [
+ "762cf053.e6a2e"
+ ]
+ ]
+ },
+ {
+ "id": "3720fa58.9da1e6",
+ "type": "read timeseries",
+ "z": "c8542287.a2c4a",
+ "name": "Basic Status",
+ "topic": "4c011fd02a2b4990a80d2c4c6d25ef23/Dashboard_Machine_Status/Machine_Status",
+ "topicLabel": "Basic Machine/Dashboard_Machine_Status/Machine_Status",
+ "topicData": "{\"asset\":\"4c011fd02a2b4990a80d2c4c6d25ef23\",\"assetName\":\"Basic Machine\",\"aspects\":[{\"aspectId\":\"7600f42a1d324f73b10d00ec963febfd\",\"aspectName\":\"Dashboard_Machine_Status\",\"variables\":[{\"variableId\":\"qr95e3090d95d9\",\"name\":\"Machine_Status\"}]}]}",
+ "assetName": "",
+ "selectedTopics": "",
+ "period": "120",
+ "offset": "0",
+ "mode": "relative",
+ "from": "",
+ "datetimepickerFrom": "",
+ "to": "",
+ "datetimepickerTo": "",
+ "timezoneoffset": 0,
+ "x": 690,
+ "y": 380,
+ "wires": [
+ [
+ "20020e56.62dd32"
+ ]
+ ]
+ },
+ {
+ "id": "e9b4728a.6787e",
+ "type": "read timeseries",
+ "z": "c8542287.a2c4a",
+ "name": "Performance Status",
+ "topic": "a12faec62d33439ea297adcde30ef5d2/Dashboard_Machine_Status/Machine_Status",
+ "topicLabel": "Performance Machine/Dashboard_Machine_Status/Machine_Status",
+ "topicData": "{\"asset\":\"a12faec62d33439ea297adcde30ef5d2\",\"assetName\":\"Performance Machine\",\"aspects\":[{\"aspectId\":\"7600f42a1d324f73b10d00ec963febfd\",\"aspectName\":\"Dashboard_Machine_Status\",\"variables\":[{\"variableId\":\"qr95e3090d95d9\",\"name\":\"Machine_Status\"}]}]}",
+ "assetName": "",
+ "selectedTopics": "",
+ "period": "120",
+ "offset": "0",
+ "mode": "relative",
+ "from": "",
+ "datetimepickerFrom": "",
+ "to": "",
+ "datetimepickerTo": "",
+ "timezoneoffset": 0,
+ "x": 710,
+ "y": 420,
+ "wires": [
+ [
+ "20020e56.62dd32"
+ ]
+ ]
+ },
+ {
+ "id": "57aa3c84.e7a964",
+ "type": "read timeseries",
+ "z": "c8542287.a2c4a",
+ "name": "Eco Status",
+ "topic": "1ccfd846e53447de88fdaaeeeddd6d78/Dashboard_Machine_Status/Machine_Status",
+ "topicLabel": "Eco Machine/Dashboard_Machine_Status/Machine_Status",
+ "topicData": "{\"asset\":\"1ccfd846e53447de88fdaaeeeddd6d78\",\"assetName\":\"Eco Machine\",\"aspects\":[{\"aspectId\":\"7600f42a1d324f73b10d00ec963febfd\",\"aspectName\":\"Dashboard_Machine_Status\",\"variables\":[{\"variableId\":\"qr95e3090d95d9\",\"name\":\"Machine_Status\"}]}]}",
+ "assetName": "",
+ "selectedTopics": "",
+ "period": "120",
+ "offset": "0",
+ "mode": "relative",
+ "from": "",
+ "datetimepickerFrom": "",
+ "to": "",
+ "datetimepickerTo": "",
+ "timezoneoffset": 0,
+ "x": 680,
+ "y": 460,
+ "wires": [
+ [
+ "20020e56.62dd32"
+ ]
+ ]
+ },
+ {
+ "id": "897f3a03.1133f8",
+ "type": "read-context",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "key": "ActiveAsset",
+ "context": "flow",
+ "x": 1170,
+ "y": 800,
+ "wires": [
+ [
+ "4698eac.6ed4f14"
+ ]
+ ]
+ },
+ {
+ "id": "5287cb5.d919534",
+ "type": "read-context",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "key": "ActiveAsset",
+ "context": "flow",
+ "x": 1150,
+ "y": 920,
+ "wires": [
+ [
+ "5ad7c3dc.3d5a4c"
+ ]
+ ]
+ },
+ {
+ "id": "cff02fba.7c813",
+ "type": "read-static",
+ "z": "c8542287.a2c4a",
+ "name": "read location",
+ "topic": "4c011fd02a2b4990a80d2c4c6d25ef23/Dashboard_Machine_Location/latitude,longitude",
+ "topicLabel": "Basic Machine/Dashboard_Machine_Location/latitude,longitude",
+ "topicData": "{\"asset\":\"4c011fd02a2b4990a80d2c4c6d25ef23\",\"assetName\":\"Basic Machine\",\"aspect\":\"0180f24b9a6843459c1763b47dffa1b2\",\"aspectName\":\"Dashboard_Machine_Location\",\"variables\":[{\"name\":\"latitude\",\"variableId\":\"sk95e30b3a87e2\"},{\"name\":\"longitude\",\"variableId\":\"sj95e30b3a87e1\"}]}",
+ "assetName": "",
+ "aspectName": "",
+ "x": 690,
+ "y": 200,
+ "wires": [
+ [
+ "f0f898db.86d8c8"
+ ]
+ ]
+ },
+ {
+ "id": "488fd0cd.34dd6",
+ "type": "read-static",
+ "z": "c8542287.a2c4a",
+ "name": "read location",
+ "topic": "a12faec62d33439ea297adcde30ef5d2/Dashboard_Machine_Location/latitude,longitude",
+ "topicLabel": "Performance Machine/Dashboard_Machine_Location/latitude,longitude",
+ "topicData": "{\"asset\":\"a12faec62d33439ea297adcde30ef5d2\",\"assetName\":\"Performance Machine\",\"aspect\":\"0180f24b9a6843459c1763b47dffa1b2\",\"aspectName\":\"Dashboard_Machine_Location\",\"variables\":[{\"name\":\"latitude\",\"variableId\":\"sk95e30b3a87e2\"},{\"name\":\"longitude\",\"variableId\":\"sj95e30b3a87e1\"}]}",
+ "assetName": "",
+ "aspectName": "",
+ "x": 690,
+ "y": 240,
+ "wires": [
+ [
+ "df535891.ce74c8"
+ ]
+ ]
+ },
+ {
+ "id": "f0c6c4fe.56be98",
+ "type": "read-static",
+ "z": "c8542287.a2c4a",
+ "name": "read location",
+ "topic": "1ccfd846e53447de88fdaaeeeddd6d78/Dashboard_Machine_Location/latitude,longitude",
+ "topicLabel": "Eco Machine/Dashboard_Machine_Location/latitude,longitude",
+ "topicData": "{\"asset\":\"1ccfd846e53447de88fdaaeeeddd6d78\",\"assetName\":\"Eco Machine\",\"aspect\":\"0180f24b9a6843459c1763b47dffa1b2\",\"aspectName\":\"Dashboard_Machine_Location\",\"variables\":[{\"name\":\"latitude\",\"variableId\":\"sk95e30b3a87e2\"},{\"name\":\"longitude\",\"variableId\":\"sj95e30b3a87e1\"}]}",
+ "assetName": "",
+ "aspectName": "",
+ "x": 690,
+ "y": 280,
+ "wires": [
+ [
+ "c6ff14bd.b82788"
+ ]
+ ]
+ },
+ {
+ "id": "21f2fea4.2d8f42",
+ "type": "read-static",
+ "z": "c8542287.a2c4a",
+ "name": "Basic SWV",
+ "topic": "4c011fd02a2b4990a80d2c4c6d25ef23/Dashboard_Machine_Location/Software_Version",
+ "topicLabel": "Basic Machine/Dashboard_Machine_Location/Software_Version",
+ "topicData": "{\"asset\":\"4c011fd02a2b4990a80d2c4c6d25ef23\",\"assetName\":\"Basic Machine\",\"aspect\":\"0180f24b9a6843459c1763b47dffa1b2\",\"aspectName\":\"Dashboard_Machine_Location\",\"variables\":[{\"name\":\"Software_Version\",\"variableId\":\"qx95e333ad266b\"}]}",
+ "assetName": "",
+ "aspectName": "",
+ "x": 680,
+ "y": 540,
+ "wires": [
+ [
+ "24046c2.d71fb94"
+ ]
+ ]
+ },
+ {
+ "id": "4a9a7834.be3668",
+ "type": "read-static",
+ "z": "c8542287.a2c4a",
+ "name": "Performance SWV",
+ "topic": "a12faec62d33439ea297adcde30ef5d2/Dashboard_Machine_Location/Software_Version",
+ "topicLabel": "Performance Machine/Dashboard_Machine_Location/Software_Version",
+ "topicData": "{\"asset\":\"a12faec62d33439ea297adcde30ef5d2\",\"assetName\":\"Performance Machine\",\"aspect\":\"0180f24b9a6843459c1763b47dffa1b2\",\"aspectName\":\"Dashboard_Machine_Location\",\"variables\":[{\"name\":\"Software_Version\",\"variableId\":\"qx95e333ad266b\"}]}",
+ "assetName": "",
+ "aspectName": "",
+ "x": 710,
+ "y": 580,
+ "wires": [
+ [
+ "24046c2.d71fb94"
+ ]
+ ]
+ },
+ {
+ "id": "921bbed6.38682",
+ "type": "read-static",
+ "z": "c8542287.a2c4a",
+ "name": "Eco SWV",
+ "topic": "1ccfd846e53447de88fdaaeeeddd6d78/Dashboard_Machine_Location/Software_Version",
+ "topicLabel": "Eco Machine/Dashboard_Machine_Location/Software_Version",
+ "topicData": "{\"asset\":\"1ccfd846e53447de88fdaaeeeddd6d78\",\"assetName\":\"Eco Machine\",\"aspect\":\"0180f24b9a6843459c1763b47dffa1b2\",\"aspectName\":\"Dashboard_Machine_Location\",\"variables\":[{\"name\":\"Software_Version\",\"variableId\":\"qx95e333ad266b\"}]}",
+ "assetName": "",
+ "aspectName": "",
+ "x": 680,
+ "y": 620,
+ "wires": [
+ [
+ "24046c2.d71fb94"
+ ]
+ ]
+ },
+ {
+ "id": "b69374d2.cbdec8",
+ "type": "store-context",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "key": "ActiveAsset",
+ "context": "flow",
+ "x": 970,
+ "y": 680,
+ "wires": []
+ },
+ {
+ "id": "4698eac.6ed4f14",
+ "type": "switch",
+ "z": "c8542287.a2c4a",
+ "name": "Routing",
+ "property": "payload",
+ "propertyType": "msg",
+ "rules": [
+ {
+ "t": "eq",
+ "v": "Basic",
+ "vt": "str"
+ },
+ {
+ "t": "eq",
+ "v": "Performance",
+ "vt": "str"
+ },
+ {
+ "t": "eq",
+ "v": "Eco",
+ "vt": "str"
+ }
+ ],
+ "checkall": "true",
+ "outputs": 3,
+ "x": 1380,
+ "y": 800,
+ "wires": [
+ [
+ "268051eb.8e036e"
+ ],
+ [],
+ []
+ ]
+ },
+ {
+ "id": "5ad7c3dc.3d5a4c",
+ "type": "switch",
+ "z": "c8542287.a2c4a",
+ "name": "Routing",
+ "property": "payload",
+ "propertyType": "msg",
+ "rules": [
+ {
+ "t": "eq",
+ "v": "Basic",
+ "vt": "str"
+ },
+ {
+ "t": "eq",
+ "v": "Performance",
+ "vt": "str"
+ },
+ {
+ "t": "eq",
+ "v": "Eco",
+ "vt": "str"
+ }
+ ],
+ "checkall": "true",
+ "outputs": 3,
+ "x": 1380,
+ "y": 920,
+ "wires": [
+ [
+ "7e64a72b.5ce7d8",
+ "e2295bf6.cc6778"
+ ],
+ [
+ "a4949bd1.4f2158",
+ "e2295bf6.cc6778"
+ ],
+ [
+ "7630dfe1.ba26f",
+ "e2295bf6.cc6778"
+ ]
+ ]
+ },
+ {
+ "id": "1a45d534.181a0b",
+ "type": "ui_button",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "group": "dfe2e288.44727",
+ "order": 2,
+ "width": "2",
+ "singleBrowser": false,
+ "height": "2",
+ "passthru": false,
+ "label": "Select",
+ "color": "white",
+ "bgcolor": "",
+ "icon": "",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "",
+ "powerMode": false,
+ "x": 250,
+ "y": 200,
+ "wires": [
+ [
+ "cff02fba.7c813",
+ "3720fa58.9da1e6",
+ "21f2fea4.2d8f42",
+ "5388bd1d.0a1dc4",
+ "c476965c.34c478",
+ "178d9332.67362d"
+ ]
+ ]
+ },
+ {
+ "id": "fb4cff24.5f2d9",
+ "type": "ui_button",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "group": "dfe2e288.44727",
+ "order": 4,
+ "width": "2",
+ "singleBrowser": false,
+ "height": "2",
+ "passthru": false,
+ "label": "Select",
+ "color": "",
+ "bgcolor": "",
+ "icon": "",
+ "payload": "",
+ "payloadType": "date",
+ "topic": "",
+ "powerMode": false,
+ "x": 250,
+ "y": 280,
+ "wires": [
+ [
+ "488fd0cd.34dd6",
+ "e9b4728a.6787e",
+ "4a9a7834.be3668",
+ "5388bd1d.0a1dc4",
+ "4ba58c0b.4cdef4",
+ "178d9332.67362d"
+ ]
+ ]
+ },
+ {
+ "id": "bafabcb8.2cd17",
+ "type": "ui_button",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "group": "dfe2e288.44727",
+ "order": 6,
+ "width": "2",
+ "singleBrowser": false,
+ "height": "2",
+ "passthru": false,
+ "label": "Select",
+ "color": "",
+ "bgcolor": "",
+ "icon": "",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "",
+ "powerMode": false,
+ "x": 250,
+ "y": 360,
+ "wires": [
+ [
+ "f0c6c4fe.56be98",
+ "57aa3c84.e7a964",
+ "921bbed6.38682",
+ "5388bd1d.0a1dc4",
+ "8f9aab20.3aad28",
+ "178d9332.67362d"
+ ]
+ ]
+ },
+ {
+ "id": "66d14505.6118ec",
+ "type": "ui_button",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "group": "c8a6da12.7dbfd8",
+ "order": 5,
+ "width": 0,
+ "singleBrowser": false,
+ "height": 0,
+ "passthru": false,
+ "label": "Go to Asset",
+ "color": "",
+ "bgcolor": "",
+ "icon": "",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "",
+ "powerMode": false,
+ "x": 950,
+ "y": 800,
+ "wires": [
+ [
+ "897f3a03.1133f8"
+ ]
+ ]
+ },
+ {
+ "id": "38117cec.e3a854",
+ "type": "ui_button",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "group": "c8a6da12.7dbfd8",
+ "order": 4,
+ "width": 0,
+ "singleBrowser": false,
+ "height": 0,
+ "passthru": false,
+ "label": "Report emergency",
+ "color": "",
+ "bgcolor": "",
+ "icon": "",
+ "payload": "",
+ "payloadType": "str",
+ "topic": "",
+ "powerMode": false,
+ "x": 910,
+ "y": 920,
+ "wires": [
+ [
+ "5287cb5.d919534"
+ ]
+ ]
+ },
+ {
+ "id": "7bb121f9.837d6",
+ "type": "ui_button",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "group": "a92fa412.22fae8",
+ "order": 2,
+ "width": "26",
+ "singleBrowser": false,
+ "height": "1",
+ "passthru": false,
+ "label": "Back to the Overview",
+ "color": "",
+ "bgcolor": "",
+ "icon": "",
+ "payload": "{\"tab\":\"Overview\"}",
+ "payloadType": "json",
+ "topic": "",
+ "powerMode": false,
+ "x": 140,
+ "y": 580,
+ "wires": [
+ [
+ "dd71cdce.1b1ec"
+ ]
+ ]
+ },
+ {
+ "id": "d5d39b05.d2f5d8",
+ "type": "ui_led",
+ "z": "c8542287.a2c4a",
+ "group": "c8a6da12.7dbfd8",
+ "order": 2,
+ "width": "4",
+ "height": "3",
+ "label": "",
+ "labelPlacement": "left",
+ "labelAlignment": "left",
+ "colorForValue": [
+ {
+ "color": "green",
+ "value": "1",
+ "valueType": "num"
+ },
+ {
+ "color": "yellow",
+ "value": "2",
+ "valueType": "num"
+ },
+ {
+ "color": "orange",
+ "value": "3",
+ "valueType": "num"
+ },
+ {
+ "color": "red",
+ "value": "4",
+ "valueType": "num"
+ },
+ {
+ "color": "blue",
+ "value": "5",
+ "valueType": "num"
+ }
+ ],
+ "allowColorForValueInMessage": false,
+ "name": "",
+ "x": 1310,
+ "y": 420,
+ "wires": []
+ },
+ {
+ "id": "d51f25cc.4a4468",
+ "type": "ui_mdsp_event_table",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "group": "a92fa412.22fae8",
+ "order": 1,
+ "width": "26",
+ "height": "12",
+ "label": "event table",
+ "asset": "4c011fd02a2b4990a80d2c4c6d25ef23",
+ "assetName": "Basic Machine",
+ "from": "",
+ "datetimepickerFrom": "",
+ "to": "",
+ "datetimepickerTo": "",
+ "singleBrowser": false,
+ "showSeverity": true,
+ "showEntityId": true,
+ "showTimestamp": true,
+ "showDescription": true,
+ "showSource": false,
+ "showAcknowledged": true,
+ "showCorrelationId": true,
+ "showTypeId": false,
+ "showCode": false,
+ "x": 110,
+ "y": 540,
+ "wires": []
+ },
+ {
+ "id": "5477362c.2e3358",
+ "type": "ui_mdsp_map",
+ "z": "c8542287.a2c4a",
+ "name": "",
+ "group": "87438727.5c4ec8",
+ "order": 2,
+ "width": "12",
+ "height": "6",
+ "longitude": "11.002",
+ "latitude": "49.594",
+ "zoomLevel": "5",
+ "draggable": false,
+ "label": "Asset Location",
+ "singleBrowser": false,
+ "x": 1260,
+ "y": 280,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "309f9bbc.f42d44",
+ "type": "ui_text",
+ "z": "c8542287.a2c4a",
+ "group": "dfe2e288.44727",
+ "order": 1,
+ "width": "6",
+ "singleBrowser": false,
+ "height": "2",
+ "name": "",
+ "label": "Asset: ",
+ "format": "Basic",
+ "layout": "row-left",
+ "x": 250,
+ "y": 160,
+ "wires": []
+ },
+ {
+ "id": "4e0a6456.77ed0c",
+ "type": "ui_text",
+ "z": "c8542287.a2c4a",
+ "group": "dfe2e288.44727",
+ "order": 3,
+ "width": "6",
+ "singleBrowser": false,
+ "height": "2",
+ "name": "",
+ "label": "Asset: ",
+ "format": "Performance",
+ "layout": "row-left",
+ "x": 250,
+ "y": 240,
+ "wires": []
+ },
+ {
+ "id": "9723bdd3.d5d7",
+ "type": "ui_text",
+ "z": "c8542287.a2c4a",
+ "group": "dfe2e288.44727",
+ "order": 5,
+ "width": "6",
+ "singleBrowser": false,
+ "height": "2",
+ "name": "",
+ "label": "Asset: ",
+ "format": "Eco",
+ "layout": "row-left",
+ "x": 250,
+ "y": 320,
+ "wires": []
+ },
+ {
+ "id": "45f89bb.e819864",
+ "type": "ui_text",
+ "z": "c8542287.a2c4a",
+ "group": "87438727.5c4ec8",
+ "order": 1,
+ "width": "12",
+ "singleBrowser": false,
+ "height": "1",
+ "name": "",
+ "label": "Location of: ",
+ "format": "{{msg.name}}",
+ "layout": "row-left",
+ "x": 1250,
+ "y": 200,
+ "wires": []
+ },
+ {
+ "id": "e6503cf6.9664b",
+ "type": "ui_text",
+ "z": "c8542287.a2c4a",
+ "group": "c8a6da12.7dbfd8",
+ "order": 1,
+ "width": "8",
+ "singleBrowser": false,
+ "height": "3",
+ "name": "",
+ "label": "Machine Status",
+ "format": "",
+ "layout": "row-spread",
+ "x": 1260,
+ "y": 380,
+ "wires": []
+ },
+ {
+ "id": "762cf053.e6a2e",
+ "type": "ui_text",
+ "z": "c8542287.a2c4a",
+ "group": "c8a6da12.7dbfd8",
+ "order": 3,
+ "width": "12",
+ "singleBrowser": false,
+ "height": "2",
+ "name": "",
+ "label": "Software Version: ",
+ "format": "{{msg.payload}} ",
+ "layout": "row-spread",
+ "x": 1270,
+ "y": 580,
+ "wires": []
+ },
+ {
+ "id": "e2295bf6.cc6778",
+ "type": "ui_toast",
+ "z": "c8542287.a2c4a",
+ "position": "top right",
+ "displayTime": "3",
+ "highlight": "green",
+ "outputs": 0,
+ "ok": "OK",
+ "cancel": "",
+ "topic": "Event reported successfull for machine:",
+ "name": "",
+ "singleBrowser": false,
+ "x": 1750,
+ "y": 920,
+ "wires": []
+ },
+ {
+ "id": "95c11b4a.0a4898",
+ "type": "ui_ui_control",
+ "z": "c8542287.a2c4a",
+ "name": "Hide Machine Info",
+ "powerMode": false,
+ "x": 930,
+ "y": 60,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "3e877818.cec8a8",
+ "type": "ui_ui_control",
+ "z": "c8542287.a2c4a",
+ "name": "Triggers on load",
+ "powerMode": false,
+ "x": 500,
+ "y": 60,
+ "wires": [
+ [
+ "6665a508.80824c"
+ ]
+ ]
+ },
+ {
+ "id": "b4d46175.f8203",
+ "type": "ui_ui_control",
+ "z": "c8542287.a2c4a",
+ "name": "Show Machine Info",
+ "powerMode": false,
+ "x": 930,
+ "y": 120,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "c40b6ea.69b8d9",
+ "type": "ui_ui_control",
+ "z": "c8542287.a2c4a",
+ "name": "Change to Detail page",
+ "powerMode": false,
+ "x": 1780,
+ "y": 720,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "dd71cdce.1b1ec",
+ "type": "ui_ui_control",
+ "z": "c8542287.a2c4a",
+ "name": "Back",
+ "powerMode": false,
+ "x": 330,
+ "y": 620,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "dfe2e288.44727",
+ "type": "ui_group",
+ "z": "",
+ "name": "Selector",
+ "tab": "4cc1ad0e.1a1bc4",
+ "order": 1,
+ "disp": true,
+ "width": "9",
+ "collapse": false,
+ "_type": "config"
+ },
+ {
+ "id": "c8a6da12.7dbfd8",
+ "type": "ui_group",
+ "z": "",
+ "name": "Info",
+ "tab": "4cc1ad0e.1a1bc4",
+ "order": 4,
+ "disp": true,
+ "width": "12",
+ "collapse": false,
+ "_type": "config"
+ },
+ {
+ "id": "a92fa412.22fae8",
+ "type": "ui_group",
+ "z": "",
+ "name": "Events",
+ "tab": "c659eb4e.e80c18",
+ "order": 1,
+ "disp": true,
+ "width": "26",
+ "collapse": false,
+ "_type": "config"
+ },
+ {
+ "id": "87438727.5c4ec8",
+ "type": "ui_group",
+ "z": "",
+ "name": "Asset Map",
+ "tab": "4cc1ad0e.1a1bc4",
+ "order": 2,
+ "disp": true,
+ "width": "12",
+ "collapse": false,
+ "_type": "config"
+ },
+ {
+ "id": "4cc1ad0e.1a1bc4",
+ "type": "ui_tab",
+ "z": "",
+ "name": "Overview",
+ "icon": "'Subject'",
+ "order": 1,
+ "publicAccess": "false",
+ "fmAccess": "none",
+ "fmAccessType": "private",
+ "assetType": "",
+ "asset": "",
+ "assetName": "",
+ "assetText": "",
+ "image": "",
+ "description": "",
+ "hideTitleBar": false,
+ "_type": "config"
+ },
+ {
+ "id": "c659eb4e.e80c18",
+ "type": "ui_tab",
+ "z": "",
+ "name": "Detail",
+ "icon": "dashboard",
+ "order": 2,
+ "publicAccess": "false",
+ "fmAccess": "none",
+ "fmAccessType": "private",
+ "assetType": "",
+ "asset": "",
+ "assetName": "",
+ "assetText": "",
+ "image": "",
+ "description": "",
+ "hideTitleBar": false,
+ "_type": "config"
+ }
+]
diff --git a/Dashboard_getting_started/Resources/IMPORT_DataGenerator.json b/Dashboard_getting_started/Resources/IMPORT_DataGenerator.json
new file mode 100644
index 0000000..ead151d
--- /dev/null
+++ b/Dashboard_getting_started/Resources/IMPORT_DataGenerator.json
@@ -0,0 +1,271 @@
+[
+ {
+ "id": "92f8b622.df2838",
+ "type": "comment",
+ "z": "42c6ce94.a9202",
+ "name": "Get Random Functions",
+ "info": "function getRandomDouble(min, max) {\n return (Math.random() * (max - min) + min).toString();\n}\nfunction getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\n",
+ "sticky": 1,
+ "x": 300,
+ "y": 680,
+ "wires": []
+ },
+ {
+ "id": "56f3fb32.1321b4",
+ "type": "comment",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine",
+ "info": "",
+ "sticky": 0,
+ "x": 410,
+ "y": 80,
+ "wires": []
+ },
+ {
+ "id": "cd612bbe.c1cd68",
+ "type": "comment",
+ "z": "42c6ce94.a9202",
+ "name": "Performance Machine",
+ "info": "",
+ "sticky": 0,
+ "x": 440,
+ "y": 240,
+ "wires": []
+ },
+ {
+ "id": "5216b1db.909bc",
+ "type": "comment",
+ "z": "42c6ce94.a9202",
+ "name": "Eco Machine",
+ "info": "",
+ "sticky": 0,
+ "x": 410,
+ "y": 400,
+ "wires": []
+ },
+ {
+ "id": "cc846ce2.eef4a",
+ "type": "function",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine Status",
+ "func": "function getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\n\nlet programList = [\"EDS TTU 553 V8\",\"PA12 - KKT Vorheizen\",\"TC 3D AKF PA11\",\"detax v30\",\"Tool changing position\",\"EDS PT 3404 Balanced\",\"Postprocessing\", \"PT Black TL l-R\", \"PT White FT\", \"Preprocessing\", \"Cleaning\", \"PT M FT L-R\"];\n\nlet progr = programList[Math.floor(Math.random() * programList.length)];\nvar stat = getRandomInt(1,5);\nvar id = getRandomInt(1000,9999999);\n\nvar obj = {};\nobj._time = new Date();\nobj.Machine_Status = stat;\nobj.Program_Id = id;\nobj.Program_Name = progr;\n\nmsg.payload = obj;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 440,
+ "y": 120,
+ "wires": [
+ [
+ "7f529f86.7fc4e"
+ ]
+ ]
+ },
+ {
+ "id": "c5716581.b7e138",
+ "type": "function",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine Sensors",
+ "func": "function getRandomDouble(min, max) {\n return (Math.random() * (max - min) + min).toString();\n}\nfunction getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\nvar temp_pre = getRandomInt(80,100) + getRandomDouble(10,30);\nvar temp_work = getRandomInt(120,140) + getRandomDouble(10,60);\nvar press_pre = getRandomInt(10,20) + getRandomDouble(2,7);\nvar press_work = getRandomInt(2,5) + getRandomDouble(2,7);\n\nvar obj = {};\nobj._time = new Date();\nobj.Pressure_Preheater = press_pre;\nobj.Pressure_WorkingChamber = press_work;\nobj.Temp_Preheater = temp_pre;\nobj.Temp_WorkingChamber = temp_work;\n\nmsg.payload = obj;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 440,
+ "y": 180,
+ "wires": [
+ [
+ "79dc13ad.bb2cac"
+ ]
+ ]
+ },
+ {
+ "id": "6f440ba8.2034e4",
+ "type": "function",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine Status",
+ "func": "function getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\n\nlet programList = [\"EDS TTU 553 V8\",\"PA12 - KKT Vorheizen\",\"TC 3D AKF PA11\",\"detax v30\",\"Tool changing position\",\"EDS PT 3404 Balanced\",\"Postprocessing\", \"PT Black TL l-R\", \"PT White FT\", \"Preprocessing\", \"Cleaning\", \"PT M FT L-R\"];\n\nlet progr = programList[Math.floor(Math.random() * programList.length)];\nvar stat = getRandomInt(1,5);\nvar id = getRandomInt(1000,9999999);\n\nvar obj = {};\nobj._time = new Date();\nobj.Machine_Status = stat;\nobj.Program_Id = id;\nobj.Program_Name = progr;\n\nmsg.payload = obj;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 440,
+ "y": 280,
+ "wires": [
+ [
+ "27a7aa93.b2ae06"
+ ]
+ ]
+ },
+ {
+ "id": "6eebeb9e.d6f334",
+ "type": "function",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine Sensors",
+ "func": "function getRandomDouble(min, max) {\n return (Math.random() * (max - min) + min).toString();\n}\nfunction getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\nvar temp_pre = getRandomInt(80,100) + getRandomDouble(10,30);\nvar temp_work = getRandomInt(120,140) + getRandomDouble(10,60);\nvar press_pre = getRandomInt(10,20) + getRandomDouble(2,7);\nvar press_work = getRandomInt(2,5) + getRandomDouble(2,7);\n\nvar obj = {};\nobj._time = new Date();\nobj.Pressure_Preheater = press_pre;\nobj.Pressure_WorkingChamber = press_work;\nobj.Temp_Preheater = temp_pre;\nobj.Temp_WorkingChamber = temp_work;\n\nmsg.payload = obj;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 440,
+ "y": 340,
+ "wires": [
+ [
+ "9499b1d7.0e5eb"
+ ]
+ ]
+ },
+ {
+ "id": "846f330b.fd38c",
+ "type": "function",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine Status",
+ "func": "function getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\n\nlet programList = [\"EDS TTU 553 V8\",\"PA12 - KKT Vorheizen\",\"TC 3D AKF PA11\",\"detax v30\",\"Tool changing position\",\"EDS PT 3404 Balanced\",\"Postprocessing\", \"PT Black TL l-R\", \"PT White FT\", \"Preprocessing\", \"Cleaning\", \"PT M FT L-R\"];\n\nlet progr = programList[Math.floor(Math.random() * programList.length)];\nvar stat = getRandomInt(1,5);\nvar id = getRandomInt(1000,9999999);\n\nvar obj = {};\nobj._time = new Date();\nobj.Machine_Status = stat;\nobj.Program_Id = id;\nobj.Program_Name = progr;\n\nmsg.payload = obj;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 440,
+ "y": 440,
+ "wires": [
+ [
+ "e684622d.42458"
+ ]
+ ]
+ },
+ {
+ "id": "c6db8a58.f773c8",
+ "type": "function",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine Sensors",
+ "func": "function getRandomDouble(min, max) {\n return (Math.random() * (max - min) + min).toString();\n}\nfunction getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\nvar temp_pre = getRandomInt(80,100) + getRandomDouble(10,30);\nvar temp_work = getRandomInt(120,140) + getRandomDouble(10,60);\nvar press_pre = getRandomInt(10,20) + getRandomDouble(2,7);\nvar press_work = getRandomInt(2,5) + getRandomDouble(2,7);\n\nvar obj = {};\nobj._time = new Date();\nobj.Pressure_Preheater = press_pre;\nobj.Pressure_WorkingChamber = press_work;\nobj.Temp_Preheater = temp_pre;\nobj.Temp_WorkingChamber = temp_work;\n\nmsg.payload = obj;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 440,
+ "y": 500,
+ "wires": [
+ [
+ "25e44221.d6425e"
+ ]
+ ]
+ },
+ {
+ "id": "31e8510f.54df0e",
+ "type": "inject",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "",
+ "payload": "",
+ "payloadType": "date",
+ "repeat": "300",
+ "repeatEnd": "0",
+ "endTime": "0",
+ "crontab": "",
+ "offset": "",
+ "once": false,
+ "properties": "",
+ "timezone": "utc",
+ "betweentimesunit": "m",
+ "enableRuleEngine": false,
+ "showNextExecution": true,
+ "powerMode": false,
+ "x": 130,
+ "y": 260,
+ "wires": [
+ [
+ "cc846ce2.eef4a",
+ "c5716581.b7e138",
+ "6f440ba8.2034e4",
+ "6eebeb9e.d6f334",
+ "846f330b.fd38c",
+ "c6db8a58.f773c8"
+ ]
+ ]
+ },
+ {
+ "id": "7f529f86.7fc4e",
+ "type": "write timeseries",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "4c011fd02a2b4990a80d2c4c6d25ef23/Dashboard_Machine_Status",
+ "topicData": "{\"asset\":\"4c011fd02a2b4990a80d2c4c6d25ef23\",\"assetName\":\"Basic Machine\",\"aspect\":\"7600f42a1d324f73b10d00ec963febfd\",\"aspectName\":\"Dashboard_Machine_Status\",\"variable\":null,\"variableName\":null}",
+ "topicLabel": "Basic Machine/Dashboard_Machine_Status",
+ "assetName": "",
+ "aspectName": "",
+ "useMerging": false,
+ "x": 950,
+ "y": 120,
+ "wires": []
+ },
+ {
+ "id": "79dc13ad.bb2cac",
+ "type": "write timeseries",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "4c011fd02a2b4990a80d2c4c6d25ef23/Dashboard_Machine_Sensor",
+ "topicData": "{\"asset\":\"4c011fd02a2b4990a80d2c4c6d25ef23\",\"assetName\":\"Basic Machine\",\"aspect\":\"59e5446feebb454eaf3ef7ce24565dfb\",\"aspectName\":\"Dashboard_Machine_Sensor\",\"variable\":null,\"variableName\":null}",
+ "topicLabel": "Basic Machine/Dashboard_Machine_Sensor",
+ "assetName": "",
+ "aspectName": "",
+ "useMerging": false,
+ "x": 950,
+ "y": 180,
+ "wires": []
+ },
+ {
+ "id": "27a7aa93.b2ae06",
+ "type": "write timeseries",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "a12faec62d33439ea297adcde30ef5d2/Dashboard_Machine_Status",
+ "topicData": "{\"asset\":\"a12faec62d33439ea297adcde30ef5d2\",\"assetName\":\"Performance Machine\",\"aspect\":\"7600f42a1d324f73b10d00ec963febfd\",\"aspectName\":\"Dashboard_Machine_Status\",\"variable\":null,\"variableName\":null}",
+ "topicLabel": "Performance Machine/Dashboard_Machine_Status",
+ "assetName": "",
+ "aspectName": "",
+ "useMerging": false,
+ "x": 970,
+ "y": 280,
+ "wires": []
+ },
+ {
+ "id": "9499b1d7.0e5eb",
+ "type": "write timeseries",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "a12faec62d33439ea297adcde30ef5d2/Dashboard_Machine_Sensor",
+ "topicData": "{\"asset\":\"a12faec62d33439ea297adcde30ef5d2\",\"assetName\":\"Performance Machine\",\"aspect\":\"59e5446feebb454eaf3ef7ce24565dfb\",\"aspectName\":\"Dashboard_Machine_Sensor\",\"variable\":null,\"variableName\":null}",
+ "topicLabel": "Performance Machine/Dashboard_Machine_Sensor",
+ "assetName": "",
+ "aspectName": "",
+ "useMerging": false,
+ "x": 980,
+ "y": 340,
+ "wires": []
+ },
+ {
+ "id": "e684622d.42458",
+ "type": "write timeseries",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "1ccfd846e53447de88fdaaeeeddd6d78/Dashboard_Machine_Status",
+ "topicData": "{\"asset\":\"1ccfd846e53447de88fdaaeeeddd6d78\",\"assetName\":\"Eco Machine\",\"aspect\":\"7600f42a1d324f73b10d00ec963febfd\",\"aspectName\":\"Dashboard_Machine_Status\",\"variable\":null,\"variableName\":null}",
+ "topicLabel": "Eco Machine/Dashboard_Machine_Status",
+ "assetName": "",
+ "aspectName": "",
+ "useMerging": false,
+ "x": 950,
+ "y": 440,
+ "wires": []
+ },
+ {
+ "id": "25e44221.d6425e",
+ "type": "write timeseries",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "1ccfd846e53447de88fdaaeeeddd6d78/Dashboard_Machine_Sensor",
+ "topicData": "{\"asset\":\"1ccfd846e53447de88fdaaeeeddd6d78\",\"assetName\":\"Eco Machine\",\"aspect\":\"59e5446feebb454eaf3ef7ce24565dfb\",\"aspectName\":\"Dashboard_Machine_Sensor\",\"variable\":null,\"variableName\":null}",
+ "topicLabel": "Eco Machine/Dashboard_Machine_Sensor",
+ "assetName": "",
+ "aspectName": "",
+ "useMerging": false,
+ "x": 950,
+ "y": 500,
+ "wires": []
+ }
+]
diff --git a/Dashboard_getting_started/Setup/DataGenerator.json b/Dashboard_getting_started/Setup/DataGenerator.json
new file mode 100644
index 0000000..43375d8
--- /dev/null
+++ b/Dashboard_getting_started/Setup/DataGenerator.json
@@ -0,0 +1,279 @@
+[
+ {
+ "id": "42c6ce94.a9202",
+ "type": "tab",
+ "allowCycles": false,
+ "label": "Data Generator",
+ "disabled": false,
+ "info": ""
+ },
+ {
+ "id": "92f8b622.df2838",
+ "type": "comment",
+ "z": "42c6ce94.a9202",
+ "name": "Get Random Functions",
+ "info": "function getRandomDouble(min, max) {\n return (Math.random() * (max - min) + min).toString();\n}\nfunction getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\n",
+ "sticky": 1,
+ "x": 300,
+ "y": 680,
+ "wires": []
+ },
+ {
+ "id": "56f3fb32.1321b4",
+ "type": "comment",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine",
+ "info": "",
+ "sticky": 0,
+ "x": 410,
+ "y": 80,
+ "wires": []
+ },
+ {
+ "id": "cd612bbe.c1cd68",
+ "type": "comment",
+ "z": "42c6ce94.a9202",
+ "name": "Performance Machine",
+ "info": "",
+ "sticky": 0,
+ "x": 440,
+ "y": 240,
+ "wires": []
+ },
+ {
+ "id": "5216b1db.909bc",
+ "type": "comment",
+ "z": "42c6ce94.a9202",
+ "name": "Eco Machine",
+ "info": "",
+ "sticky": 0,
+ "x": 410,
+ "y": 400,
+ "wires": []
+ },
+ {
+ "id": "cc846ce2.eef4a",
+ "type": "function",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine Status",
+ "func": "function getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\n\nlet programList = [\"EDS TTU 553 V8\",\"PA12 - KKT Vorheizen\",\"TC 3D AKF PA11\",\"detax v30\",\"Tool changing position\",\"EDS PT 3404 Balanced\",\"Postprocessing\", \"PT Black TL l-R\", \"PT White FT\", \"Preprocessing\", \"Cleaning\", \"PT M FT L-R\"];\n\nlet progr = programList[Math.floor(Math.random() * programList.length)];\nvar stat = getRandomInt(1,5);\nvar id = getRandomInt(1000,9999999);\n\nvar obj = {};\nobj._time = new Date();\nobj.Machine_Status = stat;\nobj.Program_Id = id;\nobj.Program_Name = progr;\n\nmsg.payload = obj;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 440,
+ "y": 120,
+ "wires": [
+ [
+ "7f529f86.7fc4e"
+ ]
+ ]
+ },
+ {
+ "id": "c5716581.b7e138",
+ "type": "function",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine Sensors",
+ "func": "function getRandomDouble(min, max) {\n return (Math.random() * (max - min) + min).toString();\n}\nfunction getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\nvar temp_pre = getRandomInt(80,100) + getRandomDouble(10,30);\nvar temp_work = getRandomInt(120,140) + getRandomDouble(10,60);\nvar press_pre = getRandomInt(10,20) + getRandomDouble(2,7);\nvar press_work = getRandomInt(2,5) + getRandomDouble(2,7);\n\nvar obj = {};\nobj._time = new Date();\nobj.Pressure_Preheater = press_pre;\nobj.Pressure_WorkingChamber = press_work;\nobj.Temp_Preheater = temp_pre;\nobj.Temp_WorkingChamber = temp_work;\n\nmsg.payload = obj;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 440,
+ "y": 180,
+ "wires": [
+ [
+ "79dc13ad.bb2cac"
+ ]
+ ]
+ },
+ {
+ "id": "6f440ba8.2034e4",
+ "type": "function",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine Status",
+ "func": "function getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\n\nlet programList = [\"EDS TTU 553 V8\",\"PA12 - KKT Vorheizen\",\"TC 3D AKF PA11\",\"detax v30\",\"Tool changing position\",\"EDS PT 3404 Balanced\",\"Postprocessing\", \"PT Black TL l-R\", \"PT White FT\", \"Preprocessing\", \"Cleaning\", \"PT M FT L-R\"];\n\nlet progr = programList[Math.floor(Math.random() * programList.length)];\nvar stat = getRandomInt(1,5);\nvar id = getRandomInt(1000,9999999);\n\nvar obj = {};\nobj._time = new Date();\nobj.Machine_Status = stat;\nobj.Program_Id = id;\nobj.Program_Name = progr;\n\nmsg.payload = obj;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 440,
+ "y": 280,
+ "wires": [
+ [
+ "27a7aa93.b2ae06"
+ ]
+ ]
+ },
+ {
+ "id": "6eebeb9e.d6f334",
+ "type": "function",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine Sensors",
+ "func": "function getRandomDouble(min, max) {\n return (Math.random() * (max - min) + min).toString();\n}\nfunction getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\nvar temp_pre = getRandomInt(80,100) + getRandomDouble(10,30);\nvar temp_work = getRandomInt(120,140) + getRandomDouble(10,60);\nvar press_pre = getRandomInt(10,20) + getRandomDouble(2,7);\nvar press_work = getRandomInt(2,5) + getRandomDouble(2,7);\n\nvar obj = {};\nobj._time = new Date();\nobj.Pressure_Preheater = press_pre;\nobj.Pressure_WorkingChamber = press_work;\nobj.Temp_Preheater = temp_pre;\nobj.Temp_WorkingChamber = temp_work;\n\nmsg.payload = obj;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 440,
+ "y": 340,
+ "wires": [
+ [
+ "9499b1d7.0e5eb"
+ ]
+ ]
+ },
+ {
+ "id": "846f330b.fd38c",
+ "type": "function",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine Status",
+ "func": "function getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\n\nlet programList = [\"EDS TTU 553 V8\",\"PA12 - KKT Vorheizen\",\"TC 3D AKF PA11\",\"detax v30\",\"Tool changing position\",\"EDS PT 3404 Balanced\",\"Postprocessing\", \"PT Black TL l-R\", \"PT White FT\", \"Preprocessing\", \"Cleaning\", \"PT M FT L-R\"];\n\nlet progr = programList[Math.floor(Math.random() * programList.length)];\nvar stat = getRandomInt(1,5);\nvar id = getRandomInt(1000,9999999);\n\nvar obj = {};\nobj._time = new Date();\nobj.Machine_Status = stat;\nobj.Program_Id = id;\nobj.Program_Name = progr;\n\nmsg.payload = obj;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 440,
+ "y": 440,
+ "wires": [
+ [
+ "e684622d.42458"
+ ]
+ ]
+ },
+ {
+ "id": "c6db8a58.f773c8",
+ "type": "function",
+ "z": "42c6ce94.a9202",
+ "name": "Basic Machine Sensors",
+ "func": "function getRandomDouble(min, max) {\n return (Math.random() * (max - min) + min).toString();\n}\nfunction getRandomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return (Math.floor(Math.random() * (max - min + 1)) + min).toString();\n}\nvar temp_pre = getRandomInt(80,100) + getRandomDouble(10,30);\nvar temp_work = getRandomInt(120,140) + getRandomDouble(10,60);\nvar press_pre = getRandomInt(10,20) + getRandomDouble(2,7);\nvar press_work = getRandomInt(2,5) + getRandomDouble(2,7);\n\nvar obj = {};\nobj._time = new Date();\nobj.Pressure_Preheater = press_pre;\nobj.Pressure_WorkingChamber = press_work;\nobj.Temp_Preheater = temp_pre;\nobj.Temp_WorkingChamber = temp_work;\n\nmsg.payload = obj;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 440,
+ "y": 500,
+ "wires": [
+ [
+ "25e44221.d6425e"
+ ]
+ ]
+ },
+ {
+ "id": "31e8510f.54df0e",
+ "type": "inject",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "",
+ "payload": "",
+ "payloadType": "date",
+ "repeat": "300",
+ "repeatEnd": "0",
+ "endTime": "0",
+ "crontab": "",
+ "offset": "",
+ "once": false,
+ "properties": "",
+ "timezone": "utc",
+ "betweentimesunit": "m",
+ "enableRuleEngine": false,
+ "showNextExecution": true,
+ "powerMode": false,
+ "x": 130,
+ "y": 260,
+ "wires": [
+ [
+ "cc846ce2.eef4a",
+ "c5716581.b7e138",
+ "6f440ba8.2034e4",
+ "6eebeb9e.d6f334",
+ "846f330b.fd38c",
+ "c6db8a58.f773c8"
+ ]
+ ]
+ },
+ {
+ "id": "7f529f86.7fc4e",
+ "type": "write timeseries",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "4c011fd02a2b4990a80d2c4c6d25ef23/Dashboard_Machine_Status",
+ "topicData": "{\"asset\":\"4c011fd02a2b4990a80d2c4c6d25ef23\",\"assetName\":\"Basic Machine\",\"aspect\":\"7600f42a1d324f73b10d00ec963febfd\",\"aspectName\":\"Dashboard_Machine_Status\",\"variable\":null,\"variableName\":null}",
+ "topicLabel": "Basic Machine/Dashboard_Machine_Status",
+ "assetName": "",
+ "aspectName": "",
+ "useMerging": false,
+ "x": 950,
+ "y": 120,
+ "wires": []
+ },
+ {
+ "id": "79dc13ad.bb2cac",
+ "type": "write timeseries",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "4c011fd02a2b4990a80d2c4c6d25ef23/Dashboard_Machine_Sensor",
+ "topicData": "{\"asset\":\"4c011fd02a2b4990a80d2c4c6d25ef23\",\"assetName\":\"Basic Machine\",\"aspect\":\"59e5446feebb454eaf3ef7ce24565dfb\",\"aspectName\":\"Dashboard_Machine_Sensor\",\"variable\":null,\"variableName\":null}",
+ "topicLabel": "Basic Machine/Dashboard_Machine_Sensor",
+ "assetName": "",
+ "aspectName": "",
+ "useMerging": false,
+ "x": 950,
+ "y": 180,
+ "wires": []
+ },
+ {
+ "id": "27a7aa93.b2ae06",
+ "type": "write timeseries",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "a12faec62d33439ea297adcde30ef5d2/Dashboard_Machine_Status",
+ "topicData": "{\"asset\":\"a12faec62d33439ea297adcde30ef5d2\",\"assetName\":\"Performance Machine\",\"aspect\":\"7600f42a1d324f73b10d00ec963febfd\",\"aspectName\":\"Dashboard_Machine_Status\",\"variable\":null,\"variableName\":null}",
+ "topicLabel": "Performance Machine/Dashboard_Machine_Status",
+ "assetName": "",
+ "aspectName": "",
+ "useMerging": false,
+ "x": 970,
+ "y": 280,
+ "wires": []
+ },
+ {
+ "id": "9499b1d7.0e5eb",
+ "type": "write timeseries",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "a12faec62d33439ea297adcde30ef5d2/Dashboard_Machine_Sensor",
+ "topicData": "{\"asset\":\"a12faec62d33439ea297adcde30ef5d2\",\"assetName\":\"Performance Machine\",\"aspect\":\"59e5446feebb454eaf3ef7ce24565dfb\",\"aspectName\":\"Dashboard_Machine_Sensor\",\"variable\":null,\"variableName\":null}",
+ "topicLabel": "Performance Machine/Dashboard_Machine_Sensor",
+ "assetName": "",
+ "aspectName": "",
+ "useMerging": false,
+ "x": 980,
+ "y": 340,
+ "wires": []
+ },
+ {
+ "id": "e684622d.42458",
+ "type": "write timeseries",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "1ccfd846e53447de88fdaaeeeddd6d78/Dashboard_Machine_Status",
+ "topicData": "{\"asset\":\"1ccfd846e53447de88fdaaeeeddd6d78\",\"assetName\":\"Eco Machine\",\"aspect\":\"7600f42a1d324f73b10d00ec963febfd\",\"aspectName\":\"Dashboard_Machine_Status\",\"variable\":null,\"variableName\":null}",
+ "topicLabel": "Eco Machine/Dashboard_Machine_Status",
+ "assetName": "",
+ "aspectName": "",
+ "useMerging": false,
+ "x": 950,
+ "y": 440,
+ "wires": []
+ },
+ {
+ "id": "25e44221.d6425e",
+ "type": "write timeseries",
+ "z": "42c6ce94.a9202",
+ "name": "",
+ "topic": "1ccfd846e53447de88fdaaeeeddd6d78/Dashboard_Machine_Sensor",
+ "topicData": "{\"asset\":\"1ccfd846e53447de88fdaaeeeddd6d78\",\"assetName\":\"Eco Machine\",\"aspect\":\"59e5446feebb454eaf3ef7ce24565dfb\",\"aspectName\":\"Dashboard_Machine_Sensor\",\"variable\":null,\"variableName\":null}",
+ "topicLabel": "Eco Machine/Dashboard_Machine_Sensor",
+ "assetName": "",
+ "aspectName": "",
+ "useMerging": false,
+ "x": 950,
+ "y": 500,
+ "wires": []
+ }
+]
diff --git a/Dashboard_getting_started/Setup/readme.md b/Dashboard_getting_started/Setup/readme.md
new file mode 100644
index 0000000..78aa7f5
--- /dev/null
+++ b/Dashboard_getting_started/Setup/readme.md
@@ -0,0 +1,143 @@
+# Setup steps for the getting started VFC Dashboard:
+This short tutorial will show you how to set up the simulated assets and the data generator for the VFC dashboard example.
+
+# Asset Setup:
+We want to create an Asset Type **VFC_Dashboard_Machine**:
+
+![Asset_type](../doc/asset_type.png)
+
+with three Aspects assigned to the Asset type:
+- Dashboard_Machine_Location [Static]
+- Dashboard_Machine_Sensor [Dynamic]
+- Dashboard_Machine_Status [Dynamic]
+
+To do this, please follow the following steps and note the notation for the variables is [Unit, DATATYPE, Max. lenght]
+- [x] Setup static Aspect type Dashboard_Machine_Location with three variables:
+ - latitude [-, DOUBLE, -]
+ - longitude [-,DOUBLE, -]
+ - Software_Version [-, STRING, 32]
+
+- [x] Setup dynamic Aspect type Dashboard_Machine_Location with four variables:
+ - Pressure_Preheater [Bar, DOUBLE, -]
+ - Pressure_WorkingChamber [Bar, DOUBLE, -]
+ - Temp_Preheater [°C, DOUBLE, -]
+ - Temp_WorkingChamber [°C, DOUBLE, -]
+
+- [x] Setup dynamic Aspect type Dashboard_Machine_Status with three variables:
+ - Machine_Status [-, INT, -]
+ - Program_Id [-, INT, -]
+ - Program_Name [-, STRING, 255]
+- [x] Create an Asset Type of parent type core.basicasset, name it **VFC_Dashboard_Machine** and add the three created Aspect types under the Aspects dropdown window
+
+Your Asset type should look like this:
+
+![Aspect_types](../doc/asset_complete.png)
+
+- [x] Now Create 3 Assets of type **VFC_Dashboard_Machine** and name them:
+ - Basic
+ - Performance
+ - Eco
+
+For the purpose of this example, let's assume you are a factory manager that has three different machines (Basic, Performance and Eco), but they all share the same data model. Let's assume each machine is exhibited at a fair to showcase the power and potential of the IIoT with Mindsphere. Basic is located at Frankfurt, Performance at Munich and Eco at Berlin. We already created a static aspect *Dashboard_Machine_Location* to store the latitude, longitude and software version of each machine. Now, we have to initialize these Values. To do so, click on the edit symbol of the Asset, open the dropdown of *static aspects* and fill in the following under *Dashboard_Machine_Location*:
+
+- [x] For machine **Basic**:
+ - latitude: 50.1109
+ - longitude: 8.6508
+ - Software_Version: 1.0.0.2
+- [x] For machine **Performance**:
+ - latitude: 48.1353
+ - longitude: 11.6962
+ - Software_Version: 1.3.3.0
+- [x] For machine **Eco**:
+ - latitude: 52.5040
+ - longitude: 13.2733
+ - Software_Version: 1.5.0.0
+
+Now you want to monitor them, but to do so, your machines need to send data. Let's generate some data using Mindspheres Visual Flow Creator application.
+
+# VFC Data Generator:
+The Visual Flow Creator (VFC) is a [Node-RED](https://nodered.org) based application that can simplify and automate a lot of tasks inside Mindsphere. If you are new to the VFC, please take a few minutes and go through the basics in our [Documentation](https://documentation.mindsphere.io/resources/html/visualflow-creator/en-US/index.html). It will help you understanding the concept of VFC tremendously.
+
+Start by creating a new flow and name it something like *DataGenerator*. Then copy the json data from the [DataGenerator.json](../Resources/IMPORT_DataGenerator.json) file to your clipboard and go back to the VFC.
+
+Under the options tab, click on import:
+
+![Import](../doc/import.png)
+
+and paste the json data in the blank field. Click on import and you should have couple of nodes that you can now place in the flow. Then Click Save
+
+Your *DataGenerator* Flow should now look like this:
+
+![Data_Generator_Flow](../doc/Data_Generator_Flow.png)
+
+> This flow will be triggered by the inject node every 5 minutes. If you want to alter the interval data is written to your machines, feel free to do so.
+
+To finish this flow, you have to map the 6 write timeseries node to your own corresponding machines. Double click on a node and choose your asset & aspect by clicking on the three dots:
+
+![write_timeseries](../doc/write_timeseries.png)
+
+> Make sure you are writing to the correct machine and the correct aspect. **Do not write directly to a variable (-> leave the variable field blank)** as we are writing several variables of an Aspect at the same time. You will get an error message if you do so.
+
+:white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:
+
+Click Save. Your Data Generator is ready to go and will run in the background. Now **[Continue Here](../readme.md#dashboard-structure)** and get started building your VFC Dashboard!
+
+:white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:
+
+### Data Generator best practices:
+VFC offers a build in method to simulate/generate data with the *generate node*. You can use it to create powerful data patterns and stack signals like: saw, sine, gauss, linear and noise.
+
+![gerate_node](../doc/generate_node.png)
+
+However, sometimes the easy way also does the job. Why not simply take a random INT or DOUBLE from a defined interval?
+```javascript
+function getRandomInt (min, max) {
+ min = Math.ceil(min);
+ max = Math.floor(max);
+ return (Math.floor(Math.random() * (max - min + 1)) + min).toString();
+}
+```
+```javascript
+function getRandomDouble (min, max) {
+ return (Math.random() * (max - min) + min).toString();
+}
+```
+You can use these javascript code snippets in a *function node*:
+
+![function_node](../doc/function_node.png)
+
+generate the necessary data und pass them as *msg.payload* to our *write-timeseries node*.
+You can use the same (simple) logic to generate a string by picking a random index of a string array.
+
+```javascript
+let StringList = ["String A", "String B", "String C", "String D", "String ...", "String X"];
+let RandomString = StringList[Math.floor(Math.random() * StringList.length)];
+```
+A *function node* that gerates random integers and random strings and passes them to the *write-timeseries node* can look like this:
+
+```javascript
+//declare your functions
+function getRandomInt(min, max) {
+ min = Math.ceil(min);
+ max = Math.floor(max);
+ return (Math.floor(Math.random() * (max - min + 1)) + min).toString();
+}
+//set up your string array and pick a random string out of it
+let StringList = ["String A", "String B", "String C", "String D", "String ...", "String X"];
+let progr = StringList[Math.floor(Math.random() * StringList.length)];
+
+//generate some random integers using your getRandomInt function
+var stat = getRandomInt(1,5);
+var id = getRandomInt(1000,9999999);
+
+//initialize your payload object and send it as msg.payload
+var obj = {};
+obj._time = new Date();
+obj.Machine_Status = stat;
+obj.Program_Id = id;
+obj.Program_Name = progr;
+
+msg.payload = obj;
+return msg;
+```
+
diff --git a/Dashboard_getting_started/doc/Data_Generator_Flow.png b/Dashboard_getting_started/doc/Data_Generator_Flow.png
new file mode 100644
index 0000000..b87f1f6
Binary files /dev/null and b/Dashboard_getting_started/doc/Data_Generator_Flow.png differ
diff --git a/Dashboard_getting_started/doc/asset_complete.png b/Dashboard_getting_started/doc/asset_complete.png
new file mode 100644
index 0000000..9b322ca
Binary files /dev/null and b/Dashboard_getting_started/doc/asset_complete.png differ
diff --git a/Dashboard_getting_started/doc/asset_switch.mp4 b/Dashboard_getting_started/doc/asset_switch.mp4
new file mode 100644
index 0000000..34cc675
Binary files /dev/null and b/Dashboard_getting_started/doc/asset_switch.mp4 differ
diff --git a/Dashboard_getting_started/doc/asset_type.png b/Dashboard_getting_started/doc/asset_type.png
new file mode 100644
index 0000000..caa7269
Binary files /dev/null and b/Dashboard_getting_started/doc/asset_type.png differ
diff --git a/Dashboard_getting_started/doc/button_node.png b/Dashboard_getting_started/doc/button_node.png
new file mode 100644
index 0000000..38f37ae
Binary files /dev/null and b/Dashboard_getting_started/doc/button_node.png differ
diff --git a/Dashboard_getting_started/doc/change_node.png b/Dashboard_getting_started/doc/change_node.png
new file mode 100644
index 0000000..6a73ac5
Binary files /dev/null and b/Dashboard_getting_started/doc/change_node.png differ
diff --git a/Dashboard_getting_started/doc/change_tab.png b/Dashboard_getting_started/doc/change_tab.png
new file mode 100644
index 0000000..552c47a
Binary files /dev/null and b/Dashboard_getting_started/doc/change_tab.png differ
diff --git a/Dashboard_getting_started/doc/check_nodes.png b/Dashboard_getting_started/doc/check_nodes.png
new file mode 100644
index 0000000..41559c6
Binary files /dev/null and b/Dashboard_getting_started/doc/check_nodes.png differ
diff --git a/Dashboard_getting_started/doc/dashboard_menu.png b/Dashboard_getting_started/doc/dashboard_menu.png
new file mode 100644
index 0000000..2c2344b
Binary files /dev/null and b/Dashboard_getting_started/doc/dashboard_menu.png differ
diff --git a/Dashboard_getting_started/doc/dashpic_1.png b/Dashboard_getting_started/doc/dashpic_1.png
new file mode 100644
index 0000000..ac45f82
Binary files /dev/null and b/Dashboard_getting_started/doc/dashpic_1.png differ
diff --git a/Dashboard_getting_started/doc/event_node.png b/Dashboard_getting_started/doc/event_node.png
new file mode 100644
index 0000000..270130a
Binary files /dev/null and b/Dashboard_getting_started/doc/event_node.png differ
diff --git a/Dashboard_getting_started/doc/event_table.png b/Dashboard_getting_started/doc/event_table.png
new file mode 100644
index 0000000..9fa72cc
Binary files /dev/null and b/Dashboard_getting_started/doc/event_table.png differ
diff --git a/Dashboard_getting_started/doc/flowpic_1.png b/Dashboard_getting_started/doc/flowpic_1.png
new file mode 100644
index 0000000..29b16ad
Binary files /dev/null and b/Dashboard_getting_started/doc/flowpic_1.png differ
diff --git a/Dashboard_getting_started/doc/flowpic_2.png b/Dashboard_getting_started/doc/flowpic_2.png
new file mode 100644
index 0000000..7a3e06e
Binary files /dev/null and b/Dashboard_getting_started/doc/flowpic_2.png differ
diff --git a/Dashboard_getting_started/doc/flowpic_3.png b/Dashboard_getting_started/doc/flowpic_3.png
new file mode 100644
index 0000000..75bf940
Binary files /dev/null and b/Dashboard_getting_started/doc/flowpic_3.png differ
diff --git a/Dashboard_getting_started/doc/flowpic_4.png b/Dashboard_getting_started/doc/flowpic_4.png
new file mode 100644
index 0000000..50feb78
Binary files /dev/null and b/Dashboard_getting_started/doc/flowpic_4.png differ
diff --git a/Dashboard_getting_started/doc/flowpic_5.png b/Dashboard_getting_started/doc/flowpic_5.png
new file mode 100644
index 0000000..a03f158
Binary files /dev/null and b/Dashboard_getting_started/doc/flowpic_5.png differ
diff --git a/Dashboard_getting_started/doc/flowpic_6.png b/Dashboard_getting_started/doc/flowpic_6.png
new file mode 100644
index 0000000..5efa478
Binary files /dev/null and b/Dashboard_getting_started/doc/flowpic_6.png differ
diff --git a/Dashboard_getting_started/doc/flowpic_7.png b/Dashboard_getting_started/doc/flowpic_7.png
new file mode 100644
index 0000000..a04bab0
Binary files /dev/null and b/Dashboard_getting_started/doc/flowpic_7.png differ
diff --git a/Dashboard_getting_started/doc/function_node.png b/Dashboard_getting_started/doc/function_node.png
new file mode 100644
index 0000000..109ef54
Binary files /dev/null and b/Dashboard_getting_started/doc/function_node.png differ
diff --git a/Dashboard_getting_started/doc/generate_node.png b/Dashboard_getting_started/doc/generate_node.png
new file mode 100644
index 0000000..1b145c1
Binary files /dev/null and b/Dashboard_getting_started/doc/generate_node.png differ
diff --git a/Dashboard_getting_started/doc/group_edit.png b/Dashboard_getting_started/doc/group_edit.png
new file mode 100644
index 0000000..fbe8d5c
Binary files /dev/null and b/Dashboard_getting_started/doc/group_edit.png differ
diff --git a/Dashboard_getting_started/doc/group_structure.png b/Dashboard_getting_started/doc/group_structure.png
new file mode 100644
index 0000000..b2254d6
Binary files /dev/null and b/Dashboard_getting_started/doc/group_structure.png differ
diff --git a/Dashboard_getting_started/doc/groups_content.png b/Dashboard_getting_started/doc/groups_content.png
new file mode 100644
index 0000000..9a934c1
Binary files /dev/null and b/Dashboard_getting_started/doc/groups_content.png differ
diff --git a/Dashboard_getting_started/doc/hide_show.png b/Dashboard_getting_started/doc/hide_show.png
new file mode 100644
index 0000000..00837bb
Binary files /dev/null and b/Dashboard_getting_started/doc/hide_show.png differ
diff --git a/Dashboard_getting_started/doc/import.png b/Dashboard_getting_started/doc/import.png
new file mode 100644
index 0000000..a3d2fc9
Binary files /dev/null and b/Dashboard_getting_started/doc/import.png differ
diff --git a/Dashboard_getting_started/doc/led_node.png b/Dashboard_getting_started/doc/led_node.png
new file mode 100644
index 0000000..a9f2803
Binary files /dev/null and b/Dashboard_getting_started/doc/led_node.png differ
diff --git a/Dashboard_getting_started/doc/logical_grouping.png b/Dashboard_getting_started/doc/logical_grouping.png
new file mode 100644
index 0000000..9a00048
Binary files /dev/null and b/Dashboard_getting_started/doc/logical_grouping.png differ
diff --git a/Dashboard_getting_started/doc/map.png b/Dashboard_getting_started/doc/map.png
new file mode 100644
index 0000000..55e9f88
Binary files /dev/null and b/Dashboard_getting_started/doc/map.png differ
diff --git a/Dashboard_getting_started/doc/map_text.png b/Dashboard_getting_started/doc/map_text.png
new file mode 100644
index 0000000..48ee54e
Binary files /dev/null and b/Dashboard_getting_started/doc/map_text.png differ
diff --git a/Dashboard_getting_started/doc/notification_node.png b/Dashboard_getting_started/doc/notification_node.png
new file mode 100644
index 0000000..b9f523f
Binary files /dev/null and b/Dashboard_getting_started/doc/notification_node.png differ
diff --git a/Dashboard_getting_started/doc/open_dashboard.png b/Dashboard_getting_started/doc/open_dashboard.png
new file mode 100644
index 0000000..d37957f
Binary files /dev/null and b/Dashboard_getting_started/doc/open_dashboard.png differ
diff --git a/Dashboard_getting_started/doc/overview.png b/Dashboard_getting_started/doc/overview.png
new file mode 100644
index 0000000..fd23739
Binary files /dev/null and b/Dashboard_getting_started/doc/overview.png differ
diff --git a/Dashboard_getting_started/doc/read_location.png b/Dashboard_getting_started/doc/read_location.png
new file mode 100644
index 0000000..f530308
Binary files /dev/null and b/Dashboard_getting_started/doc/read_location.png differ
diff --git a/Dashboard_getting_started/doc/readme.md b/Dashboard_getting_started/doc/readme.md
new file mode 100644
index 0000000..4ba001c
--- /dev/null
+++ b/Dashboard_getting_started/doc/readme.md
@@ -0,0 +1,3 @@
+# This folder stores the pictures used in the main and Setup readme.md
+
+You do not need the content of this folder to complete the getting started example Dashboard.
diff --git a/Dashboard_getting_started/doc/selector.png b/Dashboard_getting_started/doc/selector.png
new file mode 100644
index 0000000..497a3c9
Binary files /dev/null and b/Dashboard_getting_started/doc/selector.png differ
diff --git a/Dashboard_getting_started/doc/store_ctx_node.png b/Dashboard_getting_started/doc/store_ctx_node.png
new file mode 100644
index 0000000..d7acc1a
Binary files /dev/null and b/Dashboard_getting_started/doc/store_ctx_node.png differ
diff --git a/Dashboard_getting_started/doc/switch_node.png b/Dashboard_getting_started/doc/switch_node.png
new file mode 100644
index 0000000..c1be368
Binary files /dev/null and b/Dashboard_getting_started/doc/switch_node.png differ
diff --git a/Dashboard_getting_started/doc/tab_structure.png b/Dashboard_getting_started/doc/tab_structure.png
new file mode 100644
index 0000000..fcc7b1a
Binary files /dev/null and b/Dashboard_getting_started/doc/tab_structure.png differ
diff --git a/Dashboard_getting_started/doc/tabs_groups.png b/Dashboard_getting_started/doc/tabs_groups.png
new file mode 100644
index 0000000..7e222e4
Binary files /dev/null and b/Dashboard_getting_started/doc/tabs_groups.png differ
diff --git a/Dashboard_getting_started/doc/text_node.png b/Dashboard_getting_started/doc/text_node.png
new file mode 100644
index 0000000..ec147a4
Binary files /dev/null and b/Dashboard_getting_started/doc/text_node.png differ
diff --git a/Dashboard_getting_started/doc/text_node_2.png b/Dashboard_getting_started/doc/text_node_2.png
new file mode 100644
index 0000000..47f73f0
Binary files /dev/null and b/Dashboard_getting_started/doc/text_node_2.png differ
diff --git a/Dashboard_getting_started/doc/text_node_3.png b/Dashboard_getting_started/doc/text_node_3.png
new file mode 100644
index 0000000..4268f24
Binary files /dev/null and b/Dashboard_getting_started/doc/text_node_3.png differ
diff --git a/Dashboard_getting_started/doc/write_timeseries.png b/Dashboard_getting_started/doc/write_timeseries.png
new file mode 100644
index 0000000..cb96bf2
Binary files /dev/null and b/Dashboard_getting_started/doc/write_timeseries.png differ
diff --git a/Dashboard_getting_started/readme.md b/Dashboard_getting_started/readme.md
new file mode 100644
index 0000000..906ad4d
--- /dev/null
+++ b/Dashboard_getting_started/readme.md
@@ -0,0 +1,340 @@
+# VFC Dashboard - A Getting Started Example:
+This example will guide you step by step through the VFC Dahsboard functionalities. You will create a simple but interactive dashboard that shows the status of your three (simulated) machines that you already connected to MindSphere. You will learn the essential nodes for dashboarding with the VFC and will be able to extend your dashboard according to your own needs. The Dashboard you create will look like this:
+
+![dashboard_image](./doc/overview.png)
+
+This tutorial is meant to start from scratch. You will set up your Assets, generate data for them and build your dashboard on the basis of this data. If you just want to check out the dashboard, import it [From Here](./Resources/IMPORT_Dashboard.json). Please note, that you have to change major components to fit the dashboard to your own tenant's asset model.
+
+# Prerequisites:
+- around 120 minutes of time
+- Visual Flow Creator
+- Asset Manager
+- basic Javascript knowledge is helpful, but not required
+> All required applications and resources are part of a [Start for free](https://siemens.mindsphere.io/en/start) tenant. You can follow this tutorial along regardless of your MindSphere package.
+
+> This tutorial is designed for beginners. However, some fundamental knowledge about the VFC will make your learning journey more enjoyable. Learn the basics [Here](https://documentation.mindsphere.io/resources/html/visualflow-creator/en-US/index.html).
+
+# Setup:
+We will simulate three different versions of an industrial machine:
+- Basic
+- Performance
+- Eco
+
+This step requires you to be familiar with MindSphere's asset structure and that you can create new aspects, assets and asset types. If this sounds like a big headache to you, please visit the [Asset Manager Tutorial](https://siemens.mindsphere.io/en/docs/tutorials/asset-manager) first.
+
+If not, please follow the [Setup Instructions](./Setup/readme.md) and come back once you completed the process.
+
+# Dashboard Structure:
+Start by creating a new flow and name it something like *Dashboard* or *MyFirstDashboard*. Then switch to the dashboard tab under Layout, which will be blank for now.
+
+![dashboard_menu](./doc/dashboard_menu.png)
+
+Here you can structure the basic layout of your dashboard using tabs and groups. A tab is the equivalent of a dashboard page. You can assign different content to each tab and it will then only be displayed on that that. Each tab will display your content in groups, which act like columns. For example, a structure that you created under *Tabs & Links* like this:
+
+![tab_structure](./doc/tab_structure.png)
+
+the corresponding dashboard page would be organized as shown below:
+
+![tabs_groups](./doc/tabs_groups.png)
+
+Inside a group (column), the dashboard content is structured vertically, from top to bottom. If you assigned three items to a single group on a single tab like this:
+
+![group_structure](./doc/group_structure.png)
+
+the corresponding dashboard page would be organized as shown below:
+
+![groups_content](./doc/groups_content.png)
+
+As you can see, *Group 1* is centered automatically on the tab. You don't have to worry about the position of your groups, Mindsphere does that automatically for you. Just remember the following rule of thumb:
+
+> **Tabs** are **individual dashboard pages**. You can only view one tab at once.
+
+> **Groups**, that are structured from **top to bottom**, will be displayed from **left to right** on your dashboard page.
+
+> **Content**, that is structured from **top to bottom**, will be displayed from **top to bottom** inside a group.
+
+Now let's start building the overview dashboard:
+- Create a tab and name it *Overview*
+- Under *Overview*, create three new groups
+- Rename these groups to *Selector*, *Asset Map* and *Info*
+- Remember the way the VFC is displaying groups. You want to place the *Selector* group on the left and the *Info* group on the right
+
+You can rename tabs and groups by hovering over them and clicking the *edit* button:
+
+![group_edit](./doc/group_edit.png)
+
+Now create a second tab called *Detail* with only one group named *Events*. We will use the *Detail* tab at the very end of this tutorial, so consider this a little teaser.
+
+# Designing the Dashboard:
+In this chapter, we will bring some life and functionality to our Overview dashboard. This tutorial is designed to build all elements from scratch and simultaneously show the logic behind a VFC dashboard. Some steps might be overcomplicated with the purpose of demonstrating several VFC nodes.
+
+> If you just want to check out the final result, you can copy paste the [Json Flow Data From Here](./Resources/Dashboard.json). It will import all elements, including nodes, tabs and groups. Remember to adjust all *read-timeseries* and *write-timeseries* nodes to your own assets.
+
+For the beginning, we will place three *text* nodes and three *button* nodes in the flow. This will be our Asset selector, where each machine has it's own button like below:
+
+![asset_selector](./doc/selector.png)
+
+But before styling our nodes, we have to adjust the width of the group. Click *edit* on the *Selector* group and give it a width of 9. Rearrange your nodes in the flow, so that the *text* nodes are alternating with the *button* nodes, starting with the text node. Double click the first *text node* to open it's properties. Here you can assign the node to a group and change it's apperence. We will start with our Basic machine. Copy the following setting:
+
+![text_node_settings](./doc/text_node.png)
+
+So we assigned the *text* node to our *Selector* group, gave it a form of 6x2 (width x height) and chose the:
*label* **value** (left aligned)
format, where *label* = Asset: and **value** = Basic. This text is static and will not change depending on the input.
Now rinse and repeat for the other two *text* nodes, but remember to change the **value** to Performance and Eco.
+
+Now apply the following settings to the three *button* nodes:
+
+![button_nodes_settings](./doc/button_node.png)
+
+The positioning of nodes in the flow is not relevant for the structure of the dashboard. By organizing your flow, you will have a huge benefit once it get's complicated, but the order of the nodes under the *Selection* group is decisive. The check, which node in the group is the corresponding node in the flow, just hover over it. The node in the flow will be bordered red:
+
+![check_nodes](./doc/check_nodes.png)
+
+Your flow should look like this:
+
+![flow_actual](./doc/flowpic_1.png)
+
+Now you want to switch to your dashboard and view your progress.
+>Hint: You can open your dashboard by clicking *Open dashboard in new tab*. Here, you can also reload all dashboards to apply changes made to the flow model.
+>
+>![how_to_open_dashboard](./doc/open_dashboard.png)
+
+The *Selection* group of the dashboard should look like this:
+
+![Selection_actual](./doc/dashpic_1.png)
+
+The next step is to implement a map, where you can see the location of the asset you chose in the *Selector* group. Mindsphere offers some pre-build nodes, that reflect the Mindsphere look and feel and can be implemented into your VFC dashboards. You find them in the *MDSP Dashboard* node section. There is a date picker, timeseries chart, asset list, aspect variable selector, event table and the Mindsphere Map. But first, change the *Asset Map* group width to 122. Now drop the *MDSP Map* and another *text* node into your flow, assign them to the *Asset Map* group (the *MDSP Map* node is positioned below the *text* node) and configure them as follows:
+
+![map_text](./doc/map_text.png)
+
+![MDSP_Map](./doc/map.png)
+
+Maybe you have noticed that we already set initial position and zoom level for the *MDSP Map* node. Feel free to alter the position to your company's headquarters and experiment with the zoom level. Furthermore, the **value** of the *text* node is {{msg.name}}. We want to display a dynamic text which changes depending on your selection in the *Selector* group. The text node will check the incoming message to have a msg.name property and will display it`s value. Changing the text according to the selected Asset is great, but we want to display the stored location of this asset in the map too.
+
+> You can change the initial position of the *MDSP Map* by sending a payload with {latitude, longitude, zoomLevel}
+
+Let's assume, our three machines Basic, Performance and Eco are located on three different fairs in Germany as exhibition machines. Basic is located at fair Frankfurt, Performance at fair Munich and Eco at fair Berlin. We have already set the location of the machines in the [Setup](./Setup/readme.md#asset-setup) and want to get these locational informations into our flow. This can be achievend using the *read-aspect-static* node, as we want to read data from the static aspect *Dashboard_Machine_Location*. Configure one *read-aspect-static* node for each machine with the given example:
+
+![read_location](./doc/read_location.png)
+
+In the next step, we hava to transform the data to the form {latitude, longitude, zoomLevel}, so that the *MDSP Map* can interpret the input. We achieve this using *function* nodes. Create three *function* nodes (again, one for each machine) and use the following code:
+
+```javascript
+var long = msg.payload.longitude;
+var lat = msg.payload.latitude;
+
+var maploc = {'longitude':long,'latitude': lat,'zoomLevel': 12};
+msg.payload = maploc;
+msg.name = 'INSERT MACHINE TYPE HERE';
+return msg;
+```
+Obviously, change ***INSERT MACHINE TYPE HERE*** to the corresponding machine type in your function code.
+
+Now it is time to connect the nodes and complete our first dashboard functionality:
+
+![connected_nodes](./doc/flowpic_2.png)
+
+Now try out your dashboard. The *Location of* and Map view should change every time you click an Asset in the *Selector* group:
+
+https://user-images.githubusercontent.com/90254123/164717991-9ee5fa5a-f5b6-4deb-a426-beec63d6571a.mp4
+
+Our next topic will be the third group, the *Info* group. Here we want to display some quick info about the selected machine. In this case:
+- A status indicator
+- and the software version, the machine is running on
+
+First things first, adjust the width of the *Info* group to 12. Now we are facing a design problem: If we load or reload the dashboard (so no machine is selected), the whole skeleton of the *Info* group would be visible, but empty. So we want to hide the *Info* group by default and only display it if any of the machines is selected. We can use the *ui control* node from the *dashboard* section. The default function iss to change the currently displayed tab by sending the tab name as *msg.payload*, but you can also control the visibility of groups of widgets by sending a payload in the form:
+```JSON
+{
+ "group": {
+ "hide": ["tab_name_group_name_with_underscores"],
+ "show": ["reveal_another_group"],
+ "focus": true
+ }
+}
+```
+>The "focus" : true is optional.
+
+Another feature of the ui node is that it emit's a msg when a browser client connects or looses connection. Let´s combine these funtionalities to create the following. When the dashboard is loaded, the ui node emit's a message and the *info* group is hidden. On the other hand, when you select one of the machines, the *info* group is displayed again:
+
+![hide_show](./doc/hide_show.png)
+
+To set the *msg.payload*, you could use a *function* node or just take advantage of the *change* node. Choose the *Set* property from the dropdown and set to msg. payload to a JSON object, like this:
+
+![change_node](./doc/change_node.png)
+
+By clicking the three dots in the change, node, you can insert JSON code. Use this code to hide the *Info* group:
+```JSON
+{
+ "group": {
+ "hide": [
+ "Overview_Info"
+ ]
+ }
+}
+```
+And this code to show the *Info* group:
+```JSON
+{
+ "group": {
+ "show": [
+ "Overview_Info"
+ ]
+ }
+}
+```
+Now that we implemented that functionality, let´s give the *Info* group some content! We want to display the Software Version of the machine and a status indicator, showing the actual status of our machine. The data generator is generating a status code between 1 and five, so lets' assume:
+- 1 = Status OK
+- 2 = Status Information
+- 3 = Status WARNING
+- 4 = Status FAULT
+- 5 = Status MAINTENANCE
+
+Remember, that the *Machine_Status* is a dynamic variable and the *Software_Version* is a static attribute. So we need three *read-timeseries* nodes and three *read-aspect-static* nodes from the *mindsphere* section. Drop them in your flow and arrange them as you like. Now adjust all six *read* nodes, so they read the right data from your assets. For the three *read-timeseries* nodes choose Mode *Period* and set the Period to *2 hours* with no offset. Group them logically, like so:
+
+![Logical_grouping](./doc/logical_grouping.png)
+
+Now drop five more nodes into your flow:
+- 2 *function* nodes from the *function* node section
+- 2 *text* nodes from the *dashboard* node section
+- 1 *led* node from the *dashboard* node section
+
+and change the settings to the following for the first *text* node:
+
+![text_node_2](./doc/text_node_2.png)
+
+for the *led* node:
+
+![led_node](./doc/led_node.png)
+
+and for the second *text* node:
+
+![text_node_3](./doc/text_node_3.png)
+
+Now that these elements are set up, let's take care of the function nodes. The *read-timeseries* nodes return an array with multiple data points, but we only want to extract the latest value in this array and sent it as *msg.payload*. Name the first *function* node ***Extract Machine Status*** and the second *function* node ***Extract Software Version***. Use the following javascript code for the *Extract Machine Status* node:
+```javascript
+var lastDataPoint = msg.payload.slice(-1)[0];
+msg.payload =lastDataPoint['Machine_Status'];
+return msg;
+```
+and insert this code in the *Extract Software Version* node:
+```javascript
+msg.payload = msg.payload['Software_Version'];
+return msg;
+```
+Next we simply have to combine the nodes:
+
+![flowpic_3](./doc/flowpic_3.png)
+
+Try these new functionalities in your own dashboard. If you click on a machine, the led and Software Version should change dynamically:
+
+https://user-images.githubusercontent.com/90254123/166253526-9b203cf0-5e0d-42ab-9dd6-360943efe8bd.mp4
+
+Let's take a short summary. As a VFC user you have already visualized your three assets, their location and status. Now you want to take things to the next level. Imagine beeing a machine Operator, who wants to report a critical machine failure as quickly as possible directly from the dashboard. Furthermore, you want to be able to navigate to your machine and see what happened. MindSphere offers a functionality that supports our idea, it' called **events**. So let's implement events in our dashboard. But we have to do something else first. The logic of our flow needs to know which machine is actually selected. We need to store some kind of indicator which machine is selected and we can do it in two different ways:
+1. By sending the machine directly as *msg.payload* or as a *msg.xxxxx* property
+2. By setting up a flow variable
+When you are declaring variables in a *function* node, they are of course only valid and accessible in the respective function. Flow variables however are stored on flow level and can be used to store some data and read it again later in the flow without the need to send it in the *msg*. We now want to store our selected machine in a flow variable called *ActiveAsset*. Drop three *change* nodes and one *store ctx* node into your flow.
+
+Configure each *change* node to only have one rule that sets the *msg.payload* to a string. The first node set's *msg.payload* to *Basic*, the second to *Performance* and the third to *Eco*. Use these settings for the *store ctx* node:
+
+![store_ctx_node](./doc/store_ctx_node.png)
+
+Now we will add a couple of nodes on top:
+- one *button* node
+- one *read ctx* node
+- one *switch* node
+- one *change* node
+- one *ui control* node
+
+First: the *button* node. Assign it to the *Info* Group and type *Go To Asset* in the *Label* field. Configure the *read ctx* node to *Context* = *Flow* and *Key* = *ActiveAsset*. By doing so, we will read the selected machine that was previosly stored in the *ActiveAsset* flow variable. Configure the switch node as follows:
+
+![switch_node](./doc/switch_node.png)
+
+The *switch* node now has three outputs and will route the *msg* signal with the given rules. So if *msg.payload* = *Basic*, the node will send a message to the first output. With the help of the *change* node, set the *msg.payload* to detail. Let's understand the purpose of these nodes. When you click on the button *Go To Asset*, the flow reads the *ActiveAsset* flow variable and will direct the flow in a way, that the dashboard changes to a new tab; the detail page for a machine. We will create one of these detail tabs, for our *Basic* machine. Add a new tab in the *Tabs&Links* menu and name it **Detail**. Then connect the nodes like this:
+
+![change_tab](./doc/change_tab.png)
+
+Connect the nodes to the rest of your flow and your flow should now have the following form:
+
+![flowpic_4](./doc/flowpic_4.png)
+
+So, if you have the *Basic* machine selected and click on *Go To Asset*, you should be redirected to a new blank tab. As a control mechanism, try to click on *Go To Asset* if *Performance* or *Eco* machine is selected. Nothing should happen there, as we have not connected any nodes to these routings of the *switch* node yet.
+
+Now let's do the same for our emergency button. Drop these buttons in the flow and place them in the right order (from left to right):
+- one *change* node
+- one *button* node
+- one *read ctx* node
+- one *switch* node
+
+On top of that, add three *create event* nodes and one *notification* node and place them on the right side of the flow. Let us configure the nodes together, but the logic is the same as for the tab switch. Configure the *change* node to set the *msg.payload* to a string *Critical Failure*. Assign the *button* node to the *Info* group and *Label* ist *Report emergency*. The *read ctx* node has a *Context* of *Flow* (so it can only read variables in the flow scope) and a *Key* of *ActiveAsset*. Configure the switch node in the same way as you did a few steps before:
+
+![switch_node](./doc/switch_node.png)
+
+You also have to change the settings of the *create event* nodes because you have to specify the type of event that VFC generates for you. These are the settings for the *Basic* machine:
+
+![event_node](./doc/event_node.png)
+
+Adjust the *create event* node settings for the other two machines as well, but change the target asset and the *Description* text. Finally, take these settings for the *notification* node:
+
+![notification_node](./doc/notification_node.png)
+
+Connect the nodes to make the flow logic functional:
+
+![flowpic_5](./doc/flowpic_5.png)
+
+And the whole bottom part of your flow should look like this:
+
+![flowpic_6](./doc/flowpic_6.png)
+
+But what exactly are these nodes doing? If a machine is selected and you click on the button *Report emergency* you create an event for this machine, which is saved and bound to your asset, so you can see and use this event in the future or execute other commands dependent of the event severity. At the same time, a notification pops out in the right corner of your browser to inform you that the event was successfully created.
+
+Now let's get this getting-started dashboard finished and implement one last feature: we want to see our events for a machine on our detail dashboard. MindSphere offers the pre build *event table* node exactly for this purpose. Go to your *Detail* tab and create a new group called *Events* with a width of 26. Then drop the *event table* node from the *MDSP Dashboard* section in your flow and assign it to the *Events* group. Give the node a *Size* of 26 x 12. We want it to be big, to see al the details of the events. Choose the *Basic* machine in the Asset field and check these columns to show:
+- [x] Severity
+- [x] EntityId
+- [x] Timestamp
+- [x] Despriction
+- [ ] Source
+- [x] Acknowledged
+- [x] CorrlationId
+- [ ] TypeId
+- [ ] Code
+
+Then drop another *Button* node and *ui control* node in your flow. This button will take you back to the *Overview* tab. Try to configure these two nodes by yourself, so it appears on the Detail page and takes you back to the overview page when clicked.
+> Hint 1: Give the *Button* node a Size of 26 x 1
+
+> Hint 2: Send a JSON object as *msg.payload*
+
+> Hint 3: Send
+> ```JSON
+> {
+> "tab": "Overview"
+> }
+> ```
+> to change back to the Overview tab when clicked
+
+As you can see, displaying an event table and implementing a button that chages tabs can be achieved in only three nodes:
+
+![event_table](./doc/event_table.png)
+
+This will complete the content of this tutorial and your final flow should look something like this:
+
+![flowpic_7](./doc/flowpic_7.png)
+
+You finished your first dashboard! Check it out, try some things and experiment with creating events. As we all know, this dashboard is not perfect at all and has mainly the purpose to present different elements of VFC dashboarding. What would you do different? Now it's time to bring in your own ideas!
+
+# Next Steps
+
+You can extend this dashboard in many ways. See it as a starting point and add the content that you think would fit your own use case. If you are completely lost, here are some ideas what you could do:
+- Add more Data to the *Info* group
+- Create a detail dashboard for *Performance* and *Eco*
+ 1. You can create a single tab for each machine
+ 2. Or you can combine the three machines in one tab by creating a dynamic data layer
+- Implement a security check when creating an event (e.g.: Do you really want to create this event? Yes, No)
+- Alarm people automatically when an event is triggered
+- Design a dynamic text input for the triggered event
+- . . .
+
+# Questions and Answers
+Feel free to ask your questions in the [MindSphere Developer Forum](https://community.sw.siemens.com/s/topic/0TO4O000000MihsWAC).
+
+Or open an [issue](https://github.com/mindsphere/vfc-examples/issues) if you find a bug in our examples.
+
+You want to contribute? Your pull request is always welcome!!!
+
diff --git a/README.md b/README.md
index 6ac014f..98981b1 100644
--- a/README.md
+++ b/README.md
@@ -39,6 +39,8 @@ Please note, that the json-files are exported from another tenant. So their migh
| [Send SMS notifications](./sendSmsNotifications/readme.md) | Send SMS notifications and dynamically specify recipient | :star: | - |
| [Trend Prediction Example](./trendPredictionAPI/readme.md) | Application example which shows how to use trend prediction service to forecast timeseries data | :star: | - |
| [Virtual machine simulator](./virtualMachineSimulator/readme.md) | | :star: | - |
+| [Write location data to your Asset](./WriteLocationToAsset/readme.md) | Write locational information directly to your Asset using the Asset Management API | :star: | - |
+| [VFC Dashboard - Getting Started Guide](./Dashboard_getting_started/readme.md) | Create a dynamic Dashboard completely from scratch and learn the basics of VFC Dashboarding | :star: | - |
### Examples which have to be added:
| Name | Description | Complexity Rating | Prerequisites |
diff --git a/WriteLocationToAsset/IMPORT_WriteLocationToAsset.json b/WriteLocationToAsset/IMPORT_WriteLocationToAsset.json
new file mode 100644
index 0000000..673045e
--- /dev/null
+++ b/WriteLocationToAsset/IMPORT_WriteLocationToAsset.json
@@ -0,0 +1,152 @@
+[
+ {
+ "id": "f36b6875.db8608",
+ "type": "delay",
+ "z": "eeddfd21.19809",
+ "name": "",
+ "pauseType": "delay",
+ "timeout": "5",
+ "timeoutUnits": "seconds",
+ "rate": "1",
+ "nbRateUnits": "1",
+ "rateUnits": "second",
+ "randomFirst": "1",
+ "randomLast": "5",
+ "randomUnits": "seconds",
+ "drop": false,
+ "powerMode": false,
+ "x": 2140,
+ "y": 3640,
+ "wires": [
+ [
+ "50f968ae.c48ab8"
+ ]
+ ]
+ },
+ {
+ "id": "7d37f5d9.f7ee2c",
+ "type": "function",
+ "z": "eeddfd21.19809",
+ "name": "Store e-tag",
+ "func": "var data = msg.payload;\nvar tag = data[\"etag\"];\nmsg.payload = tag;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 2310,
+ "y": 3760,
+ "wires": [
+ [
+ "cd796701.b45798"
+ ]
+ ]
+ },
+ {
+ "id": "50f968ae.c48ab8",
+ "type": "function",
+ "z": "eeddfd21.19809",
+ "name": "Headers & Body",
+ "func": "var etag = flow.get('etag');\nmsg.headers = {};\nmsg.headers['If-Match'] = etag;\nvar body = {\n \n \"longitude\": 53.5125546,\n \"latitude\": 9.9763411\n}\n;\n\nmsg.payload = body;\nreturn msg;",
+ "outputs": 1,
+ "language": "javascript",
+ "noerr": 0,
+ "x": 2340,
+ "y": 3640,
+ "wires": [
+ [
+ "4777a2ca.61eeac"
+ ]
+ ]
+ },
+ {
+ "id": "4dadbb3b.047224",
+ "type": "http request",
+ "z": "eeddfd21.19809",
+ "name": "GET e-tag",
+ "method": "GET",
+ "ret": "txt",
+ "url": "",
+ "timeout": "",
+ "mindspherePath": "/api/assetmanagement/v3/assets/7cb6736dd0d74c7792727242c9e5b9d5",
+ "useMindsphereAuth": true,
+ "isAdmin": false,
+ "x": 2040,
+ "y": 3760,
+ "wires": [
+ [
+ "141262.1c759d9f"
+ ]
+ ]
+ },
+ {
+ "id": "4777a2ca.61eeac",
+ "type": "http request",
+ "z": "eeddfd21.19809",
+ "name": "PUT Location",
+ "method": "PUT",
+ "ret": "txt",
+ "url": "",
+ "timeout": "",
+ "mindspherePath": "/api/assetmanagement/v3/assets/7cb6736dd0d74c7792727242c9e5b9d5/location",
+ "useMindsphereAuth": true,
+ "isAdmin": true,
+ "x": 2550,
+ "y": 3640,
+ "wires": [
+ []
+ ]
+ },
+ {
+ "id": "62a355ae.1ce6ec",
+ "type": "inject",
+ "z": "eeddfd21.19809",
+ "name": "",
+ "topic": "",
+ "payload": "",
+ "payloadType": "date",
+ "repeat": "",
+ "repeatEnd": "0",
+ "endTime": "0",
+ "crontab": "",
+ "offset": "0",
+ "once": false,
+ "properties": "",
+ "timezone": "utc",
+ "betweentimesunit": "m",
+ "enableRuleEngine": false,
+ "showNextExecution": false,
+ "powerMode": false,
+ "x": 1824.5,
+ "y": 3679,
+ "wires": [
+ [
+ "4dadbb3b.047224",
+ "f36b6875.db8608"
+ ]
+ ]
+ },
+ {
+ "id": "141262.1c759d9f",
+ "type": "json",
+ "z": "eeddfd21.19809",
+ "name": "",
+ "pretty": false,
+ "x": 2170,
+ "y": 3760,
+ "wires": [
+ [
+ "7d37f5d9.f7ee2c"
+ ]
+ ]
+ },
+ {
+ "id": "cd796701.b45798",
+ "type": "store-context",
+ "z": "eeddfd21.19809",
+ "name": "store etag",
+ "key": "etag",
+ "context": "flow",
+ "x": 2460,
+ "y": 3760,
+ "wires": []
+ }
+]
diff --git a/WriteLocationToAsset/readme.md b/WriteLocationToAsset/readme.md
new file mode 100644
index 0000000..0cad7e7
--- /dev/null
+++ b/WriteLocationToAsset/readme.md
@@ -0,0 +1,23 @@
+# How to write location data directly to your Asset using the Asset Management API
+
+How to use this flow:
+1. Copy the json flow structure from [Here](./IMPORT_WriteLocationToAsset.json)
+2. Click Import in the VFC and paste the json data in the blank field
+3. Click Import
+4. Change the asset id's in the GET and PUT call to the id of your own asset
+5. Change the locational information by altering the body in the function node (optional)
+6. Save the flow
+
+You are done! Your flow should now look like this:
+
+![image](https://user-images.githubusercontent.com/90254123/166233405-ead98700-e29d-4f24-b1a2-54699fbd7572.png)
+
+If you execute the flow, your location is written directly to your assets static information. You can now use it in e.g. the Asset Manager and always check the current location of your Asset:
+
+
+
+https://user-images.githubusercontent.com/90254123/166235568-542ba4b4-f1ab-4f04-8ea0-b8f044007429.mp4
+
+You do not have to write all information (e.g. postal code, street address, country, ...) for the map to be functional. Writing longitude and latitude is sufficient. However, if you only sent longitude and latitude information, Asset Manager will show *now location available*. The Asset Map is still functional.
+
+> Take a look at the [MindSphere Documentation](https://documentation.mindsphere.io/MindSphere/apis/advanced-assetmanagement/api-assetmanagement-api.html) if you want to know more about the Asset Management API.