Configuration example for Danfoss ECL Comfort 310 Heating using modbus binding

Hi,

I am running the OpenHab 2.5 on my Raspberry Pi 4B

  • Release = Raspbian GNU/Linux 10 (buster)
  • Kernel = Linux 5.4.51-v7l+
  • Platform = Raspberry Pi 4 Model B Rev 1.1
  • openHAB 2.5.10-1 (Release Build)

I wanted to share my configuration for integrating the Danfoss Heating ECL Comfort 310 via modbus binding. This might be of help to anyone out there.

Things

// MODBUS ERROR CODES
// 1 => Illegal Function
// 2 => Illegal Data Address
// 3 => Illegal Data Value
// 4 => Slave Device Failure
// 5 => Acknowledge (processing continues on device)
// 6 => Slave Device Busy
// 7 => Negative Acknowledge
// 8 => Memory Parity Error
// 10 => Gateway Path Unavailable
// 11 => Gateway Target Device Failed to Respond

Bridge modbus:tcp:eclcomfort310 [ host="danfossheating.local", port=502, id=1 ] {
    Bridge poller alarms [ start=1023, length=2, refresh=30000, type="holding" ] {
        Thing data sumField1 [ readStart="1024", readValueType="int16" ]
        Thing data sumField2 [ readStart="1023", readValueType="int16" ]
    }

    // OPERATING MODE
    //
    // If one circuit is set to manual mode, it applies to all circuits (i.e. the controller is in
    // manual mode). When the mode is changed from manual to another mode in one circuit, it also
    // applies to all circuits in the controller. The controller automatically reverts to the
    // previous mode for each circuit if the information is available.
    //
    // Values:
    // 0 - Manual operation
    // 1 - Scheduled operation
    // 2 - Constant comfort temperature
    // 3 - Constant setback temperature
    // 4 - Frost protection/standby temperature
    Bridge poller operatingMode [ start=4200, length=2, refresh=30000, type="holding" ] {
        Thing data circuit1 [ readStart="4200", readValueType="int16", writeStart="4200", writeValueType="int16", writeType="holding" ]
        Thing data circuit2 [ readStart="4201", readValueType="int16", writeStart="4201", writeValueType="int16", writeType="holding" ]
    }

    // OPERATING STATUS
    // 
    // The operating status will be read as 0 (setback) if the operating mode is larger than 3.
    // Operating status was enlarged from 4 states to 8 states in firmware version 1.43
    //
    // Values:
    // 0 - Setback (circuit2 => Umwälzpumpe aus)
    // 1 - Pre-comfort
    // 2 - Comfort (circuit2 => Umwälzpumpe an)
    // 3 - Pre-setback
    // 4 - Holiday constant comfort temperature
    // 5 - Holiday 7-23h comfort temperature
    // 6 - Holiday constant setback temperature
    // 7 - Holiday frost protection/standby
    Bridge poller operatingStatus [ start=4211, length=2, refresh=30000, type="holding" ] {
        Thing data circuit1 [ readStart="4211", readValueType="int16", writeStart="4211", writeValueType="int16", writeType="holding" ]
        Thing data circuit2 [ readStart="4212", readValueType="int16", writeStart="4212", writeValueType="int16", writeType="holding" ]
    }

    // PUMPS
    //
    // P1: Umwälzpumpe Fußbodenheizung
    // P2: Umwälzpumpe Kreis 2 (nicht angeschlossen)
    // P3: Umwälzpumpe Warmwasser
    // P4: nicht angeschlossen
    Bridge poller pumps [ start=4005, length=4, refresh=10000, type="holding" ] {
        Thing data P1 [ readStart="4005", readValueType="int16" ]
        Thing data P3 [ readStart="4007", readValueType="int16" ]
    }

    // SENSORS
    //
    // S1: Außen-Temperatur
    // S2: Raumtemperaturfühler Fußbodenheizung (nicht angeschlossen)
    // S3: Vorlauf-Temperatur Fußbodenheizung
    // S4: Vorlauf-Temperatur Kreis 2 (nicht angeschlossen)
    // S5: Rücklauf-Temperatur Fußbodenheizung
    // S6: Rücklauf-Temperatur Kreis 2 (nicht angeschlossen)
    // S7: Rücklauf-Temperatur Kreis 3 (nicht angeschlossen)
    // S8: Raumtemperaturfühler Kreis 2 (nicht angeschlossen)
    // S9: Vorlauf-Temperatur Kreis 3 (nicht angeschlossen)
    // S10: Raumtemperaturfühler Kreis 3 (nicht angeschlossen)
    Bridge poller sensors [ start=10200, length=5, refresh=10000, type="holding" ] {
        Thing data S1 [ readStart="10200", readValueType="int16" ]
        Thing data S3 [ readStart="10202", readValueType="int16" ]
        Thing data S5 [ readStart="10204", readValueType="int16" ]
    }

    // HEAT CURVE
    //
    // The heat curve has six points consisting of an outdoor temperature coordinate and a flow
    // temperature coordinate. The outdoor temperature coordinates are not adjustable but the flow
    // temperature coordinates can be changed to give a flow temperature that corresponds to the
    // building’s thermodynamic properties.
    //
    // If an Application has a writable Slope, e.g. 11175, writing this value will cause adjustment
    // of the point values, e.g. addresses 11400–11405
    Bridge poller circuit1HeatCurve [ start=11174, length=1, refresh=30000, type="holding" ] {
        Thing data value [ readStart="11174", readValueType="int16", writeStart="11174", writeValueType="int16", writeType="holding" ]
    }
    Bridge poller circuit1HeatCurvePoints [ start=11399, length=6, refresh=30000, type="holding" ] {        
        Thing data tempAtM30 [ readStart="11399", readValueType="int16" ]
        Thing data tempAtM15 [ readStart="11400", readValueType="int16" ]
        Thing data tempAtM05 [ readStart="11401", readValueType="int16" ]
        Thing data tempAtP00 [ readStart="11402", readValueType="int16" ]
        Thing data tempAtP05 [ readStart="11403", readValueType="int16" ]
        Thing data tempAtP15 [ readStart="11404", readValueType="int16" ]
    }
    Bridge poller circuit1Temperatures [ start=11176, length=7, refresh=30000, type="holding" ] {
        Thing data min [ readStart="11176", readValueType="int16", writeStart="11176", writeValueType="int16", writeType="holding" ]
        Thing data max [ readStart="11177", readValueType="int16", writeStart="11177", writeValueType="int16", writeType="holding" ]
        Thing data cutOut [ readStart="11178", readValueType="int16", writeStart="11178", writeValueType="int16", writeType="holding" ]
        Thing data comfort [ readStart="11179", readValueType="int16", writeStart="11179", writeValueType="int16", writeType="holding" ]
        Thing data saving [ readStart="11180", readValueType="int16", writeStart="11180", writeValueType="int16", writeType="holding" ]
        Thing data maxInfluence [ readStart="11181", readValueType="int16", writeStart="11181", writeValueType="int16", writeType="holding" ]
        Thing data minInfluence [ readStart="11182", readValueType="int16", writeStart="11182", writeValueType="int16", writeType="holding" ]
    }
    Bridge poller circuit1Parameters [ start=11014, length=1, refresh=30000, type="holding" ] {
        Thing data reactionTimeRoomTemperatur [ readStart="11014", readValueType="int16", writeStart="11014", writeValueType="int16", writeType="holding" ]
    }
    Bridge poller circuit2Parameters [ start=12029, length=1, refresh=30000, type="holding" ] {
        Thing data maxReturnTemperature [ readStart="12029", readValueType="int16", writeStart="12029", writeValueType="int16", writeType="holding" ]
    }
}

Items

Group Danfoss "Danfoss ECL Comfort 310" <radiator> (HWR)

Number Danfoss_Alarms_Group1 "Alarmgruppe 1 [%s]" <alarm> (Danfoss) {channel="modbus:data:eclcomfort310:alarms:sumField1:number"}
Number Danfoss_Alarms_Group2 "Alarmgruppe 2 [%s]" <alarm> (Danfoss) {channel="modbus:data:eclcomfort310:alarms:sumField2:number"}

Number Danfoss_Aussentemperatur "Außentemperatur [JS(devide-by100.js):%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:sensors:S1:number"}

Number Danfoss_FBHeizung_Modus "Fußbodenheizung Modus [MAP(danfoss-operationmode.map):%s]" <heating> (Danfoss) {channel="modbus:data:eclcomfort310:operatingMode:circuit1:number"}
Number Danfoss_FBHeizung_Status "Fußbodenheizung Status [MAP(danfoss-operationstatus.map):%s]" <heating> (Danfoss) {channel="modbus:data:eclcomfort310:operatingStatus:circuit1:number"}
Switch Danfoss_FBHeizung_Umwaelzpumpe "Fußbodenheizung Umwälzpumpe [MAP(switch.map):%s]" <pump> (Danfoss) {channel="modbus:data:eclcomfort310:pumps:P1:switch"}
Number Danfoss_FBHeizung_Tagestemperatur "Fußbodenheizung Tages-Temperatur [JS(devide-by10.js):%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1Temperatures:comfort:number"}
Number Danfoss_FBHeizung_Nachttemperatur "Fußbodenheizung Nacht-Temperatur [JS(devide-by10.js):%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1Temperatures:saving:number"}
Number Danfoss_FBHeizung_Heizkurve "Fußbodenheizung Heizkurve [JS(devide-by10.js):%s]" <line> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1HeatCurve:value:number"}
Number Danfoss_FBHeizung_Heizkurve_M30 "Fußbodenheizung Heizkurve (-30°) [%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1HeatCurvePoints:tempAtM30:number"}
Number Danfoss_FBHeizung_Heizkurve_M15 "Fußbodenheizung Heizkurve (-15°) [%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1HeatCurvePoints:tempAtM15:number"}
Number Danfoss_FBHeizung_Heizkurve_M05 "Fußbodenheizung Heizkurve (-05°) [%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1HeatCurvePoints:tempAtM05:number"}
Number Danfoss_FBHeizung_Heizkurve_P00 "Fußbodenheizung Heizkurve (+00°) [%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1HeatCurvePoints:tempAtP00:number"}
Number Danfoss_FBHeizung_Heizkurve_P05 "Fußbodenheizung Heizkurve (+05°) [%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1HeatCurvePoints:tempAtP05:number"}
Number Danfoss_FBHeizung_Heizkurve_P15 "Fußbodenheizung Heizkurve (+15°) [%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1HeatCurvePoints:tempAtP15:number"}
Number Danfoss_FBHeizung_Min "Fußbodenheizung Vorlauftemperatur Min. [%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1Temperatures:min:number"}
Number Danfoss_FBHeizung_Max "Fußbodenheizung Vorlauftemperatur Max. [%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1Temperatures:max:number"}
Number Danfoss_FBHeizung_CutOut "Fußbodenheizung Gew. Temperatur [%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1Temperatures:cutOut:number"}
Number Danfoss_FBHeizung_Raumeinfluss_Min "Fußbodenheizung Raumeinfluss Min. [JS(devide-by10.js):%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1Temperatures:minInfluence:number"}
Number Danfoss_FBHeizung_Raumeinfluss_Max "Fußbodenheizung Raumeinfluss Max. [JS(devide-by10.js):%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1Temperatures:maxInfluence:number"}
Number Danfoss_FBHeizung_Raumeinfluss_Zeit "Fußbodenheizung Anpassungszeit [%s s]" <time> (Danfoss) {channel="modbus:data:eclcomfort310:circuit1Parameters:reactionTimeRoomTemperatur:number"}

Number Danfoss_FBHeizung_Vorlauf "Fußbodenheizung Vorlauf [JS(devide-by100.js):%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:sensors:S3:number"}
Number Danfoss_FBHeizung_Ruecklauf "Fußbodenheizung Rücklauf [JS(devide-by100.js):%s °C]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:sensors:S5:number"}

Number Danfoss_Warmwasser_Modus "Warmwasserheizung Modus [MAP(danfoss-operationmode.map):%s]" <heating> (Danfoss) {channel="modbus:data:eclcomfort310:operatingMode:circuit2:number"}
Number Danfoss_Warmwasser_Status "Warmwasserheizung Status [MAP(danfoss-operationstatus.map):%s]" <heating> (Danfoss) {channel="modbus:data:eclcomfort310:operatingStatus:circuit2:number"}
Switch Danfoss_Warmwasser_Umwaelzpumpe "Warmwasserheizung Umwälzpumpe [MAP(switch.map):%s]" <pump> (Danfoss) {channel="modbus:data:eclcomfort310:pumps:P3:switch"}
Number Danfoss_Warmwasser_RuecklaufMax "Warmwasserheizung Rücklauf Max. [%s]" <temperature> (Danfoss) {channel="modbus:data:eclcomfort310:circuit2Parameters:maxReturnTemperature:number"}

All the best,
Bechte

2 Likes

Where did you find a list of available modbus registers and descriptions? Trying to read data from my Danfoss ECL 296.