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....