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

Nice. Are these PCBs fully soldered? I would be interested to get one. Thanks

yes, PCBs fully soldered and tested with my heatpump :slight_smile:

I spend most of the time drawing the schematic to search for components at jlcpcb.com, which do not come with an additional setup fee (“basic part”). At the moment there are around 10 components in the schematic, which are labeled as “extended part” and come with an initial setup fee of ~3€/part (without the part itself!), driving the manufacturing costs.

My next steps are to sleep some nights over the schematic and look for appropiate housings. I want to have an easy-to-open lid in case something is wrong and you want to have a look at the LEDs. Also the case must have good mounting options and must allow some airflow.

Next week I will be at the Embedded World conference - there are many exhibitors showing cases. I will have that in mind :slight_smile:

Thanks for the star :wink:

I just shared my automation to generate warm water using photovoltaic power on my Git-page.
I left some descriptions with the file automations.yaml, which should make it more clear what was meant there.
If you need further explanations, just ask.

hey,

did not have the opportunity to test the automations (want to be at home for this), but had some time to work on the schematics.

I don’t want to hijack your thread with this, so I created a separate thread for the ESP32 CAN PCB here:

hi how can i find out my can-id of the connected devices?

Hello, how did you connect the CAN bus cable to the X15 connector? I have a ‘WPM iw’ but get no response to H and L.

Hi, check the bitrate, sometimes it differs.

Concerning Can-IDs - once a connection is established, I think the CAN-IDs are logged in the ESPHome logwindow. Most devices communicate actively and you should be able to see what comes in.

The CAN device has been working without any problems for half a year. Now that the sun is shining, I came up with the idea to heat the hot water electrically, so that the pump compressor does not start.

I would like to set the water set temperature higher and turn on the electric auxiliary heater. When a temperature is reached, the set point for the temperature must be reset back to 50 degrees and electric auxiliary heater turned off.

I just need to know how to adjust the set point for the hot water temperature and activate the auxiliary heater.
Has anyone tried to implement this?

Yes.

There are multiple ways to do that.

You can change the setpoint and turn on the electric heater relays over can bus abusing the relays test function. Using this way you can turn on you can control two power levels. For me its ~2,5kW and ~6kW. If you go this way test if the circulating pump is running if you turn the relays on with fuse off for the electric heating elements. In my case the WPM is turning it automatically on and off. Off with some delay sometimes.

An other way would be to set 3 relays before the heat pump to control every single electrical heater.

I have not tested this but i guess it will work better and provides more ways to combine them instead of just 2. Going this way you change to emergency operation mode change the hot water setpoint like you want and turn on or off your external relays. If all external relays are off you should set the setpoint below current temp and maybe also change operation mode to make the WPM to turn the circulation pump off.

Have to correct one thing. Abusing the relais testfunction requires additional logic to turn off in time.
Setpoint will be ignored…

This is really interesting. I control my Stiebel Eltron WPL A HK 230 Premium via Modbus. I don’t have a FET installed in my house, so the system doesn`t know the current temperature and humidity in my house.

Is it possible to use a MCP2515 CAN-Bus-Controller and an ESP32 to “feed” the temperature- und humidity-values in my house (get them from Shelly HT-Plus in my house) to the WPM?

Could be possible. You just have to send the same data as the FEK does.
But I don’t know if the heat pump

  1. accepts the data, as the Can Bus controller isn‘t registered in the heat pump
  2. how to verify if the data is used.

Why do you want this?
Actually the FEK is not needed if you have an outdoor sensor.
I only have it because I‘m using my heat pump for cooling as well. And so the humidity sensor within the FEK limits the minimum cooling temperature to ensure that the floor is above dew point.

The cooling-function was exactly what i tried to do. I will try it in the next days. Thank you.

I had a discussion with a technician once, who told me that you can control the cooling function also with a relay. I can check my mails for the circuit diagram if you want. It is for my pump though (WPF 07 cool)

Hi roberreteir & co!

I´ve got Stiebel Eltron WPC 07 heating pump (year model 2014)

I assembled ESP32+MCP2515 combo, installed ESPHome with your great code.

Now communicating succesfully with pump and by Home Assistant I can change waterheater temperature to control timing with NordPool-prices.

Is there possibility to control heating circuit temperature by ESP32-CAN?
Only outside temperature sensor used, no FEK-unit.
And how to get temperature-data from heating circuit buffer tank?

Thank you for this absolutely amazing project and sorry for my bad english skills :slight_smile:

Maybe you can provide us some logs from systemboot and with communication between FEK and WPM to understand how the device gets registered.

All you want to do is possible. You just need to find out the right can bus adresses. How to is discribed in the thread…

Log:

https://sauvo.net/esphome_wpc07_log.txt

Hello,

I just found another interesting index-address for those who use their heatpump to cool depending on the outside temperature.
It is called “SW_Aussentemp” in the Elster-table linked here in the thread and has index number 01bf.

A mean temperature of the outside-temperature is measured over 24h, 48h or 72h (depending on the building damping - my manual calls it “Gebäudedämpfung” on p. 18).
The index for the damping is fdb3 - this could answer “01 00” (24 h mean temperature), “02 00” (for 48 h mean temperature) or 03 00 (for 72 h mean temperature)
I set this to 24 h
I didn’t figure out, which CAN-Address or index could deliver the mean temperature currently stored. But I just made a sensor in home assistant that does the same.

So now I have two options:
a)
I can change the temperature of SW_Aussentemp (01 bf) by the following CAN-command, to set the threshold to e.g. 21.5 °C (21,5 °C = 215 1/10 °C = hex D7 → to CAN-Address 180)
30 00 fa 01 bf 00 d7
If I set a lower threshold, the heatpump will switch to summer mode and cool the building.
If I set to a higher value, the heatpump will stop cooling.

b)
I can read the value of SW_Aussentemp to e.g. let home assistant switch my KNX-heat circuit regulator to summer / winter mode when the set threshold-value is reached.
31 00 fa 01 bf 00 00 → delivers answer d7 from CAN-Address 180

I guess I will not touch this value too often in the heatpump but only switch my KNX-device.
This slightly lowers the energy cost for the circuit regulators of the heaters in the floor.

@tatu - Does that maybe answer your question?
I think the buffer temperature is already within my code.
But there are multiple indices available that may fit better and could differ depending on your heat-pump/ sensor-position.
{ “SPEICHERISTTEMP” , 0x000e, et_dec_val},
{ “PUFFERTEMP_OBEN1” , 0x0076, 0},
{ “PUFFERTEMP_MITTE1” , 0x0077, 0},
{ “PUFFERTEMP_UNTEN1” , 0x0078, 0},
…

e.g. for index 0078 with 1 min. update interval, add this code to the sensor section

  - platform: template
    name: "Puffertemperatur"
    id: puffertemperatur_log
    unit_of_measurement: "°C"
    icon: "mdi:thermometer-high"
    device_class: "temperature"
    state_class: "measurement"
    accuracy_decimals: 1
    lambda: |-
      id(send_state)[0]=id(PumpCANread_id)[0];id(send_state)[1]=id(PumpCANread_id)[1];id(send_state)[2]=0x00;id(send_state)[3]=0x78;id(send_state)[4]=0x00;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: 1min

add this to the requests-section

#Puffer IST-temperatur
        - lambda: |-
            if(x[0]==id(internalResponse_id)[0] and x[1]==id(internalResponse_id)[1] and x[2]==0x78) {
              float temperature =float((int16_t((x[4])+( (x[3])<<8))))/10;
              id(puffertemperatur_log).publish_state(temperature);
              ESP_LOGD("main", "Buffer-Temperature received over can is %f", temperature);
            }

@tatu the bottomtemperature of the buffer is the RĂźcklauftemperatur if you activate using a buffer in the wpm and connected the temperaturesensor.
So if you see the temperature 25,1 on your display you should find 251 as float if you use the esphome example if I remember right. Just start logging and play with your display to find your adresses :wink:
Komforttemperatur is value / 10. Heizkurve is the value / 100. The esphom example may show it as float 45 if you put it on 0.45 I guess…
Im not using esphome anymore for this so its how i have it in my old memory :smiley:
0x05 is Komforttemperatur on my device and heizkurve 0x010e. But this does not man to be the same on your device…
@roberreiter
Im afrait that to use the cooling function you need the FEK or some other remotecontrol device with a humidity and temperaturesensor. Otherwise this function will not be there I guess.
So I think to get this running its nessesary to emulate such a device.
Therefore some logs with identified sender/recivers starting from powering everything on and some time after this would be interesting to see how a FEK gets registered and how its communicating with the wpm.
Maybe then we can emulate it :slight_smile: