Pentair ScreenLogic

Has anyone ported over Pentair ScreenLogic driver/app from ST? GitHub - bsileo/SmartThings_Pentair: Smarthings UI for use with Pentair Pool Controller

Or found a way to control their pool via Hubitat or ultimately for me using Google Assistant?

I don't know that anyone has integrated with the node.js pool controller.

I'm going to take a look at it, though. I automate my chlorine injection pump from Hubitat (external of my Pentair controls), and it would be nice to have the pump run status from the Pentair in Hubitat.

Cool let me know if you need any help with testing. I haven't setup the node.js pool controller yet due to nothing for hubitat yet. but happy to do the needful to help out.

I have another rpi and the rs485 adapter coming tomorrow. Then I need to find time to get it going... THEN I'll figure out how I want to get the data I need into Hubitat.

Any particular functions you are looking for? My needs are mainly read only / status updates, not control.

Controls would be to turn on/off - pump(pool/spa), blowers(spa), heater(pool/spa). Also basic monitoring.

I'll keep that in mind. No promises, though.

Well, I got the node.js server up and running, and can see all of the data in my easytouch controller. So that's cool.

I'll start thinking about the Hubitat side sometime in the (hopefully) near future when I get some time freed up.

EDIT: So, I changed my mind. Since I only want status in HE, it was easier for me to just use Node-Red and read the status from Pool Controller's REST API and then push it into virtual switches in HE via MakerAPI.

So I'm not really planning on making a formal integration. Someone could certainly do that, there is no technical limit - the Pool Controller node.js supports integrations easily enough - but I don't have the time or need right now.

If anyone wants to copy/use the flow, it is below:

