Ölstandmessung mit einem HC-SR04 und einen esp8266

Hallo, ich versuche schon seit längerem einen Yaml Code für eine Ölstandsmessung zu erstellen. Leider ohne Erfolg :frowning:

Ich benutze dazu eine HC-SR04 und einen esp8266. Die Ausgabe vom Abstand Ultraschallsensor und Öl funktioniert. Jedoch das Umrechnen vom Abstand (cm) in noch vorhandenen Öl (L) klappt nicht.

Ich habe dazu eine Peiltabelle vom Hersteller der Öltanks. Diese ist zwar noch etwas ungenau, kann man ja aber noch anpassen wenn das Script mal läuft.

Hat jemand eine Idee wie ich das Script aufbauen muss?

Hi, was sagen die Zentimeterzahlen aus? Abstand zum Öl im Tank 1, 2, 3 und 4? Wenn das so ist, dann brauchst du noch die Gesamtmaße der einzelnen Tanks, so dass du im Anschluss vom Gesamtvolumen die vom Ultraschallsensor ermittelten Abstände abziehen kannst.

Wenn du die Infos hast, kannst du dir einen Templatehelfer in HA anlegen und als Template soetwas nutzen, musst du natürlich noch an deinen Werte anpassen.

{% set tank_hoehe = 150 %}
{% set tank_volumen = 2000 %}
{% set abstand = states('sensor.tank1_abstand') | float(0) %}
{% set fuellhoehe = tank_hoehe - abstand %}
{{ (tank_volumen * fuellhoehe / tank_hoehe) | round(0) }}

Der Sensor könnte auch in der configuration.yaml angelegt werden und würde so aussehen:

template:
  - sensor:
      - name: "Tank 1 Füllstand"
        unit_of_measurement: "L"
        state: >
          {% set tank_hoehe = 150 %}
          {% set tank_volumen = 2000 %}
          {% set abstand = states('sensor.tank1_abstand') | float(0) %}
          {% set fuellhoehe = tank_hoehe - abstand %}
          {{ (tank_volumen * fuellhoehe / tank_hoehe) | round(0) }}

Das Ganze musst du dann für alle vier Tanks anlegen.

Müsste doch auch in ESPHome Code direkt funktionieren mit

also natürlich mit angepassten Werten von dir

3 „Gefällt mir“

Ich hasse es, wenn du einfachere Lösungen teilst… :rofl: Aber hast natürlich Recht, sollte auch direkt im Code funktionieren. Jetzt hat er wieder die Qual der Wahl.

2 „Gefällt mir“

Deine Umrechnung in HA ist doch auch super, mache auch viel dort
Das fällt mir auch meist viel einfacher :ok_hand:
Aber ich versuche jetzt meist alles direkt im ESP zu machen, manchmal brauche ich dort aber länger

Die calibrate_linear im ESP verwende ich aber oft und geht super schnell

1 „Gefällt mir“

Ja, Abstand Sensor zur Oberfläche Öl.

Hier mal das Script, welches ich verwende.

template:
  - sensor:
      - name: "Ölstand T1"
        unique_id: "oelstand_t1"
        unit_of_measurement: "L"
        state: >
          {% set distance = states('sensor.tasmota_olstand_t1_sr04_distance') | float(999) %}

          {% set table = {
            0: 0,
            10: 42,
            20: 84,
            30: 140,
            40: 199,
            50: 260,
            60: 321,
            70: 384,
            80: 447,
            90: 510,
            100: 573,
            110: 634,
            120: 695,
            130: 748
          } %}

          {% set keys = table.keys() | list | sort %}

          {% set below = (keys | select('<=', distance) | list | max(default=keys[0])) %}
          {% set above = (keys | select('>=', distance) | list | min(default=keys[-1])) %}

          {% if above == below %}
            {{ table[above] }}
          {% else %}
            {% set liter_below = table[below] %}
            {% set liter_above = table[above] %}
            {% set interpolated = liter_below + (distance - below) * (liter_above - liter_below) / (above - below) %}
            {{ interpolated | round(1) }}
          {% endif %}

Wenn das geht wäre es super. Jetzt müsste ich nur noch wissen wie und wo ich was eintragen muss :blush:

Dein ESP ist mit Tasmota geflasht? und nicht mit ESPHome
Daher passt mein Vorschlag nicht (bzw. damit kenne ich mich nicht aus)

Deine „table list“ ist auch nicht linear :face_with_monocle:
wundert mich etwas, habe aber auch keine Öl Tanks
Gibt aber noch andere Varianten
Edit:

Die Tabelle hab ich vom Hersteller. Das ist aus einer Peiltabelle.

Ah
Musste lesen und lernen :ok_hand:
Warum braucht man Peiltabellen => ein liegender Zylinder
Jetzt verstehe ich das, daher auch nicht linear

Der Tank hat Einbuchtungen und abgerundete Ecken und Kanten. Deswegen die Peiltabelle.

Hier ein Beispielbild.

Woher hast du eigentlich diese Yaml für die Berechnung?
Viel davon kann ich nicht nicht so einfach nachvollziehen, ich mags einfach und verständlich
Deine Form mit den Einbuchtungen würde ich ignorieren, also linear annehmen

De Yaml hab ich von chatGPT :slight_smile:

Vielleicht hätte ich noch nmit reinschreiben sollen, dass ich das esp8266 mit Tasmota geflasht hatte. Jetzt würde ich gerne von Tasmota zu ESPhome wechseln. Hab auch schon ESPhome Builder installiert und den esp8266 neu, über ESPhome, geflasht. Hat auch gut geklappt. Jedoch nach Abschluß des Flashvorgangs ging der esp8266 offline. Hab das flashen mehrmals versucht, immer das gleiche - und immer die gleiche Fehlermeldung im log.

WARNING Can’t connect to ESPHome API for oltank-4.local: Timeout while resolving IP address for [‘oltank-4.local’] (ResolveTimeoutAPIError)

In ESPHome ESP erstellen (mit WLAN Zugang)
Da ein neuer ESP keine WLAN Verbindung hat, Image erstellen und die Bin dann Flashen (modern)
Dann sollte er in HA erreichbar sein sollen, abändern geht dann über WLAN direkt

So, ich nochmal.

Hab jetzt den ESP in ESP Home


Und nutze diesen Yaml (leider ohne Ausgabe):

esphome:
  name: oltank-4
  friendly_name: Öltank 4

esp8266:
  board: esp01_1m

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "XXXX"

ota:
  - platform: esphome
    password: "XXXX"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Oltank-4 Fallback Hotspot"
    password: "XXXX"

captive_portal:

sensor:
  - platform: ultrasonic
    trigger_pin: GPIO4 #D2
    echo_pin: GPIO5 #D1
    name: "Abstand Sensor"
    id: abstand_cm
    update_interval: 1s
    unit_of_measurement: "cm"
    accuracy_decimals: 1
    filters:
      - lambda: return x * 100.0;  # Meter -> cm
    timeout: 2m

  - platform: template
    name: "Tankfüllstand in Liter"
    unit_of_measurement: "L"
    accuracy_decimals: 2
    icon: "mdi:water"
    update_interval: 1s
    lambda: |-
      float cm = id(abstand_cm).state;

      // Werte außerhalb des Bereichs
      if (cm >= 1300) return 10.5;
      if (cm <= 0) return 762.55;

      // Beispielhafter Abschnitt: lineare Interpolation zwischen zwei Punkten
      if (cm >= 1290) return 10.5 + (cm - 1300) * (16.29 - 10.5) / (1290 - 1300);
      if (cm >= 1280) return 16.29 + (cm - 1290) * (22.07 - 16.29) / (1280 - 1290);
      if (cm >= 1270) return 22.07 + (cm - 1280) * (27.86 - 22.07) / (1270 - 1280);
      if (cm >= 1260) return 27.86 + (cm - 1270) * (33.64 - 27.86) / (1260 - 1270);
      if (cm >= 1250) return 33.64 + (cm - 1260) * (39.43 - 33.64) / (1250 - 1260);
      if (cm >= 1240) return 39.43 + (cm - 1250) * (45.21 - 39.43) / (1240 - 1250);
      if (cm >= 1230) return 45.21 + (cm - 1240) * (51.0 - 45.21) / (1230 - 1240);
      if (cm >= 1220) return 51.0 + (cm - 1230) * (56.78 - 51.0) / (1220 - 1230);
      if (cm >= 1210) return 56.78 + (cm - 1220) * (62.57 - 56.78) / (1210 - 1220);
      if (cm >= 1200) return 62.57 + (cm - 1210) * (68.35 - 62.57) / (1200 - 1210);
      // ...
      // Hier weiter mit den restlichen Zeilen der Tabelle

      // Beispiel für die letzten Werte:
      if (cm >= 10) return 750.98 + (cm - 20) * (756.77 - 750.98) / (10 - 20);
      if (cm >= 0) return 756.77 + (cm - 10) * (762.55 - 756.77) / (0 - 10);

      return 0.0;

EDIT: Code bitte immer über die Codefunktion „</>“ im Editor einfügen.

Ich würde das immer in einzelnen Schritten aufbauen, also bei dir erst einmal der Abstand in cm

Dann den ESP flashen und in HA den Sensor Kontrollieren
Ggf HA Seite neu einlesen oder den ESP neu einlesen

Dann eine einfache Umrechnung von cm zu Liter und dann wieder kontrollieren

Usw

Bitte verwende für den Code die Funktion, damit das besser lesbar und Kopierbar ist

Was zeigt der Log vom ESPHome?

Im Log sieht man die interessante Stelle gar nicht :nerd_face:
Der Sensor an GPIO04 und 05 muss dort erscheinen

Und mehr würde ich auch erst einmal nicht konfigurieren, also von hier: