Skip to content

Instantly share code, notes, and snippets.

@JavanXD
Last active July 1, 2025 16:54
Show Gist options
  • Save JavanXD/696d026ef202a7d6455ed4745df63e39 to your computer and use it in GitHub Desktop.
Save JavanXD/696d026ef202a7d6455ed4745df63e39 to your computer and use it in GitHub Desktop.
ESPHome/Homeassistant - Sniff CAN-Bus (MCP2515) from LEDA LUC2
substitutions:
name: esphome-ledaluc2
friendly_name: ESPHome LEDA LUC2
esphome:
name: ${name}
friendly_name: ${friendly_name}
min_version: 2023.6.0 # Use a stable ESPHome version for compatibility
name_add_mac_suffix: false # Prevent adding MAC suffix to the device name
project:
name: esphome.web
version: dev # Version of the project
esp32:
board: esp32dev # Specify the ESP32 development board
framework:
type: arduino # Use the Arduino framework
# Enable logging for debugging purposes
logger:
# Enable Home Assistant API with encryption key from secrets.yaml
api:
encryption:
key: !secret api_key
# Enable over-the-air updates for firmware
ota:
platform: esphome
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Fallback hotspot in case Wi-Fi connection fails
ap:
ssid: "ESPHome-LEDALUC2"
password: !secret ap_password
# Allow Wi-Fi provisioning via serial connection
improv_serial:
# Enable captive portal for Wi-Fi provisioning via the fallback hotspot
captive_portal:
# Import specific components from an example configuration without overwriting local settings
dashboard_import:
package_import_url: github://esphome/example-configs/esphome-web/esp32.yaml@main
import_full_config: false
# Host a simple web server (e.g., for Improv Wi-Fi)
web_server:
# Configure the SPI interface for the MCP2515 CAN bus module
spi:
clk_pin: GPIO22 # Clock pin
miso_pin: GPIO17 # Master In Slave Out pin
mosi_pin: GPIO21 # Master Out Slave In pin
# Configure the CAN bus using the MCP2515 module
canbus:
- platform: mcp2515
cs_pin: GPIO16
can_id: 0x28A
bit_rate: 125KBPS
on_frame:
- can_id: 0x28A
then:
- lambda: |-
// Log all received CAN frames for debugging
if (x.size() > 0 && x.size() < 8) {
// Log the received frame data safely
std::string frame_data;
for (size_t i = 0; i < x.size(); i++) {
char byte_str[5];
snprintf(byte_str, sizeof(byte_str), "0x%02X ", x[i]);
frame_data += byte_str;
}
// Log the frame data in a single line
ESP_LOGD("CAN", "Received CAN Frame (Size: %d bytes): %s", x.size(), frame_data.c_str());
// Check for specific sizes and log states
if (x.size() == 2) {
ESP_LOGI("CAN", "Interpreted State: Ventilation turned OFF via Display");
} else if (x.size() == 1) {
ESP_LOGI("CAN", "Interpreted State: Ventilation turned ON via Display");
} else {
ESP_LOGW("CAN", "Interpreted State: Unknown or Additional Data");
}
}
else if (x.size() == 8) {
uint8_t frame_type = x[0]; // First byte determines the frame type
// Frame type 0x00: Pressure difference and exhaust temperature
if (frame_type == 0x00) {
// Extract pressure difference from Byte 2
float pressure_difference = x[1] * 0.1f; // Convert to Pascals
// Check for adjustment flag in Byte 3
if (x[2] == 0x81) {
const float PRESSURE_ADJUSTMENT_VALUE = 25.5f;
pressure_difference += PRESSURE_ADJUSTMENT_VALUE;
ESP_LOGI("CAN", "Adjustment Applied: +%.1f Pa", PRESSURE_ADJUSTMENT_VALUE);
}
// Extract exhaust temperature from Byte 4
float exhaust_temperature = static_cast<float>(x[3]); // °C
// Log decoded values
ESP_LOGI("CAN", "Pressure: %.1f Pa, Temperature: %.1f °C", pressure_difference, exhaust_temperature);
// Publish to sensors
id(pressure_difference_sensor).publish_state(pressure_difference);
id(exhaust_temperature_sensor).publish_state(exhaust_temperature);
}
// Frame type 0x01: Ventilation status
else if (frame_type == 0x01) {
// Extract ventilation status from Byte 6
bool ventilation_active = (x[5] == 0x01);
// Log ventilation status
ESP_LOGI("CAN", "Ventilation Active: %s", ventilation_active ? "Yes" : "No");
ESP_LOGD("CAN", "Ventilation Bytes: Data=%02X %02X %02X %02X %02X %02X %02X %02X",
x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7]);
// Publish to binary sensor
id(ventilation_status_sensor).publish_state(ventilation_active);
}
// Frame type 0x09: Heartbeat signal
else if (frame_type == 0x09) {
// Log loop and counter for reference
ESP_LOGD("CAN", "Heartbeat (0x09): Loop=%02X, Counter=%02X", x[2], x[1]);
}
// Frame type 0x55: Heartbeat signal
else if (frame_type == 0x55) {
// Log loop and counter for reference
ESP_LOGD("CAN", "Heartbeat (0x55): Loop=%02X, Counter=%02X", x[2], x[1]);
}
else if (frame_type == 0x80) {
ESP_LOGW("CAN", "Error Frame (0x80): Data=%02X %02X %02X %02X %02X %02X %02X %02X",
x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7]);
}
else if (frame_type == 0x81) {
ESP_LOGW("CAN", "Error Frame (0x81): Data=%02X %02X %02X %02X %02X %02X %02X %02X",
x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7]);
}
// Handle unknown frame types
else {
ESP_LOGW("CAN", "Unknown Frame Type. Data=%02X %02X %02X %02X %02X %02X %02X %02X",
x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7]);
}
} else {
ESP_LOGW("CAN", "Unexpected frame size: %d bytes", x.size());
}
# Define template sensors to hold the values published from the CAN bus data
sensor:
- platform: template
name: "Pressure Difference"
id: pressure_difference_sensor
unit_of_measurement: "Pa"
accuracy_decimals: 1
device_class: pressure # Device class for pressure sensors
icon: "mdi:air-filter" # Optional custom icon for visual clarity
filters:
- throttle_average: 3s
- platform: template
name: "Exhaust Temperature"
id: exhaust_temperature_sensor
unit_of_measurement: "°C"
accuracy_decimals: 1
device_class: temperature # Device class for temperature sensors
icon: "mdi:thermometer"
filters:
- throttle_average: 3s
binary_sensor:
- platform: template
name: "Ventilation Status"
id: ventilation_status_sensor
device_class: running # Device class for indicating system activity
icon: "mdi:fan" # Optional custom icon for ventilation
@Maigus2510
Copy link

Hey, irgendwie bin ich zu doof das Zeug zusammen zu löten. Könnte mir jemand, natürlich gegen Aufwandsentschädigung, so ein Ding zusammen bauen?

@FredAnn
Copy link

FredAnn commented Apr 22, 2025

Hallo, ich habe eine 30-Pin-ESP32 hier. Kann mir bitte jemand die PIN-Belegung dafür zum MCP2525 nennen? Muss ich im Code dann Änderungen vornehmen?
Danke!

@failbit
Copy link

failbit commented Jun 8, 2025

@Hooorny bekommst du mit dem neuen bild von @JavanXD mittlerweile werte ausgelesen? Bei mir bekomme ich keine Werte.. :(

@failbit
Copy link

failbit commented Jun 8, 2025

Und ich sehe gerade in dem Log vom esphome folgendes:
[19:24:35][E][component:085]: Component canbus is marked FAILED:

Jemand eine Idee woran das liegen könnte?

@Hooorny
Copy link

Hooorny commented Jun 11, 2025

@failbit Funktioniert bei mir leider nicht, ich weiß auch nicht wieso. Nach einem Neustart vom ESP bekomme ich manchmal 1-2 Werte und dann tut sich nichts mehr.
Habe alles schon 1000-fach überprüft und kann keinen "Fehler" finden ...

@JavanXD
Copy link
Author

JavanXD commented Jun 15, 2025

Wenn ihr das Webinterface vom ESP32 aufruft bekommt ihr recht gute Logs zu allen Nachrichten die auf dem CAN-Bus übertragen werden. Aktuell sind die Aussagen hier im Chat vonwegen "bei mir funktioniert es nicht", so gar nicht aufschlussreich.

@bgunner1987
Copy link

Da ich von den letzten Nachrichten "Funktioniert nicht" kurz abgeschreckt war, musste ich ein Kommentar hinterlassen:
Bei mir läuft es auf anhieb.
Vielen Dank an @JavanXD

@Blaumicha
Copy link

Blaumicha commented Jun 21, 2025

Hi bgunner1987, schön zu hören - bei mir leider auch keine Funktion. Im Webinterface konnte ich ein mal folgendes speichern:

41:01 [D] [esp-idf:000]�[1;31m[httpd]�[0;36m
�[0;33mW (502926) httpd_txrx: httpd_sock_err: error in recv : 104�[0m

Das ganze zusammengelötet, die CanBus adern getauscht und mit ESPHome geflasht, die Codezeilen 46-49 muss man dann auskommentieren.

Hat da jemand eine Idee?

HG Michael und Dank an JavanXD fürs ausknobeln und veröffentlichen.

@Blaumicha
Copy link

Alles noch mal neu auf dem ESP (neu) installiert, neue CanBus Platine, gleiche verhalten.

Zur Config, mein HA lauft auf einer VM auf einem Unraid Server - kommen die Daten irgendwie nicht durch? Beim Anstecken des ESP an den Bus zeigt das Display des Leda kurz „suche Module“ . Könnte das auch an der Version des Leda liegen? Können die bei den es klappt einmal die Versionsnummer posten?

HG Michael

@failbit
Copy link

failbit commented Jun 22, 2025

Habe ebenfalls nochmal neu installiert. Hier einmal die Log-Ausgabe vom ESP die den Fehler wirft:

[18:47:41][C][spi:068]: SPI bus:
[18:47:41][C][spi:069]: CLK Pin: GPIO22
[18:47:41][C][spi:070]: SDI Pin: GPIO17
[18:47:41][C][spi:071]: SDO Pin: GPIO21
[18:47:41][C][spi:076]: Using HW SPI: SPI
[18:47:41][C][canbus:021]: config standard id=0x28a
[18:47:41][E][component:088]: Component canbus is marked FAILED:

Sieht das bei Dir auch so aus, @Blaumicha ?

@Blaumicha
Copy link

Das läuft bei mir, sieht so aus:
[17:00:12][C][spi:068]: SPI bus:
[17:00:12][C][spi:069]: CLK Pin: GPIO22
[17:00:12][C][spi:070]: SDI Pin: GPIO17
[17:00:12][C][spi:071]: SDO Pin: GPIO21
[17:00:12][C][spi:076]: Using HW SPI: SPI2_HOST
[17:00:12][C][canbus:021]: config standard id=0x28a
[17:00:12][C][template.sensor:022]: Template Sensor 'Pressure Difference'

Entschuldige die Frage in welche Lochreihe hast Du das CanBus Interface gelötet? Bei mir ist es die Reihe direkt am ESP Chip.

@failbit
Copy link

failbit commented Jun 22, 2025

Genau, habe ich auch. Weiß hinterlegte reihe.

@Blaumicha
Copy link

Blaumicha commented Jun 23, 2025

Es kommen keine Daten, nachdem ich dem ESP eine feste IP Adresse zugewiesen hatte, wurde direkt nach dem Installieren folgendes im Logfemnster ausgegeben, danach keine weiteren Zeilen:

22:00:53 [D] [api. connection:236] Home Assistant 2025.6.1 (192.168.178.193) disconnected
22:00:53 [W] [component:188] Component api set Warning flag: unspecified
22:01:22 [D] [canbus:077] received can message (#1) std can_id=0x0 size=0
22:01:22 [D] [canbus:077] received can message (#2) std can_id=0x0 size=0
22:01:32 [D] (api:133) Accepted 192.168.178.193
22:01:32 [W] [component: 203] Component api cleared Warning flag
22:01:32 [D] (api.connection:1570] Home Assistant 2025.6.1 (192.168.178.193) connected
22:01:39 [D] [canbus:077] received can message (#1) std can_id=0x0 size=0
22:01:45 [D] [api:133] Accepted 192.168.178.193
22:01:45 [D] (api.connection:236] aioesphomeapi (192.168.178.193) disconnected
22:01:45 [D] [canbus:077] received can message (#1) std can_id=0x0 size=0

Danach hatte ich 8 Grad Abgastemp (wir hatten gut 30 Grad gestern im Haus) und 0 Druckdifferenz und Lüftungsstatus „OFF“, läuft aber.

Nach dem Abziehen des ESP von der Versorgungsspannung und neubooten nur noch folgende Ausgaben:
22:14:53 [D] lapi: 1331 Accepted 192.168.178.193
22:14:53 [W] [component: 203] Component api cleared Warning flag
22:14:53 [D] [api. connection:1570] Home Assistant 2025.6.1 (192.168.178.193) connected
22:15:24 [I] [safe_mode:042] Boot seems successful; resetting boot loop counter
22:15:24 [D] [esp32.preferences:142] Writing 1 items: 0 cached, 1 written, 0 failed

Ich hoffe jemand hier hat eine Idee. HG Michael

@failbit
Copy link

failbit commented Jun 23, 2025

Könnten unterschiedliche esphome Versionen auch ein Problem machen? Ich verwende derzeit ESPHome 2025.6.0

Mich macht stutzig, dass bei dir "Using HW SPI: SPI2_HOST" in den Logs erscheint, bei mir "Using HW SPI: SPI". Ich habe noch mit der "interface"-Option unterhalb von spi etwas zu verändern - ohne erfolg.

@bgunner1987
Copy link

Alles noch mal neu auf dem ESP (neu) installiert, neue CanBus Platine, gleiche verhalten.

Zur Config, mein HA lauft auf einer VM auf einem Unraid Server - kommen die Daten irgendwie nicht durch? Beim Anstecken des ESP an den Bus zeigt das Display des Leda kurz „suche Module“ . Könnte das auch an der Version des Leda liegen? Können die bei den es klappt einmal die Versionsnummer posten?

HG Michael

Wo finde ich Versionsnummer?
Die Modulsuche vom Leda hatte ich mal bei einer schlechten Kabelverbindung. Da ging Leda dann auch in Fehler.

@Blaumicha
Copy link

Alles noch mal neu auf dem ESP (neu) installiert, neue CanBus Platine, gleiche verhalten.
Zur Config, mein HA lauft auf einer VM auf einem Unraid Server - kommen die Daten irgendwie nicht durch? Beim Anstecken des ESP an den Bus zeigt das Display des Leda kurz „suche Module“ . Könnte das auch an der Version des Leda liegen? Können die bei den es klappt einmal die Versionsnummer posten?
HG Michael

Wo finde ich Versionsnummer? Die Modulsuche vom Leda hatte ich mal bei einer schlechten Kabelverbindung. Da ging Leda dann auch in Fehler.

Man kann das Fachbetrieb Menü aufrufen, PW ist die PLZ vom Hersteller: 26761

@bgunner1987
Copy link

Alles noch mal neu auf dem ESP (neu) installiert, neue CanBus Platine, gleiche verhalten.
Zur Config, mein HA lauft auf einer VM auf einem Unraid Server - kommen die Daten irgendwie nicht durch? Beim Anstecken des ESP an den Bus zeigt das Display des Leda kurz „suche Module“ . Könnte das auch an der Version des Leda liegen? Können die bei den es klappt einmal die Versionsnummer posten?
HG Michael

Wo finde ich Versionsnummer? Die Modulsuche vom Leda hatte ich mal bei einer schlechten Kabelverbindung. Da ging Leda dann auch in Fehler.

Man kann das Fachbetrieb Menü aufrufen, PW ist die PLZ vom Hersteller: 26761

Bei mir wird das Passwort nicht angenommen. Muss morgen mal die Bedienungsanleitung suchen, vielleicht hat der Elektriker ein eigenes/ neues vergeben.

@Blaumicha
Copy link

Sorry könnte auch 26789 Sein, die haben zwei PLZs.

@Hooorny
Copy link

Hooorny commented Jun 27, 2025

Das läuft bei mir, sieht so aus: [17:00:12][C][spi:068]: SPI bus: [17:00:12][C][spi:069]: CLK Pin: GPIO22 [17:00:12][C][spi:070]: SDI Pin: GPIO17 [17:00:12][C][spi:071]: SDO Pin: GPIO21 [17:00:12][C][spi:076]: Using HW SPI: SPI2_HOST [17:00:12][C][canbus:021]: config standard id=0x28a [17:00:12][C][template.sensor:022]: Template Sensor 'Pressure Difference'

Entschuldige die Frage in welche Lochreihe hast Du das CanBus Interface gelötet? Bei mir ist es die Reihe direkt am ESP Chip.

Bei mir scheint der canbus auch zu laufen, es kommen aber keine Werte rein ... habe auch testweise den Jumper auf dem Board mal geschlossen, bringt aber auch nix :(

grafik
grafik

Hier noch die HW Version:
grafik

@Blaumicha
Copy link

Blaumicha commented Jun 29, 2025

Es bleibt unerklärlich. Aus dem Artikel https://esphome.io/components/canbus/mcp2515 Habe ich mitgenommen, das es einige MCPs gibt, die mit den 3,3/5V Pegeln nihct zurecht kommen. Also einen LevelShifter zwischen geschaltet, beim Booten des ESP wird der CAM Bus erkannt - weiter keine Daten (Auch das umdrehen der HI/LO Eingänge am MCP hat nicht geholfen).

Entweder machen wir (die keine Daten bekommen) etwas grundsätzlich anders, der MCP ist bei mir drei mal def. oder es - kommt jetzt jemand mit einer neuen Idee. Ich habe übrigens den CAM BUS Y-Splitter an dem Display angeschlossen, alle bei denen es funktioniert auch oder am Steuermodul (im Keller)?

Help.

@Hooorny
Copy link

Hooorny commented Jun 30, 2025

Es bleibt unerklärlich. Aus dem Artikel https://esphome.io/components/canbus/mcp2515 Habe ich mitgenommen, das es einige MCPs gibt, die mit den 3,3/5V Pegeln nihct zurecht kommen. Also einen LevelShifter zwischen geschaltet, beim Booten des ESP wird der CAM Bus erkannt - weiter keine Daten (Auch das umdrehen der HI/LO Eingänge am MCP hat nicht geholfen).

Entweder machen wir (die keine Daten bekommen) etwas grundsätzlich anders, der MCP ist bei mir drei mal def. oder es - kommt jetzt jemand mit einer neuen Idee. Ich habe übrigens den CAM BUS Y-Splitter an dem Display angeschlossen, alle bei denen es funktioniert auch oder am Steuermodul (im Keller)?

Help.

Ich habe den CAN-Bus Y-Splitter an beiden Stellen probiert, jeweils kein Erfolg.

@failbit
Copy link

failbit commented Jul 1, 2025

Ich habe aus Verzweiflung einen neuen Canbus bestellt - siehe da, Fehler im Log sind weg. Das Ding war also kaputt.

Allerdings kommt scheinbar auch nur einmal beim starten ein (ziemlich falscher) Wert für Temperatur und Druckdifferenz. Lüfterstatus auch falsch.

Werte im ESP32 passen nicht:
image

Version:
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment