So… after a few years of reading values via Modbus with the Script above (Thank you, by the way), I really wanted a way to also control settings like buffer temperature in order to be able to automatically heat the water hotter than required when there is excess PV energy and use it throughout the day.
But apparently, since the Modbus interface doesn’t allow us to write anything that seems like a pipe dream, right?
Well not anymore!
Presenting the newest Vibecode slop I’ve cooked up over the holidays:
OTS-HomeAssistant
If anyone cares, here’s the story:
The root of my investigation was a simple train of thought:
If the Modbus Interface can’t control the settings remotely, then how does the App do it?
About a year back I attempted to find any possible other interface to access the heat pump and realized that if you connect a browser to its IP address, you get a http login prompt. Declining that prompt gives you the interesting nugget of knowledge which is the manufacturer:
Siemens Building Technologies Climatix WEB Server V1.00, 2008
So apparently Ochsner just rebrands Siemens Heatpumps (or at least the controllers)? Fitting.
Either way, a bit of googling revealed a default user and PW for the web interface for Siemens Climatix - sadly that just leads to an empty web page.
Yesterday I got thinking again, and on a hunch attempted to decompile the apk for the Ochsner app, and wouldn’t you know it, it’s entirely obfuscated.
Randomly searching through the code gave me at least a rough picture of what was going on, even if I had no idea how it actually worked in detail.
Apparently, the App you can download on Android is the exact same app that is running on the display of the Heat Pump, too. As in: the same APK, with all the code to locally access the heatpump that should only run inside the heatpump locally included in the whole play store app.
Except I had no idea how to interpret the gordian knot that is obfuscated java code to understand exactly HOW to control the device. Luckily, apparently Github copilot + chatgpt 5.2 actually can do this pretty well.
The local interface is a json interface that is entirely undocumented, but can be accessed with hardcoded credentials (the same ones I found via google, but different user name). The interface accepts IDs which can either be read or written. These IDs don’t appear anywhere else, and I found no way to list or identify them locally. However, with a bit more reverse engineering I found the api that the app uses to download the entire configuration bundle from ochsner - you just need your ochsner user and pw to call the api. from the bundle json, you can then look through all possible values and attempt to find the ones you want to locally read / control.
I compiled it all into a script that can:
- Log into OTS cloud with your account to get access key and download the config bundle
- search the bundle for names / heating circuits
- attempt to read the current values to identify the correct ones
- write single values to see if they affect the right change in the app
Finally, I made a small home assistant custom integration where you can configure your Heat Pump IP address plus all the identified value Ids you want to read / control.
I’ve tested this with an AirHawk 518 and it works pretty well, it even updates the values visible in the app within a few seconds. You can even programmatically set the Minimum Buffer Temperature to force the heat pump to store up heat when there is excess energy!
Let me know if it works for you, and also tread with caution when setting random values so you don’t accidentally brick your device (there don’t seem to be any of the safeguards here as there are with Modbus and you can change a lot more than what is visible in the app)