ESP32 - MCP2515 mit CAN-Bus + MQTT an Tecalor Wärmepumpe

Guten Abend,

folgendes habe ich vor:
Einen ESP 32 mit einem MCP2515 per CAN-Bus an unsere Tecalor Wärmepumpe anschließen und die Daten per MQTT (WiFi) an Mosquitto senden und im besten falle auch empfangen.

Was bisher geht:
Also ich habe MCP und ESP verbunden, am Wärmepumpenmanager angeschlossen und sehe im Seriellen Monitor von Arduino IDE CAN-Bus Telegramme und kann diese per MQTT verschicken.

Was noch fehlt:
Tolle Leute haben sich die Mühe gemacht die Daten auszulesen und Tabellen anzufertigen die die Daten dann übersetzen:
http://www.juerg5524.ch/list_data.php

Mein Problem ist nun, was muss ich Programmieren, um eine Tabelle in der Arduino IDE Anzulegen und die Daten vor dem übertragen zu übersetzen so das per MQTT nur noch z.B. "Außentemperatur 25°C" gesendet wird.

Leider bin ich erst am Anfang mit meiner Programmiererei und habe keiner Ahnung nach was man da suchen kann/muss/sollte und stehe komplett auf dem Schlauch.

Kann mich einer erläuchten ?

Grüße
Stefan

Tabellen kannst Du als Arrays abbilden. Ich glaube aber nicht, dass das das ist, was Du suchst. Du willst nach meiner Meinung das Telegramm parsen, also bestimmte Inhalte auslesen.
Dazu müsstest Du uns aber sagen, welches der vielen in Deinem Link für Dich zutrifft. Das können wir nicht ermitteln.

Gruß Tommy

Wenn ich das richtig verstanden habe, steht in dem CAN-BUS Telegram immer zuerst eine CAN ID, und dann Messwerte mit Beschreibung. D.h.

Also mit Tabelle meine ich sowas: (Vermutlich ein Array wenn ich Dich richtig verstanden habe)

  { "FEHLERMELDUNG", 0x0001, 0},
  { "KESSELSOLLTEMP", 0x0002, et_dec_val},
  { "SPEICHERSOLLTEMP", 0x0003, et_dec_val},
  { "VORLAUFSOLLTEMP", 0x0004, et_dec_val},
  { "RAUMSOLLTEMP_I", 0x0005, et_dec_val},
  { "RAUMSOLLTEMP_II", 0x0006, et_dec_val},
  { "RAUMSOLLTEMP_III", 0x0007, et_dec_val},
  { "RAUMSOLLTEMP_NACHT", 0x0008, et_dec_val},
  { "UHRZEIT", 0x0009, et_zeit},

Vor dem Programmieren steht die Analyse. Da ich keine solche Wärmepumpe habe, kann ich das nicht. Eventuell könnte das, was Du auf dem seriellen Monitor siehst, helfen. Bitte als Text, nicht als Foto.

Ja, diese identifiziert den Inhalt.

Ja.

Unwahrscheinlich, aber möglich.

Da häng ich mich doch gerne mal mit rein. Ich habe ähnliches vor. Ich habe eine Stiebel Eltron LWZ 404, die vermutlich baugleich mit deiner Tecalor ist.

Beste Gruß,
Chris

So, ich poste zunächst mal den Sketch so wie er bisher steht: An alle die das schon länger machen: Hilfe gerne willkommen, ich kann mich derzeit nur mit den Beispielen in der IDE und dem was ich in Beiträgen so lesen und VERSTEHEN kann, behelfen.

#include <WiFi.h>
#include <PubSubClient.h>
#include <mcp_can.h>
#include <SPI.h>

// WiFi-Zugangsdaten
const char* ssid = "SSID";
const char* password = "PASSWORD";

// MQTT Broker-Zugangsdaten
const char* mqttClientId = "Client Name";
const char* mqttTopic = "Waermepumpe/Status";
const char* mqttTopic2 = "Waermepumpe/Daten";
#define mqtt_server "Server IP Adresse"              // server name or IP
#define mqtt_user "Benutzername"                      // username
#define mqtt_password "Password"                     // password

// Gewünschte CAN-IDs
const unsigned long canId1 = 180;
const unsigned long canId2 = 301;
const unsigned long canId3 = 480;
const unsigned long canId4 = 500;


long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
char msgString[128];                        // Array to store serial string

#define CAN0_INT 5                              // Set INT to pin 2
MCP_CAN CAN0(17);                               // Set CS to pin 10
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);

void setup(){
  Serial.begin(115200);

  // Initialisiere den MCP2515 CAN-Controller mit 20.000 Bitrate und 8Mhz
    if (CAN0.begin(MCP_ANY, CAN_20KBPS, MCP_8MHZ) == CAN_OK) {
    Serial.println("CAN-Bus-Verbindung hergestellt!");
  } else {
    Serial.println("Fehler beim Verbinden mit dem CAN-Bus!");
    while (1);
  }
   
  CAN0.setMode(MCP_NORMAL);                             // Set operation mode to normal so the MCP2515 sends acks to received data.
  pinMode(CAN0_INT, INPUT);                             // Configuring pin for /INT input
  
  Serial.println("MCP2515 Library Receive Example...");

// WiFi-Verbindung herstellen
  connectWiFi();

  // MQTT-Verbindung herstellen
  connectMQTT();

}

