Fading - cflurin/node-red-contrib-dsm GitHub Wiki

Purpose: brightness fade-in and fade-out

Settings:

  • step: increasing/decreasing value
  • delay: time interval in milliseconds between steps

fading

Configuration

{
    "currentState": "stopped",
    "states": {
        "stopped": {
            "fade-in": "increasing",
            "fade-out": "decreasing"
        },
        "increasing": {
            "increasing": "increasing",
            "fade-out": "decreasing",
            "stop": "stopped"
        },
        "decreasing": {
            "decreasing": "decreasing",
            "fade-in": "increasing",
            "stop": "stopped"
        }
    },
    "data": {
      "brightness": 0,
      "target": 0,
      "step": 5,
      "delay": 1000
    },
    "methods": {
        "target": [
            "sm.data.target = msg.payload;",
            "msg.payload = sm.data.brightness;",
            "if (sm.data.target >= sm.data.brightness) {",
            "   sm.vector = 'increasing';",
            "} else if (sm.data.target < sm.data.brightness) {",
            "   sm.vector = 'decreasing';",
            "}",
            "if (timeout.id) {",
            "   clearTimeout(timeout.id);",
            "}",
            "sm.currentState = sm.vector;",
            "resume(sm.vector, msg);"
        ],
        "increasing": [
            "if (msg.payload < sm.data.target) {",
            "   if (msg.payload > sm.data.target) msg.payload = sm.data.target;",
            "   sm.data.brightness = msg.payload;",
            "   timeout.id = setTimeout(function() {",
            "       msg.payload = msg.payload + sm.data.step;",
            "       node.send(msg);",
            "       resume('increasing', msg);",
            "   }, sm.data.delay);",
            "} else {",
            "   sm.currentState = 'stopped';",
            "}"
        ],
        "decreasing": [
            "if (msg.payload > sm.data.target) {",
            "   if (msg.payload < sm.data.target) msg.payload = sm.data.target;",
            "   sm.data.brightness = msg.payload;",
            "   timeout.id = setTimeout(function() {",
            "       msg.payload = msg.payload - sm.data.step;",
            "       node.send(msg);",
            "       resume('decreasing', msg);",
            "   }, sm.data.delay);",
            "} else {",
            "   sm.currentState = 'stopped';",
            "}"
        ],
        "stop": [
            "clearTimeout(timeout.id);"
        ],
        "onAfterTransition": "output = false;",
        "status": {
            "fill": {
                "get": "sm.currentState==='increasing'?'yellow':sm.currentState==='decreasing'?'blue':'grey'"
            },
            "shape": "dot",
            "text": {
                "get": "sm.currentState"
            }
        }
    }
}

Flow

[{"id":"f4ba4e74.0dc6f","type":"inject","z":"6ff0723.8c6b78c","name":"","topic":"target","payload":"0","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":150,"y":1760,"wires":["2439b007.ff019"](/cflurin/node-red-contrib-dsm/wiki/"2439b007.ff019")},{"id":"d3127034.1ae32","type":"debug","z":"6ff0723.8c6b78c","name":"","active":true,"tosidebar":false,"console":false,"tostatus":true,"complete":"payload","x":510,"y":1760,"wires":[]},{"id":"2439b007.ff019","type":"dsm","z":"6ff0723.8c6b78c","name":"fading","sm_config":"{\n    \"currentState\": \"stopped\",\n    \"states\": {\n        \"stopped\": {\n            \"fade-in\": \"increasing\",\n            \"fade-out\": \"decreasing\"\n        },\n        \"increasing\": {\n            \"increasing\": \"increasing\",\n            \"fade-out\": \"decreasing\",\n            \"stop\": \"stopped\"\n        },\n        \"decreasing\": {\n            \"decreasing\": \"decreasing\",\n            \"fade-in\": \"increasing\",\n            \"stop\": \"stopped\"\n        }\n    },\n    \"data\": {\n      \"brightness\": 0,\n      \"target\": 0,\n      \"step\": 5,\n      \"delay\": 1000\n    },\n    \"methods\": {\n        \"target\": [\n            \"sm.data.target = msg.payload;\",\n            \"msg.payload = sm.data.brightness;\",\n            \"if (sm.data.target >= sm.data.brightness) {\",\n            \"   sm.vector = 'increasing';\",\n            \"} else if (sm.data.target < sm.data.brightness) {\",\n            \"   sm.vector = 'decreasing';\",\n            \"}\",\n            \"if (timeout.id) {\",\n            \"   clearTimeout(timeout.id);\",\n            \"}\",\n            \"sm.currentState = sm.vector;\",\n            \"resume(sm.vector, msg);\"\n        ],\n        \"increasing\": [\n            \"if (msg.payload < sm.data.target) {\",\n            \"   if (msg.payload > sm.data.target) msg.payload = sm.data.target;\",\n            \"   sm.data.brightness = msg.payload;\",\n            \"   timeout.id = setTimeout(function() {\",\n            \"       msg.payload = msg.payload + sm.data.step;\",\n            \"       node.send(msg);\",\n            \"       resume('increasing', msg);\",\n            \"   }, sm.data.delay);\",\n            \"} else {\",\n            \"   sm.currentState = 'stopped';\",\n            \"}\"\n        ],\n        \"decreasing\": [\n            \"if (msg.payload > sm.data.target) {\",\n            \"   if (msg.payload < sm.data.target) msg.payload = sm.data.target;\",\n            \"   sm.data.brightness = msg.payload;\",\n            \"   timeout.id = setTimeout(function() {\",\n            \"       msg.payload = msg.payload - sm.data.step;\",\n            \"       node.send(msg);\",\n            \"       resume('decreasing', msg);\",\n            \"   }, sm.data.delay);\",\n            \"} else {\",\n            \"   sm.currentState = 'stopped';\",\n            \"}\"\n        ],\n        \"stop\": [\n            \"clearTimeout(timeout.id);\"\n        ],\n        \"onAfterTransition\": \"output = false;\",\n        \"status\": {\n            \"fill\": {\n                \"get\": \"sm.currentState==='increasing'?'yellow':sm.currentState==='decreasing'?'blue':'grey'\"\n            },\n            \"shape\": \"dot\",\n            \"text\": {\n                \"get\": \"sm.currentState\"\n            }\n        }\n    }\n}","x":360,"y":1760,"wires":["d3127034.1ae32"](/cflurin/node-red-contrib-dsm/wiki/"d3127034.1ae32")},{"id":"94ca40c8.2f2c9","type":"inject","z":"6ff0723.8c6b78c","name":"","topic":"target","payload":"50","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":1800,"wires":["2439b007.ff019"](/cflurin/node-red-contrib-dsm/wiki/"2439b007.ff019")},{"id":"15aea14b.a464ff","type":"inject","z":"6ff0723.8c6b78c","name":"","topic":"target","payload":"80","payloadType":"num","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":1840,"wires":["2439b007.ff019"](/cflurin/node-red-contrib-dsm/wiki/"2439b007.ff019")},{"id":"1c05093b.a74af7","type":"ui_slider","z":"6ff0723.8c6b78c","name":"brightness","label":"{{ value }}","group":"f0e5c847.caf348","order":1,"width":0,"height":0,"passthru":true,"topic":"target","min":0,"max":"100","step":"5","x":150,"y":1700,"wires":["758444f8.ea4c6c"](/cflurin/node-red-contrib-dsm/wiki/"758444f8.ea4c6c")},{"id":"758444f8.ea4c6c","type":"dsm","z":"6ff0723.8c6b78c","name":"filter","sm_config":"{\n    \"methods\": {\n        \"onTransition\": {\n            \"name\": \"watchdog\",\n            \"param\": 1000,\n            \"do\": \"node.status({}); node.send(msg);\"\n        },\n        \"status\": {\n            \"fill\": \"blue\",\n            \"shape\": \"dot\",\n            \"text\": {\n                \"get\": \"msg.payload\"\n            }\n        }\n    }\n}","x":350,"y":1700,"wires":["2439b007.ff019"](/cflurin/node-red-contrib-dsm/wiki/"2439b007.ff019")},{"id":"7347af1e.01361","type":"inject","z":"6ff0723.8c6b78c","name":"","topic":"stop","payload":"","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":150,"y":1900,"wires":["2439b007.ff019"](/cflurin/node-red-contrib-dsm/wiki/"2439b007.ff019")},{"id":"f0e5c847.caf348","type":"ui_group","z":"","name":"Fading","tab":"3e5ea1c1.bf3bde","disp":true,"width":"6","collapse":false},{"id":"3e5ea1c1.bf3bde","type":"ui_tab","z":"","name":"Light","icon":"dashboard","order":3}]