Skip to content

Instantly share code, notes, and snippets.

@Hugobox
Last active April 13, 2021 00:49
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Hugobox/1538793825685bd8f08e4aea16ca2c74 to your computer and use it in GitHub Desktop.
Save Hugobox/1538793825685bd8f08e4aea16ca2c74 to your computer and use it in GitHub Desktop.
LED Bar-graph Display

This flow adds a 10 segments LED Bar graph display to your dashboard (like an audio peak meter). It is easily customizable to change the number of LEDS and their on/off colors.

Here's the code in the ui_template, and below you'll find a flow example

<script>
(function($scope) {
    
let amount = 10 //amount of LEDs
let label = "LED bar Graph"
 
let on1 = "#00FF00"
let off1 = "#006600"
let on2 = "#FFFF00"
let off2 = "#666600"
let on3 = "#FF0000"
let off3 = "#660000"

let threshold1 = 1/2 // the limit between color 1 and color 2
let threshold2 = 4/5 //  the limit between color 2 and color 3

var bargraph = new Array(amount).fill("#000000")

$scope.$watch('msg', function() {
    
if ($scope.msg){
    if ($scope.msg.hasOwnProperty('payload') && typeof $scope.msg.payload == "number"){
        $scope.msg.label = label
        $scope.msg.payload = parseInt($scope.msg.payload)
    
        if ($scope.msg.payload > amount){
            $scope.msg.payload = amount
        }
        for (var i = 0; i < $scope.msg.payload; i++){
            if (i < amount*threshold1){
                bargraph[i] = on1
            }else if (i < amount*threshold2){
                bargraph[i] = on2
            }else{
                bargraph[i] = on3
            }
        }
        for (var i = $scope.msg.payload; i < amount; i++){
            if (i < amount*threshold1){
                bargraph[i] = off1
            }else if (i < amount*threshold2){
                bargraph[i] = off2
            }else{
                bargraph[i] = off3
            }
        }
        $scope.msg.bargraph = bargraph.reverse()
    }else if (typeof $scope.msg.payload !== "number"){
        $scope.msg = {"bargraph":[...bargraph], "payload": 0, "label":"Led Bar Graph"}
    }   
}else{
    $scope.msg = {"bargraph":[...bargraph], "payload": 0, "label":"Led Bar Graph"}
}
    });
})(scope);
</script>

<style>
.bargraph {
    float: right;
    padding: 3px;
    width: 3px;
    height: 10px;
    margin: 4px 2px 8px 0px;
    border-radius: 0%;
}
</style>

<div>{{msg.label}}
<span ng-repeat="led in msg.bargraph track by $index">
    <span class="bargraph" style="background-color: {{led}}; box-shadow: black 0 -1px 1px 0px, inset black  0 -1px 4px, {{led}} 0 3px 15px;"></span>