void loop()
{

// Überwache die MQTT-Verbindung
  if (!mqttClient.connected()) {
    connectWiFi();
    connectMQTT(); // Verbindung wiederherstellen, falls die Verbindung getrennt wurde
  }
  mqttClient.loop();
  
  if(!digitalRead(CAN0_INT))                         // If CAN0_INT pin is low, read receive buffer
  {
    CAN0.readMsgBuf(&rxId, &len, rxBuf);      // Read data: len = data length, buf = data byte(s)
    
    if((rxId & 0x80000000) == 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
      sprintf(msgString, "Extended ID: 0x%.8lX  DLC: %1d  Data:", (rxId & 0x1FFFFFFF), len);
    else
      sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
  
    Serial.print(msgString);

  
    if((rxId & 0x40000000) == 0x40000000){    // Determine if message is a remote request frame.
      sprintf(msgString, " REMOTE REQUEST FRAME");
      Serial.print(msgString);
    } else {
      for(byte i = 0; i<len; i++){
        sprintf(msgString, " 0x%.2X", rxBuf[i]);
        Serial.print(msgString);
      }
    }
       Serial.println();

  }

  // Überprüfe, ob eine CAN-Nachricht empfangen wurde
  if (CAN0.checkReceive() == CAN_MSGAVAIL) {
    // Lese die CAN-ID und Daten der empfangenen Nachricht
    unsigned long canId;
    uint8_t dataLength;
    uint8_t data[8];

    CAN0.readMsgBuf(&canId, &dataLength, data);
    Serial.print("Publish jede ID");
    Serial.println();
    publishMQTT(canId, data, dataLength);
   
   
    // Filtere die empfangenen Nachrichten anhand der gewünschten CAN-IDs
    if (canId == canId1 || canId == canId2 || canId == canId3 || canId == canId4) {
      // Sende die empfangenen Daten über MQTT
      publishMQTT(canId, data, dataLength);
      Serial.print("Publish FILTERed ID");
      Serial.println();
    }
  }


  
}




void connectWiFi() {
  Serial.println("Verbinde mit WiFi...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi verbunden!");
}




void connectMQTT() {
  mqttClient.setServer(mqtt_server, 1883);
  while (!mqttClient.connected()) {
    Serial.println("Verbinde mit MQTT...");
    if (mqttClient.connect(mqttClientId, mqtt_user, mqtt_password)) {
      Serial.println("MQTT verbunden!");
      mqttClient.subscribe(mqttTopic); // Hier könntest du weitere Themen hinzufügen, auf die das Gerät hören soll
      mqttClient.publish(mqttTopic,"MQTT Wärmepumpe verbunden");
    } else {
      Serial.print("Fehler beim Verbinden mit MQTT, Fehlercode: ");
      Serial.println(mqttClient.state());
      delay(2000);
    }
  }
}



void publishMQTT(unsigned long canId, uint8_t* data, uint8_t dataLength) {
  // Hier könntest du die empfangenen CAN-Daten in ein geeignetes Format umwandeln,
  // falls notwendig, um sie über MQTT zu senden.
  // In diesem Beispiel senden wir die CAN-ID und Daten im Hex-Format als Zeichenkette.
  String message = "CAN-ID: 0x" + String(canId, HEX) + ", Daten: ";
  for (int i = 0; i < dataLength; i++) {
    message += String(data[i], HEX);
    message += " ";
  }

  // Sende die Nachricht über MQTT
  mqttClient.publish(mqttTopic2Elster, message.c_str());
}

In der Seriellen Konsole kommt u.a. das an:

19:36:21.418 -> Standard ID: 0x500 DLC: 7 Data: 0x92 0x00 0xFA 0x07 0xF2 0x00 0x00
19:36:21.418 -> Standard ID: 0x480 DLC: 7 Data: 0xA1 0x00 0xFA 0x07 0xF4 0x00 0x00
19:36:21.418 -> Standard ID: 0x500 DLC: 7 Data: 0x92 0x00 0xFA 0x07 0xF4 0x00 0x24
19:36:21.464 -> Standard ID: 0x480 DLC: 7 Data: 0xA1 0x00 0xFA 0x07 0xF3 0x00 0x00
19:36:21.464 -> Standard ID: 0x500 DLC: 7 Data: 0x92 0x00 0xFA 0x07 0xF3 0x00 0x00

Die Leute die das u.a. mit einem Rpi, C++ usw. programmiert haben, sprechen immer von einer Elster Tabelle (Kann man runterladen) bei der ich mir jedoch sicher bin, dass die damit nicht die Elektronische Steuer meinen....

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.