I'm wondering if there is anyone out there who would consider a driver that will direct control the Intesis AC Cloud modules directly bypassing AC Cloud entirely.
A quick network sniff shows that the modules listen for JSON POST calls to their IP so the driver would really only need to know the IP and possibly the password if it's changed from default.
Sending a JSON to the URL http://<ipaddress>/api.cgi with the authentication:
{"command":"login","data":{"username":"admin","password":"admin"}}
This returns the SessionID which is used for subsequent JSON POST calls.
{"success":true,"data":{"id":{"sessionID":"E1HIghdS6KfC2B9bp3Mu153sSFvk9NE"}}}
Using the sessionID in other JSON POST calls you can then operate the airconditioners.
{"command":"getavailabledatapoints","data":{"sessionID":" E1HIghdS6KfC2B9bp3Mu153sSFvk9NE "}}
Returns:
{"success":true,"data":{"dp":{"datapoints":[{"uid":1,"rw":"rw","type":1,"descr":{"numStates":2,"states":[0,1]}},{"uid":2,"rw":"rw","type":1,"descr":{"numStates":5,"states":[0,1,2,3,4]}},{"uid":4,"rw":"rw","type":1,"descr":{"numStates":4,"states":[1,2,3,4]}},{"uid":5,"rw":"rw","type":1,"descr":{"numStates":5,"states":[1,2,3,4,10]}},{"uid":9,"rw":"rw","type":2,"descr":{"maxValue":300,"minValue":180}},{"uid":10,"rw":"r","type":2,"descr":{"maxValue":500,"minValue":-100}},{"uid":12,"rw":"rw","type":1,"descr":{"numStates":2,"states":[0,1]}},{"uid":13,"rw":"rw","type":0,"descr":{}},{"uid":14,"rw":"r","type":1,"descr":{"numStates":2,"states":[0,1]}},{"uid":15,"rw":"r","type":3,"descr":{}},{"uid":35,"rw":"r","type":2,"descr":{"maxValue":300,"minValue":180}},{"uid":36,"rw":"r","type":2,"descr":{"maxValue":300,"minValue":180}},{"uid":37,"rw":"r","type":2,"descr":{"maxValue":430,"minValue":-250}},{"uid":181,"rw":"rw","type":0,"descr":{}},{"uid":182,"rw":"rw","type":0,"descr":{}},{"uid":183,"rw":"rw","type":0,"descr":{}},{"uid":184,"rw":"rw","type":0,"descr":{}}]}}}
{"command":"getdatapointvalue","data":{"sessionID":" E1HIghdS6KfC2B9bp3Mu153sSFvk9NE ","uid":"all"}}
Returns:
{"success":true,"data":{"dpval":[{"uid":1,"value":1,"status":0},{"uid":2,"value":4,"status":0},{"uid":4,"value":3,"status":0},{"uid":5,"value":10,"status":0},{"uid":9,"value":260,"status":0},{"uid":10,"value":270,"status":0},{"uid":12,"value":0,"status":0},{"uid":13,"value":502,"status":0},{"uid":14,"value":0,"status":0},{"uid":15,"value":0,"status":0},{"uid":35,"value":180,"status":0},{"uid":36,"value":300,"status":0},{"uid":37,"value":240,"status":0},{"uid":181,"value":0,"status":0},{"uid":182,"value":0,"status":0},{"uid":183,"value":0,"status":0},{"uid":184,"value":0,"status":0}]}}
And finally, you can change those values simply, for example:
AC On: {"command":"setdatapointvalue","data":{"sessionID":"E1HIghdS6KfC2B9bp3Mu153sSFvk9NE","uid":1,"value":1}}
AC Off: {"command":"setdatapointvalue","data":{"sessionID":"E1HIghdS6KfC2B9bp3Mu153sSFvk9NE","uid":1,"value":0}}
At face value, this appears to be a relatively simple driver to throw together for a talented driver developer.