Integrate Emmeti into HA

Good morning,
I’m new to Home Assistant but I’m looking for a solution if it’s possible.
They installed photovoltaic panels with the “Fronius” inverter, the Emmeti boiler with the “Febos Energy” system (https://emmeti.com/en/products/air-conditioning/residential-inverter-air-to-water-heat-pumps/air-to-water-heat-pump-mirai-smi-febos-4-0/febos-energy) and the “Febos Crono” (https://emmeti.com/en/products/air-conditioning/residential-inverter-air-to-water-heat-pumps/air-to-water-heat-pump-mirai-smi-febos-4-0/febos-crono) from where you can see all the energy of the house and also that of the panels. I saw in the manual that the Febos Energy communicates with the Febos Crono via the Modbus RS465. My question is: is it possible to make everything communicate with the Home Assistant? See the electricity produced by the panels, consumed by the house and consumption in real-time.
Thank you

hi. have found any solution for this?

I’m also looking for such an integration.

I made such an integration using the Febos WebApp
Using some curl, jq, and a shell script to dump all parameters to json; and that json is ingested in HA.
Script runs every 30s and updates the dashboard.

This will require some coding skills. Maybe this will give you some ideas. Don’t want to share the code since I am not adhering to the ToC of the service…

How do you do?

Can you share the code and how to do it?

No, as said before I am ‘abusing’ the website to pull the data. If you can code, you can figure it out. if you cannot code, you should not be running this as it requires understanding of what you are doing.
I am working on a solution that does not require the online components. I intent to listen to the modbus communication (the ‘wires’ between the febos crono and the heatpump) and sending that data to HA using MQTT. Once I have a working prototype I will share the code.

Thanks for that. Looking forward to it

Got some part running, but unfortunately the “internal” status (like room temperature) is not exposed on the modbus. And some values do not make sense atm.

That’s great news, do you still have to test it or can you share the code?

how do you do this?
i have a rs485 adapter connected to the end of the bus. the program i use to read the data is “modscan32” but i can’t read anything.

I don’t have it connected to the end of the bus, but rather in the middle (connected two extra wires to my Febos Energy. I removed R7 from the RS485 adapter per these instructions: RS485 sniffer
I then compiled this code: modbus-sniffer/README.md at 8720c4649a29e2090f9a7d363eed15cdc9a5f5ab · alerighi/modbus-sniffer · GitHub. (all Linux and Raspberry Pi)

Speed of the bus is 9600 baud, no stop bits, theoretically Even parity. Ensure that you have connected the A and B wires correctly to the converter, and power it with 3.3 volts only (otherwise you will damage your Pi or ESP32).

– EDIT –
Also, modscan32 per it’s website is a Client device. You cannot have 2 clients on a Modbus (the other being your Febos Crono). If you insist on running a 2nd client device, ask the heatpump (id 3) for a register value (e.g. 8986, outside temperature).

These are all the registers I pulled from the website and other sources. Some of these registers are never exposed on the modbus as they are internal to the Febos Crono:

// Febos Energy
“R8000” : “Energy DIE1 (Most significant word)”
“R8001” : “Energy DIE1 (Least significant word)”,
“R8002” : “Average Power DIE1”
“R8003” : “Energy DIE2 (Most significant word)”
“R8004” : “Energy DIE2 (Least significant word)”,
“R8005” : “Die2 Average Power”,
“R8006” : “Energy DIE3 (Most significant word)”,
“R8007” : “Energy DIE3 (Least significant word)”,
“R8008” : “Average Power DIE3”,
“R8010” : “Energy DIE4 (Least significant word)”,
“R8011” : “Die4 Average Power”,
“R8100” : “TAE1 voltage (the voltage is unique for the two channels)”,
“R8101” : ‘Positive active energy TAE1 (Most significant word)’,
“R8102” : “Positive active energy TAE1 (Least significant word)”,
“R8103” : “Negative active energy TAE1 (Most significant word)”,
“R8104” : “TaE1 Negative active energy (Least significant word).”
“R8105” : “TAE1 Active Power”,
“R8106” : “TAE2 Positive active energy (Most significant word)”
“R8107” : “TAE2 Positive active energy (Least significant word)”,
“R8108” : “TAE2 Negative active energy (Most significant word).”
“R8109” : “TAE2 Negative active energy (Least significant word)”,
“R8110” : “Active power TAE2”
“R8111” : “Current TAE1”,
“R8112” : “Current TAE2”,
“R8113” : “Phase shift TAE1”,
“R8114” : “Phase shift TAE2”,
“R8200” : “Superparameter 1”,
“R8201” : “Superparameter 2”,
“R8202” : “Superparameter 3”,
“R8203” : “NTC1 probe offset”,
“R8204” : “NTC2 probe offsets”,
“R8205” : “not used”,
“R8206” : “not used”,
“R8207” : “not used”,
“R8208” : “Minimum HP counter pulse duration”,
“R8209” : “Maximum Heat-pump counter pulse duration”,
“R8210” : “Value corresponding to 1 pulse”,
“R8211” : “Minimum pulse duration counter Socket”,
“R8212” : “Maximum counter pulse duration Socket”,
“R8213” : “Value corresponding to 1 pulse”,
“R8214” : “Minimum Photo-voltaic counter pulse duration”,
“R8215” : “Maximum Photo-voltaic  counter pulse duration”,
“R8216” : “Value corresponding to 1 pulse”,
“R8217” : “Minimum House meter pulse duration”,
“R8218” : “Maximum House meter pulse duration”,
“R8219” : “Value corresponding to 1 pulse”,
“R8220” : “Heat-pump reference power (in KW)”,
“R8221” : “Socket reference power (in KW)”
“R8222” : “Photo-voltaic reference power (in KW)”
“R8223” : “House reference power (in KW)”
“R8300” : “No. of pulses rejected for Photo Voltaic(too short)”,
“R8301” : “No. pulses discarded for Photo Voltaic (too long)”,
“R8302” : “No. pulses discarded for Photo Voltaic (too close)”,
“R8303” : “No. pulses discarded for House (too short)”,
“R8304” : “No. pulses discarded for House (too long)”,
“R8305” : “No. pulses discarded for House (too close)”,
“R8306” : “No. pulses discarded for Heat-pump (too short)”,
“R8307” : “No. pulses discarded for Heat-pump (too long)”,
“R8308” : “No. pulses discarded for Heat-pump (too close)”,
“R8309” : “No. pulses discarded for Socket (too short)”,
“R8310” : “No. pulses discarded for Socket (too long)”,
“R8311” : “No. pulses discarded for Socket (too close)”,
“R8400” : “CH1 voltage calibration”,
“R8401” : “CH1 current calibration”,
“R8402” : “CH2 current calibration”,
“R8403” : “CH1 active power offset”,
“R8404” : “CH2 active power offset”,
“R8405” : “CH1 voltage phase compensation”,
“R8406” : “CH1 current phase compensation”,
“R8407” : “CH2 current phase compensation”,
“R8408” : “Contents of the CH1 voltage calibration register”,
“R8409” : “Contents of the CH1 current calibration register (most significant word)”,
“R8410” : “Contents of the CH1 current calibration register (Least significant word)”,
“R8411” : “Contents of the CH2 current calibration register (Most significant word)”,
“R8412” : “Contents of the CH2 current calibration register (Least significant word)”,
“R8413” : “Contents of the CH1 phase shift calibration register”,
“R8414” : “Contents of the CH2 phase shift calibration register”,
// Febos Crono
“R8500” : “Batch number”,
“R8501” : “Production batch year”,
“R8502” : “Serial number - 1”,
“R8503” : “Serial number - 1”,
“R8504” : “Serial number - 1”,
“R8504” : “Serial number - 1”,
“R8505” : “Serial number - 1”,
“R8506” : “Firmware release - character 1”,
“R8507” : “Firmware release - character 2”,
“R8508” : “Firmware release - character 3”,
“R8509” : “Firmware release - character 4”,
"R8510” : “Firmware release - character 5”,
“R8511” : “Firmware release - character 6”,
“R8600” : “Production date (top part)”,
“R8638” : “Power configuration 1”,
“R8639” : “Power configuration 2”,
“R8640” : ‘Power configuration 3’,
“R8641” : ‘Configuring powers 4’,
“R8642” : ‘Power configuration 5’,
“R8648” : “Season”,
“R8660” : “Set humidity for summer (SetRh_E)”,
“R8661” : “Set humidity for winter (SetRh_I)”
“R8664” : “Name Febos Crono”,
“R8665” : “Maximum power supplied”,
“R8666” : “Installed PV power”,
“R8670” : “Offset Temperature Sensor Febos Crono”,
“R8671” : “Offset Humidity sensor Febos Crono”,
“R8672” : “Window contact status”,
“R8673” : “AUTOMATIC presence contact status”,
“R8676” : “MANUAL presence contact status.”
“R8678” : “Temperature Sensor Febos Crono”,
“R8679” : “Humidity Sensor Febos Crono”,
“R8680” : “Domestic Hot Water",
“R8681” : “Temperature Call”,
“R8682” : “Humidity Call”,
“R8683” : “Season”,
“R8684” : “Set comfort temperature (Summer)”,
“R8685” : “Comfort Start Time (Summer)”,
“R8686” : “Attenuation Set (Summer)”,
“R8687” : “Attenuation time (Summer)”,
“R8688” : “Set comfort temperature (Winter)”,
“R8689” : “Start comfort time (Winter)”,
“R8690” : “Set Attenuation (Winter)”
“R8691” : “Attenuation Timetable (Winter)”
“R8692” : “Boost”,
“R8698” : “Maximum Installed Power”,
“R8702” : “Set Febos Crono Temperature Displayed”,
“R8703” : “Temperature Febos Crono Sensor Displayed”,
“R8704” : “Febos Crono Sensor Humidity Displayed”,
“R8750” : “Febos Crono Sensor Temperature”,
“R8751” : "Febos Crono Humidity sensor (relative humidity)",
“R8752” : "Dew Point Febos Crono",
“R8753” : "Outdoor temperature",
“R8754” : “Water Inlet Temperature”,
“R8755” : "Domestic Hot Water temperature",
“R8756” : "Power drawn from the grid",
“R8757” : “Power fed into the grid”,
“R8758” : "Power House",
“R8759” : “Power Photo Voltaic”,
“R8760” : “Power Heat-pump”,
“R8761” : “Power Domestic Hot Water,
“R8762” : “Powe _Power1”,
“R8763” : “Power Risc_Heat-pump”,
“R8764” : “Power Raff Heat-pump”,
“R8765” : “Energy drawn from the grid”,
“R8766” : “Energy fed into the grid”,
“R8767” : “Energy House”,
“R8768” : “Energy Photo Voltaic”,
“R8769” : “Energy Heat-pump”,
“R8770” : “Energy Domestic Hot Water”,
“R8771” : “Energy Socket”,
“R8772” : “Energy Risc Heat-pump”,
“R8773” : “Energy Raff Heat-pump”,
“R8774” : “EER/COP”,
// Heat pump
“R8967” : “Defrost On/Off”,
“R8971” : “IO - BB”,
“R8972” : “IO - 100”,
“R8973” : “IO - 101”,
“R8974” : “IO - 102”,
“R8975” : “IO - 103”,
“R8976” : “IO - 104”,
“R8977” : “IO - 105”,
“R8986” : “Heat-pump External Temperature”,
“R8987” : “Heat-pump water outlet temperature”,
“R8988” : “Heat-pump water inlet temperature”,
“R8989” : “Domestic Hott Water temperature”,
“R9000” : “IO - 200”,
“R9001” : “IO - 201”,
“R9002” : “IO - 202”,
“R9003” : IO - 203”,
“R9004” : “IO - 204”,
“R9005” : “IO - 205”,
“R9006” : “IO - 206”,
“R9007” : “IO - P1”,
“R9008” : “Heat-pump frequency step”,
“R9042” : ‘Minimum radiant water temperature’,
“R9051” : ‘Current Heat-pump water temperature’,
“R9051” : ‘Set Heat-pump water temperature’,
“R9052” : ‘Heat-pump water temperature’,
“R9071” : “Additional Heating On/Off”,
“R9072” : “3-way valve”,
“R9073” : “ECO HOT Water”,
“R9074” : “Hot Water electrical element On/Off”,
“R9076” : “Photovoltaic”,
“R9078” : “Antifreeze”,
“R9079” “ Antifreeze_2”,
“R9089” : “Radiant system return temperature alarm”,
“R9090” : “Inertial accumulation alarm”,
“R9095” : “Outside temperature alarm”,
“R9096” : “Water inlet temperature alarm”,
“R9097” : “Water outlet temperature alarm”,
“R9098” : “Domestic Hot Water temperature alarm”,
“R9099” : “Heat-pump Alarm”,
“R9102” : “Low water temperature alarm”,
“R9103” : “High water temperature alarm”,
“R9104” : “Low flow alarm”,
“R9120” : “Heat-pump water flow rate”,
“R9121” : “Heat-pump absorbed power”,
“R9122” : “Heat-pump Power Yield (In Heating)”
“R9123” : “Heat-pump Power Yield (Cooling)”,
“R9126” : ‘Domestic Hot Water Power Yield’,
“R9127” : ‘Not defined’,
“R9128” : “House Power Yield”,
“R9129” : “Power”,
“R16384” : “Heat-pump On/Off”,
“R16385” : “Heat-pump Season Summer/Winter”,
“R16444” : “Set water temp time slot P1 in heating”,
“R16445” : “Start time slot P2 in heating”,
“R16446” : ‘Set water temp time slot P2 in heating’,
“R16447” : ‘Start P3 time slot in heating’,
“R16448” : “Set water temp time slot P3 in heating”,
“R16449” : “Start time slot P4 in heating”,
“R16450” : “Set water temp time slot P4 in heating”,
“R16451” : ‘Set water temp time slot P1 in cooling’,
“R16452” : ‘Start time slot P2 in cooling’,
“R16453” : ‘Set water temp time slot P2 in cooling’,
“R16454” : “Start time slot P3 in cooling”,
“R16455” : ‘Set water temp time slot P3 in cooling’,
“R16456” : ‘Start time slot P4 in cooling’,
“R16457” : “Set water temp time slot P4 in cooling”,
“R16493” : “Time of the first Domestic Hot Water request”,
“R16494” : “Set temp of the first Domestic Hot Water request”,
“R16495” : “Set temp of the second Domestic Hot Water request”,
“R16496” : “Set temp of the second Domestic Hot Water request”,
“R16497” : “Domestic Hot Water holding temp set”,
“R16515” : “Dew point/Moisture Set”

but does this solution also work with Febos Energy or do you always need a separate/additional modbus?

Thanks

There is only ONE modbus. The modbus communicates between the Febos Crono and the heatpump. The Febos Energy is an optional add-on. It was an easy point for me to connect the modbus device to. But you don’t need it.

I think it is wise to read up on how modbus actually works before connecting things to it. Otherwise things might break… See for instance this link (RS485 sniffer), chapter HW setup. This explains a bit about ModBus

ok, I’m not an expert on these things, so I didn’t understand one thing, if I have the Febos Energy what do I have to do to connect it to the home assistant?
Thanks

edit:
I have this device, could it be useful to me? USB to RS485

I still haven’t been able to connect to the bus. However, at the IP address of the Febus Crono I was able to find this file: emmeti-374-config.json
There are all the values ​​present with the unit of measurement, the type of data and other parameters indicated.

I also checked the website of the app “emmeti.aq-iot.net” and the parameters that can be modified, at least in my case, are only the following:

8683 = season = boolean = 0/1 = 0 cold water for summer = 1 hot waret for winter
8676 = manual presence = boolean = 0/1 = 1 not present = 0 present
8685 = comfort time (summer) = integer = number value for time (ex: 540 mean 09:00)
8687 = attenuation time (summer) = integer = number value for  time
8689 = comfort time (winter) = integer = number value for  time
8691 = attenuation time (winter) = integer = number value for  time
8684 = comfort temp (summer) = integer = number for  temp (ex: 251 mean 25.1°C)
8688 = comfort temp (winter) = integer = number for temp
8686 = attenuation temp (summer) = integer = number for temp
8690 = attenuation temp (winter) = integer = number for temp
8660 = humidity for summer = integer = number for humidity
8661 = humidity for winter = integer = number for humidity
16384 = heat-pump On/Off = boolean = 0/1 = 0 off = 1 on
8692 = boost = boolean = 0/1 = 0 off = 1 on
16497 = domestic hot water holding temp = integer = number for temp
16494 = temp domestic hot water t1 = integer = number for temp
16496 = temp domestic hot water t2 = integer = number for temp
16493 = time domestic hot water t1 = integer = number value for time
16495 = time domestic hot water t2 = integer = number value for time

I have the same device. This to be exact. I tried to connect to various points of the bus but without success. I also tried to remove the febus-crono but I still can’t read any value.

You’re on the right way. Use a bit of curl, get the token, call the webservice, and be golden…

You have to listen to the modbus. Do not inject reads or whatever. Just listen, the Crono will retrieve registers from the heat pump and optionally Febos Energy.
With this code I am able to sniff the bus and get the results like this:

output file: run1.pcap
serial port: /dev/ttyAMA0
port type: 8E1 9600 baud
time interval: 15000
starting modbus sniffer
-- SNIP --
captured packet 37: length = 8, CRC: 4CCE = 4CCE [OK]
	DUMP:  01 03 23 00 00 06 CE 4C
captured packet 38: length = 17, CRC: 5C09 = 5C09 [OK]
	DUMP:  01 03 0C 01 9B 00 18 00 08 00 05 00 0D 00 19 09 5C
captured packet 39: length = 8, CRC: 5E9E = 5E9E [OK]
	DUMP:  01 03 23 61 00 16 9E 5E
captured packet 40: length = 49, CRC: B847 = B847 [OK]
	DUMP:  01 03 2C 00 00 01 54 00 00 00 00 00 18 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 47 B8
captured packet 41: length = 8, CRC: 6AEE = 6AEE [OK]
	DUMP:  01 03 23 9E 00 19 EE 6A
captured packet 42: length = 55, CRC: 0D77 = 0D77 [OK]
	DUMP:  01 03 32 00 00 00 00 00 00 00 00 00 00 00 00 03 B3 00 00 FF 98 00 00 00 00 00 00 00 00 98 41 00 07 27 37 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 77 0D
captured packet 43: length = 8, CRC: 6F1E = 6F1E [OK]
	DUMP:  01 03 23 B5 00 0B 1E 6F
captured packet 44: length = 27, CRC: 27C7 = 27C7 [OK]
	DUMP:  01 03 16 00 00 00 00 00 00 00 00 00 FA 00 3A 00 A2 00 00 00 00 00 00 00 00 C7 27
captured packet 45: length = 11, CRC: 1B2E = 1B2E [OK]
	DUMP:  01 10 23 BA 00 01 02 00 3A 2E 1B
captured packet 46: length = 8, CRC: A82B = A82B [OK]
	DUMP:  01 10 23 BA 00 01 2B A8
captured packet 47: length = 8, CRC: 968F = 968F [OK]
	DUMP:  01 03 23 40 00 11 8F 96
captured packet 48: length = 39, CRC: 43B7 = 43B7 [OK]
	DUMP:  01 03 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 B7 43
captured packet 49: length = 8, CRC: DA71 = DA71 [OK]
	DUMP:  01 03 40 36 00 29 71 DA
captured packet 50: length = 87, CRC: 2B95 = 2B95 [OK]
	DUMP:  01 03 52 01 E0 00 F0 04 B0 00 28 00 02 01 5E 01 A4 01 5E 03 48 01 5E 05 0A 01 5E 00 C8 01 E0 00 C8 03 48 00 C8 04 B0 00 C8 40 4A 00 0A 01 A4 00 0A 02 3A 00 0A 04 B0 00 0A 00 96 FF 9C 00 3C 01 04 00 C8 00 1E 01 68 01 90 00 A0 00 14 01 90 00 D2 00 C8 00 14 95 2B

This is for instance an interesting one: 01 03 23 18 00 0E 4F 8D
Decode it using Online Modbus RTU Parser & Modbus TCP Parser and find that this is the client (Crono) reading (0x03) server 01 (the heat pump) for register 8984 (0x1218), quantity 14 (0x000E).

The response: 01 03 1C 01 48 00 F8 01 A1 01 7B 02 29 7F FF 7F FF FF A2 00 00 00 00 00 00 7F FF 7F FF 00 00 65 F6
gives the values for the registers: 0x0148 (328), 0x00F8 (248), 0x01A1 (417), 0x017B (379), 0x0229 (553), 0x7FFF (32767), 0x7FFF (32767), 0xFFA2 (65442), 0x0000 (0), 0x0000 (0), 0x0000 (0), 0x7FFF (32767), 0x7FFF (32767), 0x0000 (0)

Now the 2nd value is register 8986 (outside temp) which was at the time of the scan 24.8 degrees (I verified this with the website). This is how I am trying to play with this.