Widgetlords Controller - Node-Red, Raspberry Pi Controller Build

FischAutoTechGarten

Community Member
Review score
+0 /0 /-0
View Badges
Joined
Mar 19, 2020
Messages
37
Reaction score
40
Review score
+0 /0 /-0
Rating - 0%
0   0   0
Your temps look really good on the Pi 4. If it starts to concern you as the summer warms up and you are pushing the CPU a bit more with increased monitoring/control activity, I recommend the Pimoroni
Fan SHIM. It was 105 here today (southern AZ about 1/2 hr from the Mex border), so I kept my home office at about 81-82degF... My RaspberryPi4 CPU stayed right around 50degC. Like you I have the Atlas-Scientific Tentacle T3 installed.. The Pimoroni is a nice fit. Only kicks on on system boot up and when I am doing allot of interaction with the Dashboard on the local 8" LCD (you won't have that issue)

Pimoroni Fan SHIM

fan-shim-zoom_1024x1024.jpg
 
AS
OP
OP
MaddyP

MaddyP

'Til Reefdom Come...
Review score
+0 /0 /-0
View Badges
Joined
Jul 21, 2016
Messages
1,905
Reaction score
4,524
Review score
+0 /0 /-0
Location
Vancouver, WA
Rating - 0%
0   0   0
Your temps look really good on the Pi 4. If it starts to concern you as the summer warms up and you are pushing the CPU a bit more with increased monitoring/control activity, I recommend the Pimoroni
Fan SHIM. It was 105 here today (southern AZ about 1/2 hr from the Mex border), so I kept my home office at about 81-82degF... My RaspberryPi4 CPU stayed right around 50degC. Like you I have the Atlas-Scientific Tentacle T3 installed.. The Pimoroni is a nice fit. Only kicks on on system boot up and when I am doing allot of interaction with the Dashboard on the local 8" LCD (you won't have that issue)

Pimoroni Fan SHIM

fan-shim-zoom_1024x1024.jpg
Not sure if this will fit between the Pi and Tentacle board...but it might be a consideration. While putting together the ezo board flows, the pi hit 56 degrees at ~12% CPU load.
 
www.dinkinsaquaticgardens.com
OP
OP
MaddyP

MaddyP

'Til Reefdom Come...
Review score
+0 /0 /-0
View Badges
Joined
Jul 21, 2016
Messages
1,905
Reaction score
4,524
Review score
+0 /0 /-0
Location
Vancouver, WA
Rating - 0%
0   0   0
Probes are operational! It isn't perfect, but all the major functionality is there.

This flow queries your Pi on boot to find which I2C addresses are in use, then sends a "Status" command to those I2C addresses to see if they respond with an expected Ezo board response. If so, it sets some flow context variables assigning I2C address to Ezo board. If you change the I2C address, it triggers the scan again and variables are updated.

Calibration is a little clunky but works as expected. Eventually I'll get around to developing a template for handling calibrations.

I'm not using the EC/DO boards at the moment, but I included them in the flow. Enabling the nodes will allow visibility and display properly on the dashboard.


1588889142127.png


1588889110106.png


And here is the flow!

Code:
[{"id":"3e1670d8.f89fb","type":"tab","label":"Ezo Probes","disabled":false,"info":""},{"id":"bcb586e4.19f188","type":"ui_switch","z":"3e1670d8.f89fb","name":"LED pH","label":"LED","tooltip":"","group":"a4d910e0.e5e71","order":5,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"ph,on","onvalueType":"str","onicon":"","oncolor":"","offvalue":"ph,off","offvalueType":"str","officon":"","offcolor":"","x":100,"y":540,"wires":[["9dc4d5ee.c7bb88"]]},{"id":"d8a5ccca.9a1ce","type":"ui_button","z":"3e1670d8.f89fb","name":"Factory Reset pH","group":"a4d910e0.e5e71","order":10,"width":0,"height":0,"passthru":false,"label":"Factory Reset","tooltip":"","color":"","bgcolor":"","icon":"","payload":"ph","payloadType":"str","topic":"","x":130,"y":1060,"wires":[["42827abd.0b1d54"]]},{"id":"891f0ccc.2b364","type":"ui_toast","z":"3e1670d8.f89fb","position":"dialog","displayTime":"3","highlight":"","sendall":false,"outputs":1,"ok":"Reset","cancel":"Cancel","raw":false,"topic":"Factory Reset","name":"","x":550,"y":1140,"wires":[["d05ae0ae.b73"]]},{"id":"60bdc342.bf2fec","type":"i2c out","z":"3e1670d8.f89fb","name":"","address":"","command":"","payload":"payload","payloadType":"msg","count":"1","x":1860,"y":860,"wires":[[]]},{"id":"e1b832df.ef6db","type":"ui_button","z":"3e1670d8.f89fb","name":"Temp Compensation pH","group":"a4d910e0.e5e71","order":6,"width":0,"height":0,"passthru":false,"label":"Temperature Compensation","tooltip":"","color":"","bgcolor":"","icon":"","payload":"Set current temperature in celcius:","payloadType":"str","topic":"","x":150,"y":1320,"wires":[["964fd00f.20652"]]},{"id":"964fd00f.20652","type":"ui_toast","z":"3e1670d8.f89fb","position":"prompt","displayTime":"3","highlight":"","sendall":false,"outputs":1,"ok":"OK","cancel":"Cancel","raw":false,"topic":"Temperature Compensation","name":"","x":370,"y":1320,"wires":[["4f237480.11026c"]]},{"id":"4f237480.11026c","type":"function","z":"3e1670d8.f89fb","name":"Send I2C","func":"if (msg.payload != \"\"){\n    var buf = Buffer.from('T,' + msg.payload, 'ascii');\n    msg.payload = buf;\n    msg.address = flow.get('pH');\n    msg.command = 82;\n    return msg;\n}\n","outputs":1,"noerr":0,"x":540,"y":1320,"wires":[["60bdc342.bf2fec","41c9f106.f6826"]]},{"id":"41c9f106.f6826","type":"delay","z":"3e1670d8.f89fb","name":"","pauseType":"delay","timeout":"900","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":710,"y":1320,"wires":[["da3b0698.084c48"]]},{"id":"da3b0698.084c48","type":"i2c in","z":"3e1670d8.f89fb","name":"","address":"","command":"","count":"4","x":870,"y":1320,"wires":[[]]},{"id":"5f086a6c.9da364","type":"inject","z":"3e1670d8.f89fb","name":"Poll","topic":"","payload":"","payloadType":"str","repeat":"1","crontab":"","once":true,"onceDelay":"5","x":110,"y":440,"wires":[["268f4bd8.138f64"]]},{"id":"493a2644.9198e8","type":"function","z":"3e1670d8.f89fb","name":"Values","func":"switch(msg.address){\n    case flow.get('pH'):\n        msg.payload = parseFloat(msg.payload.slice(1,6).toString());\n        return [msg,null,null,null,null];\n    case flow.get('ORP'):\n        msg.payload = parseFloat(msg.payload.slice(1,6).toString());\n        return [null,msg,null,null,null];\n    case flow.get('RTD'):\n        msg.payload = parseFloat(msg.payload.slice(1,6).toString());\n        return [null,null,msg,null,null];\n    case flow.get('EC'):\n        msg.payload = parseFloat(msg.payload.slice(1,6).toString());\n        return [null,null,null,msg,null];\n    case flow.get('D.O.'):\n        msg.payload = parseFloat(msg.payload.slice(1,6).toString());\n        return [null,null,null,null,msg];\n}","outputs":5,"noerr":0,"x":970,"y":440,"wires":[["1d336630.7efaaa"],["c9298ce5.e3e2a"],["4d5c5d33.405f24"],["92fdbc2d.7d61e"],["1e31f184.02ccde"]],"outputLabels":["Status","","","",""]},{"id":"e50f0cc4.9cf56","type":"ui_button","z":"3e1670d8.f89fb","name":"Flash pH","group":"a4d910e0.e5e71","order":7,"width":0,"height":0,"passthru":false,"label":"Find","tooltip":"","color":"","bgcolor":"","icon":"","payload":"ph","payloadType":"str","topic":"","x":100,"y":800,"wires":[["b58d1576.8f5a28"]]},{"id":"e54b63e7.69b8b","type":"ui_button","z":"3e1670d8.f89fb","name":"Flash ORP","group":"cfc5afa4.8f001","order":6,"width":0,"height":0,"passthru":false,"label":"Find","tooltip":"","color":"","bgcolor":"","icon":"","payload":"orp","payloadType":"str","topic":"","x":110,"y":840,"wires":[["b58d1576.8f5a28"]]},{"id":"e60892a.e67297","type":"ui_button","z":"3e1670d8.f89fb","name":"Flash Temp","group":"9bfb97b9.622ff8","order":7,"width":0,"height":0,"passthru":false,"label":"Find","tooltip":"","color":"","bgcolor":"","icon":"","payload":"temp","payloadType":"str","topic":"","x":110,"y":880,"wires":[["b58d1576.8f5a28"]]},{"id":"b58d1576.8f5a28","type":"function","z":"3e1670d8.f89fb","name":"Set Address","func":"switch (msg.payload){\n    case 'ph':\n        msg.address = flow.get('pH');\n        break\n    case 'orp':\n        msg.address = flow.get('ORP');\n        break;\n    case 'temp':\n        msg.address = flow.get('RTD');\n        break;\n    case 'ec':\n        msg.address = flow.get('EC');\n        break;\n    case 'do':\n        msg.address = flow.get('D.O.');\n        break;\n}\n\nmsg.command = 70;\nmsg.payload = Buffer.from('ind', 'ascii');\n\nreturn msg;","outputs":1,"noerr":0,"x":310,"y":880,"wires":[["60bdc342.bf2fec"]]},{"id":"2b237cf2.bc05b4","type":"ui_switch","z":"3e1670d8.f89fb","name":"LED ORP","label":"LED","tooltip":"","group":"cfc5afa4.8f001","order":5,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"orp,on","onvalueType":"str","onicon":"","oncolor":"","offvalue":"orp,off","offvalueType":"str","officon":"","offcolor":"","x":100,"y":580,"wires":[["9dc4d5ee.c7bb88"]]},{"id":"517ccbed.843dd4","type":"ui_switch","z":"3e1670d8.f89fb","name":"LED Temp","label":"LED","tooltip":"","group":"9bfb97b9.622ff8","order":5,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"temp,on","onvalueType":"str","onicon":"","oncolor":"","offvalue":"temp,off","offvalueType":"str","officon":"","offcolor":"","x":110,"y":620,"wires":[["9dc4d5ee.c7bb88"]]},{"id":"9dc4d5ee.c7bb88","type":"function","z":"3e1670d8.f89fb","name":"Set Address","func":"var probe = msg.payload.split(\",\");\nvar value = msg.payload.split(\",\");\n\nswitch (probe[0]){\n    case 'ph':\n        msg.address = flow.get('pH');\n        break\n    case 'orp':\n        msg.address = flow.get('ORP');\n        break;\n    case 'temp':\n        msg.address = flow.get('RTD');\n        break;\n    case 'ec':\n        msg.address = flow.get('EC');\n        break;\n    case 'do':\n        msg.address = flow.get('D.O.');\n        break;\n}\n\nswitch (value[1]){\n    case 'on':\n        msg.payload = Buffer.from(',1', 'ascii');\n        break\n    case 'off':\n        msg.payload = Buffer.from(',0', 'ascii');\n        break;\n}\n\nmsg.command = 76;\n\nreturn msg;","outputs":1,"noerr":0,"x":310,"y":620,"wires":[["60bdc342.bf2fec"]]},{"id":"af26ac8f.0217","type":"i2c in","z":"3e1670d8.f89fb","name":"","address":"","command":"","count":"16","x":830,"y":440,"wires":[["493a2644.9198e8"]]},{"id":"a2bda1e6.7aac6","type":"change","z":"3e1670d8.f89fb","name":"Read pH","rules":[{"t":"set","p":"address","pt":"msg","to":"pH","tot":"flow"},{"t":"set","p":"command","pt":"msg","to":"82","tot":"num"},{"t":"set","p":"probe","pt":"msg","to":"ph","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":460,"y":360,"wires":[["60bdc342.bf2fec","9a027dbd.d0922"]]},{"id":"c8dfbdd.52d614","type":"change","z":"3e1670d8.f89fb","name":"Read ORP","rules":[{"t":"set","p":"address","pt":"msg","to":"ORP","tot":"flow"},{"t":"set","p":"command","pt":"msg","to":"82","tot":"num"},{"t":"set","p":"probe","pt":"msg","to":"orp","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":400,"wires":[["60bdc342.bf2fec","9a027dbd.d0922"]]},{"id":"64dc791.8ace088","type":"change","z":"3e1670d8.f89fb","name":"Read Temp","rules":[{"t":"set","p":"address","pt":"msg","to":"RTD","tot":"flow"},{"t":"set","p":"command","pt":"msg","to":"82","tot":"num"},{"t":"set","p":"probe","pt":"msg","to":"temp","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":440,"wires":[["60bdc342.bf2fec","d9ffae31.c5673"]]},{"id":"9a027dbd.d0922","type":"delay","z":"3e1670d8.f89fb","name":"","pauseType":"delay","timeout":"900","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":670,"y":420,"wires":[["af26ac8f.0217"]]},{"id":"d9ffae31.c5673","type":"delay","z":"3e1670d8.f89fb","name":"","pauseType":"delay","timeout":"600","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":670,"y":460,"wires":[["af26ac8f.0217"]]},{"id":"492d8eb3.f5acc","type":"comment","z":"3e1670d8.f89fb","name":"Read probe values.","info":"","x":130,"y":400,"wires":[]},{"id":"82c55bb1.a63288","type":"comment","z":"3e1670d8.f89fb","name":"Set LED.","info":"","x":100,"y":500,"wires":[]},{"id":"a311f76f.8bfa68","type":"comment","z":"3e1670d8.f89fb","name":"Flash LED.","info":"","x":100,"y":760,"wires":[]},{"id":"2e2a7461.87efac","type":"ui_button","z":"3e1670d8.f89fb","name":"Factory Reset ORP","group":"cfc5afa4.8f001","order":9,"width":0,"height":0,"passthru":false,"label":"Factory Reset","tooltip":"","color":"","bgcolor":"","icon":"","payload":"orp","payloadType":"str","topic":"","x":130,"y":1100,"wires":[["42827abd.0b1d54"]]},{"id":"d5129b2.6f0e768","type":"ui_button","z":"3e1670d8.f89fb","name":"Factory Reset Temp","group":"9bfb97b9.622ff8","order":10,"width":0,"height":0,"passthru":false,"label":"Factory Reset","tooltip":"","color":"","bgcolor":"","icon":"","payload":"temp","payloadType":"str","topic":"","x":140,"y":1140,"wires":[["42827abd.0b1d54"]]},{"id":"8627909c.59257","type":"comment","z":"3e1670d8.f89fb","name":"Factory reset.","info":"","x":110,"y":1020,"wires":[]},{"id":"42827abd.0b1d54","type":"function","z":"3e1670d8.f89fb","name":"Set Address","func":"switch (msg.payload){\n    case 'ph':\n        msg.address = flow.get('pH');\n        break\n    case 'orp':\n        msg.address = flow.get('ORP');\n        break;\n    case 'temp':\n        msg.address = flow.get('RTD');\n        break;\n    case 'ec':\n        msg.address = flow.get('EC');\n        break;\n    case 'do':\n        msg.address = flow.get('D.O.');\n        break;\n}\n\nmsg.command = 70;\nmsg.payload = 'Do you want to reset ' + msg.payload + ' ezo board to factory settings?'\n\nreturn msg;","outputs":1,"noerr":0,"x":370,"y":1140,"wires":[["891f0ccc.2b364"]]},{"id":"56bf2cd8.331914","type":"comment","z":"3e1670d8.f89fb","name":"Set temperature compensation for pH board.","info":"","x":210,"y":1280,"wires":[]},{"id":"e01e9509.8cbe78","type":"function","z":"3e1670d8.f89fb","name":"Send I2C","func":"msg.payload = Buffer.from(msg.payload, 'ascii');\nmsg.address = flow.get('RTD');\nmsg.command = 83;\n\nreturn msg;","outputs":1,"noerr":0,"x":280,"y":1420,"wires":[["f8fdcd1c.d7c34","60bdc342.bf2fec"]]},{"id":"f8fdcd1c.d7c34","type":"delay","z":"3e1670d8.f89fb","name":"","pauseType":"delay","timeout":"900","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":450,"y":1420,"wires":[["a2857575.29bcd8"]]},{"id":"a2857575.29bcd8","type":"i2c in","z":"3e1670d8.f89fb","name":"","address":"","command":"","count":"4","x":610,"y":1420,"wires":[[]]},{"id":"fd71a54e.14eeb8","type":"comment","z":"3e1670d8.f89fb","name":"Set temperature scale for temp board.","info":"","x":190,"y":1380,"wires":[]},{"id":"f84f9889.bdedd8","type":"ui_dropdown","z":"3e1670d8.f89fb","name":"Temp Scale","label":"Scale","tooltip":"","place":"Scale","group":"9bfb97b9.622ff8","order":6,"width":0,"height":0,"passthru":true,"options":[{"label":"Celcius","value":",c","type":"str"},{"label":"Fahrenheit","value":",f","type":"str"},{"label":"Kelvin","value":",k","type":"str"}],"payload":"","topic":"","x":110,"y":1420,"wires":[["e01e9509.8cbe78"]]},{"id":"1e381215.da6e3e","type":"i2c scan","z":"3e1670d8.f89fb","name":"","x":260,"y":80,"wires":[["de4d8b7a.cba4c8"],[]]},{"id":"d8f0b15a.af9c1","type":"inject","z":"3e1670d8.f89fb","name":"","topic":"","payload":"","payloadType":"str","repeat":"","crontab":"","once":true,"onceDelay":"1","x":110,"y":80,"wires":[["1e381215.da6e3e"]]},{"id":"4a49933d.b4eb4c","type":"delay","z":"3e1670d8.f89fb","name":"","pauseType":"delay","timeout":"300","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":770,"y":80,"wires":[["dc6b0f58.2ac11"]]},{"id":"dc6b0f58.2ac11","type":"i2c in","z":"3e1670d8.f89fb","name":"","address":"","command":"","count":"10","x":930,"y":80,"wires":[["33403dda.20a052"]]},{"id":"24d4184b.bdf8f8","type":"change","z":"3e1670d8.f89fb","name":"","rules":[{"t":"set","p":"address","pt":"msg","to":"payload","tot":"msg"},{"t":"set","p":"command","pt":"msg","to":"105","tot":"num"},{"t":"set","p":"payload","pt":"msg","to":"","tot":"str"},{"t":"set","p":"boot","pt":"flow","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":580,"y":80,"wires":[["4a49933d.b4eb4c","60bdc342.bf2fec"]]},{"id":"268f4bd8.138f64","type":"switch","z":"3e1670d8.f89fb","name":"Boot?","property":"boot","propertyType":"flow","rules":[{"t":"false"}],"checkall":"true","repair":false,"outputs":1,"x":250,"y":440,"wires":[["a2bda1e6.7aac6","c8dfbdd.52d614","64dc791.8ace088","6dde7bd5.8e11e4","70f0b47.22b414c"]]},{"id":"33403dda.20a052","type":"function","z":"3e1670d8.f89fb","name":"Set Flow Variables","func":"if (msg.payload != \"\"){\n    var status = msg.payload.toString().split(\",\");\n    var probe = status[1];\n    var address = msg.address;\n    msg.command = 83;\n    msg.payload = Buffer.from('tatus', 'ascii');\n    msg.probe = probe;\n    flow.set(probe, address);\n    return msg;\n}\n","outputs":1,"noerr":0,"x":1110,"y":80,"wires":[["2d8b4a44.9a4ce6","60bdc342.bf2fec","e5b8f7a8.be7568"]]},{"id":"de4d8b7a.cba4c8","type":"split","z":"3e1670d8.f89fb","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":410,"y":80,"wires":[["24d4184b.bdf8f8"]]},{"id":"8d2704db.3ed6d8","type":"comment","z":"3e1670d8.f89fb","name":"Boot sequence.","info":"","x":120,"y":40,"wires":[]},{"id":"7405f2f2.00b16c","type":"comment","z":"3e1670d8.f89fb","name":"Change I2C address.","info":"","x":140,"y":140,"wires":[]},{"id":"e8e74226.4b589","type":"ui_button","z":"3e1670d8.f89fb","name":"Change I2C pH","group":"a4d910e0.e5e71","order":8,"width":0,"height":0,"passthru":false,"label":"Change I2C Address","tooltip":"","color":"","bgcolor":"","icon":"","payload":"ph","payloadType":"str","topic":"","x":120,"y":180,"wires":[["dd7313c.b395ff"]]},{"id":"dc10203e.c3ee","type":"ui_toast","z":"3e1670d8.f89fb","position":"prompt","displayTime":"3","highlight":"","sendall":false,"outputs":1,"ok":"OK","cancel":"Cancel","raw":false,"topic":"","name":"","x":530,"y":260,"wires":[["dbb7368f.22fe78"]]},{"id":"92ce2b5a.7d6bf8","type":"ui_button","z":"3e1670d8.f89fb","name":"Change I2C ORP","group":"cfc5afa4.8f001","order":7,"width":0,"height":0,"passthru":false,"label":"Change I2C Address","tooltip":"","color":"","bgcolor":"","icon":"","payload":"orp","payloadType":"str","topic":"","x":130,"y":220,"wires":[["dd7313c.b395ff"]]},{"id":"2f9e4e8.c1038b2","type":"ui_button","z":"3e1670d8.f89fb","name":"Change I2C Temp","group":"9bfb97b9.622ff8","order":8,"width":0,"height":0,"passthru":false,"label":"Change I2C Address","tooltip":"","color":"","bgcolor":"","icon":"","payload":"temp","payloadType":"str","topic":"","x":130,"y":260,"wires":[["dd7313c.b395ff"]]},{"id":"dd7313c.b395ff","type":"function","z":"3e1670d8.f89fb","name":"Set Address","func":"switch (msg.payload){\n    case 'ph':\n        msg.address = flow.get('pH');\n        break\n    case 'orp':\n        msg.address = flow.get('ORP');\n        break;\n    case 'temp':\n        msg.address = flow.get('RTD');\n        break;\n    case 'ec':\n        msg.address = flow.get('EC');\n        break;\n    case 'do':\n        msg.address = flow.get('D.O.');\n        break;\n}\n\nmsg.command = 73;\nmsg.payload = 'Enter new I2C address:';\nreturn msg;","outputs":1,"noerr":0,"x":350,"y":260,"wires":[["dc10203e.c3ee"]]},{"id":"dbb7368f.22fe78","type":"function","z":"3e1670d8.f89fb","name":"Set payload","func":"if (msg.payload != \"\"){\n    msg.payload = Buffer.from('2C,' + parseFloat(msg.payload), 'ascii');\n    flow.set('boot', true);\n    return msg;\n}\n","outputs":1,"noerr":0,"x":710,"y":260,"wires":[["3cc695c5.d0e0aa","60bdc342.bf2fec"]]},{"id":"3cc695c5.d0e0aa","type":"delay","z":"3e1670d8.f89fb","name":"","pauseType":"delay","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":880,"y":260,"wires":[["1e381215.da6e3e"]]},{"id":"7cd186e4.27ea08","type":"comment","z":"3e1670d8.f89fb","name":"Calibrate.","info":"","x":100,"y":1480,"wires":[]},{"id":"f4dc1b3b.746aa8","type":"i2c in","z":"3e1670d8.f89fb","name":"","address":"","command":"","count":"16","x":1470,"y":80,"wires":[["fc946663.b5c638"]]},{"id":"2d8b4a44.9a4ce6","type":"delay","z":"3e1670d8.f89fb","name":"","pauseType":"delay","timeout":"300","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1310,"y":80,"wires":[["f4dc1b3b.746aa8"]]},{"id":"d05ae0ae.b73","type":"function","z":"3e1670d8.f89fb","name":"Send I2C","func":"if (msg.payload != \"\"){\n    msg.payload = Buffer.from('actory', 'ascii');\n    return msg;\n}\n","outputs":1,"noerr":0,"x":720,"y":1140,"wires":[["60bdc342.bf2fec"]]},{"id":"5b5d3d4a.fac5a4","type":"ui_button","z":"3e1670d8.f89fb","d":true,"name":"Factory Reset EC","group":"43cff99.31d3408","order":9,"width":0,"height":0,"passthru":false,"label":"Factory Reset","tooltip":"","color":"","bgcolor":"","icon":"","payload":"ec","payloadType":"str","topic":"","x":130,"y":1180,"wires":[["42827abd.0b1d54"]]},{"id":"9ac0b8de.059a58","type":"ui_button","z":"3e1670d8.f89fb","d":true,"name":"Factory Reset DO","group":"639e2c86.a112d4","order":9,"width":0,"height":0,"passthru":false,"label":"Factory Reset","tooltip":"","color":"","bgcolor":"","icon":"","payload":"do","payloadType":"str","topic":"","x":130,"y":1220,"wires":[["42827abd.0b1d54"]]},{"id":"a7b63c25.d18a6","type":"ui_button","z":"3e1670d8.f89fb","d":true,"name":"Flash EC","group":"43cff99.31d3408","order":6,"width":0,"height":0,"passthru":false,"label":"Find","tooltip":"","color":"","bgcolor":"","icon":"","payload":"ec","payloadType":"str","topic":"","x":100,"y":920,"wires":[["b58d1576.8f5a28"]]},{"id":"c6972623.ace958","type":"ui_button","z":"3e1670d8.f89fb","d":true,"name":"Flash D.O.","group":"639e2c86.a112d4","order":6,"width":0,"height":0,"passthru":false,"label":"Find","tooltip":"","color":"","bgcolor":"","icon":"","payload":"do","payloadType":"str","topic":"","x":110,"y":960,"wires":[["b58d1576.8f5a28"]]},{"id":"82f6cf6a.e0124","type":"ui_switch","z":"3e1670d8.f89fb","d":true,"name":"LED EC","label":"LED","tooltip":"","group":"43cff99.31d3408","order":5,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"ec,on","onvalueType":"str","onicon":"","oncolor":"","offvalue":"ec,off","offvalueType":"str","officon":"","offcolor":"","x":100,"y":660,"wires":[["9dc4d5ee.c7bb88"]]},{"id":"8edaa172.d2bdd","type":"ui_switch","z":"3e1670d8.f89fb","d":true,"name":"LED D.O.","label":"LED","tooltip":"","group":"639e2c86.a112d4","order":5,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"do,on","onvalueType":"str","onicon":"","oncolor":"","offvalue":"do,off","offvalueType":"str","officon":"","offcolor":"","x":100,"y":700,"wires":[["9dc4d5ee.c7bb88"]]},{"id":"8685d8ba.da02b8","type":"ui_button","z":"3e1670d8.f89fb","d":true,"name":"Change I2C EC","group":"43cff99.31d3408","order":7,"width":0,"height":0,"passthru":false,"label":"Change I2C Address","tooltip":"","color":"","bgcolor":"","icon":"","payload":"ec","payloadType":"str","topic":"","x":120,"y":300,"wires":[["dd7313c.b395ff"]]},{"id":"c21e6931.9fc3c8","type":"ui_button","z":"3e1670d8.f89fb","d":true,"name":"Change I2C D.O.","group":"639e2c86.a112d4","order":7,"width":0,"height":0,"passthru":false,"label":"Change I2C Address","tooltip":"","color":"","bgcolor":"","icon":"","payload":"do","payloadType":"str","topic":"","x":130,"y":340,"wires":[["dd7313c.b395ff"]]},{"id":"b9040e33.40a8b","type":"ui_button","z":"3e1670d8.f89fb","name":"Calibrate pH","group":"a4d910e0.e5e71","order":9,"width":0,"height":0,"passthru":false,"label":"Calibrate","tooltip":"","color":"","bgcolor":"","icon":"","payload":"ph","payloadType":"str","topic":"","x":110,"y":1520,"wires":[["702a3e59.bed5d"]]},{"id":"500362e.a48cd9c","type":"function","z":"3e1670d8.f89fb","name":"Calibrate","func":"if (msg.payload != \"Cancel\"){\n    var count = context.get('count') || 0;\n    count +=1;\n    context.set('count', count);\n    msg.count = count;\n    \n    switch (msg.probe){\n        case 'ph':\n            switch (count){\n                case 1:\n                    msg.topic = \"\";\n                    msg.payload = \"Place probe in 7.00 solution and wait for reading to stabilize.\";\n                    return [msg,null,null];\n                case 2:\n                    msg.topic = \"\";\n                    msg.payload = \"Place probe in 4.00 solution and wait for reading to stabilize.\";\n                    return [msg,null,null];\n                case 3:\n                    msg.topic = \"\";\n                    msg.payload = \"Place probe in 10.00 solution and wait for reading to stabilize.\";\n                    return [msg,null,null];\n            }\n            break;\n        case 'orp':\n            switch (count){\n                case 1:\n                    msg.topic = \"\";\n                    msg.payload = \"Place probe in 225mV solution and wait for reading to stabilize.\";\n                    return [msg,null,null];\n            }\n            break;\n        case 'temp':\n            switch (count){\n                case 1:\n                    msg.topic = \"\";\n                    msg.payload = \"Enter temperature in celcius:\";\n                    return [null,msg,null];\n            }\n            break;\n        case 'ec':\n            switch (count){\n                case 1:\n                    msg.topic = \"\";\n                    msg.payload = \"Dry probe and wait for reading to stabilize.\";\n                    return [msg,null,null];\n                case 2:\n                    msg.topic = \"\";\n                    msg.payload = \"Place probe in 12,880μS solution and wait for reading to stabilize.\";\n                    return [msg,null,null];\n                case 3:\n                    msg.topic = \"\";\n                    msg.payload = \"Place probe in 80,000μS solution and wait for reading to stabilize.\";\n                    return [msg,null,null];\n            }\n            break;\n        case 'do':\n            switch (count){\n                case 1:\n                    msg.topic = \"\";\n                    msg.payload = \"Place probe in 7.00 solution and wait for reading to stabilize.\";\n                    return [msg,null,null];\n                case 2:\n                    msg.topic = \"\";\n                    msg.payload = \"Place probe in 0.0 solution and wait for reading to stabilize.\";\n                    return [msg,null,null];\n            }\n            break;\n    }\n    \n    context.set('count', 0);\n    msg.topic = \"\";\n    msg.payload = \"Calibration complete!\";\n    return [null,null,msg];\n}","outputs":3,"noerr":0,"x":680,"y":1600,"wires":[["ad4c2eee.88af3"],["ccadac14.983d5"],["264576bc.9f5eca"]]},{"id":"b91e9bbc.c42078","type":"ui_button","z":"3e1670d8.f89fb","name":"Calibrate ORP","group":"cfc5afa4.8f001","order":8,"width":0,"height":0,"passthru":false,"label":"Calibrate","tooltip":"","color":"","bgcolor":"","icon":"","payload":"orp","payloadType":"str","topic":"","x":120,"y":1560,"wires":[["702a3e59.bed5d"]]},{"id":"a83520bf.4de5d","type":"ui_button","z":"3e1670d8.f89fb","name":"Calibrate Temp","group":"9bfb97b9.622ff8","order":9,"width":0,"height":0,"passthru":false,"label":"Calibrate","tooltip":"","color":"","bgcolor":"","icon":"","payload":"temp","payloadType":"str","topic":"","x":120,"y":1600,"wires":[["702a3e59.bed5d"]]},{"id":"17feaa0e.9234b6","type":"ui_button","z":"3e1670d8.f89fb","d":true,"name":"Calibrate EC","group":"43cff99.31d3408","order":8,"width":0,"height":0,"passthru":false,"label":"Calibrate","tooltip":"","color":"","bgcolor":"","icon":"","payload":"ec","payloadType":"str","topic":"","x":110,"y":1640,"wires":[["702a3e59.bed5d"]]},{"id":"ba2ec00c.0ffbf","type":"ui_button","z":"3e1670d8.f89fb","d":true,"name":"Calibrate D.O.","group":"639e2c86.a112d4","order":8,"width":0,"height":0,"passthru":false,"label":"Calibrate","tooltip":"","color":"","bgcolor":"","icon":"","payload":"do","payloadType":"str","topic":"","x":120,"y":1680,"wires":[["702a3e59.bed5d"]]},{"id":"ad4c2eee.88af3","type":"ui_toast","z":"3e1670d8.f89fb","position":"dialog","displayTime":"3","highlight":"","sendall":false,"outputs":1,"ok":"Next","cancel":"","raw":false,"topic":"","name":"Next","x":870,"y":1540,"wires":[["9792168f.7c77b8","500362e.a48cd9c"]]},{"id":"e75d9530.4a5bf8","type":"ui_toast","z":"3e1670d8.f89fb","position":"dialog","displayTime":"3","highlight":"","sendall":false,"outputs":1,"ok":"Calibrate","cancel":"Cancel","raw":false,"topic":"","name":"","x":510,"y":1600,"wires":[["500362e.a48cd9c"]]},{"id":"702a3e59.bed5d","type":"function","z":"3e1670d8.f89fb","name":"Set Address","func":"msg.probe = msg.payload;\n\nswitch (msg.probe){\n    case 'ph':\n        msg.address = flow.get('pH');\n        break\n    case 'orp':\n        msg.address = flow.get('ORP');\n        break;\n    case 'temp':\n        msg.address = flow.get('RTD');\n        break;\n    case 'ec':\n        msg.address = flow.get('EC');\n        break;\n    case 'do':\n        msg.address = flow.get('D.O.');\n        break;\n}\n\nmsg.command = 67;\nmsg.payload = \"Do you want to calibrate \" + msg.probe + \" probe?  Existing calibration data will be erased.\";\n\nreturn msg;","outputs":1,"noerr":0,"x":330,"y":1600,"wires":[["e75d9530.4a5bf8"]]},{"id":"264576bc.9f5eca","type":"ui_toast","z":"3e1670d8.f89fb","position":"dialog","displayTime":"3","highlight":"","sendall":false,"outputs":1,"ok":"OK","cancel":"","raw":false,"topic":"","name":"OK","x":870,"y":1660,"wires":[[]]},{"id":"ccadac14.983d5","type":"ui_toast","z":"3e1670d8.f89fb","position":"prompt","displayTime":"3","highlight":"","sendall":true,"outputs":1,"ok":"Calibrate","cancel":"Cancel","raw":false,"topic":"","name":"Input","x":870,"y":1600,"wires":[["9792168f.7c77b8","500362e.a48cd9c"]]},{"id":"9792168f.7c77b8","type":"function","z":"3e1670d8.f89fb","name":"Send I2C","func":"switch (msg.probe){\n    case 'ph':\n        switch (msg.count){\n            case 1:\n                msg.topic = \"\";\n                msg.payload = Buffer.from('al,mid,7.00', 'ascii');\n                return msg;\n            case 2:\n                msg.topic = \"\";\n                msg.payload = Buffer.from('al,mid,4.00', 'ascii');\n                return msg;\n            case 3:\n                msg.topic = \"\";\n                msg.payload = Buffer.from('al,mid,10.00', 'ascii');\n                return msg;\n        }\n        break;\n    case 'orp':\n        switch (msg.count){\n            case 1:\n                msg.topic = \"\";\n                msg.payload = Buffer.from('al,225', 'ascii');\n                return msg;\n        }\n        break;\n    case 'temp':\n        switch (msg.count){\n            case 1:\n                msg.topic = \"\";\n                return msg;\n        }\n        break;\n    case 'ec':\n        switch (msg.count){\n            case 1:\n                msg.topic = \"\";\n                msg.payload = Buffer.from('al,dry', 'ascii');\n                return msg;\n            case 2:\n                msg.topic = \"\";\n                msg.payload = Buffer.from('al,low,12880', 'ascii');\n                return msg;\n            case 3:\n                msg.topic = \"\";\n                msg.payload = Buffer.from('al,high,80000', 'ascii');\n                return msg;\n        }\n        break;\n    case 'do':\n        switch (msg.count){\n            case 1:\n                msg.topic = \"\";\n                msg.payload = Buffer.from('al', 'ascii');\n                return msg;\n            case 2:\n                msg.topic = \"\";\n                msg.payload = Buffer.from('al,0', 'ascii');\n                return msg;\n        }\n        break;\n}","outputs":1,"noerr":0,"x":1060,"y":1600,"wires":[["60bdc342.bf2fec"]]},{"id":"6dde7bd5.8e11e4","type":"change","z":"3e1670d8.f89fb","d":true,"name":"Read EC","rules":[{"t":"set","p":"address","pt":"msg","to":"EC","tot":"flow"},{"t":"set","p":"command","pt":"msg","to":"82","tot":"num"},{"t":"set","p":"probe","pt":"msg","to":"ec","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":460,"y":480,"wires":[["9a027dbd.d0922","60bdc342.bf2fec"]]},{"id":"70f0b47.22b414c","type":"change","z":"3e1670d8.f89fb","d":true,"name":"Read Temp","rules":[{"t":"set","p":"address","pt":"msg","to":"D.O.","tot":"flow"},{"t":"set","p":"command","pt":"msg","to":"82","tot":"num"},{"t":"set","p":"probe","pt":"msg","to":"do","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":520,"wires":[["9a027dbd.d0922","60bdc342.bf2fec"]]},{"id":"92ac2fc5.8733e","type":"ui_text","z":"3e1670d8.f89fb","group":"a4d910e0.e5e71","order":2,"width":0,"height":0,"name":"pH I2C","label":"I2C Address:","format":"{{msg.payload}}","layout":"row-spread","x":1860,"y":460,"wires":[]},{"id":"5420376d.671298","type":"ui_text","z":"3e1670d8.f89fb","group":"cfc5afa4.8f001","order":2,"width":0,"height":0,"name":"ORP I2C","label":"I2C Address:","format":"{{msg.payload}}","layout":"row-spread","x":1860,"y":500,"wires":[]},{"id":"cefe098c.76c4d8","type":"ui_text","z":"3e1670d8.f89fb","group":"9bfb97b9.622ff8","order":2,"width":0,"height":0,"name":"RTD I2C","label":"I2C Address:","format":"{{msg.payload}}","layout":"row-spread","x":1860,"y":540,"wires":[]},{"id":"5ee66589.1145fc","type":"ui_text","z":"3e1670d8.f89fb","d":true,"group":"43cff99.31d3408","order":2,"width":0,"height":0,"name":"EC I2C","label":"I2C Address:","format":"{{msg.payload}}","layout":"row-spread","x":1860,"y":580,"wires":[]},{"id":"9615980c.856288","type":"ui_text","z":"3e1670d8.f89fb","d":true,"group":"639e2c86.a112d4","order":2,"width":0,"height":0,"name":"DO I2C","label":"I2C Address:","format":"{{msg.payload}}","layout":"row-spread","x":1860,"y":620,"wires":[]},{"id":"1e4d55e5.4ca63a","type":"ui_text","z":"3e1670d8.f89fb","group":"a4d910e0.e5e71","order":4,"width":0,"height":0,"name":"pH mV","label":"Power:","format":"{{msg.mv}} Vcc","layout":"row-spread","x":1850,"y":100,"wires":[]},{"id":"c21245a4.645cb8","type":"ui_text","z":"3e1670d8.f89fb","group":"cfc5afa4.8f001","order":4,"width":0,"height":0,"name":"ORP mV","label":"Power:","format":"{{msg.mv}} Vcc","layout":"row-spread","x":1860,"y":180,"wires":[]},{"id":"610caf7b.46959","type":"ui_text","z":"3e1670d8.f89fb","group":"9bfb97b9.622ff8","order":4,"width":0,"height":0,"name":"RTD mV","label":"Power:","format":"{{msg.mv}} Vcc","layout":"row-spread","x":1860,"y":260,"wires":[]},{"id":"93f35a62.47cef8","type":"ui_text","z":"3e1670d8.f89fb","d":true,"group":"43cff99.31d3408","order":4,"width":0,"height":0,"name":"EC mV","label":"Power:","format":"{{msg.mv}} Vcc","layout":"row-spread","x":1860,"y":340,"wires":[]},{"id":"7ad98710.d13d18","type":"ui_text","z":"3e1670d8.f89fb","d":true,"group":"639e2c86.a112d4","order":4,"width":0,"height":0,"name":"DO mV","label":"Power:","format":"{{msg.mv}} Vcc","layout":"row-spread","x":1860,"y":420,"wires":[]},{"id":"1d336630.7efaaa","type":"ui_text","z":"3e1670d8.f89fb","group":"a4d910e0.e5e71","order":1,"width":0,"height":0,"name":"pH Value","label":"Value:","format":"{{msg.payload}}","layout":"row-spread","x":1240,"y":360,"wires":[]},{"id":"c9298ce5.e3e2a","type":"ui_text","z":"3e1670d8.f89fb","group":"cfc5afa4.8f001","order":1,"width":0,"height":0,"name":"ORP Value","label":"Value:","format":"{{msg.payload}}","layout":"row-spread","x":1250,"y":400,"wires":[]},{"id":"4d5c5d33.405f24","type":"ui_text","z":"3e1670d8.f89fb","group":"9bfb97b9.622ff8","order":1,"width":0,"height":0,"name":"RTD Value","label":"Value:","format":"{{msg.payload}}","layout":"row-spread","x":1250,"y":440,"wires":[]},{"id":"92fdbc2d.7d61e","type":"ui_text","z":"3e1670d8.f89fb","d":true,"group":"43cff99.31d3408","order":1,"width":0,"height":0,"name":"EC Value","label":"Value:","format":"{{msg.payload}}","layout":"row-spread","x":1240,"y":480,"wires":[]},{"id":"1e31f184.02ccde","type":"ui_text","z":"3e1670d8.f89fb","d":true,"group":"639e2c86.a112d4","order":1,"width":0,"height":0,"name":"DO Value","label":"Value:","format":"{{msg.payload}}","layout":"row-spread","x":1240,"y":520,"wires":[]},{"id":"3a82b59b.328bea","type":"ui_text","z":"3e1670d8.f89fb","group":"a4d910e0.e5e71","order":3,"width":0,"height":0,"name":"pH Status","label":"Status:","format":"{{msg.restart}}","layout":"row-spread","x":1860,"y":60,"wires":[]},{"id":"b642d0a2.db47e","type":"ui_text","z":"3e1670d8.f89fb","group":"cfc5afa4.8f001","order":3,"width":0,"height":0,"name":"ORP Status","label":"Status:","format":"{{msg.restart}}","layout":"row-spread","x":1870,"y":140,"wires":[]},{"id":"94a72631.396358","type":"ui_text","z":"3e1670d8.f89fb","group":"9bfb97b9.622ff8","order":3,"width":0,"height":0,"name":"RTD Status","label":"Status:","format":"{{msg.restart}}","layout":"row-spread","x":1870,"y":220,"wires":[]},{"id":"f35111a6.a6107","type":"ui_text","z":"3e1670d8.f89fb","d":true,"group":"43cff99.31d3408","order":3,"width":0,"height":0,"name":"EC Status","label":"Status:","format":"{{msg.restart}}","layout":"row-spread","x":1860,"y":300,"wires":[]},{"id":"97a03245.7da29","type":"ui_text","z":"3e1670d8.f89fb","d":true,"group":"639e2c86.a112d4","order":3,"width":0,"height":0,"name":"DO Status","label":"Status:","format":"{{msg.restart}}","layout":"row-spread","x":1870,"y":380,"wires":[]},{"id":"e5b8f7a8.be7568","type":"function","z":"3e1670d8.f89fb","name":"I2C","func":"switch(msg.probe){\n    case 'pH':\n        msg.payload = msg.address;\n        return [msg,null,null,null,null];\n    case 'ORP':\n        msg.payload = msg.address;\n        return [null,msg,null,null,null];\n    case 'RTD':\n        msg.payload = msg.address;\n        return [null,null,msg,null,null];\n    case 'EC':\n        msg.payload = msg.address;\n        return [null,null,null,msg,null];\n    case 'D.O.':\n        msg.payload = msg.address;\n        return [null,null,null,null,msg];\n}","outputs":5,"noerr":0,"x":1610,"y":540,"wires":[["92ac2fc5.8733e"],["5420376d.671298"],["cefe098c.76c4d8"],["5ee66589.1145fc"],["9615980c.856288"]],"outputLabels":["Status","","","",""]},{"id":"fc946663.b5c638","type":"function","z":"3e1670d8.f89fb","name":"Status / mV","func":"msg.payload = msg.payload.toString().split(\",\");\n\nswitch(msg.payload[1]){\n    case 'P':\n        msg.restart = 'Powered Off';\n        break;\n    case 'S':\n        msg.restart = 'Software Reset';\n        break;\n    case 'B':\n        msg.restart = 'Brown Out';\n        break;\n    case 'W':\n        msg.restart = 'Watchdog';\n        break;\n    case 'U':\n        msg.restart = 'Unknown';\n        break;\n}\n\nmsg.mv = msg.payload[2];\nflow.set('boot', false);\n\nswitch(msg.address){\n    case flow.get('pH'):\n        return [msg,null,null,null,null];\n    case flow.get('ORP'):\n        return [null,msg,null,null,null];\n    case flow.get('RTD'):\n        return [null,null,msg,null,null];\n    case flow.get('EC'):\n        return [null,null,null,msg,null];\n    case flow.get('D.O.'):\n        return [null,null,null,null,msg];\n}","outputs":5,"noerr":0,"x":1630,"y":80,"wires":[["3a82b59b.328bea","1e4d55e5.4ca63a"],["b642d0a2.db47e","c21245a4.645cb8"],["94a72631.396358","610caf7b.46959"],["f35111a6.a6107","93f35a62.47cef8"],["97a03245.7da29","7ad98710.d13d18"]],"outputLabels":["Status","","","",""]},{"id":"a4d910e0.e5e71","type":"ui_group","z":"","name":"pH","tab":"84bf6815.050b38","order":2,"disp":true,"width":"6","collapse":false},{"id":"cfc5afa4.8f001","type":"ui_group","z":"","name":"ORP","tab":"84bf6815.050b38","order":1,"disp":true,"width":"6","collapse":false},{"id":"9bfb97b9.622ff8","type":"ui_group","z":"","name":"Temperature","tab":"84bf6815.050b38","order":3,"disp":true,"width":"6","collapse":false},{"id":"43cff99.31d3408","type":"ui_group","z":"","name":"Conductivity","tab":"84bf6815.050b38","order":4,"disp":true,"width":"6","collapse":false},{"id":"639e2c86.a112d4","type":"ui_group","z":"","name":"Dissolved Oxygen","tab":"84bf6815.050b38","order":5,"disp":true,"width":"6","collapse":false},{"id":"84bf6815.050b38","type":"ui_tab","z":"","name":"Probes","icon":"dashboard","order":2,"disabled":false,"hidden":false}]
 
Last edited:

FischAutoTechGarten

Community Member
Review score
+0 /0 /-0
View Badges
Joined
Mar 19, 2020
Messages
37
Reaction score
40
Review score
+0 /0 /-0
Rating - 0%
0   0   0
Not sure if this will fit between the Pi and Tentacle board...but it might be a consideration. While putting together the ezo board flows, the pi hit 56 degrees at ~12% CPU load.

Maddy, I have mine installed between the Pi and tentacle board... fits perfectly...

It is installed in the SmartPiCase for the RaspberryPi and official 8" Pi LCD TouchScreen. So this Pi is sitting between the SmartPiCase and the AtlasSci Tentacle3, with the FanShim installed.

Have a look at this photo I took with my probes and relay boards disconnected.. You can see there is ample space.

RaspberryPi4FanShimSmartPiCaseTentacle3.jpg


I hover around 50, but will hit 55 at 15% load but just for 1 or 2 fan cycles (10 seconds) on screen changes and bootup... that's it. And my room is 80-82degF (Arizona desert... it's a dry heat :) )

This is not in my actual project enclosure as I still have to cut all my openings with a laser cutter. However, truth be told it will have more breathing space in my final enclosure and there will be an exhaust fan present too.
 
OP
OP
MaddyP

MaddyP

'Til Reefdom Come...
Review score
+0 /0 /-0
View Badges
Joined
Jul 21, 2016
Messages
1,905
Reaction score
4,524
Review score
+0 /0 /-0
Location
Vancouver, WA
Rating - 0%
0   0   0
Maddy, I have mine installed between the Pi and tentacle board... fits perfectly...

It is installed in the SmartPiCase for the RaspberryPi and official 8" Pi LCD TouchScreen. So this Pi is sitting between the SmartPiCase and the AtlasSci Tentacle3, with the FanShim installed.

Have a look at this photo I took with my probes and relay boards disconnected.. You can see there is ample space.

View attachment 1567775

I hover around 50, but will hit 55 at 15% load but just for 1 or 2 fan cycles (10 seconds) on screen changes and bootup... that's it. And my room is 80-82degF (Arizona desert... it's a dry heat :) )

This is not in my actual project enclosure as I still have to cut all my openings with a laser cutter. However, truth be told it will have more breathing space in my final enclosure and there will be an exhaust fan present too.
Nice! I may need to order one once they come back into stock. Although, I may just install a couple of fans to move air over the entire controller board once mounted in the stand. But even with the probe flow running it still sits around 8% load.
 
Nutramar Foods

FischAutoTechGarten

Community Member
Review score
+0 /0 /-0
View Badges
Joined
Mar 19, 2020
Messages
37
Reaction score
40
Review score
+0 /0 /-0
Rating - 0%
0   0   0
Probes are operational! It isn't perfect, but all the major functionality is there.

This flow queries your Pi on boot to find which I2C addresses are in use, then sends a "Status" command to those I2C addresses to see if they respond with an expected Ezo board response. If so, it sets some flow context variables assigning I2C address to Ezo board. If you change the I2C address, it triggers the scan again and variables are updated.

Calibration is a little clunky but works as expected. Eventually I'll get around to developing a template for handling calibrations.


View attachment 1566363

Holy Guacamole. You are so much more productive and thorough in your work than I. I sense I have much to glean from this flow. Good work sir!
 
OP
OP
MaddyP

MaddyP

'Til Reefdom Come...
Review score
+0 /0 /-0
View Badges
Joined
Jul 21, 2016
Messages
1,905
Reaction score
4,524
Review score
+0 /0 /-0
Location
Vancouver, WA
Rating - 0%
0   0   0
Holy Guacamole. You are so much more productive and thorough in your work than I. I sense I have much to glean from this flow. Good work sir!
Hopefully we can glean from one another! ;)
 
BRS
OP
OP
MaddyP

MaddyP

'Til Reefdom Come...
Review score
+0 /0 /-0
View Badges
Joined
Jul 21, 2016
Messages
1,905
Reaction score
4,524
Review score
+0 /0 /-0
Location
Vancouver, WA
Rating - 0%
0   0   0
Updated and optimized the system page...

1588978992658.png


1588979011220.png



Flow:

Code:
[
    {
        "id": "30e1932b.805ebc",
        "type": "tab",
        "label": "System",
        "disabled": false,
        "info": ""
    },
    {
        "id": "363ec698.dc3bda",
        "type": "ui_gauge",
        "z": "30e1932b.805ebc",
        "name": "",
        "group": "804b079.3253bf8",
        "order": 3,
        "width": "0",
        "height": "0",
        "gtype": "gage",
        "title": "Temp",
        "label": "°C",
        "format": "{{ msg.payload }}",
        "min": 0,
        "max": "100",
        "colors": [
            "#0080ff",
            "#ffffff",
            "#ca3838"
        ],
        "seg1": "70",
        "seg2": "85",
        "x": 970,
        "y": 320,
        "wires": []
    },
    {
        "id": "7269b0e6.df809",
        "type": "exec",
        "z": "30e1932b.805ebc",
        "command": "/opt/vc/bin/vcgencmd measure_temp | egrep -o \"[0-9]+\\.[0-9]+?\"",
        "addpay": false,
        "append": "",
        "useSpawn": "false",
        "timer": "",
        "oldrc": false,
        "name": "read_T",
        "x": 440,
        "y": 340,
        "wires": [
            [
                "363ec698.dc3bda",
                "27a6d662.380eea"
            ],
            [],
            []
        ]
    },
    {
        "id": "27a6d662.380eea",
        "type": "ui_chart",
        "z": "30e1932b.805ebc",
        "name": "",
        "group": "4b1f8e47.8c52e",
        "order": 3,
        "width": 0,
        "height": 0,
        "label": "Temperature",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm:ss",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "",
        "ymax": "",
        "removeOlder": "5",
        "removeOlderPoints": "",
        "removeOlderUnit": "60",
        "cutout": 0,
        "useOneColor": false,
        "useUTC": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "useOldStyle": false,
        "outputs": 1,
        "x": 990,
        "y": 360,
        "wires": [
            []
        ]
    },
    {
        "id": "802eeedf.dcd39",
        "type": "exec",
        "z": "30e1932b.805ebc",
        "command": "df -m | grep root",
        "addpay": false,
        "append": "",
        "useSpawn": "false",
        "timer": "",
        "oldrc": false,
        "name": "read_sd_usage",
        "x": 460,
        "y": 480,
        "wires": [
            [
                "499b8003.dd6e6"
            ],
            [],
            []
        ]
    },
    {
        "id": "499b8003.dd6e6",
        "type": "function",
        "z": "30e1932b.805ebc",
        "name": "convert",
        "func": "var msg1,msg2,msg3;\n\nl = msg.payload.split(/(\\s+)/).filter( function(e) { return e.trim().length > 0; } );\nmsg1 = {topic: 'Available', payload: Math.round(l[1] / 1000) + ' GB'};\nmsg2 = {topic: 'Used', payload: Math.round(l[2] / 1000) + ' GB'};\nmsg3 = {topic: 'Used%', payload: l[4].slice(0, -1)};\n\nreturn [msg1, msg2, msg3];",
        "outputs": 3,
        "noerr": 0,
        "x": 700,
        "y": 480,
        "wires": [
            [],
            [],
            [
                "36bf9a1f.e4b236"
            ]
        ]
    },
    {
        "id": "f6a37de0.8ab5d",
        "type": "ui_gauge",
        "z": "30e1932b.805ebc",
        "name": "CPU",
        "group": "804b079.3253bf8",
        "order": 1,
        "width": "0",
        "height": "0",
        "gtype": "gage",
        "title": "CPU",
        "label": "%",
        "format": "{{ msg.payload }}",
        "min": 0,
        "max": "100",
        "colors": [
            "#00b500",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "60",
        "seg2": "80",
        "x": 970,
        "y": 120,
        "wires": []
    },
    {
        "id": "32958920.80cac6",
        "type": "ui_chart",
        "z": "30e1932b.805ebc",
        "name": "",
        "group": "4b1f8e47.8c52e",
        "order": 1,
        "width": 0,
        "height": 0,
        "label": "Load (%)",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "",
        "ymax": "",
        "removeOlder": "1",
        "removeOlderPoints": "",
        "removeOlderUnit": "60",
        "cutout": 0,
        "useOneColor": false,
        "useUTC": false,
        "colors": [
            "#ff8000",
            "#aec7e8",
            "#0080ff",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "useOldStyle": false,
        "outputs": 1,
        "x": 980,
        "y": 160,
        "wires": [
            []
        ]
    },
    {
        "id": "36bf9a1f.e4b236",
        "type": "ui_gauge",
        "z": "30e1932b.805ebc",
        "name": "Memory",
        "group": "36816e08.30a3e2",
        "order": 8,
        "width": 0,
        "height": 0,
        "gtype": "gage",
        "title": "Memory",
        "label": "%",
        "format": "{{msg.payload}}",
        "min": 0,
        "max": "100",
        "colors": [
            "#00b500",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "60",
        "seg2": "80",
        "x": 980,
        "y": 480,
        "wires": []
    },
    {
        "id": "f4a20935.a58ea8",
        "type": "OS",
        "z": "30e1932b.805ebc",
        "name": "",
        "x": 430,
        "y": 560,
        "wires": [
            [
                "c8ec924a.9c603"
            ]
        ]
    },
    {
        "id": "12d08fff.0281c",
        "type": "Uptime",
        "z": "30e1932b.805ebc",
        "name": "",
        "x": 440,
        "y": 280,
        "wires": [
            [
                "acfcc29b.94b53"
            ]
        ]
    },
    {
        "id": "8a52c18c.b4e4a",
        "type": "Memory",
        "z": "30e1932b.805ebc",
        "name": "",
        "x": 440,
        "y": 60,
        "wires": [
            [
                "b2771486.0870c8"
            ]
        ]
    },
    {
        "id": "f7ed59cc.1a2378",
        "type": "inject",
        "z": "30e1932b.805ebc",
        "name": "",
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "repeat": "1",
        "crontab": "",
        "once": true,
        "onceDelay": "5",
        "x": 170,
        "y": 140,
        "wires": [
            [
                "8a52c18c.b4e4a",
                "9bb4ddd0.5dd44"
            ]
        ]
    },
    {
        "id": "c8ec924a.9c603",
        "type": "function",
        "z": "30e1932b.805ebc",
        "name": "extract",
        "func": "var msg1,msg2,msg3,msg4;\n\nmsg1 = {topic: 'hostname', payload: msg.payload.hostname};\nmsg2 = {topic: 'type', payload: msg.payload.type};\nmsg3 = {topic: 'release', payload: msg.payload.release};\n\nreturn [msg1, msg2, msg3];",
        "outputs": 3,
        "noerr": 0,
        "x": 690,
        "y": 560,
        "wires": [
            [
                "e70a8147.36f6f"
            ],
            [
                "c25bc3db.b9327"
            ],
            [
                "fc83c806.30c6e8"
            ]
        ],
        "outputLabels": [
            "OS",
            "Version",
            "",
            ""
        ]
    },
    {
        "id": "e70a8147.36f6f",
        "type": "ui_text",
        "z": "30e1932b.805ebc",
        "group": "36816e08.30a3e2",
        "order": 4,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Hostename:",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "x": 990,
        "y": 520,
        "wires": []
    },
    {
        "id": "c25bc3db.b9327",
        "type": "ui_text",
        "z": "30e1932b.805ebc",
        "group": "36816e08.30a3e2",
        "order": 6,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Type:",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "x": 970,
        "y": 560,
        "wires": []
    },
    {
        "id": "fc83c806.30c6e8",
        "type": "ui_text",
        "z": "30e1932b.805ebc",
        "group": "36816e08.30a3e2",
        "order": 7,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Release:",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "x": 980,
        "y": 600,
        "wires": []
    },
    {
        "id": "acfcc29b.94b53",
        "type": "function",
        "z": "30e1932b.805ebc",
        "name": "convert_uptime",
        "func": "var d = Math.floor(msg.payload.uptime / 86400);\nvar h = Math.floor((msg.payload.uptime % 86400) / 3600);\nvar m = Math.floor(((msg.payload.uptime % 86400) % 3600) / 60);\nmsg.payload = d + ' ds, ' + h + ' hrs, ' + m + \" mins\";\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 720,
        "y": 280,
        "wires": [
            [
                "5fd073c2.77ad2c"
            ]
        ]
    },
    {
        "id": "5fd073c2.77ad2c",
        "type": "ui_text",
        "z": "30e1932b.805ebc",
        "group": "36816e08.30a3e2",
        "order": 3,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "Uptime:",
        "format": "{{ msg.payload }}",
        "layout": "row-spread",
        "x": 980,
        "y": 280,
        "wires": []
    },
    {
        "id": "b2771486.0870c8",
        "type": "function",
        "z": "30e1932b.805ebc",
        "name": "Extract",
        "func": "var ram;\nram = parseFloat(msg.payload.memusage);\nmsg.payload = ram.toFixed(1);\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 700,
        "y": 60,
        "wires": [
            [
                "a53acdc0.2613b",
                "c8a84320.f49da"
            ]
        ]
    },
    {
        "id": "c8a84320.f49da",
        "type": "ui_gauge",
        "z": "30e1932b.805ebc",
        "name": "RAM",
        "group": "804b079.3253bf8",
        "order": 2,
        "width": 0,
        "height": 0,
        "gtype": "gage",
        "title": "RAM",
        "label": "%",
        "format": "{{msg.payload}}",
        "min": 0,
        "max": "100",
        "colors": [
            "#00b500",
            "#e6e600",
            "#ca3838"
        ],
        "seg1": "60",
        "seg2": "80",
        "x": 970,
        "y": 40,
        "wires": []
    },
    {
        "id": "a53acdc0.2613b",
        "type": "ui_chart",
        "z": "30e1932b.805ebc",
        "name": "",
        "group": "4b1f8e47.8c52e",
        "order": 2,
        "width": 0,
        "height": 0,
        "label": "RAM (%)",
        "chartType": "line",
        "legend": "false",
        "xformat": "HH:mm",
        "interpolate": "linear",
        "nodata": "",
        "dot": false,
        "ymin": "",
        "ymax": "",
        "removeOlder": "1",
        "removeOlderPoints": "",
        "removeOlderUnit": "60",
        "cutout": 0,
        "useOneColor": false,
        "useUTC": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "useOldStyle": false,
        "outputs": 1,
        "x": 980,
        "y": 80,
        "wires": [
            []
        ]
    },
    {
        "id": "780913b9.7b968c",
        "type": "ui_button",
        "z": "30e1932b.805ebc",
        "name": "",
        "group": "36816e08.30a3e2",
        "order": 9,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "Reboot",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "icon": "",
        "payload": "Are you sure you want to reboot?",
        "payloadType": "str",
        "topic": "",
        "x": 140,
        "y": 640,
        "wires": [
            [
                "d28060bd.2884"
            ]
        ]
    },
    {
        "id": "ab17c3a8.a2fd6",
        "type": "exec",
        "z": "30e1932b.805ebc",
        "command": "sudo reboot",
        "addpay": false,
        "append": "",
        "useSpawn": "",
        "timer": "",
        "name": "Reboot",
        "x": 620,
        "y": 640,
        "wires": [
            [],
            [],
            []
        ]
    },
    {
        "id": "b4d6710b.18326",
        "type": "ui_text",
        "z": "30e1932b.805ebc",
        "group": "36816e08.30a3e2",
        "order": 5,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "IP Address",
        "format": "{{value.substring(0, value.indexOf(\" \"))}}",
        "layout": "row-spread",
        "x": 990,
        "y": 400,
        "wires": []
    },
    {
        "id": "3288dde.2c05a22",
        "type": "exec",
        "z": "30e1932b.805ebc",
        "command": "hostname",
        "addpay": false,
        "append": "-I",
        "useSpawn": "",
        "timer": "",
        "name": "Get Local IP",
        "x": 450,
        "y": 420,
        "wires": [
            [
                "b4d6710b.18326"
            ],
            [],
            []
        ]
    },
    {
        "id": "9f83d30d.deb03",
        "type": "exec",
        "z": "30e1932b.805ebc",
        "command": "sudo",
        "addpay": false,
        "append": "hwclock -r",
        "useSpawn": "false",
        "timer": "",
        "oldrc": false,
        "name": "Read RTC",
        "x": 450,
        "y": 220,
        "wires": [
            [
                "8447a5ad.aba258"
            ],
            [],
            []
        ]
    },
    {
        "id": "3c57e2da.7d7d4e",
        "type": "ui_text",
        "z": "30e1932b.805ebc",
        "group": "36816e08.30a3e2",
        "order": 1,
        "width": 0,
        "height": 0,
        "name": "Date",
        "label": "Date:",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "x": 970,
        "y": 200,
        "wires": []
    },
    {
        "id": "d28060bd.2884",
        "type": "ui_toast",
        "z": "30e1932b.805ebc",
        "position": "dialog",
        "displayTime": "3",
        "highlight": "",
        "sendall": true,
        "outputs": 1,
        "ok": "Reboot",
        "cancel": "Cancel",
        "raw": false,
        "topic": "",
        "name": "Reboot?",
        "x": 300,
        "y": 640,
        "wires": [
            [
                "32389566.c644ca"
            ]
        ]
    },
    {
        "id": "2713b8bf.90a728",
        "type": "inject",
        "z": "30e1932b.805ebc",
        "name": "",
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "repeat": "60",
        "crontab": "",
        "once": true,
        "onceDelay": "5",
        "x": 170,
        "y": 300,
        "wires": [
            [
                "7269b0e6.df809",
                "12d08fff.0281c",
                "9f83d30d.deb03"
            ]
        ]
    },
    {
        "id": "37b65367.cb0adc",
        "type": "inject",
        "z": "30e1932b.805ebc",
        "name": "",
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "repeat": "300",
        "crontab": "",
        "once": true,
        "onceDelay": "5",
        "x": 170,
        "y": 440,
        "wires": [
            [
                "3288dde.2c05a22",
                "802eeedf.dcd39",
                "f4a20935.a58ea8"
            ]
        ]
    },
    {
        "id": "32389566.c644ca",
        "type": "switch",
        "z": "30e1932b.805ebc",
        "name": "Reboot?",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "Reboot",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 460,
        "y": 640,
        "wires": [
            [
                "ab17c3a8.a2fd6"
            ]
        ]
    },
    {
        "id": "80dfdca2.225fc",
        "type": "ui_text",
        "z": "30e1932b.805ebc",
        "group": "36816e08.30a3e2",
        "order": 2,
        "width": 0,
        "height": 0,
        "name": "Time",
        "label": "Time:",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "x": 970,
        "y": 240,
        "wires": []
    },
    {
        "id": "8447a5ad.aba258",
        "type": "function",
        "z": "30e1932b.805ebc",
        "name": "extract",
        "func": "var msg1,msg2;\n\nmsg1 = {topic: \"\", payload: msg.payload.slice(0,10)};\nmsg2 = {topic: \"\", payload: msg.payload.slice(11,16)};\n\nreturn [msg1,msg2];",
        "outputs": 2,
        "noerr": 0,
        "x": 690,
        "y": 220,
        "wires": [
            [
                "3c57e2da.7d7d4e"
            ],
            [
                "80dfdca2.225fc"
            ]
        ]
    },
    {
        "id": "9bb4ddd0.5dd44",
        "type": "exec",
        "z": "30e1932b.805ebc",
        "command": "top",
        "addpay": false,
        "append": "-b -n 1 | sed -n \"s/^%Cpu.*ni, \\([0-9.]*\\) .*$/\\1/p\"",
        "useSpawn": "false",
        "timer": "",
        "oldrc": false,
        "name": "",
        "x": 430,
        "y": 140,
        "wires": [
            [
                "b4cb3e35.db9ca"
            ],
            [],
            []
        ]
    },
    {
        "id": "b4cb3e35.db9ca",
        "type": "function",
        "z": "30e1932b.805ebc",
        "name": "Convert",
        "func": "var load;\nload = 100-msg.payload;\nmsg.payload = load.toFixed(1);\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 700,
        "y": 140,
        "wires": [
            [
                "f6a37de0.8ab5d",
                "32958920.80cac6"
            ]
        ]
    },
    {
        "id": "804b079.3253bf8",
        "type": "ui_group",
        "z": "",
        "name": "CPU",
        "tab": "cca45374.9220a",
        "order": 1,
        "disp": false,
        "width": "6",
        "collapse": false
    },
    {
        "id": "4b1f8e47.8c52e",
        "type": "ui_group",
        "z": "",
        "name": "Memory",
        "tab": "cca45374.9220a",
        "order": 2,
        "disp": false,
        "width": "6",
        "collapse": false
    },
    {
        "id": "36816e08.30a3e2",
        "type": "ui_group",
        "z": "",
        "name": "System",
        "tab": "cca45374.9220a",
        "order": 4,
        "disp": false,
        "width": "6",
        "collapse": false
    },
    {
        "id": "cca45374.9220a",
        "type": "ui_tab",
        "z": "",
        "name": "System",
        "icon": "system",
        "order": 3,
        "disabled": false,
        "hidden": false
    }
]
 
OP
OP
MaddyP

MaddyP

'Til Reefdom Come...
Review score
+0 /0 /-0
View Badges
Joined
Jul 21, 2016
Messages
1,905
Reaction score
4,524
Review score
+0 /0 /-0
Location
Vancouver, WA
Rating - 0%
0   0   0
While researching how to build the outlets for this controller, I stumbled upon a few different Node-Red projects which integrated TP Link outlets/switches with the node-red-contrib-tplink-smarthome nodes. This seems decent way to implement an outlet schema which would be expandable and placement flexible. And it will free up (4) relays which I can then use for 12-24V components (ato, awc, dosing) and simplify wiring (I was concerned 110VAC would affect sensor data if wires were routed together).

I have chosen the Kasa HS300 to try and implement as it offers (6) individually controllable outlets with power monitoring and is fully supported by TP-Link Smarthome API which is the foundation of node-red-contrib-tplink-smarthome. It should arrive sometime next week. :)


1589139264872.png
 
Top Shelf Aquatics
OP
OP
MaddyP

MaddyP

'Til Reefdom Come...
Review score
+0 /0 /-0
View Badges
Joined
Jul 21, 2016
Messages
1,905
Reaction score
4,524
Review score
+0 /0 /-0
Location
Vancouver, WA
Rating - 0%
0   0   0
Received the HS300 today! I must say, this is a nice power strip...

1589488738031.png


Once I had it set up on my network (5 minutes) it only took a few minutes using the node-red-contrib-tplink to get a response from the outlet.

1589488643354.png
 
OP
OP
MaddyP

MaddyP

'Til Reefdom Come...
Review score
+0 /0 /-0
View Badges
Joined
Jul 21, 2016
Messages
1,905
Reaction score
4,524
Review score
+0 /0 /-0
Location
Vancouver, WA
Rating - 0%
0   0   0
It's a work in progress, but coming along! Trying to build out the dashboard in a way so the elements generate based on connected devices. Will try to do the same with the button/switch elements to reflect the I/O connected, but haven't found a way to "query" the SPI bus yet.

Styling is similar to another popular aquarium controller, however the elements are design using node-red-dashboard, chart.js, and Angular. Also, the colors are much improved. ;)


1589774779727.png



Also updated the javascript for node-red-contrib-tplink to support multi-outlet devices. Mostly working, though sometimes the device disconnects for an unknown reason. I suspect the issue is somewhere in the code. Maybe someone more javascript-savvy could take a look?


1589775435708.png
 
Last edited:
OP
OP
MaddyP

MaddyP

'Til Reefdom Come...
Review score
+0 /0 /-0
View Badges
Joined
Jul 21, 2016
Messages
1,905
Reaction score
4,524
Review score
+0 /0 /-0
Location
Vancouver, WA
Rating - 0%
0   0   0
Removed code from previous post...there were a few issues identified.

Updated code can be found here:

 
Last edited:
AquaCave Logo Banner

FischAutoTechGarten

Community Member
Review score
+0 /0 /-0
View Badges
Joined
Mar 19, 2020
Messages
37
Reaction score
40
Review score
+0 /0 /-0
Rating - 0%
0   0   0
Styling is similar to another popular aquarium controller, however the elements are design using node-red-dashboard, chart.js, and Angular. Also, the colors are much improved. ;)


View attachment 1586196

Very nice representation of the Off Auto On selection... Very good for taking manual control of the devices and suspending auto control. You do good work. (I've got to stop messing around with glass, wood and metal and get back to the programming and electronics of my own project)
 

FischAutoTechGarten

Community Member
Review score
+0 /0 /-0
View Badges
Joined
Mar 19, 2020
Messages
37
Reaction score
40
Review score
+0 /0 /-0
Rating - 0%
0   0   0
hey, heads up on that Pimoni Fan SHIM in the even that you were considering one. Mine is already making noise. I removed it today. kind of far to send it all the way back to the UK for a replacement. I'll contact them to see what the options are.... It really should have lasted longer than 2 months of extremely light use.
 

Polyp polynomial: How many heads do you start with when buying zoas?

  • One head is enough to get started.

    Votes: 27 10.6%
  • 2 to 4 heads.

    Votes: 145 57.1%
  • 5 heads or more.

    Votes: 65 25.6%
  • Full colony.

    Votes: 10 3.9%
  • Other.

    Votes: 7 2.8%

New Posts

AquaCave Logo Banner
Back
Top