Skip to content

Instantly share code, notes, and snippets.

@smcgann99
Last active April 23, 2022 14:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save smcgann99/4fa6884882c7f37fad5ff354c3e6fa53 to your computer and use it in GitHub Desktop.
Save smcgann99/4fa6884882c7f37fad5ff354c3e6fa53 to your computer and use it in GitHub Desktop.
LEEDS UK Bin Dates

Flow to display next several weeks of bin collections in the Leeds (UK) area.

It makes use of a small script to download the dm_jobs.csv file and then uses grep to extract all the "jobs" that match your address. You will need to create the getDates.sh script and edit the "job number" 791420 in this case -

#!/bin/bash -ex

cd /home/pi/.node-red/my-data

rm -f dates.txt

rm -f dm_jobs.csv

wget http://opendata.leeds.gov.uk/downloads/bins/dm_jobs.csv

grep -E 791420 dm_jobs.csv > dates.txt

You can find your job number by downloading the Household premises.csv file from here and looking up your address -

https://datamillnorth.org/dataset/household-waste-collections

You may need to edit the flow to change the path in the exec node and template node depending on where you choose to put the script and images files. You can just download the 3 bin images here or create your own ;-)

Untitled GREEN BROWN BLACK

[{"id":"9765237e3099a326","type":"tab","label":"Flow 4","disabled":false,"info":"","env":[]},{"id":"ef2c0fa3aaf3f07d","type":"exec","z":"9765237e3099a326","command":"/home/pi/.node-red/my-data/getDates.sh","addpay":"","append":"","useSpawn":"false","timer":"","winHide":false,"oldrc":false,"name":"Get Bin Dates","x":820,"y":420,"wires":[[],[],["22250e27cd8d645e"]]},{"id":"9ebd5fdcf78affb3","type":"csv","z":"9765237e3099a326","name":"","sep":",","hdrin":"","hdrout":"none","multi":"mult","ret":"\\n","temp":"","skip":"0","strings":true,"include_empty_strings":"","include_null_values":"","x":1150,"y":420,"wires":[["e53e5fb6d90e2308"]]},{"id":"22250e27cd8d645e","type":"file in","z":"9765237e3099a326","name":"read dates","filename":"/home/pi/.node-red/my-data/dates.txt","format":"utf8","chunk":false,"sendError":false,"encoding":"none","allProps":false,"x":1010,"y":420,"wires":[["9ebd5fdcf78affb3"]]},{"id":"e53e5fb6d90e2308","type":"function","z":"9765237e3099a326","name":"Add Dates","func":"let binDates = []\n\nfor (let index = 0; index < msg.payload.length; index++) {\n let date = msg.payload[index].col3.split('/')\n date = Date.UTC(parseInt(\"20\" + date[2]), date[1] - 1, date[0])\n binDates.push({ timestamp: date, bin: msg.payload[index].col2, date: msg.payload[index].col3 })\n}\n\nbinDates.sort((b, a) => b.timestamp - a.timestamp); // b - a for reverse sort\n\nflow.set(\"binDates\", binDates)\n\nmsg.payload=binDates\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1290,"y":420,"wires":[["ab98afadfb47de29"]],"info":"let binDates = flow.get(\"binDates\") || {}\r\n\r\n\r\nfor (let index = 0; index < msg.payload.length; index++) {\r\n let date = msg.payload[index].col3.split('/')\r\n date = Date.UTC(parseInt(\"20\" + date[2]),date[1]-1,date[0])\r\n \r\n if (!binDates[date]) {\r\n binDates[date] = { bin: msg.payload[index].col2, date: msg.payload[index].col3}\r\n \r\n }\r\n \r\n}\r\n\r\nflow.set(\"binDates\",binDates)\r\n\r\n\r\nreturn msg;\r\n\r\n\r\n\r\n"},{"id":"1d522aa443d44106","type":"cronplus","z":"9765237e3099a326","name":"1st of Month","outputField":"payload","timeZone":"","persistDynamic":true,"commandResponseMsgOutput":"output1","outputs":1,"options":[{"name":"schedule1","topic":"topic1","payloadType":"default","payload":"","expressionType":"cron","expression":"0 5 0 1 * ? *","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":630,"y":420,"wires":[["ef2c0fa3aaf3f07d"]]},{"id":"2d88be0f46aaedc1","type":"ui_template","z":"9765237e3099a326","group":"acf0ac46b53c1e66","name":"Green","order":2,"width":"6","height":"5","format":"<style>\n .bin_green {\n border: 5px solid #00a550;\n border-radius: 12px;\n font-size: 25px;\n }\n</style>\n\n<table>\n <tr>\n <td>\n <img src=\"/images/{{msg.payload[0][0].bin}}.png\" style=\"width: 130px\" >\n </td>\n <td>\n <div ng-repeat=\"item in msg.payload[0]\">\n {{item.date}}\n </div>\n </td>\n </tr>\n</table>","storeOutMessages":false,"fwdInMessages":false,"resendOnRefresh":true,"templateScope":"local","className":"bin_green","x":1470,"y":360,"wires":[[]],"info":"<style>\r\n md-checkbox .md-label {\r\n top: unset;\r\n }\r\n</style>\r\n\r\n<form>\r\n <fieldset style=\"width:90%\">\r\n <legend>Select Zones</legend>\r\n <div layout=\"row\" layout-wrap flex>\r\n <div flex=\"45\" ng-repeat=\"item in msg.payload\">\r\n <md-checkbox ng-model=\"item.value\" aria-label=\"checkbox\"> {{item.name}}</md-checkbox>\r\n\r\n </div>\r\n </div>\r\n </fieldset>\r\n\r\n <fieldset style=\"width:90%\">\r\n <md-button ng-click=\"send(msg)\">\r\n Refresh\r\n </md-button>\r\n <md-button ng-click=\"send({select:'all'})\">\r\n All\r\n </md-button>\r\n <md-button ng-click=\"send({select:'none'})\">\r\n None\r\n </md-button>\r\n </fieldset>\r\n</form>"},{"id":"557f685755b061d2","type":"inject","z":"9765237e3099a326","name":"refresh","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":1170,"y":360,"wires":[["ab98afadfb47de29"]]},{"id":"4e7156631b569b51","type":"ui_template","z":"9765237e3099a326","group":"acf0ac46b53c1e66","name":"Brown","order":3,"width":"6","height":"5","format":"<style>\n .bin_brown {\n border: 5px solid #80612e;\n border-radius: 12px;\n font-size: 25px;\n }\n</style>\n\n\n<table>\n <tr>\n <td>\n <img src=\"/images/{{msg.payload[0][0].bin}}.png\" style=\"width: 130px\" >\n </td>\n <td>\n <div ng-repeat=\"item in msg.payload[0]\">\n {{item.date}}\n </div>\n </td>\n </tr>\n</table>\n","storeOutMessages":false,"fwdInMessages":false,"resendOnRefresh":true,"templateScope":"local","className":"bin_brown","x":1470,"y":320,"wires":[[]],"info":"<style>\r\n md-checkbox .md-label {\r\n top: unset;\r\n }\r\n</style>\r\n\r\n<form>\r\n <fieldset style=\"width:90%\">\r\n <legend>Select Zones</legend>\r\n <div layout=\"row\" layout-wrap flex>\r\n <div flex=\"45\" ng-repeat=\"item in msg.payload\">\r\n <md-checkbox ng-model=\"item.value\" aria-label=\"checkbox\"> {{item.name}}</md-checkbox>\r\n\r\n </div>\r\n </div>\r\n </fieldset>\r\n\r\n <fieldset style=\"width:90%\">\r\n <md-button ng-click=\"send(msg)\">\r\n Refresh\r\n </md-button>\r\n <md-button ng-click=\"send({select:'all'})\">\r\n All\r\n </md-button>\r\n <md-button ng-click=\"send({select:'none'})\">\r\n None\r\n </md-button>\r\n </fieldset>\r\n</form>"},{"id":"bc989aae29e34d4c","type":"ui_template","z":"9765237e3099a326","group":"acf0ac46b53c1e66","name":"Black","order":1,"width":"6","height":"5","format":"<style>\n .bin_black {\n border: 5px solid black;\n border-radius: 12px;\n font-size: 25px;\n }\n</style>\n\n<table>\n <tr>\n <td>\n <img src=\"/images/{{msg.payload[0][0].bin}}.png\" style=\"width: 130px\" >\n </td>\n <td>\n <div ng-repeat=\"item in msg.payload[0]\">\n {{item.date}}\n </div>\n </td>\n </tr>\n</table>","storeOutMessages":false,"fwdInMessages":false,"resendOnRefresh":true,"templateScope":"local","className":"bin_black","x":1470,"y":400,"wires":[[]],"info":"<style>\r\n md-checkbox .md-label {\r\n top: unset;\r\n }\r\n</style>\r\n\r\n<form>\r\n <fieldset style=\"width:90%\">\r\n <legend>Select Zones</legend>\r\n <div layout=\"row\" layout-wrap flex>\r\n <div flex=\"45\" ng-repeat=\"item in msg.payload\">\r\n <md-checkbox ng-model=\"item.value\" aria-label=\"checkbox\"> {{item.name}}</md-checkbox>\r\n\r\n </div>\r\n </div>\r\n </fieldset>\r\n\r\n <fieldset style=\"width:90%\">\r\n <md-button ng-click=\"send(msg)\">\r\n Refresh\r\n </md-button>\r\n <md-button ng-click=\"send({select:'all'})\">\r\n All\r\n </md-button>\r\n <md-button ng-click=\"send({select:'none'})\">\r\n None\r\n </md-button>\r\n </fieldset>\r\n</form>"},{"id":"ab98afadfb47de29","type":"function","z":"9765237e3099a326","name":"","func":"let binDates = flow.get(\"binDates\")\nvar brown = []\nvar green = []\nvar black = []\nbrown.push(binDates.filter(e => e.bin === \"BROWN\"))\ngreen.push(binDates.filter(e => e.bin === \"GREEN\"))\nblack.push(binDates.filter(e => e.bin === \"BLACK\"))\nlet msg1 = { payload: brown }\nlet msg2 = { payload: green }\nlet msg3 = { payload: black }\nreturn [msg1, msg2, msg3]","outputs":3,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1320,"y":360,"wires":[["4e7156631b569b51"],["2d88be0f46aaedc1"],["bc989aae29e34d4c","6544e0f202163bec"]]},{"id":"6544e0f202163bec","type":"debug","z":"9765237e3099a326","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1490,"y":440,"wires":[]},{"id":"acf0ac46b53c1e66","type":"ui_group","name":"Bins","tab":"6ef0f00b7932b858","order":1,"disp":false,"width":"6","collapse":false,"className":""},{"id":"6ef0f00b7932b858","type":"ui_tab","name":"Bins","icon":"iconify-fa-solid:trash-alt","order":20,"disabled":false,"hidden":false}]
#!/bin/bash -ex
cd /home/pi/.node-red/my-data
rm -f dates.txt
rm -f dm_jobs.csv
wget http://opendata.leeds.gov.uk/downloads/bins/dm_jobs.csv
grep -E 791420 dm_jobs.csv > dates.txt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment