Wie ich eine 14 Jahre alte Wärmepumpe mit Home Assistant smart gemacht habe

Hallo skycryer,

nein ich hatte erstmal mein Glück mit dem Projekt von Simon probiert, weil ich die Hoffnung hatte, dass seine “WPL33” meiner WPL13 sehr ähnliche ist und weil ich gern die Dashboards analog nutzen wollte…

Aber dann probiere ich mal das OneESP Projekt und gebe Rückmeldung…

Danke für den Support…

Sooo ich habe jetzt das OneESP Projekt ausprobiert. Erkenntnisse:

  • mit dem Master Branch bekomme ich für meine WPL13 viele Werte, dieses erscheinen mir an vielen Stellen aber weniger schlüssig. Auch hier zeigt sich das die Energiewerte alle “gleich” (Standardwert scheint diesmal 32800,77) sind (siehe Screenshots)


  • dann habe ich noch den WPL13 fork probiert. Aber hier tut sich leider gar nichts…

Hauptfrage: kann es sein, dass meine Wärmepumpe (die immerhin aus 2007 ist) vielleicht überhaupt kein Info bzgl. der Energie bereitstellt?

Dann sollten die Zahlen denke ich 0 oder unbekannt liefern. Müsstest mal im ESP Log schauen ob der da wirklich was sendet.

Ich hatte so einen Bug bei mir als die Aussentemperatur unter 0 ging. Dann wurde dort nur noch 6500 angezeigt egal wie die Temperatur war.

Ich würde an deiner stelle mal ein bug im Projekt aufmachen und schauen was der owner sagt.

Ich starte gerade mit einer WPL 13 E mit altem WPM.

Danke für die Bilder!
Mal blöd gefragt:
Kann ich an meiner WP was zerschießen, wenn ich etwas falsch anschließe?
Meinem Verständnis nach, ist das größte Risiko, dass ich die Daten und Werte nicht in HA reinbekomme und dabei ggf. mein ESP Modul kaputt geht, oder?

Hallo zusammen ich will meine WPL13 einbinden.
Vielleicht bin ich hier mit meinem Problem auch falsch ?
Bitte sagt es mir, ich bin hier noch neu.
Ich bin nach der Videobeschreibung vorgegangen.
Soweit glaube ich alles verstanden zu haben.
Die Fils sind runtergeladen und in “/homeassistant/esphome/stiebeltools/”.
Die “ha_stiebel_control.yaml” in “/homeassistant/packages/”.
Die configuration.yaml scheint nicht richtig zu sein
Bei der Installtion bekomme ich folgenden Fehler.

In file included from src/KElsterTable.h:23,
                         from src/KElsterTable.cpp:21:
 src/ElsterTable.h:1:1: error: 'homeassistant' does not name a type
 homeassistant

Ich befürchte ich mache da was Grundsätzliches falsch ?
Die Konfigurations Prüfung ist OK.
Irgendwas am Eintrag

homeassistant:
  packages: !include_dir_named packages

in der “configuration.yaml” stimmt nicht.
Bei der Einbindung von
“packages/ha_stiebel_control.yaml”
mache ich irgendwie falsch
Weiß einer hier was der Grund ist ??

:crayon:by HarryP: Fettdruck entfernt. Post formatiert.

Hallo @mragain
Nein ! Technisch kannst du an der WP nichts kaputt machen.
Der Can-Bus Controller MCP2515 verhindert das.
Schlimmstenfalls legst du den Bus lahm und vorübergehend geht nix mehr.
Das siehst du dann aber sofort.
In dem Fall wieder alles vom Bus entfernen und alles geht wieder.

1 „Gefällt mir“

hallo Skyscryer,
ich habe hier auch mit HA vor kurzem angefangen und habe ebenfalls eine Stiebel WP von 2007,
Gerade hänge ich auch an dem Problem mit der Fehlermeldung. Ich habe die heatingpump_en_prod.yaml probiert, da kommt aber derselbe Fehler. bist du schon weitergekommen, und wenn ja, wie.
Gruß und danke im Voraus
Andreas

Ich bräuchte auch Hilfe / einen Rat :see_no_evil:

Ich habe für meine WPL15 und den WPM3 den ESP32 und das CANbus Modul soweit am laufen. Nicht unbedingt auf Basis der im Video verlinkten Quellen.
Habe das von Github übernommen. Da die heatingpump.yaml nach Deutschen Begriffen in den stiebeltools gesucht hat, habe ich das auf Englisch umgestellt. Das hat geholfen. Allerdings bekomme ich nur wenige Sensorwerte, wie z.B. Außentemperatur oder Kesseltemperatur

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: 0x680
  use_extended_id: false
  bit_rate: 20KBPS
  on_frame:
  - can_id: 0x180
    then:
    - lambda: |-

Da ich ein paar Werte bekomme, gehe ich erstmal von einer korrekten Verdrahtung und auch Codes aus.
Aber selbst mit herumspielen der Bitrate komme ich nicht weiter…

Ist die CAN ID möglicherweise falsch? Oder ggf. die PINs? Bin da ratlos und auch nicht so fit in dem Thema…

Du nutzt bestimmt den Code aus Simons Video oder? Damit hatte ich nur Probleme. Schau dir mal das oben Verlinkte Projekt * OneESP32ToRuleThemAll an. Damit hatte ich keine Probleme und man kann einfach verschiedene Versionen für die WP einbinden.

Nutzt du auch das Projekt aus dem Video oder das von mir verlinkte * OneESP32ToRuleThemAll? Ich hatte bei dem aus dem Video auch nur wenige Werte bei dem anderen war es viel leichter und lief auch direkt viel besser bei mir.

Danke, dann probiere ich das mal. Gibt es einen Tipp, wie man alle Dateien in HA kopieren kann, oder muß man die einzeln hochladen?

Komme hier gerade leider nicht weiter.
Habe den vorhandenen ESP32 im ESPHomeBuilder entfernt.
Ihn aber wieder hinzugefügt, die Verbindung steht auch über Wlan.

Habe alle notwendigen Daten der OneESP32torulethemall kopiert. Die yaml dann kopiert, per Validate bekomme ich auch keine Fehler.
Wlan Zugang per !secret, genauso wie den API Key.

Sobald ich aber die Installation durchführe, wohlgemerkt fehlerfrei, habe ich keinen Zugriff mehr auf den ESP32. Fehlermeldung “can’t connect” in den Logs. Obwohl er im Netzwerk per ping auffindbar ist…

Ich habe in der yaml die GPIO Pins angepasst, da die Zuordnung bereits mit dem vorherigen Projekt funktioniert hat.
Die Ethernet Konfiguration habe ich allerdings in der yaml auskommentiert. Da habe ich ja kein Addon für.

Hallo zusammen,

habe mich auch an das Projekt mal herangetraut. NAch 3 WE und testen habe ich einen Erfolgstag. Den wollte ich teilen, da dieses Problem glaube ich, mehrere hatten.
Zunächst habe ich mich an das Video von Simon gehalten. jedoch ist ein wichtiger Punkt, dass in der github es mehrer VArinaten für die Datei heatingpump.h gibt. Einmal für deutsch und einemal für englisch. Ich habe einfach immer die aktuellste heruntergeladen und die war auf englisch. Deswegen gab es das Problem, dass die heatinpump.yaml von Simon nicht genutzt werden konnte. Sondern nur die englische.
die deutsche Version sieht so aus:

/*
 *  Copyright (C) 2023 Bastian Stahmer
 * 
 *  This file is part of ha-stiebel-control.
 *  ha-stiebel-control is free software: : you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation version 3 of the License.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program. If not, see http://www.gnu.org/licenses/ .
 */

#if !defined(heatingpump_H)
#define heatingpump_H
#include "ElsterTable.h"
#include "KElsterTable.h"

typedef struct
{
  const char * Name;
  uint32_t CanId;
  uint8_t ReadId[2];
  uint8_t WriteId[2];
  uint8_t ConfirmationId[2];
} CanMember;

/*
#################################################################
#Stiebel Eltron WPL 13 E (2013)
#WPM3i software version 391-08
#FEK software version 416 - 02
#################################################################
#WPL 13 E: CAN ID 180: read - 3100, write - 3000 # Pump
#WPL 13 E: CAN ID 500: read - A100, write - A000 # Heating Module
#WPL 13 E: CAN ID 480: read - 9100, write - 9000 # Manager

#OLD: CAN ID 301: read - 0c01, FEK-device (no active can request, only listening)
#
#OLD: other addresses
#OLD:   180 read: 3100  write: 3000
#OLD:  	301	read: 6101  write: 6001
#OLD: 	480	read: 9100  write: 9000    WMPme Wärmepumpenmanager
#OLD: 	601	read: C101  write: C001
#OLD: 	680	confirmation: D200
#################################################################
*/

static const CanMember CanMembers[] =
{
//  Name              CanId     ReadId          WriteId         ConfirmationID
  { "ESPCLIENT"     , 0x700,    {0x00, 0x00},   {0x00, 0x00},   {0xE2, 0x00}}, //The ESP Home Client, thus no valid read/write IDs
  { "KESSEL"        , 0x180,    {0x31, 0x00},   {0x30, 0x00},   {0x00, 0x00}},
  { "MANAGER"       , 0x480,    {0x91, 0x00},   {0x90, 0x00},   {0x00, 0x00}},
  { "HEIZMODUL"     , 0x500,    {0xA1, 0x00},   {0xA0, 0x00},   {0x00, 0x00}}
};

typedef enum
{
  // Die Reihenfolge muss mit CanMembers übereinstimmen!
  cm_espclient = 0,
  cm_kessel,
  cm_manager,       
  cm_heizmodul      
} CanMemberType;

const ElsterIndex *  processCanMessage(unsigned short can_id, std::string &signalValue, std::vector<unsigned char> msg)
{
    // Return if the message is too small
    if(msg.size() < 7) {
        return &ElsterTable[0];
    }

    const ElsterIndex* ei;
    unsigned char byte1;
    unsigned char byte2;
    char charValue[16];

    if(int(msg[2]) == 0xfa) {
        byte1 = msg[5];
        byte2 = msg[6];
        ei = GetElsterIndex(int((msg[4])+( (msg[3])<<8)));
    } else {
        byte1 = msg[3];
        byte2 = msg[4];
        ei = GetElsterIndex(int(msg[2]));
    }

    switch(ei->Type){
        case et_double_val:
            SetDoubleType(charValue, ei->Type, double(byte2+(byte1<<8)));
            break;
        case et_triple_val:
            SetDoubleType(charValue, ei->Type, double(byte2+(byte1<<8)));
            break;
        default:
            SetValueType(charValue, ei->Type, int(byte2+(byte1<<8)));
            break;
    }
    
    //sprintf(logString, "%d;%s;%s;%s", can_id, ei->Name, charValue, ElsterTypeStr[ei->Type]);
    //id(received_can_signal).publish_state(logString);
    ESP_LOGI("processCanMessage()", "%d:\t%s:\t%s\t(%s)", can_id, ei->Name, charValue, ElsterTypeStr[ei->Type]);

    signalValue = (std::string)charValue;
    return ei;
}

void update_COP_WW()
{
    id(COP_WW).publish_state((id(WAERMEERTRAG_WW_SUM).state + id(WAERMEERTRAG_2WE_WW_SUM).state) / id(EL_AUFNAHMELEISTUNG_WW_SUM).state);
    return;
}
void update_COP_HEIZ()
{
    id(COP_HEIZ).publish_state((id(WAERMEERTRAG_HEIZ_SUM).state + id(WAERMEERTRAG_2WE_HEIZ_SUM).state) / id(EL_AUFNAHMELEISTUNG_HEIZ_SUM).state);
    return;
}
void update_COP_GESAMT()
{
    id(COP_GESAMT).publish_state((id(WAERMEERTRAG_HEIZ_SUM).state + id(WAERMEERTRAG_2WE_HEIZ_SUM).state + id(WAERMEERTRAG_WW_SUM).state + id(WAERMEERTRAG_2WE_WW_SUM).state) / (id(EL_AUFNAHMELEISTUNG_HEIZ_SUM).state + id(EL_AUFNAHMELEISTUNG_WW_SUM).state));             
    return;
}

void readSignal(const CanMember * member, const ElsterIndex * ei) {
    bool use_extended_id = 0; //No use of extended ID
    uint8_t IndexByte1 = (uint8_t) (ei->Index >> 8);
    uint8_t IndexByte2 = (uint8_t) (ei->Index - ((ei->Index >> 8) << 8));
    std::vector< uint8_t > data;

    if(IndexByte1 == 0x00) {
        data.insert(data.end(), {
            member->ReadId[0],
            member->ReadId[1],
            IndexByte2,
            0x00,
            0x00,
            0x00,
            0x00
        });
    } else {
        data.insert(data.end(), {
            member->ReadId[0],
            member->ReadId[1],
            0xfa,
            IndexByte1,
            IndexByte2,
            0x00,
            0x00
        });
    }

    char logmsg[120];
    sprintf(logmsg, "READ \"%s\" (0x%04x) FROM %s (0x%02x {0x%02x, 0x%02x}): %02x, %02x, %02x, %02x, %02x, %02x, %02x", ei->Name, ei->Index, member->Name, member->CanId, member->ReadId[0], member->ReadId[1], data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
    ESP_LOGI("readSignal()", "%s", logmsg);
    
    id(my_mcp2515).send_data(CanMembers[cm_espclient].CanId, use_extended_id, data);
    
    return;
}

void writeSignal(const CanMember * member, const ElsterIndex * ei, const char * & str) {
    bool use_extended_id = 0; //No use of extended ID
    int writeValue = TranslateString(str, ei->Type);
    uint8_t IndexByte1 = (uint8_t) (ei->Index >> 8);
    uint8_t IndexByte2 = (uint8_t) (ei->Index - ((ei->Index >> 8) << 8));
    std::vector< uint8_t > data;

    if(IndexByte1 == 0x00) {
        data.insert(data.end(), {
            member->WriteId[0],
            member->WriteId[1],
            IndexByte2,
            ((uint8_t)(writeValue>>8)),
            ((uint8_t)(writeValue-((writeValue>>8)<<8))),
            0x00,
            0x00
        });
    } else {
        data.insert(data.end(), {
            member->WriteId[0],
            member->WriteId[1],
            0xfa,
            IndexByte1,
            IndexByte2,
            ((uint8_t)(writeValue>>8)),
            ((uint8_t)(writeValue-((writeValue>>8)<<8)))
        });
    }

    char logmsg[120];
    sprintf(logmsg, "WRITE \"%s\" (0x%04x): \"%d\" TO: %s (0x%02x {0x%02x, 0x%02x}): %02x, %02x, %02x, %02x, %02x, %02x, %02x", ei->Name, ei->Index, writeValue, member->Name, member->CanId, member->ReadId[0], member->ReadId[1], data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
    ESP_LOGI("writeSignal()", "%s", logmsg);
    
    id(my_mcp2515).send_data(CanMembers[cm_espclient].CanId, use_extended_id, data);
    
    return;
}

void publishDate()
{
    int ijahr = (int)id(JAHR).state;
    std::string jahr;
    if(ijahr >= 0 & ijahr < 99)
    {
        if(ijahr < 10)
            jahr = "0" + to_string(ijahr);
        else
            jahr = to_string(ijahr);
    }
    else
    {
        jahr = "00";
    }

    int imonat = (int)id(MONAT).state;
    std::string monat;
    if(imonat > 0 & imonat <= 12)
    {
        if(imonat < 10)
            monat = "0" + to_string(imonat);
        else
            monat = to_string(imonat);
    }
    else
    {
        monat = "00";
    }

    int itag = (int)id(TAG).state;
    std::string tag;
    if(itag > 0 & itag <= 31)
    {
        if(itag < 10)
            tag = "0" + to_string(itag);
        else
            tag = to_string(itag);
    }
    else
    {
        tag = "00";
    }

    id(DATUM).publish_state("20" + jahr + "-" + monat + "-" + tag);

    return;

    //              id(DATUM).publish_state("20" + to_string((int)id(JAHR).state) + "-" + to_string((int)id(MONAT).state) + "-" + to_string((int)id(TAG).state));
}

void publishTime()
{
    int istunde = (int)id(STUNDE).state;
    std::string stunde;
    if(istunde >= 0 & istunde < 60)
    {
        if(istunde < 10)
            stunde = "0" + to_string(istunde);
        else
            stunde = to_string(istunde);
    }
    else
    {
        stunde = "00";
    }

    int iminute = (int)id(MINUTE).state;
    std::string minute;
    if(iminute >= 0 & iminute < 60)
    {
        if(iminute < 10)
            minute = "0" + to_string(iminute);
        else
            minute = to_string(iminute);
    }
    else 
    {
        minute = "00";
    }

    int isekunde = (int)id(SEKUNDE).state;
    std::string sekunde;
    if(isekunde >= 0 & isekunde < 60)
    {
        if(isekunde < 10)
            sekunde = "0" + to_string(isekunde);
        else
            sekunde = to_string(isekunde);
    }
    else
    {
        sekunde = "00";
    }

    id(ZEIT).publish_state(stunde + ":" + minute + ":" + sekunde);
    return;

    //              id(DATUM).publish_state("20" + to_string((int)id(JAHR).state) + "-" + to_string((int)id(MONAT).state) + "-" + to_string((int)id(TAG).state));
}

#endif

Somit konnte ich den Rest vom Video von Simon mit seinem Beschrieb auch ausführen.
Jetzt habe ich nur noch das Problem, dass das Dashboard ein paar Lücken hat. Mit fehlen die Einträge gem. Fotos und es scheinen einige Werte merkwürdig zu sein. Z.B.die SET Speichersolltemp


screenshots. Vielleicht kann mir jemand weiter helfen?

Hi, könntest du mir nochmal eine genaue Anleitung machen wie du das hinbekommen hast?
Ich habe auch die 5,5 eco, das esp32 mit dem mcp2515

Ich bleibe schon bei dem schritt hängen dass ich in HA nichtmal eine Übersicht der möglichen Sensoren aufgelistet bekomme. Ob mit oder ohne Werte.

Was hast du den gemacht bisher? Espresso Projekt angelegt, Hardware angeschlossen? Wird das gerät als Online gelistet in esphome? Was sagt der log? Wird das gerät von home assistant entdeckt und kann hinzugefügt werden? Welche Projekt nutzt du? Das von mir gepostet oneesp32…?

Ich versuche dein Projekt zu nutzen. Ist alles verkabelt und an der Wärmelampe angeschlossen, genau wie bei dir mit den gleichen Komponenten. Den esp hab ich testweise auch schon einmal getestet und er hat eine Verbindung zum HA . Aber dann hörts auch schon auf.
Das Ganze hin und her mit was wo hin kopiert werden soll wie in dem Video beschrieben und dann auf der Seite vom kroner bringt nur noch Grütze bei mir im Kopf.
Es steht eben nirgends was Genau man kopieren soll, wohin usw.

Es hört also schon beim kopieren in den esp-Ordner bei HA auf…. Schon mehrere Sachen versucht, nichts funktioniert.

Ich bin jetzt schon etwas weiter. Allerdings wirft mir der esp Fehler beim validieren aus. Ein paar konnte ich beseitigen aber nun hänge ich fest.
Hast du da ne Lösung?

Ohne den esphome code etwas schwierig, poste den mal mit

Und wegen dem kopieren vom oneesp32 Projekt, das Projekt als zip laden und entdecken, dann den ganzen Ordner in den esphome order in deinem HA config folder kopieren, da sollten schon yaml files von deinen anderen asp Projekten liegen.

In der eigentlichen ESP config noch die Pfade anpassen falls dein Ordner nicht so heisst wie in der config.

Und dann die GPIO Pins so anpassen das sie zu deinem ESP passen. Ich hab das ganze erst auf einen esp32-wroom-32d laufen gehabt und jetzt auf einen mit Lan mit POE Modul.

Aber sonst sollte es einfach sein sofern du alles an den richtigen stellen angeklebt hast, musst halt schauen wo dein Board laut Pin layout die nötigen Pins (Miso, Mosi, clk usw hat). Und ganz wichtig, das hatte ich beim Lan board verpennt, das Canbus Modul braucht 5v, sonst läuft es zwar laut log aber klappt trotzdem nicht.