Nightscout Pixel
Nightscout Pixel is a simple monitor for current Nighscout CGM data – direction, sensor glucose value, delta.
About this flow
| System | Node-RED |
|---|---|
| AWTRIX version | AWTRIX 3 |
| Topic | Miscellaneous |
| Built by | fabkai |
| File | wyMWodvk5nxX.json · 9.3 KB |
| Icons | 8 |
| Published | 20 Apr 2024 |
| Downloads | 64 |
Is this your flow?
If you created this flow, open your saved edit link to add it to your account. You can then manage it whenever you sign in. Adding it to your account replaces the edit link.
Flow description
A JSON with the current Nightscout data is queried at a defined interval via the Nightscout V1 REST API (the implementation requires an access token created in the Subjects - People, Devices, etc. section of the Nightscout Admin Tools). The data from the JSON file is then processed in a function to display direction, sensor glucose value and delta. It can also be displayed if no more current data is available for a defined period of time. The icons and values are displayed via a custom app using MQTT (MQTT Broker is required).
wyMWodvk5nxX.json
[
{
"id": "7057b52ef757d606",
"type": "tab",
"label": "Awtrix-Nightscout-Pixel",
"disabled": false,
"info": "",
"env": []
},
{
"id": "e7101a5caeb46470",
"type": "inject",
"z": "7057b52ef757d606",
"name": "Start",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "5",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 90,
"y": 180,
"wires": [
[
"1ac6b90937457bf7"
]
]
},
{
"id": "25b695a46aa59b69",
"type": "change",
"z": "7057b52ef757d606",
"name": "Command: Data query",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "curl -H \"Content-Type: application/json\" -H \"Authorization: Bearer TOKEN\" -X GET https://NIGHTSCOUT_URL:PORT/api/v1/entries.json?count=1",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 760,
"y": 180,
"wires": [
[
"1e1f42891a8b5b97"
]
]
},
{
"id": "fd30a342bc5bed2f",
"type": "exec",
"z": "7057b52ef757d606",
"command": "",
"addpay": "payload",
"append": "",
"useSpawn": "false",
"timer": "",
"winHide": false,
"oldrc": false,
"name": "cURL",
"x": 1090,
"y": 180,
"wires": [
[
"317d17a92e168a53",
"8f8bc645d83637d5"
],
[],
[]
]
},
{
"id": "7a090c427aadeb60",
"type": "function",
"z": "7057b52ef757d606",
"name": "Function: Create Pixel",
"func": "var glucose = msg.payload[0].sgv; // Data from Nightscout JSON\nvar delta = Math.round(msg.payload[0].delta);\nvar direction = msg.payload[0].direction;\nvar measuringtime = msg.payload[0].date;\nvar now = new Date();\nvar timestamp = now.getTime();\nvar nodataoffset = 660000; // Offset in milliseconds to the last measurement\nvar icon = \"\";\nvar color = \"\";\n\nif (delta >= 0) {\n delta = '+' + delta; // Insert plus sign for positive delta\n}\n\nif ((measuringtime + nodataoffset) < timestamp) {\n icon = 39552; // Set NoData icon if no data is available after the selected offset time\n} else { // Set icon depending on direction\n if (direction == \"SingleUp\") {\n icon = 39545;\n } else if (direction == \"SingleDown\") {\n icon = 39546;\n } else if (direction == \"Flat\") {\n icon = 39547;\n } else if (direction == \"FortyFiveDown\") {\n icon = 39548;\n } else if (direction == \"FortyFiveUp\") {\n icon = 39549;\n } else if (direction == \"DoubleUp\") {\n icon = 39550;\n } else if (direction == \"DoubleDown\") {\n icon = 39551;\n } \n}\n\n// Create payload to display on Awtrix depending on glucose level\nif (glucose > 250) {\n\n if ((measuringtime + nodataoffset) < timestamp) {\n color = [255, 255, 255];\n } else {\n color = [247, 133, 31];\n }\n\n msg.payload = {\n \"text\": glucose + ' ' + delta,\n \"icon\": icon,\n \"color\": color,\n \"pushIcon\": 0,\n \"save\": true,\n \"textCase\": 2\n };\n return [{ payload: msg.payload }, null];\n} else if (glucose < 70) {\n\n if ((measuringtime + nodataoffset) < timestamp) {\n color = [255, 255, 255];\n } else {\n color = [255, 0, 0];\n }\n\n msg.payload = {\n \"text\": glucose + ' ' + delta,\n \"icon\": icon,\n \"color\": color,\n \"pushIcon\": 0,\n \"save\": true,\n \"textCase\": 2\n };\n return [{ payload: msg.payload }, null];\n} else if (glucose => 70 && glucose <= 250) {\n\n if ((measuringtime + nodataoffset) < timestamp) {\n color = [255, 255, 255];\n } else {\n color = [0, 255, 0];\n }\n \n msg.payload = {\n \"text\": glucose + ' ' + delta,\n \"icon\": icon,\n \"color\": color,\n \"pushIcon\": 0,\n \"save\": true,\n \"textCase\": 2\n };\n return [{ payload: msg.payload }, null];\n}\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1420,
"y": 180,
"wires": [
[
"d3ef3ba51867a7aa"
]
]
},
{
"id": "317d17a92e168a53",
"type": "debug",
"z": "7057b52ef757d606",
"name": "Debug: Nightscout JSON",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1290,
"y": 220,
"wires": []
},
{
"id": "1ac6b90937457bf7",
"type": "change",
"z": "7057b52ef757d606",
"name": "Command: Token request",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "curl -X GET https://NIGHTSCOUT_URL:PORT/api/v2/authorization/request/ACCESS_TOKEN -H \"Content-Type: application/json\"",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 270,
"y": 180,
"wires": [
[
"018aaebd60f06dff"
]
]
},
{
"id": "018aaebd60f06dff",
"type": "exec",
"z": "7057b52ef757d606",
"command": "",
"addpay": "payload",
"append": "",
"useSpawn": "false",
"timer": "",
"winHide": false,
"oldrc": false,
"name": "cURL",
"x": 450,
"y": 180,
"wires": [
[
"a3561344ac2dae6d"
],
[],
[]
]
},
{
"id": "a3561344ac2dae6d",
"type": "json",
"z": "7057b52ef757d606",
"name": "parsing",
"property": "payload",
"action": "",
"pretty": false,
"x": 580,
"y": 180,
"wires": [
[
"25b695a46aa59b69",
"360750b08aaad716"
]
]
},
{
"id": "360750b08aaad716",
"type": "change",
"z": "7057b52ef757d606",
"name": "save token",
"rules": [
{
"t": "set",
"p": "Nightscout.Token",
"pt": "flow",
"to": "payload.token",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 730,
"y": 220,
"wires": [
[]
]
},
{
"id": "1e1f42891a8b5b97",
"type": "change",
"z": "7057b52ef757d606",
"name": "insert token",
"rules": [
{
"t": "change",
"p": "payload",
"pt": "msg",
"from": "TOKEN",
"fromt": "str",
"to": "Nightscout.Token",
"tot": "flow"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 950,
"y": 180,
"wires": [
[
"fd30a342bc5bed2f"
]
]
},
{
"id": "d3ef3ba51867a7aa",
"type": "mqtt out",
"z": "7057b52ef757d606",
"name": "Nightscout Custom App",
"topic": "PREFIX/custom/Nightscout",
"qos": "1",
"retain": "false",
"respTopic": "",
"contentType": "",
"userProps": "",
"correl": "",
"expiry": "",
"broker": "326ea0d44da2b88f",
"x": 1650,
"y": 180,
"wires": []
},
{
"id": "8f8bc645d83637d5",
"type": "json",
"z": "7057b52ef757d606",
"name": "parsing",
"property": "payload",
"action": "",
"pretty": false,
"x": 1240,
"y": 180,
"wires": [
[
"7a090c427aadeb60"
]
]
},
{
"id": "326ea0d44da2b88f",
"type": "mqtt-broker",
"name": "",
"broker": "",
"port": "1883",
"clientid": "",
"autoConnect": true,
"usetls": false,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"birthMsg": {},
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"closeMsg": {},
"willTopic": "",
"willQos": "0",
"willPayload": "",
"willMsg": {},
"userProps": "",
"sessionExpiry": ""
}
]
This flow uses the following icons. Add them to your AWTRIX along with the flow.
8×8 px
8×8 px
8×8 px
8×8 px
8×8 px
8×8 px
8×8 px
8×8 px
Sign in to download these icons or send them to your AWTRIX.
Discussion 0
Ask a question, suggest a change or share how you use it.
No comments yet. Start the conversation.
More flows for Node-RED or Miscellaneous
Something wrong with this flow? Report it.
Have an idea?
Sign in to ask questions and join the conversation.