Hilfe bei ESPHome-Projekt zur Pelletlager-Überwachung mit JSN-SR04T (kg-Berechnung)

Hallo zusammen,

ich habe ein Projekt zur automatischen Füllstandsmessung meines Pelletlagerraums mit ESP32 und zwei JSN-SR04T Ultraschallsensoren aufgebaut, das direkt in Home Assistant integriert ist. Leider bekomme ich keine sinnvollen Messwerte – obwohl die Sensoren grundsätzlich funktionieren (getestet mit Arduino).

Projektziel:
Der ESP32 misst einmal täglich den Abstand zur Pellet-Oberfläche mit zwei Ultraschallsensoren. Daraus wird automatisch der aktuelle Füllstand des Lagerraums in cm und Kilogramm berechnet. Die Werte sollen ausschließlich in Home Assistant geloggt werden – kein Display, keine SD-Karte.

Lagerraum-Daten:
• Maße: 2 m x 3 m x 2,3 m → 13,8 m³ Volumen
• Pelletdichte: ca. 650 kg/m³

Hardware:
• ESP32 D1 Mini (AZ-Delivery)
• 2x JSN-SR04T Ultraschallsensoren
• Stromversorgung über USB
• WLAN-Verbindung zu Home Assistant

Anschlussbelegung:
• Sensor 1: Trigger = GPIO4, Echo = GPIO5
• Sensor 2: Trigger = GPIO27, Echo = GPIO25

Problem:
ESP32 lässt sich problemlos flashen und erscheint in Home Assistant. Die Sensoren zeigen aber dauerhaft ca. 80 cm an, obwohl sich der Füllstand ändert. Die berechnete Füllhöhe bleibt z. B. bei 229,7 cm – und das Gewicht entsprechend konstant. Es wirkt, als würde gar nicht neu gemessen.

Was ich brauche:
• Hat jemand eine funktionierende Lösung mit JSN-SR04T und ESP32 in ESPHome?
• Gibt es bekannte Probleme mit bestimmten GPIOs?
• Muss ich evtl. noch einen Timeout, Gain, Pulldown etc. setzen?
• Funktionieren JSN-SR04T mit ESPHome überhaupt zuverlässig in dieser Konfiguration?

Ich bin für jede Hilfe oder einen funktionierenden Beispielcode sehr dankbar!

esphome:
  name: pelletlager
  friendly_name: Pelletlager

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:

api:
  encryption:
    key: "..."

ota:
  password: "..."

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "Pelletlager"
    password: "..."

captive_portal:

globals:
  - id: sensor1_offset
    type: float
    initial_value: "0.0"
  - id: sensor2_offset
    type: float
    initial_value: "0.0"

sensor:
  - platform: ultrasonic
    trigger_pin: GPIO4
    echo_pin: GPIO5
    name: "Sensor 1 Entfernung"
    id: sensor1_distance
    update_interval: 86400s
    filters:
      - lambda: return x + id(sensor1_offset);

  - platform: ultrasonic
    trigger_pin: GPIO27
    echo_pin: GPIO25
    name: "Sensor 2 Entfernung"
    id: sensor2_distance
    update_interval: 86400s
    filters:
      - lambda: return x + id(sensor2_offset);

  - platform: template
    name: "Fuellhoehe (cm)"
    id: fuellhoehe_cm
    unit_of_measurement: "cm"
    update_interval: 86400s
    lambda: |-
      float raumhoehe = 230.0;
      float d1 = id(sensor1_distance).state;
      float d2 = id(sensor2_distance).state;
      if (isnan(d1) || isnan(d2)) return NAN;
      return raumhoehe - ((d1 + d2) / 2.0);

  - platform: template
    name: "Pelletmenge (kg)"
    id: pelletmenge
    unit_of_measurement: "kg"
    update_interval: 86400s
    lambda: |-
      float breite = 3.0;
      float laenge = 2.0;
      float dichte = 650.0;
      float hoehe = id(fuellhoehe_cm).state / 100.0;
      float volumen = breite * laenge * hoehe;
      return volumen * dichte;

Hi,
ich bin auf deinen Beitrag gestoßen da ich es ein sehr interessantes Projekt finde und bei Erfolg ggf. nachbauen würde :wink:

hast du die Sensoren alle schon verbaut oder kannst du sie noch “manuell” prüfen, d.h. kannst du sie in verschiedenen Höhen halten und dann was messen? Nur um auszuschließen dass es aufgrund Staub etc. nicht richtig funktioniert. *

kannst du in Homeassistant unter ESPHome mal den Log des ESP aufrufen und schauen was der dann ggf. sendet?
bei mir z.B. so:
image

ändern sich die Werte wenn du den Sensor manuell prüfst? ACHTUNG für den Test update interval: verkürzen sonst musst du 24h warten :wink:

*p.s.: ich arbeite mit großen Pelletanlagen, hier haben wir selbst mit industrie Ultraschallsensoren >300€/Stk. immer wieder Probleme dass sie aufgrund Staub, Form der Pellet etc. nicht 100% zuverlässig sind…

ggf. erstmal nur einen Testcode anwenden um zu sehen ob Werte sich ändern:

esphome:
  name: pelletlager_test
  friendly_name: Pelletlager Test

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:

api:

ota:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

sensor:
  - platform: ultrasonic
    trigger_pin: GPIO4
    echo_pin: GPIO5
    name: "Pellet Sensor Entfernung"
    update_interval: 10s

:crayon:by HarryP: Zusammenführung Doppelpost (bei Änderungen oder hinzufügen von Inhalten bitte die „Bearbeitungsfunktion“ anstatt „Antworten“ zu nutzen)