Persist chart data over Node Red restart - cflurin/node-red-contrib-dsm GitHub Wiki

The node stores the chart data from the chart output 1. On restart the stored data is retrieved and sent to the chart input. The data can be retrieved or cleared at any time by sending the corresponding topics (retrieve, clear) to the input.

The data are stored in a local variable (context).

memory2

Configuration

{
    "currentState": "retrieved",
    "states": {
        "retrieved": {
            "retrieve": "retrieved",
            "store": "stored",
            "clear": "cleared"
        },
        "stored": {
            "retrieve": "retrieved",
            "store": "stored",
            "clear": "cleared"
        },
        "cleared": {
            "retrieve": "retrieved",
            "store": "stored",
            "clear": "cleared"
        }
    },
    "data": {
        "name": "chart_data"
    },
    "methods": {
        "init": [
            "msg = {};",
            "msg.payload = context.get(sm.data.name);",
            "if (typeof msg.payload !== 'undefined') {",
            "   msg.token = 'skip';",
            "   node.send(msg);",
            "}"
        ],
        "retrieve": [
            "msg.payload = context.get(sm.data.name);",
            "if (typeof msg.payload !== 'undefined') {",
            "   msg.token = 'skip';",
            "} else {",
            "   output = false;",
            "}"
        ],
        "store": [
            "context.set(sm.data.name, msg.payload);",
            "output = false;"
        ],
        "clear": [
            "msg.payload = [];",
            "msg.token = 'skip';"
        ],
        "default": [
            "if (msg.token !== 'skip') {",
            "   resume('store', msg);",
            "}"
        ],
        "status": {
            "fill": {
                "get": "sm.currentState === 'cleared' ? 'yellow' : 'green';"
            },
            "shape": {
                "get": "sm.currentState === 'cleared' ? 'ring' : 'dot';"
            },
            "text": {
                "get": "sm.currentState;"
            }
        }
    }
}

Flow

[{"id":"bb6b1f22.2dfa5","type":"ui_chart","z":"6da90f72.dff58","name":"test","group":"c72a8a5.c6a7378","order":3,"width":"0","height":"0","label":"test","chartType":"line","legend":"false","xformat":"HH:mm","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"86400","cutout":"","useOneColor":false,"colors":["#1f77b4","#ff7f0e","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":330,"y":860,"wires":["9cf7b20f.8dc02"],[](/cflurin/node-red-contrib-dsm/wiki/"9cf7b20f.8dc02"],[)},{"id":"1e97feb1.ac7a91","type":"inject","z":"6da90f72.dff58","name":"","topic":"retrieve","payload":"","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":150,"y":940,"wires":["9cf7b20f.8dc02"](/cflurin/node-red-contrib-dsm/wiki/"9cf7b20f.8dc02")},{"id":"9de53239.25e85","type":"inject","z":"6da90f72.dff58","name":"","topic":"clear","payload":"","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":150,"y":900,"wires":["9cf7b20f.8dc02"](/cflurin/node-red-contrib-dsm/wiki/"9cf7b20f.8dc02")},{"id":"195a0d61.bffe33","type":"inject","z":"6da90f72.dff58","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":800,"wires":["60c5f9fa.89c788"](/cflurin/node-red-contrib-dsm/wiki/"60c5f9fa.89c788")},{"id":"60c5f9fa.89c788","type":"random","z":"6da90f72.dff58","name":"","low":"1","high":"10","inte":"true","property":"payload","x":320,"y":800,"wires":["bb6b1f22.2dfa5"](/cflurin/node-red-contrib-dsm/wiki/"bb6b1f22.2dfa5")},{"id":"9cf7b20f.8dc02","type":"dsm","z":"6da90f72.dff58","name":"memory","sm_config":"{\n    \"currentState\": \"retrieved\",\n    \"states\": {\n        \"retrieved\": {\n            \"retrieve\": \"retrieved\",\n            \"store\": \"stored\",\n            \"clear\": \"cleared\"\n        },\n        \"stored\": {\n            \"retrieve\": \"retrieved\",\n            \"store\": \"stored\",\n            \"clear\": \"cleared\"\n        },\n        \"cleared\": {\n            \"retrieve\": \"retrieved\",\n            \"store\": \"stored\",\n            \"clear\": \"cleared\"\n        }\n    },\n    \"data\": {\n        \"name\": \"chart_data\"\n    },\n    \"methods\": {\n        \"init\": [\n            \"msg = {};\",\n            \"msg.payload = context.get(sm.data.name);\",\n            \"if (typeof msg.payload !== 'undefined') {\",\n            \"   msg.token = 'skip';\",\n            \"   node.send(msg);\",\n            \"}\"\n        ],\n        \"retrieve\": [\n            \"msg.payload = context.get(sm.data.name);\",\n            \"if (typeof msg.payload !== 'undefined') {\",\n            \"   msg.token = 'skip';\",\n            \"} else {\",\n            \"   output = false;\",\n            \"}\"\n        ],\n        \"store\": [\n            \"context.set(sm.data.name, msg.payload);\",\n            \"output = false;\"\n        ],\n        \"clear\": [\n            \"msg.payload = [];\",\n            \"msg.token = 'skip';\"\n        ],\n        \"default\": [\n            \"if (msg.token !== 'skip') {\",\n            \"   resume('store', msg);\",\n            \"}\"\n        ],\n        \"status\": {\n            \"fill\": {\n                \"get\": \"sm.currentState === 'cleared' ? 'yellow' : 'green';\"\n            },\n            \"shape\": {\n                \"get\": \"sm.currentState === 'cleared' ? 'ring' : 'dot';\"\n            },\n            \"text\": {\n                \"get\": \"sm.currentState;\"\n            }\n        }\n    }\n}\n","x":350,"y":920,"wires":["bb6b1f22.2dfa5"](/cflurin/node-red-contrib-dsm/wiki/"bb6b1f22.2dfa5")},{"id":"c72a8a5.c6a7378","type":"ui_group","z":"","name":"Charts","tab":"a8b1385e.93cb58","order":1,"disp":true,"width":"7","collapse":true},{"id":"a8b1385e.93cb58","type":"ui_tab","z":"","name":"ramp-themostat","icon":"dashboard"}]