</span>
</div>
[
{
"id": "45b3bd91.bf2d64",
"type": "inject",
"z": "dc84661.55bfb98",
"name": "",
"topic": "",
"payload": "1",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 250,
"y": 180,
"wires": [
[
"4f9e4d92.50e484"
]
]
},
{
"id": "c5b9974.41e9f68",
"type": "inject",
"z": "dc84661.55bfb98",
"name": "",
"topic": "",
"payload": "2",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 250,
"y": 220,
"wires": [
[
"4f9e4d92.50e484"
]
]
},
{
"id": "7d9a5a99.bfbee4",
"type": "inject",
"z": "dc84661.55bfb98",
"name": "",
"topic": "",
"payload": "3",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 250,
"y": 260,
"wires": [
[
"4f9e4d92.50e484"
]
]
},
{
"id": "80d4cde3.d1f6a",
"type": "inject",
"z": "dc84661.55bfb98",
"name": "",
"topic": "",
"payload": "4",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 250,
"y": 300,
"wires": [
[
"4f9e4d92.50e484"
]
]
},
{
"id": "ddb93c3b.31079",
"type": "inject",
"z": "dc84661.55bfb98",
"name": "",
"topic": "",
"payload": "5",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 250,
"y": 340,
"wires": [
[
"4f9e4d92.50e484"
]
]
},
{
"id": "fb30e141.81e7b",
"type": "inject",
"z": "dc84661.55bfb98",
"name": "",
"topic": "",
"payload": "6",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 250,
"y": 380,
"wires": [
[
"4f9e4d92.50e484"
]
]
},
{
"id": "91699d2b.0de8",
"type": "inject",
"z": "dc84661.55bfb98",
"name": "",
"topic": "",
"payload": "7",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 250,
"y": 420,
"wires": [
[
"4f9e4d92.50e484"
]
]
},
{
"id": "daa5a739.f7f4b8",
"type": "inject",
"z": "dc84661.55bfb98",
"name": "",
"topic": "",
"payload": "8",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 250,
"y": 460,
"wires": [
[
"4f9e4d92.50e484"
]
]
},
{
"id": "7d9d8fd2.ef72c",
"type": "inject",
"z": "dc84661.55bfb98",
"name": "",
"topic": "",
"payload": "9",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 250,
"y": 500,
"wires": [
[
"4f9e4d92.50e484"
]
]
},
{
"id": "aa6b29c1.3ba638",
"type": "inject",
"z": "dc84661.55bfb98",
"name": "",
"topic": "",
"payload": "10",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 250,
"y": 540,
"wires": [
[
"4f9e4d92.50e484"
]
]
},
{
"id": "e55cf93d.8f2df8",
"type": "inject",
"z": "dc84661.55bfb98",
"name": "",
"topic": "",
"payload": "11",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 250,
"y": 580,
"wires": [
[
"4f9e4d92.50e484"
]
]
},
{
"id": "4f9e4d92.50e484",
"type": "ui_template",
"z": "dc84661.55bfb98",
"group": "b03bb86e.990f38",
"name": "LED Bar-graph Display",
"order": 13,
"width": "0",
"height": "0",
"format": "<script>\n(function($scope) {\n \nlet amount = 10 //amount of LEDs\nlet label = \"LED bar Graph\"\n \nlet on1 = \"#00FF00\"\nlet off1 = \"#006600\"\nlet on2 = \"#FFFF00\"\nlet off2 = \"#666600\"\nlet on3 = \"#FF0000\"\nlet off3 = \"#660000\"\n\nlet threshold1 = 1/2 // the limit between color 1 and color 2\nlet threshold2 = 4/5 // the limit between color 2 and color 3\n\nvar bargraph = new Array(amount).fill(\"#000000\")\n\n$scope.$watch('msg', function() {\n \nif ($scope.msg){\n if ($scope.msg.hasOwnProperty('payload') && typeof $scope.msg.payload == \"number\"){\n $scope.msg.label = label\n $scope.msg.payload = parseInt($scope.msg.payload)\n \n if ($scope.msg.payload > amount){\n $scope.msg.payload = amount\n }\n for (var i = 0; i < $scope.msg.payload; i++){\n if (i < amount*threshold1){\n bargraph[i] = on1\n }else if (i < amount*threshold2){\n bargraph[i] = on2\n }else{\n bargraph[i] = on3\n }\n }\n for (var i = $scope.msg.payload; i < amount; i++){\n if (i < amount*threshold1){\n bargraph[i] = off1\n }else if (i < amount*threshold2){\n bargraph[i] = off2\n }else{\n bargraph[i] = off3\n }\n }\n $scope.msg.bargraph = bargraph.reverse()\n }else if (typeof $scope.msg.payload !== \"number\"){\n $scope.msg = {\"bargraph\":[...bargraph], \"payload\": 0, \"label\":\"Led Bar Graph\"}\n } \n}else{\n $scope.msg = {\"bargraph\":[...bargraph], \"payload\": 0, \"label\":\"Led Bar Graph\"}\n}\n });\n})(scope);\n</script>\n\n<style>\n.bargraph {\n float: right;\n padding: 3px;\n width: 3px;\n height: 10px;\n margin: 4px 2px 8px 0px;\n border-radius: 0%;\n}\n</style>\n\n<div>{{msg.label}}\n<span ng-repeat=\"led in msg.bargraph track by $index\">\n <span class=\"bargraph\" style=\"background-color: {{led}}; box-shadow: black 0 -1px 1px 0px, inset black 0 -1px 4px, {{led}} 0 3px 15px;\"></span>\n</span>\n</div>\n",
"storeOutMessages": false,
"fwdInMessages": true,
"templateScope": "local",
"x": 600,
"y": 300,
"wires": [
[]
]
},
{
"id": "b03bb86e.990f38",
"type": "ui_group",
"z": "",
"name": "Default",
"tab": "bc78a8d.fba5b58",
"disp": true,
"width": "6",
"collapse": false
},
{
"id": "bc78a8d.fba5b58",
"type": "ui_tab",
"z": "",
"name": "Dashboard",
"icon": "dashboard",
"order": 2
}
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment