ESPHome und Webserver

Hallo,

ich bin neu in der ESP-Gemeinde und hab mir mit einem D1_mini ESP 8266 was zusammengebastelt, was auch funktioniert…Bis auf den Webserver.

Manchmal kommt er mit hoch und dann braucht es wieder gefühlte 90 Resets, bis er läuft. Wenn er läuft, dann läuft er auch.

Aber ist die Spannung mal weg oder es wird Reset gedrückt, ist es wie bei der Lotterie, ob er läuft oder nicht.

Alles andere klappt.

Hier das YAML:

substitutions:
  name: esphome-gascounter
  friendly_name: Water & Gas Counter

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  min_version: 2024.6.0
  name_add_mac_suffix: false
  project:
    name: esphome.web
    version: dev

esp8266:
  #board: esp01_1m
  board: d1_mini
  restore_from_flash: true

# Enable logging
logger:

# Enable Home Assistant API
api:

# Allow Over-The-Air updates
ota:
- platform: esphome

# Allow provisioning Wi-Fi via serial
improv_serial:

# WLAN-Verbindung
wifi:
  # Set up a wifi access point
  #ap: {}
  ssid: "GEHEIM"
  password: "GEHEIM"

# Webserver
web_server:
  port: 80
  version: 3

# MQTT Broker
mqtt:
  broker: 192.168.1.2
  port: 1914
  username: 'GEHEIM'
  password: 'GEHEIM'
  topic_prefix: 'Zaehler'
  #discovery_prefix: 'ESP8266'
  discover_ip: false
  discovery: false
  discovery_retain: false
  log_topic: null

# In combination with the `ap` this allows the user
# to provision wifi credentials to the device via WiFi AP.
#captive_portal:

dashboard_import:
  package_import_url: github://esphome/example-configs/esphome-web/esp8266.yaml@main
  import_full_config: true

globals:
  - id: total_pulses_water
    type: int
    restore_value: yes
    initial_value: '111111'  # mit diesem Wert startet der Wasserzählerstand

  - id: total_pulses_gas
    type: int
    restore_value: yes
    initial_value: '222222'  # mit diesem Wert startet der Wasserzählerstand
    
binary_sensor:
  - platform: gpio
    id: internal_pulse_counter_water
    internal: true
    pin:
      number: GPIO5
      mode: INPUT_PULLUP
    name: "Impuls Wasserzähler"
    filters:
      - delayed_on: 10ms
    on_press:
      then:
        - lambda: id(total_pulses_water) += 1;
        - output.turn_off: led  # für die LED, zur Anzeige des Schaltvorgangs
    on_release:
      then:
        - output.turn_on: led  # für die LED, zur Anzeige des Schaltvorgangs

  - platform: gpio
    id: internal_pulse_counter_gas
    internal: true
    pin:
      number: GPIO4
      mode: INPUT_PULLUP
    name: "Impuls Gaszähler"
    filters:
      - delayed_on: 10ms
    on_press:
      then:
        - lambda: id(total_pulses_gas) += 1;
        - output.turn_off: led  # für die LED, zur Anzeige des Schaltvorgangs
    on_release:
      then:
        - output.turn_on: led  # für die LED, zur Anzeige des Schaltvorgangs
        
sensor: 
  - platform: template
    name: "Wasserverbrauch"
    device_class: water
    unit_of_measurement: "m³"
    state_class: "total_increasing"
    icon: "mdi:water"
    accuracy_decimals: 2
    lambda: |-
      return id(total_pulses_water) * 0.01;

  - platform: template
    name: "Gasverbrauch"
    device_class: gas
    unit_of_measurement: "m³"
    state_class: "total_increasing"
    icon: "mdi:fire"
    accuracy_decimals: 2
    lambda: |-
      return id(total_pulses_gas) * 0.01;

# Diese LED blinkt, wenn ein Signal vom Reedkontakt erkannt wird
output:
  - platform: gpio # Die interne LED auf dem Board
    pin: GPIO2
    id: 'led'
    inverted: true

Mach ich da einen Fehler oder ist vielleicht das D1_mini Board zu schwach für den Webserver?

In den Logs kommt der Webserver jedenfalls mit hoch, im Wifi ist das Board auch, ich steh aufm Schlauch.

Viele Grüße

Paddel

Ich habe noch keine Webserver mit ESPHome gebaut aber was sagt denn das Logging, wenn der Server nicht startet und was steht im Gegensatzt dazu im Logging wenn er korrekt startet?

Ich hab das Problem wohl gefunden, ich war zu ungeduldig. Der Webserver braucht bis zu 5 Minuten, bis er “online” ist.

Aber vielleicht kannst Du mir noch bei einem anderen Problem helfen. Die Werte vom Sensor werden alle 60s geupdatet, das ja die Standardeinstellung.

Ich möchte aber nicht, dass diese sich alle 60s updaten, sondern jeweils bei einem neuen Wert und dann sofort.

Wie muss ich den Code verändern?

sensor: 
  - platform: template
    name: "Wasserverbrauch"
    device_class: water
    unit_of_measurement: "m³"
    state_class: "total_increasing"
    icon: "mdi:water"
    accuracy_decimals: 2
    lambda: |-
      return id(total_pulses_water) * 0.01;

Viele Grüße

Paddel

Das müsste ungefähr das sein was du suchst:
(Zeilen mit #<------ beachten)

  - platform: hdc1080
    temperature:
      name: "East HDC1080 Temperature"
      id: "east_hdc1080_temperature_raw"
      device_class: temperature
      state_class: measurement
      on_raw_value:  #<------
        then: #<------
          - component.update: east_hdc1080_temperature_calibrated    #<------
   
  - platform: template
    name: "East HDC1080 Temperature Calibrated"
    id: "east_hdc1080_temperature_calibrated"    #<------
    update_interval: never
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    icon: "mdi:thermometer"
    accuracy_decimals: 1
    lambda: |-
      return id(east_hdc1080_temperature_raw).state;
    filters:
      - calibrate_linear:
          # Map 0.0 (from sensor) to 0.0 (true value)
          - 25.6 -> 21.6
          - 12.0 -> 5.4

Aber andere Frage, warum der Webserver, du hast doch HA was auf jedem Gerät aufrufbar ist, dann kann man dort doch die UI in einem Dashboard unterbringen

Soweit mir bekannt ist verwenden alle Sensoren mit Plattform „Template“ und die meisten anderen Sensorplattformen (z.B. Plattformen „wifi_signal“, „adc“, „dht“, „dallas_temp“, „bme280_i2c“, „bh1750“, „vl53l0x“, „ads1115“) die Eigenschaft „update_interval“. Wenn diese nicht angegeben wird, dann verwendet das System den DEFAULT-Wert von, glaube ich 60s.

Kann sein, dass man GPIO-Signale schneller abfragen kann aber dann bräuchte die externe Komponente so eine Art Interruptausgang, auf den man für die Messung triggern könnte. So tief bin ich bisher da noch nicht vorgedrungen. Von komplett Event gesteuerten Sensoren habe ich bisher noch nicht gehört aber wenn da jemand Genaueres weiß, dann wäre es interessant davon zu hören.

Hohe Aktualisierungsraten bedeuten allerdings auch ein schnelles Anwachsen der Datenbankgröße, daran sollte man auch denken…

Für die Loop-Zykluszeit von ESP32 habe ich Zeiten von 16-30ms gefunden. Ich denke schneller wird ein ESP unter ESPHome eh nicht reagieren.

Für die Genauigkeit von Zählern wird es weitaus besser sein, den Zählerwert direkt über z.B. „AI on the Edge“ auszulesen (dann fallen Verbindungsabbrüche auch nicht so ins Gewicht).

Das hat geklappt! Danke :slight_smile:

Ich hab mir da was gebastelt, was nun funktioniert. Sicher und zuverlässig, sobald die Spannung da ist. Hierfür werde ich mir auch noch ein Backup bauen, sodass ich mehrere Tage ohne Netzversorgung die Zählerstände weiter erfassen kann.

Ai on the Edge habe ich bis vor einer Woche eingesetzt, lief 1 Jahr wirklich problemlos durch. Dann kam der Versorger und tauschte den Wasserzähler. Nun sind wir auf Stand 1970. Die analogen Zeiger stimmen nicht immer überein, jeden Tag gibt es Fehler. Der Verbrauch wird nicht mehr zuverlässig erfasst und das nervt mich einfach nur noch.

Man guckt rein. Aha, wieder ne Luftblase im Zähler. Mehrere Bemühungen die da rauszubekommen schlugen fehl.

Ich habe mir nun einen Wasserzähler nach der öffentlichen Uhr eingebaut, welcher eine S0-Schnittstelle hat und einen Impuls pro 1 Liter abgibt. Gleiches gilt für den Gaszähler. Dort habe ich keinen Platz für den Aufbau von AI on the Edge mit Kamera, ESP und co.

Der hat nun auch einen Reed-Kontakt und es läuft!

Ai on the Edge ist eine tolle Sache, wenn man einen Wasserzähler hat, welcher keine analogen Zeiger hat.

Ja, das Problem kenne ich. Ich muss auch regelmäßig manuell eingreifen, weil AI on the Edge meinen Schrott-Wasserzähler nicht korrekt lesen kann. Die Zahlen stehen so weit am Rand, dass die Kamera sie nicht immer komplett sehen kann - außerdem Doppelglas und einen kleinen Scheibenwischer dazwischen, der Schatten wirft (ich habe tagelang experimentiert und diverse Zusatzbeleuchtungen angebracht). Wenn das Problem täglich auftreten würde, dann würde ich AI on the Edge auch rauswerfen.

Wäre interessant zu erfahren, wie oft Du deine Werte korrigieren musst (oder wie groß die Abweichung vom Zähler wird) bei Verwendung eines Impulszählers. Es muss da ja gewisse Toleranzen geben, die zu einer Abweichung des Messergebnisses führen. Möglicherweise schmeiße ich AI on the Edge dann auch raus und wechsle aufs selberzählen.

Du sprichst mir aus der Seele, genau das waren auch meine Probleme. Zeiger zu nah am Rand, Kamera erfasst es nicht richtig, dann kommt Doppelglas, Wasser und Luft im Zähler, Lichtbrechungen und Reflextionen, etc. und schon verbraucht man innerhalb 10 Minuten 400 Liter oder gar 6 Kubik.

Ich habe auch tagelang mit Beleuchtung, Kameraausrichtung, Einstellungen etc. rumzuhühnert und komme zu keinem Ergebnis. Es läuft dann und am nächsten Morgen macht das Ding beim Duschen die Grätsche und spuckt Fehler. Rate too high, neg. Rate usw.

Ich hatte mit unserem Versorger Kontakt aufgenommen und einen neuen Zähler erbeten. Das hat da wohl eine Welle an Schulterzucken ausgelöst und am Ende bekam ich die Antwort, geht nicht. Also bei meiner Gemeinde angerufen, den Mist geschildert, dann war der Bürgermeister hier und ich hab jetzt selbstständig einen neuen geeichten Zähler eingebaut, der wurde abgenommen, verplompt und fertig.

Jetzt halt das ganze mit dem ESP und ich bin mehr als zufrieden. Seit zwei Tagen keine Fehler, herrlich!

Leider ist Dein Aufwand auch nicht gerade gering gewesen und die Sache mit der Notstromversorgung ist auch nicht unbedingt trivial. Momentan hoffe ich noch auf den nächsten Zählerwechsel. Wenn du im Jahr nur ein paar mal korrigierend eingreifen musstest oder der nächste Zähler auch so ein Schrott ist, dann steige ich um oder werte nur noch meinen Gartenwasserzähler aus…

Ich hab den Mist-Zähler jetzt 5 Jahre hängen. Wenn ich da nicht gehandelt hätte, wäre ich in der Klapse gelandet, so genervt hat mich das.

Zudem, weil unsere Gartenbewässerung auch auf den Literdurchsatz basiert. Ich brauche also verlässliche Zahlen, damit die Steuerung über den ioBroker und die Scripte funktioniert…

Die Notstromversorgung muss ja nicht unbedingt sein. Ich werde das mit 18650er Batterien lösen. Ich komme aus dem Bereich, da geht das leicht von der Hand. Die Batterien versorgen dann den ESP tagelang mit Energie und so lange fällt ja das Netz nicht aus.

Zudem lasse ich die Werte in den Flash-Speicher des ESP schreiben, allerdings nur einmal pro 30 Min. um den Speicher zu schonen. Ich hab gelesen, der soll nur 100000 Schreibvorgänge abkönnen. Obs wirklich stimmt?

Auf jeden Fall eine deutliche Verbesserung zu AI on the Edge… Ich lege Dir das nur ans Herz.

Moinsen,

hab den Thread hier gerade gefunden. Ist schon ein bisschen abgehangen, aber meine Frage taugt ganz gut zur Ergänzung.

Ich komme von Tasmota und möchte zumindest ein kleines Web-UI haben, das mir die Sensorwerte und vielleicht ein paar Umgebungsvariablen zeigt (freier Speicher, belegter Speicher). Einfach nur damit man sehen kann ob der Chip selbst funktioniert wenn mal irgendetwas nicht passt.

Könnt ihr mir sagen, wieviel Platz die Version 1 benötigt. Ich setze ESP-02S ein. Die haben 1MB Speicher. Wieviel benötigt das System? Und wieviel frisst der Webserver?

Das Problem wird nicht der Flash Speicher von 1MB sein sondern das RAM. ESP-02S und ESP8266 haben nur etwa 80KB Ram für Programme frei (160KB gesamt) und da müssen auch alle aktiven Treiber (Wifi etc.) und das ESPHome Basispaket rein.
Ich kann dir nicht sagen, wieviel Speicher der Web-Server benötigt, aber ich musste gerade enttäuscht feststellen, dass wenn du einen ESP8266 z.B. mit einem LD2410 (Radarsensor) und Web-Server betreibst, dann reicht nur die allerkleinste Zusatzkomponente (z.B: ein einziger Dallas-Sensor) und das Ding geht speichermäßig auf die Bretter.
Ok der LD2410 ist ein extremes Schwergewicht mit sehr vielen Anzeigewerten.
Für die Anzeige einiger weniger Werte für ein paar einfache Sensoren wird es reichen…