Configured my ESPHome with MCP2515 CAN-Bus for Stiebel Eltron heating pump

Thanks for the effort! Unfortunately, this does not work with my THZ 404. I have also tested a different index (+/-1). The status is always OFF

Can you go to the WP and navigate to:
Diagnose ā†’ Anlagenstatus and check, if you get the correct value there? If yes, check the logs for the correct Id :wink:

Hi @roberreiter , were you able to figure out how to read the current mode of the stiebel?
Iā€™d like to see if/when it switches to cooling mode but iā€™m not able to find that specific entry in the Elster table (partially because my german is terrible)

thanks!

My code is based on an older version, but maybe that helps:

sensor:

  - platform: template
    id: icon_state
    icon: "mdi:apps"
    lambda: |-
      id(send_state)[0]=id(PumpCANread_id)[0];id(send_state)[1]=id(PumpCANread_id)[1];id(send_state)[2]=0xfa;id(send_state)[3]=0x01;id(send_state)[4]=0x76;id(send_state)[5]=0x00;id(send_state)[6]=0x00;
      id(update_sensor).publish_state(true);
      id(update_sensor).publish_state(false);
      return {};
    update_interval: 5min

binary_sensor:

  - platform: template
    name: "Icon Schaltprogramm"
    id: icon_schaltprogramm
    icon: "mdi:timer-sand-complete"
  - platform: template
    name: "Icon Verdichter"
    id: icon_verdichter
    icon: "mdi:tennis-ball-outline"
  - platform: template
    name: "Icon Heizen"
    id: icon_heizen
    icon: "mdi:heating-coil"
  - platform: template
    name: "Icon KĆ¼hlen"
    id: icon_kuehlen
    icon: "mdi:snowflake"
  - platform: template
    name: "Icon Warmwasser"
    id: icon_warmwasser
    icon: "mdi:water-pump"
  - platform: template
    name: "Icon Notheizung"
    id: icon_notheizung
    icon: "mdi:radiator"
  - platform: template
    name: "Icon Service"
    id: icon_service
    icon: "mdi:wrench-outline"
  - platform: template
    name: "Icon Fernwartung"
    id: icon_fernwartung
    icon: "mdi:connection"
  - platform: template
    name: "Icon Filter oben und unten"
    id: icon_filter_oben_unten
    icon: "mdi:arrow-up-down-bold"
  - platform: template
    name: "Icon LĆ¼ftungsstufe"
    id: icon_lueftungsstufe
    icon: "mdi:fan"
  - platform: template
    name: "Icon Heizkreispumpe"
    id: icon_heizkreispumpe
    icon: "mdi:play-circle-outline"
  - platform: template
    name: "Icon Abtauen Verdampfer"
    id: icon_abtauen_verdampfer
    icon: "mdi:snowflake-melt"
  - platform: template
    name: "Icon Filter oben"
    id: icon_filter_oben
    icon: "mdi:arrow-up-bold"
  - platform: template
    name: "Icon Filter unten"
    id: icon_filter_unten
    icon: "mdi:arrow-down-bold"
  - platform: template
    name: "Icon Aufheizen"
    id: icon_aufheizen
    icon: "mdi:thermometer-chevron-up"
  - platform: template
    name: "Icon Achtung"
    id: icon_achtung
    icon: "mdi:alert"

canbus:

#Icons
        - lambda: |-
            if(x[0]==${can_x0} and x[1]==${can_x1} and x[2]==0xfa and x[3]==0x01 and x[4] == 0x76) {
              float state = float(int((x[6])+((x[5])<<8)));
              id(icon_schaltprogramm).publish_state((x[6] & 0x01) != 0);
              id(icon_verdichter).publish_state((x[6] & 0x02) != 0);
              id(icon_heizen).publish_state((x[6] & 0x04) != 0);
              id(icon_kuehlen).publish_state((x[6] & 0x08) != 0);
              id(icon_warmwasser).publish_state((x[6] & 0x10) != 0);
              id(icon_notheizung).publish_state((x[6] & 0x20) != 0);
              id(icon_service).publish_state((x[6] & 0x40) != 0);
              id(icon_fernwartung).publish_state((x[6] & 0x80) != 0);
              id(icon_filter_oben_unten).publish_state((x[5] & 0x01) != 0);
              id(icon_lueftungsstufe).publish_state((x[5] & 0x02) != 0);
              id(icon_heizkreispumpe).publish_state((x[5] & 0x04) != 0);
              id(icon_abtauen_verdampfer).publish_state((x[5] & 0x08) != 0);
              id(icon_filter_oben).publish_state((x[5] & 0x10) != 0);
              id(icon_filter_unten).publish_state((x[5] & 0x20) != 0);
              id(icon_aufheizen).publish_state((x[5] & 0x40) != 0);
              id(icon_achtung).publish_state((x[5] & 0x80) != 0);
              id(icon_state).publish_state(state);
              // ESP_LOGI("main", "Icons empfangen over can is %i, %i", int(x[5]), int(x[6]));
            }

Hi,

I tried it out somehow last year. But I didnā€™t make it to a full implementation.

I think I found how to set/read cooling-function activated.
But this doesnā€™t help for automations.

I decided to do an alternative workout to switch my KNX-heat actors to cooling/heating state using homeassistant:
Acc. To the Stiebel-manual the pump switches to summer(cooling) or winter(heating) mode in order to to time of the outer mean-temperature over/below a set limit.
Depending of the damping-value of the house there are 3 limit-times: 24h/48h/72h

So currently Iā€™m doing this stupid workaround:
Measure the mean-temperature outside of the last 24h.
Temperature above limit-temperature - set KNX-actor to summer, else winter mode.

If you can figure out the correct CAN-IDs, that may help.

Hi,

so after the question of Radiotechniman, I made some additional trys.

To my answer before - I just found the temperature-value to set, to switch the heat pump from summer to winter / viceversa.

If you change the temperature to a lower value (below 24/48/72h mean outside temperature) the pump switches to cooling.
If you set it high, cooling turns off.

This is the CAN hex-package for setting the idx 01bf to 15 degrees celsius:
30 0 fa 1 bf 0 96

With this, you set it to 21.5 degrees.
30 0 fa 1 bf 0 d7

idx 01bf is listed as ā€œSW_AUSSENTEMPā€ in the elster table.

After switching from one temperature to the other, I received two different signals from address 480, which I would guess is heating or cooling-mode:

20 0 fa 4e 6a 0 1 (at 15 Ā°C)
20 0 fa 4e 6a 0 0 (at 21.5 Ā°C)
So I would guess, this could be returns that you receive from the pump, if it changes from one mode to the other.
But it was neither possible to set this value from my own CAN-device, nor did I get a valid response of the current value from 2100fa4e6a0000.
Additionally 4e6a is not listed in the elster-table. So I absolutely donā€™t know what they are exactly.
I assume the current state of cooling / heating mode can be read from any other idx, but I donā€™t know which one.

Correction - think I got it:
If I ask the same addres that sends the message 4e6a (heat pump manager, 9100 = id 480) I get an answer of the current state.
So
Query: 91 00 fa 4e 6a 00 00
=> response
d2 0 fa 4e 6a 0 0, when cooling mode is off
d2 0 fa 4e 6a 0 1, when cooling mode is on

Be aware - Iā€™m not 100% sure, what exactly is delivered in 4e6a, as the idx isnā€™t listed in the elster-table.
But it looks promissing to be the cooling mode.

No sorry, never got it stable. Eventually just ordered the ISG for way to much money, but it works and keeps working and Iā€™m able to control my WPF with everything I want (change modes, control heating/cooling/ hot water etc etc). And of course also monitor every detail of the system. So Iā€™m happy :wink:

Itā€™s been working solid for me after I connected grounds and removed the breadboard. Still running the test setup with dupont wires only.

Iā€™ve been successfully controlling my WPF7 based on available solar power by setting the pump to emergency mode (to disable compressor) and comfort temp to max 65C. I have disabled the 2 phases of electric heaters for now as 1 phase is able to heat the water to 65C just fine during the day. Iā€™ll add a 3 phase shelly there tho to automate it.

Iā€™d like to still be able to read source pump status and other pump statuses to know more reliably whether itā€™s about to start a compressor cycle. Just so that I wont ever cancel that with the emergency mode. For now Iā€™m using the power measurement of the control phase of the pump as I can see from that when source pump is running.

I tried to find out this by listening CAN bus when switching source pump using relay test and got some readings but those same ones are not there when pump is switching the source pump on during regular cycle. Also none of the pump statuses listed in Elster file worked (all returned static 128 value).

Pump, compressor mixer states and so on are bitcoded values.
Read 0x4e5e for that.
Compressor = Bit 1
Buffer charge pump = Bit 8
Source pump = Bit 9
NHZ2 = Bit 10
NHZ1 = Bit 11
Mixer closed = Bit 12
Mixer open = B13
Mixer pump = Bit 14
Heating circuit pump = Bit 15
If the bit is 0 state is off
1 is onā€¦
Meaning of each bit might be different on your deviceā€¦

Good day to everyone!
I kindly ask those who have FEK to send the log of which messages pass through the bus, both from it and to it.
I am also interested in which telegrams go from it to WPM, for example, humidity recording or heating curve correction. Also, what does FEK respond every 420 seconds (if it responds at all)?
Thank you in advance.

Hello guys,

This being said I want to discuss with you what are the usefull informations to monitor on the Warmpump ?

As Iā€™m using Water Law I donā€™t have indoor thermometer.
Iā€™m thinking of :
Curve
Outside temperature
Water temperature (but wich one ?)
When the Warmpump is working ? (what is the id ?)
When the boiller is working ? (what is the id ? and how to prevent this)
may be checking if mode is Ecoā€¦

What do you think is usefull ?

My heat pump dashboard for reference

Hey guys,

Iā€™m new to to CAN BUS and I would like to implement my Stiebel Eltron WPL 25 AC.
I have connected my ESP32 via ESPHome and MCP2515 and the CAN signals are comming in already.
Unfortunately, the messages canā€™t be matched with the parameter. I think it is because the CAN id of my heat pump is different? I tried to get the right ones but I have no idea where to find and how to interpret the incomming CAN bus messages. Maybe you have a little hint how I can continue.