How to integrate Daikin Altherma LT heat pump?

Great work. Thanks for this! I am able to run your script and update my items in OH. But I’m wondering how it works the other way. Meaning, how can I change for example the target temperature from OH? Not sure if I understand your last post with the responses for switching something. Thanks.

To give you some idea I quickly wrote this code for you to do some testing. I am currently not at home, so I have no way of checking if it works like that. In particular I have never seen the setting of a target temperature, so no idea if that is the correct way of doing it. It is simply a guess from my side.

def setValue(ws, item, value):
    ws.send("{\"m2m:rqp\":{\"op\":1,\"to\":\"/[0]/MNAE/"+item+"\",\"fr\":\"/OpenHab\",\"rqi\":\""+randomString()+"\",\"ty\":4,\"pc\":{\"m2m:cin\":{\"con\":"+value+",\"cnf\":\"text/plain:0\"}}}}")
    result1 =  json.loads(ws.recv())
    #print("Response was: %s" % result1)
    value = result1["m2m:rsp"]["rsc"]
    if (value==2001):
        print("Success")
    return value

#Switch on the heating unit (1 is my central heating, 2 is warmwater)
setValue(ws, "1/Operation/Power", "\"on\"")
#Switch on the temporary boost
setValue(ws, "2/Operation/Powerful", "1")
#Change temperature 
setValue(ws, "2/Operation/TargetTemperature", "15")

On the good news side: I am currently developing a binding and if you want to beta test it, I will be happy to provide it to you once I am mildly confident that it does work in general. What would be helpful is if you could send me your output of:

print(requestValue("0/UnitProfile"))
print(requestValue("1/UnitProfile"))
print(requestValue("2/UnitProfile"))
print(requestValue("3/UnitProfile"))
print(requestValue("4/UnitProfile"))

Hi Karsten, many thanks! Your code, after some initial tests, seems to work. Sure, I like to help out and do some beta testing for the binding. I have a Daikin Altherma hybrid heat pump and I’m using the BRP069A62 LAN adapter.

For some reason, I can only request the unit profiles 0 and 1. My thermostat shows more information like the energy consumption, so I am bit in the dark why I can’t see it in the app or via the API. Here are the response messages:
UnitProfile0.json (115 Bytes)
UnitProfile1.json (3.1 KB)
Is there anything else you would like to know?

Ah, that is the same Adapter I have. It is odd that it does not appear to export the same values. A friend of me has the same adapter and it also does not report the consumption. The thermostat is probably directly attached to the P1P2 bus and thus has access to all registers (which in theory the adapter should also have). From the Man in the middle capture I could also see that some other registers can be accessed that are not in the UnitProfile.
Thanks for your profile!

Ok, I did some disassembly of of the APK file from the Android store and did find a few more strings that one can query. Like:

print(requestValue(ws, "1/ChildLock/LockedState/la"))
print(requestValue(ws, "1/ChildLock/PinCode/la"))

print(requestValue(ws, "1/ConnectionTest"))

print(requestValue(ws, "1/Holiday/EndDate/la"))
print(requestValue(ws, "1/Holiday/HolidayState/la"))
print(requestValue(ws, "1/Holiday/StartDate/la"))

print(requestValue(ws, "1/Operation/ComfortMode/la"))
print(requestValue(ws, "1/Operation/OperationMode/la"))

print(requestValue(ws, "1/Operation/ReheatTargetTemperature/la"))
print(requestValue(ws, "1/Operation/TargetTemperature/la"))

#Points to the active Schedule (returns 1/Schedule/List/Heating/la for example)
print(requestValue(ws, "1/Schedule/Active/la"))
print(requestValue(ws, "1/Schedule/Default/la"))
print(requestValue(ws, "1/Schedule/List/Cooling/la"))
print(requestValue(ws, "1/Schedule/List/Heating/la"))
#Not sure why they are included, maybe an earlier version had a typo
print(requestValue(ws, "1/schedule/List/Cooling/la"))
print(requestValue(ws, "1/schedule/List/Heating/la"))
#What will happen next the temperature probably refers to the mode 
print(requestValue(ws, "1/Schedule/Next/la"))

#Returns an index to the icon, you can find the icons in the APK android file
print(requestValue(ws, "1/UnitIdentifier/Icon/la"))
#Appears to be null
print(requestValue(ws, "1/UnitIdentifier/Name/la"))

#Some information about the units
print(requestValue(ws, "1/UnitInfo/ModelNumber/la"))
print(requestValue(ws, "1/UnitInfo/UnitType/la"))
print(requestValue(ws, "1/UnitInfo/Version/IndoorSettings/la"))
print(requestValue(ws, "1/UnitInfo/Version/IndoorSoftware/la"))
print(requestValue(ws, "1/UnitInfo/Version/OutdoorSoftware/la"))
print(requestValue(ws, "1/UnitInfo/Version/RemoconSettings/la"))
print(requestValue(ws, "1/UnitInfo/Version/RemoconSoftware/la"))

print(requestValue(ws, "1/UnitStatus/ActiveState/la"))
print(requestValue(ws, "1/UnitStatus/ControlModeState/la"))
print(requestValue(ws, "1/UnitStatus/EmergencyState/la"))
print(requestValue(ws, "1/UnitStatus/ErrorState/la"))
print(requestValue(ws, "1/UnitStatus/InstallerState/la"))
print(requestValue(ws, "1/UnitStatus/ReheatState/la"))
print(requestValue(ws, "1/UnitStatus/TargetTemperatureOverruledState/la"))
print(requestValue(ws, "1/UnitStatus/WarningState/la"))
print(requestValue(ws, "1/UnitStatus/WeatherDependentState/la"))

#Didn't try that one ;)
print(requestValue(ws, "1/Reboot"))

As I am currently developing the binding I need some orientation on what you’re interested on:

How important is it for you to see and or modify the schedule?

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

0 voters

How important is it for you to see the consumption?

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

0 voters

Hello,
Look at this, you may be interested …


1 Like

In case someone didn’t know how to get the IP o the pump

from zeroconf import ServiceBrowser, Zeroconf
import ipaddress

class MyListener:

    def remove_service(self, zeroconf, type, name):
        print("Service %s removed" % (name,))

    def add_service(self, zeroconf, type, name):
        info = zeroconf.get_service_info(type, name)
        ip = ipaddress.IPv4Address(info.address)
        print("%s: Service %s added, service info: %s" % (ip, name, info))


zeroconf = Zeroconf()
listener = MyListener()
browser = ServiceBrowser(zeroconf, "_daikin._tcp.local.", listener)
try:
    input("Press enter to exit...\n\n")
finally:
    zeroconf.close()

Hi All,

Since a week or 2 I have the same adapter BRP069A62
And I am poking around this device. What I have found is that upon reboot, port 80 and 23 are open for about 30 min or so, I have not been able to guess a password for the telnet connection. And port 80 only does basic functions on the page like setting the IP address and reset.

For now I am able to read a lot of info, and change the temp and turn on / off. But am stuck trying to change anything of the schedule. The nested json is a bit of a pain.

Current output

User chosen schedule ID: 3
Next schedule change: Monday, Time: 2200, temp will be set to: 18.0
Complete schedule: $NULL|1|1700,200;2200,180;,;,;,;,;1700,200;2200,180;,;,;,;,;1700,200;2200,180;,;,;,;,;1700,200;2200,180;,;,;,;,;1700,200;2200,180;,;,;,;,;1000,200;1300,180;1700,200;2200,180;,;,;1000,200;1300,180;1700,200;2200,180;,;,
=====================================================
Connected to Daikin on: 192.168.1.247
Device function: function/SpaceHeating
The device is currently: on, and the operation is: heating
Brand: Daikin, LAN adapter Model: BRP069A62, Duty: HVAC controller, Firmware: 17003900, Software: 436DD123000, SerialNR: XXXXXXX
Given name by user: Central heating
=====================================================
Indoor unit model: EHYHBH08AAV3, software: ID9051, EEPROM: AS1706433-11A
Outdoor unit Softare: ID3904, User EEPROM: AS1705847-01F, User interface software: AS1705847-01F
=====================================================
Current Errors: 0, Current Warmings: 0, Emergency state: 0,  Installer state: 0
Reported Errors:
=====================================================
Did we manually override the scheduled temp: NO
Current indoor temp: 20.0
Current outdoor temp: 11.0
Current water temp: 46.5
Current target temp: 21.0
=====================================================
Water temp is calculated based on: WeatherDependent
=====================================================
Is child lock active: NO, Current pin is: 1234
=====================================================
Holiday start: 2020-03-06, Holiday End: 2020-03-06, Holiday mode active?: NO
=====================================================

Any one have a Idea to on how to change the schedule?

This is based upon changing the temp / on/off but does not seem to work:

{
	"m2m:rqp": {
		"op": 1,
		"to": "/[0]/MNAE/1/Schedule/Active",
		"fr": "/S",
		"rqi": "",
		"ty": 4,
		"pc": {
			"m2m:cin": {
				"con": "{"data":{"path":"/mn-cse-LONG_ID_STRING/MNAE/1/schedule/List/Heating/la","id":2}}",
				"cnf": "text/plain:0"
			}
		}
	}
}

changing: "cnf": "text/plain:0" to "cnf": "application/json:0" does not help either. The daiking heating app is a mess with cariables named every letter of the alphabet and not a decent name. All the values in a long variable… those devs…

My code is far from pretty as it is highly repetitive at the moment having all the URLS + their JSON key figured out, and some even nested JSON.

My indoor unit is the hvac+gas hybrid pump. And does not readout consumption as it is not connected to the lan module only the p1/p2 bus is. (which might be a next step to figure out on how to enable such things.)

Alos worthy of note:

  • The Random strings are not actually needed it seems.
  • The Url in the send JSON under fr, Also can be just a /
  • Which would reduce the code to: "{\"m2m:rqp\":{\"op\":2,\"to\":\"/[0]/MNAE/1/Schedule/List/Heating/la\",\"fr\":\"/\",\"rqi\":\""\"}}"

Cheers!

I’m looking to get a DAIKIN Altherma R Hybrid 8kW. Would that work with your REST sniffer based works ?

Did your plans to go for a binding succeed ? Or did your Python script mature ?

I’d like to instruct my heat pump to do its work when I have excess electric power from my solar system (SG ready function)
Can I do that via OpenHAB/REST or would I need the BRP069A61 ? (it has electrical inputs for that in addition to what the BRP069A62 can do).

Hey Markus,
I am currently in the process of switching everything over to a Homie/MQTT based architecture. I was just developing some code today. I guess by Monday I should have something to at least read the values and provide it to MQTT.
I think you could use the 2/Operation/Powerful feature to produce hot-water on demand, but I am not sure if there is a smarter/better way of doing that.

I will let you know when I have some public code.

Karsten

Thanks. Please let me make sure: we’re talking about Altherma R hybrid. That’s the ex-Rotex system.
It also is compatible with the BRP069A62/61 and provides that REST interface you access ?

Unfortunately I can not tell you whether the R-Hybrid is compatible with the BRP069A62 or alike, this you need to call Daikin for and ask them. Their website is not great on details.
But if you can use it, it should work with my tools.

Karsten

Hello everyone,
I just finished the very first version of my Daikin Adapter to Homie convention software. If you’re brave, feel free to test it and give me feedback :slight_smile:

This software needs Java Version 12 at least!

This software allows to discover a Daikin Adapter BRP069A62 in the network and read its endpoints. It will then publish it to an MQTT server according to the homie convention. This software is in its early stage, so please be careful when using it!

Launching it

You can launch it with java -jar daikin-0.0.1.jar which will give you a few options.

If you don’t know your IP address you can run java -jar daikin-0.0.1.jar -d and it will discover existing Daikin Adapters through MDNS, or you can just run java -jar daikin-0.0.1.jar -g to start a Setup GUI. If you launch the GUI for the first time, it will open a dialog, where you can enter the IP address of the adapter, or hit the discover button and get the first adapter found.

Once the proper UI opens you can hit the discover button which will try to identify all possible endpoints that can be read from this adapter. For this it will use the UnitProfile endpoint, as well as a text file with some other endpoints that I found in the app.
ADVANCED: You can also try your own endpoints with the -e option

Once all endpoints have been discovered (which may take a minute) the table for editing information should be filled.

alt text

Table columns

Pollinterval allows you to set how often things are read. You can get some of my preferred values by hitting the Guess polling button. But please double check if it is what you would expect and let me know if not.

  • NEVER items will be ignored and never read
  • ONCE items will be read only during startup. This is useful for things like Hardware version which will very like never change, but it is nice to have it available
  • MINUTELY items will be read every minute
  • HOURLY items will be read every hour
  • BI_HOURLY items will be read ever other hour
  • DAILY items will be read every 24h

Currently the polling interval is relative to the start time of the polling (-p option).

Name is a human readable name that will appear in a homie client.

Unit is the physical unit of that property. You can hit the guess units button and I set °C to all items ending in temperature. For some other items I can actually read out the unit from the unitprofile.

Format allows to specify the range of expected values. For numbers that is min:max for enums on, off,explode. See the homie convention for more information.

DataType is GUESSED from the current value. This may be WRONG! for example the temperature may be exactly 22°C during reading, but the unit can actually provide 22,1°C. So if you know that this field is not integer, change it to float or string.

Value If you hit discover you get the current value for information, this allows you make a better assessment of the data type or the expected values.

Final steps in GUI

At the bottom you can find some inputs related to the MQTT settings. The device name must match the homie convention which is lower-case [a-z0-9]+.

The last step of the GUI is to write the config file which is done by the save file button. The default name is PollingSettings.json

If you don’t like GUIs you can run java -jar daikin-0.0.1.jar -w 192.168.188.200 which will scan the given IP address and write a PollingSettings.json file that you can edit.

Running the polling service

Now that you have a proper PollingSettings.json you can finally launch java -jar daikin-0.0.1.jar -p which will start the polling and update the data in the homie convention.
Enjoy :slight_smile:
If you have any issues, please let me know and I will see if I can fix them. Please remember, this is an early version and will have Bugs! Don’t put it into production and forget about just yet…

@kbecker
Hi, i’m also trying to integrate the Daikin heat pump into my smart home systems.
What you achieved so far looks grat and quite promising, can you provide a list (or screenshots) of all the values / parameters that you could read from the Daikin Adapter?

Hello,
You can take a look at my PollingSettings.json here https://gist.github.com/KarstenB/15720b7c4440c4061cbf79b8fdd0e3a5

Karsten

Thanks for your reply!

As far as i saw things like Inlet and Outlet Temperature, Current Water Flow, etc. unfortunately aren’t included right? (Those would be the things i’d be especially interested in).

I found today following thread:
http://my-htd.de/Forum/t/215735/Rotex-HPSU-Daikin-Abtaugeschaedigte?page=3&PostSort=1
In the middle of the page there seems to be a new approach of getting (maybe also setting) values from the device: They managed to read the “D-Checker” plug with a simple USB to TTL stick and the original D-Checker software by Daikin. It seems that they could read even a lot more information and values from the heat pump than shown in the user interface control. Maybe someone knows if it’s possible to create a “Wifi to TTL” device (maybe with ESP8266 / ESP32) which reads the data and provides it to our SmartHomes via wifi?!?

Hi,
Yes, unfortunately the really cool and interesting data is not included :frowning:
Ok, I just read trough the last parts of the D-Checker story, and that is REALLY intriguing… I still have plenty of ESP32 laying around :smiley: So I might actually take a look at it.

Karsten

Hi,
Your work is really awesome. I just tested it and seems to work great, I still have to dive into the different values but that seems fine.
I have currently a EHVZ unit,so I don’t know if I can get a lot of infos, but still, having some basic information is great.
Again, thanks for your work and time.
I’ll try to give you a better feedback once I’ve integrated the data into Jeedom.
Regards,

Just found that there is also a Daikin “monitoring tool” (seems to be a d-checker light), which works via bluetooth and allows to get the data via an app on your mobile:


However couldn’t find this bluetooth adapter anywhere to buy and / or further information on what this adapter exactly does in it’s internals.

Great, thanks a lot for your contribution.
Unfortunately, this is conceptually somewhat incompatible to an openHAB integration, the better approach would be to write a binding.
Would you be willing to try integrating you code with the Daikin binding as suggested here?
Check back with @JimT, I’m sure he’ll give you a helping hand.