EDIT: Condensed.
I’ve got all available control for the Trident and Trident NP sorted. It’s very particular about syntax. Sadly the API exposes very little and I don’t believe there is any way to gain more without tapping into the serial bus.
The only useful thing you can do is get the sensor readings and initiate priming sequences and manual testing but it’s still constrained to Alk, Combined and NO3/PO4.
For me, the correct syntax is included in the attached flow.
This is confirmed working on the Trident and Trident NP. Alk or the Combined test can be selected by changing the second digit after the device ID in the PUT request. In my case it’s 6_3 to 6_4. The Trident NP will initiate a test for me with 4_3. The only other info you need is your session cookie. I have a flow that pulls it from my active session rather than requesting a new one each time prompting the browser to disconnect.
It is very easy to crash your apex if the message isn’t formatted correctly. If that happens, simply restart the webserver from the dashboard or you will either get a connection error or it silently fails in the background. I wasted so much time troubleshooting when the code was already correct.
Anyway, this is working for me perfectly and reliably now 
Important: I needed to use a function node to remove _msgid as the apex will reject the request if it is not exactly formatted as below.
msg.headers = {
"Content-Type": "application/json",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"Origin": "http://10.10.10.20",
"Referer": "http://10.10.10.20/apex/dash",
"Cookie": "[INSERT COOKIE HERE]",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Safari/605.1.15",
};
msg.payload = JSON.stringify({
status: ["ON", "", "OK", ""]
});
return msg;
This payload then is sent as a PUT request to: (your device ID will vary)
http://[LOCAL IP]/rest/status/outputs/4_3
A complete node-red flow:
[{"id":"ac64a2dc269369ad","type":"inject","z":"8f06660af350a487","name":"Test","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":"","topic":"","payload":"{\"status\":[\"ON\",\"\",\"OK\",\"\"]}","payloadType":"json","x":170,"y":7500,"wires":[["cdd4f0359095906b"]]},{"id":"763940cccff965c4","type":"http request","z":"8f06660af350a487","name":"Check NO3, PO4","method":"PUT","ret":"obj","paytoqs":"ignore","url":"http://10.10.10.20/rest/status/outputs/4_3","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":530,"y":7500,"wires":[[]]},{"id":"cdd4f0359095906b","type":"function","z":"8f06660af350a487","name":"Clean Payload","func":"msg.headers = {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json, text/javascript, */*; q=0.01\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"Origin\": \"http://10.10.10.20\",\n \"Referer\": \"http://10.10.10.20/apex/dash\",\n \"Cookie\": \"INSERT COOKIE HERE\",\n \"User-Agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Safari/605.1.15\",\n\n};\n\n// Force EXACT Safari payload\nmsg.payload = JSON.stringify({\n status: [\"ON\", \"\", \"OK\", \"\"]\n});\n\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":320,"y":7500,"wires":[["763940cccff965c4"]]}]
I can now have a custom schedule and hopefully chew through less reagents.
Are there any plans to add testing functionality to the integration, otherwise i’ll fork my own 