[{"id":"d46b03e7.cf151","type":"tab","label":"Pool Status to Hubitat Template","disabled":false,"info":""},{"id":"464c528.54fa7ac","type":"inject","z":"d46b03e7.cf151","name":"Run Every 1 Minute","topic":"","payload":"","payloadType":"date","repeat":"60","crontab":"","once":true,"onceDelay":0.1,"x":160,"y":260,"wires":[["c8c4cd1e.3d4dc","8062e53e.e19c38"]]},{"id":"c8c4cd1e.3d4dc","type":"http request","z":"d46b03e7.cf151","name":"Get Pump Status from Pool Controller","method":"GET","ret":"obj","paytoqs":false,"url":"http://192.168.999.999:3000/pump","tls":"","proxy":"","authType":"","x":470,"y":200,"wires":[["3d709408.f94aac"]]},{"id":"2c0747c2.224be8","type":"function","z":"d46b03e7.cf151","name":"Create Pool Mode URL","func":"var token = flow.get("hubitat_access_token");\nvar appId = flow.get("hubitat_app_id");\nvar hubIP = flow.get("hubIP");\nvar deviceId = 9999; // Pool - Pool Mode virtual device\n\nif ((msg.payload.circuit["1"].status === 0) && (msg.payload.pump["1"].err === 0) && (msg.payload.pump["1"].drivestate != 255))\n{\n msg.url = "http://" + hubIP + "/apps/api/" + appId + "/devices/" + deviceId + "/on?access_token=" + token;\n}\nelse\n{\n msg.url = "http://" + hubIP + "/apps/api/" + appId + "/devices/" + deviceId + "/off?access_token=" + token;\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":990,"y":260,"wires":[["a65b252d.4872e8","b9093007.39a26"]]},{"id":"1c2b1df2.b59f62","type":"config","z":"d46b03e7.cf151","name":"Hubitat Hub Configuration","properties":[{"p":"hubitat_access_token","pt":"flow","to":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","tot":"str"},{"p":"hubitat_app_id","pt":"flow","to":"9999","tot":"str"},{"p":"hubIP","pt":"flow","to":"192.168.999.999","tot":"str"}],"active":true,"x":180,"y":100,"wires":[]},{"id":"a65b252d.4872e8","type":"http request","z":"d46b03e7.cf151","name":"Send to Hubitat","method":"GET","ret":"txt","paytoqs":false,"url":"","tls":"","proxy":"","authType":"","x":1220,"y":260,"wires":[[]]},{"id":"b9093007.39a26","type":"debug","z":"d46b03e7.cf151","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1190,"y":320,"wires":[]},{"id":"8062e53e.e19c38","type":"http request","z":"d46b03e7.cf151","name":"Get Circuit Status from Pool Controller","method":"GET","ret":"obj","paytoqs":false,"url":"http://192.168.999.999:3000/circuit","tls":"","proxy":"","authType":"","x":470,"y":320,"wires":[["3d709408.f94aac","1cb0983a.decd98","da58a40a.28e618"]]},{"id":"3d709408.f94aac","type":"join","z":"d46b03e7.cf151","name":"","mode":"custom","build":"merged","property":"payload","propertyType":"msg","key":"topic","joiner":"\n","joinerType":"str","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":750,"y":260,"wires":[["3d3db301.21fbac","2c0747c2.224be8"]]},{"id":"3d3db301.21fbac","type":"debug","z":"d46b03e7.cf151","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":930,"y":320,"wires":[]},{"id":"1cb0983a.decd98","type":"function","z":"d46b03e7.cf151","name":"Create Spa Mode URL","func":"var token = flow.get("hubitat_access_token");\nvar appId = flow.get("hubitat_app_id");\nvar hubIP = flow.get("hubIP");\nvar deviceId = 9999; // Pool - Spa Mode virtual device\n\nif (msg.payload.circuit["1"].status === 0)\n{\n msg.url = "http://" + hubIP + "/apps/api/" + appId + "/devices/" + deviceId + "/off?access_token=" + token;\n}\nelse\n{\n msg.url = "http://" + hubIP + "/apps/api/" + appId + "/devices/" + deviceId + "/on?access_token=" + token;}\n\nreturn msg;","outputs":1,"noerr":0,"x":980,"y":400,"wires":[["57f46188.7b192","88ad3552.b77018"]]},{"id":"88ad3552.b77018","type":"debug","z":"d46b03e7.cf151","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1190,"y":460,"wires":[]},{"id":"57f46188.7b192","type":"http request","z":"d46b03e7.cf151","name":"Send to Hubitat","method":"GET","ret":"txt","paytoqs":false,"url":"","tls":"","proxy":"","authType":"","x":1220,"y":400,"wires":[[]]},{"id":"da58a40a.28e618","type":"debug","z":"d46b03e7.cf151","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":930,"y":460,"wires":[]},{"id":"85ad50c.e451eb","type":"catch","z":"d46b03e7.cf151","name":"","scope":null,"uncaught":false,"x":120,"y":560,"wires":[["e92a476e.c31178"]]},{"id":"5d6f4b1f.7d36e4","type":"pushover api","z":"d46b03e7.cf151","keys":"e178021c.01e54","title":"Pool Pump Status to HE","name":"","x":860,"y":560,"wires":[]},{"id":"3133ead.4a01216","type":"function","z":"d46b03e7.cf151","name":"pushover_device","func":"msg.device = "pushover_device";\nreturn msg;","outputs":1,"noerr":0,"x":330,"y":600,"wires":[["e92a476e.c31178"]]},{"id":"e92a476e.c31178","type":"join","z":"d46b03e7.cf151","name":"","mode":"custom","build":"merged","property":"","propertyType":"full","key":"topic","joiner":"\n","joinerType":"str","accumulate":true,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":510,"y":560,"wires":[["8068ead5.236378","174997f3.5e2558"]]},{"id":"8068ead5.236378","type":"debug","z":"d46b03e7.cf151","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":670,"y":600,"wires":[]},{"id":"dba03165.e9b08","type":"inject","z":"d46b03e7.cf151","name":"test","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":520,"wires":[["e92a476e.c31178"]]},{"id":"35d366dd.014e0a","type":"inject","z":"d46b03e7.cf151","name":"Inject Once","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"onceDelay":0.1,"x":130,"y":600,"wires":[["3133ead.4a01216"]]},{"id":"174997f3.5e2558","type":"delay","z":"d46b03e7.cf151","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"hour","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"x":690,"y":560,"wires":[["5d6f4b1f.7d36e4"]]},{"id":"e178021c.01e54","type":"pushover-keys","z":"","name":"test key"}]

I was just getting ready to start this battle to make the easytouch system smart. I was planning on using a couple of Aeotec dual channel relays to provide secondary circuits to turn on and off the pool lights, water features, pumps, and spa blower. I’m not to concerned about fiddling with salt levels or schedules as they rarely need to be changed. I haven’t invested in the Pentair screen logic as I figured it was probably as clunky as the rest of the hardware.

With the screen logic and a $40 raspberry pi I was able to completely integrate my pentair equipment with whatever home automation system I want. So I'm a pretty big fan of the screen logic.

1 Like

Does the screen logic require a hardwired network connection between the pool equipment and the network, or is it all over WiFi? Can’t make a 100% conclusion from the manual.

Would this then ultimately allow me to speak to GA to perform actions for pentair?

I have an ubuntu server I'm using for homebridge. If you have any guidance I would definitely like to jump in and follow your footsteps. :slight_smile:

Missed this thread..I do have this Pentair App and Drivers ported and working well in my home. I recently finished the rest of my port over from ST and shut it down. I need to get around to listing a release and putting it all up in Gihub. Meanwhile if anyone wants the code let me know.

1 Like

Umm, HECK YEAH

Yes please.

I probably won't change from my Node-Red / MQTT integration of my pentair system at this point, but would like to take a peek at the code anyway.

An Alpha version of the integration is now posted on Github. Its been working well for me for 3-4 months now. This code includes dynamic configuration of the child devices based on the configuration of your pool. It creates child devices for all Auxiliary circuits, pumps, Intellichem, and Chlorinator as appropriate. You can use these devices to control all aspects of the pool and display current temperatures, readings, etc. My Screenlogic interface actiually quick working earlier this year and I have not missed it...

Hubitat Pool Controller

Holy groovy errors, Batman! Here is what I got when creating the app in Hubitat:

dev:8742019-12-20 04:39:40.997 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 2:Blue] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:40.909 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 2:Magenta] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:40.818 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 2:White] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:40.727 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 2:Red] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:40.638 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 2:Green] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:40.549 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 2:Royal] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:40.456 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 2:Sunset] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:40.349 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 2:American] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:40.198 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 2:Caribbean] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:40.048 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 2:Romance] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:39.899 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 2:Party] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:39.625 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 1:Blue] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:39.478 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 1:Magenta] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:39.337 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 1:White] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:39.128 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 1:Red] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:38.986 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 1:Green] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:38.838 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 1:Royal] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:38.692 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 1:Sunset] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:38.543 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 1:American] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:38.392 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 1:Caribbean] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:38.247 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 1:Romance] on line 260 (componentRefresh)

dev:8742019-12-20 04:39:38.098 pm errorgroovy.lang.MissingMethodException: No signature of method: user_driver_bsileo_Pentair_Pool_Controller_998.componentRefresh() is applicable for argument types: (com.hubitat.app.DeviceWrapper) values: [Intellibrite Circuit 1:Party] on line 260 (componentRefresh)

Also, does Freeze Protection Mode show up anywhere in there? I didn't see it poking around in there. I use that to suppress some notifications (like 'pump running when it isn't supposed to be').

I'll take a look at adding Freeze Protection. Created an issue for it.

It may show up on the parent device.