Skip to content

Instantly share code, notes, and snippets.

@JavanXD
Last active November 3, 2025 20:26
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
uint16_t raw_temp = x[3] | (x[4] << 8); // Little Endian
float exhaust_temperature = static_cast<float>(raw_temp); // °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
@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

@Hooorny
Copy link

Hooorny commented Jul 3, 2025

@failbit Das ist bei mir exakt genauso ... beim Starten bekomme ich ab und zu komische Werte, die dann aber bleiben.
Wir haben beide LUC Version 13 ... hat die jemand anderes auch bei dem es funktioniert?

@JavanXD
Copy link
Author

JavanXD commented Jul 3, 2025

Bei mir läuft das Teil seit 220 Tagen durch ohne Start/Stop.

Ich hab den Canbus noch nie am Display angeschlossen, bisher immer nur im Keller am Hauptschalter.

@JavanXD
Copy link
Author

JavanXD commented Jul 3, 2025

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

@Blaumicha wenn deine Temperaturwerte nicht stimmen, kannst du versuchen im Code die Berechnung des Temperaturwertes anzupassen, siehe hier: https://gist.github.com/JavanXD/696d026ef202a7d6455ed4745df63e39?permalink_comment_id=5307594#gistcomment-5307594

@Hooorny
Copy link

Hooorny commented Jul 3, 2025

@JavanXD Könntest Du am Display schauen welche Firmware du hast? Bei mir ging der Code 26789

@JavanXD
Copy link
Author

JavanXD commented Jul 3, 2025

Ja bei mir geht auch der gleiche Code für das Fachman Menü. Das ist meine Version:

@Hooorny

@JavanXD
Copy link
Author

JavanXD commented Jul 3, 2025

Die Vorgehensweise wie ich hier insgesamt vorgegangen bin, habe ich hier beschrieben: https://javan.de/hacking-the-fireplace/ Das hilft wahrscheinlich auch beim debuggen.

@failbit
Copy link

failbit commented Jul 5, 2025

Danke für die zusätzliche Doku. Verständnisfrage: du schreibst "When I powered up the fireplace, I immediately started seeing messages on CAN ID 0x28A. " - die Messages müssten aber eigentlich immer kommen, unabhängig davon ob der Kamin befeuert wird oder nicht - oder? Das Display zeigt ja auch Werte an, wenn der Kamin nicht befeuert wird.

Und noch eine Frage an alle: benutzt ihr spezielle Canbus-Adern bzw. Adern mit einem bestimmten Durchmesser?

@JavanXD
Copy link
Author

JavanXD commented Jul 8, 2025

@failbit du hast recht, die Formulierung ist falsch, denn die Messwerte werden dauerhaft gesendet, egal ob Feuer brennt oder nicht.

@failbit
Copy link

failbit commented Jul 19, 2025

Habe jetzt nochmal auf ESPHome 2025.7.2 aktualisiert, dachte das löst vielleicht mein Problem. Hat leider nichts gebracht. Könnte jemand bei dem es funktioniert einmal bestätigen, dass das auch mit der aktuellsten ESPHome Version funktioniert?

@moritzj29
Copy link

Vielen Dank @JavanXD für dieses super How-To und Code Beispiel! Ich konnte ebenfalls meinen LEDA LUC2 erfolgreich in HomeAssistant einbinden.

Auf dem Weg dahin hatte ich auch einige Schwierigkeiten mit defekten MCP2515 Modulen, daher hier kurz meine Learnings:

  • Component canbus is marked FAILED: beim start deutet darauf hin, dass irgendwas mit der SPI Kommunikation oder dem Modul nicht passt, hat nichts mit dem CAN Bus selbst zu tun
  • auch ohne Fehlermeldung hatte ich 2 Module die keinen CAN Traffic gezeigt haben -> hier vermute ich defekte Module (ESD oder sonst was)
  • der LEDA nutzt den CAN Bus ja selber zur Kommunikation, damit sind die beiden Enden des Buses bereits definiert und vermutlich auch mit 120 Ohm terminiert. Abzweige sollten daher möglichst kurz sein. Nach einigen erfolglosen Versuchen habe ich dann den Bus Abzweig deutlich verkürzt auf <10cm. Ich kann es aufgrund der 2 defekten Module nicht zu 100% sagen, ob das jetzt einen Einfluss hatte oder nicht. Ist aber einen Versuch Wert wenn nichts geht...

Bzgl. ESPHome Version: bei mir läuft aktuell 2025.6.2

@failbit
Copy link

failbit commented Sep 5, 2025

@moritzj29: danke für deine Erfahrungswerte. Könntest du nochmal sagen welche MCP2515-Module du jetzt genau genommen hast? Ggf. gibt es da ja noch Herstellerunterschiede!

@moritzj29
Copy link

puh… 5er pack von AliExpress für 5€ 😂 kann natürlich gut sein, dass es da auch fake chips gibt, aber das wird schwer vorher zu erkennen sein.

@sisamiwe
Copy link

@JavanXD
Hallo,
Ich möchte meine Ledatronic LT3 auch auslesen.
Das Grundsetup funktioniert, aber die Messages sind anders aufgebaut. Danke für die Anleitung.

Könntest du mal einen CAN Mitschnitt posten, wenn du die Ebene Fachbetrieb per Displayeingabe aktivierst?
Ich möchte versuchen, ob man auch ohne Display (ist bei mir nicht verbaut) auf die Werte dort zugreifen bzw auslesen kann.
Danke dir.

@failbit
Copy link

failbit commented Sep 17, 2025

Bei mir war es tatsächlich ein defekter MCP2515. Ausgetauscht und alles klappt auf anhieb!

@Hooorny
Copy link

Hooorny commented Sep 24, 2025

Bei mir war es tatsächlich ein defekter MCP2515. Ausgetauscht und alles klappt auf anhieb!

Hab mir jetzt auch mal einen 10er Pack bei AE bestellt, der erste Austausch zeigt leider keinen Effekt ...

@failbit
Copy link

failbit commented Oct 3, 2025

Habe heute das erste mal richtig befeuert. Mir ist aufgefallen, dass bei über 255°C Schluss war (passt genau in ein Byte).

Habe jetzt eine Änderung vorgenommen, damit werden auch höhere Temperaturen korrekt angezeigt.

              uint16_t raw_temp = x[3] | (x[4] << 8);  // Little Endian
              float exhaust_temperature = static_cast<float>(raw_temp);

@arthurichkowski
Copy link

Hallo zusammen, zunächst vielen Dank für die sehr coole Ergänzung für die HA! Ich verzweifele allerdings beim Nachbauen. Hab bereits einen neuen MCP2515 ausprobiert, leider ohne Erfolg. Folgende Situation habe ich erreicht:
Alles angeschlossen wie beschrieben und ESPHome installiert.
image
Kann auch ESP erreichen, allerdings machen die Werte wenig Sinn:
image
Das Problem ist, dass ich keine Werte in HA bekomme. Auf dem Dashboard tauchen keine Werte auf.

@baetzmr
Copy link

baetzmr commented Oct 10, 2025

Also ich sag auch mal Danke für dieses Projekt, da ich schon länger auf der Suche war den LEDA LUC2 auszulesen. Hier mal was ich bis jetzt dazu herausgefunden habe. Problem 1 war das die beiden RJ12 Stecker auf Klemmblock Adapter falsch gepatcht waren. Will sagen, die Adernfarben haben einfach nicht gepasst und waren bei beiden Adaptern auch unterschiedlich aufgelegt. Hab ich auch noch mal geprüft und die Stecker und Kabel aufgeschnitten. Ich habe mich dann auch nochmals für ein anderes Breakoutboard entschieden. Auf diesem Board hab ich die 6 Leitungen mal durchgemessen und habe folgende Pin Belegung festgestellt:

  1. PIN - Adernfarbe Weiß = GND
  2. PIN - Adernfarbe Schwarz = CAN L
  3. PIN - Adernfarbe Rot = CAN H
  4. PIN - Adernfarbe Grau = GND
  5. PIN - Adernfarbe Gelb = +12V
  6. PIN - Adernfarbe Blau = +12V

Einfach mal selbst messen auf welchen PIN's Spannung gemessen werden kann. Bei niedrigen und schwankenden Messwerten sollte das dann der Datenbus sein. Vielleicht hilft das ja jemand weiter.

Anbei noch der Link der mich auf die richtige Spur gebracht hat:
https://www.kaminprofi24.de/datenblaetter/kabeladapter-set-leda-luc.pdf

@failbit
Copy link

failbit commented Oct 11, 2025

Auf dem Dashboard tauchen keine Werte auf.

Bei mir lag das wirklich einfach am MCP2515. Ich habe bei Amazon diese bestellt "MCP2515 CAN Bus Modul RUIZHI 3 Stück" - und habe keine Problemem mehr.

@Hooorny
Copy link

Hooorny commented Oct 12, 2025

Bei mir lag es am MCP2515 und zusätzlich an der Spannungsversorgung ...
Hatte zuerst mehrere MCPs probiert und bei einem kamen dann endlich Werte, aber nur für 30 Minuten oder so, dann war stille.
Ich habe dann eine externe Spannungsversorgung über ein normales USB Netzteil probiert und das Netzteil für den Bus abgeklemmt, jetzt läuft es seit 4h stabil ... mal schauen, ob es so bleibt
Evtl stört das Netzteil das Canbus Signal oder so

@arthurichkowski
Copy link

@Hooorny Deine Lösung funktioniert bei mir auch! Vielen Dank! Ich habe davor neues MCP und ESP ausprobiert ohne Erfolg. Leider scheint die smarte Lösung mit der Spannungsversorgung über RJ12 bei mir nicht zu funktionieren.

@Hooorny
Copy link

Hooorny commented Oct 26, 2025

Hat noch jemand das Problem, dass nach Zeit X (bei mir ca. 24-48h) keine Werte mehr vom CAN-Bus ausgewertet werden?
Ich habe über ESPHome einen restart Button eingebaut, nach dessen Betätigung sofort wieder Werte kommen ... es hängt sich also nicht komplett auf ?!
Die CAN-Stichleitung habe ich auch auf unter 10cm gekürzt ... und meine, dass es auch etwas gebracht hat, aber es hängt halt immer noch irgendwan ...

button:
  - platform: restart
    name: "CAN-Sniffer Restart"

@baetzmr
Copy link

baetzmr commented Oct 27, 2025

Läuft seit zwei Wochen ohne Aussetzer. Spannung kommt vom separaten Netzteil. Ich hatte mal ähnliche Probleme bei einem anderen Projekt und da hat es geholfen wenn bei WiFi der power_safe_Mode auf NONE steht. Seit dem mache ich das bei allen ESPHome Modulen. Ach ja und eine Static IP kann auch helfen.

@arthurichkowski
Copy link

Kurzer Nachtrag zu meinem Aufbau.... Die Spannungsversorgung von MCP2515 über Handylader funktionierte bei mir stabil. Damit ich es in meinem Verteilerschrank integrieren kann, habe ich Mean Well HDR-30-5, DC AC Hutschienen-Netzteil besorgt und damit funktioniert es auch allerdings habe ich immer wieder Aussetzer bei der Datenerfassung. In dem Bild unten habe ich Aufheizungskurve mit einem Nachlegen aufgezeigt. Im hinteren Bereich sieht man, dass unplausible Messwerte (z.B. 3283,3404, 466,4583) aufkommen. Diese Ausreißer kommen sporadisch, immer nur ein einzelner Wert. Ich habe die Spannungsversorgung im verdacht bzw. die empfindliche Reaktion von MCP auf die Spannungsversorgung. Mein Hutschienennetzteil hat ein Poti, allerdings habe ich bisher nicht geschafft die Spannungslage so einzustellen, um solche Ausreißer zu vermeiden. Gebt mir gern Bescheid, falls jemand ein ähnliches Problem hatte oder ich eine offensichtliche Lösung übersehe.

Screenshot 2025-10-29 121159

@Hooorny
Copy link

Hooorny commented Oct 29, 2025

Ich habe diese Ausreißer mittels Filters geglättet, funktioniert sehr gut.

# 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
    state_class: measurement
    icon: "mdi:air-filter"  # Optional custom icon for visual clarity
    update_interval: never
    filters:
      - median:
          window_size: 5
          send_every: 3
          send_first_at: 1
   
  - platform: template
    name: "Exhaust Temperature"
    id: exhaust_temperature_sensor
    unit_of_measurement: "°C"
    accuracy_decimals: 1
    device_class: temperature  # Device class for temperature sensors
    state_class: measurement
    icon: "mdi:thermometer"
    update_interval: never
    filters:
      - median:
          window_size: 5
          send_every: 3
          send_first_at: 1        

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
    filters:
      - delayed_on_off: 1s

button:
  - platform: restart
    name: "CAN-Sniffer Restart"

@arthurichkowski
Copy link

@Hooorny vielen Dank! ...wollte zuerst meine Spannungsquelle genauer einstellen aber mit deinem Filter läuft es auch stabil.

@Hooorny
Copy link

Hooorny commented Nov 3, 2025

Bei mir bleibt der MCP immer noch ab und zu nach einigen Stunden hängen ... deswegen habe ich einen Watchdog eingebaut, der den Restart-Button auslöst, wenn 1 Minute keine CAN-Daten "empfangen" wurden. Funktioniert für mich jetzt ausreichend gut ;)

# --- Watchdog: merkt sich, wann zuletzt ein Frame kam
globals:
  - id: can_last_seen_ms
    type: uint32_t
    restore_value: no
    initial_value: '0'

interval:
  - interval: 10s
    then:
      - lambda: |-
          const uint32_t now = millis();
          if (id(can_last_seen_ms) != 0 && (now - id(can_last_seen_ms)) > 60000) {  // > 1 min ohne Frames
            ESP_LOGW("CAN", "No CAN frames for 1 minute -> Restarting node");
            id(restart_btn).press();
          }

# Configure the CAN bus using the MCP2515 module
canbus:
  - platform: mcp2515
    cs_pin: GPIO16   
    id: ledaluc2_canbus 
    can_id: 0x28A
    clock: 8MHZ
    bit_rate: 125KBPS
    on_frame:
      can_id: 0x28A
      then:
        - lambda: |-
              // Zeitpunkt merken (für Watchdog)
              id(can_last_seen_ms) = millis();

              // Kompakter, allokationsarmer Dump statt eigener String-Bastelei
              ESP_LOGD("CAN", "RX: %s", format_hex_pretty(x).c_str());

              // Kleiner Bounds-Helper
              auto b = [&](size_t i)->uint8_t { return i < x.size() ? x[i] : 0; };

              if (x.size() > 0 && x.size() < 8) {
                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 = b(0);

                if (frame_type == 0x00) {
                  // Byte1: Druck *0.1 Pa
                  float pressure_difference = b(1) * 0.1f;
                  if (b(2) == 0x81) {
                    const float PRESSURE_ADJUSTMENT_VALUE = 25.5f;
                    pressure_difference += PRESSURE_ADJUSTMENT_VALUE;
                    ESP_LOGI("CAN", "Adjustment Applied: +%.1f Pa", PRESSURE_ADJUSTMENT_VALUE);
                  }
                  uint16_t raw_temp = b(3) | (uint16_t(b(4)) << 8);
                  float exhaust_temperature = static_cast<float>(raw_temp);

                  ESP_LOGI("CAN", "Pressure: %.1f Pa, Temperature: %.1f °C",
                          pressure_difference, exhaust_temperature);

                  id(pressure_difference_sensor).publish_state(pressure_difference);
                  id(exhaust_temperature_sensor).publish_state(exhaust_temperature);
                }
                else if (frame_type == 0x01) {
                  bool ventilation_active = (b(5) == 0x01);
                  ESP_LOGI("CAN", "Ventilation Active: %s", ventilation_active ? "Yes" : "No");
                  ESP_LOGD("CAN", "Ventilation Bytes: %s", format_hex_pretty(x).c_str());
                  id(ventilation_status_sensor).publish_state(ventilation_active);
                }
                else if (frame_type == 0x09 || frame_type == 0x55) {
                  ESP_LOGD("CAN", "Heartbeat (0x%02X): Loop=%02X, Counter=%02X", frame_type, b(2), b(1));
                }
                else if (frame_type == 0x80 || frame_type == 0x81) {
                  ESP_LOGW("CAN", "Error Frame (0x%02X): %s", frame_type, format_hex_pretty(x).c_str());
                }
                else {
                  ESP_LOGW("CAN", "Unknown Frame Type: %s", format_hex_pretty(x).c_str());
                }
              } 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
    state_class: measurement
    icon: "mdi:air-filter"  # Optional custom icon for visual clarity
    update_interval: never
    filters:
      - timeout: 20s  # sent value will be NaN
      - median:
          window_size: 5
          send_every: 3
          send_first_at: 1
   
  - platform: template
    name: "Exhaust Temperature"
    id: exhaust_temperature_sensor
    unit_of_measurement: "°C"
    accuracy_decimals: 1
    device_class: temperature  # Device class for temperature sensors
    state_class: measurement
    icon: "mdi:thermometer"
    update_interval: never
    filters:
      - timeout: 20s  # sent value will be NaN
      - median:
          window_size: 5
          send_every: 3
          send_first_at: 1        

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
    filters:
      - delayed_on_off: 1s

button:
  - platform: restart
    id: restart_btn
    name: "CAN-Sniffer Restart"

@Blaumicha
Copy link

Blaumicha commented Nov 3, 2025

Auch ich kann endlich Erfolg vermelden. Bei mir lag es auch an der Spannungsversorgung, es dauerte etwas länger da auch das getestete USB Netzteil nicht geholfen hat. Ich habe noch 1yF Tantalelko auf die Platine gelötet und mittel Labornetzteil alles zum laufen bekommen. Die Schaltung kommt jetzt in den Keller und wird an ein Hutschienen Netzteil angeschlossen. Wenn auch das läuft poste ich gern noch mal den Netzteiltyp.

Vielen Dank an alle die hier gepostet haben, hat mir sehr geholfen!

HG Michael

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