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

hi bin euch so dankbar, durch euch konnte ich meine Rotex WP über ESPHome in HA einbinden.Jetzt bin ich aber ein ziemlicher Anfänger und komme an zwei stellen nicht weiter und finde auch keinen Code hierzu.Vielleicht könnt ihr mir weiterhelfen.

  1. Und zwar möchte ich jetzt mein WW Sollwert verstellen können, wie kann ich das realisieren?
  2. Und dann hab ich noch eine Ausgabe für Betriebsmodus und Betriebsart die mir als Nummer ausgegeben wird, diese möchte ich gerne als Text ausgeben.Mir ist bewusst das es mit einem Textsensor geht aber wie man den code zusammen baut weiß ich nicht.
    Einen kurzen überblick von meiner Integration.

@trunks

Versuch es mal mit einer Climate Component +Lambdas

Dafür kannst du den Code vom Betriebsschalter wiederverwenden.

bei der THZ504 sind es diese Werte:

SPEICHERISTTEMP lesen
EINSTELL_SPEICHERSOLLTEMP schreiben/lesen

Kannst du mir bei dem Code helfen? @kr0ner
Ich bekomme es nicht hin.Die ID hab ich zum senden aber da muss man dann noch die Eigabe mal 100 nehmen usw.

select:
  - platform: template
    name: "Betriebsmodus"
    id: betrieb
    optimistic: true
    options:
      - "Bereitschaft"
      - "Heizen"
      - "Absenken"
      - "Sommer"
      - "Kühlen"
    initial_option: Heizen  
    set_action:
      then:
          - delay: 500ms
          - if:
              condition:
                - lambda: |-
                    return (id(betrieb).state) == "Bereitschaft";
              then:
                - canbus.send: 
                    data: [ 0x30, 0x00, 0xFA, 0x01, 0x12, 0x01, 0x00 ]
                    can_id: 0x680
          - if:
              condition:
                - lambda: |-
                    return (id(betrieb).state) == "Heizen";
              then:
                - canbus.send: 
                    data: [ 0x30, 0x00, 0xFA, 0x01, 0x12, 0x03, 0x00 ]
                    can_id: 0x680
          - if:
              condition:
                - lambda: |-
                    return (id(betrieb).state) == "Sommer";
              then:
                - canbus.send: 
                    data: [ 0x30, 0x00, 0xFA, 0x01, 0x12, 0x05, 0x00 ]
                    can_id: 0x680

Ich verwende diesen Code.

climate:
  - platform: ...
    on_state:
      - logger.log: "State updated!"
      - lambda: |-
          const auto use_extended_id{false}; //No use of extended ID
      	  const std::vector<std::uint8_t> data = {0x30, 0x00, 0xfa, 0x00, 0x13, ((value >> 8U) & 0xFF), (value & 0xFF)};
	  const auto value{static_cast<std::uint16_t>(x * 10.0f)};
          id(my_can).send_data(0x6a2,use_extended_id,data);
            
canbus:
  - platform: esp32_can
    id: my_can
    tx_pin: GPIO47
    rx_pin: GPIO48
    can_id: 0x6a2
    bit_rate: 20kbps
    on_frame:

Sth. like that maybe? Did not try it … just an idea

@kr0ner
climate:

  • platform: template
    name: T-WW_Soll
    on_state:
    • logger.log: “State updated!”
    • lambda: |-
      const auto use_extended_id{false}; //No use of extended ID
      const std::vectorstd::uint8_t data = {0x30, 0x00, 0x13, 0x00, 0x00, ((value >> 8U) & 0xFF), (value & 0xFF)};
      const auto value{static_caststd::uint16_t(x * 10.0f)};
      id(my_can).send_data(0x680,use_extended_id,data);

Das hab ich jetzt eingegebenmit den id Änderung und auf dem Foto kommt dann diese Fehlermeldung.
Bildschirmfoto 2023-12-11 um 16.03.43

Das ist die Formel für setzen der WW Temp

buffer = Buffer.from([0x30, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00]);
buffer.writeInt16BE(Math.round(value * 10), 3);

Wäre climate.control Action nicht angepasster um die WW temp zuverändern?

just replace the tabs (\t) with spaces and try again

climate:
  - platform: ...
    on_state:
      - logger.log: "State updated!"
      - lambda: |-
          const auto use_extended_id{false}; //No use of extended ID
      	  const std ::vector<std::uint8_t> data = {0x30, 0x00, 0x13, 0x00, 0x00, ((value >> 8U) & 0xFF), (value & 0xFF)};
	        const auto value {static_cast<std::uint16_t>(x * 10.0f)};
          id(my_can).send_data(0x680,use_extended_id,data);

Bekomme die Fehlermeldung nicht weg.

there is a space between std and ::vector … please double check this and the indentation

@kr0ner

climate:
  - platform: ...
    on_state:
      - logger.log: "State updated!"
      - lambda: |-
          const auto use_extended_id{false}; //No use of extended ID
      	  const std::vector<std::uint8_t> data = {0x30, 0x00, 0xfa, 0x00, 0x13, ((value >> 8U) & 0xFF), (value & 0xFF)};
	        const auto value{static_cast<std::uint16_t>(x * 10.0f)};
          id(my_can).send_data(0x6a2,use_extended_id,data);

Komisch ich habe hier auch kein Leerzeichen zwischen std::vector funktioniert leider trotzdem nicht.Sagt aber Immer noch das selbe

So ich hab das alles mal neu eingerückt und jetzt wurde alles rot unterstrichen und es kam eine Meldung platform gibt es nicht.Hab zbthermostat isw eingegeben aber hab es nicht wegbekommen.

Ich glaube das geht nicht über climate der spuckt da soviel Fehler aus.Könnte es vielleicht über select: gehen oder über eine Wert/Text Eingabe?

@kr0ner @Trunks1982

Hallo zusammen,

ich habe Schwierigkeiten mit den CAN IDs beim Code von kr0ner. Habe eine WPF10 mit dem Modul an direkt an der WP (müsste das WPMII sein). Könnt Ihr mir vielleicht sagen, welche CAN ID´s ich nehmen muss?

@the-rocket lösch mal alle switch cases außer dem default, dann drück auf dem WP display rum und schau in die logs nach den unhandled IDs. Wenn das nichts bringt, sind evtl. die CAN IDs falsch … Dafür log Level auf VERBOSE setzen, rausfinden welche IDs von der WP benutzt werden und danach bei Bedarf Schritt 1 wiederholen.

Danke für die Info. Werd´s morgen mal testen und berichten…

Hello everyone,
first of all, thanks to roberreiter for the start on tying up the heat pump.
I had connected my heat pump (tecalor THZ 303 SOL) via fhem and was able to access all the values via it. Now that I have also set up a homeassistant system in parallel, I wanted to move my heat pump too.
My setup is an ESP32 woom and HW-184 (MCP2515). So the same setup as roberreiter.
Setup:

spi:
  id: McpSpi
  clk_pin: GPIO18
  mosi_pin: GPIO23
  miso_pin: GPIO19
canbus:
  - platform: mcp2515
    id: my_mcp2515
    spi_id: McpSpi
    cs_pin: GPIO17
    can_id: 680 # orginal 680 / oder 0x6a2
    use_extended_id: false
    bit_rate: 20kbps
    on_frame:

but I can’t get a connection to the heat pump.
→ can_id should be the 680, these also use the scripts of the fhem. Nevertheless I have tried both
→ I have checked the wiring 5 times
→ I have tested the setup on CAN2 and CAN1 (where the display is connected) > without success
→ now I have even replaced the ESP32 board, just to be sure.
→ all without success.
To be honest, I have no idea what else it could be …
maybe one of you has another idea?

My HW:

[15:03:43][C][api:142]:   Using noise encryption: YES
[15:03:43][C][homeassistant.text_sensor:023]: Homeassistant Text Sensor 'ww_komfort_temp'
[15:03:43][C][homeassistant.text_sensor:024]:   Entity ID: 'input_text.ww_komfort_temp'
[15:03:43][C][homeassistant.text_sensor:023]: Homeassistant Text Sensor 'ww_eco_temp'
[15:03:43][C][homeassistant.text_sensor:024]:   Entity ID: 'input_text.ww_eco_temp'
[15:03:45][D][binary_sensor:036]: 'update_sensor': Sending state ON
[15:03:45][D][canbus:035]: send standard id=0x680 rtr=FALSE size=7
[15:03:45][D][binary_sensor:036]: 'update_sensor': Sending state OFF
[15:03:45][D][binary_sensor:036]: 'update_sensor': Sending state ON
[15:03:45][D][canbus:035]: send standard id=0x680 rtr=FALSE size=7
[15:03:45][D][binary_sensor:036]: 'update_sensor': Sending state OFF
[15:03:45][D][binary_sensor:036]: 'update_sensor': Sending state ON
[15:03:45][D][canbus:035]: send standard id=0x680 rtr=FALSE size=7
[15:03:45][D][binary_sensor:036]: 'update_sensor': Sending state OFF
[15:03:45][D][binary_sensor:036]: 'update_sensor': Sending state ON
[15:03:45][D][canbus:035]: send standard id=0x680 rtr=FALSE size=7
[15:03:45][D][binary_sensor:036]: 'update_sensor': Sending state OFF
[15:03:45][D][binary_sensor:036]: 'update_sensor': Sending state ON
[15:03:45][D][canbus:035]: send standard id=0x680 rtr=FALSE size=7
[15:03:45][D][binary_sensor:036]: 'update_sensor': Sending state OFF
[15:03:45][D][binary_sensor:036]: 'update_sensor': Sending state ON
[15:03:45][D][canbus:035]: send standard id=0x680 rtr=FALSE size=7
[15:03:45][D][binary_sensor:036]: 'update_sensor': Sending state OFF
[15:03:45][D][sensor:094]: 'COP-Wert Heizung': Sending state nan a.u. with 2 decimals of accuracy
[15:03:45][W][component:214]: Component template.sensor took a long time for an operation (0.12 s).
[15:03:45][W][component:215]: Components should block for at most 20-30ms.
[15:03:49][D][binary_sensor:036]: 'update_sensor': Sending state ON
[15:03:49][D][canbus:035]: send standard id=0x680 rtr=FALSE size=7
[15:03:49][D][binary_sensor:036]: 'update_sensor': Sending state OFF
[15:03:49][D][binary_sensor:036]: 'update_sensor': Sending state ON
[15:03:49][D][canbus:035]: send standard id=0x680 rtr=FALSE size=7

1 Like

I had no success with the 4,7kOhm Resistor.
Without the Resistor may work as I remember but I dont suggest it.
Better use this setup and seperate 3,3V and 5V a clean way:


If still no succes i recomment to dick deeper with a logic analyser.
Cheap Saleae compatible for example…

Hi Tom, thanks a lot.
I tried your suggestion and left out the 4.7K OHM resistor.
What can I say:

[21:16:14][D][canbus:072]: received can message (#1) std can_id=0x180 size=7
[21:16:14][I][main:1390]: Antwort von 180 Hex: d0 3c fa 1 26 2 0
[21:16:14][I][main:1391]: Antwort von 180 Float: 512.000000
[21:16:14][I][main:1392]: Antwort von 180 Dez.: 2 0
[21:16:14][I][main:1393]: Antwort klein von 180 Float: 294.000000
[21:16:14][I][main:1394]: Antwort klein von 180 Dez.: 1 38
[21:16:20][D][canbus:072]: received can message (#1) std can_id=0x69e size=7
[21:16:20][D][canbus:072]: received can message (#2) std can_id=0x180 size=7
[21:16:20][I][main:1390]: Antwort von 180 Hex: d2 1e fa 0 c 0 76
[21:16:20][I][main:1391]: Antwort von 180 Float: 118.000000
[21:16:20][I][main:1392]: Antwort von 180 Dez.: 0 118
[21:16:20][I][main:1393]: Antwort klein von 180 Float: 12.000000
[21:16:20][I][main:1394]: Antwort klein von 180 Dez.: 0 12
[21:16:20][D][canbus:072]: received can message (#1) std can_id=0x69e size=7
[21:16:20][D][canbus:072]: received can message (#2) std can_id=0x301 size=7
[21:16:20][I][main:1462]: Antwort von 301 Hex: d2 1e fa 0 11 0 d2
[21:16:20][I][main:1463]: Antwort von 301 Float: 210.000000
[21:16:20][I][main:1464]: Antwort von 301 Dez.: 0 210
[21:16:20][I][main:1465]: Antwort klein von 301 Float: 17.000000
[21:16:20][I][main:1466]: Antwort klein von 301 Dez.: 0 17
[21:16:20][D][canbus:072]: received can message (#1) std can_id=0x69e size=7
[21:16:20][D][canbus:072]: received can message (#2) std can_id=0x180 size=7
[21:16:20][I][main:1390]: Antwort von 180 Hex: d2 1e fa 0 e 1 de
[21:16:20][I][main:1391]: Antwort von 180 Float: 478.000000
[21:16:21][I][main:1392]: Antwort von 180 Dez.: 1 222
[21:16:21][I][main:1393]: Antwort klein von 180 Float: 14.000000
[21:16:21][I][main:1394]: Antwort klein von 180 Dez.: 0 14
[21:16:45][D][binary_sensor:036]: 'update_sensor': Sending state ON

Doesn’t look like the right answer yet, but at least I get any.
I will work on it dureing the next days and order a Level-Shifter, just in case.
Thanks so far …

Anyone managed to set the HK1 room temperature? I can set it and also see it in the Display, but it somehow toggles between SOLL and IST value. I’m using the average value of all temp sensors in the house. Anyone owns an FEK and can send me a log of the CAN messages? Humidity would also be interesting … but they most likely both work the same way.

image


code can be found here OneESP32ToRuleThemAll/stiebeltools at master · kr0ner/OneESP32ToRuleThemAll · GitHub

Interesting. I wasn’t able to write to any room related registers on a wpm3. Which registers are you using? I’m too lazy to check your whole code :smile:
There is a discord link somewhere above. There you find some logs.
I also did some research with them but without success…
For me it looks like it’s working during day and not during night. You use different programs during a 24h period?

I basically wrote to 0x301 RaumIstTemp (0x0011) which seems to be HK1 on THZ 504. I can see the value in the display and the WP starts to adjust the VorlaufTemp. Aside from that I keep polling the RaumIstTemp to verify … which you can see on the picture in the previous post. I drive different settings for day/night via home assistant scheduler (5-17 20.5° and 17-5 18°). WP is set to 00:00-24:00 so that I can control everything through the Day-Settings. The house always has around 20° - 21° and the it jumps from that value to either 20.5° or 18°. So something is overwriting my values :smile: thanks for the hint with the Discord … i’m going to have a look later