Heat Pump Mastertherm/CAREL - which protocol for integration (Modbus, BACnet, SNMP)

Please help me to choose best protocol to easily monitor&manage my Heat pump Mastertherm with CAREL control system by OH 2.0. The CAREL with pCOWeb Ethernet serial card enable to use Modbus, BACnet, SNMP (and log&send email + web interface). Up till now I was using only web interface and logging of alerts by mail.

Hi hradocan,

I think that there is possibile to read data from XML too, but it’s not possible to write data in that way.
I want to manage a pCO Compact and I have a pCOWeb card like you.
I’m going to use Modbus just because pCO can use it natively and I suppose that takes less resource.
Sorry for my bad english, I’m italian.
Let’s keep each other update about the progress!

Hi Bota87,
I’m actually trying to use BACnet. It seems to me little bit easier to configure.
Fist I ran yabe https://sourceforge.net/projects/yetanotherbacnetexplorer/ to explore my devices on home net. Be carefull and use ethernet connection and not WIFI.
Next I use org.openhab.binding.bacnet-1.9.0-SNAPSHOT.jar with OpenHAB.1.8.3 from https://github.com/Code-House/BACNet-openHAB-binding with following excerpt from configs:


######################### Bacnet Binding################
#Refresh interval in milliseconds (optional, defaults to 60000ms)
####Set the bacnet network address


Number Temp_HP_Outside “TC vonk. teplota [%.2f °C]” {bacnet=“device=77000,type=analogValue,id=3,refreshInterval=120000”}
Number HP_Compressor_startcounter “TC kompresor starty [%d]” {bacnet=“device=77000,type=analogValue,id=1012,refreshInterval=120000”}
String HP_Main_Switch “TC zapnute [%s]” {bacnet=“device=77000,type=binaryValue,id=3,refreshInterval=120000”}
String HP_Compressor_Switch “TC kompresor [%s]” {bacnet=“device=77000,type=binaryValue,id=5,refreshInterval=120000”}

Next I put in into OpenHAB 2.0. It seems, what it collects data (in log). But I was not able to display it.
I will inform you about further progress.

Hi hradocan,
I have configured modbus binding in OH2 in this way:

Number Temperature_gCucina   	"Temperatura Cucina [%.1f °C]"				<temperature>	(Temperature, gCucina)  	{ modbus="pcoTemp:0" }
Number Temperature_gSala    	"Temperatura Sala [%.1f °C]"				<temperature>	(Temperature, gSala)  		{ modbus="pcoTemp:1" }
Number Temperature_gCamRagazzi  "Temperatura Camera Ragazzi [%.1f °C]"		<temperature>	(Temperature, gCamRagazzi)  { modbus="pcoTemp:2" }
Number Temperature_gStudio    	"Temperatura Studio [%.1f °C]"				<temperature>	(Temperature, gStudio)  	{ modbus="pcoTemp:3" }
Frame label="Temperature" {
		Text item=Temperature_gCucina 
		Text item=Temperature_gSala
		Text item=Temperature_gCamRagazzi
		Text item=Temperature_gStudio    

For now I’m able to see the rooms temperature from the basicui.
I have to figure how to divide them by 10.

Now I have the rooms temperatures, humidity values and I can set the thermostat setpoint!
I don’t know if nobody is interessed but my system is a Carel pCO Compact with rehau software for manage a radiant heating ceiling system.
With this 2 rules I can convert the analog values from the modbus (divide per 10 in read, multiply in write).

rule "Conversione variabili analogiche pco LETTURA"
	Item gAnalogicPco received update
    gAnalogicPco?.members.forEach(sourceEl| {
			if (sourceEl.state instanceof DecimalType) {
				var Number temp = (sourceEl.state as DecimalType) / 10
				temp = Math::round(temp.floatValue * 10.0) / 10.0
				gAnalogicPcoOK?.members.forEach[targetEl |
					if((targetEl.name.toString + "_pco" == sourceEl.name.toString) && ((targetEl.state instanceof DecimalType == false) || (targetEl.state as DecimalType != temp))){
						logInfo("LogAnalogicPco", "aggiornamento " + targetEl.name + " -> " + temp)
						postUpdate(targetEl, temp)
					} ]

rule "Conversione variabili analogiche pco SCRITTURA"
	Item gAnalogicPcoOK received update
    gAnalogicPcoOK?.members.forEach(sourceEl| {
			if (sourceEl.state instanceof DecimalType) {
				var Number temp = (sourceEl.state as DecimalType)
				temp = (temp * 10).intValue
				gAnalogicPco?.members.forEach[targetEl |
					if((targetEl.name.toString == sourceEl.name.toString + "_pco") && ((targetEl.state instanceof DecimalType == false) || (targetEl.state as DecimalType != temp))){
						logInfo("LogAnalogicPcoOK", "aggiornamento " + targetEl.name + " -> " + temp)
						sendCommand(targetEl, temp)
					} ]

Hi Bota,

you use the pCOWeb card? We are installing an Ecoforest Heatpump with Carel pCO control system. would like to integrate in our home automation system too. I think by default the expansion card that comes with the HP is the RS485 (which uses the thermostat also). Did you purchase this from the supplier from the heatpump? I’m not sure my brand supports the different add-on cards, although interior is also Carel.

Hi Philippe,
I bought the card on ebay.
I think is easier and cheaper for you to use directly the RS485

Hi Bota, can you share mith me your knowledge?
I have PicoSistema3 and soon I get the PicoWeb card I need to configure OpenHab.

in your Items config:

gAnalogicPco what is?

Ciao Gabriele,

sono cambiate molte cose da quando ho scritto quelle regole.
Ti riporto sotto una parte della nuova configurazione compatibile con la versione 2 del binding modbus.
Trovi ulteriori dettagli e molte indicazioni utili sulla documentazione


Bridge modbus:tcp:pco [ host="" ] {

    // Temperature stanze
    Bridge poller temps [ start=1, length=7, refresh=1000, type="input" ] {
        Thing data cucina       [ readStart="1", readValueType="int16", readTransform="JS(divide10.js)" ]
        Thing data sala         [ readStart="2", readValueType="int16", readTransform="JS(divide10.js)" ]

    // Setpoint stanze
    Bridge poller setpoint [ start=61, length=7, refresh=1000, type="holding" ] {
        Thing data cucina       [ readStart="61", readValueType="int16", readTransform="JS(divide10.js)", writeStart="61", writeValueType="int16", writeTransform="JS(multiply10.js)", writeType="holding" ]
        Thing data sala         [ readStart="62", readValueType="int16", readTransform="JS(divide10.js)", writeStart="62", writeValueType="int16", writeTransform="JS(multiply10.js)", writeType="holding" ]

Number Temp_Cucina   	"Temperatura Cucina [%.1f °C]"  <temperature>   [ "CurrentTemperature" ]    { channel="modbus:data:pco:temps:cucina:number" }
Number Temp_Sala    	"Temperatura Sala [%.1f °C]"	<temperature>   [ "CurrentTemperature" ]    { channel="modbus:data:pco:temps:sala:number" }

Number Setpoint_Cucina  "Setpoint Cucina [%.1f °C]"	    <heating>       [ "TargetTemperature" ]     { channel="modbus:data:pco:setpoint:cucina:number" }
Number Setpoint_Sala    "Setpoint Sala [%.1f °C]"	    <heating>   	[ "TargetTemperature" ]     { channel="modbus:data:pco:setpoint:sala:number" }

Grazie della dritta…
alla fine “divide10.js” effettua il lavoro che prima usavi con le regole…


This post was flagged by the community and is temporarily hidden.