Hi,
I do have an Danfoss ECL 310 controller which is using TCP/IP Modbus.
I do have version V1.30 (4572) with Application A247_1 V01.
I search a lot around but I could not find so far any customer component in order to control my heating system deliver sensor data and so on.
What I was able to perform myself was to read out some register from the modbus plattform which is ok but I would like to be able to change even some temp setting on that heating which is not working for me so far.
Does anyone have here some more knowledge in that.
I used the ECL Tool in order to connect and read out the register from the modbus which is in HA then always one register less than in the ECL tool, anyway I get the values in read.
But on some I’m not able to write some changes values back.
modbus.yaml
- name: ecl310
type: tcp
host: xxx.xxx.xxx.xxx
port: 502
delay: 5
timeout: 10
climates:
- name: ECL310_Soll_Temp
slave: 254
scan_interval: 600
address: 11179
input_type: holding
# count: 1
data_type: int16
max_temp: 30
min_temp: 10
offset: 0
precision: 1
scale: 0.1
target_temp_register: 11179
temp_step: 0.5
temperature_unit: C
- name: ECL310_absenk_Temp
slave: 254
scan_interval: 600
address: 11180
input_type: holding
# count: 1
data_type: int16
max_temp: 30
min_temp: 10
offset: 0
precision: 1
scale: 0.1
target_temp_register: 11180
temp_step: 0.5
temperature_unit: C
sensors:
- name: ECL310_S1
slave: 254
scan_interval: 300
address: 10200
input_type: input
unit_of_measurement: °C
device_class: temperature
# count: 1
scale: 0.01
offset: 0
precision: 1
data_type: int16
- name: ECL310_S2
slave: 254
scan_interval: 300
address: 10201
input_type: input
unit_of_measurement: °C
device_class: temperature
# count: 1
scale: 0.01
offset: 0
precision: 1
data_type: int16
- name: ECL310_S3
slave: 254
scan_interval: 300
address: 10202
input_type: input
unit_of_measurement: °C
device_class: temperature
# count: 1
scale: 0.01
offset: 0
precision: 1
data_type: int16
- name: ECL310_S4
slave: 254
scan_interval: 300
address: 10203
input_type: input
unit_of_measurement: °C
device_class: temperature
# count: 1
scale: 0.01
offset: 0
precision: 1
data_type: int16
- name: ECL310_S5
slave: 254
scan_interval: 300
address: 10204
input_type: input
unit_of_measurement: °C
device_class: temperature
# count: 1
scale: 0.01
offset: 0
precision: 1
data_type: int16
- name: ECL310_S6
slave: 254
scan_interval: 300
address: 10205
input_type: input
unit_of_measurement: °C
device_class: temperature
# count: 1
scale: 0.01
offset: 0
precision: 1
data_type: int16
- name: ECL310_min_Outdoor_temp
unit_of_measurement: °C
address: 10499
input_type: input
slave: 254
data_type: int16
scale: 0.01
offset: 0
precision: 1
scan_interval: 600
- name: ECL310_max_Outdoor_temp
unit_of_measurement: °C
address: 10504
input_type: input
slave: 254
data_type: int16
scale: 0.01
offset: 0
precision: 1
scan_interval: 600
- name: ECL310_normal_wasser
unit_of_measurement: °C
address: 12189
input_type: input
data_type: int16
slave: 254
scale: 0.1
offset: 0
precision: 1
scan_interval: 600
- name: ECL310_absenkung_wasser
unit_of_measurement: °C
address: 12190
input_type: input
data_type: int16
slave: 254
scale: 0.1
offset: 0
precision: 1
scan_interval: 600
- name: ECL310_vorlauf_min_temp
unit_of_measurement: °C
address: 11176
input_type: input
data_type: int16
slave: 254
precision: 1
scale: 1
offset: 0
scan_interval: 600
- name: ECL310_vorlauf_max_temp
unit_of_measurement: °C
address: 11177
scale: 1
offset: 0
precision: 1
input_type: input
data_type: int16
slave: 254
scan_interval: 600
- name: ECL310_komfort_soll
unit_of_measurement: °C
address: 11179
input_type: input
data_type: int16
slave: 254
scale: 0.1
offset: 0
precision: 1
scan_interval: 600
- name: ECL310_absenkung_soll
unit_of_measurement: °C
address: 11180
input_type: input
data_type: int16
slave: 254
scale: 0.1
offset: 0
precision: 1
scan_interval: 600
- name: ECL310_frostschutz
unit_of_measurement: °C
address: 12092
input_type: input
data_type: int16
slave: 254
scan_interval: 600
- name: ECL310_betriebsartww
address: 4201
input_type: input
data_type: int16
slave: 254
scan_interval: 60
- name: ECL310_betriebsartheizung
address: 4200
input_type: input
data_type: int16
slave: 254
scan_interval: 60
- name: Pumpe 1
slave: 254
address: 4005
input_type: input
data_type: int16
scan_interval: 60
- name: Pumpe 2
slave: 254
address: 4006
input_type: input
data_type: int16
scan_interval: 60
- name: Pumpe 3
slave: 254
address: 4007
input_type: input
data_type: int16
scan_interval: 60
- name: m1_oeffnen
slave: 254
address: 3999
input_type: input
data_type: int16
scan_interval: 60
- name: m1_schliessen
slave: 254
address: 4000
input_type: input
data_type: int16
scan_interval: 60
- name: m2_oeffnen
slave: 254
address: 4001
input_type: input
data_type: int16
scan_interval: 60
- name: m2_schliessen
slave: 254
address: 4002
input_type: input
data_type: int16
scan_interval: 60
- name: manual_triac_m1
slave: 254
address: 4059
input_type: input
data_type: int16
scan_interval: 60
- name: manual_triac_m2
slave: 254
address: 4060
input_type: input
data_type: int16
scan_interval: 60
- name: manual_triac_m3
slave: 254
address: 4061
input_type: input
data_type: int16
scan_interval: 60
- name: manual_pumpe1
slave: 254
address: 4065
input_type: input
data_type: int16
scan_interval: 60
- name: manual_pumpe2
slave: 254
address: 4066
input_type: input
data_type: int16
scan_interval: 60
- name: manual_pumpe3
slave: 254
address: 4067
input_type: input
data_type: int16
scan_interval: 60
sensor.yaml
- platform: template
sensors:
ventilmodus_m1:
friendly_name: "M1 Modus"
value_template: >-
{% if is_state('sensor.manual_triac_m1', '0') %}
AUTO
{% elif is_state('sensor.manual_triac_m1', '1') %}
STOP
{% elif is_state('sensor.manual_triac_m1', '2') %}
SCHLIE?EN
{% elif is_state('sensor.manual_triac_m1', '3') %}
ÖFFNEN
{% else %}
{% endif %}
ventilmodus_m2:
friendly_name: "M2 Modus"
value_template: >-
{% if is_state('sensor.manual_triac_m2', '0') %}
AUTO
{% elif is_state('sensor.manual_triac_m2', '1') %}
STOP
{% elif is_state('sensor.manual_triac_m2', '2') %}
SCHLIE?EN
{% elif is_state('sensor.manual_triac_m2', '3') %}
ÖFFNEN
{% else %}
{% endif %}
pumpenmodus_p1:
friendly_name: "P1 Modus"
value_template: >-
{% if is_state('sensor.manual_pumpe1', '0') %}
AUTO
{% elif is_state('sensor.manual_pumpe1', '1') %}
OFF
{% elif is_state('sensor.mmanual_pumpe1', '2') %}
ON
{% else %}
{% endif %}
pumpenmodus_p3:
friendly_name: "P3 Modus"
value_template: >-
{% if is_state('sensor.manual_pumpe3', '0') %}
AUTO
{% elif is_state('sensor.manual_pumpe3', '1') %}
OFF
{% elif is_state('sensor.mmanual_pumpe3', '2') %}
ON
{% else %}
{% endif %}
bewegung_m1:
friendly_name: "M1 Bewegungsmodus"
value_template: >-
{% if is_state('sensor.m1_oeffnen', '1') %}
oeffnen
{% elif is_state('sensor.m1_schliessen', '1') %}
schließen
{% else %}
stop
{% endif %}
bewegung_m2:
friendly_name: "M2 Bewegungsmodus"
value_template: >-
{% if is_state('sensor.m2_oeffnen', '1') %}
Öffnen
{% elif is_state('sensor.m2_schliessen', '1') %}
schließen
{% else %}
stop
{% endif %}
p1:
friendly_name: "Heizungspumpe"
value_template: >-
{% if is_state('sensor.pumpe_1', '1') %}
Ein
{% else %}
Aus
{% endif %}
p3:
friendly_name: "Zirkulationspumpe"
value_template: >-
{% if is_state('sensor.pumpe_3', '1') %}
Ein
{% else %}
Aus
{% endif %}
m1:
friendly_name: "Heizungsventil"
value_template: >-
{% if is_state('sensor.pumpe_4', '1') %}
Auf
{% else %}
Zu
{% endif %}
m2:
friendly_name: "Wasserventil"
value_template: >-
{% if is_state('sensor.pumpe_5', '1') %}
Auf
{% else %}
Zu
{% endif %}
wasserbetriebsmodus:
friendly_name: "WW Betriebsmodus"
value_template: >-
{% if is_state('sensor.ecl310_betriebsartww', '0') %}
Manual
{% elif is_state('sensor.ecl310_betriebsartww', '1') %}
Schedule
{% elif is_state('sensor.ecl310_betriebsartww', '2') %}
Comfort
{% elif is_state('sensor.ecl310_betriebsartww', '3') %}
Constant setback
{% elif is_state('sensor.ecl310_betriebsartww', '4') %}
Constant comfort
{% else %}
failed
{% endif %}
heizungsbetriebsmodus:
friendly_name: "Betriebsmodus Heizung"
value_template: >-
{% if is_state('sensor.ecl310_betriebsartheizung', '0') %}
Manual
{% elif is_state('sensor.ecl310_betriebsartheizung', '1') %}
Schedule
{% elif is_state('sensor.ecl310_betriebsartheizung', '2') %}
Comfort
{% elif is_state('sensor.ecl310_betriebsartheizung', '3') %}
Constant setback
{% elif is_state('sensor.ecl310_betriebsartheizung', '4') %}
Constant comfort
{% else %}
failed
{% endif %}
outcome of that in lovelace is: